JavaWeb国际化

Posted 张玉宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb国际化相关的知识,希望对你有一定的参考价值。

软件的国际化:

         软件在不同的地方,适应不同的风格:

                  中国: 显示中文,以及服务符合中国习惯的文本字符串!

                  美国: 显示英文,以及服务符合他国习惯的文本字符串!

         这种软件,就叫国际化的软件!

 

如何做到国际化的软件,要求:

  1. 软件中存储特定的字符串
  2. 知道浏览器当前使用哪种语言(Locale  )

 

相关API

一、Locale 实例对象代表一个特定的地理,政治、文化区域。
(一个 Locale 对象本身不会验证它代表的语言和国家地区信息是否正确,只是向本地敏感的类提供国家地区信息,与国际化相关的格式化和解析任务由本地敏感的类去完成。(若JDK中的某个类在运行时需要根据 Locale 对象来调整其功能,这个类就称为本地敏感类)

二、ResourceBundle类提供了一个静态方法getBundle,该方法用于装载资源文件,并创建ResourceBundle实例:

加载资源文件后, 程序就可以调用ResourceBundle 实例对象的 getString 方法获取指定的资源信息名称所对应的值。

 


Locale  本地化

Java提供了一个本地化的对象!封装当前语言、国家、环境等特征!

 

首先来测试一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    //本地化对象,封装语言、国家、信息的对象
//由java.util包提供
@Test
public void test() {
    //Locale locale=Locale.CHINA;      
    Locale locale=Locale.getDefault();          //当前系统默认的语言环境
    System.out.println(locale);     //zh_CN    中文-中国
    System.out.println(locale.getCountry());    //CN 国家的简称
    System.out.println(locale.getDisplayCountry()); //中国    显示完整国家
    System.out.println(locale.getLanguage());          //zh  语言简称
    //模拟美国
    Locale locale2=Locale.US;
    System.out.println(locale2.getCountry());
    System.out.println(locale2.getDisplayCountry());
}       

然后改为美国(Locale.CHINA——》Locale.US)

1
2
3
4
5
6
7
@Test
  public void test2() {
      //模拟美国
      Locale locale2=Locale.US;
      System.out.println(locale2.getCountry());
      System.out.println(locale2.getDisplayCountry());
  }

运行结果如图:


 

国际化

  静态数据国际化

   

    国际化的软件:

    1. 存储所有国家显示的文本的字符串

        a)         文件: properties

        b)        命名:  基础名_语言简称_国家简称.properties

          例如:msg_zh_CN.properties     存储所有中文

                Msg_en_US.properties    存储所有英文

    1. 程序中获取

        ResourceBundle类,可以读取国际化的资源文件!

先创建两个properties文件,一个代表中文,另外一个代表英文

注意不能再source视图中去编辑,只能在properties视图中去add,add之后转换到source视图就会知道为什么了。

现在来添加java代码:

1
2
3
4
5
6
7
8
9
10
11
12
//国际化
    @org.junit.Test
    public void test() {
        //中文语言环境
        Locale locale=Locale.CHINA;
        //创建工具类对象ResourceBundle
        ResourceBundle bundle=ResourceBundle.getBundle("com.gqx.international_i18.msg", locale);
        //根据key获取配置文件中的值
        System.out.println(bundle.getString("hello"));
        System.out.println(bundle.getString("username"));
        System.out.println(bundle.getString("pwd"));   
    }

然后做对应的改变(Locale.CHINA——》Locale.US)会看到如下如的变化

但是,我们会想到,如果是金钱数目或者时间等,他们是变化的,不确定的,我们没办法将其通过数据保存下来,然后一一对应来解决。这个时候需要通过动态国际化来解决啦

 

动态文本国际化

 数值,货币,时间,日期等数据由于可能在程序运行时动态产生,所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理。Java 中提供了解决这些问题的 API 类(位于 java.util 包和 java.text 包中)

国际化货币
NumberFormat.getCurrencyInstance();
国际化数字;
NumberFormat.getNumberInstance();
国际化百分比
NumberFormat.getPercentInstance();
国际化日期
DateFormat.getDateTimeInstance(dateStyle, timeStyle);

(1)、国际化货币

1
2
3
4
5
6
7
8
9
10
11
12
13
//国际化-动态文本-国际化货币
  @org.junit.Test
  public void test4() {
      //模拟语言环境
      Locale locale=Locale.US;
      //数据
      double number=100;
      //工具类
      NumberFormat nf=NumberFormat.getCurrencyInstance(locale);
      //国际化货币
      String m=nf.format(number);
      System.out.println(m);
  }

1
2
3
4
5
6
7
8
9
10
11
12
13
//计算    $100.00*10(不能通过字符串的拆分方式实现)
    @org.junit.Test
    public void test5() throws ParseException {
        String string="$100";
        int num=10;
        //1、分析string是哪一个国家的货币
        Locale locale=Locale.US;
        //2、国际化工具类
        NumberFormat nf=NumberFormat.getCurrencyInstance(locale);
        //3、解析货币
        Number n=nf.parse(string);
        System.out.println(n.intValue()*num);
    }

  

(2)、国际化数字

1
2
3
4
5
6
7
8
9
//国际化-动态文本-国际化数字
        @org.junit.Test
        public void test6() {
            //模拟语言环境
            Locale locale=Locale.US;
            NumberFormat nf=NumberFormat.getNumberInstance(locale);
            String str=nf.format(10000000);
            System.out.println(str);
        }

(3)、国际化日期

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  //国际化-动态文本-国际化日期
/**
 * 日期:
 *          FULL:2016年11月30日 星期三
 *          LONG: 2016年11月30日
 *          MEDIUM:2016-11-30
 *          SHORT:16-11-30
 * 日期:
 *          FULL:下午03时47分08秒 CST
 *          LONG:下午03时49分43秒
 *          MEDIUM:15:51:31
 *          SHORT:下午3:53
 */        
@org.junit.Test
public void test7() {
    //模拟语言环境
    Locale locale=Locale.CHINA;
    //日期格式
    int dateStyle=DateFormat.SHORT;
    //时间格式
    int timeStyle=DateFormat.SHORT;
    //工具类
    DateFormat df=DateFormat.getDateTimeInstance(dateStyle, timeStyle);
    String date=df.format(new Date());
    System.out.println(date);
}

  

 

将时间值:16-11-30下午16时25分30秒 CST,反向解析成一个打他对象

1
2
3
4
5
6
7
8
9
10
11
12
13
//将时间值:16-11-30下午16时25分30秒 CST,反向解析成一个打他对象
@org.junit.Test
public void test8() throws ParseException {
    String str="16-11-30 下午16时25分30秒 CST";
    //日期格式
    int dateStyle=DateFormat.SHORT;
    //时间格式
    int timeStyle=DateFormat.FULL;
    //工具类
    DateFormat df=DateFormat.getDateTimeInstance(dateStyle, timeStyle,Locale.getDefault());
    Date date=df.parse(str);
    System.out.println(date);
}

 


 

Jsp页面国际化 – 使用jstl标签

    <fmt:setLocale value=""/>        设置本地化对象

          <fmt:setBundle basename=""/>     设置工具类

          <fmt:message></fmt:message>     显示国际化文本

格式化数值

<fmt:formatNumber pattern="#.##" value="100.99"></fmt:formatNumber>

格式化日期:

<fmt:formatDate pattern="yyyy-MM-dd" value="${date}"/>

如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--引入jstl国际化与格式化标签库 --%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <!-- 一、设置本地化对象 -->
    <fmt:setLocale value="${pageContext.request.locale}"/>
    <!-- 二、设置工具类 -->
    <fmt:setBundle basename="com.gqx.international_i18.msg" var="bundle"/>
    <title><fmt:message key="title" bundle="${bundle}"></fmt:message></title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">   
  </head>
   
  <body>
  <form name="frmLogin" action="${pageContext.request.contextPath }/admin?method=login" method="post">
    <table align="center" border="1">
        <tr>
            <td><fmt:message key="username" bundle="${bundle}"></fmt:message></td>
            <td>
                <input type="text" name="userName">
            </td>
        </tr>
        <tr>
            <td><fmt:message key="pwd" bundle="${bundle}"></fmt:message></td>
            <td>
                <input type="password" name="pwd">
            </td>
        </tr>
        <tr>
            <td>
                <input type="submit" value="<fmt:message key="submit" bundle="${bundle}"/>">
            </td>
        </tr>
    </table>
  </form>
  </body>
</html>

(将浏览器默认的语言改变后,会发现对应的文字也会改变) 

 

以上是关于JavaWeb国际化的主要内容,如果未能解决你的问题,请参考以下文章

动态SQL基础概念复习(Javaweb作业5)

JavaWeb增强:国际化

JavaWeb国际化

JavaWeb国际化

JavaWeb开发——软件国际化(文本元素国际化)

11.javaweb国际化标签库