Flutter本地化管理插件katana_localization的使用

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

Flutter本地化管理插件katana_localization的使用

katana_localization 是一个用于Flutter应用的本地化管理插件,它简化了多语言支持的实现。本文将详细介绍如何使用该插件进行本地化管理。

安装

首先,在你的项目中添加以下依赖项:

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

前期准备

使用Google Spreadsheets

  1. 模板复制表格到自己的Google Drive。
  2. 在复制的表格中,点击 File -> Share -> Share with others
  3. 在弹出窗口中将 General access 改为 Anyone with the link

如何编写Google Spreadsheet

  • 左侧第一列是键(key),每个键对应的翻译文本根据语言在第二行之后的单元格中定义。
  • 如果键以 # 开头,则该行不会被读取,可用于注释。
  • 可以通过 {variable_name} 来嵌入变量,并在翻译文本中使用相同的 {variable_name} 来显示值。

实现

定义文件创建

创建一个如 localization.dart 的Dart文件,并导入生成的部分文件:

// 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

main.dart 中注册翻译数据:

// 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",
          home: HomePage(),
        );
      },
    );
  }
}

自动生成代码

执行以下命令来自动生成代码:

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

如果需要清除缓存并重新生成代码,可以运行:

flutter pub run build_runner clean

使用

获取翻译文本

通过调用 AppLocalize 对象的方法来获取翻译对象:

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

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

获取和更改当前语言

可以通过 locale 属性获取当前语言,并通过 setCurrentLocale 方法更改语言:

print(l.locale); // 获取当前语言

l.setCurrentLocale(Locale('ja')); // 更改为日语

示例Demo

下面是一个完整的示例代码:

// main.dart

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

part 'main.localize.dart';

final l = AppLocalize();

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

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

class MyApp extends StatelessWidget {
  const MyApp({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(),
          home: MainPage(),
          title: "Flutter Demo",
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
        );
      },
    );
  }
}

class MainPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(l().appTitle)),
      body: ListView(
        children: [
          ListTile(
            title: Text(l.locale.toLanguageTag()),
          ),
          ListTile(
            title: Text(l().ok),
          ),
          ListTile(
            title: Text(l().cancel),
          ),
          ListTile(
            title: Text(
              l().$(l().$(l().process).of.$(l().data)).hasBeenCompleted,
            ),
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        child: const Icon(Icons.change_circle),
        onPressed: () {
          l.setCurrentLocale(
            l.supportedLocales().firstWhere((element) => element != l.locale),
          );
        },
      ),
    );
  }
}

通过上述步骤,您可以轻松地在Flutter应用中集成多语言支持,并利用Google Spreadsheets进行高效的翻译管理。


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用katana_localization插件进行本地化管理的代码示例。katana_localization是一个方便的工具,用于管理Flutter应用中的多语言支持。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  katana_localization: ^最新版本号  # 请替换为实际的最新版本号

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

2. 创建语言文件

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

assets/locales/en.json:

{
  "welcome_message": "Welcome",
  "goodbye_message": "Goodbye"
}

assets/locales/zh.json:

{
  "welcome_message": "欢迎",
  "goodbye_message": "再见"
}

3. 配置pubspec.yaml

pubspec.yaml中声明你的语言文件资源:

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

4. 初始化KatanaLocalization

在你的main.dart文件中,初始化KatanaLocalization并设置默认语言。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return KatanaLocalization(
      supportedLocales: [Locale('en'), Locale('zh')],
      fallbackLocale: Locale('en'),
      assetLoader: () async {
        return {
          'en': await rootBundle.loadString('assets/locales/en.json'),
          'zh': await rootBundle.loadString('assets/locales/zh.json'),
        };
      },
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: MyHomePage(),
        localizationsDelegates: [
          KatanaLocalizations.delegate,
          GlobalMaterialLocalizations.delegate,
          GlobalWidgetsLocalizations.delegate,
        ],
        supportedLocales: [Locale('en'), Locale('zh')],
        locale: Locale('en'), // 默认语言
        onGenerateRoute: (settings) {
          // 你可以在这里根据路由设置语言,如果需要的话
          return MaterialPageRoute(builder: (context) => MyHomePage());
        },
      ),
    );
  }
}

5. 使用本地化文本

在你的页面或组件中使用KatanaLocalizations.of(context)来获取本地化文本。

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

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    final localizations = KatanaLocalizations.of(context);
    return Scaffold(
      appBar: AppBar(
        title: Text(localizations.translate('welcome_message')),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              localizations.translate('welcome_message'),
              style: TextStyle(fontSize: 24),
            ),
            ElevatedButton(
              onPressed: () {
                // 切换语言示例,这里只是简单切换,实际应用中可能需要持久化语言选择
                KatanaLocalization.of(context).setLocale(Locale('zh'));
                // 或者你可以使用 Navigator.pushNamedAndRemoveUntil 来替换整个 MaterialApp
              },
              child: Text(localizations.translate('goodbye_message')),
            ),
          ],
        ),
      ),
    );
  }
}

以上代码展示了如何使用katana_localization插件进行Flutter应用的本地化管理。从依赖添加、语言文件创建、配置到实际使用,这些步骤可以帮助你快速集成多语言支持。请注意,实际应用中你可能还需要处理语言选择的持久化存储等问题。

回到顶部