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);
这是最近配置国际化的总结,欢迎大家提问以及提出不足。