16

Locale次の言語コードのいずれかを使用してオブジェクトをインスタンス化する場合:heで、yiそのid値が保持されません。

例えば:

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

何が原因で、これを回避する方法はありますか?

4

2 に答える 2

19

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 つの方法は、このクラスのラッパーを作成して使用することです。

于 2012-12-20T14:21:53.720 に答える