Step By Step(Java 国际化篇)(九)

2014-11-24 02:47:47 · 作者: · 浏览: 17
XDisk.
43 There are 2 files on XDisk.
44 There are 3 files on XDisk.
45 currentLocale = fr_FR
46 Il n' y a pas des fichiers sur XDisk.
47 Il y a un fichier sur XDisk.
48 Il y a 2 fichiers sur XDisk.
49 Il y a 3 fichiers sur XDisk.
50 */
Java不仅提供了资源包文件的方式来包含不同语言的资源信息,还提供了资源包类的方式,其命名规则和资源包的规则一致,只是扩展名由".properties"替换为".java",其内容也从键值对的配置文件改为java的代码文件。资源包中定义的类必须是扩展自ResourceBundle类,使用方式和资源包配置文件的方式完全一致。见下面的示例代码:
1 //File: SimpleResourceBundle.java
2 public class SimpleResourceBundle extends ResourceBundle {
3 @Override
4 protected Object handleGetObject(String key) {
5 if (key.equals("AMMessage"))
6 return "早上好";
7 if (key.equals("PMMessage"))
8 return "晚上好";
9 return null;
10 }
11 @Override
12 public Enumeration getKeys() {
13 StringTokenizer keyTokenizer = new StringTokenizer(keys);
14 return keyTokenizer;
15 }
16 private String keys = "AMMessage PMMessage";
17 }
18 //File: SimpleResourceBundle_en_US.java
19 public class SimpleResourceBundle_en_US extends ResourceBundle {
20 @Override
21 protected Object handleGetObject(String key) {
22 if (key.equals("AMMessage"))
23 return "Good morning";
24 if (key.equals("PMMessage"))
25 return "Good evening";
26 return null;
27 }
28 @Override
29 public Enumeration getKeys() {
30 StringTokenizer keyTokenizer = new StringTokenizer(keys);
31 return keyTokenizer;
32 }
33 private String keys = "AMMessage PMMessage";
34 }
35
36 //调用类代码如下:
37 public static void main(String[] args) {
38 try {
39 //由于使用缺省的locale,因此在定义资源包类的文件时,可以不包含locale相关的后缀。
40 ResourceBundle rb = ResourceBundle.getBundle("SimpleResourceBundle");
41 System.out.println(rb.getString("AMMessage"));
42 System.out.println(rb.getString("PMMessage"));
43 //由于给ResourceBundle的工厂方法传入了Locale参数,因此会获取US的资源包绑定类。
44 ResourceBundle rb_US = ResourceBundle.getBundle("SimpleResourceBundle",Locale.US);
45 System.out.println(rb_US.getString("AMMessage"));
46 System.out.println(rb_US.getString("PMMessage"));
47 } catch (MissingResourceException mre) {
48 mre.printStackTrace();
49 }
50 }
51 /* 输出结果如下:
52 早上好
53 晚上好
54 Good morning
55 Good evening
56 */
在Java中还提供了另外一种更为方便的资源包绑定类的实现方式,既直接扩展ListResourceBundle类,ListResourceBundle让你把所有资源都放到一个对象数组并提供查询功能,见如下代码:
1 //File: SimpleResourceBundle_de_DE.java
2 public class SimpleResourceBundle_de_DE extends ListResourceBundle {
3 public Object[][] getContents() {
4 return contents;
5 }
6
7 private static final Object[][] contents = {
8 {"backgroundColor",Color.black},
9 {"defaultPaperSize",new double[]{210,297}}
10 };
11 }
12 //File: SimpleResourceBundle_en_US.java
13 public class SimpleResourceBundle_en_US extends ListResourceBundle {
14 publi