Flutter国际化字符串提取插件translation_string_extractor的使用

Flutter国际化字符串提取插件translation_string_extractor的使用

Translation String Extractor

从带有 .tr.tr() 的字符串中提取用于翻译的文本,并将其写入 JSON 文件或返回一个 Map。

该工具会忽略以 .g.dart 结尾的文件名。

输入:

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

class TestClass extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(children: [
      Text('Hello'.tr),
      Text("""World""".tr),
    ]);
  }
}

输出:

{
  "Hello": "Hello",
  "World": "World"
}

安装

pubspec.yaml 中添加依赖:

dev_dependencies:
  translation_string_extractor: <latest>

或者全局安装:

dart pub global activate translation_string_extractor

使用

作为开发依赖项使用:

dart run translation_string_extractor:extract -d=lib -o=locale.json

全局使用:

translation_string_extractor -d=lib -o=locale.json

公共签名:

TranlationStringExtractor ...

static void extractStrings(String directory, String outputFile);

static Map<String, String> read(String directory) {
  SplayTreeMap<String, String> map = SplayTreeMap<String, String>();

static void write(Map<String, String> map, String outputFile);

问题

如有任何问题,请访问 GitHub Issues

许可证

此包根据 MIT 许可证授权。


示例Demo

以下是一个完整的示例,演示如何使用 translation_string_extractor 插件提取并保存国际化字符串到 JSON 文件中。

步骤 1: 创建项目

首先创建一个新的 Flutter 项目,并添加 translation_string_extractorpubspec.yaml 文件中。

dev_dependencies:
  flutter_test:
    sdk: flutter
  translation_string_extractor: <latest>

运行 flutter pub get 来获取新的依赖项。

步骤 2: 编写示例代码

lib/main.dart 文件中编写以下代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('国际化示例')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Hello'.tr),
              Text('''World'''.tr),
            ],
          ),
        ),
      ),
    );
  }
}

extension Translate on String {
  String get tr => this;
}

步骤 3: 提取字符串

在项目根目录下运行以下命令来提取并保存国际化字符串到 JSON 文件中:

dart run translation_string_extractor:extract -d=lib -o=locale.json

执行上述命令后,会在当前目录生成一个名为 locale.json 的文件,其内容如下:

{
  "Hello": "Hello",
  "World": "World"
}

更多关于Flutter国际化字符串提取插件translation_string_extractor的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


translation_string_extractor 是一个用于 Flutter 项目的插件,可以帮助你从代码中提取需要国际化的字符串,并将其导出为 JSON 或其他格式,以便进行翻译。这个插件可以大大简化国际化流程,尤其是在项目中需要管理大量字符串时。

安装 translation_string_extractor

首先,你需要在 Flutter 项目中安装 translation_string_extractor。你可以在 pubspec.yaml 文件中添加依赖:

dev_dependencies:
  translation_string_extractor: ^1.0.0

然后运行 flutter pub get 来安装依赖。

使用 translation_string_extractor

1. 在代码中标记需要国际化的字符串

在 Flutter 项目中,你可以使用 Intl.messageAppLocalizations 来标记需要国际化的字符串。例如:

import 'package:intl/intl.dart';

String get helloWorld => Intl.message(
  'Hello, World!',
  name: 'helloWorld',
  desc: 'A simple greeting',
);

2. 运行 translation_string_extractor

在终端中运行以下命令来提取需要国际化的字符串:

flutter pub run translation_string_extractor:extract

这个命令会扫描你的项目代码,找出所有标记为需要国际化的字符串,并将它们导出为一个 JSON 文件或其他格式的文件。

3. 导出文件

默认情况下,translation_string_extractor 会将提取的字符串导出为 messages.json 文件。你可以通过命令行参数来指定输出文件的路径和格式。例如:

flutter pub run translation_string_extractor:extract --output=lib/l10n/messages.json

4. 翻译字符串

将生成的 messages.json 文件交给翻译团队或使用翻译工具进行翻译。你可以为每种语言创建一个对应的 JSON 文件,例如 messages_fr.json 表示法语翻译。

5. 在 Flutter 项目中使用翻译后的字符串

在 Flutter 项目中,你可以使用 flutter_localizationsintl 包来加载和使用翻译后的字符串。例如:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await findSystemLocale();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        const Locale('en', 'US'),
        const Locale('fr', 'FR'),
      ],
      home: MyHomePage(),
    );
  }
}

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