如何从Java中的String表示中获取Locale?

Joo*_*kka 99 java locale

是否有一种巧妙的方法从Locale 方法返回的"程序化名称" 中获取Locale实例toString()?一个明显而丑陋的解决方案是解析String然后根据它构建一个新的Locale实例,但也许有更好的方法/就绪解决方案呢?

需要的是我想在SQL数据库中存储一些特定于语言环境的设置,包括Locales本身,但是将序列化的Locale对象放在那里会很难看.我宁愿存储他们的字符串表示,这似乎相当充分.

小智 119

在commons-lang库中存在从字符串返回locale的方法: LocaleUtils.toLocale(localeAsString)

  • 如果你正在处理IETF BCP 47标签的区域设置部分之间有一个连字符`-`,如果你使用的是Java 7,你可以使用`Locale.forLanguageTag` (9认同)
  • LocaleUtils.toLocale不支持'zh-Hans','pt-PT'等字符串. (2认同)

nil*_*skp 56

从Java 7开始,有使用IETF语言标记的工厂方法Locale.forLanguageTag和实例方法.Locale.toLanguageTag

  • 只是想强调一下,Locale.forLanguageTag可使用IETF语言环境字符串(即en-US),而不适用于ISO语言环境字符串(即en_US)。 (3认同)

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)

  • 你应该使用Locale.forLanguageTag(String) (7认同)
  • 这甚至都不会编译. (3认同)
  • @raj 为什么要使用 tokenizer ,如果 Java 为您提供了现成的方法?例如 toLocale(String str)。请参阅答案中的示例 (2认同)

Vde*_*deX 29

  1. Java通过适当的实现提供了很多东西,可以避免很多复杂性.这将返回ms_MY.

    String key = "ms-MY";
    Locale locale = new Locale.Builder().setLanguageTag(key).build();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 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)
  3. 您还可以使用区域设置构造函数.

    // 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.

  • Java 7`Locale.forLanguageTag`仅适用于在IETF的BCP 47中指示编码的语言标签,带有连字符(`-`),而不是下划线(`_`),如`Locale`的`toString'的返回方法 (5认同)

Tau*_*ren 8

有很多答案的老问题,但这里有更多的解决方案:


Jav*_*adi 7

如果您在项目中使用Spring框架,则还可以使用:

org.springframework.util.StringUtils.parseLocaleString("en_US");
Run Code Online (Sandbox Code Playgroud)

说明文件

将给定的String表示形式解析为语言环境