回答:
参照してくださいLocale.getLanguage()
、Locale.getCountry()
代わりのデータベースにこの組み合わせを保管してください... "programatic name"
...
あなたはロケールの背中を構築したい場合には、使用public Locale(String language, String country)
これがサンプルコードです:)
// May contain simple syntax error, I don't have java right now to test..
// but this is a bigger picture for your algo...
public String localeToString(Locale l) {
return l.getLanguage() + "," + l.getCountry();
}
public Locale stringToLocale(String s) {
StringTokenizer tempStringTokenizer = new StringTokenizer(s,",");
if(tempStringTokenizer.hasMoreTokens())
String l = tempStringTokenizer.nextElement();
if(tempStringTokenizer.hasMoreTokens())
String c = tempStringTokenizer.nextElement();
return new Locale(l,c);
}
文字列からロケールを返すメソッドはcommons-langライブラリに存在します:
LocaleUtils.toLocale(localeAsString)
-
ロケールパーツの間にハイフンがある場合、IETF BCP 47タグを処理しますLocale.forLanguageTag
Javaは適切な実装で多くのことを提供し、多くの複雑さを回避できます。これはms_MYを返します。
String key = "ms-MY";
Locale locale = new Locale.Builder().setLanguageTag(key).build();
Apache CommonsはLocaleUtils
、文字列表現の解析を支援する必要があります。これはen_USを返します
String str = "en-US";
Locale locale = LocaleUtils.toLocale(str);
System.out.println(locale.toString());
ロケールコンストラクタを使用することもできます。
// Construct a locale from a language code.(eg: en)
new Locale(String language)
// Construct a locale from language and country.(eg: en and US)
new Locale(String language, String country)
// Construct a locale from language, country and variant.
new Locale(String language, String country, String variant)
このLocaleUtilsとこのLocaleを確認して、他のメソッドを調べてください。
この答えは少し遅れるかもしれませんが、文字列の解析はOPが想定するほど醜いものではないことがわかりました。私はそれが非常にシンプルで簡潔であることに気づきました:
public static Locale fromString(String locale) {
String parts[] = locale.split("_", -1);
if (parts.length == 1) return new Locale(parts[0]);
else if (parts.length == 2
|| (parts.length == 3 && parts[2].startsWith("#")))
return new Locale(parts[0], parts[1]);
else return new Locale(parts[0], parts[1], parts[2]);
}
私はこれを(Java 7で)Locale.toString()のドキュメントにあるすべての例でテストしました: "en"、 "de_DE"、 "_ GB"、 "en_US_WIN"、 "de__POSIX"、 "zh_CN_#Hans"、 "zh_TW_ #Hant-x-java "、および" th_TH_TH_#u-nu-thai "。
重要な更新:これは、ドキュメントによると、Java 7以降での使用は推奨されていません:
特に、toStringの出力を言語、国、バリアントフィールドに解析するクライアントは、これを続行できます(ただし、これは強くお勧めしません)。ただし、スクリプトまたは拡張機能が存在する場合、バリアントフィールドには追加情報があります。
代わりにLocale.forLanguageTagとLocale.toLanguageTagを使用してください。必要であればLocale.Builderを使用してください。
Locale.forLanguageTag
ハイフン(と、IETFのBCP 47に示すように符号化された言語のタグにのみ適用される-
)ではなく下線(_
のリターンのように)Locale
のtoString
方法
Locale
sをそのtoString
形式で保存するのではなくtoLanguageTag
、Locale
より簡単かつ正確に変換できる形式で保存することを提案することでした。
プロジェクトでSpringフレームワークを使用している場合は、以下も使用できます。
org.springframework.util.StringUtils.parseLocaleString("en_US");
指定された文字列表現をロケールに解析します
Locale#toString()
-完璧です!:)
たくさんの答えを持つ古い質問ですが、ここにもっと解決策があります:
これには静的valueOf
メソッドがないようで、少し意外です。
どちらかと言えば醜いですが、単純な方法は、を反復してLocale.getAvailableLocales()
、それらのtoString
値を自分の値と比較することです。
あまり良くありませんが、文字列の解析は必要ありません。Map
文字列をロケールに事前入力して、そのマップでデータベース文字列を検索できます。
Locale
インスタンスは、有効なロケールのみの非常に小さいサブセットを表します。それは決して完全ではありません。
これはAndroidで使用できます。私にとってはうまくいきます。
private static final Pattern localeMatcher = Pattern.compile
("^([^_]*)(_([^_]*)(_#(.*))?)?$");
public static Locale parseLocale(String value) {
Matcher matcher = localeMatcher.matcher(value.replace('-', '_'));
return matcher.find()
? TextUtils.isEmpty(matcher.group(5))
? TextUtils.isEmpty(matcher.group(3))
? TextUtils.isEmpty(matcher.group(1))
? null
: new Locale(matcher.group(1))
: new Locale(matcher.group(1), matcher.group(3))
: new Locale(matcher.group(1), matcher.group(3),
matcher.group(5))
: null;
}
ええと、代わりにの文字列連結を保存し、キーとしてgetVariant()を格納します。これによりLocale.getISO3Language()
、getISO3Country()
後でLocale(String language, String country, String variant)
コンストラクタを呼び出すことができます。
実際、displayLanguageに依存することは、ロケールの言語を使用して表示することを意味し、iso言語コードとは異なり、ロケールに依存するようになります。
例として、enロケールキーは次のように保存できます。
en_EN
en_US
等々 ...