SpringMVC+maven基于session的语言国际化

1.pom.xml里面添加如下

       <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

 

2.在spring配置文件里面添加以下字段。

     <!--配置国际化资源文件-->
   <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <value>messages</value>
            </list>
        </property>
      <!--  国际化资源文件配置,指定properties文件存放位置 -->
        <property name="basename" value="messages"/>
       <!--  支持UTF-8的中文 -->
        <property name="cacheSeconds" value="5"/>
        <property name="defaultEncoding" value="UTF-8"/>
        <!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称  --> 
        <property name="useCodeAsDefaultMessage" value="true" />  
    </bean>
 
   <!--国际化操作拦截器  动态切换国际化 ,国际化放在session中 ,默认中文-->
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
       <property name="defaultLocale"  value="zh"></property>
    </bean>
 
    <!-- 配置LocaleInterceptor -->
    <mvc:interceptors>
     <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 -->
     <!--  <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 这个是spring自带,为了方便篡改的lang值,我自己写了一个-->
        <bean class="com.apk.openUser.interceptor.SessionLocaleChangeInterceptor">
           <!-- 通过这个参数来决定获取那个配置文件 -->
           <property name="paramName" value="lang"/>
        </bean>

   </mvc:interceptors>
<!-- 使不用经过controller就能直接访问jsp,这里为了语言拦截器在页面之间互转没走控制器的时候走对应 的语言,会导致之前的@RequestMapping注解的映射路径失效。
    加入<mvc:annotation-driven></mvc:annotation-driven>注解 可以解决。-->
    <mvc:view-controller path="/forget" view-name="forget"/>

这是我的SessionLocaleChangeInterceptor

 

package com.apk.openUser.interceptor;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.servlet.support.RequestContextUtils;

public class SessionLocaleChangeInterceptor extends HandlerInterceptorAdapter {
    public static final String DEFAULT_PARAM_NAME = "locale";

    private String paramName = DEFAULT_PARAM_NAME;


    /**
     * Set the name of the parameter that contains a locale specification
     * in a locale change request. Default is "locale".
     */
    public void setParamName(String paramName) {
        this.paramName = paramName;
    }

    /**
     * Return the name of the parameter that contains a locale specification
     * in a locale change request.
     */
    public String getParamName() {
        return this.paramName;
    }


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws ServletException {

        String newLocale = request.getParameter(this.paramName);
        System.out.println("lang:"+newLocale);
        if (newLocale != null) {
            LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
            if (localeResolver == null) {
                throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?");
            }
            System.out.println("localeResolver"+localeResolver);
            if(!newLocale.equals("en")&&(!newLocale.equals("zh"))) {
                return false;
            }
            localeResolver.setLocale(request, response, StringUtils.parseLocaleString(newLocale));
        }
        // Proceed in any case.
        return true;
    }

}


 

3.创建对应的语言文件,我直接放在resources下面

文件内容,前面是调用字段

4.设置语言界面,最好路径是action而不是直接的jsp文件,才能被语言拦截器更好的获取,比如web.xml默认走向index.jsp,在这个文件加入<% response.sendRedirect("login"); %>通过action进入设置界面login.jsp。如下login.jsp

<!-- jsp页面加入以下来识别 -->

<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>

     <!--下面来切换语言,这样就会被语言拦截器获取lang值存入session -->

      <a href="?lang=zh" id="change_zh"  style="padding-right: 1px"><spring:message code="language.cn" /></a>
      <a href="?lang=en" id="change_en"  style="padding-left: 1px"><spring:message code="language.en" /></a>
            

 5.js文件获取语言,可以通过一个jsp来获取,假如为language.jsp,然后js里面直接调用 i18n['value'] 即可。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<script>
var i18n=new Object(); 
i18n['value']='<spring:message code="valida.value"/>';

</script>

6.后台获取语言种类

Locale locale = (Locale) request.getSession().getAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME);

这是最近配置国际化的总结,欢迎大家提问以及提出不足。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值