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());
}
}
}
先看下面这张图:

当用户点击选择了某一种语言后,只需要通过
LanguageUtil.getInstance().updateLanguage("对应上图的语言代码");
调用完这句代码后,就会通过EventBus通知UI界面更新。 这里我用的是EventBus,当然也可以用别的,看个人喜好。
接收EventBus的地方:
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
finish();
overridePendingTransition(0, 0);
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掉)。 这样的写法,是符合我们当前的需求的。
Andoid多语言国际化策略的更多相关文章
- Java同步和异步过程中消息语言国际化处理策略
在Java后端做消息内容的语言国际化处理时可以通过Spring中MessageSource接口的来实现,但是MessageSource接口需要用到Locale对象, 而Locale类又是根据前端传过来 ...
- Zend_Frameowrk中进行多语言国际化的相关的配置和使用
在使用Zend_Framework建立网站,若网站在以后的使用中面向国际,这时就需要实现网站的多语言国际化问题.使用Zend_Framework开发的网站需要进行多语言的开发时,就需要用到了Zend_ ...
- (三)Qt语言国际化
Vs 2010+ Qt5 实现语言国际化 创建一个工程,cpp代码如下: 1.创建工程 #include "languageinternationalized.h" #includ ...
- i18next-页面层语言国际化js框架介绍
因为工作需要,最近研究了下网站语言国际化的问题,根据当前项目架构,寻求一种较好的解决方案.首先总结下项目中语言切换实现方式大概有以下几种: 1,一种语言一套页面,如:index_CN.html,ind ...
- iOS语言国际化
参考网站:http://blog.sina.com.cn/s/blog_7b9d64af0101jncz.html 语言国际化:根据系统不同的语言自动切换 Xcode6.2 一.在不同语言下工 ...
- 自定义JSP标签实现语言国际化(类似struts text标签),并同时支持图片、JS文件国际化
源代码及样例下载地址: http://download.csdn.net/detail/u014569459/7169385 一.功能说明: 1. 支持语言国际化 2. 支持图片文件.JS文件国际化 ...
- JavaWeb之多语言国际化
这周打算把国际化.JDBC和XML学习一下,从下周就开始学习三大框架,再坚持一个半月吧就能入门JavaWeb了,上周周末两天过的真是生不如死,两天坐在家里,醒来就写博客,原本在公司也自己操作了一遍,其 ...
- Spring Boot + Freemarker多语言国际化的实现
最近在写一些Web的东西,技术上采用了Spring Boot + Bootstrap + jQuery + Freemarker.过程中查了大量的资料,也感受到了前端技术的分裂,每种东西都有N种实现, ...
- 使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization)
使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization) 前言: 这是 qt for python 的语言国际化,基于 UI 的,python 也有 ...
随机推荐
- rolling方式修改oplog
在 3.4之前版本 , 修改oplog 是一个非常麻烦的事情, 要停数据库 , rolling方式适合 3.4 之前版本修改oplog的大小 1. 配置文件注释 replSet2. 配置文件 oplo ...
- linux初始
运维 IT运维,指IT公司中,运行和维护服务器的工作 核心工作: 数据不能丢失 7*24小时运行 提高用户访问效率 一句换 管服务器的 服务器 要管服务器那就得先了解服务器 服务器也称为伺 ...
- 剑指offer五十六之删除链表中重复的结点
一.题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- (转)ldd 查看程序依赖库
原文:https://blog.csdn.net/u010977122/article/details/52993560?spm=a2c4e.11153940.blogcont551034.8.4f7 ...
- 使用spring EL表达式+自定义切面封装缓存模块
需求是这样的,业务代码需要使用到缓存功能以减少数据库压力,使用redis来实现,并且需要生成缓存的key由方法的传参拼接而成(貌似也只能这样才能保证同样的select查询可以使用缓存),简单的方式就是 ...
- Postman—测试脚本
前言 对于Postman中的每个请求,我们都可以使用JavaScript语言来开发测试脚本.这也就好比单元测试.我们先看看Postman的相关界面: 编写测试脚本 Postman测试脚本本质上是在发送 ...
- 软件魔方制作系统启动盘并安装win10系统
不多说,直接上干货! 推荐软件:软件魔方 http://mofang.ruanmei.com/ 这里,我想说的是,这个软件来制作系统盘,是真的方便和好处多多.具体我不多说,本人也是用过其他的如大白菜 ...
- OpenGL12-shader(GLSL)着色语言2-(参数传递)(代码以上传)
上一篇中介绍了如何使用shader,用来一个最简单的shader,计算顶点的位置,调用了 OpenGL 顶点着色语言中的内置变量对顶点进行操作,这一例程中,将展示如何将应用层 的数据传递到shader ...
- springboot-11-servlet, listener, fitlter的添加
springboot中添加servlet, filter, listener有2种方式: 代码注册servlet 和自动注解注册(在使用druid监控有使用过) 代码注册通过ServletRegist ...
- zookeeper集群搭建及Leader选举算法源码解析
第一章.zookeeper概述 一.zookeeper 简介 zookeeper 是一个开源的分布式应用程序协调服务器,是 Hadoop 的重要组件. zooKeeper 是一个分布式的,开放源码的分 ...