Android 为印度尼西亚生成错误的语言代码?

问题描述 投票:0回答:3

我们在印度尼西亚拥有的所有设备上都发生这种情况。

国家代码是正确的,显示语言和 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"

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

cyanide 建议只覆盖区域设置,但是对于那些真正需要使用“in”而不是“id”的设备呢,那么这对他们来说是错误的?

android internationalization
3个回答
6
投票

好吧,找出发生这种情况的原因,请参阅 Android 区域设置构造函数参考

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

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


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());
     }   
  }

但是,这并不可取;


2
投票

我有同样的经历,我在Android开发者网站

找到了参考

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

//kotlin
Locale.getDefault().toLanguageTag()
© www.soinside.com 2019 - 2024. All rights reserved.