【问题标题】:Load all languages in Android在 Android 中加载所有语言
【发布时间】:2012-10-10 05:09:24
【问题描述】:

我在 Android 应用程序中有几个语言文件:value/strings.xml、value-en/strings.xml、...等 可以将这些文件的内容加载到某些数组或其他东西中。例如,我想在运行时将默认文本字符串和英文字符串加载到 2 个不同的数组中。

谢谢

阿林

【问题讨论】:

  • 您是否尝试更改资源配置中的语言环境?
  • 我可以更改语言,然后我可以访问配置。但我打算在运行时不更改语言环境的情况下将字符串加载到数组中。我想知道是否有类似的东西:array = loadResources("en"), array2=loadResources("es")。在运行时更改语言环境只是为了获取这些数组不是我的选择,也许是直接访问文件?
  • 我并不是说要更改系统区域设置,但您可以在配置对象中更改它并使用 resource.setConfiguration
  • 你无法真正访问这些文件,因为 xml 是由 sdk 编译的
  • 我的意图是使用一些专有的语言系统(这是不明智的),因为应用程序需要这样做。为了不硬编码大量语言键和值,我在想也许我可以重用标准值/strings.xml 我知道有更好的推荐方法,但这个方法的要求是定义语言文件,并且用户在运行时选择语言,根据他的选择,应用程序加载正确的数组。为了避免硬编码,我想也许我可以使用这些。我只是尽量保持对默认最佳实践的封闭。

标签: android string resources locale


【解决方案1】:

创建一个这样的方法:

Resources getResourcesByLocale( Context context, String localeName ) {
    Resource res = context.getResources();
    Configuration conf = new Configuration(res.getConfiguration());
    conf.locale = new Locale(localeName);
    return new Resources(res.getAssets(), res.getDisplayMetrics(), conf);
}

您可以为您定义的任何语言环境获取资源,例如:

Resources res_en = getResourcesByLocale(context, "en");
Resources res_de = getResourcesByLocale(context, "de");
Resources res_fr = getResourcesByLocale(context, "fr");

String some_name_en = res_en.getString(R.string.some_name);
String some_name_fr = res_fr.getString(R.string.some_name);
// etc...

此外,如果您没有为某些语言环境定义字符串,则不需要注意异常,因为无论如何都会加载默认值(来自res/values/*)。

【讨论】:

    【解决方案2】:

    其实情况就是这样。想象一下我有这样的场景:一些中国人打开应用程序。他的手机设置为 ch locale。应用程序默认为 xx 作为语言,这意味着我有 2 个语言文件 values/strings.xml(例如默认为西班牙语)和另一种语言 values-en/strings.xml 为英语。默认对他来说没有意义,所以英语将是最适合他理解的,即使他不太懂。因此,在应用程序启动时,我打开语言设置(android 语言设置),除非他选择英语,否则任何选择都会将应用程序设置为西班牙语。我强迫他基本上用英语更改电话区域设置,只是为了使用我的应用程序。总的来说,android 的概念是错误的,因为我需要能够在不更改设备语言的情况下以我想要的任何语言查看应用程序。


    我做了什么: - 我在 values 文件夹中创建了另一个 string_xx.xml 文件。现在,对于翻译字符串名称 = “txtTranslation”,我在 string_xx 文件中有“en_txtTranslation”键。 R.java 将它们全部加载并在我的应用程序中,基于全局 var selectedLanguage = xx,我使用以下代码附加写入字符串:

    public String translate(String text)
    {
          String appLanguage = UtilsCentral.getUserLanguage(getApplicationContext());
          if (appLanguage != "")
          {
              return getString(getResources().getIdentifier(appLanguage + "_" + text, "string", this.getPackageName()));  
          }
          else 
          {
              return getString(getResources().getIdentifier(text, "string", this.getPackageName()));
          }
    }
    

    确实,在创建活动时,我需要使用 .text = tarnslate("txtTranslation") 设置所有视图

    注意:UtilsCentral.getUserLanguage(getApplicationContext()) 返回应用语言(用户选择)

    结论,还有更多无用的工作,但让我做我需要的,我认为是正常的。

    【讨论】:

    • 这确实是一个有趣的观点。 “如果应用程序无法以我的语言提供并且我不理解应用程序的默认语言,会发生什么情况”。我认为这应该直接提交给 android 开发团队
    • 您可以做的是更改应用程序中的系统范围区域设置,并在用户退出时将其更改回
    • @njzk2 你可以随时问他们,但我认为他们会告诉你解决方案是为默认语言提供本地化,或者不要让用户在该市场下载应用程序。跨度>
    猜你喜欢
    • 2021-02-12
    • 1970-01-01
    • 2018-09-23
    • 2014-12-07
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    相关资源
    最近更新 更多