Android国际化问题以及在应用内切换不同语言设置

一年又一年,16年过去了,17年马上到来。。。跑偏了,写博文了


在项目中要做国际化适配,为了更好的切换语言,需要在应用中添加语言切换功能,就像微信那样

基本适配

先说说国际化适配,其实很简单,就是将项目中用到的字符串资源放在strings.xml资源文件中,在布局文件中通过@string/strName使用,在代码中通过

getResources().getString(R.string.strName)引用,将要适配的 语言在资源文件中创建对应的strings.xml资源中就OK了,当你在Android系统中切换语言时,你的应用语言就会跟着改变,至于每个国家语言的标识和文件件创建如下:

Arabic, Egypt (ar_EG) -----------------------------阿拉伯语,埃及
Arabic, Israel (ar_IL) -------------------------------阿拉伯语,以色列
Bulgarian, Bulgaria (bg_BG) ---------------------保加利亚语,保加利亚
Catalan, Spain (ca_ES) ---------------------------加泰隆语,西班牙
Czech, Czech Republic (cs_CZ) -----------------捷克语,捷克共和国
Danish, Denmark(da_DK) ------------------------丹麦语,丹麦
German, Austria (de_AT) -------------------------德语,奥地利
German, Switzerland (de_CH) -------------------德语,瑞士
German, Germany (de_DE) ----------------------德语,德国
German, Liechtenstein (de_LI) ------------------德语,列支敦士登的
Greek, Greece (el_GR) ----------------------------希腊语,希腊
English, Australia (en_AU) -------------------------英语,澳大利亚
English, Canada (en_CA) --------------------------英语,加拿大
English, Britain (en_GB) ----------------------------英语,英国
English, Ireland (en_IE) -----------------------------英语,爱尔兰
English, India (en_IN) --------------------------------英语,印度
English, New Zealand (en_NZ) ---------------------英语,新西兰
English, Singapore(en_SG) --------------------------英语,新加坡
English, US (en_US) -----------------------------------英语,美国
English, Zimbabwe (en_ZA) --------------------------英语,津巴布韦
Spanish (es_ES) ----------------------------------------西班牙
Spanish, US (es_US) -----------------------------------西班牙语,美国
Finnish, Finland (fi_FI) ---------------------------------芬兰语,芬兰
French, Belgium (fr_BE) -------------------------------法语,比利时
French, Canada (fr_CA) -------------------------------法语,加拿大
French, Switzerland (fr_CH) --------------------------法语,瑞士
French, France (fr_FR) --------------------------------法语,法国
Hebrew, Israel (he_IL) ---------------------------------希伯来语,以色列
Hindi, India (hi_IN) -------------------------------------印地语,印度
Croatian, Croatia (hr_HR) ----------------------------克罗地亚语,克罗地亚
Hungarian, Hungary (hu_HU) ------------------------匈牙利语,匈牙利
Indonesian, Indonesia (id_ID) ------------------------印尼语,印尼
Italian, Switzerland (it_CH) ----------------------------意大利语,瑞士
Italian, Italy (it_IT) ---------------------------------------意大利语,意大利
Japanese (ja_JP) ----------------------------------------日语
Korean (ko_KR) ------------------------------------------朝鲜语
Lithuanian, Lithuania (lt_LT) --------------------------立陶宛语,立陶宛
Latvian, Latvia (lv_LV) ---------------------------------拉托维亚语,拉托维亚
Norwegian-Bokmol, Norway(nb_NO) ---------------挪威语,挪威
Dutch, Belgium (nl_BE) --------------------------------荷兰语,比利时
Dutch, Netherlands (nl_NL) ---------------------------荷兰语,荷兰
Polish (pl_PL) -------------------------------------------波兰
Portuguese, Brazil (pt_BR) ---------------------------葡萄牙语,巴西
Portuguese, Portugal (pt_PT) ------------------------葡萄牙语,葡萄牙
Romanian, Romania (ro_RO) ------------------------罗马尼亚语,罗马尼亚
Russian (ru_RU) ----------------------------------------俄语
Slovak, Slovakia (sk_SK) ------------------------------斯洛伐克语,斯洛伐克
Slovenian, Slovenia (sl_SI) ---------------------------斯洛文尼亚语,斯洛文尼亚
Serbian (sr_RS) ----------------------------------------塞尔维亚语
Swedish, Sweden (sv_SE) ----------------------------瑞典语,瑞典
Thai, Thailand (th_TH) --------------------------------泰语,泰国
Tagalog, Philippines (tl_PH) --------------------------菲律宾语,菲律宾
Turkish, Turkey (tr_TR) -------------------------------土耳其语,土耳其
Ukrainian, Ukraine (uk_UA) --------------------------联合王国
Vietnamese, Vietnam (vi_VN) -----------------------越南语,越南
Chinese, PRC (zh_CN)--------------------------------中文,中国
Chinese, Taiwan (zh_TW)-----------------------------中文,台湾 

创建文件夹
values-zh   ---------------中文

values        ----------------默认英文

values-fr   ----------------法语      

项目中表现如下:



在应用中设置语言切换

要想实现像微信那样在应用实现语言切换,就不能是简单的配置资源文件了,下面看看如何来做

在Android 系统中有这样一个Configuration类用来配置系统,它里面可以配置许多信息,有关屏幕的方向,导航类型,触屏方式,系统字体大小及颜色,还有就是今天要说的语言配置。Configuration对象中有一个local属性用来设置语言。但是有一个问题就是在改变系统配置之后都要通过重启Activity才能生效。那么就像微信一样,当改变语言配置之后,把所有没有Destroy的Activity全部销毁,跳转到MainActivity重新启动。这样就可以改变应用内的语言。这样做了之后你会发现当下次进入应用后还是没有改变,这就需要我们把设置的语言来保存一下,当下次再进来的时候就设置语言。下面是代码

改变语言的方法:

protected void switchLanguage(String language) {
        //获取资源
        Resources resources = getResources();
        //通过资源获取系统配置对象
        Configuration config = resources.getConfiguration();
        DisplayMetrics dm = resources.getDisplayMetrics();
        if (language.equals("en")) {//英文
            config.locale = Locale.ENGLISH;
        } else {//汉语
            config.locale = Locale.SIMPLIFIED_CHINESE;
        }
        resources.updateConfiguration(config, dm);
        //保存设置语言的类型
        sharedPreferences.edit().putString("language",language).commit();
}
在MainActivity的onCreate中调用此方法,将上次设置的语言传入,以保证下次进入还是上次设置的语言

public class MainActivity extends AppCompatActivity {
    SharedPreferences sharedPreferences;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sharedPreferences = getSharedPreferences("config", Context.MODE_PRIVATE);
        switchLanguage(sharedPreferences.getString("language", "zh"));
        setContentView(R.layout.activity_main);   
    }
} 
设置语言的方法

    int temp;
    private void setLanguage() {
        AlertDialog.Builder builder = new AlertDialog.Builder(SystemSetActivity.this);
        builder.setTitle(getResourceString(R.string.PleaseSetLanguage));
        final String[] languages = {"中文(简体)", "English(United Kingdom)"};
        String lan = manager.getString(Constant.LANGUAGE, "zh");
        int curr = 0;
        if ("zh".equals(lan)) {
            curr = 0;
        } else {
            curr = 1;
        }
        builder.setSingleChoiceItems(languages, curr, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                    case 0:
                        temp = 0;
                        break;
                    case 1:
                        temp = 1;
                        break;
                }
            }
        });
        builder.setPositiveButton(getResourceString(R.string.Confirm), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (temp) {
                    case 0:
                        switchLanguage("zh");
                        break;
                    case 1:
                        switchLanguage("en");
                        break;
                }
                setResult(1);
                finish();
                //销毁当前的Activity跳转到MainActivity,重新开启Activity
                Intent it = new Intent(SystemSetActivity.this, MainActivity.class);
                startActivity(it);
            }
        });
        builder.setNegativeButton(getResourceString(R.string.Cancel), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });
        builder.show();
    }
这样就OK了






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值