Flutter国际化插件dynamic_i18n的使用

Flutter国际化插件dynamic_i18n的使用

在您的应用中动态加载翻译文本。

开始使用

在 Dart 的 main() 函数中初始化 I18n:

void main() {
    // 初始化 I18n
    I18n.init(
        url: 'https://www.example.com',
        locale: 'hi',
        locales: ['en', 'hi', 'pa'],
    );

    runApp(MyApp());
}

现在你可以在代码的任何地方使用 I18n.builder

Column(
    children: [
        // 示例 1: 使用 Text
        I18n.text('Who am I ?'), // 文本 'मैं कौन हूँ ?'

        // 示例 2: 使用 builder
        // 首先根据给定的语言环境构建
        // 在获取翻译后重新构建
        I18n.builder('Who am I ?', (translatedText) {
            return Text(translatedText);
        }),

        // 示例 3: 使用 childBuilder
        I18n.childBuilder(
            'Who am I ?',
            (translatedText, child) {
                return Column(
                children: [
                    Text(translatedText),
                    child, // 在第一次和第二次构建时保持相同
                ],
                );
            },
            Container(), // 将在重新构建时重用
        ),
    ],
);

服务器配置

将您的服务器设置为响应以下请求方式:

请求方法:GET

请求 URL:https://www.example.com/hi.json

响应

Content-Type: application/json

[
    {"en": "How are you ?", "hi": "आप कैसे हो ?"},
    {"en": "Who am I ?", "hi": "मैं कौन हूँ ?"}
]

对于单个翻译请求,库将以以下格式发送 POST 请求到您在 I18n.init 中提供的 URL。例如,它将是:

请求方法:POST

请求 URL:https://www.example.com/hi

{
    "en": sourceText,
    "target": targetLocale,
}

响应

Content-Type: application/json

{"en": "How are you ?", "hi": "आप कैसे हो ?"}

完整示例代码

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

// 状态fulWidget 示例 1
// 如果存在翻译则返回,否则在获取翻译后调用setState
class SomeStatefulWidget extends StatefulWidget {
  const SomeStatefulWidget({Key? key}) : super(key: key);

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

class _SomeStatefulWidgetState extends State<SomeStatefulWidget> {
  late I18n locale;

  [@override](/user/override)
  void initState() {
    locale = I18n(this);

    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Text(locale.get('Hello world')); // 显示翻译后的文本
  }
}

// 状态fulWidget 示例 2
// 通过扩展 I18nState 可以减少样板代码
class AnotherStatefulWidget extends StatefulWidget {
  const AnotherStatefulWidget({Key? key}) : super(key: key);

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

class _AnotherStatefulWidgetState extends I18nState<AnotherStatefulWidget> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Text(i18n('Hello world')); // 显示翻译后的文本
  }
}

// 无状态小部件示例
class SomeStatelessWidget extends StatelessWidget {
  const SomeStatelessWidget({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      children: [
        // 示例 1: 使用 Text
        I18n.text('Who am I ?'), // 文本 'मैं कौन हूँ ?'

        // 示例 2: 使用 builder
        // 首先根据给定的语言环境构建
        // 在获取翻译后重新构建
        I18n.builder('Who am I ?', (translatedText) {
          return Text(translatedText);
        }),

        // 示例 3: 使用 childBuilder
        I18n.childBuilder(
          'Who am I ?',
          (translatedText, child) {
            return Column(
              children: [
                Text(translatedText),
                child, // 在第一次和第二次构建时保持相同
              ],
            );
          },
          Container(), // 将在重新构建时重用
        ),
      ],
    );
  }
}

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

1 回复

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


dynamic_i18n 是一个用于在 Flutter 应用中实现国际化的插件。它允许你动态地加载和切换应用的语言,而不需要重启应用。以下是如何使用 dynamic_i18n 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  dynamic_i18n: ^0.3.0  # 请确保使用最新版本

然后运行 flutter pub get 以获取依赖。

2. 创建语言文件

assets 文件夹下创建语言文件。例如,你可以创建以下两个文件:

  • assets/lang/en.json
  • assets/lang/es.json

en.json 内容示例:

{
  "greeting": "Hello",
  "farewell": "Goodbye"
}

es.json 内容示例:

{
  "greeting": "Hola",
  "farewell": "Adiós"
}

3. 配置 pubspec.yaml

pubspec.yaml 文件中添加对语言文件的引用:

flutter:
  assets:
    - assets/lang/en.json
    - assets/lang/es.json

4. 初始化 dynamic_i18n

在你的 main.dart 文件中初始化 dynamic_i18n

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  await I18n.init(
    supportedLocales: [
      const Locale('en', 'US'),
      const Locale('es', 'ES'),
    ],
    defaultLocale: const Locale('en', 'US'),
    assetLoader: const JsonAssetLoader(path: 'assets/lang/'),
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: I18n.localizationsDelegates,
      supportedLocales: I18n.supportedLocales,
      localeResolutionCallback: I18n.localeResolutionCallback,
      locale: I18n.locale,
      home: MyHomePage(),
    );
  }
}

5. 使用国际化字符串

在你的应用中使用 I18n.of(context) 来获取国际化字符串:

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

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(I18n.of(context).translate('greeting')),
      ),
      body: Center(
        child: Text(I18n.of(context).translate('farewell')),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          I18n.setLocale(context, const Locale('es', 'ES'));
        },
        child: Icon(Icons.language),
      ),
    );
  }
}
回到顶部