Fuchsia 針對如何通訊 i18n 偏好,無論是使用者、元件還是元件皆是如此。
本指南涵蓋下列項目:
- 使用 Unicode BCP-47 語言代碼 ID 對語言代碼 ID 進行編碼。
- 在元件中使用
fuchsia.intl.PropertyProvider
即可讀取國際化偏好設定。請確保產品設定包含intl_services
或此通訊協定的其他實作。 - 如要實作設定 UI,請使用
fuchsia.settings.Intl
來編寫國際化設定。
語言代碼 ID
i18n 偏好設定的關鍵在於「語言代碼 ID」,這個字串會簡要傳達下列資訊:
- 語言 (例如英文、法文、阿拉伯文)
- 國家/地區 (例如英國、摩洛哥、韓國)
- 指令碼 (例如拉丁文、斯拉夫文、繁體中文、簡體中文)
語言代碼 ID 還能傳達更精細的資訊,例如:
- 日曆 (例如公曆、日文、希伯來文)
- 一週的第一天
- 對照 (排序順序、將搜尋字串分組)
- 數字樣式 (例如:"阿拉伯文" 012345, "東部阿拉伯文" "安園
- 數字格式 (小數分隔符、數字分組)
- 貨幣格式
- 時間和日期格式
- 等等
如要覆寫特定語言和地區的預設值 (請參閱下一節),指定這些詳細資料會格外實用。
Unicode BCP-47 語言代碼 ID
Fuchsia 使用 Unicode BCP-47 語言代碼 ID 標準提供語言代碼 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 中表示「使用公制單位,但使用華氏溫度單位」。
存取 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 沒有環境或系統語言代碼。語言代碼和其他 i18n 偏好設定取決於元件執行時的結構定義。這與其他作業系統相比,其他作業系統或許能有 API 取得全域或預設語言代碼設定,但前提是遵循 Fuchsia 設計原則,並無環境授權。
在標準程式庫提供部分預設語言代碼存取權的執行階段中,runner負責從執行中的元件領域擷取需要的值。在大多數情況下,執行元件應呼叫 fuchsia.intl.PropertyProvider.GetProfile
。
多個 i18n Profile
秒
視產品的設計而定,在不同領域中在同一部機器上執行的兩個元件執行個體可能會連線至不同的 PropertyProvider
執行個體,並接收不同的 Profile
。
舉例來說,一個顯示 Mallorca 的西班牙語 (es-ES
) 文章的百科全書元件可以選擇用 es-ES
使用者介面啟動地圖元件,同時讓英文 (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
的實作器。在一般 Fuchsia 產品設定中,這類存取權應限制為範圍較小的許可清單。
大多數用戶端元件會改用透過 fuchsia.intl.PropertyProvider
提供的唯讀檢視畫面。
導入作業:setui_service
通訊協定 fuchsia.settings.Intl
是由 setui_service
以及 fuchsia.settings
下的其他通訊協定實作。這項服務可做為 Fuchsia 產品設定 UI 的後端。