菜鸟教程小白 发表于 2022-12-12 18:55:30

java - 如何将 iOS NSLocale localeIdentifier 转换为 Java Locale?


                                            <p><p>我有 <a href="https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSLocale_Class/#//apple_ref/occ/instp/NSLocale/localeIdentifier" rel="noreferrer noopener nofollow"><code>NSLocale localeIdentifier</code></a> 生成的字符串值,我需要构造一个 <a href="https://docs.oracle.com/javase/7/docs/api/java/util/Locale.html" rel="noreferrer noopener nofollow"><code>java.util.Locale</code></a> .我有 <a href="https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/LocaleUtils.html#toLocale(java.lang.String)" rel="noreferrer noopener nofollow"><code>org.apache.commons.lang3.LocaleUtils#toLocale</code></a>用于解析 Java 语言环境,但这并不适用于所有情况。例如,<code>en_TH@calendar=gregorian</code> 和 <code>zh-Hans_TH</code> 等值会导致 <code>java.lang.IllegalArgumentException</code>。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>看起来 <code>org.apache.commons.lang3.LocaleUtils#toLocale</code> 不支持 iOS 语言环境的所有功能。苹果有<a href="https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/LanguageandLocaleIDs/LanguageandLocaleIDs.html" rel="noreferrer noopener nofollow">documentation describing the language and locale ID format</a> .语言环境可以是以下格式之一:</p>

<ul>
<li><code>[语言指示符]</code></li>
<li><code>[语言代号]_[地区代号]</code></li>
<li><code>[语言代号]-[脚本代号]</code></li>
<li><code>[语言代号]-[脚本代号]_[地区代号]</code></li>
</ul>

<p>其中 <code></code> 是 ISO 639,<code></code> 是 ISO 3166,<code></code> 是 ISO 15924。本文档没有定义 <code>@</code>,但我认为对于 <code>java.util.Locale</code>,我们不需要它。 </p>

<p>这是一个用于匹配 iOS 语言环境的 <code>java.util.regex.Pattern</code>:</p>

<pre><code>public static final Pattern localePattern = Pattern.compile(
    &#34;^(?&lt;lang&gt;\\p{Lower}{2,3})&#34; + // always match lang
    &#34;(-(?&lt;script&gt;\\p{Upper}\\p{Lower}{3}))?&#34; + // optional script
    &#34;(_(?&lt;region&gt;(\\p{Upper}{2}|\\p{Digit}{3})))?&#34; + // optional region
    &#34;(_(?&lt;variant&gt;\\p{Alnum}+))?&#34; + // optional variant
    &#34;(@.+)?$&#34; // optional @ stuff
);
</code></pre>

<p>这是一个从 iOS 语言环境构建 <code>java.util.Locale</code> 的方法。</p>

<pre><code>public static Locale parse(String locale) {
    final Matcher m = localePattern.matcher(locale);
    if (m.find()) {
      return new Locale.Builder()
                .setLanguage(m.group(&#34;lang&#34;))
                .setScript(m.group(&#34;script&#34;))
                .setRegion(m.group(&#34;region&#34;))
                .setVariant(m.group(&#34;variant&#34;))
                .build();
    } else throw new IllegalArgumentException(locale);
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于java - 如何将 iOS NSLocale localeIdentifier 转换为 Java Locale?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/35976188/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/35976188/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: java - 如何将 iOS NSLocale localeIdentifier 转换为 Java Locale?