Spring 国际化 MessageSource
假设我们正在开发一个支持多国语言的Web应用程序,要求系统能够根据客户端的系统的语言类型返回对应的界面:英文的操作系统返回英文界面,而中文的操作系统则返回中文界面——这便是典型的i18n国际化问题。对于有国际化要求的应用系统,我们不能简单地采用硬编码的方式编写用户界面信息、报错信息等内容,而必须为这些需要国际化的信息进行特殊处理。简单来说,就是为每种语言提供一套相应的资源文件,并以规范化命名的方式保存在特定的目录中,由系统自动根据客户端语言选择适合的资源文件。
一、基础知识
概念
“国际化信息”也称为“本地化信息”,一般需要两个条件才可以确定一个特定类型的本地化信息,它们分别是“语言类型”和“国家/地区的类型”。如中文本地化信息既有中国大陆地区的中文,又有中国台湾、中国香港地区的中文,还有新加坡地区的中文。
【部分国际化代码】
ar_sa 阿拉伯语(沙特阿拉伯)
ar_iq 阿拉伯语(伊拉克)
eu 巴斯克语
bg 保加利亚语
zh_tw 中文(中国台湾)
zh_cn 中文(中华人民共和国)
zh_hk 中文(中国香港特别行政区)
zh_sg 中文(新加坡)
hr 克罗地亚语
en 英语
en_us 英语(美国)
en_gb 英语(英国)
en_au 英语(澳大利亚)
en_ca 英语(加拿大)
JDK中的国际化API
Java通过java.util.Locale类表示一个本地化对象,它允许通过语言参数和国家/地区参数创建一个确定的本地化对象。
Locale locale=new Locale("zh","cn");//中文,中国
Locale locale2=new Locale("en","us");//英文,美国
Locale locale3=new Locale("zh");//中文--不指定国家
Locale locale4=Locale.CHINA;//中文,中国
Locale locale5=Locale.CHINESE;//中文
支持国家化的JDK类NumberFormat、DateFormat、MessageFormat
【NumberFormat】可以处理数字,百分数,货币等。下面以货币为例:
Locale locale=new Locale("zh","cn");//中文,中国
NumberFormat format=NumberFormat.getCurrencyInstance(locale);
System.out.println(format.format(12.34));
Locale locale2 =new Locale("en","us");//英文,美国
NumberFormat format2=NumberFormat.getCurrencyInstance(locale2);
System.out.println(format2.format(13.45));
//输出
//¥12.34
//$13.45
【DateFormat】 通过DateFormat#getDateInstance(int style,Locale locale)方法按本地化的方式对日期进行格式化操作。该方法第一个入参为时间样式,第二个入参为本地化对象
Locale locale=new Locale("zh","cn");//中文,中国
DateFormat dateFormat =DateFormat.getDateInstance(DateFormat.YEAR_FIELD,locale) ;
System.out.println(dateFormat.format(new Date()));
//2016年6月20日
【MessageFormat】在NumberFormat和DateFormat的基础上提供了强大的占位符字符串的格式化功能,它支持时间、货币、数字以及对象属性的格式化操作。
简单的占位符替换:
String str1 = "{0},你好!你于{1}在农业银行存入{2} 元。";
String result = MessageFormat.format(str1, "小明", new Date(), 1245.12);
System.out.println(result);
//小明,你好!你于16-6-20 下午6:29在农业银行存入1,245.12 元。
占位符指定数据类型和格式化类型:
String str1 = "{0},你好!你于{1,date,long}在农业银行存入{2,number, currency}。";
MessageFormat format = new MessageFormat(str1, Locale.CHINA);
Object[] o = {"小红", new Date(), 1313};
System.out.println(format.format(o));
//小红,你好!你于2016年6月20日在农业银行存入¥1,313.00 。
加载资源文件
资源文件的命名规范如下
资源名_语言代码_国/地区代码.properties
举一个例子:假设资源名为msg,则语言为英文,国家为美国,则与其对应的本地化资源文件命名为msg_en_US.properties。
name=Xiaoming
description=He is 19
如果对应语言为中文,文件则命名为resource_zh_ CN.properties。资源文件对文件内容有严格的要求:只能包含ASCII字符,所以必须将非ASCII字符的内容转换为Unicode代码的表示方式。 资源文件内容如下:
#小明
name=\u5c0f\u660e
#他十九岁了
description=\u4ed6\u5341\u4e5d\u5c81\u4e86
Java为我们提供了用于加载本地化资源文件的方便类java.util.ResourceBoundle。
ResourceBoundle为加载及访问资源文件提供便捷的操作,下面的语句从相对于类路径的目录中加载一个名为msg的本地化资源文件:
//加载msg_zh_cn.properties
ResourceBundle bundle = ResourceBundle.getBundle("com/jazz/msg", Locale.CHINA);
System.out.println(bundle.getString("name"));
System.out.println(bundle.getString("description"));
//加载msg_en_us.properties
ResourceBundle bundle2 = ResourceBundle.getBundle("com/jazz/msg", Locale.US);
System.out.println(bundle2.getString("name"));
System.out.println(bundle2.getString("description"));
//=========输出============
小明
他十九岁了
Xiaoming
He is 19
在上面的资源文件中,属性值都是一般的字符串,它们不能结合运行时的动态参数构造出灵活的信息,而这种需求是很常见的。要解决这个问题很简单,只须使用带占位符的格式化串作为资源文件的属性值并结合使用MessageFormat就可以满足要求了。
二、MessageSource
接口定义:
public interface MessageSource {
//code表示国际化资源中的属性名;args用于传递格式化串占位符所用的运行期参数;//当在资源找不到对应属性名时,返回defaultMessage参数所指定的默认信息;//locale表示本地化对象;String getMessage(String code, Object[] args, String defaultMessage, Locale locale);//与上面的方法类似,只不过在找不到资源中对应的属性名时,//直接抛出NoSuchMessageException异常;String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException;//将属性名、参数数组以及默认信息封装起来,它的功能和第一个接口方法相同。String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;
http://www.taodudu.cc/news/show-1232644.html
相关文章:
- Spring Batch 使用指南
- 能使Oracle索引失效的六大限制条件
- MYSQL DELETE 别名
- Java 方法使用final 修饰参数的作用
- MYSQL 数据库怎样快速的复制表以及表中的数据
- 设计模式 责任链模式
- Redis4.0.13 安装踩雷记录
- elasticsearch-5.6.12 单点安装包括 HEAD插件安装
- Log4j、Log4j 2、JUL、JCL 、SFL4J 、Logback 与 Lombok 的使用
- 1071 - Specified key was too long; max key length is 767 bytes
- idea git 密码修改
- idea 编译 maven 项目
- Jrebel 激活方式
- linux maven安装
- yum install git Could not resolve host: ftp.twaren.net; Unknown error
- linux vim (your system doesn't appear to have the zip pgm)
- centos 搭建Jenkins
- Linux shell脚本启动 停止 重启jar包
- Linux中执行shell脚本的5种方法总结
- linux nginx 安装
- 0914-npm EACCES: permission denied权限问题官网终极解决办法
- npm install Saving to file: /root/.jenkins/workspace/ems-web/node_modules/chromedriver/2
- Jenkins时区设置为北京时间
- rpm安装与yum安装的区别与特点
- JDK时区与电脑系统时区不一致,导致时间new date不对
- vue+axios方法封装(restful,ajax)
- FTP安装及用户及权限配置
- linux 免密安装
- JAVA 正则表达式 RegexUtil
- Beyond Compare 4
Spring 国际化 MessageSource相关推荐
- springboot+jsp中文乱码_【spring 国际化】springMVC、springboot国际化处理详解
在web开发中我们常常会遇到国际化语言处理问题,那么如何来做到国际化呢? 你能get的知识点? 使用springgmvc与thymeleaf进行国际化处理. 使用springgmvc与jsp进行国际化 ...
- Spring入门到放弃篇(1)- Spring国际化
Java原生国际化 文档地址 java官方文档 参考官方文档 自定义国际化案例 public class LocaleDemo {public static void main(String[] ar ...
- 从零开始学习springmvc(5)——Spring国际化和全局异常处理
[项目地址] 从零开始学习springmvc 如果觉得有用可以关注一下公众号:码字不易,求赞求关注 五.Spring国际化和全局异常处理 五.Spring国际化和全局异常处理 5.1 国际化介绍 5. ...
- 关于Spring 国际化 No message found under code 的解决方案
关于Spring 国际化 No message found under code 的解决方案 参考文章: (1)关于Spring 国际化 No message found under code 的解决 ...
- Spring 国际化中文乱码的解决方法
Spring 国际化中文乱码的解决方法 出现问题: 引用国际化文件,在tomcat,页面设置,编译器,post请求等都设置utf-8的情况下,页面打印出现乱码 解决方法: 在spring.xml文件加 ...
- Spring 国际化例子
建立一个描述message的XML文件,名为spring.xml &l ...
- spring 国际化-i18n
i18n(其 来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是"国际化"的简称.在资讯领域,国际化(i18n)指让产品(出版 物,软 ...
- spring中MessageSource的配置使用方法3--ResourceBundleMessageSource
ApplicationContext接口扩展了MessageSource接口,因而提供了消息处理的功能(i18n或者国际化).与HierarchicalMessageSource一起使用,它还能够处理 ...
- # 前后端国际化多语言配置
前后端国际化多语言配置 前端(Vue ElementUI) 项目前端使用Vue+Elementui 编写 i18n.js 在这个js 中引入ElementUI的多语言资源,引入本地的多语言资源 // ...
最新文章
- Python编写循环的两个建议 | 鹅厂实战
- android应用程序的混淆打包
- Mybatis和Spring整合
- c 语言 字符 宏 枚举,从C宏创建字符串列表和枚举列表
- WCF部署到IIS异常(详细: 不能加载类型System.ServiceModel.Activation.HttpModule )
- html树状图右侧_如何在 Tableau 中创建控制图?
- maven插件之build-helper-maven-plugin
- stm32温度控制按键_干货 | STM32常用功能介绍
- 支付宝支付-支付宝PC端扫码支付
- linux c++连接mysql示例
- 腾讯云成为国内首家FinOps基金会顶级会员
- 请写一个函数,实现以下功能: 字符串“open_door” 转换成 “OpenDoor”、”make_by_id” 转换成 ”MakeById”...
- 斥候密报_斥候密报《最强王者》三国幕后巾帼之黄月英_吉吉建站手游网
- 独生子女证每月增加3%的退休金,但丢了怎么办?
- 使用kepware配置opcua服务端,并使用UaExpert作为opc客户端进行连接(匿名和用户名密码)
- (21)tar打包命令详解
- 人脸识别(Face Recognition)简要综述
- 常用时序数据地址 MTGNN
- 2021漳州一中历年高考成绩查询,2021年漳州中考录取分数线,历年漳州各高中录取分数线排名...
- 素数个数求解与素数的判定
热门文章
- python判断密码是否正确三次机会_python密码错误三次锁定(实例讲解)
- MacOS 安装PHP5.6
- AutoMapper使用
- [LeetCode] 234. Palindrome Linked List_Easy tag: Linked List
- 2.9 while循环
- Oracle中的单行函数
- 33. 高精度练习之乘法
- 朝花夕拾-4-shell
- Asp.net在线备份、压缩和修复Access数据库
- DeOccNet:国防科大提出阵列相机去除前景遮挡成像新方法