Identifying RTL language in Android
Solution 1:
Get it from Configuration.getLayoutDirection():
Configuration config = getResources().getConfiguration();
if(config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
//in Right To Left layout
}
Solution 2:
@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!
Solution 3:
If you're using the support library, you can do the following:
if (ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_RTL) {
// The view has RTL layout
} else {
// The view has LTR layout
}
Solution 4:
You can use TextUtilsCompat from the support library.
TextUtilsCompat.getLayoutDirectionFromLocale(locale)