有没有办法在Java中检测RTL语言?

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

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

ComponentOrientation.getOrientation(new Locale(System.getProperty("user.language"))).isLeftToRight(); 
  • 资源

我觉得有点脏,依赖于AWT课程,这些课程已经过时了,我正在处理BCP-47语言代码,所以我最终从Google Closure模板中复制了这些代码:

 /** * 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, ie either: * - a language code explicitly specifying one of the right-to-left scripts, * eg "az-Arab", or

* - a language code specifying one of the languages normally written in a * right-to-left script, eg "fa" (Farsi), except ones explicitly specifying * Latin or Cyrillic script (which are the usual LTR alternatives).

* 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, eg 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