更改应用程序语言(本地化)不适用于api 23 android

时间:2019-05-13 23:21:46

标签: android kotlin localization locale android-6.0-marshmallow

我在android应用程序中遇到了本地化问题。

当我在 api级别24 及更高版本上测试语言时,更改语言的功能可以正常工作,但是当我在模拟器 api级别23 上更改语言时,它仅适用于本地变化。我在许多论坛上都读到了这本书,并且我已经尝试了几乎所有提供的解决方案,但是都行不通。

重要的是,关闭弹出菜单的动画listPreference比例如在Android Nougat上关闭动画有点怪异,因此它已经闻起来有些不规则。

重要提示是我在物理设备上运行的应用程序是api级别23或棉花糖,问题仍然存在。

在以下各节中,我提供了一些对于这种情况很重要的代码,另一方面,我省略了一些文件,例如 strings.xml preferences.xml 在这种情况下是不必要的。因此,这里的主要焦点是使更改应用程序语言的可能性成为可能。如果您有任何线索,我可能会问他与我们分享什么问题。


用于设置语言环境的帮助程序类

package com.metropolitan.hangouter;

import android.annotation.TargetApi;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.Configuration;
import android.os.Build;

import java.util.Locale;

public class MyContextWrapper extends ContextWrapper {

public MyContextWrapper(Context base) {
    super(base);
}

@SuppressWarnings("deprecation")
public static ContextWrapper wrap(Context context, String language) {
    Configuration config = context.getResources().getConfiguration();
    Locale sysLocale = null;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        sysLocale = getSystemLocale(config);
    } else {
        sysLocale = getSystemLocaleLegacy(config);
    }
    if (!language.equals("") && !sysLocale.getLanguage().equals(language)) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            setSystemLocale(config, locale);
        } else {
            setSystemLocaleLegacy(config, locale);
        }

    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        context = context.createConfigurationContext(config);
    } else {
        context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
    }
    return new MyContextWrapper(context);
}


@SuppressWarnings("deprecation")
public static Locale getSystemLocaleLegacy(Configuration config) {
    return config.locale;
}

@TargetApi(Build.VERSION_CODES.N)
public static Locale getSystemLocale(Configuration config) {
    return config.getLocales().get(0);
}

@SuppressWarnings("deprecation")
public static void setSystemLocaleLegacy(Configuration config, Locale locale) {
    config.locale = locale;
}

@TargetApi(Build.VERSION_CODES.N)
public static void setSystemLocale(Configuration config, Locale locale) {
    config.setLocale(locale);
}
}

然后在我的主要活动中,除其他方法外,我将此称为对我们至关重要的方法。

override fun attachBaseContext(newBase: Context) {
    preferences = PreferenceManager.getDefaultSharedPreferences(newBase)
    vred = preferences.getString("languageKey", "no selection")!!
    val locale = Locale(vred)
    super.attachBaseContext(MyContextWrapper.wrap(newBase, locale.language))
}

此方法在SettingsActivity中也被调用,该方法具有相同的功能,并且会将本地配置附加到baseContext,当然,由于进行了更改并且我正在处理该事件,因此我需要刷新该活动。

因此,此方法在正确的位置和正确的时间调用。换句话说,每次onPreferenceChange时,我都会刷新活动。我的应用程序是用 kotlin 编写的,但是此MyContextWrapper类是在 java 中的。就是这样,如果有人需要更多信息,我将很高兴提供它。

1 个答案:

答案 0 :(得分:1)

这可能是由于以下原因造成的:

  

从Android 7.0(API级别24)开始,Android提供了增强功能   支持多语言用户,允许他们选择多个   设置中的语言环境。 Android极大地提供了此功能   扩大支持的语言环境数量并更改   系统解析资源。

您可以了解有关此here

的更多信息

如果您有名为xx_XX的资源,请尝试删除XX,这在较旧的版本上对我有用。否则,请指定完全限定的语言环境。