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:
-
Реализовать Language Range с помощью
Collection<String>, а Language Priority List с помощьюList<String>. -
Предоставить несколько методов, которые реализуют следующее:
- Базовая фильтрация: принимает 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 является черновым и может быть изменён позже.