选自javaee中的框架技术SpringMVC。
本篇主要介绍国际化方面的一些知识,为国际化的一些实现提供一些思路。
本文根据这张图来介绍SpringMVC实现国际化的过程:
1、根据浏览器语言进行国际化配置
2、根据语言切换进行国际化配置
项目要求条件:
支持SpringMVC
一、根据浏览器语言进行国际化配置
SpringMVC国际化配置文件如下,在SpringMVC核心配置文件配置内容如下:
<!-- 国际化资源文件 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:springi18n/messages" />
</bean>
value值是资源配置文件放置的路径,如下对应所示:前缀名称(任意)_国家编号固定。
文件名称有约定成俗的规定。常有国家语言一览表
语言加代码 | 语言加国家 |
zh_CN | 中文简体,中国 |
zh_TW | 中文繁体,台湾 |
zh_HK | 中文繁体,香港 |
en_US | 英语,美国 |
en_GB | 英语,英国 |
es_ES | 西班牙 |
es_US | 西班牙语,美国 |
en_ZA | 英语,津巴布韦 |
OK,接下来就是见证奇迹的时候:
测试SpringController:
package com.lgy.web.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.support.RequestContext;
import com.alibaba.druid.support.spring.stat.SpringStatUtils;
@Controller
@RequestMapping("/i18ntest")
public class I18nControllerTest {
@RequestMapping("/test")
public String Test(HttpServletRequest request) {
//后台获取国际化的信息
RequestContext requestContext = new RequestContext(request);
String message = requestContext.getMessage("welcome"); //获取国际化信息
System.out.println(message);
System.out.println("aaaaaaaaaa");
return "main";
}
}
测试国际化页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
Language: <a href="${pageContext.request.contextPath}/i18ntest/test?lang=zh"><spring:message code="language.cn" /></a> - <a href="${pageContext.request.contextPath}/i18ntest/test?lang=en_US"><spring:message code="language.en" /></a>
<h2>
<spring:message code="welcome" />
</h2>
Locale: ${pageContext.response.locale }
</body>
</html>
重点关注2处:
1.
//后台获取国际化的信息
RequestContext requestContext = new RequestContext(request);
String message = requestContext.getMessage("welcome"); //获取国际化信息
2.
<spring:message code="welcome" />
这可是分别从前后台获取国际化的手段,后期可以进行封装。
测试条件:
配置浏览器国际化的语言顺序,笔者以火狐为例,将中文选项调为第一位:
中文:
1.请求http消息头的语言为:Accept-Language zh-CN,en-US;q=0.8,zh;q=0.5,en;q=0.3
2.页面内容如下:
英文:
1.请求http消息头的语言为:Accept-Language en-US,zh-CN;q=0.8,zh;q=0.5,en;q=0.3
2.页面内容如下:
language为中文显示的内容来自zh_CN后缀名文件的内容;
language为中文显示的内容来自en_US后缀名文件的内容;
具体内容在此不再阐述。
二、手动切换进行国际化
有的时候,我们在首页中看到有语言选择进行国际化选择,这并是通过URL进行国际化的。例如比如上面的界面有一处:Language: 中文 - 英文
Language: <a href="${pageContext.request.contextPath}/i18ntest/test?lang=zh_CN"><spring:message code="language.cn" /></a> - <a href="${pageContext.request.contextPath}/i18ntest/test?lang=en_US"><spring:message code="language.en" /></a>
这是怎么做到的呢?先说过程,稍后再解释原理:
第一步 定义localeResolver:
package com.lgy.web.resolver;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
public class MyAcceptHeaderLocaleResolver extends AcceptHeaderLocaleResolver {
private Locale myLocal;
@Override
public Locale resolveLocale(HttpServletRequest request) {
return myLocal!=null?myLocal:request.getLocale();
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
this.myLocal = locale;
}
public Locale getLocale() {
return myLocal;
}
}
第二步:
在需要进行国际化配置的controller设置本地语言配置,规则可以自己定义:
@RequestMapping("/test")
public String Test(HttpServletRequest request, HttpServletResponse response, @RequestParam(value="lang",required=false) String lang) {
if(lang != null) {
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
localeResolver.setLocale(request, response, StringUtils.parseLocaleString(lang));
/*if(lang.equals("zh_CN")) {
//localeResolver.setLocale(request, response, StringUtils.parseLocaleString(newLocale));
}
if(lang.equals("en_US")) {
Locale locale = new Locale("en", "US");
//local.setLocale(request, response, locale);
}*/
}
//后台获取国际化的信息
RequestContext requestContext = new RequestContext(request);
String message = requestContext.getMessage("welcome"); //获取国际化信息
System.out.println(message);
System.out.println("aaaaaaaaaa");
return "main";
}
xml配置:
<!-- 获取本地 -->
<bean id="localeResolver" class="com.lgy.web.resolver.MyAcceptHeaderLocaleResolver"/>
不配置这个,默认的localResolvcer:
/*
* Copyright 2002-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.web.servlet.i18n;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.LocaleResolver;
/**
* {@link LocaleResolver} implementation that simply uses the primary locale
* specified in the "accept-language" header of the HTTP request (that is,
* the locale sent by the client browser, normally that of the client's OS).
*
* <p>Note: Does not support {@code setLocale}, since the accept header
* can only be changed through changing the client's locale settings.
*
* @author Juergen Hoeller
* @since 27.02.2003
* @see javax.servlet.http.HttpServletRequest#getLocale()
*/
public class AcceptHeaderLocaleResolver implements LocaleResolver {
public Locale resolveLocale(HttpServletRequest request) {
return request.getLocale();
}
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
throw new UnsupportedOperationException(
"Cannot change HTTP accept header - use a different locale resolution strategy");
}
}
若使用该类setLocale则会报:
throw new UnsupportedOperationException("Cannot change HTTP accept header - use a different locale resolution strategy");
异常。
配置结束,测试页面:
zh-CN和en-US则会自动切换语言。
想想,每次都在controller进行语言设置岂不是很麻烦,有没有更简单的方法是?
答案是是有,SpringMVC提高了i18n拦截器。
<mvc:interceptors>
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang" />
</bean>
</mvc:interceptors>
想想有什么弊端?
此片结束到这里,解决常规的国际化应该是没有问题,笔者在此想扩展一下。
Session国际化:
什么是session国际化,笔者起初对整个词汇也感到陌生。先来说说为什么要用session国际化。以上两种方式已经很好,1.通过浏览器设置国际化 2.通过url设置国际化。
通过浏览器设置国际化的缺点:太依赖浏览器的设置了,而且更改浏览器设置过于麻烦,对于母国外语的用户来说体验不好。
通过url设置国际化,单个页面比较好说,点击切换,一旦涉及的页面过多,想想会出现什么场景,总不能每个页面进行点击切换吧。
综上,使用session国际化可以解决这个问题。session国际化是根据session区域中有没有设置国际化区域,有则使用,无则使用默认的本地国际化区域。
使用方式 在配置文件中添加:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="zh"/>
</bean>
在需要后台控制的controller中设置:
@RequestMapping("/setSession")
public String session(HttpServletRequest request, HttpServletResponse response) {
Locale locale = new Locale("en", "US");
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
return "main";
}
在session中设置session区域。
测试结果:
1.通过无设置session国际化区域的controller跳转时候,得到的页面国际化内容是浏览器设置的国际化区域内容
2.通过该session国际化区域的controller跳转的页面,得到的页面国际化内容是该controller设置的国际化区域内容
3.之前通过页面国际化内容得到的浏览器设置的国际化区域内容变成了session国际化中设置的国际化区域内容
Cookie国际化:
通session国际化原理类似,不讲解。
总结:
1.介绍了通过浏览器设置国际化语言的方式
2.介绍了通过url的方式控制国际化语言切换的方式,且使用了拦截器实现
3.介绍了通过session国际化的方式,来切换国际化语言的方式
SpringMVC实现国际化的核心类:
感谢,转自:
http://blog.csdn.net/rj042/article/details/23354225
http://www.cnblogs.com/liukemng/p/3750117.html