目录
1. 使用spring mvc 自带的SessionLocalResolver
2. 使用LocaleChangeInterceptor+SessionLocaleResolver来实现国际化
国际化
在日常工作中,如果你的网站需要给不同语言地区的人进行查看,此时就需要使用国际化的基本操作,springmvc的国际化操作比较容易。
页面
需要导入jstl标签库
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<%--
Created by IntelliJ IDEA.
User: thinkpad
Date: 2021/4/2
Time: 13:00
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<html>
<head>
<title>登录</title>
</head>
<body>
<h1><fmt:message key="welcomeinfo"/></h1>
<form action="login" method="post" >
<fmt:message key="username"/>: <input type="text" name="username"/><br><br>
<fmt:message key="password"/>: <input type="password" name="password"/><br><br>
<input type="submit" value="<fmt:message key="loginBtn"/>"/>
</form>
</body>
</html>
配置国际化文件,放在resource目录下
login_zh_CN.properties
welcomeinfo=欢迎进入登录页面
username=用户名
password=密码
loginBtn=提交
login_en_US.properties
welcomeinfo=welcome to login
username=USERNAME
password=PASSWORD
loginBtn=LOGIN
配置xml,配置messageSource。注意basename属性值配置,这里将国际化配置放在了resource目录下 i18n文件夹下,login指的是国际化文件的名称。
如果发现乱码,检查一下login_en_US.properties配置中的编码格式是否为UTF-8
检查一下idea的配置,看编码格式是否为utf-8
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n.login"/>
<!-- 支持UTF-8的中文 -->
<property name="cacheSeconds" value="0"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
控制器controller
package com.hww.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Locale;
@Controller
public class I18nController {
@Autowired
private MessageSource messageSource;
@RequestMapping("i18n")
public String i18n(Locale locale){
System.out.println(locale);
String username = messageSource.getMessage("username", null, locale);
System.out.println(username);
return "login";
}
}
通过超链接控制国际化
在实际过程中。我们可能通过一些下拉框选择或者超链接等方式进行中英文页面的切换,在以上的基础上进行修改配置。
<a href="i18n?locale=zh_CN">中文</a><a href="i18n?locale=en_US">英文</a>
通过实现LocalResolver接口来实现中英文切换
package com.hww.resolver;
import org.springframework.web.servlet.LocaleResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
public class MylocaleResolver implements LocaleResolver {
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
String locale = httpServletRequest.getParameter("locale");
if(!"".equals(locale)&&locale!=null){
String[] s = locale.split("_");
Locale locale1 = new Locale(s[0], s[1]);
return locale1;
}else{
return httpServletRequest.getLocale();
}
}
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
}
}
将该解析器配置到spring中,这里的id必须是localResolver
<!--localeResolver解析器,实现中英文切换-->
<bean id="localeResolver" class="com.hww.resolver.MylocaleResolver"></bean>
实现中英文切换
其他方式实现
除了以上方式,还有其他的方式实现中英文切换
1. 使用spring mvc 自带的SessionLocalResolver
/**
* 方案二:使用springmvc自带的SessionLcaleResolver
* @param httpServletRequest
* @return
*/
@RequestMapping("i18n")
public String i18n(@RequestParam("locale") String localeParam, HttpSession session, HttpServletRequest httpServletRequest){
Locale locale = null;
if(!"".equals(localeParam)&&localeParam!=null){
String[] s = localeParam.split("_");
locale = new Locale(s[0], s[1]);
}else{
locale= httpServletRequest.getLocale();
}
session.setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
return "login";
}
需要将SessionLocaleResolver配置到spring。这里的id必须是localeResolver
<!--方案二:使用springmvc的SessionLocaleResolver实现中英文切换-->
<bean id="localResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
2. 使用LocaleChangeInterceptor+SessionLocaleResolver来实现国际化
/**
* 方案三:使用springmvc自带的SessionLcaleResolver+LocaleChangeInterceptor
* @param
* @return
*/
@RequestMapping("i18n")
public String i18n(){
return "login";
}
配置spring
<!--拦截器-->
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
</mvc:interceptors>
<!--方案二:使用springmvc的SessionLocaleResolver实现中英文切换-->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
总结。实现国际化
1. 配置国际化支持ResourceBundleMessageSource
2. 中英文的配置标准化文件。xxx_zh_CN.properties, xxx_en_US.properties 。xxxx_语言_国家.properties。这里的xxx需要和ResourceBundleMessageSource的basename属性匹配。
3. 实现中英文切换三种方式。实质就是修改请求中头中的locale属性
(1)自定义实现LocaleResolver接口
(2)使用springmvc提供的SessionLocaleResover。 需要手动的往Session中放入local
(3)使用拦截器LocaleChangeInterceptor + SessionLocaleResover。只需要配置到Spring中,不需要在手动设置。