Web国际化的三种解决方式

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";
          }
     }
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值