如何从Java的string表示中获取区域设置?
从locale的toString()
方法返回的“编程名称”中获取Locale实例是否有一个简洁的方法? 一个明显的和丑陋的解决scheme是parsingstring,然后根据这个构build一个新的Locale实例,但也许有一个更好的方法/就绪的解决scheme呢?
需要的是我想在SQL数据库中存储一些特定于语言环境的设置,包括Locales本身,但是将序列化的Locale对象放在那里会很难看。 我宁愿存储他们的string表示,这似乎是相当充分的细节。
请参阅Locale.getLanguage()
, Locale.getCountry()
..将这个组合存储在数据库中,而不是"programatic name"
…当你想build立语言环境回来,使用public Locale(String language, String country)
这里是一个示例代码,:)
// may contain simple syntax error, i dont have java rite now to test.. // but this is a bigger picture for ur 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库中存在从string返回locale的方法: 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();
-
这将返回en_US
String str = "en-US"; Locale locale = LocaleUtils.toLocale(str); System.out.println(locale.toString());
-
你也可以使用locale构造函数。
// 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和这个语言环境来探索更多的方法。
这个答案可能有点迟,但事实certificate,parsing出string并不像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]); }
我使用了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“。
重要更新 :根据文档,这不build议在Java 7+中使用:
特别是,将toString的输出parsing为语言,国家和变体字段的客户可以继续这样做(尽pipe强烈build议不要这样做),但是如果脚本或扩展名存在,则variant字段将包含附加信息。
改为使用Locale.forLanguageTag和Locale.toLanguageTag,或者如果必须使用Locale.Builder。
老问题与大量的答案,但这里有更多的解决scheme:
- 从string获取区域设置
- 将string转换为语言环境
选项1 :
org.apache.commons.lang3.LocaleUtils.toLocale("en_US")
选项2:
Locale.forLanguageTag("en-US")
请注意选项1是语言和国家之间的“下划线”, 选项2是“短划线”。
似乎没有一个静态的valueOf
方法,这有点令人惊讶。
一个相当丑陋,但很简单的方法是迭代Locale.getAvailableLocales()
,将它们的toString
值与你的值进行比较。
不是很好,但不需要stringparsing。 您可以预先填充stringMap
到语言环境,并在该映射中查找您的数据库string。
你可以在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; }
那么,我会存储一个string连接的Locale.getISO3Language()
, getISO3Country()
和getVariant()作为键,这将允许我后来调用Locale(String language, String country, String variant)
构造函数。
实际上,依赖于display语言意味着使用语言环境的语言来显示它,这使得语言环境相关,与ISO语言代码相反。
举例来说,en locale键可以存储为
en_EN en_US
等等 …
因为我刚刚实施它:
在Groovy
/ Grails
,它将是:
def locale = Locale.getAvailableLocales().find { availableLocale -> return availableLocale.toString().equals(searchedLocale) }