国际化

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标签,即国际化与格式化标签库

常用的一些标签

  • fmt:setLocale :设置本地化对象标签

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

    语法:
<fmt:setLocale value=“locale”
[variant=“variant”]
[scope=“{page|request..}”]/>
  • fmt:setBundle : 设置工具类标签

    该标签用于根据fmt:setLocale标签设置的本地化信息创建一个资源包实例对象,并将其绑定到一个指定的web域中

    语法:
<fmt: setBundle basename=“basename”
[var=“varname”]
[scope=“{page|request|session|application}”] />
  • fmt:message</fmt:message> :显示国际化文本标签

    该标签用于从一个资源包中读取信息并进行格式化输出

    语法:
<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>

JavaWeb的国际化的更多相关文章

  1. Javaweb之国际化

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

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

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

  3. JavaWEB开发国际化

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

  4. JavaWeb的国际化(17/4/8)

      国际化的缺点: 因为文字不同,所以带来的排版问题一样严重,通常都是重新在写一个网站反而更加清晰,快捷 1:需要从浏览器中获取到浏览器语言(Accept-Language) 2:利用locale获取 ...

  5. javaweb学习总结(三十一)——国际化(i18n)

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

  6. JavaWeb之多语言国际化

    这周打算把国际化.JDBC和XML学习一下,从下周就开始学习三大框架,再坚持一个半月吧就能入门JavaWeb了,上周周末两天过的真是生不如死,两天坐在家里,醒来就写博客,原本在公司也自己操作了一遍,其 ...

  7. JavaWeb 后端 <十三> 之 监听器 JSTL国际化

    1. 监听器 1.1   概述 监听器: 主要是用来监听特定对象的创建或销毁.属性的变化的! 是一个实现特定接口的普通java类! 对象: 自己创建自己用 (不用监听) 别人创建自己用 (需要监听) ...

  8. Javaweb学习笔记——(二十)——————Javaweb监听器、国际化

    Javaweb监听器     三大组件         *Servlet         *Listener         *Filter Listener:监听器         1.初次相见:A ...

  9. 超全面的JavaWeb笔记day20<监听器&国际化>

    JavaWeb监听器 三大组件: l Servlet l Listener l Filter Listener:监听器 1. 初次相见:AWT 2. 二次相见:SAX 监听器: l 它是一个接口,内容 ...

随机推荐

  1. 关于ubuntu实机与虚机互相copy

    我的开发环境是在ubuntu上的,但是ubuntu上没有官方支持的QQ,有些不太方便,所以在上面虚了一个Win7(先是win10,但是win10最新版本太坑了,不说了),不过经常会出现复制文件,或者文 ...

  2. 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)

    前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...

  3. Android和JavaScript相互调用的方法

    转载地址:http://www.jb51.net/article/77206.htm 这篇文章主要介绍了Android和JavaScript相互调用的方法,实例分析了Android的WebView执行 ...

  4. javascript工厂模式和构造函数模式创建对象

    一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...

  5. MySQL碎碎念

    1. 如何修改Mysql的用户密码 mysql> update mysql.user set password=password('hello') where user='root'; mysq ...

  6. PHP设计模式(五)建造者模式(Builder For PHP)

    建造者模式:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式. 设计场景: 有一个用户的UserInfo类,创建这个类,需要创建用户的姓名,年龄,爱好等信息,才能获得用 ...

  7. 中国CIO最关心的八大问题(上)

    中国CIO最关心的八大问题(上) 近期,ITValue和ValueResearch联合展开<IT决策者投资与生存状态大调查>,调查范围从关注CIO本身,延展至关注CIO所供职企业--其赖以 ...

  8. 熊乐:H3 BPM为加速企业流程管理提供源动力

    近日,在北京·金隅喜来登酒店,H3 BPM以"让天下没有难用的流程"为主题,正式发布H3 BPM10.0版本.全新的业务流程管理系统在易用性方面大大提升,并且全面支持Java与.N ...

  9. Jquery 获得当前标签的名称和标签属性

    得到标签的名称 $("#name").prop("tagName"); 或者 $("#name")[0].tagName; 注意:1.得到的 ...

  10. win10电脑优化

    Windows10必做的优化 --道心 关闭服务 右键点击"此电脑",选择"管理",进入"计算机管理"窗口. 在左侧的菜单选择"服 ...