Android 多语言适配

作者: dingyx | 来源:发表于2016-11-02 21:53 被阅读5741次

    应用程序根据系统设置语言实现多语言适配

    应用程序默认只要配置不同语言的文件,在启动应用时都会根据系统语言而加载对应的语言资源文件。例如支付宝,微信,微博等都实现了中英文的适配。下面的例子我们将实现中文的适配。

    • 创建相应语言的文件
      右键res文件夹File-->New-->Android resource file选择Locale看到如下界面:
      我们选择新增的语言为中文,将文件名设为strings


      点击确定后可以看到生成如下目录及文件(新增了values-zh文件夹和strings.xml文件):
    • values\strings.xml中代码如下:

    <resources>
        <string name="app_name">LanguagesTest</string>
        <string name="hello_world">Hello World!</string>
    </resources>
    
    • 修改values-zh\strings.xml中代码如下:
    <resources>
        <string name="app_name">语言测试</string>
        <string name="hello_world">你好,世界!</string>
    </resources>
    
    • 此时运行项目,当系统语言设置为中文时显示如下:


    • 系统语言设置为中文之外的其他语言显示如下:


    注意:当应用程序没有退出,进入系统修改了语言设置。再次进入时应用会重新载入。类似于横竖屏切换时的应用生命周期。

    应用内实现语言设置

    • 实现效果
      应用内有一个设置按钮,点击设置时弹出dialog提示语言选择。用户选择完成后,重启应用并按用户设置加载对应的语言。

    点击设置按钮出现如下界面:


    应用内实现语言的设置需要开发者在代码中实现,而不跟随系统语言变化而改变。像微信在程序内就有语言设置,下面代码实现的效果和微信类似。语言设置完成后重启应用,重新加载不同的语言。同时,我们将设置的语言类型存储起来,下次启动应用先读取设置的语言,而不跟随系统的设置语言,然后再加载应用。

    • 具体实现代码如下:
    public class MainActivity extends AppCompatActivity {
    
        ImageButton btn_settings;
        AlertDialog dialog;
    
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
            //读取SharedPreferences数据,初始化语言设置
            setLanguage();
    
            getSupportActionBar().hide();
            setContentView(R.layout.activity_main);
    
            btn_settings = (ImageButton) findViewById(R.id.btn_settings);
    
            //点击设置按钮进入语言设置
            btn_settings.setOnClickListener(new View.OnClickListener() {
    
                public void onClick(View view) {
    
                    //创建单选框
                    final AlertDialog.Builder builder = new
                            AlertDialog.Builder(MainActivity.this);
                    builder.setSingleChoiceItems(new String[]{"Auto", "简体中文"},
                            getSharedPreferences("language", Context.MODE_PRIVATE).getInt("language",0),
                            new DialogInterface.OnClickListener() {
                                //点击单选框某一项以后
                                public void onClick(DialogInterface dialogInterface, int i) {
    
                                    //将选中项存入SharedPreferences,以便重启应用后读取设置
                                    SharedPreferences preferences = getSharedPreferences("language", Context.MODE_PRIVATE);
                                    SharedPreferences.Editor editor = preferences.edit();
                                    editor.putInt("language",i);
                                    editor.apply();
                                    dialog.dismiss();
                                   
                                    Intent intent = new Intent(MainActivity.this, MainActivity.class);
                                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                    startActivity(intent);
    
                                    /* 重新在新的任务栈开启新应用
                                    Intent intent = new Intent(MainActivity.this, MainActivity.class);
                                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                                    startActivity(intent);
                                    android.os.Process.killProcess(android.os.Process.myPid()); */
                                }
                            });
    
                    dialog = builder.create();
                    dialog.show();
                }
            });
    
        }
    
    
        private void setLanguage() {
    
            //读取SharedPreferences数据,默认选中第一项
            SharedPreferences preferences = getSharedPreferences("language", Context.MODE_PRIVATE);
            int language = preferences.getInt("language", 0);
    
            //根据读取到的数据,进行设置
            Resources resources = getResources();
            DisplayMetrics displayMetrics = resources.getDisplayMetrics();
            Configuration configuration = resources.getConfiguration();
    
            switch (language){
                case 0:
                    configuration.setLocale(Locale.getDefault());
                    break;
                case 1:
                    configuration.setLocale( Locale.CHINESE);
                    break;
                default:
                    break;
            }
    
            resources.updateConfiguration(configuration,displayMetrics);
    
        }
    
    }
    

    相关文章

      网友评论

      • 4167570b76da:你好,想问下你这个有源代码吗,我按照你的代码,添加了中文的xml,但选择简体中文的时候依然显示英文的hello world,请问还需要怎样配置吗,谢谢
      • MisterT:根据你的代码,放在项目中居然没有效果
        dingyx: @RamMin 你先写个demo试试看,你用的是第一种直接配置的文件吧。 还有是不是机器问题,换个试试,或者用模拟器试试
      • Dev白纸黑字:我记得这么做在6.0还是7.0里会有问题吧?
        saymagic:7.0有问题的
        dingyx:@Dev白纸黑字 我的手机一加3是6.0的试了没有问题的。
      • 皮球二二:杀进程肯定不是一个好选择,我是选择singleTask回到首页,只要在第一屏reCreate
        皮球二二: @r17171709 默认是重新onCreate的
        28c56bd25324:你好!若返回的是设置界面,类似微信那样的语言设置,怎么让首页的语言及时更新呢?
        dingyx:@r17171709 你说的对,对于我这个demo确实没有必要这么做。而且直接杀进程显得很粗暴。不过如果设置的activity和首页的activity不在同一个进程直接跳转就会出现问题。 这么做是我看到微信打印出来的日志有这个操作。 等一下我把我的代码去改一下,谢谢你的建议。

      本文标题: Android 多语言适配

      本文链接:https://www.haomeiwen.com/subject/ictbuttx.html