java学习笔记—国际化(41)

国际化:internationalization即I18N。

举例:

本科高校的网站,一般的都有中文和英文两种页面风格。因此将这种根据不同用户群体显示不同的页面风格的方式称之为页面的国际化。

翻译 VS 国际化

翻译:Chrome

国际化:主要做的是页面的显示信息的国际化,至于文件等其他的资源是无法进行国际化。

1  国际化的原理

  1. 获取用户的本地信息

Locale通过静态属性获取区域对象。

  1. 准备不同区域国家的需要显示的资源

全部使用properties配置文件进行实现。但是文件名需要按照指定的规则进行书写。

规范: 基本名_语言名.properties

基本名是随意的,语言名是固定可以参考浏览器的语言。

  1. 根据区域语言信息查找指定的资源进行显示

ResourceBundle 的静态方法static ResourceBundle getBundle(String baseName,

Locale locale)

绑定资源的原理:获取资源基本名和区域语言名锁定资源名。

String getString(String key)

一  体验

1. 编写两个如下的资源文件

greet_zh.properties

hello=\u4F60\u597D

greet_en.properties

hello=Hello

2. 实现一个如下的java类

public static void main(String[] args) {
    // 获取本地区域信息
    Locale locale = Locale.US;
    // 绑定资源
    ResourceBundle bundler = ResourceBundle.getBundle("cn.itcast.ps.greet", locale);
    System.out.println(bundler.getString("hello"));
  }

总结:

如果没有可视化编辑器那么直接使用native2ascii.exe进行中文的转码。

国际化变量

1 日期国际化

DateFormat该类主要提供的是以不同的区域显示不同的日期格式。

根据区域信息格式化和解析日期数据。

static DateFormat getDateInstance(int style, Locale aLocale) à 获取日期实例

static DateFormat getTimeInstance(int style, Locale aLocale) à 获取时间实例

static DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale)à 获取日期和时间

Date parse(String source) à 解析日期

String format(Object obj) à 格式化日期

举例:

获取日期和时间

Long
2013年1月21日 下午04时16分41秒
January 21, 2013 4:17:27 PM CST
FULL
2013年1月21日 星期一 下午04时18分19秒 CST
Monday, January 21, 2013 4:18:37 PM CST
MEDIUM
2013-1-21 16:19:33
Jan 21, 2013 4:19:45 PM
SHORT
13-1-21 下午4:20
1/21/13 4:20 PM

练习:将以下的字符号串解析为日期对象。

String date = “2013年1月21日 下午4:20”;解析为日期对象。

Long   Short

 public static void main(String[] args) throws Exception{
        //I18NDate();
        String date = "2013年1月21日 下午4:20";
        Locale locale = Locale.CHINA;
        DateFormat format = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT, locale);
        Date new_date = format.parse(date);
        System.out.println(new_date);
    }

数字国际化

NumberFormat

static NumberFormat getInstance(Locale inLocale)              ? 国际化普通数字
static NumberFormat getCurrencyInstance(Locale inLocale)     ? 国际化货币
static NumberFormat getPercentInstance(Locale inLocale)        ? 国际化百分比

国际化

String format(Object obj)
Number parse(String source)

举例:

 public static void main(String[] args) throws Exception{
        // 获取国际化普通数字的对象
        Locale locale = Locale.CHINA;
        NumberFormat format = NumberFormat.getInstance(locale);
        String str = format.format(123456.789);
        System.out.println(str);
        locale = Locale.CHINA;
         format = NumberFormat.getCurrencyInstance(locale);
         str = format.format(123456.789);
         System.out.println(str);

         locale = Locale.CHINA;
         format = NumberFormat.getPercentInstance(locale);
         str = format.format(0.789);
         System.out.println(str);
    }

练习:将String str = "¥123.7";解析为数字。

public static void main(String[] args) throws Exception{
        //I18NNumber();
        String str = "¥123.7";
        Locale locale = Locale.CHINA;
        NumberFormat format = NumberFormat.getCurrencyInstance(locale);
        Number num = format.parse(str);
        System.out.println(num.doubleValue()*3);
    }

动态文本国际化

public static void main(String[] args) throws Exception{
      String str =     "On {0}, a hurricance destroyed {1} houses and caused {2} of damage.";
      String date = "Jul 3, 1998 12:30 PM";
      DateFormat format = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.US);
      Date new_date = format.parse(date);

      Double money = new Double(1E7);
      NumberFormat numfor = NumberFormat.getCurrencyInstance(Locale.CHINA);
      String new_str = numfor.format(money);

      Object[] os = new Object[]{new_date,new Integer(77),new_str}
      MessageFormat msg_for = new MessageFormat(str,Locale.CHINA);
      String for_str = msg_for.format(os);
      System.out.println(for_str);
    }

以上的动态文本国际化每次需要将所有需要国际化的数据单独的进行国际化好之后逐一的进行填充。因此比较繁琐,可以使用以下的模式字符串。

public static void main(String[] args) throws Exception{
        String pattern = "At {0, time, short} on {0, date}, a hurricance destroyed "
            + "{1} houses and caused {2, number, currency} of damage.";
        String datetimeString = "Jul 3, 1998 12:30 PM";
        DateFormat format = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.US);
        Date new_date = format.parse(datetimeString);

        Object[] os = new Object[]{new_date,new Integer(77),new Double(1E7)};

        MessageFormat msg_for = new MessageFormat(pattern,Locale.US);
        String for_str = msg_for.format(os);
        System.out.println(for_str);
    }

案例一:实现登陆的国际化

<body>
     <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="in" %>
     <in:setLocale value="${pageContext.request.locale}"/>
     <in:setBundle basename="cn.itcast.login.greet" var="bund" scope="page"/>
     <form action="">
        <table align="center" border="1">
           <tr>
             <td><in:message bundle="${pageScope.bund}" key="name"/></td>
             <td><input type="text" name="uname"></td>
           </tr>
           <tr>
             <td><in:message bundle="${pageScope.bund}" key="psw"/></td>
             <td><input type="text" name="uname"></td>
           </tr>
           <tr>
             <td colspan="2">
                 <input type="submit" value=‘<in:message bundle="${pageScope.bund}" key="submit"/>‘>
                 <input type="reset" value=‘<in:message bundle="${pageScope.bund}" key="reset"/>‘>
             </td>
           </tr>
        </table>
     </form>
  </body>

后期在Struts2.x中需要使用struts的国际化标签。

时间: 04-16

java学习笔记—国际化(41)的相关文章

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my

Java学习笔记之继承

一.继承的基础 在Java术语中,被继承的类叫超类(superclass),继承超类的类叫子类(subclass). 举例说明: 1 class Box 2 { 3 public double width; 4 public double height; 5 public double depth; 6 7 //重载构造方法 8 public Box(Box ob) 9 { 10 width = ob.width; 11 height = ob.height; 12 depth = ob.dep

Java学习笔记之接口

一.接口的概念与定义 首先考虑一个简单的接口的定义: public interface Output { int MAX_LINE = 40; void out(); void getData(String msg); } 定义接口使用关键字interface 修饰符interface前面的public可以省略,如果省略,则采用默认访问控制,即只有在相同包结构的代码才可以访问此接口 接口不可以有构造方法(区别于类中的构造方法) 接口里面的所有成员,包括常量.方法等都是public访问权限,所以在

Java学习笔记之方法重载,动态方法调度和抽象类

一.方法重载 如果子类中的方法与它的超类中的方法有相同的方法名,则称子类中的方法重载超类中的方法,特别是当超类和子类中的方法名和参数类型都相同时,在子类中调用该方法时,超类中的方法会被隐藏.考虑下面程序: 1 class A 2 { 3 int i, j; 4 A(int a, int b) 5 { 6 i = a; 7 j = b; 8 } 9 10 // display i and j 11 void show() 12 { 13 System.out.println("i and j: &

Java学习笔记——动态代理

所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记--RMI"中的远程代理,其中客户端服务对象就是一个远程服务对象的代理,这个代理可以使得客户在操作时感觉像在操作本地对象一样,远程对象对于客户是透明的.我们可以看出这里的远程代理,是在程序中事先写好的,而本节我们要讨论的远程代理,是由JVM根据反射机制,在程序运行时动态生成的.(以上是本人的理解,如果有不正确的地

Java学习笔记3-操作符

Java基本操作符:+.-.*./.%.=.==.!=.+=.-=. 优先级:先乘除后加减,如果是连接符+号会优先往前匹配,比如 a+++++b,会被解释称 a++ ++ +b,所以会报错,需要自行使用括号隔离为 (a++) + (++b). 对象的引用如果赋值给了对象的引用后,2 个对象将指向同一个引用,有一个对象的引用重新赋值后将同时影响到另一个对象,比如 ClassName classA = new ClassName(); ClassName classB = new ClassName

java学习笔记10--泛型总结

java学习笔记系列: java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3--类与对象的基础 java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址:http://www.cnblogs.com/archimedes/p/java-study-note10.html,转载

Java学习笔记_25_Collections类

25.Collections类: Collections类是一个工具类,用来对集合进行操作,它主要是提供一些排序算法,包括随机排序.反相排序等. Collections类提供了一些静态方法,实现了基于List容器的一些常用算法. Collections的一些方法列表: · void sort(List): 对List内的元素进行排序. · void shuffle(List): 对List内的元素随机排序. · void reverse(List): 对List内的元素进行逆序排列. · voi

Java学习笔记心得——初识Java

初识Java 拿到这本厚厚的<Java学习笔记>,翻开目录:Java平台概论.从JDK到TDE.认识对象.封装.继承与多态...看着这些似懂非懂的术语名词,心里怀着些好奇与担忧,就这样我开始走进Java的世界.  Java产生的历史 Java来自于Sun公司的一个叫Green Project中撰写的程序语言,全球信息网(World Wide Web)兴起,Java Applet成为网页互动技术的代表,特别适合于Internet应用程序开发. Java语言的特点 1.面向对象 这是Java最重要