【发布时间】:2011-07-27 13:44:47
【问题描述】:
我的问题:
如何在源代码 等级?
我将提供更多关于我想要什么以及我做了什么的细节。 如果我提出任何愚蠢的理解或信息,请原谅。我对Android开发很陌生,几天前开始学习它。还有很多我不知道的。
更多关于我想要的信息:
我最近正在执行一项任务,用新语言本地化整个手机产品(我的意思是,我不是在开发特定的应用程序。这是为什么我需要在设置中添加新的语言环境)。当我拿到开发电话时,我发现只有几个语言条目在“Select Locale”中可用,例如“English”、“French”和“Spain”。所以首先,我需要在这个列表中添加并显示一些新的语言条目,例如“日语”、“中文”、“韩语”。
我有Android平台的所有源代码和我自己的代码,所以我认为这个任务可以通过修改源代码或某处的资源文件来完成。不幸的是,我不知道代码和文件在哪里。
“Hello, L10N”教程展示了一种在运行时从“自定义语言环境”添加新语言环境的方法。但我想要的是在构建时添加新的语言环境,这样当手机启动时,新的语言环境将直接显示在“选择语言环境”中,无需任何其他操作。
我做了什么:
在来这里之前,我在互联网上做了很多研究。这是我发现的:
Stackoverflow 中的 Sinkiru 提出了一个关于我到底在寻找什么的问题。看到它here。然而,没有其他人回复他。他自己的回复只告诉了在哪里查询当前语言设置,这不是我想要的。我亲自就这个问题给他发了一封电子邮件,但没有得到他的回复。
-
我在 Stackoverflow 中搜索了很多关键字,关键字“android locale”、“android 语言”、“android new locale”等等。这个网站上的大部分问题都是询问如何更改应用程序的语言环境、如何为应用程序添加多语言支持等。它们不是我想要的。
-
我在 android-platform Google group(http://groups.google.com/group/android-platform) 中搜索了很多。有些人在问我的问题,但是在阅读完消息后,我仍然没有得到答案.. :-( 这是我在小组中阅读的帖子列表(我确实不是从他们那里得到我想要的):
返回上面列出的条目“(a)”。在“操作系统本地化”消息线程中,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,我 GUESS 应该是实际的java getLocales() 方法的实现。 C++ AssetManager::getLocales() 最终将我引向 C++ ResTable::getConfigurations() 方法,在该方法中扫描成员变量“mPackageGroups”以检索所有可用的 ResTable_config 项。 因此我认为应该在系统启动期间将所有可用的语言环境添加到这个 mPackageGroups 中。 但是,我最后迷失在代码中,找不到将语言环境添加到 mPackageGroups 的位置。
【问题讨论】:
-
经过一些测试,我现在很确定可用的语言环境是通过“String[] locales = getAssets().getLocales();”获得的陈述。我需要做更多的测试和研究来弄清楚幕后发生的事情。
-
@Melug:哇,我没想到这个问题已经被浏览了这么多次......看起来这是一个很常见的问题,也许我应该做点什么......但是,不,我还没有找到答案(在我发布这个问题后不久,我离开了以前的公司,从那时起我就没有接触过Android开发)。
-
@rob 我还在寻找答案:)
-
你应该在androidadb.com androidadb.com/package/com/android/customlocale/…查看customlocale的源代码
-
@rob 运气好吗?