未设置或使用首次启动时的语言
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 目录。
起初 运行 应用程序的 SharedPreferences
对 LANG
键没有值,因此行 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)
我的应用程序中有两种语言,英语和荷兰语。在首选项中,您可以更改语言,这在应用程序重新启动后有效。但是当用户第一次打开应用程序时,并没有使用以下代码中设置的默认语言 (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 目录。
起初 运行 应用程序的 SharedPreferences
对 LANG
键没有值,因此行 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)