在上一部分中生成的 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
部分进行了定义。