如何以编程方式添加另一种语言

时间:2019-08-21 17:48:38

标签: android

我想在我的应用程序中再添加一种语言。我创建了第二个字符串文件,我的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());

3 个答案:

答案 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列的表:

  • id (55)
  • (用户名)
  • (用户名)
  • 语言环境(法语)

很容易根据所需的语言环境通过键获取任何值,并且可以从数据库中添加,编辑或删除任何语言或字符串。

2-您可以使用Google Translate API

请检查此链接,以查看How use Google Translate API in Android projects

注意: 这些方法或任何其他方法都会在代码中添加更多逻辑,因此,如果有任何方法可以将所有sting文件添加到res项目中,则效果更好。

答案 2 :(得分:0)

请考虑以下方法,作为处理此issu特定情况的另一种方法:

如果要翻译的项目数量不是很多,则可以使用SharedPreferences处理此问题。 这条路;您必须为每个项目定义一个itemSharedPreference,并为每种语言定义一个languageSharedPreference。 更改语言后,实际上languageSharedPreference的值也会更改;可翻译项目的文本根据itemSharedPreference的值通过为其设置的条件进行修改。