You may be wondering what happened to the text of the messages or what the language and country codes mean. Don't worry. You'll learn about these concepts as you step through the process of internationalizing the sample program.
In the example the properties files store the translatable text of the
messages to be displayed. Before the program was internationalized, the
English version of this text was hardcoded in the
System.out.println
statements. The default properties
file, which is called MessagesBundle.properties
, contains
the following lines:
greetings = Hello farewell = Goodbye inquiry = How are you?
MessagesBundle_fr_FR.properties
, which contains these lines:
greetings = Bonjour. farewell = Au revoir. inquiry = Comment allez-vous?
The name of the properties file is important. For example, the name of
the MessagesBundle_fr_FR.properties
file contains the
fr
language code and the FR
country code.
These codes are also used when creating a Locale
object.
Locale
object identifies a particular language and
country. The following statement defines a Locale
for
which the language is English and the country is the United States:
aLocale = new Locale("en","US");
The next example creates Locale
objects for the French
language in Canada and in France:
caLocale = new Locale("fr","CA"); frLocale = new Locale("fr","FR");
The program is flexible. Instead of using hardcoded language and country codes, the program gets them from the command line at run time:
String language = new String(args[0]); String country = new String(args[1]); currentLocale = new Locale(language, country);
Locale
objects are only identifiers. After defining a
Locale
, you pass it to other objects that perform useful
tasks, such as formatting dates and numbers. These objects are locale-sensitive because their behavior varies
according to Locale
. A ResourceBundle
is an
example of a locale-sensitive object.
ResourceBundle
objects contain locale-specific objects.
You use ResourceBundle
objects to isolate locale-sensitive
data, such as translatable text. In the sample program the
ResourceBundle
is backed by the properties files that
contain the message text we want to display.
The ResourceBundle
is created as follows:
messages = ResourceBundle.getBundle("MessagesBundle", currentLocale);
The arguments passed to the getBundle
method identify
which properties file will be accessed. The first argument,
MessagesBundle
, refers to this family of properties
files:
MessagesBundle_en_US.properties MessagesBundle_fr_FR.properties MessagesBundle_de_DE.properties
The Locale
, which is the second argument of
getBundle
, specifies which of the
MessagesBundle
files is chosen. When the Locale
was
created, the language code and the country code were passed to its
constructor. Note that the language and country codes follow
MessagesBundle
in the names of the properties files.
Now all you have to do is get the translated messages from the
ResourceBundle
.
ResourceBundle
with the getString
method. For example, to retrieve the
message identified by the greetings key, you invoke
getString
as follows:
String msg1 = messages.getString("greetings");
greetings
because it
reflects the content of the message, but it could have used another
String
, such as s1
or msg1
. Just
remember that the key is hardcoded in the program and it must be
present in the properties files. If your translators accidentally
modify the keys in the properties files, getString
won't
be able to find the messages.