Spec-Zone .ru
спецификации, руководства, описания, API
|
Составное сообщение может содержать несколько видов переменных: даты, времена, строки, числа, валюты, и проценты. Чтобы отформатировать составное сообщение независимым от локали способом, Вы создаете образец, что Вы применяетесь к a MessageFormat
объект, и хранилище этот образец в a ResourceBundle
.
Ступая через пример программы, этот раздел демонстрирует, как интернационализировать составное сообщение. Пример программы использует MessageFormat
class. Полный исходный код для этой программы находится в вызванном файле MessageFormatDemo.java
. Немецкие свойства локали находятся в вызванном файле MessageBundle_de_DE.properties
.
Предположите, что Вы хотите интернационализировать следующее сообщение:
Заметьте, что мы подчеркнули переменные данные и идентифицировали, какие объекты представят эти данные.
Храните сообщение в a ResourceBundle
именованный MessageBundle
, следующим образом:
ResourceBundle messages = ResourceBundle.getBundle("MessageBundle", currentLocale);
Это ResourceBundle
поддерживается файлом свойств для каждого Locale
. Начиная с ResourceBundle
вызывается MessageBundle
, файл свойств для американского английского языка называют MessageBundle_en_US.properties
. Содержание этого файла следующие:
template = At {2,time,short} on {2,date,long}, \ we detected {1,number,integer} spaceships on \ the planet {0}. planet = Mars
Первая строка файла свойств содержит образец сообщения. Если Вы сравните этот образец с текстом сообщения, показанным в шаге 1, то Вы будете видеть, что параметр, включенный в фигурные скобки, заменяет каждую переменную в тексте сообщения. Каждый параметр запускается с цифры, названной числом параметра, которое соответствует индексирование элемента в Object
массив, который содержит значения аргументов. Отметьте, что в образце числа параметра не находятся ни в каком определенном порядке. Можно поместить параметры куда угодно в образец. Единственное требование - то, что у числа параметра есть соответствующий элемент в массиве значений аргументов.
Следующий шаг обсуждает массив значения аргумента, но сначала давайте смотреть на каждый из параметров в образце. Следующая таблица обеспечивает некоторые детали о параметрах:
Параметр | Описание |
---|---|
{2,time,short} |
Часть времени a Date объект. short стиль определяет DateFormat.SHORT форматирование стиля. |
{2,date,long} |
Часть даты a Date объект. То же самое Date объект используется и для даты и для переменных времени. В Object массив параметров индексирование элемента, содержащего Date объект 2. (Это описывается в следующем шаге.) |
{1,number,integer} |
A Number объект, далее квалифицированный с integer стиль числа. |
{0} |
String в ResourceBundle это соответствует planet ключ. |
Для полного описания синтаксиса параметра см. документацию API для MessageFormat
class.
Следующие строки кода присваивают значения каждому параметру в образце. Индексирование элементов в messageArguments
выстройте соответствуют числа параметра в образце. Например, Integer
элемент в индексирует 1, соответствует {1,number,integer}
параметр в образце. Поскольку это должно быть преобразовано, String
объект в элементе 0 будет выбран от ResourceBundle
с getString
метод. Вот код, который определяет массив параметров сообщения:
Object[] messageArguments = { messages.getString("planet"), new Integer(7), new Date() };
Затем, создайте a MessageFormat
объект. Вы устанавливаете Locale
потому что сообщение содержит Date
и Number
объекты, которые должны быть отформатированы чувствительным к локали способом.
MessageFormat formatter = new MessageFormat(""); formatter.setLocale(currentLocale);
Этот шаг показывает, как образец, параметры сообщения, и средство форматирования все сотрудничают. Во-первых, выберите образец String
от ResourceBundle
с getString
метод. Ключ к образцу template
. Передайте образец String
к средству форматирования с applyPattern
метод. Затем отформатируйте сообщение, используя массив параметров сообщения, вызывая format
метод. String
возвращенный format
метод готов быть выведенным на экран. Все это выполняется только с двумя строками кода:
formatter.applyPattern(messages.getString("template")); String output = formatter.format(messageArguments);
Демонстрационная программа печатает преобразованные сообщения для английских и немецких локалей и должным образом форматирует переменные времени и дата. Отметьте, что английские и немецкие глаголы ("обнаруженный" и "entdeckt") находятся в различных расположениях относительно переменных:
currentLocale = en_US At 10:16 AM on July 31, 2009, we detected 7 spaceships on the planet Mars. currentLocale = de_DE Um 10:16 am 31. Juli 2009 haben wir 7 Raumschiffe auf dem Planeten Mars entdeckt.