Flutter资源合并插件arb_merge的使用
Flutter资源合并插件arb_merge的使用
ARB Merge
ARB Merge 合并来自多个文件夹(任意结构和深度)中的翻译文件。此包的独特之处在于它根据 @[@locale](/user/locale)
语言代码来合并文件内容,而不是依赖于强制性的文件或文件夹命名约定或强制性结构。它还可以通过使用逗号分隔的路径字符串来接受任意数量的源文件夹,并且每个文件夹将被递归处理,因此文件可以嵌套到任意深度。
背景
我创建了这个包,因为我找不到一个支持多个输入文件夹(具有不同路径)的包。我有一个包含由Google自动更新和翻译的小翻译文件的文件夹,另一个包含不自动翻译的大翻译文件的文件夹。因此,这是一个经济激励措施,因为Google已经开始对那些大型单一文件收取翻译费用。
致谢与版权
这个包基于 Shueh Chou Lu 的优秀项目 arb_glue,但为了满足一些其他需求,我对他的代码进行了修改,添加了一些功能,从而创造了这个包。
特性:
- 支持
[JSON]
和 ARB 源文件。 - 支持无限嵌套,任意的文件和文件夹命名约定。
- 支持无限的源文件夹。
- 合并后的文件的翻译键可以根据需要按字母顺序排序。
- 支持可选的详细输出以供调试用途。
安装
在终端运行以下命令:
flutter pub add dev:arb_merge
或者在 pubspec.yaml
文件中添加依赖项:
dev_dependencies:
arb_merge: *
使用
命令行选项:
<code>--sources</code>
:一个逗号分隔的字符串,包含所有要从中合并文件的文件夹路径。
示例:
dart run arb_merge --sources intl_autoTranslated,intl_static,assets/manual_translations --destination lib/intl
-
<code>--destination</code>
:合并文件的目标文件夹路径。 -
<code>--pattern</code>
:用于命名生成文件的字符串,其中{lang}
将被替换为语言代码。默认值为intl_{lang}.arb
,这将生成名为intl_en.arb
的英文文件。 -
<code>--verbose</code>
:设置详细模式会输出处理的文件详情,默认值为false
。 -
<code>--sort</code>
:将每个输出文件中的键按字母顺序排序,默认值为false
。
dart run arb_glue --
# 或者
flutter pub run arb_glue
你也可以在 pubspec.yaml
文件中设置所有选项的值,然后只需运行 dart run arb_merge
来使用 pubspec
中的值运行 arb_merge
。请注意,任何在命令行上设置的选项将覆盖这些值。
arb_merge:
sources: example/primarySource,example/secondarySource
destination: example/merged
sort: false
pattern: 'intl_{lang}.arb'
verbose: false
支持的格式
arb_merge
支持 JSON 和 ARB 文件。
示例代码
使用arb_merge
如何使用 arb_merge
将多个语言文件合并成一个 ARB 格式的文件。
输入文件
假设我们有以下目录结构,其中包含语言文件:
.
└── example/
├── merged/
├── primarySource/
│ ├── en.arb
│ └── intl_french.arb
| ├── nestedFolder/
| | └── more_translations_english.json
└── secondarySource/
├── intl_en.arb
└── intl_fr.arb
example/primarySource/en.arb 的内容
{
"@[@locale](/user/locale)": "en",
"hello": "Hello"
}
example/primarySource/nestedFolder/more_translations_english.json 的内容
{
"@[@locale](/user/locale)": "en",
"howDoYouDo": "How do you do?"
}
example/secondarySource/intl_en.arb 的内容
{
"@[@locale](/user/locale)": "en",
"one": "one",
"two": "two",
"three": "three"
}
使用arb_merge
要使用 arb_merge
合并这些文件,请按照以下步骤操作:
- 执行
arb_merge
:
dart run arb_merge --sources example/primarySource,example/secondarySource --destination example/merged --pattern intl_{lang}.arb --sort
- 验证输出:
执行
arb_merge
后,目录结构将更新如下:
.
└── example/
├── merged/
| ├── intl_en.arb
│ └── intl_fr.arb
├── primarySource/
│ ├── en.arb
│ └── intl_french.arb
| ├── nestedFolder/
| | └── more_translations_english.json
└── secondarySource/
├── intl_en.arb
└── intl_fr.arb
输出 ARB 文件
intl_en.arb
的内容:
{
"@[@locale](/user/locale)": "en",
"hello": "Hello {name}!",
"[@hello](/user/hello)": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"howDoYouDo": "How do you do?",
"one": "one",
"three": "three",
"two": "two"
}
intl_fr.arb
的内容:
{
"@[@locale](/user/locale)": "fr",
"hello": "Salut {name}!",
"[@hello](/user/hello)": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"howDoYouDo": "Comment ça va?",
"one": "un",
"three": "trois",
"two": "deux"
}
更多关于Flutter资源合并插件arb_merge的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter资源合并插件arb_merge的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter开发中,arb_merge
是一个用于合并多个 .arb
文件的插件,这对于管理多语言的本地化资源非常有用。以下是如何使用 arb_merge
插件的一个示例,包括安装插件、准备 .arb
文件以及执行合并操作的步骤。
1. 安装 arb_merge
插件
首先,你需要在你的 Flutter 项目中安装 arb_merge
插件。你可以通过添加以下依赖到你的 pubspec.yaml
文件中来完成这一步:
dev_dependencies:
arb_merge: ^x.y.z # 请替换为最新的版本号
然后运行 flutter pub get
来获取依赖。
2. 准备 .arb
文件
假设你有两个 .arb
文件,messages_en.arb
和 messages_fr.arb
,内容如下:
messages_en.arb:
{
"greeting": "Hello",
"farewell": "Goodbye"
}
messages_fr.arb:
{
"greeting": "Bonjour",
"thank_you": "Merci"
}
3. 使用 arb_merge
合并 .arb
文件
你可以创建一个 Dart 脚本来使用 arb_merge
合并这些 .arb
文件。创建一个新的 Dart 文件,例如 merge_arb_files.dart
,并添加以下代码:
import 'package:arb_merge/arb_merge.dart';
import 'dart:io';
void main() {
// 定义要合并的ARB文件路径
List<String> inputFiles = [
'path/to/messages_en.arb',
'path/to/messages_fr.arb',
];
// 定义输出文件的路径
String outputFile = 'path/to/merged_messages.arb';
// 读取ARB文件内容
List<Map<String, Map<String, String>>> arbContents = inputFiles.map((filePath) {
File file = File(filePath);
String content = file.readAsStringSync();
return ArbFile.parse(content).messages;
}).toList();
// 合并ARB文件内容
Map<String, Map<String, String>> mergedArbContent = mergeArbFiles(arbContents);
// 将合并后的内容写回ARB文件
String mergedContent = ArbFile(mergedArbContent).toString();
File outputFileObj = File(outputFile);
outputFileObj.writeAsStringSync(mergedContent);
print('ARB files have been merged successfully.');
}
注意:上面的代码示例中,mergeArbFiles
函数并不是 arb_merge
插件直接提供的API。实际使用中,你可能需要根据 arb_merge
插件的具体API来调整代码。由于 arb_merge
的API可能会随着版本更新而变化,请参考其官方文档或源代码以获取最新和最准确的API信息。
通常,arb_merge
插件可能会提供一个命令行工具,你可以直接在命令行中运行该工具来合并ARB文件,而不是手动编写Dart脚本。例如:
pub run arb_merge path/to/messages_en.arb path/to/messages_fr.arb -o path/to/merged_messages.arb
请查阅 arb_merge
插件的README文件或官方文档以获取正确的命令行用法。
4. 运行合并脚本
如果你选择了编写Dart脚本来合并ARB文件,那么你可以使用以下命令来运行该脚本:
dart merge_arb_files.dart
这将读取指定的ARB文件,合并它们的内容,并将结果写入到指定的输出文件中。
总结
通过上述步骤,你可以使用 arb_merge
插件来合并多个 .arb
文件,从而简化Flutter项目的本地化资源管理。请注意,由于插件的API可能会随着版本更新而变化,因此始终建议查阅最新的官方文档以获取准确的信息。