Setting语言与输入法列表客制化

来源:互联网 发布:大数据的作用 编辑:程序博客网 时间:2024/05/01 06:24

Setting语言与输入法列表客制化

Setting的语言字串来自ICU资源,其语言名称显示也有2种形式。
一种仅仅是把语言名称显示出来如中文;还有一种是语言名称后带有国家备注,如中文(繁体)、中文(简体)。当Projectconfig.mk中有至少2个相同的语言代码打开时,如en_CA,en_US,zh_CN,zh_TW,这时语言列表中就会有English(Canada)、English(united States)、中文(繁体)、中文(简体);如果仅仅打开en_US和zh_CN,就会显示English、中文。
Setting中显示语言名称的地方主要有3处,如果需要克制化,可按照如下方法:
(1) 设置》语言和输入法》语言

5.7tp-7.png (91.72 KB, 下载次数: 0 )

下载附件  保存到相册

2016-5-7 10:11 上传


在文件packages\apps\Settings\res\values\arrays.xml定制要显示的语言、国家代码以及修改后
的名称,如中文定制如下,
<string-array translatable="false" name="special_locale_codes">
<item>zh_CN</item>
<item>zh_TW</item>
</string-array>
<string-array translatable="false" name="special_locale_names">
<item>中文 (简体)</item>
<item>中文 (繁體)</item>
</string-array>
如果要定制其他语言可以在上面添加即可。
主要函数是在LocalePicker.JAVA(frameworks\base\core\java\com\android\internal\app)
public static ArrayAdapter<LocaleInfo> constructAdapter(Context context,final int layoutId, final int
fieldId)
(2) 设置》语言和输入法.

5.7tp-8.png (92.92 KB, 下载次数: 0 )

下载附件  保存到相册

2016-5-7 10:11 上传


这部分没有定制,直接获取ICU字串资源,代码如下
InputMethodAndLanguageSettings.java
alps\packages\apps\Settings\src\com\android\settings\inputmethod
public void onResume() {
if (hasOnlyOneLanguageInstance(language,
Resources.getSystem().getAssets().getLocales())) {
localeString = conf.locale.getDisplayLanguage(conf.locale);
} else {
// localeString = conf.locale.getDisplayName(conf.locale);
localeString= getDisplayName(conf.locale);//自己封装函数
}
……
如果要定制话,可以自己封装函数如下.
private static String getDisplayName(Locale l) {
final String[] specialLocaleCodes =
resources.getStringArray(R.array.special_locale_codes);
final String[]
specialLocaleNames=resources.getStringArray(R.array.special_locale_names);
String code = l.toString();
for (int i = 0; i < specialLocaleCodes.length; i++) {
if (specialLocaleCodes.equals(code)) {
return specialLocaleNames;
}
}
return l.getDisplayName(l);
}
(3) 设置》语言和输入法》anroid键盘设置》输入语言

5.7tp-9.png (89.85 KB, 下载次数: 0 )

下载附件  保存到相册

2016-5-7 10:11 上传


这一块和(2)一样也是直接从底层获取,如果要定制,可以修改如下部分
InputMethodSubtype.java
alps\frameworks\base\core\java\android\view\inputmethod
public CharSequence getDisplayName(
Context context, String packageName, ApplicationInfo appInfo) {
final Locale locale = constructLocaleFromString(mSubtypeLocale);
//final String localeStr = locale != null ? locale.getDisplayName() :
mSubtypeLocale;
final String localeStr = locale != null ? getDisplayName(locale) :
mSubtypeLocale;
……
自己封装函数如下.
private static String getDisplayName(Locale l) {
final String[] specialLocaleCodes =
resources.getStringArray(R.array.special_locale_codes);
final String[]
specialLocaleNames=resources.getStringArray(R.array.special_locale_names);
String code = l.toString();
for (int i = 0; i < specialLocaleCodes.length; i++) {
if (specialLocaleCodes.equals(code)) {
return specialLocaleNames;
}
}
return l.getDisplayName();
}
对于KK版本输入法语言列表中一些字串是在String.xml中定义的,如下为英语的字串
packages\inputmethods\LatinIME\java\res\values
<string name="subtype_en_GB">English (UK)</string>
<string name="subtype_en_US">English (US)</string>
<string name="subtype_es_US">Spanish (US)</string


0 0
原创粉丝点击