小奋斗 - 轻松学习从此开始!
IT小奋斗群 QQ群:62017228

Java Web的国际化详细讲解

国际化

1.国际化开发概述

1.1.软件的国际化

软件开发时,要使它能同时应对世界不同地区和国家的方法,并针对不同地区和国家的方法,提供相应的,符合来访者阅读习惯的页面或数据
国际化简称:i18n :internationalization

合格的国际化软件:
软件实现国际化,需要具备一些特征:
1.对于程序中固定使用的静态文件数据,例如:菜单栏,导航条等中使用的文本元素,或错误提示信息,状态信息等,需要根据来访者的地区和国家,选择不同语言的文本位置服务
2.对于程序动态产生的数据,例如(日期,货币等),软件应能根据当前所在的国家或地区的文化习惯进行显示
3.注意:一个合格的国际化软件必须包含静态数据和动态数据的国际化

如何做到国际化的软件,要求:
1.软件中存储特定的字符串
2.知道浏览器当前使用哪种语言(Locale)

1.2.Locale本地化

Java提供了一个本地化的对象,用来封装当前语言,国家,环境等特征!
实力如下,Locale类还有更过方法可用


import org.junit.Test;

import java.util.Locale;

/**
 * Created by cenyu on 16-12-20.
 */
public class LocaleDemo {

    @Test
    //1.本地化对象:Locale
    //封装语言,国家信息的对象,由java.util提供
    public void testLocale() throws Exception{
        //模拟中国语言等环境
// Locale locale = Locale.CHINA;
        //因为当前环境是中文环境,所以获取当前默认的语言环境
        //获取当前操作系统默认的语言环境
        Locale locale = Locale.getDefault();
        //获取国家的简称,CN
        System.out.println(locale.getCountry());//CN
        //国家名称,中国
        System.out.println(locale.getDisplayCountry());//中国
        //语言简称,zh
        System.out.println(locale.getLanguage());//zh

        //模拟美国
        Locale us = Locale.US;
        System.out.println(us.getCountry()); //US
        System.out.println(us.getDisplayCountry());//美国
        System.out.println(us.getLanguage());//en
    }  
}

2.数据和文本的国际化

2.1.静态数据国际化

程序中的静态数据国际化是将语言信息保存在properties文件中的。静态数据的国际化主要分为步骤,先存储后调用
1.存储所有国家显示静态文本的字符串

  • 静态数据分语言的不同分别存储在properties文件中
  • properties文件的命名规范是:基础名_语言简称.properties
  • 例如:msg_zh.properities 存储所有中文

2.使用ResourceBundle类中的方法获取资源文件
ResourceBundle类提供了相应的getBundle方法,这个方法可以根据来访者的国家和地区自动获取与之对应的资源文件以显示。
代码示例:

package i18n;

import org.junit.Test;

import java.util.Locale;
import java.util.ResourceBundle;

/**
 * 使用ResourceBundle类自动获取国际化资源文件
 * Created by cenyu on 16-12-20.
 */
public class APP {

    //国际化
    @Test
    public void test_i18n() throws Exception{
        //中文语言环境
        Locale locale = Locale.CHINA;
        //创建工具类对象ResourceBundle
        ResourceBundle bundle = ResourceBundle.getBundle("i18n.msg", locale);
        //根据key获取配置文件中的值
        System.out.println(bundle.getString("hello"));
        System.out.println(bundle.getString("username"));
        System.out.println(bundle.getString("pwd"));
        System.out.println(bundle.getString("money"));


    }
}

2.2.动态文本国际化

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

数值国际化:
NumberFormat类,可以将一个数值格式化为符合某个国家地区习惯的数值字符串,也可以将符合某个国家地区习惯的数字符解析为对应的数值
NumberFormat类的方法

  • format方法:将一个数值格式化为符合某个国家地区习惯的数值字符串
  • parse方法:将符合某个国家地区习惯的数值字符串解析为对应的数值
    实例化NumberFormat类时,可以使用locale对象作为参数,也可以不使用
  • getNumberInstance(Locale locale):以参数locale对象所标识的本地信息来获得具有多种用途的NumberFormat实例对象
  • getCurrencyInstance(Locale locale):以参数locale对象所标识的本地信息来获得处理货币的NumberFormat实例对象
  • getPercentInstance(Locale locale):以参数locale对象所标识的本地信息来获得处理百分比数值的NumberFormat实例对象
    代码示例:

    //国际化数值
    @Test
    public void testI18N4() throws Exception{
        //模拟语言环境
        Locale locale = Locale.CHINA;
        NumberFormat nf = NumberFormat.getCurrencyInstance(locale);
        //国际化货币
        String m = nf.format(10000000);
    
        //测试
        System.out.println(m);
    }

货币国际化:
货币国际化也是使用NumberFormat类,实例的创建和使用方法同数值是一样的。

    //国际化货币
    @Test
    public void testI18N3() throws Exception{
        //模拟语言环境
        Locale locale = Locale.US;
        //数据准备
        double number = 100;
        //工具类
        NumberFormat nf = NumberFormat.getCurrencyInstance(locale);
        //国际化货币
        String m = nf.format(number);

        //测试
        System.out.println(m);
    }

日期和时间国际化:
DateFormat类可以将一个日期/时间对象格式化为表示某个国家地区的日期/时间字符串。
DateFormat类除了可按国家地区格式化输出日期外,还定义了一些用于描述日期/时间的显示模式的int型常量,包括FULL, LONG, MEDIUM, DEFAULT, SHORT,实例化DateFormat对象时,可以使用这些常量,控制日期/时间的显示长度。
实例化
实例化DateFormat类有三种方式,每种方式分为带参形式,不带参形式和只带显示样式的参数三种。

  • getDateInstance(int style, Locale aLocale):以指定的日期显示模式和本地信息来获得DateFormat实例对象,该实例对象不处理时间值部分。
  • getTimeInstance(int style, Locale aLocale):以指定的时间显示模式和本地信息来获得DateFormat实例对象,该实例对象不处理日期值部分。
  • getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale):以单独指定的日期显示模式、时间显示模式和本地信息来获得DateFormat实例对象。
    方法
    DateFormat对象的方法有:
  • format:将date对象格式化为符合某个地区环境习惯的字符串
  • parse:将字符串解析为日期/时间对象
    注意:parse和format全完相反,一个是把date时间转化为相应国家地区的显示样式(format),一个把相应地区的时间日期转化为date对象,该方法在使用时,解析的时间或日期要符合指定的国家地区格式,否则会抛出异常

    
    //国际化日期
    //format方法,把日期时间解析为字符串
    
    /**
     * 日期:
     * FULL:2016年12月20日 星期二
     * LONG :2016年12月20日
     * MEDIUM: 2016-12-20
     * SHORT : 16-12-20
     *
     * 时间
     * FULL :上午11时26分56秒
     * LONG :上午11时26分27秒
     * MEDIUM :11:27:10
     * SHORT :上午11:27
     */
    @Test
    public void testI18N5() throws Exception{
        //模拟语言环境
        Locale locale = Locale.CHINA;
        //工具类
        //日期格式
        int dataStyle = DateFormat.SHORT;
        //时间格式
        int timeStyle = DateFormat.SHORT;
        DateFormat df = DateFormat.getDateTimeInstance(dataStyle, timeStyle, locale);
        String date = df.format(new Date());
        //测试
        System.out.println(date);
    }
    
    //parse方法,把字符串解析为日期时间
    @Test
    public void testI18N6() throws Exception{
        String str = "09-11-28 上午10时25分39秒 CST";
        //实例化DateFormat工具类
        DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.FULL, Locale.getDefault());
        Date d = df.parse(str);
        System.out.println(d);
    }

3.页面国际化

3.1.java代码方式

页面国际化一般根据Locale从properties资源文件中获取对应的值,然后显示在页面上
代码示例:

<html>
  <head>
    <%
    ResourceBundle bundle = ResourceBundle.getBundle("i18n.msg",request.getLocale());
    %>
    <title><%=bundle.getString("title") %></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><%=bundle.getString("username") %></td>
            <td>
                <input type="text" name="userName">
            </td>
        </tr>
        <tr>
            <td><%=bundle.getString("pwd") %></td>
            <td>
                <input type="password" name="pwd">
            </td>
        </tr>
        <tr>
            <td>
                <input type="submit" value="<%=bundle.getString("submit") %>">
            </td>
        </tr>
    </table>
  </form>
  </body>
</html>

3.2.使用jstl标签

最佳方式是在jsp中不使用java代码,所以通常在jsp页面中国际化使用jstl标签,即国际化与格式化标签库
常用的一些标签

  • :设置本地化对象标签
    用于jsp页面中显示的设置用户的本地化信息,并将设置的本地信息以Locale对象的形式保存早某个web域中
    语法:

    <fmt:setLocale value=“locale”
               [variant=“variant”]
               [scope=“{page|request..}”]/>
  • : 设置工具类标签
    该标签用于根据 标签设置的本地化信息创建一个资源包实例对象,并将其绑定到一个指定的web域中
    语法:

    <fmt: setBundle basename=“basename”
     [var=“varname”]
     [scope=“{page|request|session|application}”] />
  • :显示国际化文本标签
    该标签用于从一个资源包中读取信息并进行格式化输出
    语法:

    <fmt:message key=“messageKey”
     [bundle=“resourceBundle”]
     [var=“varname”]
     [scope=“page|request|session|application”]   />

    key:指定要输出的信息的关键字
    bundle:指定ResourceBundle对象在web域中的属性名称。
    var:用于指定格式化输出结果保存到某个web域中的属性名
    scope:指定将格式化结果保存到哪个web域中

<fmt:formatDate pattern="yyyy-MM-dd" value="${date}"/> :格式化日期标签
<fmt:formatNumber pattern="#.##" value="100.99"></fmt:formatNumber> :格式化数值标签

代码示例:

<html>
  <head>
    <!-- 一、设置本地化对象 -->
    <fmt:setLocale value="${pageContext.request.locale}"/>
    <!-- 二、设置工具类 -->
    <fmt:setBundle basename="cn.itcast.f_i18n.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>

我来评几句
登录后评论

已发表评论数(0)