国际化(internationalization)是设计容易适应不同区域要求的产品的一种方式。它要求从产品中抽离所有地域语言元素。换言之,应用程序的功能和代码设计考虑了在不同地区运行的需要。开发这样的程序的过程,就称为国际化。
那么当我们使用Spring Boot如何进行国际化呢?我们用一个例子来演示操作的步骤:
1、我们写一个thymeleaf模板
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8" /><title>hello spring boot</title>
</head>
<body><p>欢迎你登录到ybzy.ke.qq.com我的课程分享网站</p></body>
</html>
2、写出对应的controller类
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class HelloController {@RequestMapping("/hello")public String hello(){return "/hello";}}
我们观察hello.html里面的信息直接就是中文显示,但是我们现在的需求是当访问语言是zh的时候显示为中文,当语言为en的时候显示为英文,那么怎么操作呢?
首先我们先定义国际化资源文件,spring boot默认就支持国际化的,而且不需要你过多的做什么配置,只需要在resources/这个根路径下定义国际化配置文件,文件名称必须以messages开头。
注意:配置文件的名字和存放的位置SpringBoot的内部代码里默认的就是messages和classpath,当然我们可以在配置文件中配置spring.messages.basename的值来改变这两个东西。
我们先用默认的配置定义如下几个文件:
messages.properties (默认,当找不到语言的配置的时候,使用该文件进行展示)。
messages.properties (默认,当找不到语言的配置的时候,使用该文件进行展示)。
messages_zh_CN.properties(中文)
messages_en_US.properties(英文)
分别写上内容:
welcome = 欢迎你登录到 ybzy.ke.qq.com 我的课程分析网站(default)
welcome = \u6b22\u8fce\u4f60\u767b\u5f55\u5230 \u963f\u91cc\u5df4\u5df4 \u7f51\u7ad9\uff08\u4e2d\u6587\uff09
welcome = welcome to login to ybzy.ke.qq.com website(English)
配置信息完毕后,那么在前端展示怎么修改呢,修改hello.html文件,使用#{key}的方式进行使用messages中的字段信息:
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8" /><title>hello spring boot</title>
</head>
<body><p><label th:text="#{welcome}"></label></p>
</body>
</html>
修改火狐浏览器的国际化信息,看测试效果:
about:config
在搜索框输入accept,然后找到intl.accept_languages修改对应的值,我这里原本是:
zh-CN, zh, zh-TW, zh-HK, en-US, en
为了看到效果,修改为:
en-us, en
通过三个问题,简单说下原理:
第一个问题,为什么命名必须是messages开头,需要看一个源码文件:MessageSourceAutoConfiguration
如果我们没有在application.properties中配置spring.messages.basename属性,那么使用默认的messages,好了这个问题就这么简单解决了。
第二个问题:为什么我看到的是中文(或者英文)呢?
为了让web应用程序支持国际化,必须识别每个用户的首选区域,并根据这个区域显示内容。在Spring MVC应用程序中,用户的区域是通过区域解析器来识别的,它必须是实现LocaleResolver接口。Spring MVC提供了几个LocaleResolver实现,让你可以按照不同的条件来解析区域。除此之外,你还可以实现这个接口创建自己的区域解析器。如果没有做特殊的处理的话,Spring 采用的默认区域解析器是AcceptHeaderLocaleResolver。它通过检验HTTP请求的头部信息accept-language来解析区域。这个头部是由用户的web浏览器底层根据底层操作系统的区域设置进行设定的。请注意,这个区域解析器无法改变用户的区域,因为它无法修改用户操作系统的区域设置。
第三个问题:怎么根据我们的需要切换语言环境呢?
我们可以自定义我们的区域解析器LocaleResolver,然后将它注册到spring的ioc容器中。