Android 4.3
1 . 语言全局切换
重写Setting后需要全局切换语言(中英、中阿等),查看原生的Setting代码,抽出切换语言部分,具体实现如下:
zh_CN,这是原始localeString, 通过getLanguage()返回的是zh-CN,变成中划线了。
zh为Language,CN为Country。
全局切换方法:
String langCode = "zh-CN";
public void changeLocale(String langCode) {
int size = getResources().getConfiguration().getLocales().size();
for(int i=0; i<size; i++){
Locale locale = getResources().getConfiguration().getLocales().get(i);
if (langCode.equals(locale.getLanguage())){
LocalePicker.updateLocale(locale);
break;
}
}
}
所有国家的语言代码在下面的链接中:
https://stackoverflow.com/questions/7973023/what-is-the-list-of-supported-languages-locales-on-android
注意下划线和中划线的区别。
2 . 系统烧写后的默认语言:
build/target/product/languages_full.mk中第一个语言:
PRODUCT_LOCALES := ar_EG ar_XB en_US zh_CN fr_FR it_IT es_ES de_DE nl_NL cs_CZ pl_PL ja_JP zh_TW ru_RU ko_KR nb_NO es_US da_DK el_GR tr_TR pt_PT pt_BR rm_CH sv_SE bg_BG ca_ES en_GB fi_FI hi_IN hr_HR hu_HU in_ID iw_IL lt_LT lv_LV ro_RO sk_SK sl_SI sr_RS uk_UA vi_VN tl_PH fa_IR th_TH sw_TZ ms_MY af_ZA zu_ZA am_ET hi_IN en_XA fr_CA
上述配置即再烧写完毕后设置为ar_EG为默认语言
进一步调查,最终编译是在build/tools/buildinfo.sh中设置默认语言:
if [ -n "$PRODUCT_DEFAULT_LANGUAGE" ] ; then
echo "ro.product.locale.language=$PRODUCT_DEFAULT_LANGUAGE"
fi
if [ -n "$PRODUCT_DEFAULT_REGION" ] ; then
echo "ro.product.locale.region=$PRODUCT_DEFAULT_REGION"
fi
$PRODUCT_DEFAULT_LANGUAGE这个变量就是取的build/target/product/languages_full.mk中第一个语言。
然后添加:
echo "ro.product.locale.language=$PRODUCT_DEFAULT_LANGUAGE"
echo "ro.product.locale.region=$PRODUCT_DEFAULT_REGION"
echo "persist.sys.country=$PRODUCT_DEFAULT_REGION"
echo "persist.sys.language=$PRODUCT_DEFAULT_LANGUAGE"
这样就保证烧写后的默认语言是build/target/product/languages_full.mk中第一个语言。具体的设置方式请跟踪mk文件,这里就不再详述了。
多说一句,system.prop是编译后的产物,是烧写完毕后的机器更改此文件会生效,不适用于rom制作。
3 . 两个重要properties:
ro.product.locale.language
系统烧写设置默认语言,即第2步设置的
persist.sys.language
后期全局切换后生效的语言,即Setting中设置的,第1步切换生效的。
persist.sys.language即标示着当前的系统语言。