问题描述:添加一种新的语言。
问题分析:新添加一种语言需要几步,编译ICU资源,添加字库,添加相应的字串资源。
解决方案:
以添加缅甸语为例。下面的方式适用于android4.0以上(包括4.0),android2.3的添加方式有些差异。
总共有四步。
1、编译icu资源( 语言的名称是规定的,如缅甸语的名称是my_MM,可以在维基查找。)
1)在文件external/icu4c/stubdata/icudt46l-default.txt
添加行coll/my.res
添加行 coll/my_MM.res
添加行curr/my.res
添加行lang/my.res
添加行region/my.res
添加行zone/my.res
添加行my.res
添加行my_MM.res
2) mkdir external/icu4c/icuBuild
3) cd external/icu4c/icuBuild
4) ../runConfigureICU Linux
5) make -j2
6) cp data/out/tmp/icudt48l.dat../stubdata/icudt48l-all.dat.
7) cd ../stubdata
8) ./icu_dat_generator.py
9) mm
最终编译的icu文件icudt48l.dat放在system/usr/icu/icudt48l.dat
以上的编译方式在external/icu4c/stubdata/readme.txt有详细说明。
2、添加字库
1) 把字库放到frameworks\base\data\fonts这里面
2) 在该目录的fonts.mk和Android.mk,添加代码,把字库编译进去。
3)在fallback_fonts.xml,添加相应代码。其直接目的是Resources.getSystem().getAssets().getLocales()获取到字库资源。如:
<family>
<fileset>
<filelang="my">Padauk.ttf</file>
</fileset>
</family>
字库资源的载入在这个文件: external\skia\src\ports\SkFontHost_android.cpp的gSystemFonts数组中。在android2.3,是手动添加,在4.0后,动态从system/etc/fallback_fonts.xml读取。
4) 在build/target/product/languages_full.mk中添加孟加拉语my_MM.
3、确保framework res和settings res都有缅甸语资源
4、make clean 后全编
可能遇到的问题:
1、在setting里面没有语言选项。
a) 是否生成ICU文件,进入adb shell, system/usr/icu/icudt48l.dat是否最新生成
b) framework res和settings res都有对于语言的资源
c) languages_full.mk添加对于语言
d) 语言的名称是规定的,如缅甸语的名称是my_MM,可以在维基查找。
2、在settings的语言栏有选项,但是空的。
a) System/etc下面是否新的fallback_fonts.xml
b) System/fonts是否有新的字库