目录
1.简介
Internationalization i18n 通俗一点的称呼:系统支持不同种语言
国际化实际上指的是对于不同语言的支持。一般指的是展示给客户的信息,根据客户的语言不同显示不同的语言信息。如页面,提示信息等与用户交互的信息。
2.Java国际化
2.1基本思路:
(1)需要获取到语言信息,或者定义一个语言环境。 java.util.Locale
(2)根据不同的语言环境,使用不同的语言信息。java.util.ResourceBundle
(3)提供多个配置信息,不同的配置文件记录不同语言对于同一个要表达的信息的不同翻译。
例如下面:
执行成功 这个信息,使用不同的语言表达是不同的。
中文:执行成功
英文:success
西语:xxx
法语:xxx
2.2 Java开发
Locale lc = new Locale("zh","CN");
//根据国家语言环境加载资源文件
ResourceBundle rb = ResourceBundle.getBundle("login_zh_CN", lc);
//打印出从资源文件中取得的信息
System.out.println(rb.getString("username"));
2.3 资源配置文件
(1)是一个properties文件。里面的内容格式是固定的:key=value。一个key=value键值对占一行。
(2)需要多个properties文件。一个配置文件中记录一种语言的信息。
(3)多个properties配置文件的命名规则:xxxx_zh_CN.properties/xxx_en_US.properties
BeanName_语种_国家.properties
(4)在国际化中,不同的语言的properties文件里面的key相同。Key实际上是要表达的信息,在不同的语种中表达的信息是相同的,一般key固定使用英语。
3.SpringMVC国际化
3.1 配置ResourceBundle
(1)在springMVC配置文件中配置。Id和class不要改。
(2)在ResourceBundle里面还需要配置国际化文件的路径,根据国际化路径所在的位置不同,有不同的配置方式。
方式一:classpath下面,也就是放在src下面
<property name="basename" value="classpath:messages" />
方式二:WEB-INF下面。
<property name="basename" value="/WEB-INF/resource/messages" />
示例:
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- <property name="basename" value="classpath:messages" /> -->
<property name="basename" value="/WEB-INF/resource/messages" />
</bean
友情提示!!
ResourceBundleMessageSource只能读取classpath中的文件
ReloadableResourceBundleMessageSource 可以读取classpath和WEB-INF下面的文件
3.2 配置语言环境
1.SpringMVC支持的获取语言环境的方式:
(1)AcceptHeaderLocaleResolver【不推荐】
根据浏览器Http Header中的accept-language域判定(accept-language域中一般包含了当前操作系统的语言设定,可通过HttpServletRequest.getLocale方法获得此域的内容)。
实际上就是根据浏览器的语言环境,得到当前的语言环境。
(2)SessionLocaleResolver【常用】
根据用户本次会话过程中的语言设定决定语言区域。实际上就是将语言环境放到session中,而不是固定死的。放入到session中的语言环境由用户决定。
提供语言切换的功能,用户可以提供自己的需要切换不同的语言,切换后的语言信息会保存到session中。
(3)CookieLocaleResolver【不常用】
根据Cookie判定用户的语言设定(Cookie中保存着用户前一次的语言设定参数)》。类似于session的方式,就是将语言环境放到cookie中。
2.配置:
(1)在springMVC配置文件中配置。
(2)选择配置SessionLocaleResolver作为获取语言环境的方式
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="zh_CN"></property>
</bean>
如果使用第2种或者第3种语言环境获取方式,需要配置拦截器LocaleChangeInterceptor。
是一个全局的拦截器。
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
</mvc:interceptors>
<!-- 存储区域设置信息 -->
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
<!-- 国际化资源文件 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages" />
</bean>
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang"></property>
</bean>
</mvc:interceptors>
3.3 国际化文件
i)messages_zh_CN.properties文件:
execution_success=\u6267\u884C\u6210\u529F
language.cn=\u4E2D\u6587
language.en=\u82F1\u6587
addOffer=\u589E\u52A0\u5546\u54C1
submit=\u63D0\u4EA4
offerId=\u5546\u54C1\u7F16\u53F7
offerName=\u5546\u54C1\u540D\u79F0
offerPrice=\u5546\u54C1\u4EF7\u683C
offerAmount=\u5546\u54C1\u6570\u91CF
offerDesc=\u5546\u54C1\u63CF\u8FF0
offerCompany=\u5546\u54C1\u5382\u5BB6
offerCountry=\u5546\u54C1\u4EA7\u5730
offerPinpai=\u5546\u54C1\u54C1\u724C
offerxinghao=\u5546\u54C1\u578B\u53F7
offerExpireDate=\u8FC7\u671F\u65F6\u95F4
offerBasicInfo=\u5546\u54C1\u57FA\u672C\u4FE1\u606F
offerExtendInfo=\u5546\u54C1\u6269\u5C55\u4FE1\u606F
ii)messages_en_US.properties文件:
execution_success=very good!
language.cn=chinese
language.en=english
addOffer=add Offer
submit=submit
offerId=offerId
offerName=offer name
offerPrice=offer price
offerAmount=offer amount
offerDesc=offer description
offerCompany=offer company
offerCountry=offer country
offerPinpai=offer pinpai
offerxinghao=offer xinghao
offerExpireDate=offer expireDate
offerBasicInfo=offer basic information
offerExtendInfo=offer extend information
3.4 Controller开发
方式一:使用方法形参中Locale获取
@Autowired
private ReloadableResourceBundleMessageSource messageSource;
public Result saveOfferJson(OfferVO OfferVo,Locale locale) throws Exception{
String message=messageSource.getMessage("execution_success", null, locale);
}
方式二:通过HttpServletRequest获取
@Autowired
private ReloadableResourceBundleMessageSource messageSource;
@Autowired
private SessionLocaleResolver localeResolver;
public Result saveOfferJson(OfferVO OfferVo,HttpServletRequest request) throws Exception{
Locale locale=localeResolver.resolveLocale(request);
String message=messageSource.getMessage("execution_success", null, locale);
}
String getMessage(String code, Object[] args, String defaultMessage, Locale locale)
- code表示国际化资源中的属性名;
- args用于传递格式化串占位符所用的运行期参数;
- defaultMessage:当在资源找不到对应属性名时,返回defaultMessage参数所指定的默认信息;
- locale表示本地化对象;
String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException;
与上面的方法类似,只不过在找不到资源中对应的属性名时,直接抛出NoSuchMessageException异常;
3.5 JSP开发
3.5.1 springMVC对于国际化前端页面的支持
<spring:message code="xxxx" />
解释spring:message标签:
(1)使用该标签需要在jsp中导入标签库。
<%@taglib prefix=“spring” uri=“http://www.springframework.org/tags”%>
(2)spring:message标签code属性指定的是国际化配置文件中的key值,通过该标签可以直接获取到国际化配置文件中该key对应的value。
3.5.2在JSP中Spring:message标签获取信息的过程分析
(1)JSP解析spring:message标签,去找code对应的国际化信息。
(2)去国际化配置文件里面找code对应的信息。
(3)通过ResourceBundle去查询,在ResourceBundle中会加载国际化配置文件。
(4)ResourceBundle自动加载配置的property里面的配置文件。例如下面配置,就会加载message开头的国际化配置文件。
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:message" />
</bean>
(5)在resourceBoundle加载的国际化配置文件中,根据语言信息去对应的配置文件中找code对应的value.
(6)将找的value值加载到JSP中
3.5.3在jsp中指定语言
JSP传递语言方式一:使用任意的属性名传递语言环境
Language: <a href="?lang=zh_CN"><spring:message code="language.cn" /></a> - <a href="?lang=en_US"><spring:message code="language.en" /></a>
拦截器配置属性:
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang"></property>
</bean>
JSP传递语言方式二:使用默认的参数名称locale
<a href="<%=basePath%>offer/addOffer?locale=zh_CN">中文</a>
<a href="<%=basePath%>offer/addOffer?locale=en_US">英文</a><br/>
JSP开发示例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<html>
<head>
<title>SpringMVC</title>
</head>
<body>
Language: <a href="?lang=zh_CN"><spring:message code="language.cn" /></a> - <a href="?lang=en_US"><spring:message code="language.en" /></a>
<h2>
<spring:message code="welcome" />
</h2>
Locale: ${pageContext.response.locale }
</body>
</html>