软件的国际化:

软件在不同的地方,适应不同的风格:

中国: 显示中文,以及服务符合中国习惯的文本字符串!

美国: 显示英文,以及服务符合他国习惯的文本字符串!

这种软件,就叫国际化的软件!

如何做到国际化的软件,要求:

  1. 软件中存储特定的字符串
  2. 知道浏览器当前使用哪种语言(Locale  )

相关API

一、Locale 实例对象代表一个特定的地理,政治、文化区域。
(一个 Locale 对象本身不会验证它代表的语言和国家地区信息是否正确,只是向本地敏感的类提供国家地区信息,与国际化相关的格式化和解析任务由本地敏感的类去完成。(若JDK中的某个类在运行时需要根据 Locale 对象来调整其功能,这个类就称为本地敏感类)

二、ResourceBundle类提供了一个静态方法getBundle,该方法用于装载资源文件,并创建ResourceBundle实例:

加载资源文件后, 程序就可以调用ResourceBundle 实例对象的 getString 方法获取指定的资源信息名称所对应的值。


Locale  本地化

Java提供了一个本地化的对象!封装当前语言、国家、环境等特征!

首先来测试一下

        //本地化对象,封装语言、国家、信息的对象
//由java.util包提供
@Test
public void test() {
//Locale locale=Locale.CHINA;
Locale locale=Locale.getDefault(); //当前系统默认的语言环境
System.out.println(locale); //zh_CN 中文-中国
System.out.println(locale.getCountry()); //CN 国家的简称
System.out.println(locale.getDisplayCountry()); //中国 显示完整国家
System.out.println(locale.getLanguage()); //zh 语言简称
//模拟美国
Locale locale2=Locale.US;
System.out.println(locale2.getCountry());
System.out.println(locale2.getDisplayCountry());
}

然后改为美国(Locale.CHINA——》Locale.US)

  @Test
public void test2() {
//模拟美国
Locale locale2=Locale.US;
System.out.println(locale2.getCountry());
System.out.println(locale2.getDisplayCountry());
}

运行结果如图:


国际化

  静态数据国际化

  

    国际化的软件:

    1. 存储所有国家显示的文本的字符串

        a)         文件: properties

        b)        命名:  基础名_语言简称_国家简称.properties

          例如:msg_zh_CN.properties     存储所有中文

          Msg_en_US.properties    存储所有英文

    1. 程序中获取

        ResourceBundle类,可以读取国际化的资源文件!

先创建两个properties文件,一个代表中文,另外一个代表英文

注意不能再source视图中去编辑,只能在properties视图中去add,add之后转换到source视图就会知道为什么了。

现在来添加java代码:

//国际化
@org.junit.Test
public void test() {
//中文语言环境
Locale locale=Locale.CHINA;
//创建工具类对象ResourceBundle
ResourceBundle bundle=ResourceBundle.getBundle("com.gqx.international_i18.msg", locale);
//根据key获取配置文件中的值
System.out.println(bundle.getString("hello"));
System.out.println(bundle.getString("username"));
System.out.println(bundle.getString("pwd"));
}

然后做对应的改变(Locale.CHINA——》Locale.US)会看到如下如的变化

但是,我们会想到,如果是金钱数目或者时间等,他们是变化的,不确定的,我们没办法将其通过数据保存下来,然后一一对应来解决。这个时候需要通过动态国际化来解决啦

动态文本国际化

数值,货币,时间,日期等数据由于可能在程序运行时动态产生,所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理。Java 中提供了解决这些问题的 API 类(位于 java.util 包和 java.text 包中)

国际化货币
NumberFormat.getCurrencyInstance();
国际化数字;
NumberFormat.getNumberInstance();
国际化百分比
NumberFormat.getPercentInstance();
国际化日期
DateFormat.getDateTimeInstance(dateStyle, timeStyle);

(1)、国际化货币

	  //国际化-动态文本-国际化货币
@org.junit.Test
public void test4() {
//模拟语言环境
Locale locale=Locale.US;
//数据
double number=100;
//工具类
NumberFormat nf=NumberFormat.getCurrencyInstance(locale);
//国际化货币
String m=nf.format(number);
System.out.println(m);
}

	//计算	$100.00*10(不能通过字符串的拆分方式实现)
@org.junit.Test
public void test5() throws ParseException {
String string="$100";
int num=10;
//1、分析string是哪一个国家的货币
Locale locale=Locale.US;
//2、国际化工具类
NumberFormat nf=NumberFormat.getCurrencyInstance(locale);
//3、解析货币
Number n=nf.parse(string);
System.out.println(n.intValue()*num);
}

  

(2)、国际化数字

		//国际化-动态文本-国际化数字
@org.junit.Test
public void test6() {
//模拟语言环境
Locale locale=Locale.US;
NumberFormat nf=NumberFormat.getNumberInstance(locale);
String str=nf.format(10000000);
System.out.println(str);
}

(3)、国际化日期

                  //国际化-动态文本-国际化日期
/**
* 日期:
* FULL:2016年11月30日 星期三
* LONG: 2016年11月30日
* MEDIUM:2016-11-30
* SHORT:16-11-30
* 日期:
* FULL:下午03时47分08秒 CST
* LONG:下午03时49分43秒
* MEDIUM:15:51:31
* SHORT:下午3:53
*/
@org.junit.Test
public void test7() {
//模拟语言环境
Locale locale=Locale.CHINA;
//日期格式
int dateStyle=DateFormat.SHORT;
//时间格式
int timeStyle=DateFormat.SHORT;
//工具类
DateFormat df=DateFormat.getDateTimeInstance(dateStyle, timeStyle);
String date=df.format(new Date());
System.out.println(date);
}

  

将时间值:16-11-30下午16时25分30秒 CST,反向解析成一个打他对象

				//将时间值:16-11-30下午16时25分30秒 CST,反向解析成一个打他对象
@org.junit.Test
public void test8() throws ParseException {
String str="16-11-30 下午16时25分30秒 CST";
//日期格式
int dateStyle=DateFormat.SHORT;
//时间格式
int timeStyle=DateFormat.FULL;
//工具类
DateFormat df=DateFormat.getDateTimeInstance(dateStyle, timeStyle,Locale.getDefault());
Date date=df.parse(str);
System.out.println(date);
}

 


Jsp页面国际化 – 使用jstl标签

    <fmt:setLocale value=""/>        设置本地化对象

<fmt:setBundle basename=""/>     设置工具类

<fmt:message></fmt:message>     显示国际化文本

格式化数值

<fmt:formatNumber pattern="#.##" value="100.99"></fmt:formatNumber>

格式化日期:

<fmt:formatDate pattern="yyyy-MM-dd" value="${date}"/>

如下代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--引入jstl国际化与格式化标签库 --%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<!-- 一、设置本地化对象 -->
<fmt:setLocale value="${pageContext.request.locale}"/>
<!-- 二、设置工具类 -->
<fmt:setBundle basename="com.gqx.international_i18.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国际化(jsp中使用)

    在jsp页面中使用国际化方法,首先将jstl开源架包:jstl.jar,standard.jar导进去 并在src目录下建立以test开头,.properties结尾的文件:test_en_US.pr ...

  2. javaWEB国际化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用

    DateFormat:格式化日期的工具类,本身是一个抽象类: NumberFormat:格式化 数字 到 数字字符串,或货币字符串的字符类; MessageFormat: 可以格式化模式字符串,模式字 ...

  3. javaweb 国际化

    国际化又称为 i18n:internationalization 软件实现国际化,需具备哪些特征:对于程序中固定使用的文本元素,例如菜单栏.导航条等中使用的文本元素.或错误提示信息,状态信息等,需要根 ...

  4. 11.javaweb国际化标签库

    一.国际化标签库 1,格式化标签库提供的标签 2,标签详解 2.1<fmt:setLocale>标签 下面设置不同的区域,并在设置的区域下显示日期 2.2<fmt:requestEn ...

  5. 【转载】SpringMVC学习笔记

    转载于:SpringMVC笔记 SpringMVC 1.SpringMVC概述 MVC: Model(模型): 数据模型,提供要展示的数据,:Value Object(数据Dao) 和 服务层(行为S ...

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

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

  7. JavaWeb之多语言国际化

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

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

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

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

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

随机推荐

  1. Ubuntu14.04强化之conky——Harmattan主题

    一共有17个主题,四种模式,两种天气模式,支持摄氏度和华氏度. This conky comes with 17 themes: Cards Elementary Elune Flatts Metro ...

  2. JniHelper 含安卓推送

    using System; using System.Runtime.CompilerServices; using UnityEngine; internal static class JniHel ...

  3. Memcached总结一:memcached简介及适用和不适应场景

    Memcached是免费的,开源的,高性能的,分布式内存对象的缓存系统(键/值字典),旨在通过减轻数据库负载加快动态Web应用程序的使用. Memcached是由布拉德·菲茨帕特里克(Brad Fit ...

  4. easyui源码翻译1.32--Resizable(调整大小)

    前言 使用$.fn.resizable.defaults重写默认值对象 下载该插件翻译源码 源码 /** * jQuery EasyUI 1.3.2 * *翻译:qq 1364386878 Resiz ...

  5. 152. Maximum Product Subarray

    题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...

  6. java中path和classpath

    Path 路径,是java编译时需要调用的程序(如java,javac等)所在的地方; CLASSPATH的作用是指定查找类的路径:当使用java命令执行一个类(类中的main方法)时,会从class ...

  7. 以编程方式使用 Word 中的内置对话框

    使用 Microsoft Office Word 时,有时需要显示用户输入对话框.虽然可以创建自己的对话框,您也许还希望采用使用 Word 中内置对话框的方法,这些对话框在Application 对象 ...

  8. Rabin-Miller算法

    首先附上matrix67大神的讲解: --------------------------------------------------------------------------------- ...

  9. boundingRectWithSize 的使用, 计算UILable高度, 包含Emoji及多属性string.

    iOS的文字高度计算一直是个问题, 苹果也一直在改, 这几天看了一下 boundingRectWithSize 方法. - (CGRect)boundingRectWithSize:(CGSize)s ...

  10. 理解SVG坐标系和变换:视窗,viewBox和preserveAspectRatio

    SVG元素不像HTML元素一样由CSS盒模型管理.这使得我们可以更加灵活定位和变换这些元素-也许一眼看上去不太直观.然而,一旦你理解了SVG坐标系和变换,操纵SVG会非常简单并且很有意义.本篇文章中我 ...