Java教程是针对JDK 8编写的。本页中描述的示例和实践未利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言更改以了解Java SE 9及其后续版本中更新的语言特性的摘要。
请参阅JDK发布说明以了解所有JDK版本中的新功能、增强功能以及已删除或已弃用选项的信息。
这一部分将介绍一个名为PropertiesDemo
的示例程序。
属性文件是一个简单的文本文件。你可以使用任何文本编辑器创建和维护一个属性文件。
你应该始终创建一个默认的属性文件。这个文件的名称以你的ResourceBundle
的基本名称开头,并以.properties
后缀结束。在PropertiesDemo
程序中,基本名称是LabelsBundle
。因此,默认的属性文件称为LabelsBundle.properties
。这个文件包含以下几行:
# 这是默认的LabelsBundle.properties文件 s1 = 计算机 s2 = 磁盘 s3 = 显示器 s4 = 键盘
请注意,在上述文件中,注释行以井号(#)开头。其他行包含键值对。键位于等号的左侧,值位于右侧。例如,s2
是对应值磁盘
的键。键是任意的。我们可以将s2
称为其他的名称,比如msg5
或diskID
。但一旦定义了,键就不应该更改,因为它在源代码中被引用。值可以更改。实际上,当本地化人员创建新的属性文件以适应其他语言时,他们会将这些值翻译成各种语言。
为了支持其他的Locale
,你的本地化人员会创建一个包含翻译后的值的新的属性文件。不需要对源代码进行任何更改,因为程序引用的是键,而不是值。
例如,为了添加对德语的支持,你的本地化人员将会翻译LabelsBundle.properties
中的值,并将它们放在一个名为LabelsBundle_de.properties
的文件中。注意,这个文件的名称与默认文件的名称相似,都是以基本名称LabelsBundle
开头,并以.properties
后缀结束。然而,由于这个文件是针对特定的Locale
的,基本名称后面跟着语言代码(de
)。LabelsBundle_de.properties
的内容如下:
# 这是LabelsBundle_de.properties文件 s1 = 计算机 s2 = 硬盘 s3 = 显示器 s4 = 键盘
PropertiesDemo
示例程序附带了三个属性文件:
LabelsBundle.properties LabelsBundle_de.properties LabelsBundle_fr.properties
PropertiesDemo
程序创建Locale
对象的方式如下:
Locale[] supportedLocales = { Locale.FRENCH, Locale.GERMAN, Locale.ENGLISH };
这些Locale
对象应该与前两个步骤中创建的属性文件相匹配。例如,Locale.FRENCH
对象对应于LabelsBundle_fr.properties
文件。Locale.ENGLISH
没有对应的LabelsBundle_en.properties
文件,所以将使用默认文件。
这一步展示了Locale
、属性文件和ResourceBundle
之间的关系。要创建ResourceBundle
,请调用getBundle
方法,指定基础名称和Locale
:
ResourceBundle labels = ResourceBundle.getBundle("LabelsBundle", currentLocale);
getBundle
方法首先查找与基础名称和Locale
匹配的类文件。如果找不到类文件,则会检查属性文件。在PropertiesDemo
程序中,我们将ResourceBundle
与属性文件关联,而不是类文件。当getBundle
方法找到正确的属性文件时,它会返回一个包含属性文件中键值对的PropertyResourceBundle
对象。
要从ResourceBundle
中检索翻译后的值,请调用getString
方法,如下所示:
String value = labels.getString(key);
getString
返回的String
与指定的键对应。只要为指定的Locale
存在属性文件,该String
就是以正确的语言显示的。
这一步是可选的。在调试程序时,您可能希望获取ResourceBundle
中所有键的值。getKeys
方法返回一个Enumeration
,其中包含ResourceBundle
中所有键。您可以遍历Enumeration
,并使用getString
方法获取每个值。下面是来自PropertiesDemo
程序的代码示例:
ResourceBundle labels = ResourceBundle.getBundle("LabelsBundle", currentLocale); Enumeration bundleKeys = labels.getKeys(); while (bundleKeys.hasMoreElements()) { String key = (String)bundleKeys.nextElement(); String value = labels.getString(key); System.out.println("key = " + key + ", " + "value = " + value); }
运行PropertiesDemo
程序将生成以下输出。前三行显示了getString
对于不同Locale
对象返回的值。当使用getKeys
方法迭代键时,程序显示了最后四行。
Locale = fr, key = s2, value = 硬盘 Locale = de, key = s2, value = 硬盘 Locale = en, key = s2, value = 硬盘 key = s4, value = 键盘 key = s3, value = 显示器 key = s2, value = 硬盘 key = s1, value = 计算机