跳到主要内容

JEP 128:Unicode BCP 47 区域设置匹配

概括

定义 API,以便使用 BCP 47 语言标签(请参阅RFC 5646 )的应用程序可以按照符合RFC 4647 的方式将它们与用户的语言首选项进行匹配。

动机

跨应用程序、平台和/或协议的常见场景是需要指定一组语言标签(即,一系列语言),并将给定的语言标签与这样的一组(例如,用户的首选语言组)相匹配。 。 Java SE 8 将根据RFC 5646提供完整的 BCP 47 实现。

描述

实现RFC 4647中定义的功能,其描述如下:

本文档描述了一种称为“语言范围”的语法,用于指定用户的语言首选项列表中的项目。它还描述了将它们与语言标签进行比较和匹配的不同机制。定义了两种匹配机制:过滤和查找。过滤产生一组(可能为空)语言标签,而查找产生单个语言标签。可能的应用包括语言协商或内容选择。

拟提出的API的基本思路是:

  1. 使用 实现语言范围Collection<String>,并使用 实现语言优先级列表List<String>

  2. 提供一些实现以下功能的方法:

    • 基本过滤:获取基本语言范围和语言优先级列表,并返回过滤后的语言标签集。
    • 扩展过滤:获取扩展语言范围和语言优先级列表,并返回过滤后的语言标签集。
    • 查找:获取基本语言范围和语言优先级列表,并返回最匹配的语言标签。

示例:此人以日语(“ja”)为母语,英语(“en”)和德语(“de”)为第二语言。他住在日本。而且,这里的应用程序恰好具有英语、法语、新喀里多尼亚语、爪哇语和日语的本地化资源数据。

上述情况可以用新的 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 是草案,以后可能会更改。