Android 国际化适配之中英文模式切换

前言

最近在做一个app,要求有中文模式与英文模式,其实就是国际化适配了,这个不难但是感觉非常麻烦呀,先看下我写的简单例子,这样比较直观点:

效果图

接下来我介绍下如何去实现它:

  • 布局文件中的Textview的文本需要去引用values中的strings.xml中的字符串
  • strings.xml默认的是中文,适配英文的话就需要再创建一个values-en的文件夹,并且其中也是strings.xml文件
    效果图

对比一下values和values-en中的strings.xml

<resources>
    <string name="app_name">语言切换</string>
    <!--content-->
    <string name="title">这是标题</string>
    <string name="settings">设置</string>
    <!--dialog-->
    <string name="dialog_title">语言切换</string>
    <string name="dialog_msg">请选择你要切换的语言</string>
    <string name="dialog_positive">中文</string>
    <string name="dialog_negative">英文</string>
    <string name="toast_set_ch">设置成中文</string>
    <string name="toast_set_en">设置成英文</string>
</resources>

<-----------------------分割线------------------------------->

<resources>
    <string name="app_name">languageMore</string>
    <!--content-->
    <string name="title">title</string>
    <string name="settings">settings</string>
    <!--dialog-->
    <string name="dialog_title">language switch</string>
    <string name="dialog_msg">choose your language,please</string>
    <string name="dialog_positive">Chinese</string>
    <string name="dialog_negative">English</string>
    <string name="toast_set_en">has change to English</string>
    <string name="toast_set_ch">has change to Chinese</string>
</resources>

可以看出来name的名称都是一样的,只是内容中文与英文的区别

  • 接下来就是代码中的实现了,其实一个方法就可以切换了,资源字符串文件配置好了,就可以自动去适配了。设置语言切换的代码如下:
/**
 * 设置语言
 *
 * @param lauType 
 */
private void set(String lauType) {
    // 本地语言设置
    Locale myLocale = new Locale(lauType);
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = myLocale;
    res.updateConfiguration(conf, dm);
}

传人的lauType的值可以为”zh_CN”, “en”, “ja”, “de” ,分别表示中文、英文、日语、德语的意思。比如点击弹出框确认切换成英文,则调用set(“en”);即可 。下面展示MainActivity的全部代码:

public class MainActivity extends AppCompatActivity {

    private Button mButton;

    private Context mContext = this;

    // 中文 英文 日语 德语
    private static final String[] language = {"zh_CN", "en", "ja", "de"};

    public static final String CHINESE = language[0];
    public static final String ENGLISH = language[1];

    private String type;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButton = findViewById(R.id.btn_setting);

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

                AlertDialog dialog = new AlertDialog.Builder(mContext)
                        .setTitle(getString(R.string.title))
                        .setMessage(getResources().getString(R.string.dialog_title))
                        .setNegativeButton(getResources().getString(R.string.dialog_negative), new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                type = ENGLISH;
                                set(type);
                                Toast.makeText(mContext, getResources().getString(R.string.toast_set_en), Toast.LENGTH_SHORT).show();
                                recreate();
                            }
                        })
                        .setPositiveButton(getResources().getString(R.string.dialog_positive), new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                type = CHINESE;
                                set(type);
                                Toast.makeText(mContext, getResources().getString(R.string.toast_set_ch), Toast.LENGTH_SHORT).show();
                                recreate();
                            }
                        })
                        .create();
                dialog.show();

            }
        });
    }

    /**
     * 设置语言
     *
     * @param lauType
     */
    private void set(String lauType) {
        // 本地语言设置
        Locale myLocale = new Locale(lauType);
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        conf.locale = myLocale;
        res.updateConfiguration(conf, dm);
    }

}

这只是个简单例子,真实开发中最好把这个切换语言的状态保存在Shareprefences中,并且通过广播等的方式去通知其他页面语言改变,这个最好封装在基类Activity中来处理

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值