Java Web 学习(7) —— Spring MVC 之国际化
Spring MVC 之国际化
i18n 与 l10n
internationalization:国际化,以 i 开头,以 n 结尾,中间 18 个字母,简称 i18n。
localization:本地化,以 l 开头,以 n 结尾,中间 10 个字母,简称 l10n。
语言区域
java.util.Local表示一个语言区域。有 3 个元素:String language(语言), String country(国家), String variant(方言)。
- language:ISO 语言代号,如:
zh汉语,en英语,es西班牙语。 - country:ISO 国家代号,如:
CN中国,CA加拿大,US美国。 - variant:操作系统,浏览器以及其他软件供应商可用这个代号来提供附加的功能或者达到语言和国家代号所不能实现的定制,两个
variant间以下划线分开,且重要的放在最前。
public Locale(String language, String country, String variant) {
// ...
}
public Locale(String language, String country) {
this(language, country, "");
}
public Locale(String language) {
this(language, "", "");
}
Spring MVC 国际化
1. 将文本组件隔离成属性文件
Properties 继承 Hashtable,表示持久的属性集。
英语属性文件:
greetings = Hello
farewell = Goodbye
汉语属性文件:
greetings = \u4f60\u597d
farewell = \u518d\u89c1
命名方式为:基准名_语言代码_国家代码,即:message_en_US.properties,message_zh_CN.propertie。默认文件为:message.properties
2. 选择和读取正确的属性文件
Java 中使用ResourceBundle解决国际化问题,ResourceBundle是一个抽象类,通过调用静态方法来获得实例。
public static ResourceBundle getBundle(java. lang. String baseName)
public static ResourceBundle getBundle(java. lang. String baseName, Locale locale)
Spring MVC 中,不直接使用ResourceBundle,而是配置messageSource bean
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="cacheSeconds" value="10"></property>
<property name="basenames">
<list>
<!-- 属性文件位置 -->
<value>/WEB-INF/resources/message</value>
</list>
</property>
</bean>
以上配置以ReloadableResourceBundleMessageSource作为实现,也可以使用ResourceBundleMessageSource。
区别:
- 使用 ResourceBundleMessageSource,修改属性文件后,必须先重启 JVM。而 ReloadableResourceBundleMessageSource 可通过配置
cacheSeconds重新加载。 - 使用 ReloadableResourceBundleMessageSource,是在应用程序目录下搜索这些属性文件。而 ResourceBundleMessageSource,属性文件则必须放在类路径下,即 WEB-INF/class目录下。
选择语言区域
获取语言区域的方式:
- 读取浏览器 accept-language 标题值
- 读取 session
- 读取 cookie
相应地,Spring MVC 语言区域解析器 bean 的实现:
- AcceptHeaderLocaleResolver
- SessionLocaleResolver
- CookieLocaleResolver
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver"></bean>
显示页面
通过 Spring 的 message 标签显示本地化信息。
<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<spring:message code="greetings"/>
注意:如显示中文,JSP页面编码和属性文件编码应为"UTF-8"
参考资料:《Spring MVC 学习指南》 Paul Deck 著
Java Web 学习(7) —— Spring MVC 之国际化的更多相关文章
- Java Web 学习(4) —— Spring MVC 概览
Spring MVC 概览 一. Spring MVC Spring MVC 是一个包含了 Dispatcher Servlet 的 MVC 框架. Dispatcher Servlet 实现了 : ...
- Java Web 学习(8) —— Spring MVC 之文件上传与下载
Spring MVC 之文件上传与下载 上传文件 表单: <form action="upload" enctype="multipart/form-data&qu ...
- Java Web 学习(6) —— Spring MVC 之校验器
Spring MVC 之校验器 数据验证 一个典型的 Spring MVC 应用会同时应用到 formatters/converters 和 validators. 在调用 controller 期间 ...
- Java Web 学习(5) —— Spring MVC 之数据绑定
Spring MVC 之数据绑定 数据绑定是将用户输入绑定到领域模型的一种特性. Http 请求传递的数据为 String 类型,通过数据绑定,可以将数据填充为不同类型的对象属性. 基本类型绑定 @R ...
- Java Web系列:Spring MVC基础
1.Web MVC基础 MVC的本质是表现层模式,我们以视图模型为中心,将视图和控制器分离出来.就如同分层模式一样,我们以业务逻辑为中心,把表现层和数据访问层代码分离出来是一样的方法.框架只能在技术层 ...
- 【Java Web开发学习】Spring MVC 使用HTTP信息转换器
[Java Web开发学习]Spring MVC 使用HTTP信息转换器 转载:https://www.cnblogs.com/yangchongxing/p/10186429.html @Respo ...
- 【Java Web开发学习】Spring MVC添加自定义Servlet、Filter、Listener
[Java Web开发学习]Spring MVC添加自定义Servlet.Filter.Listener 转载:https://www.cnblogs.com/yangchongxing/p/9968 ...
- 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor
[Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...
- 【Java Web开发学习】Spring MVC文件上传
[Java Web开发学习]Spring MVC文件上传 转载:https://www.cnblogs.com/yangchongxing/p/9290489.html 文件上传有两种实现方式,都比较 ...
随机推荐
- JS基础语法---Array对象的方法
Array对象的方法 Array.isArray(对象)---->判断这个对象是不是数组 instanceof关键字 判断对象是不是数组类型:两种方法: //1 instanceof var ...
- AlertDialog创建对话框的测试
AlertDialog的功能是非常强大的,它可以创建各种对话框,它的结构分为:图标区.标题区.内容区.按钮区共四个区域.以这样的思路区创建AlertDialog是非常简单的. 创建AlertDialo ...
- Android 极光IM-高级篇-玩聊天app诞生
距离上一次写 基础篇有了4个月,终于我写了一个 功能完善的即时通讯app,作为高级篇的担当出现.废话不多说,上图 app预览 实现功能 1.用户的登录注册 2.单聊,能清空聊 ...
- 一次在CentOS系统单用户模式下使用passwd命令破密失败的案例
某次遇到需要进入系统的单用户模式进行破密操作,结果却显示如下: 根据提示:Permission denied(缺少权限) 此时查看/usr/bin/passwd 权限: 正常情况下的权限应该是如下: ...
- python实现fibonacci数列的三种方法
第一种:递归法 def fibo(n): if n < 3: return 1 return fibo(n-1) + fibo(n-2) print(fibo(6)) 第二种:循环 def fi ...
- A:linux基础章节导航
本章的内容主要有: 模板机的安装 常用的小命令 find awk vim sed
- 剑指Offer-42.和为S的两个数字(C++/Java)
题目: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 分析: ...
- 阿里钉钉技术分享:企业级IM王者——钉钉在后端架构上的过人之处
本文引用了唐小智发表于InfoQ公众号上的“钉钉企业级IM存储架构创新之道”一文的部分内容,收录时有改动,感谢原作者的无私分享. 1.引言 业界的 IM 产品在功能上同质化较高,而企业级的 IM 产品 ...
- 使用python - selenium模拟登陆b站
思路 输入用户名密码点击登陆 获取验证码的原始图片与有缺口的图片 找出两张图片的缺口起始处 拖动碎片 功能代码段 # 使用到的库 from selenium import webdriver from ...
- LeetCode 49: 字母异位词分组 Group Anagrams
LeetCode 49: 字母异位词分组 Group Anagrams 题目: 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. Given an array o ...