包装

从上一部分中生成的 JSON 文件必须与 Fuchsia 程序,以便在程序运行时找到它。 请参阅:为组件提供数据文件

我们制定了一些资源包装规范(例如, 资源)。此架构旨在扩展至其他资源类型, 能够支持各类素材资源的组合,这有时很有用 在表达设备和语言区域之间更复杂的关系时需要执行的操作( 适用于 200dpi 显示屏的希伯来语图标版本)。以下所有路径均相对于 软件包的数据目录下,可在正在运行的系统上的 /pkg/data 下找到。

路径 说明
assets/ 存储所有资源。这与 meta/ 目录包含软件包清单和其他元数据的方式类似。将来,此目录可以包含常规索引。
assets/locales 专门存储语言区域的数据
assets/locales/fr-fr 存储特定语言区域的数据。语言区域名称是采用 BCP47 格式的单个目录。每个程序都会向此目录贡献一个 JSON 文件(名为 program.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 包含字符串的文件。请参阅有关 翻译,详细了解译文 工作流。翻译后的消息将在默认 build 输出中提供 目录代码行 source = "strings.xml" 指向文件 包含消息来源。由于这些消息始终使用 而且由于没有哪种语言 则您还需要让系统了解默认的 strings.xml 是采用这种语言编写的。

如需将默认语言设置为英语,请在您的 BUILD.gn 中添加 source_locale = "en"。通过输出语言区域的声明,您可以指定 其中包含您想要生成的语言区域资源这就是output_locales 用途此显式声明是出于以下几个原因:

  • 您需要一个明确声明的语言区域列表, 在运行时可用

  • 构建系统要求声明输入和输出文件 。由于输入和输出文件 根据语言区域生成名称,那么语言区域声明就足够了 以解决此问题。

例如,如果原始文件名为 strings.xml,语言区域 froutput_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 部分进行了定义。