Файл локали Android не загружен - PullRequest
1 голос
/ 23 июня 2019

Приложение поддерживает ОС 8.0 +

Я добавил папку values-ar с поддержкой strings.xml. Если я переключу язык с настроек телефона на арабский, приложение загрузит нужные ресурсы. Если я установлю язык по умолчанию во время выполнения в классе Application, он не сможет загрузить определенные ресурсы ("ar") .

d

Вот как я могу изменить conf (в Application class):

fun changeDefaultLocale() {
        Locale.setDefault(Locale("ar")
        val configuration = resources.configuration
        configuration.setLocale(locale)
        this.createConfigurationContext(configuration)
    }

Что я пробовал:

  • переименовать values-ar в values-ar-rEG
  • добавить resConfigs "en", "ar" на app/build.gradle
  • добавить android:configChanges="locale" к Manifest/<application
  • используйте Locale("ar","AE") или Locale("ar","EG")

Я поставил точку останова в строке после того, как назвал выше changeDefaultLocale() fun:

enter image description here

Почему он не загружает правильный файл ресурсов? Повторяю, если я изменю его из настроек телефона, он будет работать правильно.

UPDATE

Используя ответ @Nurbol, я обновил BaseActivity, как показано ниже, и он работает нормально. Моя проблема сейчас:

Activity A -> Activity B (here I switch the locale), затем, если я нажимаю назад и система восстанавливает Activity A, , он имеет старую конфигурацию и старую локаль. Как это преодолеть?

override fun attachBaseContext(base: Context) {
    super.attachBaseContext(updateBaseContextLocale(base))
}

private fun updateBaseContextLocale(context: Context): Context {
    val locale = Locale("ar")
    Locale.setDefault(locale)
    return updateResourcesLocale(context, locale)
}

@TargetApi(Build.VERSION_CODES.N)
private fun updateResourcesLocale(context: Context, locale: Locale): Context {
    val configuration = context.resources.configuration
    configuration.setLocale(locale)
    return context.createConfigurationContext(configuration)
}

1 Ответ

0 голосов
/ 23 июня 2019

Изменение локаль с программно не предлагается.Потому что это глючит.Если вы действительно хотите изменить это.Вы должны вызывать метод changeDefaultLocale() в пределах каждого действия onCreate() до setContentView().Вы можете просто создать BaseActivity класс, который делает это, и использовать его как родительский класс для каждого действия.

abstract class BaseActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Change locale settings in the app.
        val dm = resources.displayMetrics
        val conf = resources.configuration
        val lang = "ar"

        conf.setLocale(Locale(lang.toLowerCase())) // API 17+ only.

        resources.updateConfiguration(conf, dm)
    }
}
...