無論是從使用者傳達至元件,還是在元件之間傳達,Fuchsia 都有一些慣例可用於傳達 i18n 偏好設定。
本指南涵蓋下列項目:
- 使用 Unicode BCP-47 語言代碼 ID 來為語言代碼 ID 進行編碼。
- 在元件中使用
fuchsia.intl.PropertyProvider
以讀取國際化偏好設定。請確保產品設定包含intl_services
或此通訊協定的其他實作。 - 如要實作設定 UI,請使用
fuchsia.settings.Intl
來撰寫國際化設定。
語言代碼 ID
i18n 偏好設定的重點是「語言代碼 ID」,這是可簡要傳達資訊的字串,例如:
- 語言 (例如英文、法文、阿拉伯文)
- 國家/地區或區域 (例如英國、摩洛哥、韓國)
- 指令碼 (例如拉丁文、斯拉夫文、繁體中文、簡體中文)
語言代碼 ID 也能提供更詳盡的資訊,例如:
- 日曆 (例如:格里曆、日本曆、希伯來曆)
- 一週的第一天
- 彙整 (排序順序、搜尋字串分組)
- 數字樣式 (例如「阿拉伯文」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 |
標示萬國碼擴充資料的開始位置。 |
ca-hebrew |
指定希伯來日曆。 |
fw-monday |
將星期一設為一週的第一天。 |
ms-ussystem
|
指定測量系統為「US」,例如英尺、盎司等。 |
nu-deva |
指定梵文字母數字。 |
tz-usnyc |
將時區指定為 America/New_York 。 |
並非所有可能想表達的國際化屬性都有對應的 Unicode 擴充功能。舉例來說,目前沒有溫度單位的擴充功能,因此無法在語言代碼 ID 中表示「使用公制單位,但使用華氏溫度」。
存取 i18n 偏好設定
如要傳送 i18n 偏好設定,請使用 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
中的構建區塊。設定檔包含排序的語言代碼清單 (用於表示相對偏好、優先順序或支援程度;如需使用範例,請參閱「語言代碼備用方案」),以及無法在單一語言代碼中完整表達的其他屬性。發生衝突時,Profile
中的明確設定會覆寫語言代碼 ID 中的值 (例如在語言代碼 ID 中指定美國測量單位,但在 temperature_unit
欄位中指定 CELSIUS
)。
如果元件需要為其他元件提供 i18n 偏好設定,則應實作 fuchsia.intl.PropertyProvider
通訊協定,用於提供 Profile
並通知變更:
closed protocol PropertyProvider {
strict GetProfile() -> (struct {
profile Profile;
});
strict -> OnChange();
};
這個通訊協定提供國際化設定檔的唯讀檢視畫面。視服務的實作方式和要提供服務的運作範圍而定,國際化設定檔的內容可能衍生自使用者設定、產品工廠設定、特定元件的要求,或上述的某些組合。
不要假設環境語言代碼
Fuchsia 沒有環境或系統語言代碼。語言代碼和其他 i18n 偏好設定取決於元件執行的情境。這與其他作業系統不同,其他作業系統可能會提供 API 來取得全域或預設語言代碼設定,這符合 Fuchsia 的設計原則,即沒有環境權限
在標準程式庫提供對某些預設語言代碼存取權的執行階段中,執行程式負責從執行中元件的領域中擷取所需的值。在大多數情況下,執行元件應呼叫 fuchsia.intl.PropertyProvider.GetProfile
。
多個 i18n Profile
視產品設計而定,在不同領域的同一台電腦上同時執行的兩個元件執行個體,可能會連結至不同的 PropertyProvider
執行個體,並接收不同的 Profile
。
舉例來說,如果百科元件顯示馬洛卡的西班牙文 (es-ES
) 文章,可選擇使用 es-ES
UI 啟動地圖元件,同時英文 (en-US
) 文章則會啟動相同的地圖元件,但指示它顯示 en-US
UI。您可以使用兩個不同的子領域來達成這項目標,每個子領域都會接收不同的 PropertyProvider
例項。
intl_services
程式庫
您可以在 //src/lib/intl/intl_property_provider_impl
中找到實作 fuchsia.intl.PropertyProvider
的基本 C++ 程式庫。
core
產品設定包含 intl_services
,這是包裝此實作的元件。
整合
網頁 (例如Chrome 和 WebEngine)
Profile
中的偏好語言代碼清單會傳送到 HTTP 要求標頭 Accept-Language
中的網路伺服器,並透過 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 產品中設定 UI 的後端。