Flutter国际化插件sheets_i18n的使用

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

Flutter国际化插件sheets_i18n的使用

1. 准备一个Google Sheet文档

1.1 获取示例文档:docs.google.com

该文档应如下所示:

  • 第一列是消息键(用于在应用程序中查找翻译)。
  • 后面的列是语言代码。
  • 行是每个特定翻译单词/句子。

复制表格ID:https://docs.google.com/spreadsheets/d/THIS PART OF THE URL/edit?pli=1&gid=0#gid=0

2. 配置服务账户

2.1 在Google Cloud Console中创建一个新的服务账户 2.2 打开Google Sheets API 2.3 复制服务账户的电子邮件地址 2.4 将Google表单与服务账户共享并赋予编辑权限 2.5 下载服务账户JSON文件(稍后将在pubspec配置中添加本地路径)

注意:请勿提交您的服务账户JSON文件

3. 先决条件与intl_translation

3.1 设置了intl_translationflutter_localizations,包括MyAppLocalizationsMyAppLocalizationsDelegate类(参见我们的示例应用) 3.2 运行intl_translation命令以生成arb文件

flutter pub run intl_translation:extract_to_arb --output-dir=lib/l10n lib/localizations.dart

3.3 创建新的ARB文件,命名为intl_<locale>.arb(例如,intl_de.arb用于德语,intl_es.arb用于西班牙语)

4. 安装此包

flutter pub add sheets_i18n

5. 配置pubspec.yaml

添加以下部分:

sheets_i18n:
  service_account_path: ./path/to/service_account.json
  sheet_id: 34tv34rv324rv23rv3r43r43red89f8hs89duzfs
  localizations_file: './lib/localizations.dart' # 文件包含本地化消息 - 可选 - 默认为./lib/main.dart
  localizations_path: './lib/l10n' # arb文件所在的文件夹 - 可选 - 默认为./lib/l10n

6. 运行同步脚本

flutter pub run sheets_i18n:update

这将进行双向同步:

  • 没有出现在Google表中的消息键将被添加。
  • 新的翻译将被拉取并写入到arb文件中。

7. 使用intl_translation的arb到dart

运行intl_translation命令从arb文件生成dart代码

flutter pub run intl_translation:generate_from_arb \
    --output-dir=lib/l10n --no-use-deferred-loading \
    lib/localizations.dart \
    lib/l10n/intl_en.arb lib/l10n/intl_de.arb lib/l10n/intl_cs.arb

示例代码

import 'package:example/localizations.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

void main() {
  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,
      ),
      localizationsDelegates: const [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
        MyAppLocalizationsDelegate(),
      ],
      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&lt;MyHomePage&gt; createState() =&gt; _MyHomePageState();
}

class _MyHomePageState extends State&lt;MyHomePage&gt; {
  int _counter = 0;

  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: &lt;Widget&gt;[
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何使用Flutter国际化插件sheets_i18n的示例代码案例。这个插件可以帮助你轻松地在Flutter应用中实现国际化。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  sheets_i18n: ^latest_version  # 请替换为最新版本号

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

2. 创建翻译文件

假设你要支持英语和中文,你需要创建两个翻译文件:messages_en.jsonmessages_zh.json

messages_en.json

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

messages_zh.json

{
  "greeting": "你好",
  "farewell": "再见"
}

3. 配置sheets_i18n

在你的Flutter项目中创建一个新的Dart文件,比如i18n.dart,用于初始化sheets_i18n

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

class I18n {
  static SheetsI18n? _sheetsI18n;

  static SheetsI18n get sheets => _sheetsI18n!;

  static Future<void> load(Locale locale) async {
    final String jsonPath = 'assets/messages_${locale.languageCode}.json';
    final SheetsI18n sheetsI18n = SheetsI18n.delegate(
      fallbackFile: 'assets/messages_en.json', // 默认语言文件
      jsonMap: await rootBundle.loadString(jsonPath),
    );
    _sheetsI18n = sheetsI18n;
  }
}

4. 加载翻译文件

在你的MaterialApp中,使用LocalizationsSheetsI18nDelegate来加载翻译文件。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      localizationsDelegates: [
        SheetsI18n.delegate(fallbackFile: 'assets/messages_en.json'),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('en', ''),
        Locale('zh', ''),
      ],
      locale: Locale('en'), // 默认语言
      onGenerateRoute: (RouteSettings settings) {
        // 在这里你可以根据路由加载不同的语言
        final Locale locale = settings.locale ?? Locale('en');
        return FutureBuilder<void>(
          future: I18n.load(locale),
          builder: (BuildContext context, AsyncSnapshot<void> snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              // 加载完成后返回主页面
              if (settings.name == '/') {
                return MaterialPageRoute<void>(
                  builder: (BuildContext context) => HomePage(),
                );
              }
            }
            // 显示加载中页面或错误页面
            return MaterialPageRoute<void>(
              builder: (BuildContext context) => Scaffold(
                body: Center(child: CircularProgressIndicator()),
              ),
            );
          },
        );
      },
      home: HomePage(), // 初始页面
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(I18n.sheets.translate('greeting')),
      ),
      body: Center(
        child: Text(I18n.sheets.translate('farewell')),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 切换语言示例
          Navigator.push(
            context,
            MaterialPageRoute<void>(
              builder: (BuildContext context) => LanguageSwitcher(),
            ),
          );
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

class LanguageSwitcher extends StatefulWidget {
  @override
  _LanguageSwitcherState createState() => _LanguageSwitcherState();
}

class _LanguageSwitcherState extends State<LanguageSwitcher> {
  Locale? _currentLocale;

  @override
  Widget build(BuildContext context) {
    final Locale locale = Localizations.localeOf(context);
    _currentLocale ??= locale;

    return Scaffold(
      appBar: AppBar(
        title: Text('Language Switcher'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextButton(
              onPressed: () async {
                setState(() {
                  _currentLocale = Locale('en');
                });
                await I18n.load(_currentLocale!);
                Navigator.pop(context);
                Navigator.pushReplacement(
                  context,
                  MaterialPageRoute<void>(
                    builder: (BuildContext context) => MyApp(),
                  ),
                );
              },
              child: Text('English'),
            ),
            TextButton(
              onPressed: () async {
                setState(() {
                  _currentLocale = Locale('zh');
                });
                await I18n.load(_currentLocale!);
                Navigator.pop(context);
                Navigator.pushReplacement(
                  context,
                  MaterialPageRoute<void>(
                    builder: (BuildContext context) => MyApp(),
                  ),
                );
              },
              child: Text('中文'),
            ),
          ],
        ),
      ),
    );
  }
}

5. 确保资源文件被正确加载

pubspec.yaml中确保你的翻译文件被包含为资源文件:

flutter:
  assets:
    - assets/messages_en.json
    - assets/messages_zh.json

总结

这个示例展示了如何使用sheets_i18n插件在Flutter应用中实现国际化。通过创建翻译文件、配置插件、加载翻译文件以及在应用中显示翻译文本,你可以轻松地为你的应用添加多语言支持。

回到顶部