我的问题:
我如何在 Android 手机的“设置”->“语言和键盘设置”->“选择区域设置”(或“选择语言”)中从源代码级别添加或删除语言条目?
我将提供更多关于我想要的和我所做的事情的细节。如果我提出任何愚蠢的理解或信息,请请原谅我。我刚开始学习 Android 开发,几天前才开始学习。还有很多我不知道的东西。
更多关于我想要的信息:
我最近正在完成一个任务,使用新语言本地化整个手机产品(我的意思是,我不是在开发特定应用程序。这就是为什么我需要在设置中添加新的语言环境)。当我拿到开发手机时,我发现“选择区域设置”中只有几个可用的语言条目,例如“英语”,“法语”和“西班牙语”。因此,首先,我需要添加和显示一些新的语言条目到这个列表中,例如“日语”,“中文”,“韩语”等。
我拥有 Android 平台的所有源代码和自己的代码,因此我认为可以通过修改某个地方的源代码或资源文件来完成此任务。不幸的是,我不知道代码和文件在哪里。
这个"Hello, L10N"教程展示了一种在运行时从“自定义语言环境”添加新语言环境的方法。但是我想要的是在构建时添加新的语言环境,这样当手机启动时,新的语言环境将直接显示在“选择语言环境”中,无需任何其他操作。我已经做了什么:
在来到这里之前,我在互联网上进行了大量研究。以下是我的发现:
Sinkiru在Stackoverflow上问了一个关于我需要的内容的问题。请看这里。然而,没有其他人回答他。他自己的回复只是告诉我们如何查询当前语言设置,这不是我要的内容。我个人给他发了一封电子邮件询问这个问题,但还没有得到他的回复。
我在Stackoverflow上进行了大量搜索,使用关键字“android locale”,“android language”,“android new locale”和类似的东西。这个网站上的大多数问题都是关于如何更改应用程序的语言环境,如何为应用程序添加多语言支持等等。这些不是我想要的。
我在android-platform Google组中进行了大量搜索(http://groups.google.com/group/android-platform)。有些人正在问我的问题,但是在阅读完所有留言后,我仍然没有得到答案.. :-( 这是我在该组中阅读的帖子列表(我从中没有得到我想要的内容):
"OS localization" - 我将在下面详细讨论。
"附加语言支持"
回到上面列出的“(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的位置。