android 语言定制

本文深入探讨了Android系统中多语言的定制机制,包括ICU4C在Android中的角色,语言包的构成,以及如何定制和选择语言。通过修改PRODUCT_LOCALES字段和使用特定的makefile,开发者可以轻松地改变系统的默认语言和支持的语言种类。

本文是主要对android定制多语言的问题进行深入研究后,总结了其定制的机制和其具体实现方法。如果想深入了解其定制的机制,可阅读本文第一部分,如果只想了解如何定制,请参考第二部分。


第一部分 多语言定制的机制



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++两个平台下的国际化应用。 ICU4J和ICU4C区别不大,但由于ICU4C是开源的,并且紧密跟进Unicode标准,ICU4C支持的Unicode标准总是最新的;同时,因为JAVA平台的ICU4J的发布需要和JDK绑定,ICU4C支持Unicode标准改变的速度要比ICU4J快的多。

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.

3、定制语言


定制语言在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)

4、默认语言

默认语言的选择实现是在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" 。

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


4.1、在PRODUCT_LOCALES字段里,将要选择的语言放在第一位,如: PRODUCT_LOCALES := en_US zh_CN 默认语言是英语;

4.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。


第二部分 多语言定制的方法



1、多语言定制的实现步骤


1)进入build/target/product目录,在languages_full.mk或languages_small.mk文件中,修改PRODUCT_LOCALES的值,来定制语言,比如PRODUCT_LOCALES := en_US zh_CN zh_TW en_GB fr_FR it_IT de_DE es_ES;


2)相同目录下,修改full.mk文件的

$(call inherit-product, build/target/product/languages_small|full.mk)语句来切换所使用的文件;

3)重新编译即可。 

也可以修改frameworks/base/core/java/com/android/internal/app/LocalePicker.java


2、设置默认语言的实现步骤
1)进入build/target/product目录,修改文件core.mk的PRODUCT_PROPERTY_OVERRIDES 值,例如,欲修改为默认中文,则增加
“/ persist.sys.language=zh / persist.sys.country=CN”,增加后的语句如PRODUCT_PROPERTY_OVERRIDES := /

ro.config.notification_sound=OnTheHunt.ogg /


ro.config.alarm_alert=Alarm_Classic.ogg / persist.sys.language=zh / persist.sys.country=CN

2)重新编译即可。

3、与多语言定制相关的字段及其所在的文件


PREVIOUS_BUILD_CONFIG out/target/product/dream/previous_build_config.mk


NO_FALLBACK_FONT的定义 device/htc/dream-sapphire/BoardConfigCommon.mk


NO_FALLBACK_FONT的调用 frameworks/base/data/fonts/Android.mk


extra_locales CUSTOM_LOCALES nodpi mdpi hdpi build/core/product_config.mk


PRODUCT_PROPERTY_OVERRIDES build/target/product

build.prop out/target/product/generic/system

03-08
### MathPix工具介绍 Mathpix Snipping Tool 是一款强大的数学公式识别工具,从最初的原型发展至今已经历了多次迭代和功能增强[^1]。该工具不仅能处理简单的数学表达式,还可以应对复杂的数学模型以及多行公式,并且支持手写公式的识别。 这款应用程序通过不断的科技创新与用户反馈改进,在学术研究和技术领域赢得了良好声誉,成为许多科研人员不可或缺的工作伙伴之一。除了基本的功能外,Mathpix 还提供了多种高级特性来满足不同用户的特定需求。 ### 使用方法 #### 安装与启动 为了使用 Mathpix Snipping Tool ,首先需要下载安装程序并按照提示完成设置过程。一旦成功安装后即可随时调用此应用来进行截图操作。 #### 截取屏幕上的公式图像 当遇到想要转换成 LaTeX 或 AsciiMath 的图片时,只需打开软件界面按下快捷键(默认为 `Ctrl+Alt+M`),此时鼠标指针会变为十字形状以便于选取目标区域;框选所需部分之后松开按键即刻上传至云端服务器等待进一步分析处理。 #### 获取LaTeX代码片段 经过短暂几秒钟的时间延迟过后,所截获的内容将以纯文本形式显示出来供复制粘贴到其他编辑器当中继续编写文档或是分享给他人查看交流之用。 ```python import pyperclip # 假设已获取到LaTeX字符串 stored_in_variable named latex_code pyperclip.copy(latex_code) print("LaTeX code has been copied to clipboard.") ``` 对于希望深入探索更多可能性的用户来说,可以考虑查阅官方提供的扩展插件——如用于解析Markdown文件内的公式标记语法的库 **mathpix-markdown-it** [^2] ——这将进一步提升工作效率和个人体验感。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值