Servlet中国际化技术

来源:互联网 发布:spss导入数据 编辑:程序博客网 时间:2024/06/07 06:10

Servlet中国际化技术


      • Servlet中国际化技术
        • 概述
        • Locale本地化
        • 国际化
          • 国际化分类
            • 静态数据国际化
            • 动态文本国际化
        • Jsp页面国际化案例
          • 格式化与国际化标签库


概述


国际化又称为i18n(internationalization,该单词以i开始,中间经过18个字母之后,到底最后一个字母n,所以称为i18n技术),具体的定义是:在软件开发时,要使得它能同时应对不同地区和国家的访问,并针对不同地区和国家的访问,提供对应的、符合来访者阅读习惯的页面或者数据。展开来说一个软件在中国显示的是中文以及符合中国习惯的文本字符串,在美国显示的是英文以及符合美国习惯的文本字符串,我们把上述描述的软件称为国家化的软件。

Locale本地化


首先在学习本地化之前,我们应该学习本地化,也就是我们需要知道两个问题,第一,当前浏览器使用的是哪种语言,其次需要在软件中存储特定的字符串。Java提供了一个本地化的对象,该对象封装当前语言、国家、环境等特征,在Java.util.Locale中,当我们查看Servlet的API时发现其中有一个方法是getLocales(),也就是说通过Servlet可以将所有要访问的本地资源封装到一个Locale对象中,在JDK中的Java.util.locale和在Servlet的API中的getLocales()方法为我们在软件中实现国际化成为了可能。

package com.jpzhutech.locale;import java.util.Locale;import org.junit.Test;public class App {    @Test    public void testLocale() throws Exception{        //模拟中国语言环境        Locale locale = Locale.US;   //模拟美国        System.out.println(locale.getCountry());  //获取到国家的简称        System.out.println(locale.getDisplayCountry()); //国家名称        System.out.println(locale.getLanguage()); //语言环境    }}

国际化


国际化分类

静态数据国际化

在网站中显示的固定文本内容的国家化,这就是所谓的静态数据国际化,比如在登录时需要在输入文本框之前显示”用户名”、”密码”这些都称为静态数据的国际化。

  • 存储所有国家显示的文本的字符串
    • 文件为properties文件,我们称这种文件为国家化的资源文件
    • 命名为:myproperties_zh.properties(基础名_语言简称_国家简称.properties,其中基础名尽量取有意义的英文,并且国家简称可以省略)。
  • 程序中获取
    • ResourceBundle类可以读取国际化的资源文件
package com.jpzhutech.i18n;import java.text.DateFormat;import java.util.Date;import java.util.Locale;import java.util.ResourceBundle;import org.junit.Test;public class App {    //国际化    @Test    public void testI18n() throws Exception{        //Locale locale = Locale.CHINA;  //决定了下面在使用getString函数时读取的是msg_zh_CN.properties文件        Locale locale = Locale.US;  //决定了下面在使用getString函数时读取的是msg_en_US.properties文件        //创建工具类对象ResourceBundle        ResourceBundle resourceBundle = ResourceBundle.getBundle("com.jpzhutech.i18n.msg", locale);  //第一个参数是基础名(如果放在一个具体的包下要在基础名前加上包名)        //根据配置获取文件中的值        System.out.println(resourceBundle.getString("hello"));        System.out.println(resourceBundle.getString("username"));        System.out.println(resourceBundle.getString("pwd"));    }}
动态文本国际化

比如显示当前的时间:在中文状态下显示1987-09-19 ¥1000,而在英文状态下:Sep/09 1987 $100,这种称为动态文本的国际化。其中可能包括数值、货币、时间、日期等数据由于可能在程序运行时产生,所以无法像文字一样简单地将它们从应用程序中分离出来,需要进行特殊的处理。Java提供了解决这些问题的API,分别在java.util和java.text包中。

package com.jpzhutech.i18n;import java.text.DateFormat;import java.util.Date;import java.util.Locale;import java.util.ResourceBundle;import org.junit.Test;public class App {    //国际化的方法中每一哥国际化的类型都有format和parse两个方法,    前者是将其转换为不同国家的风格表示,后者是将不同国家的风格表示转换为数值或者字符串等    @Test    public void testi18n2() throws Exception{        //模拟语言环境        Locale locale = Locale.US;        double d = 100;  //将100显示为货币$100        //国际化货币        //NumberFormat nf = NumberFormat.getCurrencyInstance(locale);        //System.out.println(nf.format(d));  //显示的结果是$100        //国际化数字,每个国家的数字都是一样的,只需要了解该方法即可        //NumberFormat nf = NumberFormat.getNumberInstance();        //String format = nf.format(10000000);        //System.out.println(format);  //显示为10,000,000        //国际化百分比,每个国家的表示方法都是一样的        //NumberFormat.getPercentInstance();        //国际化日期        int dateStyle = DateFormat.FULL;  //可取的常量值为:FULL、MEDIUM、LONG、SHORT        int timeStyle = DateFormat.FULL;        DateFormat dateTimeInstance = DateFormat.getDateTimeInstance(dateStyle, timeStyle, locale.CANADA);        String datetime = dateTimeInstance.format(new Date());        System.out.println(datetime);    }}

Jsp页面国际化案例


实现Jsp页面的国际化有两种方法:

  • 在Jsp页面内嵌Java代码,也就是常说的Jsp脚本,不推荐使用该方法
  • 使用JSTL标签

两种方法的代码都在github上,原理已经在上面的部分实现,在该部分将实现几个页面的国际化,代码请参见我的github: https://github.com/zhujunpengguizhou/LoginSystem

格式化与国际化标签库

http://blog.csdn.net/drifterj/article/details/8231979
https://www.ibm.com/developerworks/cn/java/j-lo-jstl/

0 0
原创粉丝点击