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 之国际化的更多相关文章

  1. Java Web 学习(4) —— Spring MVC 概览

    Spring MVC 概览 一. Spring MVC Spring MVC 是一个包含了 Dispatcher Servlet 的 MVC 框架. Dispatcher Servlet 实现了 : ...

  2. Java Web 学习(8) —— Spring MVC 之文件上传与下载

    Spring MVC 之文件上传与下载 上传文件 表单: <form action="upload" enctype="multipart/form-data&qu ...

  3. Java Web 学习(6) —— Spring MVC 之校验器

    Spring MVC 之校验器 数据验证 一个典型的 Spring MVC 应用会同时应用到 formatters/converters 和 validators. 在调用 controller 期间 ...

  4. Java Web 学习(5) —— Spring MVC 之数据绑定

    Spring MVC 之数据绑定 数据绑定是将用户输入绑定到领域模型的一种特性. Http 请求传递的数据为 String 类型,通过数据绑定,可以将数据填充为不同类型的对象属性. 基本类型绑定 @R ...

  5. Java Web系列:Spring MVC基础

    1.Web MVC基础 MVC的本质是表现层模式,我们以视图模型为中心,将视图和控制器分离出来.就如同分层模式一样,我们以业务逻辑为中心,把表现层和数据访问层代码分离出来是一样的方法.框架只能在技术层 ...

  6. 【Java Web开发学习】Spring MVC 使用HTTP信息转换器

    [Java Web开发学习]Spring MVC 使用HTTP信息转换器 转载:https://www.cnblogs.com/yangchongxing/p/10186429.html @Respo ...

  7. 【Java Web开发学习】Spring MVC添加自定义Servlet、Filter、Listener

    [Java Web开发学习]Spring MVC添加自定义Servlet.Filter.Listener 转载:https://www.cnblogs.com/yangchongxing/p/9968 ...

  8. 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor

    [Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...

  9. 【Java Web开发学习】Spring MVC文件上传

    [Java Web开发学习]Spring MVC文件上传 转载:https://www.cnblogs.com/yangchongxing/p/9290489.html 文件上传有两种实现方式,都比较 ...

随机推荐

  1. Image 鼠标拖拽与鼠标中键的缩放

    一.Image在窗体上拖拽,势必会用到鼠标的三个事件(MouseDown,MouseUp,MouseMove),以左键为例,PictureBox为载体 Point mouseDownPoint = n ...

  2. 小程序封装request请求,统一API

    程序开发中都会调用后端工程师开发的API,小程序的开发文档提供了相对实用的APIwx.request(),但是在开发的过程中,又遇到了一些问题,在小程序的项目开发时,调用的API不止一个,同一个API ...

  3. SAP IDOC 通过采购订单输出消息生成销售订单

    题记: 在网络上看到一篇类似的公众号文章,叫<通过IDoc逐步指导PO&SO集成>,个人觉得整个配置过程中还是少了一些重点配置,也少了说明整个功能的核心逻辑,那么,趁着这个机会,就 ...

  4. Android 网络交互之移动端与服务端的加密处理

    在开发项目的网络模块时,我们为了保证客户端(Client)和服务端(Server)之间的通信安全,我们会对数据进行加密. 谈到网络通信加密,我们可以说出:对称加密,非对称加密,md5单向加密,也能提到 ...

  5. 五种团队的组织方式落地 DevOps

    原文链接:https://blog.matthewskelton.net/2013/10/22/what-team-structure-is-right-for-devops-to-flourish/ ...

  6. Iris入门操练1

    选一个框架,慢慢熟悉··· 按官网文档,先走一次.. package main import ( "github.com/kataras/iris/v12" "githu ...

  7. python进程基础点整理

    操作系统 串行: 一个程序完完整整的执行完再执行下一个 并发: 看起来像是同时运行,其实就是程序间的切换频率比较快,看不出来 并行:真正的同时运行 多道技术 空间复用:共用一个内存条,多个进程相互隔离 ...

  8. 使用vue-cli创建工程的时候提示vue-cli Failed to download repo vuejs-templates/webpack-simple:self signed certificate in certificate chain的解决方法

    最近在使用 vue-cli 脚手架创建项目的时候,遇到 webpack-simple 模板下载不成功的情况,提示 vue-cli Failed to download repo vuejs-templ ...

  9. git worktree 使用笔记

    一 worktree 的基本概念和操作 再也不用克隆多个仓库啦!git worktree 一个 git 仓库可以连接多个工作目录 - walterlv的专栏 - CSDN博客 再也不用克隆多个仓库啦! ...

  10. WPF TreeView 虚拟化-设置滚动到选中项

    前言 列表滚动到具体的数据项? ListBox提供了简易快捷的滚动定位函数ScrollIntoView. TreeView树状结构列表,则没有此类方法,无法与ListBox一样,直接设置滚动到具体的数 ...