Flutter国际化翻译插件l10n_translator的使用

Flutter国际化翻译插件l10n_translator的使用

概述

通过此库包,您的应用程序可以轻松地以多种支持的语言显示其文本。这些翻译存储在易于读取的Map变量中,供开发人员和非开发人员访问。

示例应用

您可以使用此库包附带的示例应用来实现和使用到您的Flutter应用中:

安装

安装此库时,建议使用最新的次要版本或补丁版本,而不是指定的版本号。在pubspec.yaml文件中添加以下依赖项:

dependencies:
  l10n_translator:^1.0.0

文档

查看有关此库的详细文档,可点击下图跳转至Medium文章:

其他Dart包

作者的其他Dart包可以在以下网址找到:


示例代码

以下是使用l10n_translator插件的完整示例代码:

///
///
///
import 'package:example/src/view.dart'; // 导入视图文件

void main() => runApp(const MyApp(key: Key('MyApp'))); // 运行主应用

在这个示例中,我们导入了一个视图文件,并运行了主应用。为了更详细地展示如何使用l10n_translator插件进行国际化翻译,我们将创建一个简单的应用,并配置多语言支持。

创建多语言支持的应用

首先,我们需要定义不同语言的翻译文件。假设我们有英语(en) 和中文 (zh) 的翻译文件。

en.json

{
  "hello": "Hello",
  "welcome": "Welcome to our app!"
}

zh.json

{
  "hello": "你好",
  "welcome": "欢迎使用我们的应用!"
}

接下来,在lib目录下创建一个名为localizations.dart的文件来定义本地化类。

lib/localizations.dart

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

class AppLocalizations {
  final Locale locale;

  AppLocalizations(this.locale);

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

  static const LocalizationsDelegate<AppLocalizations> delegate = _AppLocalizationsDelegate();

  factory AppLocalizations.delegate(Locale locale) {
    return AppLocalizations(locale);
  }
}

class _AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {
  [@override](/user/override)
  bool isSupported(Locale locale) {
    return ['en', 'zh'].contains(locale.languageCode);
  }

  [@override](/user/override)
  Future<AppLocalizations> load(Locale locale) async {
    AppLocalizations localizations = AppLocalizations(locale);
    await initializeTranslations(locale); // 初始化翻译
    return localizations;
  }

  [@override](/user/override)
  bool shouldReload(covariant LocalizationsDelegate<AppLocalizations> old) => false;
}

然后在main.dart中配置多语言支持并使用翻译。

lib/main.dart

import 'package:flutter/material.dart';
import 'package:example/src/view.dart';
import './localizations.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      localizationsDelegates: [
        AppLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        const Locale('en', ''),
        const Locale('zh', ''),
      ],
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(AppLocalizations.of(context).translate('welcome')), // 使用翻译
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(AppLocalizations.of(context).translate('hello')), // 使用翻译
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: AppLocalizations.of(context).translate('increment'), // 使用翻译
        child: Icon(Icons.add),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用l10n_translator插件进行国际化翻译的代码案例。l10n_translator插件可以帮助你生成和管理Flutter应用的本地化文件。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加l10n_translator依赖:

dependencies:
  flutter:
    sdk: flutter
  l10n_translator: ^0.x.x  # 请替换为最新版本号

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

2. 配置pubspec.yaml

为了使用Flutter的内置国际化支持,你需要在pubspec.yaml文件中配置flutter_localizations依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  l10n_translator: ^0.x.x  # 请替换为最新版本号

3. 创建ARB文件

ARB(Application Resource Bundle)文件是Flutter国际化使用的标准文件格式。你可以手动创建这些文件,或者使用l10n_translator插件来生成。

例如,创建一个名为messages_en.arb的文件:

{
  "welcome_message": "Welcome to our app!"
}

4. 使用l10n_translator生成ARB文件

虽然手动创建ARB文件是可行的,但使用l10n_translator插件可以更方便地管理这些文件。假设你已经安装了l10n_translator,你可以在命令行中使用它来生成ARB模板文件。

flutter pub run l10n_translator:extract_to_arb --output-dir=lib/l10n --input-dir=lib --template-arb=lib/l10n/messages_en.arb

这个命令会从指定的输入目录中提取本地化字符串,并生成ARB模板文件。

5. 创建本地化类

接下来,你需要创建一个Flutter本地化类来加载ARB文件。Flutter提供了LocalizationsDelegateLocalizations类来帮助你实现这一点。

创建一个名为app_localizations.dart的文件:

import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; // 自动生成

class AppLocalizations {
  static Future<AppLocalizations> load(Locale locale) {
    final String name = locale.countryCode.isEmpty ? locale.languageCode : locale.toString();
    final String fileName = 'messages_$name.arb';

    return Localizations.load(
      locale,
      AppLocalizationsDelegate(),
    ) as Future<AppLocalizations>;
  }

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

  // 添加你的翻译方法
  String get welcomeMessage {
    return Intl.message(
      'Welcome to our app!',
      name: 'welcomeMessage',
      desc: 'Welcome screen message',
    );
  }
}

class AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {
  const AppLocalizationsDelegate();

  @override
  bool isSupported(Locale locale) {
    // 添加你支持的语言代码
    return ['en', 'zh'].contains(locale.languageCode);
  }

  @override
  Future<AppLocalizations> load(Locale locale) {
    // 返回AppLocalizations实例
    return AppLocalizations.load(locale);
  }

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

注意:上面的代码假设你已经有自动生成的app_localizations.dart文件。这个文件通常由Flutter的flutter pub run flutter_gen:generate命令生成(需要安装flutter_gen插件)。

6. 使用本地化

在你的Flutter应用中,你可以使用AppLocalizations.of(context)来获取本地化实例,并使用它的翻译方法。

import 'package:flutter/material.dart';
import 'app_localizations.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: [
        AppLocalizationsDelegate(),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('en', ''),
        Locale('zh', ''),
      ],
      home: MyHomePage(),
    );
  }
}

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

这样,你就完成了在Flutter项目中使用l10n_translator插件进行国际化翻译的设置。请根据你的实际需求调整ARB文件和本地化类中的翻译内容。

回到顶部