您的位置:首页 > 其它

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

2016-06-27 17:26 281 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息