问题描述:添加一种新的语言。


问题分析:新添加一种语言需要几步,编译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,添加代码,把字库编译进去。

在fonts.mk中添加

PRODUCT_COPY_FILES := \

    frameworks/base/data/fonts/Roboto-Regular.ttf:system/fonts/Roboto-Regular.ttf \
    frameworks/base/data/fonts/Roboto-Bold.ttf:system/fonts/Roboto-Bold.ttf \

  按照这样添加一行


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是否有新的字库


问题描述:添加一种新的语言。


问题分析:新添加一种语言需要几步,编译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,添加代码,把字库编译进去。

在fonts.mk中添加

PRODUCT_COPY_FILES := \

    frameworks/base/data/fonts/Roboto-Regular.ttf:system/fonts/Roboto-Regular.ttf \
    frameworks/base/data/fonts/Roboto-Bold.ttf:system/fonts/Roboto-Bold.ttf \

  按照这样添加一行


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是否有新的字库