Android:如何以编程方式更改应用语言?

时间:2019-11-18 08:17:51

标签: android locale

我想以编程方式更改我的应用语言。我有一些适用于旧手机(Android 6)的代码,但不适用于Android 8和Android9。任何适用于应用语言更改的解决方案?调用setLocal之后,我在Activity中调用recreate()。字符串仍然没有变化。

在我的MainActivity(在BaseActivity中扩展onCreate()的情况下,如果我呼叫Locale.getDefault().language,则返回正确的语言代码,但字符串仍为英语,默认为{{1 }}。

string.xml

更新: Ive在下面使用了两种解决方案的组合,但仍然没有成功。我开设了fun setLocale(context: Context, language: String?): Context { app.setLanguage(language) return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { updateResources(context, language) } else updateResourcesLegacy( context, language ) } @TargetApi(Build.VERSION_CODES.N) private fun updateResources(context: Context, language: String?): Context { val locale = if (language == null){ Locale(Locale.getDefault().language) } else { Locale(language) } Locale.setDefault(locale) val configuration = context.resources.configuration configuration.setLocale(locale) return context.createConfigurationContext(configuration) } @Suppress("DEPRECATION") private fun updateResourcesLegacy(context: Context, language: String?): Context { val locale = if (language == null){ Locale(Locale.getDefault().language) } else { Locale(language) } Locale.setDefault(locale) val resources = context.resources val configuration = resources.configuration configuration.locale = locale resources.updateConfiguration(configuration, resources.displayMetrics) return context } 类,并通过我的所有活动进行了扩展。然后,我调用BaseActivity函数,该函数类似于LocaleHelper。 changeLocale返回我的app.getSavedLanguage()中保存的语言代码。根据用户在应用中选择的语言,此代码将被覆盖。 App是使用共享首选项的Application类。

sharedPrefs

2 个答案:

答案 0 :(得分:0)

在这里查看我的答案(第二个): Why my app gets wrong strings from resources for localization?

要使其在Android 8和9上正常运行会有些痛苦,但是到目前为止,这对我来说一直很好。希望能帮助到你! 简而言之:您需要制作一个Locale Helper来处理所有资源的加载。您需要刷新更改语言的活动,并且在使用getResources()时可能还需要选择正确的上下文。

答案 1 :(得分:0)

我遇到了同样的问题,我始终需要为希伯来语和阿拉伯语的用户从右向左固定屏幕。 经过无数次尝试,我提出了建议的解决方案:

创建基本活动并从此类扩展您的活动。

import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.view.View;

import java.util.Locale;

public abstract class Activity_Base extends AppCompatActivity {

    int q = 0;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        changeLocale(this, "iw");


        Resources res = getResources();
        // Change locale settings in the app.
        DisplayMetrics dm = res.getDisplayMetrics();
        android.content.res.Configuration conf = res.getConfiguration();
        conf.setLocale(new Locale("iw")); // API 17+ only.
        // Use conf.locale = new Locale(...) if targeting lower versions
        res.updateConfiguration(conf, dm);


        getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);

        Locale locale = new Locale("iw");
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        getApplicationContext().getResources().updateConfiguration(config, getApplicationContext().getResources().getDisplayMetrics());

        super.onCreate(savedInstanceState);
    }

    public static void changeLocale(Context context, String locale) {
        Resources res = context.getResources();
        Configuration conf = res.getConfiguration();
        conf.locale = new Locale(locale);
        res.updateConfiguration(conf, res.getDisplayMetrics());
    }
}

使用-只是扩展您的活动:

public class Activity_Article extends Activity_Base {