基于springmvc的国际化有三种实现方式:
1.基于浏览器中语言首选项
1.1 配置spring.xml
<!-- 国际化-->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化信息所在的文件名 -->
<property name="basename" value="message/messages" />
<!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称 -->
<property name="useCodeAsDefaultMessage" value="true" />
</bean>
在com.demo.web.controllers包中添加GlobalController.java内容如下:
package com.demo.web.controllers;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.support.RequestContext;
import com.demo.web.models.FormatModel;
@Controller
@RequestMapping(value = "/global")
public class GlobalController {
@RequestMapping(value="/test", method = {RequestMethod.GET})
public String test(HttpServletRequest request,Model model){
if(!model.containsAttribute("contentModel")){
//从后台代码获取国际化信息
RequestContext requestContext = new RequestContext(request);
model.addAttribute("money", requestContext.getMessage("money"));
model.addAttribute("date", requestContext.getMessage("date"));
FormatModel formatModel=new FormatModel();
formatModel.setMoney(12345.678);
formatModel.setDate(new Date());
model.addAttribute("contentModel", formatModel);
}
return "globaltest";
}
}
在项目中的源文件夹resources的message(这里是项目中的包路径,spring配置文件中message为包路径,messages为properties的文件前缀名)包中添加messages.properties、messages_zh_CN.properties、messages_en_US.properties三个文件,其中messages.properties、messages_zh_CN.properties里面的"money", "date",为中文,messages_en_US.properties里面的为英文。
在views文件夹中添加globaltest.jsp视图,内容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@taglib prefix="spring" uri="http://www.springframework.org/tags" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 下面展示的是后台获取的国际化信息:<br/> ${money}<br/> ${date}<br/> 下面展示的是视图中直接绑定的国际化信息:<br/> <spring:message code="money"/>:<br/> <spring:eval expression="contentModel.money"></spring:eval><br/> <spring:message code="date"/>:<br/>
<mvc:interceptors> <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 --> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> </mvc:interceptors>
<spring:eval expression="contentModel.date"></spring:eval><br/> </body></html>
2.基于session的国际化
在基于1.1中spring 配置的情况下,再加上一条配置信息
<mvc:interceptors> <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 --> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> </mvc:interceptors>
因为项目中head并没有经view跳转,所以在jsp页面中直接写了java脚本。
这里算是取巧了吧。<%@page import="org.springframework.web.servlet.i18n.SessionLocaleResolver"%> <%@page import="java.util.Locale"%> <%@page import="java.util.ResourceBundle"%> <%@page import="com.thinkgem.jeesite.common.utils.StringUtils"%> <% Object local = request.getSession().getAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME); Locale locale; if (local == null) { locale = new Locale("zh", "CN"); }else { locale = (Locale)request.getSession().getAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME); } ResourceBundle rb = ResourceBundle.getBundle("/message/messages", locale); %>
页面上直接采用 <%=rb.getString("head.allpart") %> 取得相应得值,
中英切换:
function changei18n(val){ window.location.href="test/i18n?langType="+val+"&url="+window.location.href; }
<a href="javascript:void(0)" οnclick="changei18n('zh')">中文</a> | <a href="javascript:void(0)" οnclick="changei18n('en')">English</a>
cotroller:@RequestMapping(value="i18n") public String i18n(HttpServletRequest request,Model model,String url,@RequestParam(value="langType", defaultValue="zh") String langType) { if(!model.containsAttribute("contentModel")){ if(langType.equals("zh")){ Locale locale = new Locale("zh", "CN"); request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale); } else if(langType.equals("en")){ Locale locale = new Locale("en", "US"); request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale); } else request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,LocaleContextHolder.getLocale()); } return "redirect:"+url; }
3.基于cookie的国际化
把实现第二种方法时在项目的springservlet-config.xml文件中添加的
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />注释掉,并添加以下内容:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />更改GlobalController.java为如下内容:
关于<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />3个属性的说明(可以都不设置而用其默认值):package com.demo.web.controllers; import java.util.Date; import java.util.Locale; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.i18n.CookieLocaleResolver; //import org.springframework.web.servlet.i18n.SessionLocaleResolver; import org.springframework.web.servlet.support.RequestContext; import com.demo.web.models.FormatModel; @Controller @RequestMapping(value = "/global") public class GlobalController { @RequestMapping(value="/test", method = {RequestMethod.GET}) public String test(HttpServletRequest request, HttpServletResponse response, Model model, @RequestParam(value="langType", defaultValue="zh") String langType){ if(!model.containsAttribute("contentModel")){ /*if(langType.equals("zh")){ Locale locale = new Locale("zh", "CN"); request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale); } else if(langType.equals("en")){ Locale locale = new Locale("en", "US"); request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale); } else request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,LocaleContextHolder.getLocale());*/ if(langType.equals("zh")){ Locale locale = new Locale("zh", "CN"); //request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale); (new CookieLocaleResolver()).setLocale (request, response, locale); } else if(langType.equals("en")){ Locale locale = new Locale("en", "US"); //request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale); (new CookieLocaleResolver()).setLocale (request, response, locale); } else //request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,LocaleContextHolder.getLocale()); (new CookieLocaleResolver()).setLocale (request, response, LocaleContextHolder.getLocale()); //从后台代码获取国际化信息 RequestContext requestContext = new RequestContext(request); model.addAttribute("money", requestContext.getMessage("money")); model.addAttribute("date", requestContext.getMessage("date")); FormatModel formatModel=new FormatModel(); formatModel.setMoney(12345.678); formatModel.setDate(new Date()); model.addAttribute("contentModel", formatModel); } return "globaltest"; } }
(因为没有cookie来实现所以,这部分就直接粘贴过来了)<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> <!-- 设置cookieName名称,可以根据名称通过js来修改设置,也可以像上面演示的那样修改设置,默认的名称为 类名+LOCALE(即:org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE--> <property name="cookieName" value="lang"/> <!-- 设置最大有效时间,如果是-1,则不存储,浏览器关闭后即失效,默认为Integer.MAX_INT--> <property name="cookieMaxAge" value="100000"> <!-- 设置cookie可见的地址,默认是“/”即对网站所有地址都是可见的,如果设为其它地址,则只有该地址或其后的地址才可见--> <property name="cookiePath" value="/"> </bean>
4.基于数据库的国际化(待检验)
因为项目中很多都是直接从数据库取出来得分类信息,或者从数据字典中取出来的,项目也仅要求中/英切换,所以在项目启动的时候采用spring的定时器。仅是中文的proterties文件,因为英文的翻译不需要我来做,所以设想是对比中文 直接追加到原有的英文proterties文件后, 因为目前翻译还没有给我所以也不太知道可行与否。
/** * 从数据库获取i18n中文的数据 */ @PostConstruct //项目启动时执行一次 public void getproperties(){ Properties properties = new Properties(); List<Office> oList=officeService.findCoCollege(); for (Office office : oList) { properties.setProperty(office.getId(), office.getName()); } OutputStream output = null; try { output = new FileOutputStream("d://config.properties"); properties.store(output, "andieguo modify" + new Date().toString());// 保存键值对到文件中 } catch (IOException io) { io.printStackTrace(); } finally { if (output != null) { try { output.close(); } catch (IOException e) { e.printStackTrace(); } } } }
参考前辈:https://www.cnblogs.com/liukemng/p/3750117.html 点击打开链接
http://blog.csdn.net/ethan_fu/article/details/45621337 深入理解spring国际化