T.M. SoftStudio

feci quod potui, faciant meliora potentes

Купить полную версию книги "Среда разработки Eclipse 4: Руководство разработчика"

Интернационализация и локализация приложений

Интернационализация – это разработка приложений, которые легко могут быть адаптированы своим выводом текстовых строк, данных времени, валют и др. к различным языкам и регионам без изменения исходного кода и перекомпиляции. Достигается это за счет отдельного хранения данных интернационализации в виде файлов свойств, загружаемых приложением динамически в процессе работы.

Локализация – это адаптация приложения к конкретному языку и региону путем перевода выводимых пользователю текстовых элементов и документации, а также определения данных времени, валют и др., согласно специфике данного региона.

JDT-плагин предоставляет такие инструменты интернационализации для среды Eclipse, как:

  • опция компилятора, обеспечивающая вывод предупреждений для не интернационализированных строк (включается в разделе Java | Compiler | Errors/Warnings команды Preferences меню Window),

  • инструменты поиска не интернационализированных строк и неиспользуемых или некорректно используемых ключей файлов свойств интернационализации,

  • мастер интернационализации строк.

В качестве примера использования инструментов интернационализации JDT-плагина рассмотрим создание интернационализированного Java-приложения в среде Eclipse Standard.

Откроем среду Eclipse и в перспективе 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 выводом строки в консоль:

System.out.println("This is string for user");

Сохраним изменения и в меню Window в разделе Java | Compiler | Errors/Warnings команды Preferences, в списке Non-externalized strings выберем Warning и нажмем кнопку OK (рис. 4.1).

Рис. 4.1. Установка вывода предупреждений при компиляции кода для не интернационализированных строк

  • В результате в окне редактора кода появится значок предупреждения, а в окно Problems будет выведено сообщение о проблеме (рис. 4.2).

    Рис. 4.2. Результат действия опции компилятора вывода предупреждений для не интернационализированных строк

    Если щелкнуть мышкой на значке предупреждения в окне редактора кода, тогда появится окно помощника, содержащее, среди прочих, подсказку Open the ‘Externalize Strings’ wizard, два раза щелкнув на которой откроется окно мастера интернационализации.

    Другой способ поиска не интернационализированных строк и открытие мастера интернационализации – это выбор команды Externalize strings меню Source.

    Откроем мастер Externalize Strings интернационализации и убедимся, что флажок не интернационализированной строки отмечен и что кнопка Externalize нажата (рис. 4.3).

    Рис. 4.3. Мастер интернационализации JDT-плагина

    Нажмем кнопки Next, Next и Finish.

    В результате код вывода строки в консоль изменится:

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

    Рис. 4.4. Определение аргументов командной строки запуска приложения

    Нажмем кнопку Run – в результате в окно Console будет выведена строка «Это строка для пользователя».

    Если запустить приложение без аргументов командной строки, тогда в окно Console будет выведена строка «This is string for user».