Как изменить локаль?Не работает на некоторых устройствах - PullRequest
0 голосов
/ 24 октября 2018

Я пишу приложение, которое поддерживает два языка, и я меняю язык с помощью приложения Изменить язык. Здесь мой код:

 Locale locale = new Locale("fa");
            Locale.setDefault(locale);
            Configuration configs = new Configuration();
            configs.locale = locale;
            getBaseContext().getResources().updateConfiguration(configs, getBaseContext().getResources().getDisplayMetrics());

И

в манифесте У меня установлено android:supportsRtl="true"

Эти коды работают на многих устройствах, но на некоторых устройствах не работают.например, тексты не переводятся, но меняются направления.

Протестированные устройства:

  • Samsung J5Pro 2018 (android = 7.1): работал
  • Pixel 2 API 26: работал
  • Samsung J7 2017 (android = 7): работал
  • Nexus 5 (android = 6): не работал
  • Samsung Galaxy G531 (android <леденец на палочке): не работал </li>

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

или попробуйте этот метод, я использовал во многих приложениях, и он работает

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
    fun fixUpLocale(ctx: Context, newLocale: Locale) {
        val res = ctx.resources
        val config = res.configuration
        val curLocale = getLocale(config)
        if (curLocale != newLocale) {
            Locale.setDefault(newLocale)
            val conf = Configuration(config)
            conf.setLocale(newLocale)
            res.updateConfiguration(conf, res.displayMetrics);
        }
    }

    fun getLocale(config: Configuration): Locale {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return config.locales[0]
        } else {
            //noinspection deprecation
            return config.locale;
        }
    }
0 голосов
/ 28 октября 2018

я нашел свое решение, моя проблема заключалась в том, что я вставил "fa" в локаль, а имя моего каталога строковых значений было values-fa-rlIR, поэтому имена разные, поэтому не работали, мне интересно, почему это работает на некоторых устройствах!

Я просто изменяю имя каталога строковых значений с values-fa-rlIR на values-fa, и оно работает хорошо.

0 голосов
/ 24 октября 2018
fun changeLang(context: Context, lang_code: String): ContextWrapper {
    defaultLanguage = lang_code
    var context = context
    val sysLocale: Locale

    val rs = context.resources
    val config = rs.configuration

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        sysLocale = config.locales.get(0)
    } else {
        sysLocale = config.locale
    }
    if (lang_code != "" && !sysLocale.language.equals(lang_code)) {
        val locale = Locale(lang_code)
        Locale.setDefault(locale)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            config.setLocale(locale)
        } else {
            config.locale = locale
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            context = context.createConfigurationContext(config)
        } else {
            context.resources.updateConfiguration(config, context.resources.displayMetrics)
        }
    }

    return ContextWrapper(context)
}

укажите это в каждом действии, для которого вы хотите изменить язык

   override fun attachBaseContext(newBase: Context) {
    val lang_code = Shared.defaultLanguage //load it from SharedPref
    val context = Shared.changeLang(newBase, lang_code)
    super.attachBaseContext(context)
}

вы можете попробовать этот код, он находится в Kotlin, и для получения дополнительной информации вы можете проверить Android N changeязык программно

я думаю, что это вопрос API.

...