Flutter国际化插件l10nization_cli的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter国际化插件l10nization_cli的使用

L10nization_cli简介

L10nization_cli 是一个命令行工具,用于从ARB文件中查找未使用的国际化翻译。它可以帮助开发者清理不再使用的翻译条目,保持项目的整洁和高效。

开始使用 🚀

如果L10nization_cli已经在 [pub.dev] 上发布,可以通过以下命令全局激活:

dart pub global activate l10nization_cli

使用方法

查找未使用的翻译

使用 check-unused 命令来查找未使用的翻译条目:

# 查找当前项目中的未使用翻译
l10nization check-unused <项目文件夹路径>
考虑的情况

L10nization_cli 会检查以下几种常见的国际化调用方式:

  1. 通过 context.l10n 调用:

    return Text(context.l10n.hello);
    
  2. 通过 AppLocalizations.of(context) 调用:

    final l10n = AppLocalizations.of(context);
    return Text(l10n.a);
    
  3. 通过扩展方法调用:

    final l10n = context.l10n;
    return Text(l10n.a);
    
  4. 直接在组件中传递 AppLocalizations 实例:

    class MyWidget extends StatelessWidget {
      const MyWidget({
        required this.l10n,
        super.key,
      });
    
      final AppLocalizations l10n;
    
      @override
      Widget build(BuildContext context) {
        return Text(l10n.helloMoon);
      }
    }
    
  5. 继承自父类并传递 AppLocalizations 实例:

    abstract class MySuperWidget extends StatelessWidget {
      const MySuperWidget({
        required this.l10n,
        super.key,
      });
    
      final AppLocalizations l10n;
    }
    
    class MyWidget extends MySuperWidget {
      const MyWidget({
        required super.l10n,
        super.key,
      });
    
      @override
      Widget build(BuildContext context) {
        return Text(l10n.helloMoon);
      }
    }
    
  6. 通过扩展方法动态获取翻译:

    extension AppLocalizationsExtension on AppLocalizations {
      String byKey(final String value) {
        switch (value) {
          case 'helloMars':
            return helloMars;
          default:
            throw Exception();
        }
      }
    }
    
  7. 作为函数参数传递:

    String function(AppLocalizations l10n) {
      return l10n.helloMoon;
    }
    
  8. 使用箭头函数简化调用:

    String function(AppLocalizations l10n) => l10n.helloMoon;
    
  9. 带参数的翻译调用:

    final l10n = context.l10n;
    return Text(l10n.a(b));
    
  10. 直接在上下文中调用带参数的翻译:

    return Text(context.l10n.a(b));
    

本地运行

如果你想在本地运行L10nization_cli,可以使用以下命令:

dart pub global activate --source=path . && l10nization check-unused example

运行测试并生成覆盖率报告 🧪

要运行所有单元测试并生成覆盖率报告,可以使用以下命令:

# 安装coverage工具
dart pub global activate coverage

# 运行测试并生成覆盖率数据
dart test --coverage=coverage

# 格式化覆盖率报告
dart pub global run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info

# 生成HTML格式的覆盖率报告
genhtml coverage/lcov.info -o coverage/

# 打开覆盖率报告
open coverage/index.html

构建版本

要构建项目并生成版本信息,可以使用以下命令:

dart run build_runner build -d

示例项目

以下是一个完整的示例项目,展示了如何使用L10nization_cli进行国际化管理。

1. 初始化项目

首先,创建一个新的Flutter项目:

flutter create my_app
cd my_app
2. 添加依赖

pubspec.yaml 文件中添加 l10nization_cliflutter_localizations 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter

dev_dependencies:
  l10nization_cli: ^latest_version
3. 配置国际化

lib 目录下创建 l10n 文件夹,并在其中创建 app_en.arb 文件,内容如下:

{
  "hello": "Hello",
  "helloMoon": "Hello Moon",
  "helloMars": "Hello Mars"
}

然后在 lib 目录下创建 l10n.dart 文件,内容如下:

import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: AppLocalizations.localizationsDelegates,
      supportedLocales: AppLocalizations.supportedLocales,
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(context.l10n.hello),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(context.l10n.helloMoon),
            Text(context.l10n.helloMars),
          ],
        ),
      ),
    );
  }
}
4. 检查未使用的翻译

运行以下命令来查找未使用的翻译:

l10nization check-unused lib

更多关于Flutter国际化插件l10nization_cli的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter国际化插件l10nization_cli的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter国际化插件flutter_localizations以及intl_translation工具的代码案例,以及如何使用l10n命令行工具(flutter pub pub run flutter_gen:generate)来生成本地化的资源文件。

1. 设置项目依赖

首先,确保你的pubspec.yaml文件中包含必要的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter

dev_dependencies:
  build_runner: ^2.0.0
  intl_translation: ^0.17.10+1  # 确保版本与Flutter兼容

2. 创建国际化资源文件

在你的Flutter项目根目录下,创建一个lib/l10n文件夹,并在其中创建一个名为messages_all.dart的文件。这个文件将作为所有语言文件的入口。

lib/l10n/messages_all.dart

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';

// 这是一个自动生成的文件,不要手动编辑
// 这个文件包含所有支持的语言的翻译入口
class S {
  S();

  static S? of(BuildContext context) {
    return Localizations.of<S>(context, S);
  }

  // 示例翻译字符串
  String get helloWorld {
    return Intl.message(
      'Hello, World!',
      name: 'helloWorld',
      desc: 'Greeting message',
    );
  }
}

class SDelegate extends LocalizationsDelegate<S> {
  const SDelegate();

  @override
  bool isSupported(Locale locale) {
    // 检查是否支持该语言
    return ['en', 'zh'].contains(locale.languageCode);
  }

  @override
  Future<S> load(Locale locale) {
    // 根据语言加载对应的翻译文件
    return SynchronousFuture<S>(S());
  }

  @override
  bool shouldReload(SDelegate oldDelegate) {
    return false;
  }
}

3. 创建ARB文件

lib/l10n文件夹中,为每个支持的语言创建一个ARB(Application Resource Bundle)文件。例如,为英语和中文创建以下文件:

lib/l10n/messages_en.arb

{
  "@@locale": "en",
  "helloWorld": "Hello, World!"
}

lib/l10n/messages_zh.arb

{
  "@@locale": "zh",
  "helloWorld": "你好,世界!"
}

4. 生成本地化文件

使用intl_translation工具生成Dart代码。运行以下命令:

flutter pub get
flutter pub run intl_translation:extract_to_arb --output-dir=lib/l10n lib/l10n/messages_all.dart

这会读取messages_all.dart中的Intl.message调用,并生成ARB模板文件(如果它们尚不存在)。然后你需要手动填充这些ARB模板文件,如上所示。

接下来,使用flutter_gen生成最终的本地化Dart文件:

flutter pub pub run flutter_gen:generate

注意:实际项目中可能使用flutter_gen或其他生成器插件,这里假设使用flutter_gen作为示例。如果使用的是其他生成器,请按照其文档操作。

5. 使用本地化资源

在你的应用程序的MaterialApp中设置localizationsDelegatessupportedLocales

import 'package:flutter/material.dart';
import 'l10n/messages_all.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      localizationsDelegates: [
        S.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('en', ''), // 英语
        Locale('zh', ''), // 中文
      ],
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final S s = S.of(context)!;
    return Scaffold(
      appBar: AppBar(
        title: Text(s.helloWorld),
      ),
      body: Center(
        child: Text(s.helloWorld),
      ),
    );
  }
}

现在,当你更改设备的语言设置时,应用将显示相应的本地化文本。

回到顶部