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 快的多。
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.
在 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)
默认语言的选择实现是在 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中被赋值,需要时可在这两个文件中进行修改。