JavaWEB开发国际化
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开发国际化的更多相关文章
- JavaWeb开发——软件国际化(文本元素国际化)
前几天围绕着JDBC编程进行了系统的学习.现在我们对Java程序数据库操作已经是轻车熟路了.也学会了使用各种框架来帮助我们简化编程. 今天是学习计划的第七天,虽然学习热情没有前几天高涨了.但是,写博客 ...
- JavaWeb开发技术基础概念回顾篇
JavaWeb开发技术基础概念回顾篇 第一章 动态网页开发技术概述 1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页. 2.JSP的运行原理:当用户第 ...
- 深入分析JavaWeb Item22 -- 国际化(i18n)
一.国际化开发概述 软件的国际化:软件开发时,要使它能同一时候应对世界不同地区和国家的訪问,并针对不同地区和国家的訪问.提供对应的.符合来訪者阅读习惯的页面或数据. 国际化(international ...
- Javaweb之国际化
Javaweb之国际化 一.前言 软件的本地化:一个软件在某个国家或地区使用时,采用该国家或地区的语言,数字,货币,日期等习惯. 软件的国际化:软件开发时,让它能支持多个国家和地区的本地化应用.使得应 ...
- javaWeb开发小工具---MailUtils及其单元测试
本次介绍的是,在javaWeb开发中,我们不免会遇到发送邮件的需求,比如:用户注册账号,需要激活登录,以及服务器定期向会员发送礼品信息等.所以参考有关资料,写了这个MailUtils工具类. 1.Ma ...
- JavaWeb学习总结-01 JavaWeb开发入门
一 基本概念 1 Web开发的相关知识 Web,表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源(如html 页面): ...
- JavaWeb---总结(一)JavaWeb开发入门
一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...
- JavaWeb学习总结(一)——JavaWeb开发入门
http://www.cnblogs.com/xdp-gacl/p/3729033.html 只为成功找方法,不为失败找借口! JavaWeb学习总结(一)--JavaWeb开发入门 一.基本概念 1 ...
- JavaWeb学习总结(一)——JavaWeb开发入门(转载)
转载自http://www.cnblogs.com/xdp-gacl/p/3729033.html感谢孤傲苍狼的分享. 一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意 ...
随机推荐
- c/c++和java达到swap不同功能
首先我们来看看c/c++实施swap性能 void swap ( int & a, int & b) { int Temp; temp = a; a = b; b = temp; } ...
- C#操作Xml:使用XmlWriter写Xml
假定创建了XmlWriter的实例变量xmlWriter,下文中将使用此实例变量写Xml 1.如何使用XmlWriter写Xml文档声明 ? // WriteStartDocument方法可以接受一个 ...
- MVC4的过滤器
过滤器 提供的四种基本类型过滤器接口,IAuthorizationFilter.IActionFilter.IResultFilter和IExceptionFilter,可通过继承对应的接口和Filt ...
- 用css2属性clip实现网页进度条
前言 看了网上一些关于网页进度条样式的资料,有很多方式实现,针对其展现形式,有用图片的,有用css2属性clip,有用flash的,本人就学会了一种,下面就简单来介绍一下. css2的属性clip 如 ...
- 严重:IOException while loading persisted sessions:java.io.EOFException.
1.错误叙述性说明 严重:IOException while loading persisted sessions:java.io.EOFException. java.io.EOFException ...
- 小议 js 下字符串比较大小
原文:小议 js 下字符串比较大小 之前群里有人问如何比较两个时间大小,他的时间格式是 2014-08-08 而不是 2014-8-8.所以我给的方法是 直接比较,如: var a = "2 ...
- C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】
重载运算符和转换 --转换与类类型[上] 引言: 在前面我们提到过:能够用一个实參调用的位 unsignedchar 相同范围的值,即:0到255. 这个类能够捕获下溢和上溢错误,因此使用起来比内置u ...
- SQL点滴19—T-SQL中的透视和逆透视
原文:SQL点滴19-T-SQL中的透视和逆透视 透视 今天抽一点时间来看看透视和逆透视语句,简单的说就是行列转换.假设一个销售表中存放着产品号,产品折扣,产品价格三个列,每一种产品号可能有多种折扣, ...
- 单极型ADC如何测量负电压?
最常用的方法是使用一个运放做成加法器将负电压抬到0V以上,如果这样的输出超过了最大输出电压那么再使用比例衰减就可以办到了. 参考下面的讨论: http://www.amobbs.com/thread- ...
- 牛腩公布系统--HTTP 错误 403.14 - Forbidden
忘了是谁说的"至理名言",做牛腩公布系统,不怕出错误,就怕出跟牛老师不一样的错误!! 刚做就開始出现各种错误了,只是话说错误越多,收获越多.把每次困难都当做历练成长的机会.不多说, ...