4 minute read
Глава 4. Интернационализация и локализация приложений
Интернационализация и локализация приложений
Интернационализация — это разработка приложений, которые легко могут быть адаптированы своим выводом текстовых строк, данных времени, валют и др. к различным языкам и регионам без изменения исходного кода и перекомпиляции. Достигается это за счет отдельного хранения данных интернационализации в виде файлов свойств, загружаемых приложением динамически в процессе работы. Локализация — это адаптация приложения к конкретному языку и региону путем перевода выводимых пользователю текстовых элементов и документации, а также определения данных времени, валют и др., согласно специфике данного региона. JDT-плагин предоставляет такие инструменты интернационализации для среды Eclipse, как опция компилятора, обеспечивающая вывод предупреждений для неинтернационализированных строк (включается в разделе Java | Compiler | Errors/Warnings диалогового окна Preferences, открываемого одноименной командой в меню Window), инструменты поиска неинтернационализированных строк и неиспользуемых или некорректно используемых ключей файлов свойств интернационализации, мастер интернационализации строк. В качестве примера использования инструментов интернационализации JDTплагина рассмотрим создание интернационализированного Java-приложения в среде Eclipse SDK. Откроем среду Eclipse SDK и в перспективе Java в меню File последовательно выберем команды New | Other | Java | Java Project, нажмем кнопку Next, введем имя проекта Hello и нажмем кнопку Finish. В окне Package Explorer щелкнем правой кнопкой мыши на узле проекта и в контекстном меню последовательно выберем команды New | Other | Java | Class, нажмем кнопку Next, в поле Package введем имя пакета main, а в поле Name — имя класса Main, отметим флажок public static void main(String[] args) и нажмем кнопку Finish. В окне редактора кода дополним код метода main() класса Main выводом строки в консоль:
Сохраним изменения. В меню Window в разделе Java | Compiler | Errors/Warnings диалогового окна Preferences в списке Non-externalized strings выберем Warning и нажмем кнопку OK (рис. 4.1).
Рис. 4.1. Установка вывода предупреждений при компиляции кода для неинтернационализированных строк
В результате в окне редактора кода появится значок предупреждения, а в окно Problems будет выведено сообщение о проблеме (рис. 4.2). Если щелкнуть мышью на значке предупреждения в окне редактора кода, то по- явится окно помощника, содержащее, среди прочих, подсказку Open the 'Externalize Strings' wizard, после двойного щелчка на которой откроется окно мастера интернационализации. Другой способ поиска неинтернационализированных строк и открытия мастера интернационализации — это выбор команды Externalize strings меню Source. Запустим мастер Externalize Strings интернационализации и убедимся, что фла- жок неинтернационализированной строки отмечен, а кнопка Externalize нажата (рис. 4.3). Дважды нажмем кнопку Next, а затем кнопку Finish.
Рис. 4.2. Результат действия опции компилятора вывода предупреждений для неинтернационализированных строк
System.out.println(Messages.getString("Main.0")); //$NON-NLS-1$
Здесь комментарий помечает строку как непереводимую, а указанный в аргументе класс Messages — это сгенерированный класс со следующим кодом:
package main; import java.util.MissingResourceException; import java.util.ResourceBundle; public class Messages { private static final String BUNDLE_NAME = "main.messages"; //$NON-NLS-1$ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); private Messages() { } public static String getString(String key) { try { return RESOURCE_BUNDLE.getString(key); } catch (MissingResourceException e) { return '!' + key + '!'; }}}
В коде класса main.Messages загружается файл свойств messages.properties, содержащий пару "ключ = значение":
Main.0=This is string for user
из которого в статическом методе getString() извлекается значение ключа. Теперь осуществим локализацию приложения, например для России, и обеспечим интернационализацию в коде приложения. Изменим код класса Messages:
package main; import java.util.MissingResourceException;
import java.util.*;
public class Messages { private static final String BUNDLE_NAME = "main.messages";
private static ResourceBundle RESOURCE_BUNDLE; private static Locale currentLocale;
private Messages() { } public static String getString(String key, String language, String country) { try {
currentLocale =new Locale(language, country); RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME, currentLocale);
return RESOURCE_BUNDLE.getString(key); } catch (MissingResourceException e) { return '!' + key + '!'; }}}
В новом коде класса main.Messages в методе getString() файл свойств загружается уже с учетом указанной локализации. Поэтому переименуем файл messages.properties в файл messages_en_US.properties и создадим, используя команды New | File меню File, файл messages_ru_ RU.properties, содержащий пару "ключ=значение":
Main.0=\u042D\u0442\u043E \u0441\u0442\u0440\u043E\u043A\u0430 \u0434\u043B\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F
Здесь значение — это строка "Это строка для пользователя" в Unicode-кодировке. Соответственно для корректного вызова метода getString() класса Messages изменим код класса Main:
package main; public class Main { public static 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]); }
System.out.println(Messages.getString("Main.0", language, country)); }}
В новом коде метода main() класса main.Main используются аргументы командной строки для определения требуемой локализации приложения и, соответственно, для корректного вызова метода getString() класса Messages. Для запуска созданного приложения в окне Package Explorer щелкнем правой кнопкой мыши на узле проекта и в контекстном меню выберем команду Run As | Run Configurations. В результате откроется окно мастера настройки конфигурации запуска приложения. Откроем вкладку Arguments мастера Run Configurations и в поле Program arguments введем аргументы командной строки: ru RU (рис. 4.4). Нажмем кнопку Run. В результате в окно Console будет выведена строка "Это строка для пользователя". Если запустить приложение без аргументов командной строки, то в окно Console будет выведена строка "This is string for user".
Рис. 4.4. Определение аргументов командной строки запуска приложения