如何从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提供了很多适合实现的东西,可以避免很多复杂性:

例子:

  1. 这将返回ms_MY

     String key = ms-MY; Locale locale = new Locale.Builder().setLanguageTag(key).build(); 
  2. 这将返回en_US

     String str = "en-US"; Locale locale = LocaleUtils.toLocale(str); System.out.println(locale.toString()); 
  3. 你也可以使用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) }