android 2.3系统默认语言处理流程

来源:互联网 发布:json.parseobject源码 编辑:程序博客网 时间:2024/06/05 20:30
一、系统有一个预置语言,即在 makefile 文件中定义的语言; 位置:build/target/product/${Project}.mk 

PRODUCT_LOCALES := \ en_US \ es_ES \ zh_CN \ zh_TW \ ru_RU \ pt_BR \ fr_FR \ de_DE \ tr_TR \ it_IT \ in_ID \ ms_MY \ th_TH \ vi_VN \ hdpi \ mdpi

第一行即为预置语言,其它为系统支持的语言种类。 当download到手机时,预置语言会被赋给 SystemProperties 里面的变量 ro.product.locale.language 


二、刷机过后,开机重启,如果未插卡,系统语言为预置的语言,插入SIM卡过后,系统语言根据 SIM 卡来改变; 当 SIM 卡准备好后,Phone 中的类 SIMRecords 会从 SIM 卡中读取 IMSI,然后调用 MccTable 的 updateMccMncConfiguration 函数从 IMSI 中获取 MCC 和 MNC,然后从 MCC 通过转换表得到 Locale,再调用 ActivityManagerService 来更新系统语言。 


三、拔掉SIM卡过后,系统语言还原为预置的语言; 开机过程中,在 AndroidRuntime.cpp 文件的函数readLocale 中: 


static void readLocale(char* language, char* region) { char propLang[PROPERTY_VALUE_MAX], propRegn[PROPERTY_VALUE_MAX]; 
property_get("persist.sys.language", propLang, ""); property_get("persist.sys.country", propRegn, ""); if (*propLang == 0 && *propRegn == 0) { /* Set to ro properties, default is en_US */ property_get("ro.product.locale.language", propLang, "en"); property_get("ro.product.locale.region", propRegn, "US"); } strncat(language, propLang, 2); strncat(region, propRegn, 2); //LOGD("language=%s region=%s\n", language, region); } 
首先会从 SystemProperties 变量 persist.sys.language 中去读,如果用户没有在 Settings 里面设置 Locale,这个值为 null, 然后就会去读   ro.product.locale.language 的值,即系统预制语言。 


四、如果用户在 Settings 里面手动设置了语言,以后系统语言会为设置后的语言,无论插入什么卡,系统语言不会变,一直为用户手动设置后的语言。 如果用户在 Settings 里面手动设置了语言,则 persist.sys.language 不为 null, 开机时就会去读这个值,并设为系统语言。
原创粉丝点击