web-dev-qa-db-ja.com

プログラムで言語を変更する方法は?

プログラムで言語を変更したい。

したがって、2つのxmlファイルを作成しました。

values-it
-->string.xml

values-en
-->string.xml

これは、アプリケーション全体の言語を変更するMainActivityのコードです。

//イタリア語

Resources res = getApplicationContext().getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Android.content.res.Configuration conf = res.getConfiguration();
conf.locale = new Locale("it");
res.updateConfiguration(conf, dm);

//英語

Resources res2 = getApplicationContext().getResources();
DisplayMetrics dm2 = res2.getDisplayMetrics();
Android.content.res.Configuration conf2 = res2.getConfiguration();
conf2.locale = new Locale("en");
res2.updateConfiguration(conf2, dm2);

たとえば、英語を設定した場合、コードはエラーなしで実行されますが、ラベルはテキストを変更しません。
デバイスの向きを変更すると、ラベルのテキストが正しく変更されます。

ラベルを自動的に更新するようにコードを変更するにはどうすればよいですか?

6
bircastri
 AlertDialog.Builder builder = new AlertDialog.Builder(DashboardActivity.this);
            builder.setTitle(R.string.languages);
            // Add the buttons
            builder.setPositiveButton(R.string.english, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    String languageToLoad = "en"; // your language
                    Locale locale = new Locale(languageToLoad);
                    Locale.setDefault(locale);
                    Configuration config = new Configuration();
                    config.locale = locale;
                    getBaseContext().getResources().updateConfiguration(config,
                            getBaseContext().getResources().getDisplayMetrics());
                    dialog.dismiss();
                    rEditor.putString("language", languageToLoad);
                    rEditor.commit();



                    Intent refresh = new Intent(DashboardActivity.this, DashboardActivity.class);
                    startActivity(refresh);
                    finish();

                }
            });
            builder.setNegativeButton(R.string.gujarati, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // User cancelled the dialog

                    String languageToLoad = "gu"; // your language
                    Locale locale = new Locale(languageToLoad);
                    Locale.setDefault(locale);
                    Configuration config = new Configuration();
                    config.locale = locale;
                    getBaseContext().getResources().updateConfiguration(config,
                            getBaseContext().getResources().getDisplayMetrics());
                    dialog.dismiss();
                    rEditor.putString("language", languageToLoad);
                    rEditor.commit();


                    Intent refresh = new Intent(DashboardActivity.this, DashboardActivity.class);
                    startActivity(refresh);
                    finish();

                }
            });

            builder.create().show();

新しい言語のテキストを表示するには、アクティビティをリロードする必要があります。これは再起動を意味します。

9

方向を変更した場合に行うリソースをロードするには、アクティビティを更新する必要があります。これを試して

private void restartActivity() { 
 Intent intent = getIntent(); 
 finish(); 
 startActivity(intent);
}
4
Yasir Ali

最善の方法は、すべてのTextView.setText()をメソッドに入れることです。 onResume();でそのメソッドを呼び出して、最初に設定します。次に、言語をリセットしたときにそのメソッドを思い出してください。 (方向を変更すると、アクティビティはonStart()onResume()などを通過します)

問題をまだ解決していない場合は、これを試すことができます。それは私のために働きます、それがあなたを助けることを願っています。後で参照できます

mSwitch = (Switch) findViewById(R.id.language_switch);

    mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                if (isChecked){
                    mSwitch.setTextColor(Color.GRAY);
                    String languageToLoad = "es";
                    Locale locale = new Locale(languageToLoad);
                    Locale.setDefault(locale);
                    Configuration configuration = new Configuration();
                    configuration.setLocale(locale);
                    Toast.makeText(getApplicationContext(), "spanish is set", Toast.LENGTH_SHORT).show();
                    getBaseContext().getResources().updateConfiguration(configuration, getBaseContext().getResources().getDisplayMetrics());
                } else {
                    String languageToLoad = "en";
                    Locale locale = new Locale(languageToLoad);
                    Locale.setDefault(locale);
                    Configuration configuration = new Configuration();
                    configuration.setLocale(locale);
                    Toast.makeText(getApplicationContext(), "english is set", Toast.LENGTH_SHORT).show();
                    getBaseContext().getResources().updateConfiguration(configuration, getBaseContext().getResources().getDisplayMetrics());
                }
        }
    });
2
fazeel zama

これが俺たちのやり方です:

com.Android.internal.app.LocalePicker.updateLocales(LocaleList locales)

0
Zbigniew Mazur