Android多语言切换

Android开发在做国际化的时候需要做多语言的适配,首先我们通过手机设置来看一下当前手机系统的语言环境,我用的是Android7.1.1的系统,相信语言切换大家都很容易找到,本博客还做了保存语言更改状态,就是当你设置英文或中文状态后,退出应用再打开,还是你上一次设置的语言环境.


现在我们通过代码的方式获取当前手机系统的语言环境

    private String getLocaleLanguage(){
        Locale locale = getResources().getConfiguration().locale;
        String language = locale.getLanguage();
        return language;
    }
    //下面这段写在onCreate方法内,这里做示例
    String currentLanguage = getLocaleLanguage();
    Log.d(TAG,"currentLanguage="+ currentLanguage);
打印日志,当你选择当前手机系统语言为英文时,可以看到"en"代表英文,当你选择为中文时,"zh"代表中文


现在我写一个简单的界面,布局代码就不贴了,两个TextView和一个Button,当我点击Button的时候切换语言


现在要准备一个资源文件,在res目录下创建values-zh-rCN文件夹,文件夹内创建strings.xml,用于放引用的字符串资源, 英文的就不用创建了,因为自带的values文件夹下的strings.xml默认就是英文的


然后把当前resources资源下的内容复制粘贴到values文件夹下的strings.xml内,并把内容改为英文的


资源准备好后,设置语言

    private void setLanguage(Locale language){
        Resources resources = getBaseContext().getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        Configuration config = resources.getConfiguration();
        // 应用用户选择语言
        config.locale = language;
        resources.updateConfiguration(config, dm);
        Toast.makeText(MainActivity.this,R.string.now_change_language,Toast.LENGTH_SHORT).show();
        //刷新界面
        Intent intent = new Intent();
        intent.setClass(MainActivity.this,MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        MainActivity.this.startActivity(intent);
    }
点击button后切换语言

  mBtnChangeLanguage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 if(currentLanguage.equals("en")){
                     //当前为英文环境就切换为中文
                     setLanguage(Locale.CHINESE);
                 }else if(currentLanguage.equals("zh")){
                     //当前为中文环境就切换为英文
                     setLanguage(Locale.ENGLISH);
                 }
            }
        });
最终就可以实现两种语言之间切换了,当然还要切换为其他国家的语言原理也相同,效果如下面两张图


现在我们来解决一个保存语言状态的问题,比如我现在的是英文状态,我改为中文状态,退出后再进入应用又变为英文状态了.我们可以通过SharedPreferences保存状态,自定义Application类,获取上一次保存的语言状态,然后再设置,Application为应用的入口,其他关于Application和SharedPreferences的知识不在这里赘述.

我这里把SharedPreferences封装成了一个工具类,可以直接存取数据.因为SharedPreferences不能直接存储对象,想要存储的话需要转换,比较麻烦,所以我就直接获取当前的语言环境,因为获取的当前语言环境是String类型,这样就可以轻松把当前语言存进去了.

   mBtnChangeLanguage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 if(currentLanguage.equals("en")){
                     //当前为英文环境就切换为中文
                     setLanguage(Locale.CHINESE);
                     PreferenceUtils.putString(MainActivity.this,"savedLanguage",getLocaleLanguage());
                 }else if(currentLanguage.equals("zh")){
                     //当前为中文环境就切换为英文
                     setLanguage(Locale.ENGLISH);
                     PreferenceUtils.putString(MainActivity.this,"savedLanguage",getLocaleLanguage());
                 }
            }
        });
自定义Application别忘了在清单文件application节点下注册该自定义类,现在我们就可以直接从自定义的Application取之前保存的语言,然后设置上去就OK了

public class BaseApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        initLanguage();//初始化语言
    }

    /** 初始化语言,获取最后一次保存的语言并且设置,确保每次打开应用都是最后一次设置的语言环境 */
    private void initLanguage() {
        String savedLanguage = PreferenceUtils.getString(getBaseContext(), "savedLanguage");
        if (savedLanguage != null) {
            if (savedLanguage.equals("en")) {
                setLanguage(Locale.ENGLISH);
            } else if (savedLanguage.equals("zh")) {
               setLanguage(Locale.CHINESE);
            }
        }
    }

    /**
     * 设置语言
     */
    private void setLanguage(Locale language) {
        Resources resources = getBaseContext().getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        Configuration config = resources.getConfiguration();
        config.locale = language;
        resources.updateConfiguration(config, dm);
    }
}

现在每次设置语言,退出后重新打开就是上次设置的语言环境了.

最后还可以做一些屏幕的适配,比如旋转屏幕后生命周期重新启动的问题,在每个清单文件中每个Activity加  android:configChanges="locale"
和application相同节点下配置supports-screens,让你的layout适应屏幕的大小,包括平板电脑
<supports-screens
       android:smallScreens="true"
       android:normalScreens="true"
       android:largeScreens="true"
       android:anyDensity="true"/>

最后附上该类的完整代码,以上实例如有不足请指出.

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private Button mBtnChangeLanguage;
    private String currentLanguage;
    private Button mToSecond;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        currentLanguage = getLocaleLanguage();
        mBtnChangeLanguage = (Button) findViewById(R.id.btn_change);
        mBtnChangeLanguage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 if(currentLanguage.equals("en")){
                     setLanguage(Locale.CHINESE);  //当前为英文环境就切换为中文
                     PreferenceUtils.putString(MainActivity.this,"savedLanguage",getLocaleLanguage());
                 }else if(currentLanguage.equals("zh")){
                     setLanguage(Locale.ENGLISH);      //当前为中文环境就切换为英文
                     PreferenceUtils.putString(MainActivity.this,"savedLanguage",getLocaleLanguage());
                 }
            }
        });
        mToSecond = (Button) findViewById(R.id.btn_to_second);
        mToSecond.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });
    }

    /** 获取当前语言环境    */
    private String getLocaleLanguage(){
        Locale locale = getResources().getConfiguration().locale;
        String language = locale.getLanguage();
        return language;
    }

    /** 设置语言    */
    private void setLanguage(Locale language){
        Resources resources = getBaseContext().getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        Configuration config = resources.getConfiguration();
        config.locale = language;
        resources.updateConfiguration(config, dm);
        //刷新界面
        Intent intent = new Intent();
        intent.setClass(MainActivity.this,MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        MainActivity.this.startActivity(intent);
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值