Flutter本地化构建插件katana_localization_builder的使用

Flutter本地化构建插件katana_localization_builder的使用


Masamune logo

Katana Localization


简介

本地化包基本上具有以下功能:

  • 创建带有特定键和相应翻译文本定义的文件。
  • 实现时通过指定特定键来提取并显示当前区域设置的匹配文本。

当时我遇到了以下问题:

  • 在实现过程中每次都需要检查定义文件以查看已定义的键。
  • 有时会用不同的键对相同的翻译文本进行重复定义,因为不知道哪个键正在被定义。
  • 键可能会拼写错误,导致翻译无法正常工作。
  • 分享文件并解释结构时很麻烦。
  • 有时想使用自动翻译,但过程很繁琐。
  • 没有BuildContext可能无法访问。
  • 当想在翻译文本中插入变量时,由于是后注入值的形式,理解起来比较困难。

因此,我创建了一个具有以下功能的包来解决上述问题:

  • 在Google表格中创建翻译数据。
  • 使用 build_runner 进行代码生成。
  • 当使用变量时,可以通过方法链输入变量而不会破坏句子顺序。
  • 轻松更改语言。可以检测到更改并重新绘制应用程序。
  • 可以从任何地方访问,无需BuildContext。

安装

导入以下包以使用 build_runner 进行代码生成:

flutter pub add katana_localization
flutter pub add --dev build_runner
flutter pub add --dev katana_localization_builder

提前准备

提前准备好Google表格。

  1. 复制此模板到您的Google云端硬盘:

    • 您可以从 文件 -> 制作副本 复制。
  2. 在复制的表格中,点击 文件 -> 共享 -> 与他人共享

  3. 共享 "(您创建的表格名)" 窗口中,将 通用访问权限 更改为 任何人有链接即可访问

如何编写Google表格

Google表格的最左列是 ,每行对应的翻译文本根据区域设置描述在第二列。

Google SpreadSheet

如果键以 # 开头,则该行不会被读取。请将其用于注释等。

使用变量

可以在键中输入 {变量名} 来嵌入变量。

相同的 {变量名} 也可以在翻译文本中包含,以便嵌入相应的值并显示。

Variable name assignment

实现

创建定义文件

创建一个Dart文件,例如 localization.dart

使用 part 'original filename.localize.dart'; 导入Part文件。

创建一个带有 GoogleSpreadSheetLocalize 注解的类。

类名可以是任意名称,但确保使用 _$ (定义的类名) 作为扩展。

复制并粘贴上面准备好的Google表格URL(例如,https://docs.google.com/spreadsheets/d/1bw7IXEr7BGkZ4U6on0OuF7HQkTMgDSm6u5ThpBkDPeo/edit#gid=551986808)并粘贴进去。

您可以粘贴多个URL作为数组。在这种情况下,将应用所有电子表格的数据。(后面加载的数据优先)

基本翻译可以指定为基准电子表格,附加翻译数据可以针对不同的应用进行指定。

通常,下载的电子表格内容会被缓存,但可以通过递增 version 来更新新内容。

此外,定义该类使用的顶级字段。 字段名越短,以后使用越方便

// localization.dart
import 'package:katana_localization/katana_localization.dart';

part 'localization.localize.dart';

@GoogleSpreadSheetLocalize(
  [
    "https://docs.google.com/spreadsheets/d/1bw7IXEr7BGkZ4U6on0OuF7HQkTMgDSm6u5ThpBkDPeo/edit#gid=551986808",
  ],
  version: 1,
)
class AppLocalize extends _$AppLocalize { }

final l = AppLocalize();

将翻译数据注册到MaterialApp

使用 AppLocalize 类的对象定义 LocalizeScopeMaterialApp

将刚刚创建的 AppLocalize 对象传递给 localizeScopelocalize,并将 MaterialApp 放置在 builder 中。

AppLocalize 的方法和字段传递给 MaterialApplocalelocalizationsDelegatessupportedLocaleslocaleResolutionCallback

// main.dart

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

import 'localization.dart';

void main() {
  runApp(const MainPage());
}

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

  @override
  Widget build(BuildContext context) {
    return LocalizeScope(
      localize: l,
      builder: (context, localize) {
        return MaterialApp(
          locale: localize.locale,
          localizationsDelegates: localize.delegates(),
          supportedLocales: localize.supportedLocales(),
          localeResolutionCallback: localize.localeResolutionCallback(),
          title: "Test App",
        );
      },
    );
  }
}

代码生成

通过执行以下命令进行自动代码生成:

flutter pub run build_runner build --delete-conflicting-outputs

当连续执行命令时,缓存可能会保留,导致翻译未反映。

flutter pub run build_runner clean

使用

获取翻译文本

通过执行 AppLocalize 对象作为方法来获取翻译对象。

翻译对象具有在Google表格中定义的键作为字段和方法,因此可以按以下方式获取翻译文本。

print(l().user); // 英文: User、日语: ユーザー

当使用变量时,提供了 $(输入值) 方法,因此在那里输入值。

也可以指定翻译对象作为其输入值。

print(l().$(l().saving).hasBeenCompleted);
// 英文: Saving has been completed.
// 日语: 保存が完了しました。

print(
  l().$(
    l().$(l().saving).of.$(l().data)
  ).hasBeenCompleted
);
// 英文: Saving of Data has been completed.
// 日语: データの保存が完了しました。

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

1 回复

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


katana_localization_builder 是一个用于 Flutter 应用本地化的构建插件。它可以帮助你自动生成本地化相关的代码,减少手动编写本地化文件的繁琐工作。以下是如何使用 katana_localization_builder 的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 katana_localizationkatana_localization_builder 的依赖。

dependencies:
  flutter:
    sdk: flutter
  katana_localization: ^1.0.0

dev_dependencies:
  build_runner: ^2.1.0
  katana_localization_builder: ^1.0.0

2. 创建本地化文件

lib 目录下创建一个 l10n 文件夹,并在其中创建一个 localizations.yaml 文件。这个文件将用来定义你的本地化字符串。

# lib/l10n/localizations.yaml
en:
  hello: "Hello"
  goodbye: "Goodbye"

ja:
  hello: "こんにちは"
  goodbye: "さようなら"

3. 运行构建命令

在终端中运行以下命令来生成本地化代码:

flutter pub run build_runner build

这将会在 lib/l10n 目录下生成一个 localizations.g.dart 文件,其中包含了自动生成的本地化代码。

4. 使用生成的本地化代码

你可以在你的 Flutter 应用中使用生成的本地化代码。首先,确保在你的 MaterialApp 中设置 localizationsDelegatessupportedLocales

import 'package:flutter/material.dart';
import 'l10n/localizations.g.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: AppLocalizations.localizationsDelegates,
      supportedLocales: AppLocalizations.supportedLocales,
      home: HomePage(),
    );
  }
}

然后,你可以在你的 widget 中使用本地化字符串:

import 'package:flutter/material.dart';
import 'l10n/localizations.g.dart';

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final l10n = AppLocalizations.of(context);
    return Scaffold(
      appBar: AppBar(
        title: Text(l10n.hello),
      ),
      body: Center(
        child: Text(l10n.goodbye),
      ),
    );
  }
}

5. 更新本地化文件

如果你更新了 localizations.yaml 文件,只需要重新运行构建命令即可:

flutter pub run build_runner build

6. 清理生成的文件(可选)

如果你想清理生成的文件,可以运行以下命令:

flutter pub run build_runner clean
回到顶部