我正在尝试在我的应用程序(英语和希伯来语)中实现多语言。
我创建了2个字符串文件,并实现了应支持多语言功能的所有方法。
但是,当我运行该应用程序并在对话框中选择“希伯来语”时,布局从左到右更改为从右到左(因为它应该在希伯来语中),但是语言没有改变。谁能帮我解决这个问题?

    import android.app.Activity;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.content.res.Configuration;
    import android.os.Bundle;
    import android.os.Vibrator;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import java.util.Locale;

    public class MainActivity extends AppCompatActivity {

        private Button btn_chooseBoard;
        private Button btn_store;
        private Button btn_language;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            loadLocale();

            setContentView(R.layout.lay_main);

            Constants instance = Constants.getInstance();

            instance.getAllPlayers();
            instance.getAllBoards();

            btn_chooseBoard = (Button) findViewById(R.id.btn_startGame);
            btn_store = (Button) findViewById(R.id.btn_popup_store);
            btn_language = (Button) findViewById(R.id.btn_language);

            btn_chooseBoard.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Intent intent = new Intent(MainActivity.this, ChooseBoard.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                    startActivity(intent);

                    ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).vibrate(20);
                }
            });

            btn_store.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Intent intent = new Intent(MainActivity.this, Store.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                    startActivity(intent);

                    ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).vibrate(20);
                }
            });

            btn_language.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    showChangeLanguageDialog();
                }
            });
        }

        /**
         * Reset game on resume main activity
         */
        @Override
        public void onResume() {
            super.onResume();
            GameLogic.getGameLogic().resetGame();
        }

        private void showChangeLanguageDialog() {
            // Array of language to display in alert dialog
            final String[] listItems = {"English", "עברית"};
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

            builder.setTitle("Choose Language...");
            builder.setSingleChoiceItems(listItems, -1, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    if (i == 0) {
                        // English
                        setLocale("en");
                        recreate();
                    } else if (i == 1) {
                        // Hebrew
                        setLocale("iw");
                        recreate();
                    }

                    // Dismiss alert dialog when language stored
                    dialogInterface.dismiss();
                }
            });

            AlertDialog alertDialog = builder.create();

            // Show alert dialog
            alertDialog.show();
        }

        private void setLocale(String lang) {

            Locale locale = new Locale(lang);
            Locale.setDefault(locale);
            Configuration configuration = new Configuration();
            configuration.locale = locale;
            getBaseContext().getResources().updateConfiguration(configuration, getBaseContext().getResources().getDisplayMetrics());

            // Save data to shared preference

            SharedPreferences.Editor editor = getSharedPreferences("Settings", MODE_PRIVATE).edit();
            editor.putString("language", lang);
            editor.apply();

        }

        // Load language saved in shared preference
        public void loadLocale() {
            SharedPreferences pref = getSharedPreferences("Settings", Activity.MODE_PRIVATE);
            String language = pref.getString("language", "");
            setLocale(language);

        }
    }

最佳答案

Android有自己的API来处理不同的语言环境。
用户在Android系统设置中设置其语言环境。
您无需询问用户的语言环境。

只需将英语字符串放入res / values / strings.xml,将希伯来语字符串放入res / values-iw / strings.xml。
也可以通过使用开始/结束而不是左/右来处理布局xml中的ltr / rtl。

编辑:
我不知道是否可以像在setLocale()中一样更改应用程序的语言环境。

您应该关闭应用程序并将其从应用程序堆栈中删除。
然后在Android设置中将语言更改为希伯来语,然后重新打开您的应用。

如果您现在拥有在布局.xml中定义的rtl布局,但没有希伯来字符串,那么strings.xml可能存在问题。

您的strings.xml可能没有正确的路径(res / values-iw / strings.xml)。
否则strings.xml的内容可能是错误的。字符串ID可能与您的英语strings.xml中的ID不同。

您还可以打印出您当前的语言环境,以查看是否将其设置为“ iw”,如此处所述:
14389349

10-08 15:27