android - 如何更改整个 android 应用程序的语言?

标签 android locale preferences

我想编写一个可以显示英文或中文的应用程序。我已经准备了2个string.xml,即value/strings.xml和value-zh-rHK/strings.xml。但我不知道如何通过 android 的 ListPreference 更改语言。

xml/preferences.xml:

<?xml version="1.0" encoding="utf-8"?>
<SwitchPreference
    android:key="pref_nightmode"
    android:title="@string/nightmode"
    android:defaultValue="false">
</SwitchPreference>

<ListPreference
    android:key="pref_lang"
    android:title="@string/lang"
    android:dialogTitle="Choose Language"
    android:entries="@array/lang"
    android:entryValues="@array/lang_value"
    android:defaultValue="@string/lang_default">
</ListPreference>

和 Preferences.java
public class Preferences extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTitle(drawer_menu[5]);
    getFragmentManager().beginTransaction().replace(R.id.content_frame, new MainPreferenceFragment()).commit();
}

public static class MainPreferenceFragment extends PreferenceFragment {
    String locale;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        PreferenceManager pm = getPreferenceManager();
        ListPreference lang = (ListPreference) pm.findPreference("pref_lang");
        if(lang.getValue().equals("English")) {
            locale = "en_US";
        } else {
            locale = "zh_HK";
        }
    }
}

该 Activity 扩展了 BaseActivity 因为我在那里有一个抽屉菜单。

最佳答案

您只能更改应用程序的语言设置。使用 Locale 类并更新默认配置。语言更改仅在 Activity 重新启动或重新启动应用程序时应用。使用以下语言环境类

public class LocaleUtils {

    private static Locale sLocale;

    public static void setLocale(Locale locale) {
        sLocale = locale;
        if(sLocale != null) {
            Locale.setDefault(sLocale);
        }
    }

    public static void updateConfig(ContextThemeWrapper wrapper) {
        if(sLocale != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            Configuration configuration = new Configuration();
            configuration.setLocale(sLocale);
            wrapper.applyOverrideConfiguration(configuration);
        }
    }

    public static void updateConfig(Application app, Configuration configuration) {
        if(sLocale != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
            //Wrapping the configuration to avoid Activity endless loop
            Configuration config = new Configuration(configuration);
            config.locale = sLocale;
            Resources res = app.getBaseContext().getResources();
            res.updateConfiguration(config, res.getDisplayMetrics());
        }
    }
}

应用类:
public class App extends Application {
    public void onCreate(){
        super.onCreate();
        // get user preferred language set locale accordingly new locale(language,country)
        LocaleUtils.setLocale(new Locale("iw"));
        LocaleUtils.updateConfig(this, getBaseContext().getResources().getConfiguration());
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        LocaleUtils.updateConfig(this, newConfig);
    }
}

基础 Activity :
public class BaseActivity extends Activity {
    public BaseActivity() {
        LocaleUtils.updateConfig(this);
    }
}

以上答案来自:Changing Locale within the app itself

安卓文档:http://developer.android.com/reference/java/util/Locale.html

关于android - 如何更改整个 android 应用程序的语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36922040/

相关文章:

java - 如何创建我自己的 android 库并托管它

android - 奇怪的重绘?在 android 上的 webview 中发布 html 应用程序

c - 在 C 中使用舍入和千位分隔符格式化字符串的最有效方法是什么?

主布局中的 android 首选项

java - 使用首选项 API 保存路径?

iphone - 可以在我的应用程序中将多个类的默认值注册到 NSUserDefaults 吗?

android - 如何让我的分享 Intent 支持 whatsapp 和 google+

Java 克罗地亚语言环境

c++ - 基于 ISO-639/ISO-3166 的语言/国家语言环境名称与 Windows 名称之间的转换表

java - 如何在 Java 中获取资源 'R.raw.img' + r?