Flutter国际化插件gettext_i18n的使用

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

Flutter国际化插件gettext_i18n的使用

概述

gettext_i18n 是一个帮助Flutter应用程序实现国际化的包。它基于 gettextgettext_parser

功能特性

  • 支持消息键中的占位符

使用方法

依赖安装

pubspec.yaml 文件中添加 gettext_i18nflutter_localizations

flutter pub add gettext_i18n
flutter pub add flutter_localizations --sdk=flutter

资源文件配置

pubspec.yaml 中,添加 assets/i18n/ 作为资源文件夹路径:

flutter:
  assets:
    - assets/i18n/

可选地,在该文件夹内放置您的翻译文件(例如:en.po, fr_CH.po, fr.po)。

初始化应用

在主应用文件中声明支持的语言环境,并初始化翻译:

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: const HomePage(),
      supportedLocales: const [
        Locale('en'),
        Locale('fr'),
        Locale('fr', 'CH'),
      ],
      localizationsDelegates: [
        GettextLocalizationsDelegate(defaultLanguage: 'en'),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      localeListResolutionCallback: (locales, supportedLocales) {
        if (locales != null) {
          for (var locale in locales) {
            var supportedLocale = supportedLocales.where((element) =>
                element.languageCode == locale.languageCode &&
                element.countryCode == locale.countryCode);
            if (supportedLocale.isNotEmpty) {
              return supportedLocale.first;
            }
            supportedLocale = supportedLocales.where(
                (element) => element.languageCode == locale.languageCode);
            if (supportedLocale.isNotEmpty) {
              return supportedLocale.first;
            }
          }
        }
        return null;
      },
    );
  }
}

翻译字符串

在需要进行翻译的文件中导入 gettext_i18n 包并使用上下文来获取翻译后的字符串:

import 'package:gettext_i18n/gettext_i18n.dart';

// 示例:带参数的翻译字符串
var translatedString = context.t('{2} ! Pi is greater than {0} and smaller than {1}', args: [3, 4, 'Hello']);

// 或者简单地翻译一个字符串
Text(context.t('Hello, world !')),

额外信息

.po 文件可以手动编辑,但建议使用专业的编辑器或在线服务来管理这些文件,以确保格式正确且易于维护。

完整示例代码

以下是包含上述所有步骤的一个完整示例代码:

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: const HomePage(),
      supportedLocales: ['en', 'fr', 'fr_CH'].map((l) => Locale(l)),
      localizationsDelegates: [
        GettextLocalizationsDelegate(defaultLanguage: 'en'),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      localeListResolutionCallback: (locales, supportedLocales) {
        if (locales != null) {
          for (var locale in locales) {
            var supportedLocale = supportedLocales.where((element) =>
                element.languageCode == locale.languageCode &&
                element.countryCode == locale.countryCode);
            if (supportedLocale.isNotEmpty) {
              return supportedLocale.first;
            }
            supportedLocale = supportedLocales.where(
                (element) => element.languageCode == locale.languageCode);
            if (supportedLocale.isNotEmpty) {
              return supportedLocale.first;
            }
          }
        }
        return null;
      },
    );
  }
}

class HomePage extends StatelessWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text(context.t('Hello, world !')),
    );
  }
}

通过以上步骤,您可以在Flutter项目中成功实现多语言支持。希望这对您有所帮助!


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用gettext_i18n插件进行国际化的代码示例。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  gettext_flutter: ^0.x.x  # 请注意使用最新版本号

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

2. 初始化国际化

在项目的根目录下创建一个locales文件夹,并在其中创建不同语言的翻译文件,例如messages_en.dartmessages_zh.dart

messages_en.dart

import 'package:gettext_flutter/gettext_flutter.dart';

final gt_en = GT(locale: 'en');

void initMessages() {
  gt_en.addAll([
    GTTranslation(
      key: 'hello',
      msg: 'Hello',
    ),
    GTTranslation(
      key: 'welcome',
      msg: 'Welcome to our app!',
    ),
  ]);
}

messages_zh.dart

import 'package:gettext_flutter/gettext_flutter.dart';

final gt_zh = GT(locale: 'zh');

void initMessages() {
  gt_zh.addAll([
    GTTranslation(
      key: 'hello',
      msg: '你好',
    ),
    GTTranslation(
      key: 'welcome',
      msg: '欢迎来到我们的应用!',
    ),
  ]);
}

3. 加载翻译文件

在你的主文件中(通常是main.dart),你需要加载这些翻译文件,并根据用户的选择设置当前语言。

import 'package:flutter/material.dart';
import 'package:gettext_flutter/gettext_flutter.dart';
import 'locales/messages_en.dart';
import 'locales/messages_zh.dart';

void main() {
  // 初始化翻译
  initMessages();

  // 设置默认语言为英语
  GT.currentLocale = Locale('en');

  runApp(MyApp());
}

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

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(gt(context, 'hello')),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(gt(context, 'welcome')),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  GT.currentLocale = GT.currentLocale.languageCode == 'en'
                      ? Locale('zh')
                      : Locale('en');
                });
              },
              child: Text(GT.currentLocale.languageCode == 'en'
                  ? 'Switch to Chinese'
                  : 'Switch to English'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 使用翻译

在需要翻译的地方使用gt(context, 'key')函数来获取翻译后的文本。

注意事项

  • 确保所有翻译文件都已经正确初始化。
  • 当你切换语言时,通过调用setState来重新构建UI,以确保显示最新的翻译。
  • gettext_flutter插件可能会更新其API,因此请查看最新的文档以确保代码与最新版本兼容。

希望这个示例能帮你更好地理解和使用gettext_i18n插件进行Flutter应用的国际化。

回到顶部