国际化偏好设置

Fuchsia 针对如何传达国际化偏好提供了一些惯例,无论是从最终用户到组件,还是在组件之间传递。

本指南涵盖以下内容:

语言区域标识符

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

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

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

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

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

Unicode BCP-47 语言区域标识符

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

例如,以下语言区域 ID 指定塞尔维亚语 (RS) 的塞尔维亚语 (sr),以西里尔文 (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.intl.Profile

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

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

core 产品配置包含 intl_services,它是封装此实现的组件。

集成

网站(例如Chrome 和 WebEngine)

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

存储国际化用户设置

与 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.Intlsetui_service(以及 fuchsia.settings 下的其他协议)实现。此服务充当 Fuchsia 产品中设置界面的后端。