國際化偏好設定

Fuchsia 針對如何通訊 i18n 偏好,無論是使用者、元件還是元件皆是如此。

本指南涵蓋下列項目:

語言代碼 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 偏好設定

fuchsia.intl.Profile

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.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.PropertyProvider實作器。在一般 Fuchsia 產品設定中,這類存取權應限制為範圍較小的許可清單。

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

導入作業:setui_service

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