Spring MVC i18n

背景

很多网站的用户分布在世界各地,因此网站需要针对不同国家的用户展示不同语言的内容,因此就有了国际化实现的需求,大多数网站都会在网站的头部或尾部设置语言切换链接,这样就可以直接切换成相应的内容。

解决思路
  1. 直接根据Request.getLocale()方法得到本地化信息,实际就是从Http Request Headers里面取“accept-language”对应的值,该值拥有浏览器端的语言信息;
  2. 在浏览器端保存一个自定义名字的cookie,默认情况下指定一个值,对应的切换通过语言切换链接的点击修改对应的值;
  3. 在请求URL上面添加带本地化信息的参数或者地址里面包含本地化信息
代码实现
  • 步骤一 创建国际化资源文件
    国际化资源文件为 properties 文件,properties 文件命名规则为 basename_语言代码_国家代码.properties,假设我们的程序需要中文和英文两种语言支持,资源文件的 basename 为 i18n,那么classpath下需要创建一下两个properties文件:i18n_zh_CN.properties、i18n_en_US.properties。

  • 步骤二 创建 ResourceBundleMessageSource 实例
    Spring MVC 中国际化资源文件被抽象成 ResourceBundleMessageSource 类,我们可以从该类中根据不同的 locale 和 key 获取对应的内容。通过 basenames 属性指定属性文件基名,通过 defaultEncoding 指定属性文件的编码

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames" value="i18n" />
    <property name="defaultEncoding" value="utf-8" />
</bean>
复制代码

注意:该 bean 的 id 必须为 messageSource ,否则 spring 将会找不到该 bean!!

  • 步骤三 定义 LocaleResolver
    Spring MVC 中 LocaleResolver 用来从 request 中解析 locale 以及设置 locale,可以是 request、session、cookie级别,典型的实现类有 AcceptHeaderLocaleResolver、SessionLocaleResolver、CookieLocaleResolver,默认情况是 AcceptHeaderLocaleResolver,也就是根据请求头中的 Accept-Language 来解析出 locale,即浏览器的语言,这个解析器只支持根据浏览器语言自动匹配,不支持手动切换语言环境.
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="defaultLocale" value="zh_CN"/>
</bean>
复制代码

注意:该 bean 的 id 必须为 localeResolver,否则 spring 将会找不到该解析器!!

  • 步骤四 定义LocaleChangeInterceptor
    想要能够通过超链接等切换语言还需要定义 LocaleChangeInterceptor 拦截器,该拦截器的作用时拦截所有请求,如果请求中含有 locale 参数,则尝试将 locale 参数解析成 Locale 对象,并设置基于 session 或者 cookie 的参数以便所有页面语言都被切换.
<mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
</mvc:interceptors>
复制代码
  • 步骤五 后端代码
@RequestMapping("signupsession")
public String signupsession(String request_locale, Model model, HttpServletRequest request) {
    if (request_locale != null) {
        if (request_locale.equals("zh_CN"))
            request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("zh","CN"));
        else if (request_locale.equals("en_US"))
            request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("en","US"));
    }
    User user = new User();
    model.addAttribute("user", user);
    return "signup_session";
}

复制代码
  • 步骤六 前端代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<html>
<head>
    <title>SessionLocaleResovler</title>
</head>
<body>
<a href="/user/signupsession?request_locale=zh_CN">中文</a>|<a href="/user/signupsession?request_locale=en_US">英文</a>
<form:form method="post" action="regist" modelAttribute="user">
    <table>
        <tr>
            <td><spring:message code="language.username"/></td>
            <td><form:input path="name"/></td>
        </tr>
        <tr>
            <td><spring:message code="language.password"/></td>
            <td><form:password path="password"/></td>
        </tr>
    </table>
</form:form>
</body>
</html>
复制代码
  • message标签
    Spring MVC中显示本地化消息通常使用Spring的message标签。
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
复制代码

参考链接: 代码实现 工作原理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值