在安卓手机中,“设置” -> “选择语言环境”中添加/删除语言选项条目

31

我的问题:

我如何在 Android 手机的“设置”->“语言和键盘设置”->“选择区域设置”(或“选择语言”)中从源代码级别添加或删除语言条目?

我将提供更多关于我想要的和我所做的事情的细节。如果我提出任何愚蠢的理解或信息,请请原谅我。我刚开始学习 Android 开发,几天前才开始学习。还有很多我不知道的东西。

更多关于我想要的信息:

我最近正在完成一个任务,使用新语言本地化整个手机产品(我的意思是,我不是在开发特定应用程序。这就是为什么我需要在设置中添加新的语言环境)。当我拿到开发手机时,我发现“选择区域设置”中只有几个可用的语言条目,例如“英语”,“法语”和“西班牙语”。因此,首先,我需要添加和显示一些新的语言条目到这个列表中,例如“日语”,“中文”,“韩语”等。

我拥有 Android 平台的所有源代码和自己的代码,因此我认为可以通过修改某个地方的源代码或资源文件来完成此任务。不幸的是,我不知道代码和文件在哪里。

这个"Hello, L10N"教程展示了一种在运行时从“自定义语言环境”添加新语言环境的方法。但是我想要的是在构建时添加新的语言环境,这样当手机启动时,新的语言环境将直接显示在“选择语言环境”中,无需任何其他操作。

我已经做了什么:

在来到这里之前,我在互联网上进行了大量研究。以下是我的发现:

  1. Sinkiru在Stackoverflow上问了一个关于我需要的内容的问题。请看这里。然而,没有其他人回答他。他自己的回复只是告诉我们如何查询当前语言设置,这不是我要的内容。我个人给他发了一封电子邮件询问这个问题,但还没有得到他的回复。

  2. 我在Stackoverflow上进行了大量搜索,使用关键字“android locale”,“android language”,“android new locale”和类似的东西。这个网站上的大多数问题都是关于如何更改应用程序的语言环境,如何为应用程序添加多语言支持等等。这些不是我想要的。

  3. 我在android-platform Google组中进行了大量搜索(http://groups.google.com/group/android-platform)。有些人正在问我的问题,但是在阅读完所有留言后,我仍然没有得到答案.. :-( 这是我在该组中阅读的帖子列表(我从中没有得到我想要的内容):

  4. 回到上面列出的“(a)”条目。在“OS localization”消息线程中,Android框架工程师Dianne Hackborn说了以下内容:

"设置应用程序只显示平台资源中提供的所有语言环境。添加新语言环境的字符串应自动显示在设置中。您可以在构建系统执行构建时告诉它包含哪些语言环境资源......不幸的是,我无法帮助您完成这一部分,但也许其他人可以。"他加粗的话表明通过在源代码中添加新的语言环境资源并在构建系统中设置或更改某些内容,我的任务可能会自动完成。"我想知道这里是否有人以前做过类似的事情?"我明天要试一试。

最后但同样重要的是,我在官方Android开发者网站上进行了搜索。在“运行和测试本地化应用程序”教程的“Hello,L10N”中,它提到了“设置”应用程序中可用的语言环境,但基本上是关于在模拟器中要做什么,这不是我需要的。我想在真实的手机上完成它。

我还深入研究了Android平台源代码,试图发现一些东西。我从$(ANDR_SRC_ROOT)/Packages/app/Settings/src/.../LocalePicker.java开始。在LocalePicker::onCreate()方法中,我注意到这行代码:

String[] locales = getAssets().getLocales();

"

以下代码尝试将所有获取到的语言环境名称设置为ArrayAdapter,然后将适配器设置为列表视图以显示。因此,我认为"getLocales()"方法是解决方案的关键。

然后我查看了getLocales()代码。getLocales()是AssetManager的一个成员方法,并声明为本地方法,因此我进入$(ANDR_SRC_ROOT)/frameworks/base/libs/utils/AssetManager.cpp,这应该是java getLocales()方法的实际实现。C++ AssetManager::getLocales()最终导致C++ ResTable::getConfigurations()方法,其中扫描了一个成员变量"mPackageGroups"来检索所有可用的ResTable_config项。因此,我认为在系统启动时应将所有可用的语言环境添加到此mPackageGroups中。然而,最后我在代码中迷失了方向,找不到语言环境添加到mPackageGroups的位置。


2
经过一些测试,我现在相当确定可用的语言环境是通过 "String[] locales = getAssets().getLocales();" 语句获取的。我需要进行更多的测试和研究,以弄清楚背后发生了什么。 - yaobin
@Melug:哇,我从未想到这个问题被浏览了这么多次...看起来这是一个相当普遍的问题,也许我应该采取一些行动...但是,不,我还没有找到答案(在我发完这个问题后不久,我就离开了之前的公司,自那以后我就没有再涉及Android开发)。 - yaobin
@rob 我还在寻找答案 :) - Melug
你应该在androidadb.com的customlocale源代码中查找。 http://www.androidadb.com/package/com/android/customlocale/package-summary.html - homi3kh
@rob 你有什么进展吗? - Jignesh Shah
6个回答

2
您需要在Android的framework-res包的“res”文件夹中创建一个名为“values”的文件夹。该新文件夹的名称必须包含您所需的国家/地区代码,例如:波兰语:values-pl-rPLrPL部分是必需的),英式英语:en-rGB等。如果这样还不够,请在该文件夹中创建strings.xml文件,并添加一个空的"resources"节点即可。

2
在HTC手机上,您还必须修改/system/customize/CID/default.xml... 这是他们在原始ROM中用于指定地区设置的文件。如果ROM是WWE版本,则据说只需编辑CID,但这并不总是正确的做法。

1

我认为一个普通的应用程序不应该向手机添加位置信息。这种情况下,有专门的软件包,例如MoreLocale 2。如果您添加了语言环境,那么您不仅需要为自己的应用程序提供本地化支持,还需要为整个系统提供本地化支持!


2
嗨 Christian,我们的团队没有在开发具体的应用程序。我们正在本地化整个手机。 :-) - yaobin
嗨,Rob,我希望区域设置是从底层的Linux中读取的。也许你应该尝试查看像上面提到的MoreLocale 2这样的软件包的内容。 - Christian Gawron

1
要在您的应用程序中创建或添加多种语言,首先必须在值文件夹中的string.xml中定义所有字符串值,而不是在程序中硬编码它们。然后,您还必须为不同的语言拥有不同的Value文件夹,例如Value-es用于西班牙语和Value-fr用于法语。这样就可以完成任务了。我认为应用程序默认情况下无法更改语言环境。

0

我认为你需要编辑

PRODUCT_LOCALES

在 build/target/product/languages_full.mk 中,添加和删除分配给它的字符串。

您可以定义自己的字符串,例如 zz_zz,并在每个 res 文件夹中添加文件夹 values_zz_zz。

我没有尝试过这个方法,但这可能有效。

注意:根据您的构建系统,PRODUCT_LOCALES 可能会被其他地方覆盖。


0

关于删除语言,如果我们从PRODUCT_LOCALES中删除区域设置字符串,它将起作用。

我也在寻找一种添加新语言的方法,但仅仅添加到这里是不够的。我认为我们需要更新一些低级文件或库以添加新语言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接