Identifying RTL language in Android

前端 未结 16 1695
既然无缘
既然无缘 2020-11-28 06:59

Is there a way to identify RTL (right-to-left) language, apart from testing language code against all RTL languages?

Since API 17+ allows several resources for RTL a

16条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-28 07:33

    @cyanide's answer has the right approach but a critical bug.

    Character.getDirectionality returns the Bi-directional (bidi) character type. Left-to-right text is a predictable type L and right-to-left is also predictably type R. BUT, Arabic text returns another type, type AL.

    I added a check for both type R and type AL and then manually tested every RTL language Android comes with: Hebrew (Israel), Arabic (Egypt), and Arabic (Israel).

    As you can see, this leaves out other right-to-left languages, so I was concerned that as Android adds these languages, there might have a similar issue and one might not notice right away.

    So I tested manually each RTL language.

    • Arabic (العربية) = type AL
    • Kurdish (کوردی) = type AL
    • Farsi (فارسی) = type AL
    • Urdu (اردو) = type AL
    • Hebrew (עברית) = type R
    • Yiddish (ייִדיש) = type R

    So it looks like this should work great:

    public static boolean isRTL() {
        return isRTL(Locale.getDefault());
    }
    
    public static boolean isRTL(Locale locale) {
        final int directionality = Character.getDirectionality(locale.getDisplayName().charAt(0));
        return directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT ||
               directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC;
    }
    

    Thanks @cyanide for sending me the right direction!

提交回复
热议问题