國際化偏好設定

無論是從使用者傳達至元件,還是在元件之間傳達,Fuchsia 都有一些慣例可用於傳達 i18n 偏好設定。

本指南涵蓋下列項目:

語言代碼 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.languagesnavigator.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.PropertyProviderimplementor。在典型的 Fuchsia 產品設定中,這項存取權應限制為狹隘的許可清單。

大多數用戶端元件會改用透過 fuchsia.intl.PropertyProvider 提供的唯讀檢視畫面

導入作業:setui_service

通訊協定 fuchsia.settings.Intl 是由 setui_service 實作 (以及 fuchsia.settings 下的其他通訊協定)。這項服務可做為 Fuchsia 產品中設定 UI 的後端。