Технологии Java

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

Введение

  • Интернационализация программы
    • Написание программы, работающей в различных языковых окружениях
  • Локализация программы
    • Адаптация интернационализированной программы к конкретному языковому окружению
  • Пакеты
    • java.util
    • java.text

Область действия

  • Сообщения
  • Числа
  • Дата и время
  • Единицы измерения
  • Адреса
  • Номера телефонов
  • Интерфейс

Локали

Содержание

Класс Locale

  • Идентифицирует используемое языковое окружение
  • Методы

Пример: локализованные данные

  • en_UK_windows
    • choose a folder,
      containing colour information
      
  • en_UK_unix
    • choose a directory,
      containing colour information
      
  • en_US
    • choose a folder,
      containing color information
      
  • ru_RU_unix
    • Выберите каталог,
      содержащий цветовую информацию
      

Создание Locale

Работа с локалями

Локализация данных

Содержание

Локализация данных

  • Хранение данных, зависящих от локали, в одном месте
  • Класс ResourceBundle

Операции с данными

Пример: Интернационализация

  • До интернационализации
    • void printUsage() {
          System.out.println(
              "Usage: Test [<options>] <commands>\n" +
              "Options:\n" +
              "     -o write output\n" +
              "... "
          );
      }
      

Пример: Интернационализация

  • После частичной интернационализации
    • void printUsage(ResourceBundle bundle) {
          System.out.println(String.format(
              "%s Test [%s] %s\n" +
              "%s\n" +
              "     -o %s\n"+
              "...",
              bundle.getString("usage"),      // Usage:
              bundle.getString("options"),         // <options>
              bundle.getString("commands"),   // <commands>
              bundle.getString("Options"),        // Options:
              bundle.getString("-o")          // Write output
          ));
      }
      

Загрузка ресурсов

Порядок загрузки ресурсов

  • S – указанная локаль
  • D – локаль по умолчанию
    • baseName_languageS_countryS_variantS
    • baseName_languageS_countryS
    • baseName_languageS
    • baseName_languageD_countryD_variantD
    • baseName_languageD_countryD
    • baseName_languageD
    • baseName

Пример: загрузка ресурса

  • Ресурс UsageResourceBundle, локаль en_US
    ResourceBundle bundle =
        ResourceBundle.getBundle(
            "UsageResourceBundle",
            Locale.US
        );
    printUsage(bundle);
    

Задание ресурсов

ListResourceBundle

  • Данные задаются в классе
    • Настоящие объекты
  • Метод

Пример: ListResourceBundle

  • Данные для локали en_US
    • public class UsageResourceBundle_en_US
              extends ListResourceBundle {
          private static final Object[][] CONTENTS = {
              {"usage",            "Usage:"},
              {"options",          "<options>"},
              {"commands",    "<commands>"},
              {"Options",         "Options:"},
              {"-o",                  "Write output"},
          };
          protected Object[][] getContents() {
              return CONTENTS;
          }
      }
      

PropertyResourceBundle

  • Данные задаются в .properties файле
    • Только строки
  • Структура .properties файла
    key1 = value1
    key2 : value2
    key3 = very long value \
    continues on next line
    # Comment
    …
    

Пример: PropertyResourceBundle

  • Данные для локали en_US
  • UsageResourceBundle_en_US.properties
    usage           = Usage:
    options         = <options>
    Commands  = <commands>
    Options        = Options:
    -o                 = Write output
    

Форматирование

  • Вывод данных в соответствии с языковым контекстом
  • Типы данных
    • Числа
    • Время и дата
    • Сообщения
  • Пакет java.text

Форматирование чисел

Стандартные форматир. чисел

Свойства форматировщиков чисел

Специальное формат. чисел

  • Класс DecimalFormat
    • Шаблоны форматирования ###,##0.0##
  • Класс DecimalFormatSymbols – символы, используемые при форматировании
    • Десятичная запятая
    • Разделители групп
    • Бесконечности

Условное формат. чисел

  • Класс ChoiceFormat
  • Формат шаблона
    • limit0 # format | limit1 # format | …
  • Использование форматов
    • i-й если limitsi ≤ n < limitsi+1
  • Пример
    • 0#No files|1#1 file|{0} files

Форматирование дат и времени

Содержание

Форматирование времени и дат

Стандартные форматировщики

Свойства форматировщиков

  • Свойства форматировщиков даты/времени

Специальное форматирование

  • Задание правил форматирования
  • Класс SimpleDateFormat
    • Шаблоны форматирования
      yyyy.MM.dd G 'at' HH:mm:ss z
      
  • Класс DateFormatSymbols – символы, используемые при форматировании
    • Дни недели
    • Месяца

Форматирование сообщений

Содержание

Форматирование сообщений

Шаблоны сообщений

  • Вид
    • шаблон := (текст { параметр })*
    • параметр := индекс[, тип[, стиль]]
    • тип := number | date | time | choice
  • Пример
    // May 17, 2024: $11.40 available
    MessageFormat.format(
        "{0,date}: {1,number,currency} available“,
        new Date(), 11.40
    )
    

Работа с текстом

Содержание

Сравнение строк

Содержание

Порядок слов в словаре

  • Зависит от языка
    Английский Французский
    peach
    peaches
    péché
    pêche
    peach
    peaches
    pêche
    péché
  • Использовать «естественный» порядок строк нельзя

Сравнение строк

  • Класс Collator
  • Класс RuleBasedCollator
    • Сравнивает строки в соответствии с заданными правилами
    • new RuleBasedCollator("c < e, E; é, É; ê = ě, Ê = Ě < F");
      

Сортировка строк

Разбиение текста

Содержание

Языки это сложно

  • Китайский: 該文本是中文的特殊文本,出於說明目的,是辛勤工作的一部分。 這是第二句話。 這是第三句話。
  • Бенгальский: এই টেক্সট কঠিন কাজ অংশ বরাদ্দ যে প্রকট উদ্দেশ্যে কোরিয়ান একটি বিশেষ টেক্সট, হয়. এই দ্বিতীয় বাক্য. এবং এই তৃতীয় বাক্য.
    • Сколько предложений?
      • 3
    • Сколько слов?
      • 22 (5), 23
    • Сколько букв?
      • 45, 98 (89)

Разбиение текста на элементы

Запись текста

Содержание

Текст

  • В .property файлах
    • Кодировка:
      • Latin-1
      • UTF-8
    • Можно использовать unicode escapes
  • В ListResourceBundle
    • --encoding

Пример: сообщения на русском (1)

  • До перекодировки
    usage=Применение
    options=<Опции>
    Commands=<команды>
    Options=Опции:
    -o=Запись выходного файла
    

Пример: сообщения на русском (2)

  • После перекодировки
    usage=\u040f\u0430\u0401\u00ac\u0490\u00ad\u0490\u00ad\u0401\u0490
    options=<\u040b\u0407\u0436\u0401\u0401>
    Commands=<\u0404\u00ae\u00ac\u00a0\u00ad\u00a4\u043b>
    Options=\u040b\u0407\u0436\u0401\u0401:
    -o=\u2021\u00a0\u0407\u0401\u0431\u043c \u045e\u043b\u0435\u00ae\u00a4\u00ad\u00ae\u0408\u00ae \u0434\u00a0\u00a9\u00ab\u00a0
    

Заключение

Содержание

Ссылки

Вопросы