Я тренируюсь, чтобы приложение запускалось на арабском языке. поэтому я установил свой класс LocalHelper .


object LocalHelper {

    fun onAttach(context: Context): Context {
        val lang = getPersistedData(context/*, Locale.getDefault().getLanguage()*/)
        return setLocale(context, lang)
    }

    private fun setLocale(context: Context, language: String): Context {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            updateResources(context, language)
        } else updateResourcesLegacy(context, language)

    }

    private fun getPersistedData(context: Context): String {
//        val appComponent = Injector.INSTANCE.appComponent
//            ?: return SharedPreferencesUtils(context, DATABASE_NAME_QURAN, Gson())
//                .currentLanguage.id
        return Language.ARABIC
    }

    @TargetApi(Build.VERSION_CODES.N)
    private fun updateResources(context: Context, language: String): Context {
        val locale = Locale(language)
        Locale.setDefault(locale)

        val configuration = context.resources.configuration
        configuration.setLocale(locale)
        configuration.setLayoutDirection(locale)

        return context.createConfigurationContext(configuration)
    }

    private fun updateResourcesLegacy(context: Context, language: String): Context {
        val locale = Locale(language)
        Locale.setDefault(locale)

        val resources = context.resources

        val configuration = resources.configuration
        configuration.locale = locale
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLayoutDirection(locale)
        }

        context.resources.configuration.setLayoutDirection(locale)
        resources.updateConfiguration(configuration, resources.displayMetrics)

        return context
    }

}

  • А в классе My Application я обновляю свою конфигурацию и базовое приложение Attach.
    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        LocalHelper.onAttach(context = this)
    }

    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(
            LocalHelper.onAttach(
                context = base
            )
        )
    }


  • Кроме того, я создаю Strings.xml для арабского языка.
  • Наконец, я обновляю конфигурацию BaseActivity и присоединяю, например, класс Application.
  • Когда я запускаю приложение, направление правильное, но текст по-прежнему английский

Так что с андроид 8 работает нормально, а вот с андроид 7,6 или 5 не работает.

1
Safwat Malek 1 Дек 2019 в 20:01

1 ответ

У меня возникла эта проблема после миграции AndroidX.

Это ошибка androidx.appcompat.app.AppCompatActivity, расширение FragmentActivity или Activity вместо AppCompatActivity устранит проблему. Это не лучший вариант, но я не нахожу обходного пути.

0
Ardit Zeza 22 Май 2020 в 15:23