16

我需要能够检测我的用户正在查看的当前语言是否是像阿拉伯语这样的 RTL(从右到左)语言。

目前我只是根据系统属性 user.language 中的语言代码检测到这一点,但必须有更好的方法。

4

4 回答 4

18
ComponentOrientation.getOrientation(new Locale(System.getProperty("user.language"))).isLeftToRight();  
于 2010-11-16T08:58:57.170 回答
8

依赖过时的 AWT 类我觉得有点脏,而且我正在处理 BCP-47 语言代码,所以我最终从 Google Closure Templates 复制了这段代码:

/**
 * A regular expression for matching right-to-left language codes.
 * See {@link #isRtlLanguage} for the design.
 */
private static final Pattern RtlLocalesRe = Pattern.compile(
    "^(ar|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Arab|Hebr|Thaa|Nkoo|Tfng))" +
    "(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)");
/**
 * Check if a BCP 47 / III language code indicates an RTL language, i.e. either:
 * - a language code explicitly specifying one of the right-to-left scripts,
 *   e.g. "az-Arab", or<p>
 * - a language code specifying one of the languages normally written in a
 *   right-to-left script, e.g. "fa" (Farsi), except ones explicitly specifying
 *   Latin or Cyrillic script (which are the usual LTR alternatives).<p>
 * The list of right-to-left scripts appears in the 100-199 range in
 * http://www.unicode.org/iso15924/iso15924-num.html, of which Arabic and
 * Hebrew are by far the most widely used. We also recognize Thaana, N'Ko, and
 * Tifinagh, which also have significant modern usage. The rest (Syriac,
 * Samaritan, Mandaic, etc.) seem to have extremely limited or no modern usage
 * and are not recognized.
 * The languages usually written in a right-to-left script are taken as those
 * with Suppress-Script: Hebr|Arab|Thaa|Nkoo|Tfng  in
 * http://www.iana.org/assignments/language-subtag-registry,
 * as well as Sindhi (sd) and Uyghur (ug).
 * The presence of other subtags of the language code, e.g. regions like EG
 * (Egypt), is ignored.
 */
public static boolean isRtlLanguage(String languageString) {
  return languageString != null &&
      RtlLocalesRe.matcher(languageString).find();
}

https://closure-templates.googlecode.com/svn-history/r21/trunk/java/src/com/google/template/soy/internal/i18n/BidiUtils.java

于 2014-10-22T00:11:28.587 回答
-1

添加一个布尔资源is_rtl(假设),定义为

  • res/values/values.xml
    <bool name="is_rtl">false</bool>
    
  • res/values-ldrtl/values.xml
    <bool name="is_rtl">true</bool>
    

然后,在 java 中,您可以获得这个 bool 资源并立即知道用户是否在 RTL 语言环境中。

于 2020-09-16T12:09:07.730 回答
-1
TextUtils.getLayoutDirectionFromLocale(locale)

文档

于 2020-09-16T12:03:23.373 回答