我们在印度尼西亚拥有的所有设备上都发生这种情况。
国家代码是正确的,显示语言和 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 区域设置构造函数参考:
ISO 639 不是一个稳定的标准;它定义的一些语言代码(特别是“iw”、“ji”和“in”)已更改。此构造函数接受旧代码(“iw”、“ji”和“in”)和新代码(“he”、“yi”和“id”),但 Locale 上的所有其他 API 将仅返回旧代码。
所以我们无能为力,在应用程序内部使用“in”表示字符串等,并在与后端服务器等外部实体通信时将其转换为“id”(或将 in 视为 id)。
检查设备上的语言设置。如果没问题,那么你的系统有问题,你可以尝试升级一下。事实上,配置可以通过编程方式更改
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());
}
}
但是,这并不可取;
我有同样的经历,我在Android开发者网站
找到了参考如果您想将旧的语言代码(“iw”,“ji”和“in”)更改为新的语言代码(“he”,“yi”和“id”),您只需使用下面的API
//kotlin
Locale.getDefault().toLanguageTag()