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

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

概述

本库包的目的是让你的应用程序能够轻松地显示任何数量的支持翻译文本。这些翻译存储在一个易于阅读和更新的格式中,供开发人员和非开发人员访问。

示例应用

有一个示例应用可以在GitHub上查看,以了解如何在你的Flutter应用中实现和使用这个库包:Shrine MVC

安装

我并不总是喜欢在Installing页面中建议的版本号。 相反,当安装我的库包时,总是使用语义版本号中的重大值。这意味着总是输入一个带有两个尾随零的版本号,重大.0.0。这允许你接收任何次要版本(引入新功能)或在这个案例中,任何补丁版本(涉及错误修复)。语义版本号总是以重大.次要.补丁的格式出现。

  • 补丁 - 我已经进行了错误修复
  • 次要 - 我已经引入了新功能
  • 重大 - 我基本上创建了一个新的应用程序。它打破了向后兼容性并具有全新的用户体验。你不会得到这个版本,直到你在pubspec.yaml文件中增加重大的数字。

因此,在这种情况下,将以下内容添加到你的包的pubspec.yaml文件中:

dependencies:
  i10n_translator:^2.0.0

CSV 文件

一个文本文件用于包含由逗号分隔的翻译。它通常被称为CSV文件,并且很容易被许多编辑器包括MS Excel识别。这使得例如非开发人员可以轻松地为你的Flutter应用输入文本翻译。下面是名为i10n.csv的CSV文件在名为Notepad的简单Windows文本编辑器中显示的截图。

i10ncsv

如你所见,此文本文件很容易被Microsoft Excel读取,以一种易于阅读的表格形式呈现文本及其翻译。你可以看到有英语列、法语列和西班牙语列。你可以自由插入空行,但每一列都必须填写,否则它将不会包含在你的Flutter应用中。另外注意,文本是区分大小写的。

i10nExcel

以下是生成自CSV文件的结果代码的截图。请注意,你确实可以选择不生成代码,而是让Flutter应用直接在启动时读取此CSV文件。因此提供那些翻译!我将在稍后解释该选项。现在,让我们看看如何使用此生成的代码。

i10nTrans

在上面的截图中,你现在可以看到一个名为i10nWords的Map对象,它包含了当前可用给你的Flutter应用的所有翻译。下面的示例应用,例如,通过import语句获取该对象,然后将该对象传递给库包的init()函数。

i10nWords

示例应用

实际上,当你运行示例应用时,Shrine MVC,你有手动“切换”默认文本和两种翻译(法语和西班牙语)的能力。有一个菜单选项允许你这样做。下面的截图展示了从英语到法语的变化。注意照片标签名称会相应更改。

i10nShrineMVC

以下是示例应用中显示这些项目及其相应标签的代码截图。你可以看到默认字符串在此处是英语。但是,当你查看产品对象列表时,name命名参数不是直接提供字符串值,而是提供来自库包i10n_translator的静态函数s()。这反过来又接收字符串。正是在那里执行翻译并返回给name命名参数。

i10nSFuncs ShrinApp

保持简单

再次强调,想法是提供翻译到一个简单的文本文件中,其列由逗号分隔。默认语言被认为是第一列。你会将这些文本字符串提供给应用本身到静态函数s()t()。然而,它们作为读取此CSV文件时的“键”字段。同样作为键字段,第一列是区分大小写的。

i10nTabular

一旦翻译准备就绪,你现在可以选择生成代码来提供这些翻译到你的Flutter应用。请注意,在你这样做的之前,你确实需要在你的pubspec.yaml文件中引用库包。

i10npubspecyaml

运行命令

因此,现在使用你的IDE编辑器终端窗口,你可以引用库包中的特定类来生成结果的dart文件:

flutter pub run i10n_translator test.csv path/destination/dart file

只需引用类而不带任何参数,那么该类将假定以下输入文件和结果dart文件:

flutter pub run i10n_translator [i10n.csv] [i10nwords.dart]

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用i10n_translator插件来实现国际化翻译的示例代码。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  i10n_translator: ^x.y.z  # 请替换为最新版本号

然后在项目根目录下运行flutter pub get来安装依赖。

2. 创建翻译文件

假设你希望支持英语(en)和中文(zh)两种语言,你需要在assets目录下创建翻译文件,如strings_en.jsonstrings_zh.json

assets/strings_en.json

{
  "welcome": "Welcome",
  "goodbye": "Goodbye"
}

assets/strings_zh.json

{
  "welcome": "欢迎",
  "goodbye": "再见"
}

3. 配置pubspec.yaml中的assets

pubspec.yaml文件中添加你的翻译文件到assets:

flutter:
  assets:
    - assets/strings_en.json
    - assets/strings_zh.json

4. 初始化i10n_translator

在你的主文件(如main.dart)中,初始化并使用i10n_translator插件。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
      localizationsDelegates: [
        // 添加 i10nTranslatorDelegate
        I10nTranslatorDelegate(
          // 设置默认语言
          fallbackLocale: Locale('en', ''),
          // 指定翻译文件路径
          jsonAssetBasePath: 'assets/strings_',
        ),
        // 添加全局的 MaterialLocalizations
        GlobalMaterialLocalizations.delegate,
        // 添加全局的 WidgetsLocalizations
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('en', ''),
        Locale('zh', ''),
      ],
      localeResolutionCallback: (Locale locale, Iterable<Locale> supportedLocales) {
        // 根据用户设备语言选择合适的 locale
        for (Locale supportedLocale in supportedLocales) {
          if (supportedLocale.languageCode == locale.languageCode ||
              supportedLocale.countryCode == locale.countryCode) {
            return supportedLocale;
          }
        }
        // 默认返回英语
        return Locale('en', '');
      },
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  I10nTranslator _i10n;

  @override
  Widget build(BuildContext context) {
    _i10n = I10nTranslator.of(context);
    return Scaffold(
      appBar: AppBar(
        title: Text(_i10n.translate('welcome')),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              _i10n.translate('welcome'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // 切换语言示例
                setState(() {
                  Locale myLocale = Localizations.localeOf(context);
                  if (myLocale.languageCode == 'en') {
                    Localizations.overrideLocaleOf(context, Locale('zh'));
                  } else {
                    Localizations.overrideLocaleOf(context, Locale('en'));
                  }
                });
              },
              child: Text(_i10n.translate('goodbye')),
            ),
          ],
        ),
      ),
    );
  }
}

5. 运行项目

确保所有配置正确后,运行你的Flutter项目。你应该能够看到根据设备语言或手动切换语言后的文本变化。

注意事项

  • 确保翻译文件的命名和路径与I10nTranslatorDelegate中的配置一致。
  • localeResolutionCallback函数用于决定应用启动时使用的语言,可以根据实际需求进行调整。
  • 切换语言时,通过调用Localizations.overrideLocaleOf来动态改变当前上下文的语言环境。

这样,你就成功地在Flutter项目中使用了i10n_translator插件来实现国际化翻译。

回到顶部