Найти тему
Сам себе джавист

Локали в Java

Оглавление

Класс локали Java, java.util.Locale, используется для представления "географического, политического или культурного" региона для локализации данного текста, числа, даты или операции. Таким образом, объект Locale может содержать страну, регион, язык, а также вариант языка, например диалект, на котором говорят в определенном регионе страны, или на котором говорят в стране, отличной от страны происхождения языка.

Экземпляр Locale передается компонентам, которым необходимо локализовать свои действия, независимо от того, преобразует ли он входные данные, выходные данные или просто необходим для внутренних операций. Класс Locale не может выполнять какую-либо интернационализацию или локализацию сам по себе.

Стандарт локали

Класс Locale соответствует стандарту BCP 47 (IETF BCP 47, "Теги для идентификации языков").

Класс Locale также поддерживает стандарт LDML (UTS35 "Язык разметки данных локали Unicode"), который представляет собой расширение, совместимое с BCP 47, для обмена данными о локали. Дополнительную информацию см. в соответствующих стандартах.

Содержимое локали

Экземпляр локали содержит следующие подразделы:

  • Язык
  • Письменность
  • Страна (регион)
  • Диалект
  • Расширения

Язык

Язык должен быть 2- или 3-символьным кодом языка ISO 639 или подзаголовком зарегистрированного языка длиной до 8 символов. В случае, если язык имеет как 2-символьный, так и 3-символьный языковой код, используйте 2-символьный код. Полный список языковых кодов можно найти в Реестре языковых подзаголовков IANA.

Языковые коды не чувствительны к регистру, но класс Locale всегда использует строчные версии языковых кодов.

Письмо

Код скрипта представляет собой письменную форму языка. Некоторые языки могут быть написаны с использованием разной системой письменности (например, разных алфавитов).

Код письма представляет собой 4-символьный код, соответствующий стандарту ISO 15924. Полный список кодов письменностей можно найти в реестре языковых подзаголовков IANA.

Коды письменности также не чувствительны к регистру, но класс Locale всегда использует версию с первой буквой в верхнем регистре, а остальные - в нижнем регистре.

Страна (регион)

Код страны представляет собой 2-символьный код, соответствующий стандарту ISO 3166, или цифровой код города M.49 ООН. Полный список кодов стран и регионов можно найти в Реестре языковых подзаголовков IANA.

Код страны не чувствителен к регистру, но класс Locale использует версию кода страны в верхнем регистре.

Диалект

Данная часть описывает вариант (диалект) языка, соответствующего стандарту BCP 47. Смотрите JavaDoc для класса Locale для получения более подробной информации о диалектах.

Расширения

Часть расширения сигнализирует о расширении локали в дополнение к языку и региону. Например, какой календарь использовать при отображении дат (григорианский, арабский, японский и т.д.). Более подробную информацию о расширениях см. в JavaDoc для класса Locale.

Определение локали

Создание экземпляра java.util.Locale может быть выполнено четырьмя различными способами:

  • Константами
  • С помощью конструктора
  • Классом Locale.Builder (с Java 7)
  • Фабричным методом Locale.forLanguageTag (с Java 7)

Каждый из этих методов описан далее.

Константы

Класс java.util.Locale содержит набор констант, которые представляют наиболее часто используемые языки в мире. Это:

Locale.CANADA
Locale.CANADA_FRENCH
Locale.CHINA
Locale.CHINESE
Locale.ENGLISH
Locale.FRANCE
Locale.FRENCH
Locale.GERMAN
Locale.GERMANY
Locale.ITALIAN
Locale.ITALY
Locale.JAPAN
Locale.JAPANESE
Locale.KOREA
Locale.KOREAN
Locale.PRC
Locale.ROOT
Locale.SIMPLIFIED_CHINESE
Locale.TAIWAN
Locale.TRADITIONAL_CHINESE
Locale.UK
Locale.US

Вы можете использовать константы просто ссылаясь на них, например:

Locale locale = Locale.JAPANESE;

Конструктор

Вы также можете создать экземпляр java.util.Locale с помощью одного из конструкторов. Конструкторами являются:

Locale(String language)

Locale(String language, String country)

Locale(String language, String country, String variant)

Языковой параметр должен представлять собой 2- или 3-буквенный код языка ISO из стандарта ISO 639. Вы также можете использовать языковой подзаголовок длиной до 8 символов.

Страна должна представлять собой 2-символьный код страны ISO из стандарта ISO 3166. В качестве альтернативы можно использовать код города ООН M.49 символов.

Диалект должен быть любым допустимым вариантом языка BCP 47.

Вот несколько примеров:

Locale locale = new Locale("en"); // английский

Locale locale = new Locale("en", "UK"); // английский, Британский
Locale locale = new Locale("en", "CA"); // Канадский английский

Класс Locale.Builder

Начиная с Java 7, вы можете использовать класс Builder для создания экземпляра Locale. Например:

Locale cLocale = new Locale.Builder().setLanguage("en")
.setRegion("US").build();

Метод Locale.forLanguageTag()

Фабричный метод Locale.forLanguageTag() также можно использовать для создания экземпляра Locale. Например:

Locale aLocale = Locale.forLanguageTag("en-US");

Использование локалей

Когда у вас есть экземпляр Locale, вы можете использовать его в качестве входных данных для других компонентов, которые используют Locale для локализации своих функций. Вот несколько примеров:

Locale locale = new Locale("da", "DK");

ResourceBundle resourceBundle =
ResourceBundle.getBundle("bundleName", locale);

В этом примере создается локаль, представляющая датский язык в Дании, и используется этот языковой стандарт для получения ResourceBundle, содержащего тексты на датском языке.

Критика локалей

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

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

Если я много путешествую, я могу предпочесть отображать дату и время приложения по местному или домашнему времени, в зависимости от того, что я пытаюсь сделать. Например, если мне нужно сесть на местный поезд, мне может понадобиться местное время. Но если я звоню домой своей семье, я, возможно, захочу иметь возможность видеть, который час, где они находятся.

Наконец, я могу захотеть показать, как работает данное приложение, человеку, который не говорит на языке, на который локализовано мое приложение (например, английский или датский), поэтому я могу временно сменить язык, например, на испанский или немецкий.

В целом, нет смысла пытаться привязать слишком много настроек локализации к языку, стране или региону пользователя. Позвольте пользователю выбрать, какой язык, часовой пояс, какое форматирование чисел и форматирование даты использовать и т.д. Сделайте его также изменяемым и независимым друг от друга. Не привязывайте его к родной стране пользователя.