Flutter国际化代码生成插件translations_code_gen的使用

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

Flutter国际化代码生成插件translations_code_gen的使用

Translations Code Generator

这是一款用于为Dart/Flutter项目生成国际化代码的简单工具。

快速开始Pub.dev

安装

1. 添加依赖

pubspec.yaml 文件中添加依赖:

dependencies:
  translations_code_gen: ^1.2.1

2. 运行此命令

flutter pub get

使用

1. 在 assets 文件夹中创建翻译文件

在项目的根目录下创建一个名为 assets 的文件夹,并在其中创建名为 en.jsonar.json 的文件,并添加以下内容:

例子:assets/translations/en.json

{
  "GENERAL": {
    "HELLO": "Hello",
    "WELCOME": "Welcome"
  },
  "HOME": {
    "TITLE": "Home"
  }
}

例子:assets/translations/ar.json

{
  "GENERAL": {
    "HELLO": "مرحبا",
    "WELCOME": "أهلا بك"
  },
  "HOME": {
    "TITLE": "الرئيسية"
  }
}

2. 将翻译文件路径添加到 pubspec.yamltranslations_code_gen.yaml 文件中

pubspec.yaml 文件中添加以下内容:

translations_code_gen:
  keys:
    input: 'assets/translations/en.json'
    output: 'lib/translations/keys.dart'
  values:
    input: 'assets/translations/'
    output: 'lib/translations/values/'

运行以下命令以生成翻译的 keysvalues

flutter pub run translations_code_gen

-g--generate 标志是可选的。如果不使用它,工具将自动生成 Dart 键和值代码。

这将在 lib/translations/keys.dart 文件中生成以下键:

// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: constant_identifier_names, camel_case_types

class GENERAL {
  static const String HELLO = "GENERAL.HELLO";
  static const String WELCOME = "GENERAL.WELCOME";
}

class HOME {
  static const String TITLE = "HOME.TITLE";
}

并将在 lib/translations/values/ 文件夹下的 en.dartar.dart 文件中生成以下值:

例子:lib/translations/values/en.dart

// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: constant_identifier_names

import '../keys.dart'; // 有时你需要更改此路径以匹配你的项目结构

const Map<String, String> _general  = {
  GENERAL.HELLO: "Hello",
  GENERAL.WELCOME: "Welcome",
};

const Map<String, String> _home  = {
  HOME.TITLE: "Home",
};

final Map<String, String> enValues = {
  ..._general,
  ..._home,
};

例子:lib/translations/values/ar.dart

// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: constant_identifier_names

import '../keys.dart'; // 有时你需要更改此路径以匹配你的项目结构

const Map<String, String> _general  = {
  GENERAL.HELLO: "مرحبا",
  GENERAL.WELCOME: "أهلا بك",
};

const Map<String, String> _home  = {
  HOME.TITLE: "الرئيسية",
};

final Map<String, String> enValues = {
  ..._general,
  ..._home,
};

你可能需要更改键的导入路径以匹配你的项目结构。

3. 使用生成的代码

import 'package:flutter/material.dart';

import './translations/keys.dart';

// 任何翻译包

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(HOME.TITLE.tr()),
      ),
      body: Center(
        child: Text(GENERAL.HELLO.tr()),
      ),
    );
  }
}

4. 同上,但使用 --generate 标志

flutter pub run translations_code_gen --generate=json-values

有四种类型的代码生成模式:

  • dart(默认):生成 Dart 键和值代码。
  • dart-keys:仅生成 Dart 键。
  • dart-values:仅生成 Dart 值。
  • json-values:仅生成 JSON 值。

使用 --generate=json-values 标志的输出

例子:lib/translations/values/en.json

{
  "GENERAL.HELLO": "Hello",
  "GENERAL.WELCOME": "Welcome",
  "HOME.TITLE": "Home"
}

例子:lib/translations/values/ar.json

{
  "GENERAL.HELLO": "مرحبا",
  "GENERAL.WELCOME": "أهلا بك",
  "HOME.TITLE": "الرئيسية"
}

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

1 回复

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


当然,下面是一个关于如何使用Flutter国际化代码生成插件translations_code_gen的示例。这个插件可以帮助你自动生成用于Flutter应用的本地化代码。

步骤 1: 添加依赖

首先,你需要在你的pubspec.yaml文件中添加translations_code_gen依赖。

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

dev_dependencies:
  build_runner: ^2.1.4
  translations_code_gen: ^0.1.0  # 请注意版本号,使用最新的稳定版本

步骤 2: 创建国际化文件

在你的项目根目录下创建一个intl文件夹,并在其中创建一个JSON文件,例如messages_en.jsonmessages_zh.json,分别用于英文和中文的翻译。

messages_en.json:

{
  "greeting": "Hello, World!",
  "farewell": "Goodbye!"
}

messages_zh.json:

{
  "greeting": "你好,世界!",
  "farewell": "再见!"
}

步骤 3: 配置build.yaml

在项目根目录下创建一个build.yaml文件,并配置translations_code_gen生成代码的相关信息。

targets:
  $default:
    builders:
      translations_code_gen:translations:
        enabled: true
        options:
          output_class: S
          input_dir: intl
          output_dir: lib/l10n

步骤 4: 生成代码

在终端中运行以下命令来生成国际化代码:

flutter pub run build_runner build

这个命令会根据你配置在build.yaml中的路径和选项生成国际化代码。

步骤 5: 使用生成的代码

生成代码后,你会在lib/l10n目录下看到生成的类文件,例如S.dart。你可以在你的Flutter应用中使用这个类来访问本地化字符串。

首先,确保你在应用的MaterialApp中设置了本地化代理:

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'l10n/S.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,
      ],
      supportedLocales: S.delegate.supportedLocales, // 添加支持的本地化
      home: MyHomePage(),
    );
  }
}

然后,在你的Widget中使用生成的本地化字符串:

import 'package:flutter/material.dart';
import 'l10n/S.dart'; // 导入生成的本地化类

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final S local = S.of(context); // 获取本地化实例

    return Scaffold(
      appBar: AppBar(
        title: Text(local.greeting), // 使用本地化字符串
      ),
      body: Center(
        child: Text(local.farewell), // 使用本地化字符串
      ),
    );
  }
}

这样,你就可以使用translations_code_gen插件来生成和管理Flutter应用的本地化代码了。根据用户的设备语言设置,应用会自动显示相应的本地化字符串。

回到顶部