Spring国际化:语言自由选择
很多博客中的国际化就只是根据编译器获取的地址在自动匹配语言文件,但是如果有一种需要根据自由选择的语言来调整文本语言的功能,那么哪些博客中的方法肯定是不行的
首先我们可以把选择的语言添加到请求头活着session中,然后配置过滤器获取这个请求头的内容
首先自己定义过滤器,需要继承HandlerInterceptor
@Component
public class CommonIntercepter implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//允许跨域,不能放在postHandle内
httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
if (httpServletRequest.getMethod().equals("OPTIONS")) {
httpServletResponse.addHeader("Access-Control-Allow-Methods", "GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,PATCH");
httpServletResponse.addHeader("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization");
}
//需要自己处理请求头内的内容
//提取en-US这样格式的字符串
String s=httpServletRequest.getHeader("Accept-Language");
/**
* 这里根据请求头内容自己写提取代码
*/
StringUtils.setLocale(s);
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
然后配置过滤器和资源文件路径
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames" value="config.language.content" />
</bean>
<mvc:interceptors>
<!--过滤所有请求,处理跨域请求问题-->
<mvc:interceptor>
<mvc:mapping path="/**"/>
//这里根据自己包名配置
<bean class="*.*.Intercepter.CommonIntercepter"></bean>
</mvc:interceptor>
</mvc:interceptors>
接下来我们需要创建语言文件
文件命名为:yourcontent_language_locale.properties
其中yourcontent任意命名,language必须为语言的英文简写,locale必须为地区/国家英文简写
语言文件中的所有中文必须为unicode编码,
可以在下面这个网址进行自动转换
中文-unicode转换
文件内容格式类似这样的键值对
test=\u6d4b\u8bd5
创建一个类用于接收请求头选择对应的资源文件
public class StringUtils {
private static Locale locale;
/**
* 设置语言
* @param s
*/
public static void setLocale(String s){
String language="zh";
String country="CN";
if (s!=null){
String[] t=null;
if (s.contains("_")){
t=s.split("_");
}
if (s.contains("-")){
t=s.split("-");
}
if (t!=null){
language=t[0];
country=t[1];
}
}
locale=new Locale(language,country);
}
/**
*
* @return
*/
public static Locale getLocale(){
return locale;
}
/**
* 根据选择语言获取对应国际化文本内容
* @param key
* @return
*/
public static String getContent(String key){
String s=null;
try {
Locale locale=StringUtils.getLocale();
if (locale==null){
locale=new Locale("zh","CN");
}
ResourceBundle resourceBundle = MessageSourceResourceBundle.getBundle("config.language.content",locale);
s=resourceBundle.getString(key);
} catch (Exception e) {
e.printStackTrace();
}
return s;
}
}