Flutter国际化插件libintl的使用

Flutter国际化插件libintl的使用

Dart绑定库libintl用于实现GetText功能。


libintl提供了对C语言GetText API的Dart绑定,同时提供了一个简单的源代码字符串提取工具。

使用方法

首先,你需要在你的系统上安装一个实现了GetText的库。libintl不会默认包含任何这样的库。

当库初始化时,它会自动在已知路径中查找gliblibintllibc。你也可以手动指定共享库的路径。

初始化

首先,需要初始化库:

import "package:libintl/libintl.dart" as intl;

void main() {
  intl.init();
}

如果不需要手动指定共享库路径,则可以省略此步骤。如果需要指定路径,则需要以File对象作为参数运行函数:

import "dart:io";
import "package:libintl/libintl.dart" as intl;

void main() {
  intl.init(File("/usr/lib64/libc.so.6"));
}

如果加载库失败,则会抛出LibraryException

初始配置

接下来,需要初始化区域设置数据:

import "package:libintl/libintl.dart" as intl;

void main() {
  intl.setLocale(intl.LC.all, "");
  intl.bindTextDomain("my_text_domain", "/usr/share/locale");
  intl.bindTextDomainCodeset("my_text_domain", "UTF-8");
  intl.textDomain("my_text_domain");
}

标记可翻译的字符串

最常见的用法可能类似于以下代码:

import "package:format/format.dart";
import "package:libintl/libintl.dart" as intl;

const _ = intl.gettext;

void main() {
  intl.setLocale(intl.LC.all, "");
  intl.bindTextDomain("my_text_domain", "/usr/share/locale");
  intl.bindTextDomainCodeset("my_text_domain", "UTF-8");
  intl.textDomain("my_text_domain");

  print(_("Hello, GetText!")); // 使用 `_` 常量标记可翻译字符串

  print(intl.gettext("You can also use the `gettext` function directly.")); // 直接使用 `gettext` 函数

  int count = 10;
  print(
    intl
        .ngettext(
          "The directory contains {} file.",
          "The directory contains {} files.",
          count,
        )
        .format(count), // 使用 ngettext 处理复数形式
  );
}

字符串提取

该包还包括一个从源代码中提取字符串的工具和库。

命令行工具

程序可以通过dart run libintl命令运行。

最常用的用法可能类似于以下命令:

dart run libintl --from-code=UTF-8 -F my_source_file.dart -o my_text_domain.pot --package-name=my_text_domain

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

1 回复

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


当然,关于Flutter国际化插件libintl的使用,以下是一个详细的代码案例,展示了如何设置和使用libintl进行应用国际化。

步骤 1: 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  libintl: ^0.17.10  # 确保版本号是最新的

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

步骤 2: 创建国际化资源文件

在你的项目根目录下创建一个intl文件夹,并在其中创建多个语言文件,例如messages_en.arbmessages_zh.arb

messages_en.arb

{
  "welcome_message": "Welcome to our app!",
  "goodbye_message": "Goodbye!"
}

messages_zh.arb

{
  "welcome_message": "欢迎来到我们的应用!",
  "goodbye_message": "再见!"
}

步骤 3: 加载国际化资源

在你的应用代码中,你需要加载这些ARB文件并设置当前的Locale。

main.dart

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:libintl/libintl.dart';
import 'dart:ui' as ui;
import 'intl/messages_all.dart'; // 这个文件会自动生成

void main() {
  // 设置语言环境
  Intl.defaultLocale = ui.window.locale.languageCode +
      (ui.window.locale.countryCode != null && ui.window.locale.countryCode.isNotEmpty
          ? '_' + ui.window.locale.countryCode
          : '');

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      localizationsDelegates: [
        // 添加libintl的LocalizationsDelegate
        S.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: S.delegate.supportedLocales,
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(S.of(context).welcome_message),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 假设这里切换语言为中文
            Intl.defaultLocale = 'zh';
            // 更新UI(实际项目中可能需要使用Provider或其他状态管理方案来更新UI)
            // 这里仅作演示,实际应用中需要触发重建
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text(S.of(context).goodbye_message)),
            );
          },
          child: Text('Change Language'),
        ),
      ),
    );
  }
}

步骤 4: 生成国际化文件

在命令行中运行以下命令来生成messages_all.dart文件:

flutter pub run intl_translation:extract_to_arb --output-dir=intl l10n.yaml
flutter pub run intl_translation:generate_from_arb --output-dir=lib l10n.yaml

你需要有一个l10n.yaml配置文件来指定ARB文件的路径和生成的Dart文件的位置。以下是一个简单的l10n.yaml示例:

l10n.yaml

arb-dir: intl
template-arb-file: messages.arb
output-localization-file: lib/intl/messages_all.dart

注意:在l10n.yaml中指定的template-arb-file可以是一个不存在的文件,它仅用于指导生成过程,实际的ARB文件应该是你手动创建的,如messages_en.arbmessages_zh.arb

总结

以上代码展示了如何使用libintl插件在Flutter应用中实现国际化。通过创建ARB文件、加载国际化资源、设置Locale以及在UI中使用国际化字符串,你可以轻松地为你的应用添加多语言支持。

回到顶部