Android - 更改所有 Android 版本的应用程序语言

Posted

技术标签:

【中文标题】Android - 更改所有 Android 版本的应用程序语言【英文标题】:Android - Changing app language for all versions of Android 【发布时间】:2020-04-06 17:18:00 【问题描述】:

我尝试了几种方法来更改 android 应用的语言环境,但是当我在 Android 7.0 或更低版本上测试我的应用时,语言环境没有改变。

注意:这些方法适用于 Android 8.0 或更高版本,但不适用于 Android 7.0 或更低版本。

哪种方式适用于所有 Android 版本? 你知道吗?

我尝试过的方法:

The first way

The second way

The third way

注意:我在装有 Android 7.0 的 Galaxy Tab S2 上测试了我的应用程序(没有工作)。在装有 Android 8.0(已工作)的 Galaxy A5 2017 上。

注意:我的许多活动都是用 Kotlin 编写的。

我的代码:

Locale Helper 类:

public class LocaleHelper 

private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";

public static Context onAttach(Context context) 
    String lang = getPersistedData(context, Locale.getDefault().getLanguage());
    return setLocale(context, lang);


public static Context onAttach(Context context, String defaultLanguage) 
    String lang = getPersistedData(context, defaultLanguage);
    return setLocale(context, lang);


public static String getLanguage(Context context) 
    return getPersistedData(context, Locale.getDefault().getLanguage());


public static Context setLocale(Context context, String language) 
    persist(context, language);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) 
        return updateResources(context, language);
    

    return updateResourcesLegacy(context, language);


private static String getPersistedData(Context context, String defaultLanguage) 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);


private static void persist(Context context, String language) 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = preferences.edit();

    editor.putString(SELECTED_LANGUAGE, language);
    editor.apply();


@TargetApi(Build.VERSION_CODES.N)
private static Context updateResources(Context context, String language) 
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Configuration configuration = context.getResources().getConfiguration();
    configuration.setLocale(locale);

    return context.createConfigurationContext(configuration);


@SuppressWarnings("deprecation")
private static Context updateResourcesLegacy(Context context, String language) 
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Resources resources = context.getResources();

    Configuration configuration = resources.getConfiguration();
    configuration.locale = locale;

    resources.updateConfiguration(configuration, resources.getDisplayMetrics());

    return context;

attachBaseContext 方法(我把这些代码放在我所有的活动中):

override fun attachBaseContext(base: Context?) 
    super.attachBaseContext(LocaleHelper.onAttach(base, "en"))

更改语言环境方法(转波斯语):

LocaleHelper.setLocale(getContext(), "fa")

【问题讨论】:

提及,你已经尝试过。 你是否根据语言环境创建了不同的资源文件? 感谢您的关注 - 我添加了我为您尝试过的方法列表。 感谢您的关注 - 是的,我创建了想要打开这些资源的资源。 您的应用程序的默认语言是“en”,不是吗?如果是,则需要将波斯语资源放在 en 的字符串值中,英语资源则反之。 【参考方案1】:

例如,您应该创建一个基本活动并覆盖 onConfigurationChange 方法,设置您保存在共享首选项中的默认语言。毕竟,您必须从基本活动扩展您的活动。

【讨论】:

感谢您的回答。 - 我做到了,但我在所有活动中都使用了 attachBaseContext 方法。我应该使用 onConfigurationChange 吗? 如果你扩展了 BaseActivity 的所有活动,你不应该这样做,尽管这是一个更好的方法。如果不这样做,则应覆盖 attachBaseContext。 你能说得简单点吗? 我的意思是,当用户在您的应用程序中更改区域设置时,所有活动都应该重置,并且在 attachBaseContext 中,您应该这样做 (setLocale())。如果您从基本活动扩展所有活动,则不需要覆盖 attachBaseContext,因为您只需要重置主要活动。好吗? 好的。我知道了。谢谢你,Mostafa,我会尽力做你指出的事情。顺便告诉你结果。

以上是关于Android - 更改所有 Android 版本的应用程序语言的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android Studio 中更改所需的 Android 版本? [复制]

Android版本:如何更改复选框的大小

在Android Studio和Android Eclipse 更改现有项目里的SDK版本

Android Gradle:在构建时动态更改版本名称

android开发怎么更改一个完成的app包名

如何处理 Android 应用程序中的版本更改