分享
 
 
 

Java的i18n问题

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

广 州 市 东 山 区 国 税 局

苏 志 成

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

---- 实 现 目 标

---- 作 为i18n 程 序, 不 单 是 能 够 识 别 不 同 编 码 这 么 简 单。 它 应 能 解 决 如 下 问 题:

能 识 别 不 同 的 编 码 方 式, 如GB 码、BIG5 码 等;

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

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

---- 解 决 方 法

---- 不 同 地 区 码 的 识 别

---- 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")). 与 语 言 相 关 的 资 源 单 独 存 放

---- 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 数 组 存 放 的 是 键- 值 对。 每 对 中 的 第 一 个 元 素 是 键。 在 各 个 资 源 类 中 所 有 键 的 数 量 和 标 识 都 必 须 完 全 一 致。

---- 资 源 的 获 取

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

ResourceBundle bundle=ResourceBundle.getBundle

("WebTaxResource",currentLocale);

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

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

---- 匹 配 了 正 确 的 资 源 文 件 名 或 类 名 后, 要 获 取 某 键 对 应 的 值 就 变 得 相 当 容 易。 例 如, 要 创 建 标 识 为" 计 算 器" 的 标 签, 只 要 调 用 以 下 语 句:

label1=new Label(bundle.getString

("label_jisuanqi"), Label.CENTER);

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

---- 转 换 非UNICODE 资 源

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

native2ascii -encoding GB2321

WebTaxResource_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 = NumberFormat.getNumber

Instance(currentLocale);

amountOut = numberFormatter.format(amount);

System.out.println(amountOut + " " +

currentLocale.toString());

---- 当 然, 实 现Java 程 序 的i18n 还 有 很 多 问 题 要 考 虑, 如 不 同 语 言 的 语 法 问 题 等。 但 在Java 中, 只 有 你 不 想 做 的, 没 有 你 做 不 到 的。 遇 到 问 题 多 看 看 联 机 文 档 或 其 它 相 关 资 料, 一 般 都 能 得 到 满 意 的 答 案 的。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有