43

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!

9 Answers 9

71

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.

Sign up to request clarification or add additional context in comments.

9 Comments

Thanks. I normally use this "technique" to determine wether the app is running on a tablet device or not ;)
I ended up using this over my solution because the above works all the time, my solution doesnt work inside onCreateView
Glad I could help you out ;)
Might want to add a "?>" to end of first line on those xml files, just for correct syntax.
Thanks. Just added them... ;)
|
46

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)

3 Comments

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 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.
@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.
29

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)

1 Comment

You don't need a view to get it. Check out my answer here: stackoverflow.com/a/47119946/878126
11

If you are using Core KTX

you could use:

if (Locale.getDefault().layoutDirection == LayoutDirection.RTL) 

2 Comments

if api 19 is fine
Ah layoutDirection seems to be an extension property? Didn't know those existed. It maps to TextUtils.getLayoutDirectionFromLocale() which is equivalent to the answer of @androiddeveloper.
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") } 

Comments

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.

3 Comments

There is a way for it to work on all API versions, without a view, here: stackoverflow.com/a/47119946/878126
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.
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.
2

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

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

Have a fun!

Comments

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 

Comments

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()

4 Comments

I would have to have an instance of Bidi correct? In any case, I found a solution that seems to work. thanks though!
Yes, you have to istantiate one.
Please post the solution you found, for future reference. Thanks.
You don't have to create a new instance of anything. You can use this instead: stackoverflow.com/a/47119946/878126

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.