openjdk.ruOpenJDK на русском

JEP 128: Unicode BCP 47 Locale Matching

Сопоставление локалей по Unicode BCP 47

АвторNaoto Sato
ОтветственныйYuka Kamiya
ТипFeature
ОбластьSE
СтатусClosed / Delivered
Выпуск8
Компонентcore-libs / java.util:i18n
Обсуждениеi18n dash dev at openjdk dot java dot net
ТрудоёмкостьM
ДлительностьL
ОдобренBrian Goetz
Создан2011/07/15 20:00
Обновлён2017/10/23 21:19
Задача8046118

Аннотация

Определить API, с помощью которых приложения, использующие языковые теги BCP 47 (см. RFC 5646), смогут сопоставлять их с языковыми предпочтениями пользователя способом, соответствующим RFC 4647.

Мотивация

Во многих приложениях, платформах и/или протоколах часто нужно задать набор языковых тегов (то есть диапазон языков) и сопоставить заданный языковой тег с таким набором, например с набором языков, которые предпочитает пользователь. Java SE 8 будет содержать полную реализацию BCP 47 в соответствии с RFC 5646.

Описание

Реализовать функциональность, определённую в RFC 4647, которая описана так:

В этом документе описан синтаксис, называемый «language-range» (языковой диапазон), для задания элементов списка языковых предпочтений пользователя. Также описаны различные механизмы сравнения и сопоставления этих элементов с языковыми тегами. Определены два вида механизмов сопоставления: фильтрация и поиск (lookup). Фильтрация возвращает набор языковых тегов (возможно, пустой), а поиск возвращает один языковой тег. Возможные применения включают согласование языка или выбор содержимого.

Основные идеи предлагаемого API:

  1. Реализовать Language Range с помощью Collection<String>, а Language Priority List с помощью List<String>.

  2. Предоставить несколько методов, которые реализуют следующее:

    • Базовая фильтрация: принимает Basic Language Range и Language Priority List и возвращает отфильтрованный набор языковых тегов.
    • Расширенная фильтрация: принимает Extended Language Range и Language Priority List и возвращает отфильтрованный набор языковых тегов.
    • Поиск: принимает Basic Language Range и Language Priority List и возвращает языковой тег, который подходит лучше всего.

Пример: есть человек, для которого японский («ja») родной язык, а английский («en») и немецкий («de») вторые языки. Он живёт в Японии. И есть приложение, у которого, как оказалось, есть ресурсы локализации для английского, французского, New Caledonian Javanese и японского языков.

С помощью нового API описанную выше ситуацию можно выразить так:

/* Basic language ranges for this user's language priority list: 
 *   ja-JP: Japanese used in Japan
 *   en-jp: English used in Japan
 *   de-JP: German used in Japan
 *
 * The order expresses the priority of each language for the user.
 * Note that each sub tag (e.g. "jp") are case insensitive and used after
 * normalization.
 */
List<String> list1 = Arrays.asList("ja-JP", "en-jp", "de-JP");

/* Extended language ranges for this user's language priority list: 
 *   ja-*-JP: Japanese used in Japan
 *   en-*-jp: English used in Japan
 *   de-*-JP: German used in Japan
 *
 * The order expresses the priority of each language for the user.
 * Note that each sub tag (e.g. "jp") are case insensitive and used after
 * normalization.
 */
List<String> list2 = Arrays.asList("ja-*-JP", "en-*-jp", "de-*-JP");

/* The app's language ranges:
 *   en-US: English used in the USA
 *   en-JP: Japanese used in the USA
 *   fr-FR: French used in France,
 *   de-de: German used in Germany
 *   de-CH: German used in Switzerland
 *   de-jp: German used in Japan
 *   jas-JP: New Caledonian Javanese used in Japan
 *   ja-US: Japanese used in the USA
 */  ja-Latn-JP: Japanese used in Japan, written in Latin alphabet
Collection<String> ranges =
    Arrays.asList("en-US", "en-JP", "fr-FR", "de-DE", "de-CH", "de-JP",
                  "ja-US", "jas-JP", "ja-Latn-JP");

// Matching 1: Basic filtering returns a list of "en-JP" and
// "de-JP".
List<Locale> tags1 = Locale.filterBasic(list1, ranges);

// Matching 2: Extended filtering returns a list of "ja-Latn-JP",
// "en-JP", and "de-JP".
List<Locale> tags2 = Locale.filterExtended(list2, ranges);

// Matching 3: Look up returns "en-JP".
Locale locale = Locale.lookup(list1, ranges);
</code>

Обратите внимание, что представленный здесь API является черновым и может быть изменён позже.