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);

    }

}

相关文章

  • Android 多语言适配

    最近一段时间在国际部门做Android开发,所以手头的项目都需要去适配多语言。这里总结了一些多语言适配的经验。 演...

  • 2019-04-26工作总结

    今日工作为Android添加多语言,多语言使用时应该注意布局的适配性以及手机的屏幕大小,控件的大小,以及APP的美感

  • Android多语言适配

    GitHub地址(完整Demo下载)https://github.com/zhouxu88/LanguageCha...

  • Android 多语言适配

    应用程序根据系统设置语言实现多语言适配 应用程序默认只要配置不同语言的文件,在启动应用时都会根据系统语言而加载对应...

  • Android - 多语言适配

    Android 的多语言适配方案,网上有很多方案,这里我不一一说明,这里记录下开发的过程中,遇到的一个不留意不容易...

  • Android适配多语言

    在res资源文件夹下,创建相应国建的values资源文件,如印尼,values-in文件夹,在里面创建string...

  • Android多语言在5.0版本失效的问题

    问题: 最近在开发一个Android app的时候,进行了多语言的适配,适配完后在测试机上运行切换没有问题,测试机...

  • Android 语言适配简单记录

    android 多语言适配,是通过res下新建不同的values-xx文件夹,以及values文件夹下的strin...

  • iOS 多语言全局适配

    本文记录iOS 多语言全局适配解决方案,适用于项目中后期快速适配多语言; 实现思路:runtime method ...

  • Android studio 查找所有文字位置

    问题 在Android多语言适配得时候,一个个查找代码得文字位置是很痛苦得 解决方案

网友评论

  • 4167570b76da:你好,想问下你这个有源代码吗,我按照你的代码,添加了中文的xml,但选择简体中文的时候依然显示英文的hello world,请问还需要怎样配置吗,谢谢
  • MisterT:根据你的代码,放在项目中居然没有效果
    dingyx: @RamMin 你先写个demo试试看,你用的是第一种直接配置的文件吧。 还有是不是机器问题,换个试试,或者用模拟器试试
  • 9f8838eb0e19:我记得这么做在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