LocaleのtoString()
メソッドによって返される「プログラム名」から Locale インスタンスを取得するきちんとした方法はありますか?明白でい解決策は、文字列を解析し、それに従って新しいLocaleインスタンスを構築することですが、おそらくそれのためのより良い方法/準備ができている解決策がありますか?
ロケール自体を含むいくつかのロケール固有の設定をSQLデータベースに保存する必要がありますが、シリアル化されたLocaleオブジェクトをそこに配置するのはいでしょう。私はむしろ文字列表現を保存したいのですが、これは非常に詳細に十分であると思われます。
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)
Java 7以降、ファクトリメソッドLocale.forLanguageTag
およびインスタンスメソッドLocale.toLanguageTag
があり、 IETF言語タグ を使用しています。
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 を確認してください。
オプション1:
org.Apache.commons.lang3.LocaleUtils.toLocale("en_US")
オプション2:
Locale.forLanguageTag("en-US")
オプション1は言語と国の間の「アンダースコア」であり、オプション2は「ダッシュ」です。
この答えは少し遅いかもしれませんが、文字列の解析はOPが想定したほどasくないことがわかります。私はそれを非常にシンプルで簡潔に見つけました:
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]);
}
Locale.toString()のドキュメントに記載されているすべての例を使用して(Java 7で)これをテストしました: "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を使用します。
たくさんの答えがある古い質問ですが、ここにもっと解決策があります:
プロジェクトでSpringフレームワークを使用している場合は、次も使用できます。
org.springframework.util.StringUtils.parseLocaleString("en_US");
ドキュメント :
指定された文字列表現をロケールに解析します
これは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;
}
このための静的valueOf
メソッドはないようですが、これは少し驚くべきことです。
Ratherいですが、簡単な方法の1つは、Locale.getAvailableLocales()
を反復処理して、toString
の値を自分の値と比較することです。
あまりよくありませんが、文字列の解析は必要ありません。 Map
の文字列をロケールに事前入力し、そのマップでデータベース文字列を検索できます。
実装したばかりだから:
Groovy
/Grails
では、次のようになります。
def locale = Locale.getAvailableLocales().find { availableLocale ->
return availableLocale.toString().equals(searchedLocale)
}
代わりに、Locale.getISO3Language()
、getISO3Country()
、およびgetVariant()の文字列連結をキーとして保存します。これにより、後でLocale(String language, String country, String variant)
コンストラクターを呼び出すことができます。
実際、displayLanguageに依存するということは、ロケールの言語を使用して表示することを意味し、iso言語コードに反して、ロケールに依存します。
例として、enロケールキーは次のように保存できます。
en_EN
en_US
等々 ...