42

Is there a way to determine if the device is in a right to left language (something like Arabic) as opposed to something that's left to right (English)?

Something compatible with older API levels (down to 10) is necessary

SOLUTION

i ended up using the xml method in the accepted answer. Farther down the line, i also added the code indicated here for instances where I didn't have access to getResources()

Identifying RTL language in Android

more info

This question still gets a lot of traffic; something else I wanted to point out: When I originally asked this I think it was partially to help address showing different pointing chevrons in RTL vs LTR -- another slick way of accomplishing this is by placing drawable resources in the standard and ldrtl directories -- means no code required to determine which one to show!

Louis CAD
  • 10,965
  • 2
  • 39
  • 58
joshkendrick
  • 3,497
  • 8
  • 38
  • 52

9 Answers9

69

You could create a values-ldrtl folder with a xml file called isrighttoleft.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_right_to_left">true</bool>
</resources>

and in your values folder the same file with:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_right_to_left">false</bool>
</resources>

And finally in Code:

boolean isRightToLeft = getResources().getBoolean(R.bool.is_right_to_left);

The values-ldrtl will only be used on a device where the specific settings (e. g. Language) are right-to-left-read languages.

ezcoding
  • 2,974
  • 3
  • 23
  • 32
42

I think this is a better way:

val isLeftToRight = TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault()) == ViewCompat.LAYOUT_DIRECTION_LTR

Docs:

https://developer.android.com/reference/android/support/v4/text/TextUtilsCompat.html#getLayoutDirectionFromLocale(java.util.Locale)

Or, if you have minAPI 17 or above, you can just use this:

val isLeftToRight=TextUtils.getLayoutDirectionFromLocale(Locale.getDefault())==View.LAYOUT_DIRECTION_LTR

Docs:

https://developer.android.com/reference/android/text/TextUtils.html#getLayoutDirectionFromLocale(java.util.Locale)

android developer
  • 114,585
  • 152
  • 739
  • 1,270
  • 2
    I just tested this in Android 10 with the device language set to Arabic, which my app is not translated into, and `Locale.getDefault()` returned `en_US` with `LTR` layout direction. Maybe this method gets the _app_'s locale's layout direction instead of the device's? – Sam Feb 09 '20 at 05:03
  • @Sam In that case it's correct. If the app is in English, you want to treat it as LTR without respect to device's language. – Miloš Černilovský Apr 07 '20 at 07:57
  • @Sam `Locale.getDefault()` is supposed to return the current OS locale. Maybe you didn't set it right, or you didn't call the function again with the updated result of `Locale.getDefault()`. The code works with what it has. If it says it's English, it's LTR. – android developer Apr 07 '20 at 09:00
28

Gr, a little bit longer googling and I would have found it before posting:

if (ViewCompat.getLayoutDirection(getView()) == ViewCompat.LAYOUT_DIRECTION_LTR) {
    // ...
}
else {
    // ...
}

http://developer.android.com/reference/android/support/v4/view/ViewCompat.html#getLayoutDirection(android.view.View)

joshkendrick
  • 3,497
  • 8
  • 38
  • 52
10

Kotlin Code for detect app layout direction :

 val config = resources.configuration
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        if (config.layoutDirection == View.LAYOUT_DIRECTION_LTR) {
           // showAlertMsg("LTR")
        } else {
           // showAlertMsg( "RTL")
        }
    }
    else {
        //TODO("VERSION.SDK_INT < JELLY_BEAN_MR1")
           }
Hamed Jaliliani
  • 2,789
  • 24
  • 31
9

If you are using Core KTX

you could use:

if (Locale.getDefault().layoutDirection == LayoutDirection.RTL)
humazed
  • 74,687
  • 32
  • 99
  • 138
5

If this is still getting considerable traffic, people should also consider Configuration.getLayoutDirection(), for API 17+. It will return either LayoutDirection.LTR or LayoutDirection.RTL. I imagine ViewCompat.getLayoutDirection(android.view.View) returns the direction that was actually used to layout a particular view. If you're doing something weird, such as trying to determine which person should be on which side of a chat screen (like me), this might be of use.

androidguy
  • 3,005
  • 2
  • 27
  • 38
  • There is a way for it to work on all API versions, without a view, here: https://stackoverflow.com/a/47119946/878126 – android developer Nov 05 '17 at 09:55
  • I think it's good to use ViewCompat.getLayoutDirection(android.view.View) because it's common to hardcode direction of some views to not rotate in RTL languages or vice versa. – David May 05 '20 at 13:22
  • The poster asked the following: "Is there a way to determine if the device is in a right to left language". My answer is that there is a method in Configuration that does exactly this. These methods that have been suggested in View and ViewCompat, check only for a specific View, not the device. – androidguy May 27 '20 at 04:02
2

That's so easy. Just use: isRtll()

override fun isRtl(): Boolean {
    return super.isRtl()
}

Have a fun!

Hossein Kurd
  • 3,184
  • 3
  • 41
  • 71
1

If your Build.VERSION.SDK_INT is bigger than JELLY_BEAN (16) you can use this:

val locale = Locale.getDefault() 
val isLtr = TextUtils.getLayoutDirectionFromLocale(locale) == ViewCompat.LAYOUT_DIRECTION_LTR
Ali Rezaiyan
  • 3,011
  • 3
  • 16
  • 27
0

Yes,use the Bidi.getBaseLevel() function, it will return 0 for left-to-right and 1 for right to left.

http://developer.android.com/reference/java/text/Bidi.html#getBaseLevel()

HappyCactus
  • 1,935
  • 16
  • 24