国际化偏好设置

Fuchsia 有一些惯例,用于说明如何传达 i18n 偏好设置,无论是从最终用户传达给组件,还是在组件之间传达。

本指南涵盖以下内容:

语言区域标识符

国际化偏好设置的关键要素是语言区域标识符,这是一个字符串,用于简洁地传达以下信息:

  • 语言(例如英语、法语、阿拉伯语)
  • 国家或地区(例如英国、摩洛哥、韩国)
  • 文字(例如拉丁文、西里尔文、繁体中文、简体中文)

语言区域标识符还可以传达更精细的信息,例如:

  • 日历(例如公历、日本历、希伯来历)
  • 一周的第一天
  • 排序规则(排序顺序、搜索分组字符串)
  • 数字样式(例如“阿拉伯语”012345、“东阿拉伯语”٠١٢٣٤٥)
  • 数字格式(小数分隔符、数字分组)
  • 货币格式
  • 时间和日期格式
  • 等等

在替换指定语言和地区的默认值时,指定这些详细信息特别有用(请参阅下一部分)。

Unicode BCP-47 语言区域标识符

Fuchsia 使用 Unicode BCP-47 语言区域标识符标准来表示语言区域 ID。

例如,以下语言区域 ID 指定塞尔维亚语 (sr) 在塞尔维亚 (RS) 使用,并采用西里尔文 (Cyrl) 书写:

"sr-Cyrl-RS"

您可以在语言区域 ID 中使用 Unicode 扩展子标记添加替换项。请参考以下示例:

"sr-Cyrl-RS-u-ca-hebrew-fw-monday-ms-ussystem-nu-deva-tz-usnyc"

此示例指定了以下内容:

子标记 含义
sr 指定塞尔维亚语。
Cyrl 指定西里尔字母。
RS 将塞尔维亚指定为国家/地区。
u 标记 Unicode 扩展数据的开始。
ca-hebrew 指定希伯来日历。
fw-monday 将星期一指定为一周的第一天。
ms-ussystem 将测量系统指定为“US”(例如英尺、盎司等)。
nu-deva 指定梵文数字。
tz-usnyc 将时区指定为 America/New_York

并非所有可能需要表达的国际化属性都有相应的 Unicode 扩展。例如,目前没有温度单位扩展,因此无法在语言区域 ID 中表达“使用公制单位,但使用华氏温度”。

访问国际化偏好设置

如需在 Fuchsia 的fuchsia.intl.Profile FIDL 表中发送 i18n 偏好设置,请使用以下方法:

type Profile = table {
    1: locales vector<LocaleId>;
    2: calendars vector<CalendarId>;
    3: time_zones vector<TimeZoneId>;
    4: temperature_unit TemperatureUnit;
};

语言区域 ID 只是 Profile 中的构建块。配置文件包含语言区域 ID(用来表示相对优先、优先级或支持程度;请参阅语言区域回退中的使用示例)的排序列表,以及无法在单个语言区域 ID 中完整表示的其他属性。出现冲突时,Profile 中的显式设置会替换语言区域 ID 中的值(例如,在语言区域 ID 中指定美国测量单位,但在 temperature_unit 字段中指定 CELSIUS)。

当某个组件需要向其他组件提供 i18n 偏好设置时,应实现 fuchsia.intl.PropertyProvider 协议,该协议会提供 Profile 并通知更改:

closed protocol PropertyProvider {
    strict GetProfile() -> (struct {
        profile Profile;
    });
    strict -> OnChange();
};

此协议提供对国际化配置文件的只读视图。根据服务的实现方式和服务要面向的令牌网域,国际化配置文件的内容可以从用户设置、产品的原始设置、特定组件的具体要求,或上述各项的组合中派生而来。

请勿假定环境语言区域

Fuchsia 没有环境或系统语言区域。语言区域和其他国际化偏好设置取决于运行组件的上下文。这与其他操作系统形成鲜明对比,其他操作系统可能具有 API 来获取全局或默认语言区域设置,而 Fuchsia 遵循无环境权限的设计原则

在标准库提供对某些默认语言区域的访问权限的运行时中,运行程序有责任从正在运行的组件的领域检索所需的值。在大多数情况下,运行程序应调用 fuchsia.intl.PropertyProvider.GetProfile

多个 i18n Profile

根据产品的设计,在不同领域的同一台机器上并发运行的两个组件实例可能会连接到不同的 PropertyProvider 实例并接收不同的 Profile

例如,显示有关马略夫的西班牙语 (es-ES) 文章的百科全书组件可以选择启动具有 es-ES 界面的地图组件,同时,英语 (en-US) 文章启动相同的地图组件,但指示其显示 en-US 界面。这可以通过两个不同的子王国来实现,每个子王国都会收到不同的 PropertyProvider 实例。

intl_services

您可以在 //src/lib/intl/intl_property_provider_impl 中找到实现 fuchsia.intl.PropertyProvider 的基本 C++ 库。

core 产品配置包括 intl_services,这是一个封装此实现的组件。

集成

网站(例如Chrome 和 WebEngine)

Profile 中的首选语言区域列表会在 HTTP 请求标头 Accept-Language 中发送到 Web 服务器,并通过 navigator.languagesnavigator.language 提供给 JavaScript。

存储 i18n 用户设置

与 Fuchsia 上的其他用户设置一样,国际化设置是通过 fuchsia.settings FIDL 协议进行修改的。

具体而言,协议 fuchsia.settings.Intl 用于写入和监控与国际化相关的设置。

closed protocol Intl {
    strict Watch() -> (struct {
        settings IntlSettings;
    });
    strict Set(struct {
        settings IntlSettings;
    }) -> () error Error;
};
type IntlSettings = table {
    1: locales vector<fuchsia.intl.LocaleId>:10;
    2: temperature_unit fuchsia.intl.TemperatureUnit;
    3: time_zone_id fuchsia.intl.TimeZoneId;
    4: hour_cycle HourCycle;
};

此协议专门适用于需要直接访问用户设置的组件,例如系统控制台、任务栏语言区域选择器或 fuchsia.intl.PropertyProviderimplementor。在典型的 Fuchsia 产品配置中,此访问权限应仅限于较小的许可名单。

大多数客户端组件将改用通过 fuchsia.intl.PropertyProvider 提供的只读视图

实现:setui_service

协议 fuchsia.settings.Intlsetui_service 实现(以及 fuchsia.settings 下的其他协议)。此服务充当 Fuchsia 产品中设置界面的后端。