Flutter国际化插件ezi18n的使用

Flutter国际化插件ezi18n的使用

EzI18n 是一个轻量级的国际化(i18n)库,专为 Flutter 设计。它简化了翻译管理,并支持动态参数替换,使得多语言应用开发变得轻松愉快。🚀

特性 🛠️

  • 🌍 支持通用语言(如 pt)和特定语言(如 pt_BR)。
  • 🔄 动态参数替换(如 @{name})。
  • 🛡️ 缺失翻译的回退机制。
  • 📦 与 Flutter 的本地化框架无缝集成。

入门指南 🏁

安装 📥

pubspec.yaml 文件中添加 EzI18n:

dependencies:
  ezi18n: ^1.0.0

然后运行以下命令获取依赖项:

flutter pub get

注意事项 📝

对于原生 Widget 的翻译,你需要使用 flutter_localizations 包来加载委托,如示例代码所示。

使用 🚀

1. 定义翻译 🗂️

创建一个实现 EzMessages 接口的类来定义翻译内容。

import 'package:ezi18n/ezi18n.dart';

class AppMessages implements EzMessages {
  [@override](/user/override)
  Map<String, Map<String, String>> get keys => {
        'en': {'greeting': 'Hello, @{name}!', 'farewell': 'Goodbye, @{name}!'},
        'pt': {'greeting': 'Olá, @{name}!', 'farewell': 'Adeus, @{name}!'},
        'pt_BR': {'greeting': 'Olá, @{name}!', 'farewell': 'Tchau, @{name}!'},
      };
}

2. 在应用中设置本地化 ⚙️

配置 MaterialApp,并添加 EzI18nDelegate 以启用多语言支持。

import 'package:ezi18n/ezi18n.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      locale: Locale('en'), // 设置默认语言
      localizationsDelegates: [
        EzI18nDelegate(AppMessages()), // 添加 EzI18n 的翻译委托
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: [Locale('en'), Locale('pt'), Locale('pt', 'BR')], // 支持的语言列表
      home: MyHomePage(),
    );
  }
}

3. 在页面中使用翻译 📝

通过调用 .tr() 方法来使用翻译,并传递参数。

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

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('greeting'.tr(context, params: {'name': 'Alice'})), // 动态替换参数
      ),
      body: Center(
        child: Text('greeting'.tr(context, params: {'name': 'Bob'})),
      ),
    );
  }
}

示例代码

以下是完整的示例代码,展示了如何使用 EzI18n 实现多语言支持。

import 'package:example/messages.dart'; // 引入自定义的翻译文件
import 'package:ezi18n/ezi18n.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

import 'home_page.dart';

void main() {
  runApp(MyApp(
    messages: AppMessages(), // 自定义翻译类
    supportedLocales: [
      Locale('en'),
      Locale('pt'),
      Locale('pt', 'BR'),
    ],
    locale: Locale('pt', 'BR'), // 默认语言
  ));
}

class MyApp extends StatefulWidget {
  final Locale locale;
  final EzMessages messages;
  final List<Locale> supportedLocales;

  MyApp({
    required this.messages,
    required this.supportedLocales,
    required this.locale,
  });

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

class _MyAppState extends State<MyApp> {
  Locale _currentLocale;

  _MyAppState() : _currentLocale = Locale('en'); // 初始语言

  [@override](/user/override)
  void initState() {
    _currentLocale = widget.locale;
    super.initState();
  }

  void _changeLanguage(Locale locale) {
    setState(() {
      _currentLocale = locale;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      locale: _currentLocale,
      debugShowCheckedModeBanner: false,
      localizationsDelegates: [
        EzI18nDelegate(widget.messages), // 加载自定义翻译
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: widget.supportedLocales,
      home: MyHomePage(
        onChangeLanguage: _changeLanguage,
        supportedLocales: widget.supportedLocales,
        currentLocale: _currentLocale,
      ),
    );
  }
}

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

1 回复

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


ezi18n 是一个用于 Flutter 应用国际化的插件,它可以帮助开发者轻松管理多语言支持。使用 ezi18n,你可以将应用中的文本翻译成多种语言,并根据用户的语言偏好动态切换显示语言。

1. 安装 ezi18n 插件

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

dependencies:
  flutter:
    sdk: flutter
  ezi18n: ^1.0.0  # 请使用最新版本

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

2. 创建翻译文件

ezi18n 使用 .json 文件来存储翻译内容。你可以在项目中创建一个 i18n 文件夹,并在其中为每种语言创建一个 .json 文件。例如:

lib/
  i18n/
    en.json
    es.json
    fr.json

每个 .json 文件包含键值对,键是翻译的标识符,值是翻译后的文本。例如,en.json 文件可能如下所示:

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

es.json 文件可能如下所示:

{
  "hello": "Hola",
  "welcome": "Bienvenido a nuestra aplicación"
}

3. 初始化 ezi18n

在应用的入口文件(通常是 main.dart)中,初始化 ezi18n 并设置默认语言:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化 ezi18n
  await Ezi18n.init(
    defaultLang: 'en',  // 默认语言
    supportedLangs: ['en', 'es', 'fr'],  // 支持的语言
    assetsPath: 'assets/i18n',  // 翻译文件路径
  );

  runApp(MyApp());
}

4. 使用 ezi18n 进行翻译

在应用中使用 Ezi18n 来获取翻译文本。你可以通过 Ezi18n.of(context) 来获取当前语言的翻译文本。

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text(Ezi18n.of(context).get('welcome')),
        ),
        body: Center(
          child: Text(Ezi18n.of(context).get('hello')),
        ),
      ),
    );
  }
}

5. 动态切换语言

你可以使用 Ezi18n.setLocale 方法来动态切换应用的语言。例如,可以在设置页面提供一个语言选择器:

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

class SettingsPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Settings'),
      ),
      body: ListView(
        children: [
          ListTile(
            title: Text('English'),
            onTap: () async {
              await Ezi18n.setLocale('en');
              Navigator.pop(context);
            },
          ),
          ListTile(
            title: Text('Español'),
            onTap: () async {
              await Ezi18n.setLocale('es');
              Navigator.pop(context);
            },
          ),
          ListTile(
            title: Text('Français'),
            onTap: () async {
              await Ezi18n.setLocale('fr');
              Navigator.pop(context);
            },
          ),
        ],
      ),
    );
  }
}

6. 处理语言切换后的界面更新

为了在语言切换后立即更新界面,你可以使用 Ezi18n 提供的 Ezi18nBuilder 或者 Ezi18n.of(context) 来监听语言变化并重建界面。

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Ezi18nBuilder(
        builder: (context) {
          return Scaffold(
            appBar: AppBar(
              title: Text(Ezi18n.of(context).get('welcome')),
            ),
            body: Center(
              child: Text(Ezi18n.of(context).get('hello')),
            ),
          );
        },
      ),
    );
  }
}

7. 处理动态文本

如果你需要在翻译文本中插入动态数据,可以使用 Ezi18n 提供的 get 方法的 params 参数。例如:

{
  "greeting": "Hello, {name}!"
}

在代码中使用:

Text(Ezi18n.of(context).get('greeting', params: {'name': 'John'}));
回到顶部