Locale
次の言語コードのいずれかを使用してオブジェクトをインスタンス化する場合:he
で、yi
そのid
値が保持されません。
例えば:
Locale locale = new Locale("he", "il");
locale.getLanguage(); // -> "iw"
何が原因で、これを回避する方法はありますか?
Locale クラスは、入力内容に何のチェックも課しませんが、特定の言語コードを古い値に置き換えます。ドキュメントから:
ISO 639 は安定した規格ではありません。定義されている言語コードの一部 (具体的には "iw"、"ji"、および "in") が変更されました。このコンストラクターは、古いコード ("iw"、"ji"、および "in") と新しいコード ("he"、"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
であるため、拡張することはできず、実装する特定のインターフェイスはありません。これらの言語コードを保持する 1 つの方法は、このクラスのラッパーを作成して使用することです。