国际化偏好设置

Fuchsia 制定了一些关于如何传达国际用户偏好的惯例,比如 例如最终用户、组件或组件之间。

本指南涵盖以下内容:

语言区域标识符

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

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

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

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

在覆盖默认设置时,指定这些详细信息特别有用。 值(请参阅下一部分)。

Unicode BCP-47 语言区域标识符

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

例如,以下语言区域 ID 将塞尔维亚语 (sr) 指定为 塞尔维亚语(RS),西里尔文字(Cyrl):

"sr-Cyrl-RS"

您可以使用 Unicode 扩展子标记 要添加覆盖设置的语言区域 ID。请参考以下示例:

"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 扩展名。例如,目前没有扩展程序 温度单位,因此无法表示“使用公制单位, “华氏度”表示温度"。

访问国际化偏好设置

在 Fuchsia 之间发送国际化偏好设置 组件 ,请使用 fuchsia.intl.Profile FIDL 表:

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)。

如果某个组件需要为其他组件提供国际化偏好, 应实现 fuchsia.intl.PropertyProvider 协议,该协议提供 Profile 并通知更改:

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

此协议提供国际化资料的只读视图。 具体取决于服务的实现和 领域 国际化资料的内容可能来源于 用户设置、产品的出厂设置、特定组件的 或是上述要求的某种组合

请勿假定氛围语言区域

Fuchsia 没有环境或系统语言区域。语言区域和其他国际化偏好设置 取决于组件的运行环境。这与 其他操作系统,这些操作系统可能具有用于获取全局或默认语言区域的 API 遵循 Fuchsia 的设计原则, 无环境授权系统

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

多个国际化 Profile

根据产品的设计, 会连接到同一台机器的不同领域中 不同的 PropertyProvider 实例,并收到不同的 Profile

例如,显示西班牙语的百科全书组件 (es-ES) 介绍马略卡岛的文章可以选择启动一个具有 es-ES 界面的地图组件, 同时又能发布相同的英语(en-US)文章 地图组件,但会指示其显示 en-US 界面。这可以通过 两种不同的 子领域 会收到不同的 PropertyProvider 实例。

intl_services 个库

您可以在以下位置找到实现 fuchsia.intl.PropertyProvider 的基本 C++ 库: //src/lib/intl/intl_property_provider_impl

通过 core 产品配置包括 intl_services, 用于封装此实现的组件。

集成

网站(例如,Chrome 和WebEngine)

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

存储国际化用户设置

与 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.PropertyProvider实现器。在典型的 Fuchsia 产品中 配置,则应仅限小范围许可名单访问。

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

实现:setui_service

fuchsia.settings.Intl 协议由 setui_service(以及 fuchsia.settings)。此服务充当 紫红色产品。