是否有一种巧妙的方法从Locale 方法返回的"程序化名称" 中获取Locale实例toString()
?一个明显而丑陋的解决方案是解析String然后根据它构建一个新的Locale实例,但也许有更好的方法/就绪解决方案呢?
需要的是我想在SQL数据库中存储一些特定于语言环境的设置,包括Locales本身,但是将序列化的Locale对象放在那里会很难看.我宁愿存储他们的字符串表示,这似乎相当充分.
小智 119
在commons-lang库中存在从字符串返回locale的方法:
LocaleUtils.toLocale(localeAsString)
raj*_*raj 33
请参阅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);
}
Run Code Online (Sandbox Code Playgroud)
Vde*_*deX 29
Java通过适当的实现提供了很多东西,可以避免很多复杂性.这将返回ms_MY.
String key = "ms-MY";
Locale locale = new Locale.Builder().setLanguageTag(key).build();
Run Code Online (Sandbox Code Playgroud)Apache Commons必须LocaleUtils
帮助解析字符串表示.这将返回en_US
String str = "en-US";
Locale locale = LocaleUtils.toLocale(str);
System.out.println(locale.toString());
Run Code Online (Sandbox Code Playgroud)您还可以使用区域设置构造函数.
// 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)
Run Code Online (Sandbox Code Playgroud)请检查此LocaleUtils和此Locale以探索更多方法.
小智 13
选项1 :
org.apache.commons.lang3.LocaleUtils.toLocale("en_US")
Run Code Online (Sandbox Code Playgroud)
选项2:
Locale.forLanguageTag("en-US")
Run Code Online (Sandbox Code Playgroud)
请注意,选项1是语言和国家/地区之间的"下划线",选项2是"破折号".
and*_*ndy 12
这个答案可能有点晚了,但事实证明解析字符串并不像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]);
}
Run Code Online (Sandbox Code Playgroud)
我使用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");
Run Code Online (Sandbox Code Playgroud)
说明文件:
将给定的String表示形式解析为语言环境