未设置或使用首次启动时的语言

Language on first start not being set or used

我的应用程序中有两种语言,英语和荷兰语。在首选项中,您可以更改语言,这在应用程序重新启动后有效。但是当用户第一次打开应用程序时,并没有使用以下代码中设置的默认语言 (R.xml.user_settings)。它使用设备语言(我的情况是荷兰语)。

<ListPreference
    android:defaultValue="@string/pref_languages_default"
    android:entries="@array/languages"
    android:entryValues="@array/listValues"
    android:key="language"
    android:title="@string/languages" />

其中“@string/pref_languages_default”、“@array/languages”和“@array/listValues”是:

<string translatable="false" name="pref_languages_default">en</string>
<string-array name="languages">
    <item name="nl">Dutch</item>
    <item name="en">English</item>
</string-array>
<string-array name="listValues">
    <item name="nl">nl</item>
    <item name="en">en</item>
</string-array>

在MyApplication.java中我有以下代码:

public class MyApplication extends Application {
    private Locale locale = null;

    @Override
    public void onCreate() {
        PreferenceManager.setDefaultValues(this, R.xml.user_settings, false);

        super.onCreate();

        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
        Configuration config = getBaseContext().getResources().getConfiguration();

        String lang = settings.getString("LANG", "");
        if (!"".equals(lang) && !config.locale.getLanguage().equals(lang)) {
            locale = new Locale(lang);
            Locale.setDefault(locale);
            config.locale = locale;
            getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
        }
    }
}

SettingsFragment.java 中的代码(我可以 select 语言):

public class SettingsFragment extends PreferenceFragment {
    Locale myLocale;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.user_settings);

        ListPreference langPref = (ListPreference) findPreference("language");
        langPref.setSummary(langPref.getEntry());

        langPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object o) {
                preference.setSummary(o.toString());
                return true;
            }
        });

        ListPreference langPreference = (ListPreference) findPreference("language");
        langPreference.setOnPreferenceChangeListener(languageChangeListener);
    }

    Preference.OnPreferenceChangeListener languageChangeListener = new Preference.OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {

            switch (newValue.toString()) {
                case "nl":
                    PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()).edit().putString("LANG", "nl").commit();
                    setLocale("nl");
                    Toast.makeText(getActivity().getBaseContext(), R.string.save_language_changes, Toast.LENGTH_LONG).show();
                    break;
                case "en":
                    PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()).edit().putString("LANG", "en").commit();
                    setLocale("en");
                    Toast.makeText(getActivity().getBaseContext(), R.string.save_language_changes, Toast.LENGTH_LONG).show();
                    break;
                /*default:
                    PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()).edit().putString("LANG", "en").commit();
                    setLocale("en");
                    Toast.makeText(getActivity().getBaseContext(), R.string.save_language_changes, Toast.LENGTH_LONG).show();
                    break;*/
            }
            return true;
        }
    };

    public void setLocale(String lang) {
        myLocale = new Locale(lang);
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        Locale.setDefault(myLocale);
        conf.locale = myLocale;
        res.updateConfiguration(conf, dm);
    }
}

问题是,ListPreference 摘要正确显示了默认语言,但是尚未设置默认语言。如何让应用程序显示正确的语言?我有一个包含正确字符串的 values 和 values-nl 目录。

起初 运行 应用程序的 SharedPreferencesLANG 键没有值,因此行 String lang = settings.getString("LANG", "");lang 设置为 "" 并且仅当 lang 不为空时才更改本地。

因此,您需要将默认值设置为您在应用程序中使用的语言之一。

要做到这一点,只需更改行

String lang = settings.getString("LANG", "");

String lang = settings.getString("LANG", "en");

String lang = settings.getString("LANG", "nl");

您需要使用默认首选项值初始化 SharedPreferences。参见 setDefaultValues(Context, boolean)