Flutter国际化插件gh_i18n的使用

Flutter国际化插件gh_i18n的使用

该插件可以帮助您在Flutter项目中轻松实现国际化功能。

开始使用

首先,您需要在项目的根目录下创建一个名为 gh_i18n.yaml 的文件。以下是一个示例配置:

# 您希望保存模型的路径
classPath: "./lib/"
# JSON模型的名称
modelNm: "GhI18nLanguage"
# JSON文件的名称
fileNm: "gh_i18n_language"
# JSON文件的位置
jsonPath: "./assets/"
# 包含多语言信息的JSON文件的基础名称
jsonNm: "i18n_json"

接下来,您需要为每种支持的语言创建一个包含多语言信息的JSON文件。例如,如果您的 jsonNmi18n_json 并且您支持韩语和英语,则应在 jsonPath 路径下分别存在 i18n_json_kr.jsoni18n_json_en.json 文件。

以下是示例:

i18n_json_kr.json

{
  "home" : {
    "count": "@n개",
    "btn_text": "숫자 더하기",
    "text": "버튼을 눌러 숫자를 더해보세요"
  }
}

i18n_json_en.json

{
  "home" : {
    "count": "Count @n",
    "btn_text": "Add Count",
    "text": "You have pushed the button this many times:"
  }
}

然后,在您的项目根目录下运行以下命令:

dart run gh_i18n

这将生成两个文件:gh_i18n_translator.dartgh_i18n_helper.dart

初始化多语言模块

现在,您可以初始化多语言模块,并将其放在应用程序启动之前。以下是初始化代码示例:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await GhTranslatorHelper().initLanguage();
  runApp(const MyApp());
}

使用多语言模型

您可以像下面这样使用类型安全的多语言模型:

Text(
  tl.home?.text ?? '',
),

Text(
  tl.home?.count?.params({'n': '$_counter'}) ?? '',
  style: Theme.of(context).textTheme.headlineMedium,
),

插入变量

params() 函数作为 String 类型的扩展函数提供。您可以在JSON文件中添加带有 @ 标记的变量,并在Dart代码中以映射形式输入这些变量的值。

Text(
  tl.home?.count?.params({'n': '$_counter'}) ?? ''
),

完整示例代码

以下是一个完整的示例代码,展示了如何在Flutter应用中使用 gh_i18n 插件:

import 'dart:async';

import 'package:example/gh_i18n_helper.dart';
import 'package:flutter/material.dart';
import 'package:gh_i18n/language_type.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await GhTranslatorHelper().initLanguage();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  bool isKr = true;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              tl.home?.text ?? '',
            ),
            Text(
              tl.home?.count?.params({'n': '$_counter'}) ?? '',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
            const SizedBox(height: 100),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                const Text('en'),
                Switch(value: isKr, onChanged: (value) {
                  isKr = value;
                  if (isKr) {
                    GhTranslatorHelper.setLanguageType(LanguageType.ko);
                  } else {
                    GhTranslatorHelper.setLanguageType(LanguageType.en);
                  }
                  setState(() {});
                }),
                const Text('kr'),
              ],
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

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

1 回复

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


在Flutter项目中实现国际化(i18n)是一个常见的需求,gh_i18n 是一个流行的国际化插件,它可以帮助你更轻松地管理和切换应用中的多语言支持。下面是一个如何使用 gh_i18n 插件的基本代码示例。

1. 添加依赖

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

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

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

2. 创建语言文件

在你的项目根目录下创建一个 assets/i18n 文件夹,并在其中创建不同语言的 JSON 文件,例如 en.jsonzh.json

assets/i18n/en.json:

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

assets/i18n/zh.json:

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

3. 配置 pubspec.yaml

确保在 pubspec.yaml 文件中将你的语言文件添加到 assets 部分:

flutter:
  assets:
    - assets/i18n/en.json
    - assets/i18n/zh.json

4. 初始化 gh_i18n

在你的主应用文件(通常是 main.dart)中初始化 gh_i18n

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter i18n Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      localizationsDelegates: [
        // 添加 gh_i18n 的本地化委托
        GhI18nDelegate(
          fallbackLocale: 'en', // 默认语言
          supportedLocales: [
            Locale('en', ''),
            Locale('zh', ''),
          ],
          assetBasePath: 'assets/i18n/', // 语言文件的基础路径
        ),
        // 保留 GlobalMaterialLocalizations 以支持其他 Material 组件的本地化
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('en', ''),
        Locale('zh', ''),
      ],
      locale: Locale('en'), // 初始语言
      home: MyHomePage(),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  Locale _currentLocale;

  @override
  void initState() {
    super.initState();
    _currentLocale = Localizations.localeOf(context);
  }

  void _changeLanguage(Locale locale) {
    setState(() {
      _currentLocale = locale;
      // 更新应用的语言环境
      Localizations.override(
        context,
        Locale.fromSubtags(languageCode: locale.languageCode),
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    final i18n = GhI18n.of(context);
    return Scaffold(
      appBar: AppBar(
        title: Text(i18n.translate('welcome')),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(i18n.translate('welcome')),
            Text(i18n.translate('goodbye')),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => _changeLanguage(Locale('en')),
              child: Text('English'),
            ),
            ElevatedButton(
              onPressed: () => _changeLanguage(Locale('zh')),
              child: Text('中文'),
            ),
          ],
        ),
      ),
    );
  }
}

5. 运行应用

现在你可以运行你的 Flutter 应用,并通过点击按钮来切换语言。

这个示例展示了如何使用 gh_i18n 插件来管理应用中的多语言支持,包括如何初始化插件、创建语言文件、配置 pubspec.yaml 以及如何在应用中动态切换语言。希望这对你有所帮助!

回到顶部