国际化的程序实现及其原理

国际化的程序实现原理

  所谓的国际化的程序指的是可以根据不同的国家实现不同的语言描述,但是程序处理的核心业务是相同的

--如果想要进行国际化的程序开发需要解决如下问题:

a.如何可以定义保存文字的文件信息
b.如何额可以根据不同的区域语言的编码读取指定的资源信息

一.Locale类

--通过分析发现,如果想要实现国际化,那么首先需要解决的就是不同国家用户的区域和语言编码的问题,而在java.util包中提供有一个专门描述区域和语言编码的类

--而后主要可以使用Locale中的两个构造方法进行实例化

Locale(String language)
从语言代码构建语言环境。
Locale(String language, String country)
从语言和国家构建语言环境。
Locale(String language, String country, String variant)
从语言,国家和变体构建语言环境。 

 --国际化对照表参考:每个国家对应的语言Locale和国家代码对照表--此时需要的是国家和语言的代码,而中文的代码为:zh_CN  美国英语的代码:en_US

 --范例:实例化Local对象

1 public class MyLocale {
2     public static void main(String[] args) {
3         Locale locale = new Locale("zh","cn");    //表示中文环境
4         System.out.println(locale);
5     }
6 }

--运行结果

 zh_CN 

--如果说想要自动获得当前的运行环境,那么就可以利用Local类本身默认的方式进行实例化:

static Locale    getDefault()
获取Java虚拟机的此实例的默认语言环境的当前值。 
1 public class MyLocale {
2     public static void main(String[] args) {
3         Locale locale = new Locale("en","us");    //表示英文环境
4         System.out.println(locale);
5         System.out.println(Locale.getDefault());
6     }
7 }

--运行结果

en_US
zh_CN

Process finished with exit code 0

--在实际的开发过程之中,很多人可能并不关心国家和语言的编码,所以为了简化开发,Locale类也将世界上比较著名的语言的代码参数设置为了常量:

static Locale    CANADA
对国家有用的常数。
static Locale    CANADA_FRENCH
对国家有用的常数。
static Locale    CHINA
对国家有用的常数。
static Locale    CHINESE
有用的语言常数
static Locale    ENGLISH
有用的语言常数
static Locale    FRANCE
对国家有用的常数。
static Locale    FRENCH
有用的语言常数
static Locale    GERMAN
有用的语言常数
static Locale    GERMANY
对国家有用的常数。
static Locale    ITALIAN
有用的语言常数
static Locale    ITALY
对国家有用的常数。
static Locale    JAPAN
对国家有用的常数。
static Locale    JAPANESE
有用的语言常数
static Locale    KOREA
对国家有用的常数。
static Locale    KOREAN
有用的语言常数
static Locale    PRC
对国家有用的常数。
static char    PRIVATE_USE_EXTENSION
私人使用扩展('x')的关键。
static Locale    ROOT
根区域的常用常数。
static Locale    SIMPLIFIED_CHINESE
有用的语言常数
static Locale    TAIWAN
对国家有用的常数。
static Locale    TRADITIONAL_CHINESE
有用的语言常数
static Locale    UK
对国家有用的常数。
static char    UNICODE_LOCALE_EXTENSION
Unicode区域扩展('u')的关键。
static Locale    US
对国家有用的常数。 

--运行结果
1
public class MyLocale { 2 public static void main(String[] args) { 3 Locale locale = new Locale("en","us"); //表示英文环境 4 System.out.println(locale); 5 System.out.println(Locale.getDefault()); 6 System.out.println(Locale.CHINA + " " + Locale.US); 7 } 8 }
en_US
zh_CN
zh_CN en_US

Process finished with exit code 0

二.读取资源文件 ResourceBundle

--当我们准备好资源文件,那么随后就需要进行资源文件耳朵读取操作,可以使用java.util.ResourceBundle类来完成,此类的定于如下

public abstract class ResourceBundle
extends Object

可以发现ResourceBundle类是一个抽象类,如果说现在想要进行此类对象的实例化,可以直接利用该类中提供的静态方法来完成

static ResourceBundle getBundle(String baseName) 
使用指定的基本名称,默认语言环境和调用者的类加载器获取资源包。  
static ResourceBundle getBundle(String baseName, Locale locale) 
使用指定的基本名称和区域设置以及调用者的类加载器获取资源包。  
static ResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader) 
使用指定的基本名称,区域设置和类加载器获取资源包。  
static ResourceBundle getBundle(String baseName, Locale targetLocale, ClassLoader loader, ResourceBundle.Control control) 
使用指定的基本名称,目标语言环境,类加载器和控件返回资源包。  
static ResourceBundle getBundle(String baseName, Locale targetLocale, ResourceBundle.Control control) 
使用指定的基本名称,目标语言环境和控件以及调用者的类加载器返回资源包。  
static ResourceBundle getBundle(String baseName, ResourceBundle.Control control) 
使用指定的基本名称,默认语言环境和指定的控件返回资源包。  

--baseName是资源文件的名称,但是没有后缀

--范例:使用ResourceBundle类读取内容,如果资源没有放在包里面,则直接编写资源名称即可

--在这里,需要注意一下资源文件的编写事项,如梭我们直接在资源文件中书写中文字符,那么在使用ResourceBundle类的静态方法获取到资源文件时,得到的结果将会是乱码  

1 class MyResourceBundle{
2     public static void main(String[] args) {
3         ResourceBundle message = ResourceBundle.getBundle("message");
4         System.out.println(message.getString("welcome"));
5     }
6 }

--运行结果 

"»¶Ó­À´µ½XXXϵͳ"

Process finished with exit code 0

 --为了避免这种现象的发生,我们需要将中文字符转化为Unicode码.可以通过JDK安装路径下bin文件中的该工具实现

--将该转义结果复制到我们的资源文件中

--再次执行程序得到结果

1 class MyResourceBundle{
2     public static void main(String[] args) {
3         ResourceBundle message = ResourceBundle.getBundle("message");
4         System.out.println(message.getString("welcome"));
5     }
6 }

--运行结果

欢迎来到XXX系统

Process finished with exit code 0

 --如果说没有读取到我们的资源文件,会出现如下异常

Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name messagse, locale zh_CN
    at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1573)
    at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1396)
    at java.util.ResourceBundle.getBundle(ResourceBundle.java:782)
    at 常用类库.国际化编程.MyResourceBundle.main(MyLocale.java:20)

Process finished with exit code 1

 --在进行资源读取的时候,获取的资源文件的key值必须存在,否则会发生如下异常

Exception in thread "main" java.util.MissingResourceException: Can't find resource for bundle java.util.PropertyResourceBundle, key welcomes
    at java.util.ResourceBundle.getObject(ResourceBundle.java:450)
    at java.util.ResourceBundle.getString(ResourceBundle.java:407)
    at 常用类库.国际化编程.MyResourceBundle.main(MyLocale.java:21)

 三.实现国际化程序

--在完成国际化程序实现的前期准备完成之后,就可以依靠资源文件,Locale类以及ResourceBundle类来完成国际化程序的处理操作

--范例:进行国际化的程序实现(核心关键:读取资源信息)

1.在CLASSPATH下建立国际化源文件:

 

--将之前所建立的无区域的资源文件也放入test包中,其中共有三个可供选择的资源文件

--通过程序进行指定区域的资源文件的加载

1 class LocaleTest {
2     public static void main(String[] args) {
3         ResourceBundle bundle = ResourceBundle.getBundle("test.Messages");
4         System.out.println(bundle.getString("welcome"));
5     }
6 }

--运行结果

欢迎来到XXX系统

Process finished with exit code 0

--我们发现在使用ResourceBundle进行资源文件读取时并没有指定一个明确的Locale对象,但是发现中文的资源文件起作用了,因为这个方法里面默认加载的就是当前本地的资源文件

1     @CallerSensitive
2     public static final ResourceBundle getBundle(String baseName)
3     {
4         return getBundleImpl(baseName, Locale.getDefault(),
5                              getLoader(Reflection.getCallerClass()),
6                              getDefaultControl(baseName));
7     }

 --可以发现在方法内部调用了Locale.getDefault()方法获取当前的区域编码,如果现在有需要也可以修改当前的Locale环境,则可以使用ResourceBundle类中的如下方法

1 class LocaleUSTest{
2     public static void main(String[] args) {
3         ResourceBundle bundle = ResourceBundle.getBundle("test.Messages",Locale.US);
4         System.out.println(bundle.getString("welcome"));
5     }
6 }

 --运行结果

welcome to this system

Process finished with exit code 0

 --如果现在有指定区域的资源文件存在的时候,那么没有设置区域的资源文件的信息将不会被读取,例如读取不存在资源文件的区域代码时,则将会读取我们本地的资源文件

1 class LocaleUSTest{
2     public static void main(String[] args) {
3         ResourceBundle bundle = ResourceBundle.getBundle("test.Messages",Locale.UK);
4         System.out.println(bundle.getString("welcome"));
5     }
6 }

 --运行结果

欢迎来到XXX系统

Process finished with exit code 0

 --当然如果本地的区域资源文件也不存在时,那么读取的就是没有区域的资源文件,即读取的先后顺序为:

  读取指指定区域的资源文件 > 默认的本地资源 > 没有区域设置的资源文件

四.消息格式化

--如果说现在某一个用户登录成功了,那么一般都会显示这样的信息,"XXX,欢迎您的光临",那么此时如果这些内容保存在了资源文件里面,则就需要通过占位符来进行描述,同时对于读取出来的数据也需要进行消息格式化,正如上文所说的欢迎来到XXX系统,那么这个XXX就是需要格式化的字符串内容,但是XXX这样的预留显得并不是特别方便,常规的可以使用{0}{1}这样的形式占位,对资源文件作出如下修改

--此时如果要进行文件的资源读取,那么占位符的信息也将一起读取出来,所以此时就需要利用MessageFormat类来完成,我们可以发现MessageFormat类是Format类的子类

1 Class MessageFormat
2 java.lang.Object 
3 java.text.Format 
4 java.text.MessageFormat 

 --范例,实现国际化:

1 class MyMessageFormatDemo{
2     public static void main(String[] args) {
3         ResourceBundle bundle = ResourceBundle.getBundle("test.Messages");
4         String welcome = bundle.getString("welcome");
5         String format = MessageFormat.format(welcome, "\n国际化模拟程序\n");
6         System.out.println(format);
7     }
8 }

 --运行结果

1 欢迎来到
2 国际化模拟程序
3 系统
4 
5 Process finished with exit code 0

--在实际的开发过程之中,见到资源文件中出现有{0},{1}这样的结构,说明该信息一定是占位符,需要惊进行信息的格式化

转载于:https://www.cnblogs.com/skykuqi/p/11370431.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该版本提供了下册详细目录可以快速查阅(当然已经提供详细书签) 基本信息 原书名: Programming Windows (Fifth Edition) 原出版社: Microsoft Press 作者: (美)Charles Petzold 译者: 北京博彦科技发展有限责任公司 丛书名: Microsoft 程序设计系列 出版社:北京大学出版社 ISBN:730104187X 上架时间:2004-11-16 出版日期:2004 年9月 页码:1376 版次:1-8 内容简介    如果对Windows开发有什么问题的话,请翻阅PetZold的著作吧。在《Window程序设计》(第5版)中,这位杰出的“Windows先锋奖”(Windows Pioneer Award)获得者根据最新的Windows操作系统权威技术修订了他的经典著作——再一次演示了基本的Win32程序设计的API核心内容。本书的内容包括:    ** 基本内容——输入、输出和对话框    ** Unicode概述    ** 图形——绘图、文本和字体、位图和元文件    ** 内核和打印机    ** 声音和音乐    ** 动态链接库    ** 多任务和多线程    ** 多文档界面    ** Internet和 Intranet的程序设计    其中采用的大多是具有代表性的示例,这本Petzold著作为使用 Windows 95、Windows 98或 Windows NT的各级windows程序员提供了最基本的参考和指导。没有经验的开发人员也可以从中获取大量的新知识。       作译者 本书提供作译者介绍    Charles Petzold从 1984年开始编写个人计算机程序,从 1985年开始编写 Microsoft Windows程序。他在《Microsoft Systems Joumal》1986年 12月号上发表了第一篇关于 Windows程序设计的杂志论文。从 1986年到 1995年,他为《PC Magazine》撰写“Environments”专栏,给读者介绍了Windows和OS/2程序设计的许多方面。 《Windows 程序设计》由微软出版社在1988年首次出版,后来被认为是这方面最好的导论性读本。在1994年5月,Petzold作为仅有的七个人之一(并且是唯一的作家)被《WindowcMagazine》和Microsoft公司授予Windows Pioneer奖, 以表彰他对 Microsoft Windows的成功做出的贡献. 在1999年秋天,微软出版社将出版Charles Petzold面向普通读者的第一本书. 暂时命名为 《Code:The Hidden Language of Computer Hardware and Software》, 这本书专门介绍数字信息的本质以及计算机处理数字信息的方式. 作者: Charles Petzold 1994年5月,Petzold作为仅有的七个人之一(并且是唯一的作家)被《Window Magazine》和Microsoft公司授予Windows Pioneer奖,以表彰他对 Microsoft Windows的成功做出的贡献。 Charles Petzold从1984年开始编写个人计算机程序,从1985年开始编写 Microsoft Windows程序。他在《Microsoft Systems Joumal》1986年 12月号上发表了第一篇关于Windows程序设计的杂志论文。从1986年到1995年,他为《PC Magazine》撰写“Environments”专栏,给读者介绍了Windows和OS/2程序设计的许多方面。 [同作者作品] Microsoft c#Windows程序设计(上下册) Microsoft Windows程序设计——Visual Basic.NET语言描述 Windows 3D编程(英文影印版) 目录 第一部分 基础知识 第一章 开始 l.1 windows环境 1.1.1 windows 简史 1.1.2 windows方面 1.1.3 动态链接 1.2 windows编程选项 1.2. 1 api和内存模式 1.2.2 语言选项 l.2. 3 编程环境 1.2.4 api文档 1.3 编写一个windows程序 1.3.1 字符模式(character-mode)模型 1.3.2 windows 等价程序 1.3.3 头文件 1.3.4 程序入口点 1.3.5 messagebox 函数 1.3.6 编译、链接和运行 第二章 unicode简介 2.1 字符集简史 . 2.1.1 美国标准 2.1.2 国际方面 2.1.3 扩展ascll 2.1.4 双字书字符集 2.1.5 unicode解决方案 2.2 宽字符和c 2.2.1 char数据类型 2. 2. 2 宽字符 2.2.3 宽字符库函数 2.2.4 维护单一源代码 2.3 宽字符和windows 2.3.1 windows 头文件类型 2.3.z windows 函数调用 2.3.3 windows的字符串函数 2.3.4 在 windows中使用 printf 2.3.5 格式化消息框 2.3.6 本书与国际化 第三章 窗口和消息 3.1 自己的窗口 3. 1.l 总体结构 3.1.2 hellowin程序 3. 1.3 总体考虑 3.1.4 注册商口类 3.1.5 创建窗口 3.1.6 显示窗口 3.1.7 消息循环 3.1.8 窗口过程 3.1.9 处理消息 3.1.10 播放声音文件 3.1.11 wm_paint消息 3.1.12 wm_destroy消息 3.2 windows编程的难点 3.2.l 别调用我,我会调用您 3.2.2 进队消息与不进队消息 3.2. 3 行动迅速 第四章 输出文本 4.l 绘制和刷新 4.1.1 wm_paint消息 4. 1.2 有效短形和无效矩形 4.2 gdi简介 4.2.l 设备描述表 4.2.2 获取设备描述表句柄:方法一 4.2.3 绘图信息结构 4.2.4 获取设备描述表句柄:方法二 4. 2. 5 textout:细节 4.2.6 系统字体 4.2.7 字符大小 4.2. 8 文本尺寸:细节 4.2.9 格式化文本 4. 2.10 综合使用 4.2.11 sysments1.c窗口过程 4.2.12 空间不够 4. 2.13 客户区的大小 4.3 滚动条 4.3.l 滚动条的范围和位置 4.3.2 滚动条消息 4.3.3 在sysmets中添加滚动功能 4.3.4 绘图程序的组 4.4 建立更好的滚动 4.4.l 滚动条信息函数 4.4.2 滚动范围 4.4.3 新sysmets 4.4. 4 不用鼠标怎么办 第五章 图形基础 5. 1 gdi的结构 5.1. 1 gdi原理 5.1.2 gdi函数调用 5.1.3 gdi日元 5. 1. 4 其他方面 5.2 设备描述表 5.2.l 获取设备描述表句柄 5.2.2 获取设备描述表信息 5.2.3 devcaps1程序 5.2.4 设备的大小 5.2.5 关于色彩 5.2.6 设备描述表属性 5.2.7 保存设备描述表 5.3 画点和线 5.3.l 写像素 5.3.2 直线 5.3.3 边界框函数 5. 3.4 贝塞尔样条 5.3.5 使用现有画笔(stock pens) 5.3.6 画笔的创建、选择和删除 5.3.7 填充空隙 5.3.8 绘图方式 5.4 绘制填充区域 5.4.1 polygon函数和多边形填充方式 5.4.2 用画刷填充内部 5.5 gdi映射方式 5.5.l 设备坐标和逻辑坐标 5.5.2 设备坐标系 5.5.3 机口和窗口 5.5.4 处理mm_text 5.5. 5 “度量”映射方式 5.5.6 “自作主张的”映射方式 5.5.7 whatsize 程序 5.6 短形、区域和剪裁 5.6.1 矩形函数 5.6.2 随机短形 5.6.3 创建和绘制区域 5. 6.4 短形与区域的剪裁 5.6.5 clover程序 第六章 键盘 6.1 键盘基础 6.1.1 忽略键盘 6.1.2 谁获得了焦点 6.1.3 队列和同步 6.1.4 击键和字符 6. 2 击键消息 6.2.1 系统击键与非系统击键 6.2.2 虚拟键码 6.2.3 iparam信息 6.2.4 换档状态 6.2.5 使用击健消息 6.2.6 为键盘增强sysmets 6.3 字符消息 6.3.1 四类字符消息 6.3.2 消息顺序 6.3.3 处理控制字符 6.3.4 死字符消息 6.4 键盘消息和字符集 6.4.1 keyviewi程序 6.4.2 外语键盘问题 6.4.3 字符集和字体 6.4.4 unicode怎么样? 6.4.5 truetype和大字体 6.5 插入符(不是光标) 6.5.l 插入符函数 6.5.2 typer 程序 第七章 鼠标 7.1 鼠标基础 7.1.1 一些简单的定义 7.2 客户区鼠标消息 7.2.l 简单的鼠标处理:一个例子 7.2.2 处理sha键 7.2.3 双击鼠标键 7.3 非客户区鼠标消息 7.3.1 命中测试消息 7.3.2 从消息产生消息 7.4 程序中的命中测试 7. 4. 1 一个假想的例子 7.4.2 示例程序 7.4.3 使用键盘仿真鼠标 7.4. 4 在checker中添加键盘接口 7.4. 5 将于窗口用于命中测试 7.4.6 checker中的子窗口 7.4.7 子窗口和键盘 7.5 捕获鼠标 7.5.1 设计矩形 7.5.2 捕获的解决方案 7.5.3 blokout2程序 7.6 鼠标轮 7.6.1 后会有期 第八章 计时器 8.1 计时器基础 8.1.1 系统和计时器 8.1.2 计时器消息不是异步的 8.2 计时器的使用:三种方法 8.2.1 方法一 8.2.2 方法二 8.2.3 方法三 8.3 计时器用于时钟 8.3.1 构造数字时钟 8.3.2 获取当前时间 8.3.3 显示数字和冒号 8.3.4 国际化 8.3.5 构造模拟时钟 8.4 为状态报告使用计时器 第九章 子商口控制 9.1 按钮类 9.1.1 创建于窗口 9.1.2 子窗口向父窗口发送消息 9.1.3 父窗口向子窗口发送消息 9.1.4 下压按钮 9.1.5 复选框 9.1. 6 单选按钮 9.1.7 分组框 9.1.8 更改按钮文本 9.1.9 可见的和启用的按钮 9.1.10 按钮和输入焦点 9.2 控制与颜色 9.2.1 系统颜色 9.2.2 按钮颜色 9.2.3 wm_ctlcolorbtn消息 9.2.4 拥有者给制按钮 9.3 静态类 9.4 滚动条类 9. 4. 1 colors1程序 9. 4.2 自动键盘接口 9. 4. 3 窗口子类化 9.4.4 给背景着色 9.4.5 给滚动条和静态文本着色 9.5 编辑类 9.5.l 编辑类风格 9.5.2 编辑控制通知 9.5.3 使用编辑控制 9.5.4 发送给编辑控制的消息 9.6 列表框类 9.6.1 列表框风格 9.6.2 将串放人列表框 9.6.3 选择和获取项 9.6.4 接收来自列表框的消息 9.6.5 一个简单的列表框应用程序 9.6.6 文件列表 9.6.7 windows的head程序 第十章 菜单及其他资源 10.l 图标、光标、字符串和定制资源 10.1.1 将图标添加到程序 10.1.2 获取图标句柄 10.1.3 在程序中使用图标 10.1.4 使用自定义光标 10.1.5 字符串资源 10.1.6 定制资源 10.2 菜单 10.2.1 菜单概念 10.2.2 菜单结构 10.2.3 定义菜单 10.2.4 在程序中引用菜单 10.2. 5 菜单和消息 10.2.6 示例程序 10.2.7 菜单设计规范 10.2.8 定义菜单的复杂方法 10.2.9 浮动弹出式菜单 10.2.10 使用系统菜单 10. 2.11更改菜单 10.2.12 其他菜单命令 10.2.13 创建菜单的非正规方法 10.3 键盘加速键 10.3.1 为什么要使用加速键 10.3.2 安排加速键的几条规则 10.3.3 加速健表 10.3.4 加载加速键表 10.3.5 键盘代码转换 10.3.6 接收加速键消息 10.3.7 菜单与加速键应用程序poppad 10.3.8 启用菜单项 10.3.9 处理菜单项 第十一章 对话框 11.1 模态对话框 11.1.1 创建about对话框 11.1.2 对话框及其模板 11.1.3 对话框过程 11.1.4 激活对话框 11.1.5 不同的主题 11.l.6 更复杂的对话框 11.1.7 使用对话框控制 11.l.8 ok和cancel按钮 11.1.9 避免全局变量 11.1.10 tab停留位和组 11.1.11 在对话框上绘图 11.1.12 将其他函数用于对话框 11.1.13 定义自己的控制 11.2 非模态对话框 11.2.l 模态对话框与非模态对话框的区别 11.2.2 新的 colors程序 11.2.3 hexcalc:窗口还是对话框? 11.3 通用对话框 11.3.l 增强poppad 11.3.2 unicode 文件 i/o 11.3.3 更改字体 11.3.4 查找与替换 11.3.5 只调用一个函数的windows程序 第十二章 剪贴板 12.1 剪贴板的简单使用 12.1.1 标准剪贴板数据格式 12.1.2 内存分配 12.1.3 将文本传送到剪贴板 12.1.4 从剪贴板上获取文本 12.1.5 打开和关闭剪贴板 12.1.6 剪贴板和unicode 12.2 复杂的剪贴板用法 12.2.l 利用多个数据项 12.2.2 延迟生成 12.2.3 私有数据格式 12.3 实现剪贴极查看器 12.3.1 剪贴板查看器链 12.3.2 剪贴板查看器的函数和消息 12.3.3 一个简单的剪贴板查看器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值