我想在我的应用程序中再添加一种语言。我创建了第二个字符串文件,我的Values文件是这样的:
..
values
-strings
-strings.xml
-strings.xml(fr)
如果手机的本地语言为英语,则我的应用程序的显示语言为英语或 如果电话的本地语言是法语,则我的应用程序的显示语言是法语。没关系。但是我想添加2个按钮,例如English-French,我想用户设置应用程序的语言。我该怎么办?
我尝试了此代码,但必须重新创建活动,但无法获得用于登录用户选择控件用户的显示语言代码。
Locale locale = new Locale("fr");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
finish();
startActivity(getIntent());
答案 0 :(得分:1)
您快到了,您只需要更新视图即可,而无需重新创建活动。当我这样做时,我使用了SharedPreference来获得一些帮助,您将需要使您想要翻译的所有视图无效。
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
if (s.equals(getString(R.string.languages_preference))){
String langOptions = sharedPreferences.getString(getString(R.string.languages_preference), "");
if (!langOptions.isEmpty()){
setLocale(langOptions);
this.invalidateOptionsMenu(); //change language of options mnus
updateView();
}
}
}
private void updateView(){
photoTitleLabel.setText(getString(R.string.photo_title));
photoTitleLabel.invalidate();
photoDescriptionLabel.setText(getString(R.string.photo_description));
photoDescriptionLabel.invalidate();
photoOwnerUsernameLabel.setText(getString(R.string.owner_username));
photoOwnerUsernameLabel.invalidate();
photoOwnerRealnameLabel.setText(getString(R.string.owner_realname));
photoOwnerRealnameLabel.invalidate();
photoDateTakenLabel.setText(getString(R.string.photo_taken_date));
photoDateTakenLabel.invalidate();
photoDatePostedLabel.setText(getString(R.string.photo_post_date));
photoDatePostedLabel.invalidate();
photoDateLastUpdateLabel.setText(getString(R.string.photo_update_date));
photoDateLastUpdateLabel.invalidate();
btnPreviousText.setText(getString(R.string.previous_photo));
btnPreviousText.invalidate();
btnNextText.setText(getString(R.string.next_photo));
btnNextText.invalidate();
photoLocationLabel.setText(R.string.photo_location);
photoLocationLabel.invalidate();
}
这是我使用SharedPreferences的脆弱设置
public class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener{
private ListPreference listPreference;
private PreferenceScreen preferenceScreen;
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
if (s.equals(getString(R.string.languages_preference))){
String langOptions = sharedPreferences.getString(getString(R.string.languages_preference), "");
if (!langOptions.isEmpty()){
setLocale(langOptions);
listPreference = (ListPreference) findPreference(getString(R.string.languages_preference));
PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference("preferences");
listPreference.setEntries(R.array.lang_opt);
listPreference.setEntryValues(R.array.lang_values);
listPreference.setTitle(getString(R.string.pref_language_title));
preferenceCategory.setTitle(R.string.preferences);
}
}
}
public void setLocale(String lang) {
Locale myLocale = new Locale(lang);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
/**/
}
@Override
public void onResume() {
super.onResume();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
sharedPreferences.registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
super.onPause();
}
}
答案 1 :(得分:0)
无法以编程方式将新语言作为 stringfile.xml
添加到[value]包中。
但是您可以使用其他解决方案在项目中使用新语言:
1-创建语言环境数据库:
创建包含所有想要的字符串的区域设置数据库,创建包含4列的表:
很容易根据所需的语言环境通过键获取任何值,并且可以从数据库中添加,编辑或删除任何语言或字符串。
2-您可以使用Google Translate API
请检查此链接,以查看How use Google Translate API in Android projects。
注意: 这些方法或任何其他方法都会在代码中添加更多逻辑,因此,如果有任何方法可以将所有sting文件添加到res项目中,则效果更好。
答案 2 :(得分:0)
请考虑以下方法,作为处理此issu特定情况的另一种方法:
如果要翻译的项目数量不是很多,则可以使用SharedPreferences
处理此问题。
这条路;您必须为每个项目定义一个itemSharedPreference
,并为每种语言定义一个languageSharedPreference
。
更改语言后,实际上languageSharedPreference
的值也会更改;可翻译项目的文本根据itemSharedPreference
的值通过为其设置的条件进行修改。