У меня есть многоязычное приложение с основным языковым английским и арабским языками.
Я setLocale()
в onCreate()
каждого Activity
в моем приложении:
public static void setLocale(Locale locale){
Locale.setDefault(locale);
Context context = MyApplication.getInstance();
final Resources resources = context.getResources();
final Configuration config = resources.getConfiguration();
config.setLocale(locale);
context.getResources().updateConfiguration(config,
resources.getDisplayMetrics());
}
где locale
является одним из следующих:
Вышеупомянутый метод вызывается до super.onCreate(savedInstanceState)
.
Как описано в документации,
- Я добавил
android:supportsRtl="true"
в манифесте. - Я изменил все свойства xml с
left
иright
атрибутами дляstart
иend
соответственно. - Я поместил строки арабского языка в папку
res\values-ar\strings
и доступные ресурсы в папкеres\drawable-ar
(и аналогично для других ресурсов).
Вышеуказанная настройка работает правильно. После изменения Locale
в ar-AE
арабский текст и ресурсы отображаются правильно в моих действиях.
Однако есть проблема как с ресурсами, так и с расположением макетов для всех Android-устройств с версией 8.0 и выше.
На устройстве с версией менее чем 8.0, экран RTL правильно выглядит следующим образом:
И на всех устройствах с 8. 0+ появляется тот же экран, что выглядит так:
что неправильно.
Оказывается, что и направление, и ресурсы отображаются неправильно.
Здесь есть две проблемы:
- Правильный
Locale
, похоже, не обновляется в конфигурации приложения. - Направление текста и чертежей противоположно тому, что должно быть.
Что касается направления, существует любопытный метод, называемый setLayoutDirection()
который я раньше не замечал.
Я хотел бы знать, в чем заключается эта проблема, почему это происходит в Oreo и каково ее решение. Пожалуйста, помогите/прокомментируйте это.
EDIT:
Согласно отчету API Differences, метод
updateConfiguration()
действительно устарел в Android 7.1 (уровень API 25).
Кроме того, были найдены все соответствующие посты. В порядке важности:
1. Язык программирования Android N программно.
2. Android context.getResources.updateConfiguration() устарел.
3. Как изменить язык приложений Android O/Oreo/api 26.
4. Проблема с RTL для Android в API 24 и выше при изменении локали
5. Измените язык программно (Android N 7.0 - API 24).