国际化

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. accept_mutex与性能的关系 (nginx)

    注:运行环境CentOS 6+   背景      在对启动了20个worker的nginx进行压力测试的时候发现:如果把配置文件中event配置块中的accept_mutex开关打开(1.11.3版 ...

  2. CORS详解[译]

    介绍 由于同源策略的缘故,以往我们跨域请求,会使用诸如JSON-P(不安全)或者代理(设置代理和维护繁琐)的方式.而跨源资源共享(Cross-Origin Resource Sharing)是一个W3 ...

  3. ASP.NET Core 1.1.0 Release Notes

    ASP.NET Core 1.1.0 Release Notes We are pleased to announce the release of ASP.NET Core 1.1.0! Antif ...

  4. Matlab 高脚杯模型切片

    前言:此文为去年我替人做的一个课题,觉得比较简洁,图形也比较美观,因此放在博文里 数据源我放到了百度云盘高脚杯数据源 有兴趣的可以下载数据,跑程序试一下.也可以单独看看代码,看下实现过程. 主函数 % ...

  5. jQuery动画-圣诞节礼物

    ▓▓▓▓▓▓ 大致介绍 下午看到了一个送圣诞礼物的小动画,正好要快到圣诞节了,就动手模仿并改进了一些小问题 原地址:花式轮播----圣诞礼物传送 思路:动画中一共有五个礼物,他们平均分布在屏幕中,设置 ...

  6. 通过三次优化,我将gif加载优化了16.9%

    WeTest 导读 现在app越来越炫,动不动就搞点动画,复杂的动画用原生实现起来挺复杂,如是就搞起gif播放动画的形式,节省开发成本.   背 景 设计同学准备给一个png序列,开发读取png序列, ...

  7. Spring中Bean的作用域、生命周期

                                   Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...

  8. ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案

    好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...

  9. C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”

    Q: 在反序列化 Xml 字符串为 Xml 对象时,抛出如下异常. 即在 XML文档(0, 0)中有一个错误:缺少根元素. A: 首先看下代码: StringBuilder sb = new Stri ...

  10. java web学习总结(五) -------------------servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...