Web国际化的三种解决方式
- 适用于springmvc的项目
我目前尝试过的有三种实现方式:
- 通过资源文件来实现国际化,页面获得浏览器语言来进行设置。
- 每个页面进行翻译,将语言设置在session里
- 每个页面进行翻译,在每个控制器里用@RequestHeader获得浏览器语言。
每种方法适用场景:
- 第一种:如果每个中文字段和英文字段翻译后的长度一样,能保证页面的样式不会乱,可以用这个方法。可以省很多页面,我很喜欢这个方法,后期语言改动也很好用啊,但是用户不能随便改变语言。
- 第二种:因为每种语言页面都准备了一套,样式也是另外一套,就用这个方法,将语言设置到session里,方便用户随意切换语言。
- 第三种:这种方法,每种语言页面也准备了一套,但是是语言的设置是根据浏览器语言设置来自动分配的。不能用户随意操作,除非改浏览器的语言。
三种方法的实现方式:
第一种
- 这种方法,控制器基本不用做什么语言判断,语言判断的操作是在页面实现的。
用到了java.util.ResourceBundle这个类在页面来获取服务器的资源文件,这个操作让我学会了更多的可能。 - 首先准备要用到的多语言资源文件。最好是放在src/main/resource的目录下。
下面这几个是我针对简体、繁体、英文来进行匹配的语言文件,global_shop.properties是默认的语言内容。 文件命名也类似这样xxxx.properties,xxxx_zh.properties,xxxx_en.properties这样的。
global_shop.properties里的字段设置
username=Personal
password=123456
submit=submit
- 中文的配置文件要用编码格式的,global_shop_zh_CN.properties
username=\u4e2a\u4eba
password=123456
submit=\u63d0\u4ea4
- tag.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@page import="java.util.ResourceBundle"%>
<%
//加载i18n资源文件,request.getLocale()获取访问用户所在的国家地区
ResourceBundle myResourcesBundle = ResourceBundle.getBundle("global/global_shop",request.getLocale());
%>
补充说明:”global/global_shop”中的global_shop是用默认语言文件的文件名,不要加文件后缀.properties,这方法会根据request.getLocale()来获得语言,然后拼接到默认的方法名后面,比如拿到的语言是en,拼接后就是global_shop_en,就能获得英文的语言文件。
- 页面test_index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ include file="../comm/tag.jsp" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<base href="<%=basePath%>">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- necessary -->
<meta name="keywords" content="1,2,3">
<meta name="description" content="">
<!-- description -->
<meta name="renderer" content="webkit">
<title><%=myResourcesBundle.getString("index.title")%></title>
<!-- base -->
<link href="<%=request.getContextPath() %>/resources/css/comm/base.css" rel="stylesheet">
<link href="<%=request.getContextPath() %>/resources/css/index/index.css" rel="stylesheet">
<!--[if lt IE 9]>
<script src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>;
<script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>;
<![endif]-->
</head>
<body>
<%@ include file="../comm/test/header.jsp" %>
<div class="clear pt-30 protipsplmedia pb-80-20-ipad cur-d">
<p class="line-h-30 h-30 f-16 f-w col-252525">
用户名: <%=myResourcesBundle.getString("username")%>
</p>
<p class="line-h-20 h-40 f-14 col-8c8c8c pt-20">
密码: <%=myResourcesBundle.getString("password")%>
</p>
</div>
</body>
</html>
- 跳转到这个页面的controller的方法超级简单:
@RequestMapping(value="/test_global")
public String test_global() {
return "global/test_index";
}
第二种
- 前提是这个页面是有各种版本语言的jsp并且只用了很少的语言版本。
(因为我现在的项目只用到了三种(简、繁、Eng),这种方式还是适用的,如果用了n种语言,一个jsp各种语言版本的数量有上百个,会弄死你自己和服务器的) - 用户可以在页面点击Eng、简或繁这个链接,将语言设置到session里。
举例页面实现:
<li class="pull-left pr-10"><a class="col-333 hovecol-black" href="${pageContext.request.contextPath}/changeLang?lang=en">Eng</a></li>
<li class="pull-left pr-5"><a class="col-333 hovecol-black" href="${pageContext.request.contextPath}/changeLang?lang=zh-HK">繁</a></li>
<li class="pull-left pr-5"><a class="col-333 hovecol-black" href="${pageContext.request.contextPath}/changeLang?lang=zh-CN">简</a></li>
- controller实现:
@RequestMapping(value = "/changeLang", method = RequestMethod.GET)
public String changeLang(Model model,HttpSession session, HttpServletRequest request,String lang){
lang = LanguageUtils.getlang(lang);
session.setAttribute("lang", lang);
System.out.println("setAttribute_lang:"+lang);
return lang+"_index";
}
点击进入其他页面的时候,从session获得语言,再跳转到对应页面就可以了。
@RequestMapping(value = "/aboutBis", method = RequestMethod.GET)
public String index(HttpServletRequest request,HttpSession session){
String lang = (String) session.getAttribute("lang");
if (StringUtils.isEmpty(lang)) {
lang = "EN";
}
return "about/"+lang+"_About";
}
第三种:
@RequestHeader(“Accept-Language”)获取浏览器设置的优先语言
- 控制器:
@RequestMapping(value="/displayHeaderInfo")
public String displayHeaderInfo(@RequestHeader("Accept-Language") String language) {
System.out.println("language:"+language);
String lang = getlang(language);
System.out.println("浏览器优先语言:"+getlang(language));
return "about/"+lang+"_About";
}
public static String getlang(String accept_language){
String[] lang_arr = accept_language.split(",");
String first_lang = lang_arr[0];
System.out.println("浏览器优先语言:"+first_lang);
if(first_lang.equals("zh")||first_lang.equals("zh-CN")){
return "ZH";
}if(first_lang.equals("zh-TW")||first_lang.equals("zh-HK")){
return "HK";
}else{
//默认英语
return "EN";
}
}