概述
软件的本地化:一个软件在某个国家或地区使用时,采用该国家或地区的语言,数字,货币,日期等习惯。
软件的国际化:软件开发时,让它能支持多个国家和地区的本地化应用。使得应用软件能够适应多个地区的语言和文化风俗习惯。
随用户区域信息而变化的数据称为本地信息敏感数据。例如数字,货币等数据。
应用程序的国际化就是在应用软件的设计阶段,使软件能够支持多个国家和地区的用户的使用习惯。
国际化又称为 i18n:internationalization
软件国际化的特征
一个国际化的应用软件应有下面的特性:
对于程序中的本地信息敏感的数据(日期,货币等)能根据当前所在的国家或地区的文化习惯进行显示
对于文本元素(错误提示信息,状态信息等)不是直接写在应用程序中,而是存储在应用程序外部的资源文件中,在应用程序中通过程序代码来动态获得这些数据
无需修改和重新编译程序就能支持新的国家或地区的用户使用
Java 国际化解决方案
本文信息不能硬编码在程序代码中,而是需要将它们从应用程序中分离出来,在软件运行时根据本地信息读取相应的文本内容进行显示
数值,货币,时间,日期等本地敏感数据可能在程序运行时动态产生,所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理。Java 中提供了解决这些问题的 API 类(位于 java.util 包和 java.text 包中)
Locale 类
Locale 实例对象代表一个特定的地理,政治或文化上的区域
一个 Locale 对象本身不会验证它代表的语言和国家地区信息是否正确,只是向本地敏感的类提供本地信息,与国际化相关的格式化和解析任务由本地敏感的类(若JDK中的某个类在运行时需要根据 Locale 对象来调整其功能,这个类就称为本地敏感类)去完成
DateFormat 类
DateFormat 类可以将一个日期/时间对象格式化为表示某个国家地区的日期/时间字符串,也可以将表示某个本地的日期/时间的字符串解析为相应的日期/时间对象
DateFormat 类定义了一些用于描述日期/时间的显示模式的 int 型的常量,包括FULL, LONG, MEDIUM, DEFAULT, SHORT,这些常量用于描述表示日期/时间字符串的长度。这些常量说明表示的日期/时间的确切格式取决于具体的国家和地区
获取 DateFormat 对象
DateFormat 对象通常不是线程安全的,每个线程都应该创建自己的 DateFormat 实例对象
DateFormat 对象的方法:
format: 将日期/时间对象格式化为符合某个本地环境习惯的字符串
parse:将符合某个本地环境习惯的日期/时间字符串解析为日期/时间对象
NumberFormat 类
NumberFormat 可以将一个数值格式化为符合某个国家地区习惯的数值字符串,也可以将符合某个国家地区习惯的数值字符串解析为对应的数值
NumberFormat 类的方法:
format 方法:将一个数值格式化为符合某个国家地区习惯的数值字符串
parse 方法:符合某个国家地区习惯的数值字符串解析为对应的数值
MessageFormat 类
MessageFormat 类提供了一种参数替换模式字符串中的占位符的方式,它将根据模式字符串中包含的占位符产生一系列的格式化对象,然会调用这些格式化对象对参数进行格式化,并用格式化后的结果字符串替换模式字符串中的相应占位符。
模式字符串与占位符
模式字符串:
On {0}, {1} destroyed {2} houses and caused {3} of damage.
对模式字符串进行格式化操作时,需要采用数组的方式提供模式字符串中的每个占位符所对应的参数.
占位符有以下三种方式:
{argumentIndex}: 0-9 之间的数字,表示要格式化对象数据在参数数组中的索引号
{argumentIndex,formatType}: 参数的格式化类型
{argumentIndex,formatType,FormatStyle}: 与指定的格式化类型对应的模式,它的值必须是与相应的格式化类型匹配的合法模式或表示合法模式的字符串
MessageFormat 格式化模式字符串
MessageFormat 类可以格式化模式字符串,它根据其中的占位符产生一系列的格式化对象,然后调用这些格式化对象对参数进行格式化,并用格式化后的结果字符串替换模式字符串中的相应占位符。
格式化模式字符串的步骤:
创建 MessageFormat 对象:须指定格式化的模式字符串,也可以指定 Locale 对象来按某个国家地区的习惯进行格式化。
调用 MessageFormat 对象的 format 方法执行格式化操作:须为format 方法传递一个数组类型的参数,数组中的每个元素分别用于代替模式字符串中的与其索引号相对应的占位符
ResourceBundle 类
ResourceBundle 类用于描述一个资源包,一个资源包用于包含一组与某个本地环境相关的对象,可以从一个资源包中获取特定于本地环境的对象。对于不同的本地环境,可以有不同的 ResourceBundle 对象与之关联,关联的 ResourceBundle 对象中包含该本地环境下专有的对象
资源包简介
在设计一个国际化应用时,应该把程序显示的文本内容从源程序中分离出来,放在独立的资源文件中,并针对不同的本地环境编写不同的资源文件。这些资源文件被称为应用程序的资源包
应用程序在运行时,将从与用户的本地环境相对应资源文件中读取名称项对应的值的内容,由于同一个名称项在各个资源文件中对应的值内容是随本地环境信息而改变的,这样就实现了程序的静态文本内容的国际化。
当要为应用程序添加某个新的本地化支持时,只需编写一个适合的本地环境的资源文件即可,不用修改源程序代码
一个应用程序可以有多个资源包,一个资源包中的每个资源文件都拥有共同的基名。除了基名,每个资源文件的名称中还有标识其本地信息的附加部分。例如:一个资源包的基名是:“myproperties”, 则该资源包中与中文环境相对应的资源文件为: “myproperites_zh.properties”
一般情况下,每个资源包都有一个默认的资源文件,默认的资源文件不带标识本地信息的附加部分。若应用程序在资源包中找不到某个本地环境匹配的资源文件,最后将选择该资源包中的默认资源文件。
资源文件的内部格式
资源文件通常采用 java.util.Properties 类要求的文件格式,其中包含每项资源信息的名称项和值内容,每个名称项用于唯一地标识一个资源信息,值内容用于指定资源信息在某个本地环境下的内容
一个资源包中的所有资源文件中通常都应包含相同的名称项,与各个本地环境对应的资源文件中为这些名称项设置的值分别是适合该本地环境的内容。
资源文件完全遵循 java.util.Properties 类要求的文件格式,它要求资源文件中的字符必须全部为有效的 ASCII 字符。若资源文件中要包含非 ASCII 的字符,必须将它们转化成”\uXXXX”形式的转移序列,其中 XXXX 是该字符的 Unicode 编码的十六进制数值
使用 native2ascii 程序转换字符编码
JDK 中提供了一个 native2ascii 工具程序,它可以将某种本地字符集编码的字符转换成 Unicode 转义序列的形式
DOS 下进入 haha.txt 文件所在目录,运行下面的命令后将在当前目录下生成一个名为 hehe.properites 文件:
native2ascii -encoding gb2312 haha.txt haha.properites
装载资源包
ResourceBundle 类提供了存放和管理资源包的功能
当应用程序需要获取特定locale对象关联的资源包时,可以调用ResourceBundle的getBundle方法,并将locale对象作为参数传入。
Locale currentLocale = Locale.getDefault();
ResourceBundle myResources =
ResourceBundle.getBundle(“myproperties ", currentLocale);
如果与该locale对象匹配的资源包子类找不到,getBundle将试着查找最匹配的一个子类。如果特定locale对象的语言代码、国家代码和可选变量都是空值,则基名是唯一的候选资源包名称。
读取资源信息
加载资源文件后, ResourceBundle 的实例对象就可以使用 getString 方法获取指定的资源信息名称所对应的值。
String OkKey = myResources.getString("OkKey");
Web 应用程序的国际化
实现 web 应用国际化有两种方式:
针对不同语言和地区的用户开发出不同的 JSP 网页版本,当用户请求资源时,根据请求消息中携带的本地信息为用户提供合适的版本
将对本地环境敏感的资源数据(例如:错误提示信息,菜单文字等)从网页中分离出来,放在 .properties 属性资源文件中。对于应用程序中的数值,货币和日期/时间等本地敏感数据,可以通过占位符的方式设置它们的格式类型和格式模式。
获取 web 应用中的本地信息
要实现 web 应用的国际化,首先要获得客户端浏览器的本地信息。
在 Servlet 程序中,调用 HttpServletRequest 对象的 方法获得代表客户端本地信息的 Locale 对象:
getLocale():返回代表客户端的首选本地信息的 Locale 对象
getLocales():返回一个包含客户端支持的所有本地信息的 Locale 对象的 Enumeration 对象,这些Locale 对象按照客户端支持的所有本地信息的优先级在集合中一次排列
国际化格式标签库示例
国际化:<fmt:setLocale> <fmt::formatDate>
消息标签:<fmt:bundle> <fmt:message> <fmt:setBundle> <fmt:param>
所对应的读取文件为 dbconn.properties(放在WEB-INF/classes下了), 内容为:
国际化格式标签库简介
<fmt:bundle>标签用于绑定数据源.properties文件(基名):
<fmt:bundle basename="源文件名(且不能带后缀哦)" prefix="">
语句,代码等
</fmt:bundle>
<fmt:message>标签用于从指定的资源文件中把指定的键值取来:
<fmt:message key="" [var="varname"] [bundle=""] [scope="page|..."] />
如果用到var的话就不会在页面直接输出,而需要用到<c:out>标签来进行页面
的输出
<fmt:message>必须和<fmt:bundle >搭配使用
<fmt:message>标签可以配合<fmt:param>标签来进行设定<fmt:message>标签指向键的动态值
<fmt:setBundle>标签用于设置默认的数据来源:
<fmt:setBundle basename="" [ var=""] [scope="" ] />
<fmt:formatNumber>标签用于根据设定的区域将数据格式化输出;
<fmt:formatDate>标签用于格式化输出日期和时间;
<fmt:parseDate>标签用于把字符串类型的日期和时间转换成日期型数据类型;
<fmt:setTimeZone>标签用于设定默认的时区;
<fmt:timeZone>标签用于设定在本签体内有效的时区
小结
1. 什么是国际化和本地化:
I. 本地化:一个软件在某个国家或地区使用时,采用该国家或地区的语言,数字,货币,日期等习惯。
II. 国际化:软件开发时,让它能支持多个国家和地区的本地化应用。使得应用软件能够适应多个地区的语言和文化风俗习惯
III. 本地敏感数据: 随用户区域信息而变化的数据称为本地信息敏感数据。例如数字,货币, 日期,时间等数据
2. 相关的 API:
I. DateFormat 和 SimpleDateFormat √.
II. NumberFormat
III. MessageFormat
IV. ResourceBundle
V. Locale
3. 关于国际化资源文件:
I. properties 文件格式
II. 必须提供 基名.properties 文件和 基名_语言代码_国家代码.properties 文件
III. 相同的 基名 的资源文件必须有相同的 key.
IV. 可能需要使用 native2ascii 工具把非 asc 码转为 asc 码.
4. WEB 的国际化
I. 可以使用 request.getLocale() 获取 Locale 对象
II. 可以使用 JSTL 的 fmt 标签完成的国际化. 后面使用框架提供的标签完成.
III. 实现 "中文" "英文" 的切换:
> 提供两个超简洁. 携带不同的变量值
> 根据变量值确定对应的 Locale 对象
> 把 Locale 对象放入到 session 中
> 绑定 Locale 对应的资源文件.
IV. 其他 fmt 标签可以参考 standard-examples.war 中的例子.
相关推荐
为了实现语言种类切换在网上找了好久的资料,此实例是整合网上的资料通过自己精简生成的实例,调整积分方便下载
JavaWeb国际化开发语言代码表
JavaWEB开发-国际化 如何让java程序开发面向国际
java web 开发速学宝典第八章 李宁著 。实现国际化功能最直接的方法就是为每一个...为了解决这个问题,现在普遍的做法是将需要国际化的资源信息保存在资源文件中,并根据本地信息来读取相应资源文件中的国际化信息。
NULL 博文链接:https://286.iteye.com/blog/1068128
本Java视频教程涵盖JavaWEB 企业级开发所需的Servlet、JSP、MVC 设计模式、EL 表达式、JavaBean、国际化、Cookie和HttpSession、JavaMail等全部核心技术。授课过程中通过多个企业级案例,将各知识点融会贯通。 1....
涵盖JavaWEB 企业级开发所需的Servlet、JSP、MVC 设计模式、EL 表达式、JavaBean、国际化、Cookie和HttpSession、JavaMail等全部核心技术。
本文主要介绍javaWEB国际化的知识,这里整理了详细的资料及实现代码,有兴趣的小伙伴可以参考下
本Java视频教程涵盖JavaWEB 企业级开发所需的Servlet、JSP、MVC 设计模式、EL 表达式、JavaBean、国际化、Cookie和HttpSession、JavaMail等全部核心技术。 授课过程中通过多个企业级案例,将各知识点融会贯通。 ...
利用自定义标签,可以软件开发人员和页面设计人员合理分工:页面设计人员可以把精力集中在使用标签(HTML,XML或者JSP)创建网站上,而软件开发人员则可以将精力集中在实现底层功能上面,如国际化等,从而提高了工程生产...
目录 HTML总结 CSS总结 JavaScript总结 DOM总结 tomcat服务器 servlet基础 Request&Response编程 Cookie&Session XML语言 JSP技术入门 ...[总结]JavaWeb乱码问题 ...软件国际化 Java基础加强 JQuery Ajax JSON
一、国际化的相关知识 1、什么是国际化。 程序只有一套,能根据来访者的阅读习惯显示相应的文本、日期时间、货币符号。 2、固定文本的国际化 一个消息资源包:基名_语言_国家.properties ResourceBundle Locale ...
JavaWeb新版教程. JSON和Ajax请求&i18n国际化n-通过请求头实现国际化.avi
JavaWeb新版教程. JSON和Ajax请求&i18n国际化n-通过语言类型选择实现国际化.avi
JavaWeb新版教程. JSON和Ajax请求&i18n国际化n-使用JSTL标签库fmt实现国际化.avi
息处理计算机化为标志的 “微机革命 ”,随之而来的是以全球信息网络普及和全球信息共 享为标志的 “全球信息网络革命 ”的蓬勃兴起。可见,世界已进入在计算机信息管理领域 中激烈竞争的时代, 计算机已经变得普通...
javaweb课程设计基础知识+教程+课件,涵盖: 适合人群:大学生、毕业生、各在职人员需要系统补充基础的人员 ---JSTL_Core.ppt ...---_国际化11.ppt --- 文件的上传和下载ppt --- 标签与简单标签ppt
Java spring实现中英文切换配置,包含配置文件messages_en_US.properties和messages_zh_CN.properties以及具体配置信息
第2篇为表现层框架Struts技术,介绍了Struts2的工作原理、核心文件、数据校验与国际化、标签库、拦截器等。第3篇为持久层框架Hibernate技术,介绍了Hibernate的工作原理、核心文件、核心接口及相关插件的使用方法。...
视频涵盖JavaScript DOM、jQuery、Ajax、JavaWEB 企业级开发所需的Servlet、JSP、MVC 设计模式、EL 表达式、JavaBean、国际化、Cookie和HttpSession、JavaMail等全部核心技术,练手还有一个(图书商城)项目。