1、国际化开发概述

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

)国际化又称为 i18n:internationalization

2、合格的国际化软件

软件实现国际化,需具备哪些特征:

)对于程序(页面)中固定使用的文本元素,例如菜单栏、导航条等中使用的文本元素、或错误提示信息,状态信息等,需要根据来访者的地区和国家,选择不同语言的文本为之服务。

)对于程序动态产生的数据,例如(日期,货币等),软件应能根据当前所在的国家或地区的文化习惯进行显示。

3、固定文本元素的国际化

()对于软件中的菜单栏、导航条、错误提示信息,状态信息等这些固定不变的文本信息,可以把它们写在一个properties文件中,并根据不同的国家编写不同的properties文件。这一组properties文件称之为一个资源包。

)在JavaAPI中提供了一个ResourceBundle 类用于描述一个资源包,并且 ResourceBundle类提供了相应的方法getBundle,这个方法可以根据来访者的国家地区自动获取与之对应的资源文件予以显示。

package com.itheima.i18n;

import java.util.Locale;

import java.util.ResourceBundle;

public class Demo1 {

public static void main(String[] args) {

ResourceBundle bundle = ResourceBundle.getBundle("conf",Locale.US);

String value = bundle.getString("username");

System.out.println(value);

}

}

4、创建资源包和资源文件

)一个资源包中的每个资源文件都必须拥有共同的basename基名。除了基名,每个资源文件的名称中还必须有标识其本地信息的附加部分。例如:一个资源包的基名是“myproperties”,则与中文、英文环境相对应的资源文件名则为:

“myproperites_zh.properties”  “myproperites_en.properties”

)每个资源包都应有一个默认资源文件,这个文件不带有标识本地信息的附加部分。若ResourceBundle对象在资源包中找不到与用户匹配的资源文件,它将选择该资源包中与用户最相近的资源文件,如果再找不到,则使用默认资源文件。例如:

Myproperites.properties

5、语言和国别代码

6、资源文件的书写格式

)资源文件的内容通常采用“关键字=值”的形式,软件根据关键字检索值显示在页面上。一个资源包中的所有资源文件的关键字必须相同,值则为相应国家的文字。

)并且资源文件中采用的是properties格式文件,所以文件中的所有字符都必须是ASCII字码,对于像中文这样的非ACSII字符,须先进行编码。(java提供了一个native2ascII命令用于编码)。例:

属性文件是不能保存中文的

7、编程实现固定文本的国际化

)加载src下properties文件

ResourceBundle bundle = ResourceBundle.getBundle(basename);

)读取properties文件中内容

String value = bundle.getString(key);

)在读取properties文件时,可以传入一个Locale 实例对象,用于代表一个特定的地理,政治、文化区域

ResourceBundle bundle =

ResourceBundle.getBundle(basename, currentLocale);

)如果与该locale对象匹配的资源包子类找不到。一般情况下,则选用操作系统默认资源文件予以显示

)如果与该locale对象匹配的资源包子类找不到。一般情况下,则选用操作系统默认资源文件予以显示

)案例:制作国际化登陆页面

ResourceBundle bundle = ResourceBundle.getBundle("test", new Locale("ar"));

String prop = bundle.getString("prop1");

System.out.println(prop);

<fmt:setLocale value='en'/>

<fmt:setBundle basename="test" scope="page" var="t"/>

<fmt:message key="prop1" bundle="${t}"></fmt:message>

8、DateFormat类(国际化日期)

)DateFormat 类可以将一个日期/时间对象格式化为表示某个国家地区的日期/时间字符串。

)DateFormat 类除了可按国家地区格式化输出日期外,它还定义了一些用于描述日期/时间的显示模式的 int 型的常量,包括FULL, LONG, MEDIUM, DEFAULT, SHORT,实例化DateFormat对象时,可以使用这些常量,控制日期/时间的显示长度。

)Date date = new Date();

// 只需要显示 日期

// style 就可以 FULL LONG MEDIUM SHORT

DateFormat df1 = DateFormat.getDateInstance(DateFormat.FULL,

Locale.CHINA);

System.out.println(df1.format(date));

// 只需要显示时间

DateFormat df2 = DateFormat.getTimeInstance(DateFormat.LONG,

Locale.CANADA);

System.out.println(df2.format(date));

// 既需要日期也需要时间

DateFormat df3 = DateFormat.getDateTimeInstance(DateFormat.FULL,

DateFormat.FULL, Locale.GERMAN);

System.out.println(df3.format(date));

9、实例化DateFormat类

实例化DateFormat类有九种方式,以下三种为带参形式,下面列出的三种方式也可以分别不带参,或只带显示样式的参数。

)getDateInstance(int style, Locale aLocale):以指定的日期显示模式和本地信息来获得DateFormat实例对象,该实例对象不处理时间值部分。

)getTimeInstance(int style, Locale aLocale):以指定的时间显示模式和本地信息来获得DateFormat实例对象,该实例对象不处理日期值部分。

)getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale):以单独指定的日期显示模式、时间显示模式和本地信息来获得DateFormat实例对象。

package com.itheima.i18n;

import java.text.DateFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Locale;

import org.junit.Test;

public class DataFormatTest {

@Test

//将Date对象转换为指定样式指定语言环境的字符串时间表示形式

public void test1(){

Date date = new Date();

DateFormat format = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL, Locale.CHINA);

String dateStr = format.format(date);

System.out.println(dateStr);

}

//2013年7月27日 星期六 下午03时57分45秒 CST

@Test

public void test2() throws ParseException{

String dateStr = "2013年7月27日 星期六 下午03时57分45秒 CST";

DateFormat format = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL,Locale.CHINA);

Date date = format.parse(dateStr);

System.out.println(date);

}

@Test

public void test3() throws ParseException{

String dateStr = "2013~~~09@@@@09,16?00+00";

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy~~~MM@@@@dd,HH?mm+ss");

Date date = dateFormat.parse(dateStr);

System.out.println(date);

}

@Test

public void test4(){

Date date = new Date();

SimpleDateFormat dateFormat = new SimpleDateFormat("MM~~~yyyy~~~~dd:mm~~~ss+HH");

String dateStr = dateFormat.format(date);

System.out.println(dateStr);

}

}

10、NumberFormat类

)实例化NumberFormat类时,可以使用locale对象作为参数,也可以不使用,下面列出的是使用参数的。

)getNumberInstance(Locale locale):以参数locale对象所标识的本地信息来获得具有多种用途的NumberFormat实例对象

)getIntegerInstance(Locale locale):以参数locale对象所标识的本地信息来获得处理整数的NumberFormat实例对象

)getCurrencyInstance(Locale locale):以参数locale对象所标识的本地信息来获得处理货币的NumberFormat实例对象

)getPercentInstance(Locale locale):以参数locale对象所标识的本地信息来获得处理百分比数值的NumberFormat实例对象

public void demo4() {

// 请将0.78654321,输出百分比格式,保留两位小数

double d = 0.78654321;

double d2 = 0.543;

NumberFormat numberFormat = NumberFormat.getPercentInstance();

numberFormat.setMaximumFractionDigits(2);

numberFormat.setMinimumFractionDigits(2);

System.out.println(numberFormat.format(d));

System.out.println(numberFormat.format(d2));

}

public void demo3() throws ParseException {

,输出为货币形式:$198,并将¥198反向解析成整数198。

int n = 198; // 输出美元

NumberFormat format1 = NumberFormat.getCurrencyInstance(Locale.US);

format1.setMaximumFractionDigits(0);// 不要小数

System.out.println(format1.format(n));

String s = "¥198";

NumberFormat format2 = NumberFormat.getCurrencyInstance(Locale.CHINA);

Number m = format2.parse(s);

System.out.println(m);

}

package com.itheima.i18n;

import java.text.NumberFormat;

import java.text.ParseException;

import java.util.Locale;

import org.junit.Test;

public class NumberFormatTest {

//100 ---> ¥100

@Test

public void test1(){

double num = 100.00;

NumberFormat format = NumberFormat.getCurrencyInstance(Locale.US);

String str = format.format(num);

System.out.println(str);

}

//¥100.00 -- > 100.00

@Test

public void test2() throws ParseException{

String str = "¥100.00";

NumberFormat format = NumberFormat.getCurrencyInstance(Locale.CHINA);

double num = format.parse(str).doubleValue();

System.out.println(num);

}

//99.1% --0.991

@Test

public void test3() throws ParseException{

String str = "99.1%";

NumberFormat format = NumberFormat.getPercentInstance(Locale.CHINA);

double num = format.parse(str).doubleValue();

System.out.println(num);

}

//0.8812 ---> 88.12%

@Test

public void test4(){

double num = 0.8812;

NumberFormat format = NumberFormat.getPercentInstance(Locale.GERMAN);

format.setMinimumFractionDigits(3);

String str = format.format(num);

System.out.println(str);

}

}

11、MessageFormat(动态文本)

)如果一个字符串中包含了多个与国际化相关的数据,可以使用MessageFormat类对这些数据进行批量处理。

)例如:

At 12:30 pm on jul 3,1998, a hurricance destroyed 99 houses and caused $1000000 of damage

以上字符串中包含了时间、数字、货币等多个与国际化相关的数据,对于这种字符串,可以使用MessageFormat类对其国际化相关的数据进行批量处理。

)MessageFormat 类如何进行批量处理呢?

1.MessageFormat类允许开发人员用占位符{0}{1}{2}…替换掉字符串中的敏感数据(即国际化相关的数据)。

2.MessageFormat类在格式化输出包含占位符的文本时,messageFormat类可以接收一个参数数组,以替换文本中的每一个占位符。

12、格式化模式字符串

)模式字符串:

On {0}, a hurricance destroyed {1} houses and caused {2} of damage.

)MessageFormat类

默认Locale

format(String pattern, Object... arguments)  static

pattern 模式字符串

arguments 参数数组

自定义Locale

MessageFormat(String pattern, Locale locale)

format(Object obj)

String s = "At {0} on {1}, a hurricance destroyed {2} houses and caused {3} of damage";

Object[] args = { "12:30 pm", "jul 3,1998", "99", "$1000000" };

System.out.println(MessageFormat.format(s, args));

13、模式字符串与占位符

位符有三种方式书写方式:

){argumentIndex}: 0-9 之间的数字,表示要格式化对象数据在参数数组中的索引号

){argumentIndex,formatType}: 参数的格式化类型

){argumentIndex,formatType,FormatStyle}: 格式化的样式,它的值必须是与格式化类型相匹配的合法模式、或表示合法模式的字符串。

formatType:

number

date

time

choice

fomatStyle

short

medium

long

full

integer

currency

percent

Subformatpattern

String pattern = "At {0,time,short} on {0,date,medium},a destroyed {1}

houses and caused {2,number,currency} of damage."

Calendar calendar = Calendar.getInstance();

calendar.set(1998, 6, 3, 12, 30, 0);

Date date = calendar.getTime();

Object []msgArgs = {date, 99, 1000000};

String result = MessageFormat.format(pattern,msgArgs); // 默认国家

System.out.println(result);

// 动态文本高级应用

String s = "At {0,time,short} on {0,date,medium}, a hurricance destroyed {1,number,integer} houses and caused {2,number,currency} of damage";

// 第一个参数 日期对象12:30 pm on jul 3,1998

Calendar calendar = Calendar.getInstance();// 日历类

开始

calendar.set(1998, 6, 3, 12, 30, 0);

Date date = calendar.getTime();

int n = 99;

// 第三个参数 $1000000

int m = 1000000;

// 指定locale 是美国

MessageFormat messageFormat = new MessageFormat(s, Locale.US);

System.out.println(messageFormat.format(new Object[] { date, n, m }));

package com.itheima.i18n;

import java.text.MessageFormat;

import java.util.Calendar;

import java.util.Date;

import java.util.Locale;

import org.junit.Test;

public class MessageFormatTest {

//At 12:30 pm on jul 3,1998, a hurricance destroyed 99 houses and caused $1000000 of damage

@Test

public void test1(){

String str = "At {0,date,full} {1,time,full}, a hurricance destroyed {2,number} houses and caused {3,number,currency} of damage";

MessageFormat format = new MessageFormat(str,Locale.CHINA);

Calendar c = Calendar.getInstance();

c.set(1998, 6, 3, 12, 30, 0);

Date date = c.getTime();

Object [] objs = {date,date,99,1000000};

String result = format.format(objs);

System.out.println(result);

}

}

JavaWEB开发国际化的更多相关文章

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

    前几天围绕着JDBC编程进行了系统的学习.现在我们对Java程序数据库操作已经是轻车熟路了.也学会了使用各种框架来帮助我们简化编程. 今天是学习计划的第七天,虽然学习热情没有前几天高涨了.但是,写博客 ...

  2. JavaWeb开发技术基础概念回顾篇

    JavaWeb开发技术基础概念回顾篇 第一章 动态网页开发技术概述 1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页. 2.JSP的运行原理:当用户第 ...

  3. 深入分析JavaWeb Item22 -- 国际化(i18n)

    一.国际化开发概述 软件的国际化:软件开发时,要使它能同一时候应对世界不同地区和国家的訪问,并针对不同地区和国家的訪问.提供对应的.符合来訪者阅读习惯的页面或数据. 国际化(international ...

  4. Javaweb之国际化

    Javaweb之国际化 一.前言 软件的本地化:一个软件在某个国家或地区使用时,采用该国家或地区的语言,数字,货币,日期等习惯. 软件的国际化:软件开发时,让它能支持多个国家和地区的本地化应用.使得应 ...

  5. javaWeb开发小工具---MailUtils及其单元测试

    本次介绍的是,在javaWeb开发中,我们不免会遇到发送邮件的需求,比如:用户注册账号,需要激活登录,以及服务器定期向会员发送礼品信息等.所以参考有关资料,写了这个MailUtils工具类. 1.Ma ...

  6. JavaWeb学习总结-01 JavaWeb开发入门

    一 基本概念 1 Web开发的相关知识 Web,表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源(如html 页面): ...

  7. JavaWeb---总结(一)JavaWeb开发入门

    一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...

  8. JavaWeb学习总结(一)——JavaWeb开发入门

    http://www.cnblogs.com/xdp-gacl/p/3729033.html 只为成功找方法,不为失败找借口! JavaWeb学习总结(一)--JavaWeb开发入门 一.基本概念 1 ...

  9. JavaWeb学习总结(一)——JavaWeb开发入门(转载)

    转载自http://www.cnblogs.com/xdp-gacl/p/3729033.html感谢孤傲苍狼的分享. 一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意 ...

随机推荐

  1. 分享一下我的部分毕设内容:基于Windows Phone平台的污染源管理应用

    原文:分享一下我的部分毕设内容:基于Windows Phone平台的污染源管理应用 毕业半年,又总结了一下之前的工作,发现很多知识不复习都忘记了.最近新闻总是报道北京的空气污染,各种雾霾,各种PM X ...

  2. 内置在虚拟机上64位操作系统:该主机支持 Intel VT-x,但 Intel VT-x 残

    VT-Virtual Technology. 在这里特别说一下:虚拟64位操作系统,须要特别在BIOS中打开VT支持.怎样提示:此主机不支持Intel VT-x,则不可能虚拟出64位系统. 当提示:此 ...

  3. 【百度地图API】如何在地图上添加标注?——另有:坐标拾取工具+打车费用接口介绍

    原文:[百度地图API]如何在地图上添加标注?--另有:坐标拾取工具+打车费用接口介绍 摘要: 在这篇文章中,你将学会,如何利用百度地图API进行标注.如何使用API新增的打车费用接口. ------ ...

  4. 汽车之家购买价格PC真正的原因阿拉丁

        网行业风起云涌,先是6月3号汽车之家天价竞购百度PC阿拉丁.接着今天又有消息说易车拿下百度移动阿拉丁.易车拿下百度移动阿拉丁能够想象.但PC阿拉丁被向来不屑流量购买,以自主流量自居的汽车之家拿 ...

  5. [CLR via C#]1.2 将托管模块合并成程序集

    原文:[CLR via C#]1.2 将托管模块合并成程序集 1.CLR是不和托管模块一起工作的,CLR是和程序集一起工作的. 2. 程序集是一个或多个托管模块/资源文件的逻辑性分组.   3. 程序 ...

  6. 常用批处理命令总结3之Find和FindStr

    原文:常用批处理命令总结3之Find和FindStr find 作用:从文件中收索字符串 格式:find 参数 "字符串" 路径\文件名 参数: /V 显示所有未包含指定字符串的行 ...

  7. JS中5秒中跳转到其他页面

    原文:JS中5秒中跳转到其他页面 <head> <meta http-equiv="Content-Type" content="text/html; ...

  8. Ubuntu更改hosts档

    Ubuntu更改hosts档 打开hosts档 sudo gedit /etc/hosts 下载hosts,并全选复制 hosts 粘贴到hosts文件里.保存就可以 $(function () { ...

  9. 10个实用的PHP正则表达式汇总

    原文 10个实用的PHP正则表达式汇总 正则表达式是程序开发中一个重要的元素,它提供用来描述或匹配文本的字符串,如特定的字符.词或算式等.但在某些情况下,用正则表达式去验证一个字符串比较复杂和费时.本 ...

  10. UIButton UIImage 用法分析

    一.UIButton和UIImageView的区别 1.显示图片 1> UIImageView只能显示一种图片(图片默认会填充整个UIImageView) image\setImage: 2&g ...