【问题标题】:Android generating wrong language code for Indonesia?Android 为印度尼西亚生成错误的语言代码?
【发布时间】:2017-05-29 15:26:11
【问题描述】:

这发生在我们在印度尼西亚的所有设备上。

国家代码正确,显示语言和 ISO3 也正确:

Locale.getDefault().getISO3Country()     // "IDN"
Locale.getDefault().getDisplayCountry()  // "Indonesia"
Locale.getDefault().getCountry()         // "ID"
Locale.getDefault().getISO3Language()    // "ind"
Locale.getDefault().getDisplayLanguage() // "Bahasa Indonesia"

但是正常的语言代码是错误的,应该是“id”而不是“in”。然后android也生成了错误的language_COUNTRY标识符,应该是“id_ID”而不是“in_ID”

Locale.getDefault().getLanguage()        // "in"
Locale.getDefault().toString()           // "in_ID"

这是一个已知问题吗?我们能做些什么呢?

氰化物建议只是覆盖语言环境,但是那些真正需要使用“in”而不是“id”的设备呢,那对他们来说是错误的吗?

【问题讨论】:

    标签: android internationalization


    【解决方案1】:

    好吧,找出它发生的原因,请参阅Android Locale Constructor Reference

    ISO 639 不是一个稳定的标准;它定义的一些语言代码(特别是“iw”、“ji”和“in”)已经改变。此构造函数接受旧代码(“iw”、“ji”和“in”)和新代码(“he”、“yi”和“id”),但 Locale 上的所有其他 API 将仅返回旧代码。

    所以我们无能为力,在应用程序内部使用“in”作为字符串等,并在与后端服务器等外部实体通信时将其转换为“id”(或将 in 视为 id)。

    【讨论】:

    • 这取决于后端服务器使用什么 :-) 如果是 Java,他们也会期待“in”。 Java 仍然使用遗留代码,这也是 Android 使用它们的原因:与官方 JDK 的兼容性。
    • 后端在 node.js 中,但是很好!虽然我认为我读过构造函数接受新代码,但只有在被要求时才返回旧代码以实现兼容性。会说现在是支持语言环境库的时候了。 :p
    【解决方案2】:

    检查您设备上的语言设置。如果没问题,那么你的系统是狡猾的,所以你可以尝试升级它。事实上,配置是可以编程改变的

       public void updateLocale(Resources rsrc) {
          Configuration conf = rsrc.getConfiguration();
          Locale locale = conf.locale;
          if (locale.getCountry().equals("ID") && locale.getLanguage().equals("in")) {
              conf.locale = new Locale("id", "ID");
              rsrc.updateConfiguration(conf, rsrc.getDisplayMetrics());
         }   
      }
    

    但是,这并不是真正可取的;

    【讨论】:

    • hmm,这不仅仅是我的系统,我们有成千上万的设备报告错误的“in”语言代码,没有一个报告正确的“id”语言代码,所以似乎是 android 本身的问题。如果您在 Android Studio 中创建翻译文件,它也会使用错误的“in”来创建资源文件夹“values-in”而不是“values-id”。
    • 不确定,但是更改语言环境可能会破坏一些东西,例如库中的翻译功能,所以如果没有大量测试就不会尝试。但很高兴知道你可以做这样的事情,谢谢!
    【解决方案3】:

    我也有同样的经历,在Android Developer Site找到了参考

    如果您想将旧语言代码(“he”、“yi”和“id”)更改为新语言代码(“iw”、“ji”和“in”),只需使用下面的此 API

    //kotlin
    Locale.getDefault().toLanguageTag()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      相关资源
      最近更新 更多