Интернационализация. Региональные стандарты.

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

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

Существует ряд классов, которые выполняют форматирование, принимая во внимание указанные выше различия. Для управления форматированием используется класс Locale.
Региональный стандарт (locale) определяет язык; кроме того могут быть указаны географическое расположение и вариант языка. Например, в США используется следующий региональный стандарт:

language=English, location=United States

В Германии региональный стандарт имеет другой вид :

language=German, location=Germany

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

language=German, location=Switzerland

В данном случае текст, даты и числа будут форматироваться так же, как и для Германии, но денежные суммы будут отображаться в швейцарских франках, а не в немецких марках. Если задавать только язык, например language=German, то особенности конкретной страны (например, формат представления денежных единиц) не будут учтены.
Вариант языка используется довольно редко. Например, в настоящее время в норвежском языке (производном от датского) определены два набора правил правописания (Bokmel) и новый (Nynorsk). В этом случае, для задания традиционных правил орфографии используется параметр, определяющий вариант:

language=Norwegian, location=Norway, variant=Bokmel

Для выражения языка и расположения в компактной и стандартной форме в Java используются коды, определенные Международной организацией по стандартизации (ISO). Язык обозначается двумя строчными буквами в соответствии со стандартом ISO-639, а страна (расположение)- двумя прописными буквами согласно стандарту ISO-3166.

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


  Locale german = new Locale ("de"); 
  Locale germanGermany = new Locale ("de", "DE"); 
  Locale germanSwitzerland = new Locale ("de", "CH"); 
  Locale norwegianNorwayBokmel = new Locale ("no", "NO", "B"); 

Для удобства пользователей в JDK предусмотрено несколько предопределенных объектов с региональными настройками, а для некоторых языков также имеются объекты, позволяющие указать язык без указания страны:

Предопределенные объекты с региональными установками Объекты, позволяющие указать язык без указания страны
Locale.CHINA Locale.CHINESE
Locale.FRANCE Locale.FRENCH
Locale.GERMANY Locale.GERMAN
Locale.ITALY Locale.ITALIAN
Locale.JAPAN Locale.JAPANESE
Locale.US Locale.ENGLISH

Помимо вызова конструктора или выбора предопределенных объектов, существует еще два пути получения объектов с региональными настройками. Статический метод getDefault() класса Locale позволяет определить региональную настройку, которая используется в операционной системе по-умолчанию. Изменить настройку по-умолчанию можно вызвав метод setDefault (). Однако следует помнить, что данный метод воздействует только на Java-программу, а не на операционную систему в целом. Метод getLocale() апплета возвращает региональные настройки того компьютера, на котором он запущен. И наконец, все зависимые от региональных настроек вспомогательные классы могут возвращать массив поддерживаемых региональных стандартов.Например, приведенный ниже метод возвращает все региональные настройки, поддерживаемые классом DateFormat.

Locale [ ] supportedLocales = DateFormat.getAvailableLocales();

Какие действия можно выполнять на основе полученных региональных настроек? Оказывается, выбор невелик. Единственными полезными методами класса Locale являются методы определения кодов языка и страны. Наиболее важными из них является метод getDisplayName(), возвращающий строку с описанием региональной настройки, которая содержит не какие-то двухбуквенные загадочные коды, а вполне понятные пользователю обозначения

German (Switzerland)

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

  Locale loc = new Locale ("de", "CH"); 
  System.out.println (loc.getDisplayName (Locale.GERMAN)); 

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

Deutsch (Schweiz)

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

Методы пакета java.util.Locale (API)

Метод Описание
Locale (String language)
Locale (String language, String country)
Locale (String language, String country, String variant)
Создает объект Locale для данных языка, страны, варианта
static Locale getDefault () Возвращает, используемый по умолчанию региональный стандарт
static void setDefault (Locale loc) Устанавливает, используемый по умолчанию региональный стандарт для программы Java
String getDisplayName () Возвращает строку с описанием текущего регионального стандарта. Эта строка представляется на языке, определяемом текущим региональным стандартом
String getDisplayName (Locale loc) Возвращает строку с описанием текущего регионального стандарта в формате заданного регионального стандарта loc
String getLanguage () Возвращает код языка (две строчные буквы) в соответствии со стандартом ISO-639
String getDisplayLanguage () Возвращает название языка в формате текущего регионального стандарта
String getDisplayLanguage (Locale loc) Возвращает название языка в формате заданного регионального стандарта loc
String getCountry () Возвращает код страны (две строчные буквы) в соответствии со стандартом ISO-3166
String getCountryLanguage () Возвращает название страны в формате текущего регионального стандарта
String getCountryLanguage (Locale loc) Возвращает название страны в формате заданного регионального стандарта loc
String toString () Возвращает описание регионального стандарта в виде последовательности кодов языка, страны и варианта, которые разделены символами подчеркивания. Например, "de_CH"