Isolating Locale-Specific Data |
This section steps through a sample program namedPropertiesDemo
.1. Create the Default Properties File
A properties file is a simple text file. You can create and maintain a properties file with just about any text editor.You should always create a default properties file. The name of this file begins with the base name of your
ResourceBundle
and ends with the.properties
suffix. In thePropertiesDemo
program the base name isLabelsBundle
. Therefore the default properties file is calledLabelsBundle.properties
. This file contains the following lines:Note that in the preceding file the comment lines begin with a pound sign (#). The other lines contain key-value pairs. The key is on the left side of the equal sign and the value is on the right. For instance,# This is the default LabelsBundle.properties file s1 = computer s2 = disk s3 = monitor s4 = keyboards2
is the key that corresponds to the valuedisk
. The key is arbitrary. We could have calleds2
something else, likemsg5
ordiskID
. Once defined, however, the key should not change because it is referenced in the source code. The values may be changed. In fact, when your localizers create new properties files to accommodate additional languages, they will translate the values into various languages.2. Create Additional Properties Files as Needed
To support an additionalLocale
, your localizers will create a new properties file that contains the translated values. No changes to your source code are required, because your program references the keys, not the values.For example, to add support for the German language, your localizers would translate the values in
LabelsBundle.properties
and place them in a file namedLabelsBundle_de.properties
. Notice that the name of this file, like that of the default file, begins with the base nameLabelsBundle
and ends with the.properties
suffix. However, since this file is intended for a specificLocale
, the base name is followed by the language code (de
). The contents ofLabelsBundle_de.properties
are as follows:The# This is the LabelsBundle_de.properties file s1 = Computer s2 = Platte s3 = Monitor s4 = TastaturPropertiesDemo
sample program ships with three properties files:LabelsBundle.properties LabelsBundle_de.properties LabelsBundle_fr.properties3. Specify the Locale
ThePropertiesDemo
program creates theLocale
objects as follows:TheseLocale[] supportedLocales = { Locale.FRENCH, Locale.GERMAN, Locale.ENGLISH };Locale
objects should match the properties files created in the previous two steps. For example, theLocale.FRENCH
object corresponds to theLabelsBundle_fr.properties
file. TheLocale.ENGLISH
has no matchingLabelsBundle_en.properties
file, so the default file will be used.4. Create the ResourceBundle
This step shows how theLocale
, the properties files, and theResourceBundle
are related. To create theResourceBundle
, invoke thegetBundle
method, specifying the base name andLocale
:ResourceBundle labels = ResourceBundle.getBundle("LabelsBundle", currentLocale);The
getBundle
method first looks for a class file that matches the base name and theLocale
. If it can't find a class file, it then checks for properties files. In thePropertiesDemo
program we're backing theResourceBundle
with properties files instead of class files. When thegetBundle
method locates the correct properties file, it returns aPropertyResourceBundle
object containing the key-value pairs from the properties file.5. Fetch the Localized Text
To retrieve the translated value from theResourceBundle
, invoke thegetString
method as follows:String value = labels.getString(key);The
String
returned bygetString
corresponds to the key specified. TheString
is in the proper language, provided that a properties file exists for the specifiedLocale
.6. Iterate through All the Keys
This step is optional. When debugging your program, you might want to fetch values for all of the keys in aResourceBundle
. ThegetKeys
method returns anEnumeration
of all the keys in aResourceBundle
. You can iterate through theEnumeration
and fetch each value with thegetString
method. The following lines of code, which are from thePropertiesDemo
program, show how this is done: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); }7. Run the Demo Program
Running thePropertiesDemo
program generates the following output. The first three lines show the values returned bygetString
for variousLocale
objects. The program displays the last four lines when iterating through the keys with thegetKeys
method.Locale = fr, key = s2, value = Disque dur Locale = de, key = s2, value = Platte Locale = en, key = s2, value = disk key = s4, value = Clavier key = s3, value = Moniteur key = s2, value = Disque dur key = s1, value = Ordinateur
Isolating Locale-Specific Data |