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(
"^(?<lang>\\p{Lower}{2,3})" + // always match lang
"(-(?<script>\\p{Upper}\\p{Lower}{3}))?" + // optional script
"(_(?<region>(\\p{Upper}{2}|\\p{Digit}{3})))?" + // optional region
"(_(?<variant>\\p{Alnum}+))?" + // optional variant
"(@.+)?$" // 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("lang"))
.setScript(m.group("script"))
.setRegion(m.group("region"))
.setVariant(m.group("variant"))
.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]