JDK Locale类处理希伯来语(他),意第绪语(yi)和印度尼西亚语(id)的ISO语言代码

时间:2012-12-20 14:21:24

标签: locale java

使用以下任一语言代码实例化Locale对象时:heyiid它不会保留其值。

例如:

Locale locale = new Locale("he", "il");
locale.getLanguage(); // -> "iw"

造成这种情况的原因是什么方法可以解决这个问题?

1 个答案:

答案 0 :(得分:19)

Locale类不会对您在其中提供的内容进行任何检查,但会为其旧值交换某些语言代码。来自the documentation

  

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

这是构造函数:

public Locale(String language, String country, String variant) {
    this.language = convertOldISOCodes(language);
    this.country = toUpperCase(country).intern();
    this.variant = variant.intern();
}

这是神奇的方法:

private String convertOldISOCodes(String language) { 
    // we accept both the old and the new ISO codes for the languages whose ISO 
    // codes have changed, but we always store the OLD code, for backward compatibility 
    language = toLowerCase(language).intern(); 
    if (language == "he") { 
        return "iw"; 
    } else if (language == "yi") { 
        return "ji"; 
    } else if (language == "id") { 
        return "in"; 
    } else { 
        return language; 
    }
}

它创建的对象是不可变的,所以没有解决这个问题。该类也是final,因此您无法扩展它,并且它没有特定的接口来实现。保留这些语言代码的一种方法是在这个类周围创建一个包装器并使用它。