本文尝试用一个简单的例子来演示在书写Java应用程序时候怎样使之符合国际化标准然后对其进行本地化有多么简单
当一个软件产品需要在全球范围应用的时候得考虑在不同的地域和语言环境下面的使用情况最简单的要求就是UI上的信息上能用本地化语言来显示当然一个优秀的全球化软件产品关于国际化和本地化的要求远远不止于此本文只是涉及了国际化和本地化的关于界面显示语言的一小部分Java语言内核基于Unicode提供了对不同国家和不同语言文字的内部支持由于先天的原因Java对于国际化的支持远远要比C/C++来的优越
在开始具体介绍之前需要先介绍几个术语
in: 就是internationalization 国际化由于首字母i和末尾字母n间有个字符所以简称in internationalization指为了使应用程序能适应不同的语言和地区间的变化而不作系统性的变化所采取的设计措施
ln: 就是localization 本地化由于首字母l和末尾字母n间有个字母所以简称ln localization指为了使应用软件能够在某一特定语言环境或地区使用而加入本地特殊化部件和翻译后文本的过程
locale: 简单来说是指语言和区域进行特殊组合的一个标志
我们的例子显示一个有一个按钮和一个菜单的Dialog窗在不改动程序的前提下使应用程能够显示英文文字的或者中文文字的界面 注:因为仅仅作为演示用我们的菜单栏也作为一个部件加入对话框好象是一个Button一样而不是通常意义上的菜单条
通常我们的程序是这样的:
/**
* File name: inDemojava
* Author ID: Jack at Java discuss board
* Description: Shows a Dialog with a OK button and File/Exit menu
*/
import javaxswing*;
import javaawt*;
import javautil*;
public class inDemo {
public static void main(String args[]) throws Exception{
JDialog dialog=new JDialog();
JButton btOK=new JButton();
JMenuBar menuBar=new JMenuBar();
JMenu menuFile=new JMenu();
JMenuItem menuExit=new JMenuItem();
btOKsetText(OK);
menuFilesetText(File);
menuExitsetText(Exit);
dialogsetTitle(in Demo);
menuBaradd(menuFile);
menuFileadd(menuExit);
dialoggetContentPane()setLayout(new FlowLayout());
dialoggetContentPane()add(btOK);
dialoggetContentPane()add(menuBar);
dialogsetSize();
dialogsetModal(true);
dialogshow();
Systemexit();
}
}
我们通过修改程序来达到in的要求将那些和界面显示有关系的资源单独提取出来到资源文件里面Java里面的资源文件叫做ResourceBundle它分成两种一种是ListResourceBundle另一种是PropertyResourceBundle我们这里使用ListResourceBundle关于PropertyREsourceBundle请参阅文后的推荐阅读当一个程序需要一些Locale相关的资源例如字符串资源的时候它可以从resource bundle里面将需要的本地化资源装入
需要注意的是:为了能够正确显示中文字符程序里的部件需要选择指定字体例如在显示中文的时候使用MS Song不然界面有中文字符的时候会出现没有意义的方框
请看修改过的程序和资源文件
/**
* File name: inDemojava
* Author: Jack at Java discuss board
* Email:
* Description: Shows a Dialog with a OK button and File/Exit menu
* This program made some modifications to fit the requestion of in
*/
import javaxswing*;
import javaawt*;
import javautil*;
public class inDemo {
public static void main(String args[]) throws Exception{
ResourceBundle res;
if (argslength<) {
//use current locale at machine to get the resource bundle
res = ResourceBundlegetBundle(Res);
}else {
res = ResourceBundlegetBundle(Resnew Locale(args[] args[]));
}
JDialog dialog=new JDialog();
JButton btOK=new JButton();
JMenuBar menuBar=new JMenuBar();
JMenu menuFile=new JMenu();
JMenuItem menuExit=new JMenuItem();
Font font = new Font(resgetString(FontName)FontPLAIN);
btOKsetText(resgetString(OKText));
menuFilesetText(resgetString(FileMenuText));
menuExitsetText(resgetString(FileExitMenuText));
dialogsetTitle(resgetString(DialogTitle));
btOKsetFont(font);
menuFilesetFont(font);
menuExitsetFont(font);
menuBaradd(menuFile);
menuFileadd(menuExit);
dialoggetContentPane()setLayout(new FlowLayout());
dialoggetContentPane()add(btOK);
dialoggetContentPane()add(menuBar);
dialogsetSize();
dialogsetModal(true);
dialogshow();
Systemexit();
}
}
/**
* File name: Res_en_USjava
* Author: Jack at Java discuss board
* Email:
* Description: Resource file for inDemojava
*/
import javautil*;
public class Res_en_US extends javautilListResourceBundle {
static final Object[][] contents = new String[][]{
{ OKText OK }
{ FontName Dialoginput }
{ FileMenuText File}
{ FileExitMenuText Exit}
{ DialogTitle Demo Dialog }};
public Object[][] getContents() {
return contents;
}
}
在运行前我们再做一个包含中文资源的资源文件
/**
* File name: Res_zh_CNjava
* Author: Jack at Java discuss board
* Email:
* Description: Resource file for inDemojava
*/
import javautil*;
public class Res_zh_CN extends javautilListResourceBundle {
static final Object[][] contents = new String[][]{
{ OKText 确定 }
{ FontName MS Song }
{ FileMenuText 文件}
{ FileExitMenuText 退出}
{ DialogTitle 演示对话框 }};
public Object[][] getContents() {
return contents;
}
}
先运行来看看结果:
//Run next command step by step
javac *java
java inDemo
java inDemo zh CN
java inDemo en US
可以看到出现了中文界面和英文界面的对话框
具体的看一下程序:
主程序inDemojava多了一个ResourceBundle对象它包含了一个资源文件的信息然后需要使用本地化资源的时候都通过resgetString(KEY)来得到相应的Locale的值通过命令行我们传入关于语言和国家的代码这样在生成ResourceBundle对象的时候可以指向相应的资源文件如果没有指定Locale那么在生成ResourceBundle使用的Locale是当前机器上缺省的区域和语言在我的机器上(English WindowsNT )打开Richwin中文平台的时候缺省的locale是中国关闭RichWin的时候Locale是US
资源文件Res_en_USjava里面包含了英文的界面资源文件名里的en指英语语言US指国家是美国Res_zh_CNjava是中文的资源文件zh说明语言是中文CN说明国家是中国关于语言和国家的完整对照表可以在参考资源里找到链接
Res_xx_XX类是从ListResourceBundle继承而