Fuchsia 制定了一些关于如何传达国际用户偏好的惯例,比如 例如最终用户、组件或组件之间。
本指南涵盖以下内容:
- 使用 Unicode BCP-47 语言区域标识符对语言区域 ID 进行编码。
- 在组件中使用
fuchsia.intl.PropertyProvider
执行以下操作: 读取国际化偏好设置。请确保产品 配置包含intl_services
或其他 该协议的实现 - 如果要实现设置界面,请使用
fuchsia.settings.Intl
执行以下操作 写入国际化设置。
语言区域标识符
国际化偏好设置的关键是语言区域标识符,它是一个字符串 简洁明了地传达了以下信息:
- 语言(例如英语、法语、阿拉伯语)
- 国家或地区(例如英国、摩洛哥、韩国)
- 文字(例如拉丁字母、西里尔字母、繁体中文、简体中文)
语言区域标识符还可以传达更精细的信息,例如:
- 日历(例如公历、日语、希伯来语)
- 一周的第一天
- 排序规则(排序顺序、搜索分组字符串)
- 数字样式(例如“阿拉伯语”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.languages
和navigator.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
)。此服务充当
紫红色产品。