【问题标题】:Adding/Removing the language entries in the "Settings" -> "Select Locale" from Android phone在 Android 手机的“设置”->“选择区域设置”中添加/删除语言条目
【发布时间】:2011-07-27 13:44:47
【问题描述】:

我的问题:

如何在源代码 等级?

我将提供更多关于我想要什么以及我做了什么的细节。 如果我提出任何愚蠢的理解或信息,请原谅。我对Android开发很陌生,几天前开始学习它。还有很多我不知道的。

更多关于我想要的信息:

我最近正在执行一项任务,用新语言本地化整个手机产品(我的意思是,我不是在开发特定的应用程序。这是为什么我需要在设置中添加新的语言环境)。当我拿到开发电话时,我发现只有几个语言条目在“Select Locale”中可用,例如“English”、“French”和“Spain”。所以首先,我需要在这个列表中添加并显示一些新的语言条目,例如“日语”、“中文”、“韩语”。

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

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

我做了什么:

在来这里之前,我在互联网上做了很多研究。这是我发现的:

  1. Stackoverflow 中的 Sinkiru 提出了一个关于我到底在寻找什么的问题。看到它here。然而,没有其他人回复他。他自己的回复只告诉了在哪里查询当前语言设置,这不是我想要的。我亲自就这个问题给他发了一封电子邮件,但没有得到他的回复。

  2. 我在 Stackoverflow 中搜索了很多关键字,关键字“android locale”、“android 语言”、“android new locale”等等。这个网站上的大部分问题都是询问如何更改应用程序的语言环境、如何为应用程序添加多语言支持等。它们不是我想要的。

  3. 我在 android-platform Google group(http://groups.google.com/group/android-platform) 中搜索了很多。有些人在问我的问题,但是在阅读完消息后,我仍然没有得到答案.. :-( 这是我在小组中阅读的帖子列表(我确实不是从他们那里得到我想要的):

  4. 返回上面列出的条目“(a)”。在“操作系统本地化”消息线程中,Android 框架工程师 Dianne Hackborn 表示:

“设置应用程序只会向您显示所有 中可用的语言环境 平台资源。 添加字符串 对于新的语言环境应该自动 有那些显示在设置中。你 告诉构建系统哪个语言环境 执行时要包括的资源 构建...不幸的是我无能为力 你在那方面,但也许有人 否则可以。”

他的粗体字暗示我的任务可以通过向源代码中添加新的语言环境资源以及在构建系统中设置或更改某些内容来自动完成。 我想知道这里是否有人以前做过类似的事情?我明天要试一试。

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

  2. 我还深入研究了 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 运气好吗?

标签: android settings locale


【解决方案1】:

我认为普通应用程序应该向手机添加位置。为此目的,有像MoreLocale 2 这样的特殊软件包。如果您要添加语言环境,您不仅要负责为您自己的应用程序提供本地化,还要为整个系统提供本地化!

【讨论】:

  • 嗨,Christian,我们的团队没有在开发特定的应用程序。我们正在对整个手机进行本地化。 :-)
  • 嗨,rob,我希望从底层 Linux 读取语言环境。也许您应该尝试查看像上面提到的 MoreLocale 2 这样的包的内容。
【解决方案2】:

您必须在 android 的 framework-res 包的“res”文件夹中创建“values”文件夹。该新文件夹的名称必须包含您需要的国家代码,即。 values-pl-rPLrPL 部分是必需的)用于波兰语(对于英式英语:en-rGB 等),应该足够了 - 如果没有 - 在该文件夹中创建 strings.xml 文件,并在那里添加空的“resources”节点。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我认为你必须编辑

      PRODUCT_LOCALES

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

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

      没有尝试过,但这可能有效。

      注意:PRODUCT_LOCALES 可能会在其他地方被覆盖,具体取决于您的构建系统

      【讨论】:

        【解决方案5】:

        对于删除语言,如果我们从 PRODUCT_LOCALES 中删除语言环境字符串,它将起作用。

        我也在寻找一种添加新语言的方法,但仅仅添加它并没有帮助。我认为我们需要更新一些低级文件或库以添加新语言。

        【讨论】:

          【解决方案6】:

          在 HTC 手机上,您还必须修改 /system/customize/CID/default.xml ...这是他们用来在其库存 ROM 上指定区域设置的文件。如果 rom 是 WWE,那么编辑 CID 就可以了,但这并不总是正确的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-02-05
            • 2011-06-03
            • 1970-01-01
            • 2022-06-15
            • 1970-01-01
            • 1970-01-01
            • 2020-01-29
            相关资源
            最近更新 更多