Flutter国际化合并插件merge_l10n的使用

Flutter国际化合并插件merge_l10n的使用

Merge l10n files together

这是一个命令行工具,用于将多个.arb文件合并为一个文件。

目前,该工具会在lib/目录下搜索.arb文件,并将合并后的结果放置在l10n/目录下。

运行以下命令:

dart run merge_l10n

执行后,会生成一个包含合并内容的文件,输出如下:

Building package executable... 
Built merge_l10n:merge_l10n.
intl_es: Successfully merged 4 keys from 2 files
intl_en: Successfully merged 4 keys from 2 files

Collisions

如果同一语言文件中存在键名重复的情况,工具会输出问题键及其重复出现的位置。

例如:

Invalid argument(s): Key collision occured
intl_es: `cart__title` was duplicated in:
        File: 'lib/features/products/presentation/l10n/intl_es.arb'
        File: 'lib/features/cart/presentation/l10n/intl_es.arb'

intl_es: `products__title` was duplicated in:
        File: 'lib/features/products/presentation/l10n/intl_es.arb'
        File: 'lib/features/cart/presentation/l10n/intl_es.arb'

intl_en: Successfully merged 4 keys from 2 files

TODO

  • 自动作用域定义:定义模块范围并生成带有模块范围前缀的键。
  • 使用AST树打印更详细的错误信息

完整示例Demo

1. 项目结构

首先,确保你的项目结构如下:

project/
├── lib/
│   ├── features/
│   │   ├── products/
│   │   │   └── presentation/
│   │   │       └── l10n/
│   │   │           └── intl_es.arb
│   │   │           └── intl_en.arb
│   │   ├── cart/
│   │   │   └── presentation/
│   │   │       └── l10n/
│   │   │           └── intl_es.arb
│   │   │           └── intl_en.arb
├── l10n/
└── pubspec.yaml

2. .arb文件内容

lib/features/products/presentation/l10n/intl_es.arb
{
    "@@locale": "es",
    "cart__title": "Carrito de compras",
    "products__title": "Productos"
}
lib/features/products/presentation/l10n/intl_en.arb
{
    "@@locale": "en",
    "cart__title": "Shopping Cart",
    "products__title": "Products"
}
lib/features/cart/presentation/l10n/intl_es.arb
{
    "@@locale": "es",
    "cart__title": "Carrito",
    "products__title": "Artículos"
}
lib/features/cart/presentation/l10n/intl_en.arb
{
    "@@locale": "en",
    "cart__title": "Cart",
    "products__title": "Items"
}

3. 运行合并命令

在终端中运行以下命令:

dart run merge_l10n

执行后,生成的文件位于l10n/目录下:

l10n/intl_es.arb
{
    "@@locale": "es",
    "cart__title": "Carrito de compras",
    "products__title": "Productos",
    "cart__title": "Carrito",
    "products__title": "Artículos"
}
l10n/intl_en.arb
{
    "@@locale": "en",
    "cart__title": "Shopping Cart",
    "products__title": "Products",
    "cart__title": "Cart",
    "products__title": "Items"
}

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

1 回复

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


merge_l10n 是一个用于合并 Flutter 国际化(i18n)文件的插件。它可以帮助开发者将多个 .arb 文件合并为一个,以便在 Flutter 应用中使用。以下是如何使用 merge_l10n 插件的步骤:

1. 安装 merge_l10n 插件

首先,你需要在 pubspec.yaml 文件中添加 merge_l10n 插件的依赖:

dev_dependencies:
  merge_l10n: ^0.1.0

然后运行 flutter pub get 来安装插件。

2. 准备 .arb 文件

假设你有多个 .arb 文件,分别位于不同的目录中。例如:

lib/l10n/
  ├── en.arb
  ├── es.arb
  └── fr.arb
lib/l10n_extra/
  ├── en.arb
  ├── es.arb
  └── fr.arb

3. 配置 merge_l10n

pubspec.yaml 文件中,配置 merge_l10n 插件来指定输入和输出目录:

merge_l10n:
  inputs:
    - lib/l10n/
    - lib/l10n_extra/
  output: lib/l10n_merged/

4. 运行 merge_l10n

在终端中运行以下命令来合并 .arb 文件:

flutter pub run merge_l10n

这将会将 lib/l10n/lib/l10n_extra/ 目录下的 .arb 文件合并,并输出到 lib/l10n_merged/ 目录中。

5. 使用合并后的 .arb 文件

pubspec.yaml 文件中,将 flutter_localizationsarb-dir 指向合并后的目录:

flutter:
  generate: true
  l10n:
    arb-dir: lib/l10n_merged/

6. 生成国际化代码

运行以下命令来生成国际化代码:

flutter gen-l10n

这将会根据合并后的 .arb 文件生成相应的 Dart 代码。

7. 在应用中使用国际化

在你的 Flutter 应用中使用生成的国际化代码:

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

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

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(AppLocalizations.of(context)!.helloWorld),
      ),
      body: Center(
        child: Text(AppLocalizations.of(context)!.welcome),
      ),
    );
  }
}
回到顶部