Flutter文本同步插件sync_wording的使用

Flutter文本同步插件sync_wording的使用

快速开始

你可以通过一个简单的Google Sheets文件来管理应用的文字。只需创建一个包含键和文字列的表格。此工具会生成文字文件。你的产品负责人可以直接编辑应用的文字。

示例表格

你可以在以下链接找到一个示例表格: 示例表格

表格结构如下:

Keys English French
user.firstname_title Firstname Prénom
user.lastname_title Lastname Nom

安装

  1. sync_wording 作为开发依赖项安装:

    flutter pub add dev:sync_wording
    
  2. 在项目的根目录下创建一个名为 wording_config.yaml 的配置文件。

    配置文件内容如下:

    credentials:
      client_id: "your.google.client.id"
      client_secret: "your.google.client.secret"
    
    sheetId: "your.sheet.id"
    output_dir: "lib/localizations"
    languages:
      en:
        column: 3
      fr:
        column: 4
    
  3. 运行命令:

    flutter run sync_wording
    

运行后,会提示你授权访问Google Sheets。

> Task :app:downloadWording
Please open the following address in your browser:
  https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&scope=...

打开URL并授权访问。

占位符

你可以在翻译中指定占位符,并定义它们的类型和格式:

Hello {name} => 创建一个默认的 'Object' 占位符
Hello {name|String} => 创建一个 'String' 占位符
It is {now|DateTime|hh:mm:ss} => 创建一个 'DateTime' 占位符,格式化为 '14:09:15'

分隔符为 |

这同样适用于复数形式的例子:

{days, plural, zero{today} one{tomorrow} other{in {days|int} days}}

配置选项

表单名称

如果你的Google Sheets文档包含多个表单,所有表单都会被视为有效的输入表单。如果你想只使用其中的一部分,可以在配置文件中指定需要使用的表单名称:

sheetNames: ["Commons", "MyApp"]
键列

默认情况下,包含翻译键的列为第一列(列 ‘A’),但你可以指定另一个键列,如果你的Google Sheets文档有不同的格式:

key_column: 2  # 默认值为 1
值起始行

默认情况下,第一行为标题行,有效的键和翻译从第二行开始。如果你的Google Sheets文档不是这种格式,可以指定从哪一行开始读取翻译:

sheet_start_index: 3  # 默认值为 2
文字验证

在Google Sheets中,你可以添加一列表明是否是有效的翻译:

Keys English French Validation
user.firstname_title Firstname Prénom OK
user.lastname_title Lastname Nom NOT OK

然后在配置文件中添加:

validation:
  column: 5
  expected: "OK"

如果没有指定 validation,则认为所有内容都是有效的。

本地化类生成

执行此程序将生成 .arb 本地化文件。如果您的Flutter项目已配置使用本地化,并且有一个正确的 l10n.yaml 文件,此程序可以通过运行 flutter gen-l10nfvm flutter gen-l10n 自动生成本地化 Dart 类。你可以在 wording_config.yaml 文件中添加以下内容:

gen_l10n:
  auto_call: true
  with_fvm: true

选项

该工具支持两个选项:

  • <code>--config</code>:配置文件路径(可选,默认为 ./wording_config.dart
  • <code>--help</code>:显示帮助信息

完整配置

完整的 wording_config.yaml 文件示例:

credentials:
  client_id: "your.google.client.id"
  client_secret: "your.google.client.secret"
  credentials_file: "credentials.json"    # 可选,默认为 ".google_credentials.json"

sheetId: "your.sheet.id"
output_dir: "lib/localizations"
sheetNames: ["Commons", "MyApp"]          # 可选
sheet_start_index: 2                      # 可选,默认为 2

# 列值:1='A', 2='B', ...
key_column: 1                             # 可选,默认为 1
languages:
  en:
    column: 3
  fr:
    column: 4
validation:                               # 可选
  column: 5
  expected: "OK"

gen_l10n:                                 # 可选
  auto_call: true
  with_fvm: true                          # 可选

示例代码

以下是一个完整的示例代码,展示了如何使用 sync_wording 插件。

import 'package:flutter/material.dart';
import 'package:sync_wording_example/localizations/generated/app_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: 'SyncWording Demo',
      localizationsDelegates: AppLocalizations.localizationsDelegates,
      supportedLocales: AppLocalizations.supportedLocales,
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(AppLocalizations.of(context)!.hello),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(AppLocalizations.of(context)!.welcome),
            const SizedBox(height: 20),
            Text(AppLocalizations.of(context)!.date(DateTime.now())),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter文本同步插件sync_wording的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文本同步插件sync_wording的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,sync_wording 是一个用于管理和同步多语言文本的插件。它可以帮助开发者更轻松地处理应用程序中的多语言支持,确保文本内容在不同语言环境下的同步和一致性。以下是 sync_wording 插件的基本使用步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  sync_wording: ^latest_version

然后运行 flutter pub get 来安装插件。

2. 创建语言文件

在项目中创建一个文件夹(例如 assets/languages)来存放不同语言的文件。每个语言文件通常是一个 JSON 文件,例如:

  • en.json:英语
  • zh.json:中文

示例 en.json 文件内容:

{
  "hello": "Hello",
  "welcome": "Welcome to Flutter"
}

示例 zh.json 文件内容:

{
  "hello": "你好",
  "welcome": "欢迎使用 Flutter"
}

3. 配置 pubspec.yaml

pubspec.yaml 文件中配置资源路径,确保 Flutter 能够找到这些语言文件:

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

4. 初始化 sync_wording

在应用程序的入口文件(通常是 main.dart)中初始化 sync_wording

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 SyncWording
  await SyncWording.initialize(
    defaultLanguage: 'en', // 默认语言
    supportedLanguages: ['en', 'zh'], // 支持的语言
    assetsPath: 'assets/languages', // 语言文件路径
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

5. 使用 sync_wording

在应用程序中使用 SyncWording 来获取多语言文本:

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(SyncWording.of(context).get('welcome')),
      ),
      body: Center(
        child: Text(SyncWording.of(context).get('hello')),
      ),
    );
  }
}

6. 切换语言

你可以在应用程序中动态切换语言:

void changeLanguage(String languageCode) {
  SyncWording.setLanguage(languageCode);
}

7. 监听语言变化

如果你希望在语言变化时更新 UI,可以使用 SyncWording 提供的 LanguageChangedNotifier

SyncWording.addListener(() {
  // 语言变化时更新 UI
  setState(() {});
});
回到顶部