Is there any way to detect an RTL language in Java?

前端 未结 4 1779
梦毁少年i
梦毁少年i 2021-01-17 09:53

I need to be able to detect whether the current language my user is viewing is an RTL (Right To Left) language like Arabic.

At the moment I\'m just detecting this ba

相关标签:
4条回答
  • 2021-01-17 10:08
    TextUtils.getLayoutDirectionFromLocale(locale)
    

    javadoc

    0 讨论(0)
  • 2021-01-17 10:10
    ComponentOrientation.getOrientation(new Locale(System.getProperty("user.language"))).isLeftToRight();  
    
    • Resource
    0 讨论(0)
  • 2021-01-17 10:23

    I felt a bit dirty relying on AWT classes which are quite dated and I was dealing with BCP-47 language codes, so I ended up copying this code from 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();
    }
    

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

    0 讨论(0)
  • 2021-01-17 10:23

    Add a boolean resource is_rtl (let's say), defined as

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

    Then, in java you can get this bool resource and immediately know if the user is in an RTL locale.

    0 讨论(0)
提交回复
热议问题