Fuchsia 有一些惯例,用于说明如何传达 i18n 偏好设置,无论是从最终用户传达给组件,还是在组件之间传达。
本指南涵盖以下内容:
- 使用 Unicode BCP-47 语言区域标识符对语言区域 ID 进行编码。
- 在组件中使用
fuchsia.intl.PropertyProvider
来读取国际化偏好设置。确保产品配置包含intl_services
或此协议的其他实现。 - 如果要实现设置界面,请使用
fuchsia.settings.Intl
编写国际化设置。
语言区域标识符
国际化偏好设置的关键要素是语言区域标识符,这是一个字符串,用于简洁地传达以下信息:
- 语言(例如英语、法语、阿拉伯语)
- 国家或地区(例如英国、摩洛哥、韩国)
- 文字(例如拉丁文、西里尔文、繁体中文、简体中文)
语言区域标识符还可以传达更精细的信息,例如:
- 日历(例如公历、日本历、希伯来历)
- 一周的第一天
- 排序规则(排序顺序、搜索分组字符串)
- 数字样式(例如“阿拉伯语”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.languages
和 navigator.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.PropertyProvider
的implementor。在典型的 Fuchsia 产品配置中,此访问权限应仅限于较小的许可名单。
大多数客户端组件将改用通过 fuchsia.intl.PropertyProvider
提供的只读视图。
实现:setui_service
协议 fuchsia.settings.Intl
由 setui_service
实现(以及 fuchsia.settings
下的其他协议)。此服务充当 Fuchsia 产品中设置界面的后端。