Flutter国际化插件flutter_google_i18n的使用

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

Flutter国际化插件flutter_google_i18n的使用

简介

flutter-google-i18n 是一个用于使用Google表格进行Flutter应用国际化的小型库。

示例

您可以查看演示应用:https://github.com/macav/flutter-google-i18n-demo

如何获取表格JSON链接

  1. 打开包含翻译的表格,其结构应与示例相同。
  2. 发布文档到网络。
    • 点击文件 -> 发布到网络 -> 发布。您可以忽略提供的链接。
  3. 获取可分享的链接。
    • 点击文件 -> 共享 -> 获取链接。 您将得到如下格式的链接:
    https://docs.google.com/spreadsheets/d/<SPREADSHEET_IDENTIFIER>/edit?usp=sharing
    
  4. 将标识符替换到以下链接:
    https://spreadsheets.google.com/feeds/list/<SPREADSHEET_IDENTIFIER>/1/public/values?alt=json
    
    您应该会得到表格数据的JSON格式。 示例链接如下:
    https://spreadsheets.google.com/feeds/list/1TGbtKpdNRptYwUVtqmkI2L7Ix00i-fQMnrChGHx2Ajk/1/public/values?alt=json
    

完整示例代码

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

void main() => runApp(MyApp());

class MyAppState extends State<MyApp> {
  Locale locale;

  [@override](/user/override)
  void initState() {
    super.initState();
    locale = Locale('en'); // 初始化为英语
  }

  onLocaleChange(Locale locale) {
    setState(() {
      this.locale = locale;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Google I18n Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      localizationsDelegates: [
        GoogleI18nLocalizationsDelegate(
            'https://spreadsheets.google.com/feeds/list/1TGbtKpdNRptYwUVtqmkI2L7Ix00i-fQMnrChGHx2Ajk/1/public/values?alt=json'), // 替换为您的表格链接
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      locale: locale,
      home: MyHomePage(onLocaleChange), // 传递onLocaleChange回调
    );
  }
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  State<StatefulWidget> createState() {
    return new MyAppState();
  }
}

class MyHomePage extends StatelessWidget {
  final void Function(Locale locale) onLocaleSwitch;

  MyHomePage(this.onLocaleSwitch);

  [@override](/user/override)
  Widget build(BuildContext context) {
    GoogleI18nLocalizations i18n = GoogleI18nLocalizations.of(context); // 获取本地化对象

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Google I18n'), // 应用标题
      ),
      body: Center(
          child: Column(
        children: <Widget>[
          Text(i18n.t('title')), // 显示翻译后的标题
          Padding(padding: EdgeInsets.only(top: 30)), // 添加顶部间距
          Row(
            mainAxisAlignment: MainAxisAlignment.center, // 居中对齐
            children: <Widget>[
              DropdownButton(
                items: i18n.supportedLocales.map((locale) { // 创建下拉菜单项
                  return DropdownMenuItem(
                      child: Text(locale.toUpperCase()), value: locale);
                }).toList(),
                value: i18n.locale.languageCode, // 设置当前语言
                onChanged: (String value) { // 更改语言时的回调
                  Locale newLocale = Locale(value);
                  GoogleI18nLocalizations.setLocale(context, newLocale); // 更新上下文中的语言
                  this.onLocaleSwitch(newLocale); // 触发回调
                },
              ),
              Padding(padding: EdgeInsets.symmetric(horizontal: 5)), // 添加水平间距
              ElevatedButton(
                  style: ElevatedButton.styleFrom(
                    textStyle: TextStyle(color: Colors.white),
                    primary: Colors.blue,
                    onPrimary: Colors.white,
                  ),
                  child: Text(
                      "Switch to ${i18n.locale.languageCode == 'en' ? 'DE' : 'EN'}"), // 切换语言按钮文本
                  onPressed: () {
                    Locale newLocale = i18n.locale.languageCode == 'en' // 判断当前语言并切换
                        ? const Locale('de')
                        : const Locale('en');
                    GoogleI18nLocalizations.setLocale(context, newLocale); // 更新上下文中的语言
                    this.onLocaleSwitch(newLocale); // 触发回调
                  })
            ],
          )
        ],
      )),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何使用 flutter_google_i18n 插件进行 Flutter 应用国际化的代码案例。这个插件可以简化国际化(i18n)和本地化(l10n)的过程。

1. 添加依赖

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

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

然后在你的项目根目录下运行 flutter pub get 来获取依赖。

2. 创建翻译文件

在你的项目根目录下创建一个 assets/i18n 文件夹,并在其中创建 JSON 格式的翻译文件。例如,创建 en.jsonzh.json 文件:

assets/i18n/en.json:

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

assets/i18n/zh.json:

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

3. 配置 pubspec.yaml

pubspec.yaml 中添加这些 JSON 文件到 assets 部分:

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

4. 初始化 FlutterGoogleI18n

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

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

void main() {
  // 初始化 FlutterGoogleI18n
  final FlutterGoogleI18n i18n = FlutterGoogleI18n(
    pathToJson: 'assets/i18n',
    defaultLocale: Locale('en', 'US'),
    supportedLocales: [
      Locale('en', 'US'),
      Locale('zh', 'CN'),
    ],
  );

  runApp(MyApp(i18n: i18n));
}

class MyApp extends StatelessWidget {
  final FlutterGoogleI18n i18n;

  MyApp({required this.i18n});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter I18n Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      localizationsDelegates: [
        i18n.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: i18n.supportedLocales,
      locale: i18n.locale,
      home: MyHomePage(i18n: i18n),
    );
  }
}

5. 使用翻译文本

在你的 MyHomePage 或其他页面中使用翻译文本:

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

class MyHomePage extends StatefulWidget {
  final FlutterGoogleI18n i18n;

  MyHomePage({required this.i18n});

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.i18n.translate('welcome_message')),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(widget.i18n.translate('welcome_message')),
            ElevatedButton(
              onPressed: () {
                // 示例:更改语言
                setState(() {
                  widget.i18n.changeLocale(Locale('zh', 'CN'));
                });
              },
              child: Text(widget.i18n.translate('change_to_chinese')),
            ),
            Text(widget.i18n.translate('goodbye_message')),
          ],
        ),
      ),
    );
  }
}

注意:在上面的代码中,widget.i18n.translate('change_to_chinese') 可能会导致一个错误,因为我们在 JSON 文件中没有定义这个键。你需要确保在 JSON 文件中定义了所有要翻译的键。

总结

通过上述步骤,你可以在你的 Flutter 应用中使用 flutter_google_i18n 插件进行国际化。这包括添加依赖、创建翻译文件、配置 pubspec.yaml、初始化插件以及在 Widget 中使用翻译文本。

回到顶部