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文件(可用值:consolefile)。

diff命令使用主应用程序的语言环境来比较ARB文件。默认语言环境是en,但您可以使用--main-locale选项更改它。

排序ARB文件

按字母顺序、反向字母顺序或跟随主ARB文件的顺序对ARB文件进行排序:

rebellion sort ./lib/l10n/

使用--sorting选项更改排序方式:alphabetical(默认)、alphabetical-reversefollow-main-file

配置

您可以通过创建一个名为rebellion_options.yaml的文件来禁用某些规则,设置sortdiff选项。在您的应用程序根目录下创建该文件,并启用某些规则和选项:

# 列出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

1 回复

更多关于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'),
          );
        },
      ),
    );
  }
}

注意

  1. 依赖管理:确保pubspec.yaml文件中的依赖项正确无误,并运行flutter pub get来安装依赖。
  2. 插件文档:实际使用时,应参考插件的官方文档来了解其API和可用功能。
  3. 错误处理:在实际应用中,应添加适当的错误处理逻辑来处理可能的异常情况。

由于“rebellion”插件是假设的,上述代码仅用于演示如何在Flutter项目中集成和使用一个假设的第三方插件。在实际开发中,你需要根据具体插件的文档和功能来调整代码。

回到顶部