从上一部分中生成的 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
,语言区域 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
部分进行了定义。