快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

JAVA的本地化问题

Java 的i18n 问题,即Java 的Internationalization 问题, 指的是如何使应用程序能够同时支持多种语言的问题。对我国这样的非英语国家而汉字又有多种编码方法的情况下具有现实意义。本文将对用java 编制i18n 程序的方式作一介绍。

一、实现目标
  作为i18n 程序,不单是能够识别不同编码这么简朴。它应能解决如下问题:
  *能识别不同的编码方法,如GB 码、BIG5 码等;

  *与编码有关的元素,如状态行、消息、按钮的caption 等应在程序之外存储。使新增一种语言时不用修改程序;

  *根据不同的语言习惯动态调整与语言相关的元素,如数字、金额、日期等的显示。

二、解决方式
  1.?不同地区码的识别
  Java 中用Locale 类识别不同的地区码。创建Locale 类的实例时指定了语言代码和地区代码。创建GB 中文和BIG5 中文资源的Locale 类实例的语句分别如下:zhLocale=new Locale("zh","CN");twLocale=new Locale("tw","TW")。此构造函数第一个参数是ISO -639 中定义的语言代码(http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt);第二个参数为ISO -3166 中定义的国家代码(http://www.chemie. fu -berlin.de/diverse/doc/ISO ?3166.html)。当用户选定了适用的语言后,应将此Locale 设为默认值:Locale.setDefault(new Locale("zh","CN")).

  2. 与语言相关的资源单独存放

  Java 提供了两种方式存放与语言相关的资源。一种是用文本文件;另一种是用ListResourceBundle 资源类。下面分别阐述两者的不同之处。
  *文本文件

  使用文本文件存放资源的好处是简朴易用。可以用任何文本编辑器编写此文件,而且当修改资源时无须重新编译程序。其格式是´ 键= 值´ 的列表。例子如下:


  #The list in WebTaxResource_zh_CN.properties

 button1= 税金

 button2= 税率

 status1= 初始化中

  其中以´ #´ 开头的行为注释行。对应每一种语言写一个这样的资源文件,但所有的资源文件都必须包含一样的键。
  *ListResourceBundle 资源类

  虽然用文本文件存储资源异常轻易,但它只能存储字符对象。而对于数字、自定义对象等它就无能为力了。因此Java 提供了ListResourceBundle 类。其缺点是每次对资源的修改都必须重新编译程序。此类的结构如下:


  //file WebTaxResource_zh_CN.java

  import java.util. *;

  public class WebTaxResource_zh_CN extends

  ListResourceBundle {

static final Object[][] contents = {

  {"frametitle"," 工资、薪金所得适用"},

  {"label_qizhengdian"," 起征点:"},

  {"label_shuikuan"," 税款:"},

  {"label_shourue"," 收入额:"},

  {"checkbox_qiushouru"," 求收入"},

  {"checkbox_qiushuie"," 求税额"},

  {"lable1"," 简易税金计算器"},

  {"button1"," 工资、薪金个人所得税计算"},

  {"button_caculate"," 计算"},

};

public Object[][] getContents() {

  return contents;

}

}

  其中两维的Object 数组存放的是键-值对。每对中的第一个元素是键。在各个资源类中所有键的数量和标识都必须完全一致。

  3. 资源的获取

  不同语言的资源存放的文件名都不一样,那如何从准确的文件取得我们需要的资源呢?注意到前面例子中properties 文件名和ListResourceBundle 类名中下划线后的部分吗?没错,它们就是在创建Locale 实例时指定的语言代码和地区代码!剩下的问题就是要解决下划线前面的基本类名部分了。它是由一个ResourceBundle 类的实例来指定的:


   ResourceBundle

   bundle=ResourceBundle.getBundle("WebTax ? 

Resource",currentLocale);

  getBundle 的第一个参数指定了资源文件和资源类的基本类名;第二个参数是你所创建的Locale 的实例,指定了当前程序所有资源默认的语言代码和地区代码。

  可见,资源文件名或类名是由" 基本类名_ 语言代码_ 地区代码" 组成的。Java 将先查找有无此名称的类,若没有则查找具有此名称的properties 文件。

  匹配了准确的资源文件名或类名后,要获取某键对应的值就变得相称轻易。例如,要创建标识为" 计算器" 的标签,只要调用以下语句:
  label1=new Label(bundle.getString("label_ jisuanqi"), Label.CENTER);

  getString 方式的参数是资源文件中的键名。除了getString 外,ResourceBundle 类还提供了其他方式获取不同的对象,如getStringArray、getObject 等(因为在ListResourceBundle 的实例中答应存在非字符对象)。

  4. 转变非Unicode 资源

  在Java 内部字符是用Unicode 字符表示的。Unicode 是一种16bit 的编码,支持大多数地区的语言。详细标准可到http://www.unicode.org/index.html 查询。因此,无论是用文本文件还是用资源类的方法存储资源,都应该将非Unicode 字符转变为Unicode 字符。Java 为我们提供了转变的工具-Native2ascii。将含有GB 编码的汉字的WebTaxResource_zh.CN.properties 文件转变为只含Unicode 字符的例子如下:


 native2ascii -encoding GB2321 WebTaxRe

source_zh_CN.properties

   .outputWebTaxResource_zh_CN.properties

  到此为止,一个支持i18n 的程序就已初步完成了。

三、其他相关问题
  正如实现目标中所讲到,支持i18n 的程序不但要识别不同的编码方法,还要根据不同的语言习惯动态调整与语言相关的元素,如数字、金额、日期等的显示。例如在法文中数值123456.78 表示为123 456,78;而在德文中应表示为123.456,78。除了数值和货币之外,不同语言有不同表示的元素还有日期、时间和文本消息。Java 提供了NumberFormat、DateFormat、MessageFormat 类根据不同的Locale 实例动态改变这些元素的显示模式。下面的例子将根据不同的Locale 实例改变数值123456.78 的显示方法。

   Double amount = new Double (123456.78);

   NumberFormat numberFormatter;

       String amountOut;

       numberFormatter = NumberFormatgetNumber ?

Instance(currentLocale);

      amountOut = numberFormatter.format

(amount);

      System.out.println(amountOut +" " +

currentLocale.toString());

  当然,实现Java 程序的i18n 还有很多问题要考虑,如不同语言的语法问题等。但在Java 中,碰到问题多看看联机文档或其他相关的资料,一般都能得到满足的答案。
返回类别: 教程
上一教程: RESIN/TOMCAT和MYSQL的连接解决方式
下一教程: JSP留言板源代码4

您可以阅读与"JAVA的本地化问题"相关的教程:
· java日记(3) 类的初始化问题(CSDN一个问题有感)
· Java用户界面本地化实例探索
· 用Java解决国际化问题
· 每个初学JAVA者都应该搞懂的问题
· JAVA常见问题集锦
    微笑服务 优质保证 索取样品