先回顾一下经典的I18N,

message_zh.properties

our.company=\u9999\u6E2F\u5BBD\u9891
our.target=\u6210\u5C31\u9999\u6E2F\u66F4\u7F8E\u597D\u5BB6\u56ED

用spring MVC的话,JSP上这样写 (烦人spring 的config 省略)

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
…
<label><spring:message code='our.company'/></label>
<label><spring:message code='our.target'/></label>
…

过了两天老板叫你把上面“美好”改成“幸福”,要查找和修改\uXXXX的内容,OMG,头大了有木有。即使有I18N的工具,导来导去的也不方便。究其原因是因为Java的I18N,用到了类Properties,Properties以iso8859-1编码读文件,各种语言都要转成\uXXXX这种不方便人直接阅读编码。

这都是十几年前的方案了,早就该改进了。幸好我们有伟大的UTF-8,使用UTF-8的文件,我们和Java都能读懂。让我们开始新的旅程:

1. 写资源文件

msg_zh.prop (使用.prop文件是为了不让eclipse把文件内容转成\uXXXX的格式)

our_company=香港宽频
our_target=成就香港更美好家园

将文件以utf-8编码存盘,明文保存就可以了,方便查看修改,放在classpath里面便于加载。注意,key里面不能用’.’,要使用java变量名的命名规则,即字母和下划线。

2. 加载资源

既然不能使用Properties来加载,我们就自己写一个资源加载类

public class MsgUtil {private static Logger log = Logger.getLogger(MsgUtil.class);private static Map<String, String> msgZh = new HashMap<String, String>();private static Map<String, String> msgEn = new HashMap<String, String>();static {try {loadProp(msgZh, "/resource/i18n/msg_zh.prop");loadProp(msgEn, "/resource/i18n/msg_en.prop");} catch (Exception e) {log.error("MsgUtil init error.", e);}}private static void loadProp(Map<String, String> p, String cpFile) throws IOException {BufferedReader br = null;try {br = new BufferedReader(new InputStreamReader(MsgUtil.class.getResourceAsStream(cpFile), "utf-8"));String line, key, value;int pos;while ((line=br.readLine()) != null) {if (line.startsWith("#")) continue;pos = line.indexOf('=');if (pos > 0) {key = line.substring(0, pos);value = line.substring(pos + 1);p.put(key.trim(), value.trim());}}} finally {if (br != null) br.close();}}public static String getString(String key){return getString(key, getLocale());}public static String getString(String key, String locale) {if (key != null && locale != null) {return getProp(locale).get(key);} else {LogUtil.error("Key="+key+", lang="+locale);}return "!"+key+"!";}public static Map<String, String> getProp(String locale) {return K.en.equals(locale) ? msgEn : msgZh;}
}

使用utf-8读入资源文件。由于我平常遇到的情况比较简单,只有中、英文,写这样一个Util类就够用了。如果大家有兴趣可以写个I18nBundle来代替Java自带的ResourceBundle。(如果呼声高,我也可以动手)。

3. 获取locale

经典的方法是从Request header中获取locale,但我们的情况不需要这么上纲上线。先给一个缺省的中文locale(zh),然后把它记在session和cookie中,如果用户不爱看,就把它改成英文locale(en),当然要更新session和cookie

4. 将资源应用到jsp中

前方高能!请注意!!

先加一个拦截器,以spring MVC为例 (写一般的filter也可以)

public class GlobalInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse res,Object arg2) throws Exception {request.setAttribute("i18n", MsgUtil.getProp(getLocale()));…return true;}…
}

看好了,每个request都加了一个“i18n”的bean,这样在jsp里面用就爽了。

…
<label>${i18n.our_company}</label>
<label>${i18n.our_target}</label>
…

在Java code里面用也很简单,

MsgUtil.getString(“our_company”);
MsgUtil.getString(“our_target”, getLocale());
…

如果要带参数,可以研究一下java.text.MessageFormat

转载于:https://blog.51cto.com/wikiou/1836304

不需要转编码的I18N相关推荐

  1. js java 中文乱码_编码问题(.java/.jsp/.js等文件的中文乱码)

    乱码的出现是因为编码与解码的不一致造成的,假如你对"中文"两个字进行了gbk格式的保存,却用utf-8格式的解读,是肯定会出现乱码的. 如何避免中文乱码:应用上下统一用一种编码格式 ...

  2. msysGit 中文环境配置及跨平台开发注意事项

    2019独角兽企业重金招聘Python工程师标准>>> 注:因从 Git V1.7.10 开始引入了 Unicode 支持,所以在此版本之前会出现的乱码问题可能在之后的版本则不需要设 ...

  3. springBoot员工管理系统

    员工管理系统 1.准备工作 静态资源:链接:https://pan.baidu.com/s/1qtUDuJNVupr872kVDO-veg 提取码:fabo gitee:https://gitee.c ...

  4. springboot-员工管理系统

    springboot-员工管理系统 前言 准备工作 实体类pojo 实现类 静态资源 首页实现 页面国际化 Idea编码设置 i18n i18n配置 国际化识别 配置springboot配置文件 使用 ...

  5. 二、Git安装与配置

    1.Linux下安装Git Git诞生于Linux平台并作为版本控制系统率先服务于Linux核心,因此在Linux安装Git是非常方便的.可以通过不同的方法在Linux上安装Git 安装Git的两种方 ...

  6. java设置中文语言编码_-GWA2 Java版本的i18n/中文编码/乱码问题

    本篇问题域被定义为 -GWA2 (-吉娃兔)的 -Java 版本的多语言的编码/乱码问题,也包括中文的编码和乱码问题.当然,也具有普遍意义,包括所有Java/JSP应用的中文编码.乱码问题. 这次距离 ...

  7. ubuntu如何修改字符集编码

    系统支持编码的修改如下: 1. 使用如下命令查看系统支持的字符集cat /usr/share/i18n/SUPPORTED说明:查看系统支持的字符集,你需要注意的是支持字符集的格式,如对中文会有以下一 ...

  8. 程序员趣味读物:谈谈Unicode编码

    2019独角兽企业重金招聘Python工程师标准>>> 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级.整 ...

  9. springboot国际化i18n

    springboot国际化 支持多国语言展示 1.自动式国际化:通过浏览器发送请求头携带的信息自动使用国际化 2.手动式国际化:通过点击按钮,动态更改国际化 由于springboot自动配置中已集成国 ...

最新文章

  1. 25 年汽车技术老兵亲述,自动驾驶新驶向
  2. 第四十章:基于SpringBoot Quartz完成定时任务分布式多节点负载持久化
  3. WPF控件自定义样式(FasControls)
  4. flutter PageView上下滑动切换视图
  5. 阿里影业正式成为阿里集团子公司 俞永福辞任执行董事
  6. linux离线语音识别安装运行总结
  7. iOS基础 - UIScrollView
  8. 初级程序员如何写项目周报和月报
  9. C4D插件X-Particles粒子特效(五)
  10. P5339 [TJOI2019]唱、跳、rap和篮球
  11. 组装密度io/cm_组装领域:什么是正确的组装/图书馆数量?
  12. mysql 多字段,多条件查找
  13. 数据可视化之汽车销量,截止到2022年目前中国汽车保有量是3.02亿辆
  14. winrar中文去广告版下载
  15. python timer详解_python线程定时器Timer实现原理解析
  16. python 计算加班时间_如何利用python快速统计出全公司的员工加班天数
  17. android设备外接键盘实现监听事件
  18. 通向架构师的道路(第二十六天)漫谈架构与设计文档的写作技巧
  19. 2019年总结回顾 ~ 开心!评上CSDN博客专家-100篇博文回顾人工智能的前行之路!
  20. 《人物》:计算机世界第一人——艾兰·图灵(转贴)

热门文章

  1. 如何构建一个完整的To B应用开发平台
  2. dashboard添加公网接口配置流程、网卡修改默认路由流程【我这系公有云】
  3. 求100以内素数的方法(筛选法,穷举法,穷举法优化)
  4. 一文读懂HD Wallet以及BIP32、BIP39、BIP43、BIP44
  5. 将UEditor的图片批量上传抠出来单独使用
  6. 最简单的slob实现
  7. nodejs中的buffer的用法
  8. 前端基础之《Bootstrap(2)—全局CSS样式_栅格系统》
  9. 实践篇——学习英语(第二阶段)Upping the Ante(共四个阶段)
  10. 赋值运算符、算数运算符