|
|
Start of Tutorial > Start of Trail > Start of Lesson |
Search
Feedback Form |
A compound message may contain several kinds of variables: dates, times, strings, numbers, currencies, and percentages. To format a compound message in a locale-independent manner, you construct a pattern that you apply to aMessageFormatobject, and store this pattern in aResourceBundle.By stepping through a sample program, this section demonstrates how to internationalize a compound message. The sample program makes use of the
MessageFormatclass. The full source code for this program is in the file called
MessageFormatDemo.java.
Suppose that you want to internationalize the following message:Notice that we've underlined the variable data and have identified what kind of objects will represent this data.
Store the message in aResourceBundlenamedMessageBundle, as follows:ResourceBundle messages = ResourceBundle.getBundle("MessageBundle", currentLocale);This
ResourceBundleis backed by a properties file for eachLocale. Since theResourceBundleis calledMessageBundle, the properties file for U.S. English is namedMessageBundle_en_US.properties. The contents of this file is as follows:template = At {2,time,short} on {2,date,long}, we detected \ {1,number,integer} spaceships on the planet {0}. planet = MarsThe first line of the properties file contains the message pattern. If you compare this pattern with the message text shown in step 1, you'll see that an argument enclosed in braces replaces each variable in the message text. Each argument starts with a digit called the argument number, which matches the index of an element in an
Objectarray that holds the argument values. Note that in the pattern the argument numbers are not in any particular order. You can place the arguments anywhere in the pattern. The only requirement is that the argument number have a matching element in the array of argument values.The next step discusses the argument value array, but first let's look at each of the arguments in the pattern. The following table provides some details about the arguments:
Arguments for
templateinMessageBundle_en_US.propertiesArgument Description {2,time,short}The time portion of a Dateobject. Theshortstyle specifies theDateFormat.SHORTformatting style.{2,date,long}The date portion of a Dateobject. The sameDateobject is used for both the date and time variables. In theObjectarray of arguments the index of the element holding theDateobject is 2. (This is described in the next step.){1,number,integer}A Numberobject, further qualified with theintegernumber style.{0}The Stringin theResourceBundlethat corresponds to theplanetkey.For a full description of the argument syntax, see the API documentation for the
MessageFormatclass.
The following lines of code assign values to each argument in the pattern. The indexes of the elements in themessageArgumentsarray match the argument numbers in the pattern. For example, theIntegerelement at index 1 corresponds to the{1,number,integer}argument in the pattern. Because it must be translated, theStringobject at element 0 will be fetched from theResourceBundlewith thegetStringmethod. Here is the code that defines the array of message arguments:Object[] messageArguments = { messages.getString("planet"), new Integer(7), new Date() };
Next, create aMessageFormatobject. You set theLocalebecause the message containsDateandNumberobjects, which should be formatted in a locale-sensitive manner.MessageFormat formatter = new MessageFormat(""); formatter.setLocale(currentLocale);
This step shows how the pattern, message arguments, and formatter all work together. First, fetch the patternStringfrom theResourceBundlewith thegetStringmethod. The key to the pattern istemplate. Pass the patternStringto the formatter with theapplyPatternmethod. Then format the message using the array of message arguments, by invoking theformatmethod. TheStringreturned by theformatmethod is ready to be displayed. All of this is accomplished with just two lines of code:formatter.applyPattern(messages.getString("template")); String output = formatter.format(messageArguments);
The demo program prints the translated messages for the English and German locales and properly formats the date and time variables. Note that the English and German verbs ("detected" and "entdeckt") are in different locations relative to the variables:currentLocale = en_US At 1:15 PM on April 13, 1998, we detected 7 spaceships on the planet Mars. currentLocale = de_DE Um 13.15 Uhr am 13. April 1998 haben wir 7 Raumschiffe auf dem Planeten Mars entdeckt.
|
|
Start of Tutorial > Start of Trail > Start of Lesson |
Search
Feedback Form |
Copyright 1995-2004 Sun Microsystems, Inc. All rights reserved.