包裝

必須將上一節產生的 JSON 檔案與 這樣可以在程式執行階段找到它。 請參閱:提供資料檔案給元件

我們針對包裝資源製定了幾項慣例 (例如:本地化 資產)。這個架構必須能擴充至其他素材資源類型, 支援素材資源類型的組合,這項功能有時很實用 可呈現更複雜的裝置和語言代碼之間的關係 ( 200 dpi 螢幕的希伯來文圖示版本)。以下所有路徑均與 套件的資料目錄,並可在執行中系統的 /pkg/data 下找到。

路徑 說明
assets/ 儲存所有素材資源。這與 meta/ 目錄包含套件資訊清單和其他中繼資料的方式類似。這個目錄日後可能會包含傳統索引。
assets/locales 儲存語言代碼專屬的資料
assets/locales/fr-fr 儲存特定語言代碼的資料。語言代碼名稱是 BCP47 格式的個別目錄。每個程式都會為這個目錄提供一個名為 program.json 的單一 JSON 檔案,其中名稱的 program 部分是由作者選擇。在某些情況下,我們可能需要確認這裡的檔案套件和程式庫名稱不會衝突。此外,基於 Fuchsia 的封裝策略,為方便更新,您可能需要支付許多用來儲存翻譯的小型檔案,而非單一檔案。

路徑結構的完整性,以及本地化資源的適當封裝 還是需要手動執行

封裝本地化資源

請參考範例,以封裝本地化資源。讓我們開始吧 與 BUILD.gn 檔案搭配使用,我們稍後可以把重點放在特定部分。

# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/components.gni")

import("//build/intl/intl_strings.gni")


group("example") {
  testonly = true
  deps = [ ":pkg" ]
}


executable("src_intl_example_bin") {
  sources = [ "main.cc" ]
  output_name = "src_intl_example"

  deps = [
    "//sdk/lib/syslog/cpp",
    "//src/lib/intl/lookup/cpp:lib",
    "//third_party/googletest:gtest_prod",

    # This is the underlying generated FIDL code, must be included so that
    # its settings make it to the -I flag for compiler invocation.
    # Generate all needed intermediate resources.
    ":fuchsia.intl.l10n_hlcpp",
    ":l10n",
  ]

}


fuchsia_package_with_single_component("pkg") {
  package_name = "src-intl-example"
  component_name = package_name
  manifest = "meta/src-intl-example.cml"

  deps = [
    # The binary to bundle in the package
    ":src_intl_example_bin",
  ]

  deps += [
    # These declaration works, but need to be maintained manually.  Work is
    # underway to make the "package" target collect and apply the locale files
    # automatically.
    ":en-strings",
    ":es-strings",
    ":fr-strings",

    # Contains the necessary ICU data.
    "//src/intl:icudtl",
  ]

}

resource("en-strings") {
  data_deps = [ ":l10n" ]
  sources = [ "$target_gen_dir/en/l10n.json" ]
  outputs = [ "data/assets/locales/en/l10n.json" ]
}

resource("fr-strings") {
  data_deps = [ ":l10n" ]
  sources = [ "$target_gen_dir/fr/l10n.json" ]
  outputs = [ "data/assets/locales/fr/l10n.json" ]
}

resource("es-strings") {
  data_deps = [ ":l10n" ]
  sources = [ "$target_gen_dir/es/l10n.json" ]
  outputs = [ "data/assets/locales/es/l10n.json" ]
}


intl_strings("l10n") {
  source = "strings.xml"
  source_locale = "en"
  output_locales = [
    "en",
    "fr",
    "es",
  ]
  library = "fuchsia.intl.l10n"
}

用於產生本地化資源的建立規則

本地化資源是以檔案系統中的檔案為基礎。範例 //src/lib/intl/example 的程式說明 建構及部署內含本地化訊息的 Fuchsia 程式。

intl_strings("l10n") {
  source = "strings.xml"
  source_locale = "en"
  output_locales = [
    "en",
    "fr",
    "es",
  ]
  library = "fuchsia.intl.l10n"
}

建構規則 intl_strings 會指示建構系統處理 XML 含有字串的檔案。請參閱訊息內容一節 翻譯進一步瞭解譯文 工作流程預設建構輸出內容中有已翻譯的訊息 對應的目錄值source = "strings.xml" 行指向檔案 包含訊息來源由於這類訊息一律使用 而且沒有特定語言的相關性會降低 其他方式時,你還需要將預設語言告知系統 strings.xml的語言撰寫。

如要將預設語言設為英文,請在 BUILD.gn 中新增 source_locale = "en"。宣告輸出語言代碼可讓您指定確切的清單 輸入要產生的語言代碼資源這就是「output_locales」 這種明確聲明的原因如下:

  • 您想要明確宣告應用程式需要的語言代碼清單 要在執行階段正常運作

  • 建構系統要求宣告輸入和輸出檔案 以便確保建構的正確性由於輸入和輸出檔案 系統會根據語言代碼產生名稱,而語言代碼宣告就足夠 才能處理這個問題

舉例來說,如果原始檔案名稱是 strings.xml,語言代碼 fr 則是 列在 output_locales 中,建構系統預期的檔案名稱為 strings_fr.xml。這些資源需與二進位檔一起封裝 放入 Fuchsia 套件中。

deps += [
  # These declaration works, but need to be maintained manually.  Work is
  # underway to make the "package" target collect and apply the locale files
  # automatically.
  ":en-strings",
  ":es-strings",
  ":fr-strings",

  # Contains the necessary ICU data.
  "//src/intl:icudtl",
]

請務必將 JSON 資源封裝至正確的目錄。適用對象 正確的目錄路徑 assets/locales/fr/l10n.json 表示法文的翻譯訊息。是 也需要套件 ICU 資料,詳情請參閱 icudtl.dat 區段。