Android app切换语言、国际化、本地化

首先要了解什么是国际化?明知故问?其实就是同一界面加载不通语言的显示,让不同语言的用户使用,要实现这个功能,首先必须创建几套不同的strings文件,

那么有人会问了,究竟怎么创建呢?别急,这就来说……

跟着图一直走……

需要哪一个国家就创建哪一个

这时候你会发现在你的android目录下的strings有刚创建出来的文件,前提已经翻译好copy进去就OK了;

下面是代码系列:

首先在你的BaseActivity 的OnCreate方法里面,这就不需要解释了吧?

//重启之后恢复到之前的语言
selectLanguage(SharedPreferenceUtils.getString(this,"language"));
public void selectLanguage(String language) {
    //设置语言类型
    Resources resources = getResources();
    Configuration configuration = resources.getConfiguration();
    DisplayMetrics displayMetrics = resources.getDisplayMetrics();
    switch (language) {
        case "en":
            configuration.locale = Locale.ENGLISH;
            break;
        case "zh":
            configuration.locale = Locale.SIMPLIFIED_CHINESE;
            break;
        default:
            configuration.locale = Locale.getDefault();
            break;
    }
    resources.updateConfiguration(configuration, displayMetrics);

    //保存设置语言的类型
    SharedPreferenceUtils.putString(this,"language", language);
}

使用sharedpreference是为了切换重新启动的时候,显示上一次切换过的语言,

/**
 *
 * putString
 * @param context
 * @param key
 * @param value
 */
public static void putString(Context context, String key,String value){
    // 得到SharedPreferences
    SharedPreferences preferences = context.getSharedPreferences(
            "langulage", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putString(key,value);
    editor.commit();

}

/**
 * getString
 * @param context
 * @param key
 * @return
 */
public static String getString(Context context, String key) {
    SharedPreferences preferences = context.getSharedPreferences(
            "langulage", Context.MODE_PRIVATE);
    // 返回key值,key值默认值是false
    return preferences.getString(key, null);

}

然后在调用切换语言的地方,我这里是使用随机数实现功能,可参考……

BaseActivity activity = (BaseActivity) getCurActivity();

Random rand = new Random();
int i = rand.nextInt(2);

if (i == 0) {
    activity.selectLanguage("zh");
} else {
    activity.selectLanguage("en");
}


Intent intent = new Intent();
intent.setClass(getContext(), MainActivity.class);
startActivity(intent);

AppManager.getAppManager().finishAllActivity();

切换语言之后需要重新开启首页,

public class AppManager {
    private static Stack<Activity> activityStack;
    private static AppManager instance;

    private AppManager(){}
    /**
     * 单一实例
     */
    public static AppManager getAppManager(){
        if(instance==null){
            instance=new AppManager();
        }
        return instance;
    }
    /**
     * 添加Activity到堆栈 */
    public void addActivity(Activity activity){
        if(activityStack==null){
            activityStack=new Stack<Activity>();
        }
        activityStack.add(activity);
    }
    /**
     * 获取当前Activity(堆栈中最后一个压入的)
     */
    public Activity currentActivity(){
        Activity activity=activityStack.lastElement();
        return activity;
    }
    /**
     * 结束当前Activity(堆栈中最后一个压入的)
     */
    public void finishActivity(){
        Activity activity=activityStack.lastElement();
        finishActivity(activity);
    }
    /**
     * 结束指定的Activity
     */
    public void finishActivity(Activity activity){
        if(activity!=null){
            activityStack.remove(activity);
            activity.finish();
            activity=null;
        }
    }
    /**
     * 结束指定类名的Activity
     */
    public void finishActivity(Class<?> cls){
        for (Activity activity : activityStack) {
            if(activity.getClass().equals(cls) ){
                finishActivity(activity);
            }
        }
    }
    /**
     * 结束所有Activity
     */
    public void finishAllActivity(){
        for (int i = 0, size = activityStack.size(); i < size; i++){
            if (null != activityStack.get(i)){
                activityStack.get(i).finish();
            }
        }
        activityStack.clear();
    }
    /**
     * 退出应用程序
     */
    public void AppExit(Context context) {
        try {
            finishAllActivity();
            ActivityManager activityMgr= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            activityMgr.restartPackage(context.getPackageName());
            System.exit(0);
        } catch (Exception e) { }
    }
}

到这里就搞定了!

中文(中国):values-zh-rCN
中文(中国台湾):values-zh-rTW
中文(中国香港):values-zh-rHK
英语(美国):values-en-rUS
英语(英国):values-en-rGB
英文(澳大利亚):values-en-rAU
英文(加拿大):values-en-rCA
英文(爱尔兰):values-en-rIE
英文(印度):values-en-rIN
英文(新西兰):values-en-rNZ
英文(新加坡):values-en-rSG
英文(南非):values-en-rZA
阿拉伯文(埃及):values-ar-rEG
阿拉伯文(以色列):values-ar-rIL
保加利亚文: values-bg-rBG
加泰罗尼亚文:values-ca-rES
捷克文:values-cs-rCZ
丹麦文:values-da-rDK
德文(奥地利):values-de-rAT
德文(瑞士):values-de-rCH
德文(德国):values-de-rDE
德文(列支敦士登):values-de-rLI
希腊文:values-el-rGR
西班牙文(西班牙):values-es-rES
西班牙文(美国):values-es-rUS
芬兰文(芬兰):values-fi-rFI
法文(比利时):values-fr-rBE
法文(加拿大):values-fr-rCA
法文(瑞士):values-fr-rCH
法文(法国):values-fr-rFR
希伯来文:values-iw-rIL
印地文:values-hi-rIN
克罗里亚文:values-hr-rHR
匈牙利文:values-hu-rHU
印度尼西亚文:values-in-rID
意大利文(瑞士):values-it-rCH
意大利文(意大利):values-it-rIT
日文:values-ja-rJP
韩文:values-ko-rKR
立陶宛文:valueslt-rLT
拉脱维亚文:values-lv-rLV
挪威博克马尔文:values-nb-rNO
荷兰文(比利时):values-nl-BE
荷兰文(荷兰):values-nl-rNL
波兰文:values-pl-rPL
葡萄牙文(巴西):values-pt-rBR
葡萄牙文(葡萄牙):values-pt-rPT
罗马尼亚文:values-ro-rRO
俄文:values-ru-rRU
斯洛伐克文:values-sk-rSK
斯洛文尼亚文:values-sl-rSI
塞尔维亚文:values-sr-rRS
瑞典文:values-sv-rSE
泰文:values-th-rTH
塔加洛语:values-tl-rPH
土耳其文:values--r-rTR
乌克兰文:values-uk-rUA
越南文:values-vi-rVN
缅甸语 : values-my

但是刚开始我碰到的坑很隐蔽,很难发现,

在我的app的build.gradle文件中,defultCofig里面设置了默认中文语言,然后导致切换语言就是不成功,

打印log,发现确实已经切换过来了,但是,在build.gradle文件中有重新设置中文,

这就是为什么无效果的坑,以前没注意,

希望能给你带来帮助!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个小狼娃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值