国际化(Internationalization 简称 I18n,其中“I”和“n”分别为首末字符,18 则为中间的字符数)是指软件开发时应该具备支持多种语言和地区的功能。
换句话说,软件应该能够同时应对多个不同国家和地区用户的访问,并根据用户地区和语言习惯,提供相应的、符合用具阅读习惯的页面和数据。例如,为中国用户提供汉语界面显示,为美国用户提供提供英语界面显示。
本节我们以 Thymemeaf 为例,演示下如何在 Spring MVC 项目中实现国际化。
在 Spring 项目中实现国际化,通常需要以下 4 步:
- Spring MVC 配置文件进行配置;
- 编写国际化资源(配置)文件;
- 在页面中获取国际化内容;
- 编写控制器方法手动切换语言。
- 配置 Spring MVC 的配置文件
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames" value="messages"></property>
<property name="defaultEncoding" value="UTF-8"></property>
<property name="cacheSeconds" value="0"></property>
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="en_US"/>
</bean>
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang"></property>
</bean>
</mvc:interceptors>
以上个配置说明如下:
ResourceBundleMessageSource:对资源文件中设置的内容进行绑定;
LocaleChangeInterceptor:用于获取请求中的国际化信息并将其转换为 Locale 对象,以获取 LocaleResolver 对象对国际化资源文件进行解析。
SessionLocaleResolver:将将包含了国际化信息的 Locale 对象存储在 Session 中,供后续页面继续使用。
2. 编写国际化资源文件
在 Spring MVC 工程的类路径下创建国际化资源文件,文件名格式为:基本名_语言代码_国家或地区代码,例如 messages_en_US.properties、messages_zh_CN.properties。
在国际化资源文件中,我们需要对不同语言环境下需要进行国际化的各个字段进行配置,示例代码如下。
messages_en_US.properties 代码如下:
userName=userName
password=password
messages_zh_CN.properties 代码如下:
userName=用户名
password=密码
需要注意的是,这国际化资源文件名称必须严格按照其命名格式进行命名,否则解析时会出错。其次,国际化资源文件在创建完成后,这些文件通常会自动归档(Resouce Bundle),而该目录并非我们手动创建,如下所示。
- resources
- Resouce Bundle 'messages'
- messages_en_US.properties
- messages_zh_CN.properties
- 在页面中获取国际化内容
在完成以上配置后,我们只要在 Thymeleaf 代码中获取指定的字段即可,示例代码如下。
<h2 th:text="#{userName}"></h2>
<h2 th:text="#{password}"></h2>
- 手动切换语言环境
我们可以在控制器类中编写一个控制器方法,手动切国际化的语言环境。
- 在前端页面中添加切换语言环境的超链接,示例代码如下。
<a th:href="@{/localeChange(lang=en_US)}">英文</a>
<a th:href="@{/localeChange(lang=zh_CN)}">中文</a>
- 在控制器类中添加一个切换或计划语言环境的控制器方法,示例代码如下。
@Controller
public class TestController {
@Resource
private ResourceBundleMessageSource messageSource;
//切换语言环境
@RequestMapping("/localeChange")
public String localeChange(Locale locale) {
String userName = messageSource.getMessage("userName", null, locale);
String password = messageSource.getMessage("password", null, locale);
System.out.println(userName + "----" + password);
return "user";
}
}
当我们想要手动切换语言环境时,只需要点击相应的超链接即可,此时浏览会发送一个 “/localeChange?lang=***”的请求。该请求会被我们在 Spring MVC 配置文件中配置的 LocaleChangeInterceptor 拦截,并将指定的请求参数(lang)的值转换为 Locale 对象,以获取 LocaleResolver 对象对指定的国际化资源文件进行解析,最终实现切换国际化语言环境的目的。