Flutter本地化管理插件katana_localization的使用
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
- 从模板复制表格到自己的Google Drive。
- 在复制的表格中,点击
File
->Share
->Share with others
。 - 在弹出窗口中将
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
更多关于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.json
和zh.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应用的本地化管理。从依赖添加、语言文件创建、配置到实际使用,这些步骤可以帮助你快速集成多语言支持。请注意,实际应用中你可能还需要处理语言选择的持久化存储等问题。