未加载Android语言环境文件

时间:2019-06-23 09:01:49

标签: android kotlin localization locale

该应用程序支持os 8.0 +

我添加了values-ar文件夹,它支持strings.xml。如果我将语言从手机设置更改为阿拉伯语,则该应用会加载正确的资源。 如果我在运行时在Application类中设置了默认语言环境,它将无法加载特定的(“ ar”)资源。

d

这是我更改conf(在Application类上)的方式:

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()有趣之后在行上设置了一个断点:

enter image description here

为什么它没有加载正确的资源文件?我重复一遍,如果我从手机设置中更改了它,它将正常工作。

更新

使用@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 :(得分:0)

不建议通过编程方式

更改语言环境。原因是越野车。如果您真的要更改它。您应该在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)
    }
}