Internationalization in Java

I

Internationalization, in relation to computer programming, is the process of designing and writing an application so that it can be used in a global or multinational context. An internationalized program is capable of supporting different languages, as well as date, time, currency, and other values, without software modification. This usually involves “soft coding” or separating textual components from program code and may involve pluggable code modules.

Before Internationalization

Suppose that program that displays three messages, as follows:

public class Example{

static public void main(String[] args) {

System.out.println(“Hello.”);
System.out.println(“How are you?”);
System.out.println(“Goodbye.”);
}
}
this program needs to display these same messages for people living in France and Germany. Unfortunately programming staff is not multilingual, so need help

translating the messages into French and German. Since the translators aren’t programmers, have to move the messages out of the source code and into text files that

the translators can edit. Also, the program must be flexible enough so that it can display the messages in other languages, but right now no one knows what those

languages will be.

It looks like the program needs to be internationalized.

After Internationalization

The source code for the internationalized program follows. Notice that the text of the messages is not hardcoded.

import java.util.*;

public class Sample {

static public void main(String[] args) {

String language;
String country;

if (args.length != 2) {
language = new String(“en”);
country = new String(“US”);
} else {
language = new String(args[0]);
country = new String(args[1]);
}

Locale currentLocale;
ResourceBundle messages;

currentLocale = new Locale(language, country);

messages = ResourceBundle.getBundle(“MessagesBundle”, currentLocale);
System.out.println(messages.getString(“greetings”));
System.out.println(messages.getString(“inquiry”));
System.out.println(messages.getString(“farewell”));
}
}
To compile and run this program, need these source files:

Sample.java
MessagesBundle.properties
MessagesBundle_de_DE.properties
MessagesBundle_en_US.properties
MessagesBundle_fr_FR.properties

Running the Sample Program

The internationalized program is flexible; it allows the end user to specify a language and a country on the command line. In the following example the language code

is fr (French) and the country code is FR (France), so the program displays the messages in French:

% java Sample fr FR
Bonjour.
Comment allez-vous?
Au revoir.
In the next example the language code is en (English) and the country code is US (United States) so the program displays the messages in English:

% java Sample en US
Hello.
How are you?
Goodbye.

Internationalizing the Sample Program

If you look at the internationalized source code, you’ll notice that the hardcoded English messages have been removed. Because the messages are no longer hardcoded and

because the language code is specified at run time, the same executable can be distributed worldwide. No recompilation is required for localization. The program has

been internationalized.

1. Create the Properties Files

A properties file stores information about the characteristics of a program or environment. A properties file is in plain-text format. Create the file with just about

any text editor.

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?
Now that the messages are in a properties file, they can be translated into various languages. No changes to the source code are required. The French translator has

created a properties file called MessagesBundle_fr_FR.properties, which contains these lines:

greetings = Bonjour.
farewell = Au revoir.
inquiry = Comment allez-vous?
Notice that the values to the right side of the equal sign have been translated but that the keys on the left side have not been changed. These keys must not change,

because they will be referenced when program fetches the translated text.

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.

2. Define the Locale

The 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.

3. Create a ResourceBundle

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 have to do is get the translated messages from the ResourceBundle.

4. Fetch the Text from the ResourceBundle

The properties files contain key-value pairs. The values consist of the translated text that the program will display. Specify the keys when fetching the translated

messages from the 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”);
The sample program uses the key 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 translators accidentally modify the keys in the properties files, getString

won’t be able to find the messages.

About the author

pallavi.jadhav
By pallavi.jadhav

Category