ADROID 2.1 架构解析 1 语言定制

1 语言定制

1.1 ICU4C

1.1.1 ICU4C 简介

ICU4C(ICU for C http://site.icu-project.org/) ICU C/C++ 平台下的版本 , ICU(International Component for Unicode) 是基于 "IBM 公共许可证 " 的,与开源组织合作研究的 , 用于支持软件国际化的开源项目。 ICU4C 提供了 C/C++ 平台强大的国际化开发能力,软件开发者几乎可以使用 ICU4C 解决任何国际化的问题,根据各地的风俗和语言习惯,实现对数字、货币、时间、日期、和消息的格式化、解析,对字符串进行大小写转换、整理、搜索和排序等功能,必须一提的是, ICU4C 提供了强大的 BIDI 算法,对阿拉伯语等 BIDI 语言提供了完善的支持。

   ICU 首先是由 Taligent 公司开发的, Taligent 公司现在被合并为 IBM? 公司全球化认证中心的 Unicode 研究组,然后 ICU IBM 和开源组织合作继续开发,开源组织给与了 ICU 极大的帮助。

  开始 ICU 只有 Java 平台的版本,后来这个平台下的 ICU 类被吸纳入 SUN 公司开发的 JDK1.1 ,并在 JDK 以后的版本中不断改进。 C++ C 平台下的 ICU 是由 JAVA 平台下的 ICU 移植过来的,移植过的版本被称为 ICU4C ,来支持这 C/C++ 两个平台下的国际化应用。

ICU4C ICU4C 区别不大,但由于 ICU4C 是开源的,并且紧密跟进 Unicode 标准, ICU4C 支持的 Unicode 标准总是最新的;同时,因为 JAVA 平台的 ICU4J 的发布需要和 JDK 绑定, ICU4C 支持 Unicode 标准改变的速度要比 ICU4J 快的多。

1.1.2 ANDROID 语言包

Android 使用的语言包就是 ICU4C ,位置: external/icu4c Android 支持的语言有:

Locale  CANADA                           Locale constant for en_CA.

Locale    CANADA_FRENCH            Locale constant for fr_CA.

Locale    CHINA                               Locale constant for zh_CN.

Locale    CHINESE                           Locale constant for zh.

Locale    ENGLISH                           Locale constant for en.

Locale    FRANCE                            Locale constant for fr_FR.

Locale    FRENCH                            Locale constant for fr.

Locale    GERMAN                           Locale constant for de.

Locale    GERMANY                         Locale constant for de_DE.

Locale    ITALIAN                            Locale constant for it.

Locale    ITALY                                Locale constant for it_IT.

Locale    JAPAN                               Locale constant for ja_JP.

Locale    JAPANESE                         Locale constant for ja.

Locale    KOREA                             Locale constant for ko_KR.

Locale    KOREAN                            Locale constant for ko.

Locale    PRC                                   Locale constant for zh_CN.

Locale    SIMPLIFIED_CHINESE      Locale constant for zh_CN.

Locale    TAIWAN                            Locale constant for zh_TW.

Locale    TRADITIONAL_CHINESE Locale constant for zh_TW.

Locale    UK                                    Locale constant for en_GB.

Locale    US                                    Locale constant for en_US.

1.2 定制语言

PRODUCT_LOCALES 字段里添加需要语言,如:

PRODUCT_LOCALES := en_US zh_CN

则系统里只有英语和汉语两种语言。

然后语言的选择处理是在 external/icu4c/stubdata/Android.mk 里进行的,如下:

config := $(word 1, /

            $(if $(findstring ar,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring da,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring el,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring fi,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring he,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring hr,$(PRODUCT_LOCALES)),large) /

             $(if $(findstring hu,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring id,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring ko,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring nb,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring pt,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring ro,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring ru,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring sk,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring sr,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring sv,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring th,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring tr,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring uk,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring zh,$(PRODUCT_LOCALES)),large) /

            $(if $(findstring ja,$(PRODUCT_LOCALES)),us-japan) /

            $(if $(findstring it,$(PRODUCT_LOCALES)),us-euro) /

            $(if $(findstring pl,$(PRODUCT_LOCALES)),us-euro) /

            $(if $(findstring cs,$(PRODUCT_LOCALES)),default) /

            $(if $(findstring de,$(PRODUCT_LOCALES)),default) /

            $(if $(findstring fr,$(PRODUCT_LOCALES)),default) /

            $(if $(findstring nl,$(PRODUCT_LOCALES)),default) /

            us)

1.3 默认语言

默认语言的选择实现是在 build/core/Makefile 里,从 PRODUCT_LOCALES 里选择第一个语言作为默认语言,如下:

define default-locale

$(subst _, , $(firstword $(1)))

endef

 

# Selects the first locale in the list given as the argument

# and returns the language (or the region)

define default-locale-language

$(word 2, 2, $(call default-locale, $(1)))

endef

define default-locale-region

$(word 3, 3, $(call default-locale, $(1)))

Endef

 

...

 

PRODUCT_DEFAULT_LANGUAGE="$(call default-locale-language,$(PRODUCT_LOCALES))" /

                     PRODUCT_DEFAULT_REGION="$(call default-locale-region,$(PRODUCT_LOCALES))" /

 

然后通过 build/tool/buildinfo.sh 文件将如下段写到文件 build.prop ,如下:

echo "ro.product.locale.language=$PRODUCT_DEFAULT_LANGUAGE"

echo "ro.product.locale.region=$PRODUCT_DEFAULT_REGION"

所以,要改变默认语言用下面两种方法中的一种就行了:

1 PRODUCT_LOCALES 字段里,将要选择的语言放在第一位,如:

PRODUCT_LOCALES := en_US zh_CN

默认语言是英语

2

persist.sys.language persist.sys.country 里指定语言,如下:

PRODUCT_PROPERTY_OVERRIDES := / 

    persist.sys.language=zh /

           persist.sys.country=CN

 

build.prop 文件的处理是在 system/core/init/property_service.c

 

From : http://blog.csdn.net/skdev/archive/2010/02/26/5330364.aspx

 

PS:

PRODUCT_LOCALES在build/target/product/languages_full.mk或者build/target/product/languages_small.mk中被赋值,需要时可在这两个文件中进行修改。

你可能感兴趣的:(ADROID 2.1 架构解析 1 语言定制)