包装

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

我们已确立了一些打包资源(即本地化资源)的惯例。该架构旨在扩展到其他资源类型,并且能够支持资源类型组合,这在表示设备和语言区域(用于 200dpi 显示屏的希伯来语图标版本)之间有时非常有用。以下所有路径都相对于软件包的数据目录,可在正在运行的系统中的 /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 文件。如需详细了解转换工作流,请参阅消息翻译部分。翻译好的消息位于此规则的默认 build 输出目录中。source = "strings.xml" 行指向包含消息源的文件。由于这些消息始终使用口头语言编写,并且由于没有任何特定语言比其他语言更相关,因此您还需要告知系统编写默认 strings.xml 所用的语言。

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

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

  • 出于 build 正确性方面的原因,构建系统要求对输入和输出文件进行明确声明。由于输入和输出文件名是根据语言区域生成的,因此语言区域声明足以处理此问题。

例如,如果原始文件名为 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 部分进行了定义。