Android国际化动态设置系统环境语言以及踩坑历程

  • Post author:
  • Post category:其他


前言

关于Android国际化,我们都知道是要values-xx来建立多个国家的系统语言,但是实际中需求往往各种各样,例如收入登录设置默认系统语言、动态修改语言环境等。

参考图如下

工具类

贴下工具类

一 获取系统语言

   /**
     * 获取当前的语言
     * @param context
     * @return lang
     */
    public static String getLang(Context context){
        Resources res = context.getResources();

        //应用当前语言
        String currLang = res.getConfiguration().locale.getLanguage();
       
        return currLang;
    }

二 设置系统语言

   /**
     * 设置应用语言
     *
     * @param lang 要设置的语言,如:zh、en,目前只支持中文和英文,其它的请自行添加
     */
    public static void setLang(Context context, String lang) {
        Resources res = context.getResources();

        //应用当前语言
        String currLang = res.getConfiguration().locale.getLanguage();

        //当前语言和用户语言不一致时更改应用的当前语言
        if (!currLang.equals(lang)) {
            //设置应用语言类型
            Configuration config = res.getConfiguration();
            DisplayMetrics dm = res.getDisplayMetrics();
            config.locale = new Locale(lang);
        一般中英法等常用文直接用Locale类列好的  有些是还没有列出来的 如印地语  需要自己手动new
             //config.locale = Locale.ENGLISH;
            res.updateConfiguration(config, dm);
        }
    }

Locale类没有的需要自己  config.locale=new Locale(lang);

外部调用

需要重启Activity才有效。在setContentview之前调用才有效的。

        Utils.setLang(mContext,"Hi"); //我这里设置印度语
        Intent intent=new Intent(mContext,TvodActivty.class);
        startActivity(intent);

首次进入App动态设置指定语言环境

如需首次登陆APP即切换语言我们在setContentView(layout)之前设置环境语言即可

​
    @Override
    public int getLayoutID() {
        Utils.setLang(mContext,"en");
        return R.layout.activity_select;
    }

​

遇到的坑

1.Activity横竖屏切换后。操作如下:1.竖屏—>横屏  横屏返回竖屏。

设置的语言会失效。

解决办法是重新变回竖屏的时候,重新设置一次语言。如下:

    /**
     * 就算你在Manifest.xml设置横竖屏切换不重走生命周期。横竖屏切换还是会走这里
  
     */
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "onfinfig livedeatil current " + tablayout_position+" lang:"+lang);
        if (!"".equals(lang)) {
            Utils.setLang(this, lang);
        }

        if (newConfig.orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
      
              //do something 
        }else if(newConfig.orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
           
        }
    }

2.ActivityA的Fragment   —->(跳转)   ActivityB,ActvityB进行横竖屏切换。然后finish,返回ActivityA的Fragment。

此时动态设置的语言环境也无效。

解决办法:

     @Override
    protected void onRestart() {
        super.onRestart();

        String lang_new = Utils.getLang(mContext);
        if(!"".equals(lang)&&!lang.equals(lang_new)){
            Utils.setLang(mContext,lang);
        }
        Log.i("logfragment", "onrestart aty "+lang);
    }

Locale类国家参考

 */
    static public final Locale ENGLISH = createConstant("en", "");

    /** Useful constant for language.
     */
    static public final Locale FRENCH = createConstant("fr", "");

    /** Useful constant for language.
     */
    static public final Locale GERMAN = createConstant("de", "");

    /** Useful constant for language.
     */
    static public final Locale ITALIAN = createConstant("it", "");

    /** Useful constant for language.
     */
    static public final Locale JAPANESE = createConstant("ja", "");

    /** Useful constant for language.
     */
    static public final Locale KOREAN = createConstant("ko", "");

    /** Useful constant for language.
     */
    static public final Locale CHINESE = createConstant("zh", "");

    /** Useful constant for language.
     */
    static public final Locale SIMPLIFIED_CHINESE = createConstant("zh", "CN");

    /** Useful constant for language.
     */
    static public final Locale TRADITIONAL_CHINESE = createConstant("zh", "TW");

    /** Useful constant for country.
     */
    static public final Locale FRANCE = createConstant("fr", "FR");

    /** Useful constant for country.
     */
    static public final Locale GERMANY = createConstant("de", "DE");

    /** Useful constant for country.
     */
    static public final Locale ITALY = createConstant("it", "IT");

    /** Useful constant for country.
     */
    static public final Locale JAPAN = createConstant("ja", "JP");

    /** Useful constant for country.
     */
    static public final Locale KOREA = createConstant("ko", "KR");

    /** Useful constant for country.
     */
    static public final Locale CHINA = SIMPLIFIED_CHINESE;

    /** Useful constant for country.
     */
    static public final Locale PRC = SIMPLIFIED_CHINESE;

    /** Useful constant for country.
     */
    static public final Locale TAIWAN = TRADITIONAL_CHINESE;

    /** Useful constant for country.
     */
    static public final Locale UK = createConstant("en", "GB");

    /** Useful constant for country.
     */
    static public final Locale US = createConstant("en", "US");

    /** Useful constant for country.
     */
    static public final Locale CANADA = createConstant("en", "CA");

    /** Useful constant for country.
     */
    static public final Locale CANADA_FRENCH = createConstant("fr", "CA");

国家地区语言缩写代码

中文(中国):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

参考


Android国际化


Android开发手册之语言环境


demo代码下载



版权声明:本文为u012560369原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。