Flutter的ARB翻译文件的代码检查工具(linter)插件的使用
Flutter的ARB翻译文件的代码检查工具(linter)插件的使用
Rebellion简介
Rebellion是一个用于Flutter的ARB翻译文件的代码检查工具(linter)。它可以帮助开发者在国际化过程中发现并解决翻译文件中的问题。
功能:
- 分析ARB文件并查找可能的问题
- 查找缺失的翻译
- 排序ARB文件
目前,Rebellion被设计为一个命令行工具(CLI),不能作为自定义的lint规则。建议将其添加到CI任务中,以确保所有字符串都被翻译且没有问题。
安装Rebellion
dart pub global activate rebellion
示例
假设我们有一个项目目录结构如下:
my_flutter_project/
lib/
l10n/
intl_en.arb
intl_fi.arb
运行以下命令来分析这些ARB文件:
rebellion analyze ./lib/l10n/
输出示例:
l10n/intl_fi.arb: all caps string key "key2"
l10n/intl_fi.arb: no @@locale key found
l10n/intl_en.arb: key "@key4" is missing placeholders definition
l10n/intl_fi.arb key "key3" is missing a plural value "one"
l10n/intl_en.arb key "key3" contains a redundant plural value "zero"
l10n/intl_fi.arb: missing translation for key "key_5"
l10n/intl_fi.arb: [@-key](/user/-key) "@key" should only be present in the main file
l10n/intl_en.arb: key "key_5" does not match selected naming convention (camel case)
8 issues found
分析ARB文件
要查找ARB文件中的问题,可以使用以下命令:
rebellion analyze ./lib/l10n/
请参阅下面的“配置”部分来自定义规则集。
查找缺失的翻译
使用以下命令查找缺失的翻译:
rebellion diff ./lib/l10n/
默认情况下,此命令会在控制台打印缺失的翻译。您可以使用--output
选项指示Rebellion创建包含缺失翻译的“diff”ARB文件(可用值:console
或file
)。
diff
命令使用主应用程序的语言环境来比较ARB文件。默认语言环境是en
,但您可以使用--main-locale
选项更改它。
排序ARB文件
按字母顺序、反向字母顺序或跟随主ARB文件的顺序对ARB文件进行排序:
rebellion sort ./lib/l10n/
使用--sorting
选项更改排序方式:alphabetical
(默认)、alphabetical-reverse
或follow-main-file
配置
您可以通过创建一个名为rebellion_options.yaml
的文件来禁用某些规则,设置sort
和diff
选项。在您的应用程序根目录下创建该文件,并启用某些规则和选项:
# 列出Rebellion应遵循的所有规则
rules:
# 启用强制[@-key](/user/-key)描述规则(默认关闭)
- mandatory_at_key_description
# 禁用缺失翻译规则
# - missing_translations
# 启用其他所有规则
- all_caps
- string_type
- at_key_type
- duplicated_keys
- empty_at_key
- locale_definition
- missing_placeholders
- missing_plurals
- naming_convention
- redundant_at_key
- redundant_translations
- unused_at_key
options:
# 设置主要语言环境
main_locale: en
# 设置所有键应遵循的命名约定
# 可选值:snake 或 camel
naming_convention: snake
# 设置`sort`命令的排序方式
# 可选值:alphabetical, alphabetical-reverse, follow-main-file
sorting: alphabetical
如果找不到此YAML文件,则会使用默认选项集。建议将此文件提交到git,以便所有开发人员和CI操作使用相同的配置。
可用规则
以下是Rebellion支持的一些规则:
missing_plurals
: 检查plural
字符串是否包含当前语言环境所需的所有复数选项,且不包含未使用的字符串。missing_placeholders
: 检查@-keys不包含空占位符。all_caps
: 检查字符串是否不全为大写字母。string_type
: 检查所有字符串是否为String类型。at_key_type
: 检查@-key具有正确的类型。duplicated_keys
: 检查ARB文件不包含重复的键。empty_at_key
: 检查ARB文件不包含空的@-keys。locale_definition_presence
: 检查ARB文件具有语言环境定义键(@@locale
)。locale_definition_allowlist
: 检查语言环境在Flutter的intl
包支持的语言环境列表中。locale_definition_match
: 检查文件名中的语言环境和@@locale
值匹配。mandatory_at_key_description
: 检查所有@-keys具有提供的description
(默认关闭)。missing_translations
: 检查翻译文件具有所有键的字符串(与主本地化文件对比)。naming_convention
: 检查键名遵循命名约定(camelCase或snake_case)。redundant_at_key
: 检查只有主本地化文件包含@-keys。redundant_translations
: 检查翻译文件不包含主本地化文件中不存在的键。unused_at_key
: 检查所有@-keys具有对应的键。
忽略个别键的规则
可以忽略个别键的规则。使用@@x-ignore
在@-key主体内列出忽略的规则列表。例如,以下示例中,所有大写规则被忽略,因为该字符串短且故意使用大写字母:
{
"indicatorLost": "X",
"@indicatorLost": {
"description": "Indicates a failed attempt",
"@@x-ignore": "all_caps"
}
}
忽略多个规则可以通过列出所有忽略的规则实现:
"@@x-ignore": ["all_caps", "naming_convention"]
更新复数规则
Rebellion使用Unicode的复数规则来检查某个复数选项是否应在翻译文件中存在。要获取更新后的规则,请运行以下脚本:
dart packages/plural_rules_generator/bin/plural_rules_generator.dart ./lib/src/generated/plural_rules.dart
更多关于Flutter的ARB翻译文件的代码检查工具(linter)插件的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter的ARB翻译文件的代码检查工具(linter)插件的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在探讨Flutter中未知功能插件(假设名为“rebellion”)的潜在使用时,由于我无法实际访问或了解一个不存在的插件的具体功能,我将基于一般性的Flutter插件开发和使用原则来提供一个示例代码框架,展示如何集成和使用一个假设的Flutter插件。请注意,这里的代码仅用于说明目的,并不代表“rebellion”插件的实际功能。
假设的Rebellion插件功能
假设“rebellion”插件提供了某种高级UI组件或系统级功能,比如一个自定义的下拉刷新组件,该组件具有独特的动画效果和加载状态管理。
步骤 1: 添加插件依赖
首先,在pubspec.yaml
文件中添加对“rebellion”插件的依赖(请注意,这里的依赖是假设的,实际使用时需替换为真实插件名和版本)。
dependencies:
flutter:
sdk: flutter
rebellion: ^0.0.1 # 假设的版本号
步骤 2: 导入插件
在需要使用“rebellion”插件的Dart文件中导入它。
import 'package:rebellion/rebellion.dart';
步骤 3: 使用插件功能
假设“rebellion”插件提供了一个名为RebelDropdown
的自定义下拉刷新组件,下面是如何在Flutter应用中使用这个组件的示例代码。
import 'package:flutter/material.dart';
import 'package:rebellion/rebellion.dart'; // 导入插件
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Rebellion Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('Rebellion Plugin Demo'),
),
body: Center(
child: RebellionDemo(),
),
),
);
}
}
class RebellionDemo extends StatefulWidget {
@override
_RebellionDemoState createState() => _RebellionDemoState();
}
class _RebellionDemoState extends State<RebellionDemo> {
bool isLoading = false;
@override
Widget build(BuildContext context) {
return RebelDropdown(
// 假设的RebelDropdown组件参数
onRefresh: () async {
setState(() {
isLoading = true;
});
// 模拟网络请求或其他耗时操作
await Future.delayed(Duration(seconds: 2));
setState(() {
isLoading = false;
});
},
loadingIndicator: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(Colors.blue),
),
child: ListView.builder(
itemCount: 20,
itemBuilder: (context, index) {
return ListTile(
title: Text('Item $index'),
);
},
),
);
}
}
注意
- 依赖管理:确保
pubspec.yaml
文件中的依赖项正确无误,并运行flutter pub get
来安装依赖。 - 插件文档:实际使用时,应参考插件的官方文档来了解其API和可用功能。
- 错误处理:在实际应用中,应添加适当的错误处理逻辑来处理可能的异常情况。
由于“rebellion”插件是假设的,上述代码仅用于演示如何在Flutter项目中集成和使用一个假设的第三方插件。在实际开发中,你需要根据具体插件的文档和功能来调整代码。