Andoid多语言国际化策略

   目前手上的项目,为了普及覆盖更多的用户群,也已经开始实现了多语言设置这样的功能,不过今天我要说的不是微信,而是我们自己项目中的实现策略。

直接附上关键代码:

package com.huolongluo.ui.activity.payway;

import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.util.DisplayMetrics;

import com.huolongluo.share.Constant;
import com.huolongluo.share.Share;
import com.huolongluo.util.L;
import com.huolongluo.share.Event;

import java.util.Locale;

import de.greenrobot.event.EventBus;

/**
 * <p>
 * Created by 火龙裸 on 2017/10/23.
 */

public class LanguageUtils
{
    private static LanguageUtils sInstacne;
    private Context mContext;

    // 单例初始化
    public static void init(Context mContext)
    {
        if (sInstacne == null)
        {
            synchronized (LanguageUtils.class)
            {
                if (sInstacne == null)
                {
                    sInstacne = new LanguageUtils(mContext);
                }
            }
        }
    }

    public static LanguageUtils getInstance()
    {

        if (sInstacne == null)
        {
            throw new IllegalStateException("You must be init LanguageUtil first");
        }
        return sInstacne;
    }

    private LanguageUtils(Context context)
    {
        this.mContext = context.getApplicationContext();
    }

    // 设置语言配置
    public void setConfiguration()
    {
        // 首先获取本地配置,因为6.0以上的设备需要特别处理,否则按下方的方法处理即可
        Locale targetLocale = getTragetLocale();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
        {
            Locale.setDefault(targetLocale);
        }
        else
        {
            Resources resources = mContext.getResources();
            Configuration config = resources.getConfiguration();
            DisplayMetrics dm = resources.getDisplayMetrics();
            config.locale = targetLocale;
            resources.updateConfiguration(config, dm);
        }

    }

    /**
     * 如果不是英文、简体中文、繁体中文,默认返回英文
     *
     * @return
     */
    private Locale getTragetLocale()
    {
        String userType = Share.get().getLanguage();
        L.e("========" + userType);
        if (userType.equals(Constant.ENGLISH))
        {
            return Locale.ENGLISH;
        }
        else if (userType.equals(Constant.HONGKONG_CHINESE))
        {
            return Locale.FRENCH;
        }
        else if (userType.equals(Constant.TRADITIONAL_CHINESE))
        {
            return Locale.TRADITIONAL_CHINESE;
        }

        return Locale.SIMPLIFIED_CHINESE;
    }

    // 6.0以上获取方式需要特殊处理一下
    private Locale getSysLocale()
    {
        return Locale.getDefault();
    }

    // 修改了语言之后,修改SharedPreferences里面的配置信息,通过rxbus进行通知页面进行重新加载。可以用eventbus或者广播,你喜欢就行。
    public void updateLanguage(String languageType)
    {
        if (!languageType.equals(Share.get().getLanguage()))
        {
            Share.get().saveLanguage(languageType);
            EventBus.getDefault().post(new Event.LanguageEvent());
        }
    }
}

 

先看下面这张图:

当用户点击选择了某一种语言后,只需要通过

1 LanguageUtil.getInstance().updateLanguage("对应上图的语言代码");

调用完这句代码后,就会通过EventBus通知UI界面更新。 这里我用的是EventBus,当然也可以用别的,看个人喜好。

 

接收EventBus的地方:

1 Intent intent = getIntent();
2 overridePendingTransition(0, 0);
3 intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
4 finish();
5 overridePendingTransition(0, 0);
6 startActivity(intent);

之所以接收EventBus的地方这样写。是因为需求是说语言切换完后,不是重启APP,而是直接当前界面更新UI,大家看看微信的语言切换就知道了,微信一切换完语言,直接回退到了主界面。把之前栈里的Activity全干掉了,然后重新加载的主界面。 在这儿我们的需求不一样,所以只能这样写。overridePendingTransition(0, 0); 这句代码是Activity中提供的Activity跳转动画方法,通过该方法可以实现Activity跳转时的动画效果,这里的Activity入场出场都设置的0。  这里启动模式加上了 “FLAG_ACTIVITY_REORDER_TO_FRONT” Intent标记,这是当如已经启动了四个Activity:A,B,C和D。在D Activity里,我们要跳到B Activity,同时希望C finish掉( 这样启动B Activity,就会把D,C都finished掉)。 这样的写法,是符合我们当前的需求的。

转载于:https://www.cnblogs.com/huolongluo/p/7717807.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值