JAVA做语言国际化
项目场景:
`
问题描述
提示:这里描述项目中遇到的问题:
例如:数据传输过程中数据不时出现丢失的情况,偶尔会丢失一部分数据
APP 中接收数据代码:
@Overridepublic void run() {bytes = mmInStream.read(buffer);mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();}
原因分析:
提示:这里填写问题的分析:
公司做SaaS系统,需要做成国际通用版本,至少支持简体中文,繁体中文和英文版本,然后我使用的是java的国际化方案,通过查资料和动手实践,踩过了几个坑。
解决方案:
提示:这里填写该问题的具体解决方案:
- 首先需要新建三个属性文件,分别命名为Message_en_US.properties(英文),Message_zh_CN.properties(简体中文),Message_tw_CH.properties(繁体中文),然后将属性以键值队形式分别写到英文属性文件和简体中文属性文件,繁体文件待会讲。
- Message_zh_CN.properties:
#成功
SUCCESS=成功
#失败
FAIL=失败
#错误
ERROR=错误
#员工
EMPLOYEE=员工
#文件上传成功
UPLOAD_FILE_SUCCESS=文件上传成功
#文件不能为空
FILE_CANNOT_BE_EMPTY=文件不能为空
- Message_en_US.properties:
#成功
SUCCESS=success
#失败
FAIL=fail
#错误
ERROR=error
#员工
EMPLOYEE=employee
#文件上传成功
UPLOAD_FILE_SUCCESS=upload file success
#文件不能为空
FILE_CANNOT_BE_EMPTY=file can not null!
然后英文属性文件不用动,而简体中文属性文件需要通过java自带的native2ascii命令将其中文转换成Unicode码,需要首先通过命令cmd定位到简体中文属性文件所在文件夹,然后输入下面命令:
native2ascii -encoding UTF-8 Message_zh_CN.properties Message_zh_CN.properties
这里有个坑,就是如果不指定-encoding UTF-8,则这个命令会自动调用操作系统默认的中文编码即GB2312编码对属性文件转换成Unicode编码,这样转换后,因为属性文件使用的是UTF-8编码,这样到时候用java国际化翻译读出来的文字就是乱码,这点一定要注意!!
- 繁体中文属性文件则是复制一份简体中文的原始内容,只不过里面的简体中文需要用翻译软件全部翻译成繁体,然后讲翻译的内容粘贴回繁体属性文件,线上翻译网站:http://www.esjson.com/jianfanti.html
- 这样属性文件的准备工作就完成了,注意:属性文件的属性名一定要一致,然后再系统中统一用一个类将这些属性名定义好,以便后续直接调用。
定义类用来加载属性文件并做后续的转换国际化工作,具体类实现如下:
package com.sunq.system.util;import com.sunq.common.core.domain.UserVo;
import com.sunq.common.core.utils.StringUtils;
import com.sunq.system.common.Constant;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;/*** 语言国际化工具类*/
@Service
public class GlobalLanguageConvertor {// 默认绑定资源(中文)public static volatile ResourceBundle bundle_cn = null;// 默认绑定资源(英文)public static volatile ResourceBundle bundle_en = null;// 默认绑定资源(繁体)public static volatile ResourceBundle bundle_tw = null;// // 私有构造
// private GlobalLanguageConvertor() {// }/*** 初始化配置文件*/private void initResources() {try {// UserVo userVo = this.getUserVo();
// // 获取用户勾选的语言包(0:简体中文,1:英文,2:繁体中文)
// String language = userVo.getLanguage();
// Locale locale = null;
// if (StringUtils.isEmpty(language)) {// locale = new Locale("zh", "CN");
// } if (Constant.LANGUAGE_ZH_CN.equals(language)) {// locale = new Locale("zh", "CN");
// } else if (Constant.LANGUAGE_EN_US.equals(language)) {// locale = new Locale("en", "US");
// } else {// locale = new Locale("tw", "CN");
// }// 提前加载好所有语言包,以便后台静态类全局提供服务Locale locale_cn = new Locale("zh", "CN");Locale locale_en = new Locale("en", "US");Locale locale_tw = new Locale("tw", "CH");// 绑定语言包bundle_cn = ResourceBundle.getBundle("Message", locale_cn);bundle_en = ResourceBundle.getBundle("Message", locale_en);bundle_tw = ResourceBundle.getBundle("Message", locale_tw);} catch (MissingResourceException e) {throw new RuntimeException(e);}}/*** 将提示语句翻译成用户登录所选语言的语句* @param key* @return*/public String convertor(String key) {UserVo userVo = this.getUserVo();// 获取用户勾选的语言包(0:简体中文,1:英文,2:繁体中文)String language = userVo.getLanguage();String result = convertor(language, key);
// if (StringUtils.isEmpty(language)) {// result = bundle_cn.getString(key);
// } if (Constant.LANGUAGE_ZH_CN.equals(language)) {// result = bundle_cn.getString(key);
// } else if (Constant.LANGUAGE_EN_US.equals(language)) {// result = bundle_en.getString(key);
// } else {// result = bundle_tw.getString(key);
// }return result;}public String convertor(String language, String key) {// 如果内存中不存在三个语言包,则将其加载到内存中if (null == bundle_cn || null == bundle_en || null == bundle_tw) {synchronized (ResourceBundle.class) {if (null == bundle_cn) {initResources();}}}String result;if (StringUtils.isEmpty(language)) {result = bundle_cn.getString(key);} else if (Constant.LANGUAGE_ZH_CN.equals(language)) {result = bundle_cn.getString(key);} else if (Constant.LANGUAGE_EN_US.equals(language)) {result = bundle_en.getString(key);} else {result = bundle_tw.getString(key);}return result;}/*** 获取登录用户对象* @return*/private UserVo getUserVo() {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();UserVo vo = CommonUtils.getUserVoFromRequest(request);String ip = CommonUtils.getIp(request);vo.setIp(ip);return vo;}
}
这里使用了springboot去实现的,事先将三种语言包加载到内存中(因为SaaS是很多企业共同使用,可能不同的语言版本的人一起登录平台),使用则可以直接调用即可。
JAVA做语言国际化相关推荐
- vue/uniapp实现语言国际化(中英文切换)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.vue-i18n是什么? 二.使用步骤 1.安装vue-i18n 2.新建文件夹 3.在main.js 中引入 4.在页 ...
- Java中读取属性文件以及做资源国际化
在src下的文件,没写包名 import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBund ...
- Java做服务器开发语言
随着游戏市场的兴起,特别是网页游戏.手机游戏的崛起,对游戏开发技术的需求越来越多.网络游戏开发是一个庞大的体系,总体来说是客户端与服务器端.客户端是玩家接触的游戏图像显示端,服务器是处理游戏运行中的各 ...
- html多语言国际化,gMIS吉密斯i18n多语言国际化更新
gMIS吉密斯 部署和使用范围日益扩大,跨国多语言版本成为迫切需要的功能,早在2018年年中就考虑要增加这一功能--在gMIS吉密斯中实现多语言版本的支持. 以期实现gMIS吉密斯的跨行业.跨地区和国 ...
- Java i18n - Java中的国际化
Java i18n - Java中的国际化 Java或Java i18n的国际化是一个非常重要的特性.Java通过资源包提供国际化(i18n)支持. Java的国际化 为了使您的应用程序支持不同的语言 ...
- JavaWeb之多语言国际化
这周打算把国际化.JDBC和XML学习一下,从下周就开始学习三大框架,再坚持一个半月吧就能入门JavaWeb了,上周周末两天过的真是生不如死,两天坐在家里,醒来就写博客,原本在公司也自己操作了一遍,其 ...
- Android 语言国际化
前言 我们在使用Android手机系统的时候经常在"设置"项里面会提供用户多种系统语言选择,比如:中文.英语-- 大家或许已经发现这些语言显示顺序都是"从左往右" ...
- android语言国际化(最高适配Android31)
android语言国际化适配其实也就那么回事,最主要要考虑适配的问题,sdk17以下和sdk17及以上Configuration配置Locale的方式有所改变,sdk N 及以上API发生了很大的变化 ...
- Java程序的国际化和本地化介绍
IBM : developerWorks 中国网站 : Java : 所有的文章 Java程序的国际化和本地化介绍 邵荣 (youcenter@yahoo.com) 软件工程师, CA有限公司研发中心 ...
最新文章
- easyui 隐藏和显示datagrid
- N叉树的深度 python实现
- NYOJ 30 Gone Fishing(贪心)
- java学习(158):线程的常用方法yield,优先级
- 用户账号管理基本概念
- JDK、Tomcat、Maven配置
- 删除表数据有两种方法及区别
- python的迭代器_python迭代器详解
- 解决:点击鼠标右键无新建选项卡
- java命名规则_java命名规范
- 冷饭热炒:让 Win10/11 也能用上 3D 窗口切换效果
- HearthBuddy卡组
- PLM 产品生命周期管理
- 摆脱客户端?网页发起直播势在必行!
- PostgreSQL服务端监听设置
- 将渲染计算搬到云端,开启低成本、强交互、沉浸式体验
- alooa是华为什么型号_pot alooa是华为什么型号 pot alooa是华为麦芒8(图文)
- jQuery播放音乐
- php 打开word显示无法打开文件,phpword 生成doc文件 特殊符号 无法打开
- word 中Visio画的图 如何修改?图片排列
热门文章
- qt中的QNetwork的通信的使用
- Vista中运行软件的兼容性测试(转)
- in语句作用C语言,C语言中IN(ch,OP)是什么意思
- 关于华为交换机bpdu enable. ntdp enable. ndp enable解析
- 8点1氪|苹果第一财季营收843亿美元;VIPKID拟融资4-5亿美元;工信部称5G终端将于年中推出...
- 计算机二级Python真题(七)
- Android之高仿QQ6.6.0侧滑效果(背景动画、透明+沉浸式状态栏、渐变效果)
- 编写一个学生类(Students),包括姓名(name)、性别(sex)、学号(num)、语文课(Chinese)、英语课(English)、 //数学课(Math)和平均值(avg),方法包括求三门
- Apache shiro 官方API (中文版)(承蒙大佬们看重 小弟整理了下 无需积分 编辑的不好 希望帮到你们)
- Win 10系统安装3ds max 2014