SpringMVC-国际化

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>&nbsp;&nbsp;
<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>
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC的国际化是建立在Java国际化的基础之上的。它通过提供不同国家/语言环境的消息资源,然后通过Resource Bundle加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的消息。整个过程与Java程序的国际化完全相同,只是Spring MVC框架对Java程序国际化进行了进一步的封装,从而简化了应用程序的国际化。 在Spring MVC中,实现国际化有以下几个步骤: 1. 给系统加载国际化资源文件。 2. 输出国际化消息。可以在视图页面上输出国际化消息,需要使用Spring MVC的标签库;也可以在Controller的处理方法中输出国际化消息,需要使用org.springframework.web.servlet.support.RequestContext的getMessage()方法来完成。 除了默认的实现方式之外,Spring MVC还提供了其他两种国际化方式:SessionLocaleResolver和CookieLocaleResolver。这两种方式的配置稍有不同,包括配置国际化资源文件、配置国际化操作拦截器和配置LocaleResolver。 总结起来,Spring MVC的国际化是通过加载不同国家/语言环境的消息资源文件来实现的,可以在视图页面或Controller的处理方法中输出国际化消息。同时,Spring MVC还提供了不同的国际化实现方式供选择。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring MVC的国际化](https://blog.csdn.net/A_Runner/article/details/83684593)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值