我的问题:
如何在 source code 级别的Android手机中添加或删除"Settings" - > "Language & keyboard settings" - > "Select Locale"(或"Select Language")中的语言条目?
我会提供更多关于我想要什么以及我做了什么的细节 . Please excuse me 如果我提出任何愚蠢的理解或信息 . 我'm pretty new to Android development, starting to learn it several days ago. There is still a lot that I don't知道 .
关于我想要的更多信息:
我最近正在开展一项使用新语言本地化 entire phone 产品的任务(我的意思是,我是 not working on a specific application . 这就是为什么我需要在设置中添加新的语言环境) . 当我拿到开发电话时,我在"Select Locale"找到了 there are only 几个语言条目,例如"English","French"和"Spain" . 首先,我需要 add and display some new language entries 到这个列表,例如"Japanese","Chinese","Korean" .
我有Android平台的所有源代码和我自己的代码,所以我认为这个任务可以完成 by modifying the source code or the resource files somewhere . 不幸的是,我不知道代码和文件在哪里 .
运行时“Hello, L10N " tutorial shows a way to add a new locale from "自定义区域设置” . 但我想要的是 to add the new locales at build time 所以当手机启动时,新的语言环境将直接显示在"Select Locale"中而不做任何其他操作 .
我做了什么:
在我来之前,我在互联网上做了很多研究 . 这是我发现的:
_ Stack_flow中的Sinkiru问了一个关于我正在寻找什么的问题 . 看到它here . 然而,没有其他人回复他 . 他自己的回复只告诉我在哪里查询CURRENT语言设置,这就是我想要的 . 我亲自给他发了一封电子邮件,但没有得到他的答复 .
-
我在Stackoverflow中搜索了很多,关键字为"android locale","android language","android new locale"等 . 本网站的大部分问题都是询问如何更改应用的区域设置,如何为应用添加多语言支持等等 . 它们是 NOT 我想要的 .
-
我在Android平台谷歌组(http://groups.google.com/group/android-platform)搜索了很多 . 有些人在问我的问题,但在看完这些消息之后我仍然没有得到我的答案.. :-(这是我在小组中读到的帖子列表(我做了 not 从我们这里得到我想要的) :
-
“OS localization” - 我将在下面详细说明 .
-
“How to add new locale and it's associated font in android source”
-
返回上面列出的条目“(a)” . 在“操作系统本地化”消息主题中,Android框架工程师Dianne Hackborn说:
“设置应用程序只显示平台资源中可用的所有语言环境 . 为新语言环境添加字符串应自动在设置中显示 . 您可以告诉构建系统在构建时要包含哪些语言环境资源 . ..不幸的是,我无法帮助你,但也许其他人可以 . “
他粗体的话说明我的任务可以通过向源代码添加新的语言环境资源,以及通过在构建系统中设置或更改某些内容来自动完成 . I'm wondering if someone here has ever done the similar thing before? 明天我要试一试 .
-
最后但并非最不重要的是,我在官方Android开发者网站上搜索过 . 在“Hello, L10N " tutorial it says something about the available locales in the "设置”应用程序的"Run and Test the Localized Application"中,但这基本上是在模拟器中做什么,这应该不是我需要的 . 我想在真正的手机上完成它 .
-
我也潜入了试图发现一些东西的Android平台源代码 . 我从$(ANDR_SRC_ROOT)/ Packages / app / Settings / src /.../ LocalePicker.java开始 . 在LocalePicker :: onCreate()方法中,我注意到这行代码:
String [] locales = getAssets() . getLocales();
此行下面的代码尝试将所有获取的区域设置名称设置为ArrayAdapter,然后将适配器设置为要显示的列表视图 . 因此我认为“getLocales()”方法是解决方案的关键 .
然后我查看了getLocales()代码 . getLocales()是AssetManager的成员方法,并声明为native,因此我进入$(ANDR_SRC_ROOT)/frameworks/base/libs/utils/AssetManager.cpp,我 GUESS 应该是java getLocales()的实际实现方法 . C AssetManager :: getLocales()最终引导我进入C ResTable :: getConfigurations()方法,其中扫描成员变量“ mPackageGroups ”以检索所有可用的ResTable_config项 . Thus I think all the available locales should be added into this mPackageGroups during the system started up. 然而,我输了代码最后,无法找到将语言环境添加到mPackageGroups的位置 .
6 回答
在HTC手机上你还必须修改/system/customize/CID/default.xml ...这是他们用来在他们的股票roms上指定区域设置的文件 . 如果rom是一个WWE,据说编辑CID是所有人都需要做的,但这并不总是成立 .
我认为普通的应用程序不应该为手机添加位置 . 为此目的,有像MoreLocale 2这样的特殊包 . 如果您不仅要负责为您自己的应用程序提供本地化,而且要为整个系统提供本地化服务!
你必须在android的framework-res包的"res"文件夹中创建"values"文件夹 . 新文件夹的名称必须包含您需要的国家/地区代码,即 . 抛光语言的值-pl-rPL(rPL部分是必需的)(对于英国英语:en-rGB等),这应该足够 - 如果不是 - 在该文件夹中创建strings.xml文件,并在那里添加空的“资源” “节点 .
要为应用程序创建或添加多种语言,首先必须在values文件夹中的string.xml中定义所有字符串值,而不是在程序中对它们进行硬编码 . 然后,您还必须为不同的语言设置不同的值文件夹,例如西班牙语和法语 Value 的 Value . 这应该做的工作 . 我不认为应用程序可以默认更改区域设置 .
我想你必须编辑
出现在build / target / product / languages_full.mk中,并添加和删除分配给它的字符串 .
您可以定义自定义字符串,如zz_zz,并在每个res文件夹中添加文件夹values_zz_zz .
没试过,但这可能有用 .
注意:根据您的构建系统,PRODUCT_LOCALES可能会在其他位置被覆盖
要删除语言,如果我们从PRODUCT_LOCALES中删除语言环境字符串,它将起作用 .
我也在寻找一种添加新语言的方法,但只是增加这个并没有用 . 我认为我们需要更新一些低级文件或库才能添加新语言 .