Flutter插件flutter_ditto的介绍与使用
Flutter插件flutter_ditto的介绍与使用
Flutter_ditto
该插件旨在提供与Dittowords本地化集成的简单方法,类似于React中的ditto-react
。
支持的功能
- ✅ OTA(Over-the-Air)更新翻译
- ✅ 带有复数的翻译
- ✅ 带有变量的翻译
快速开始
要将Ditto集成到您的应用中,只需用DittoMaterialApp
替换当前的MaterialApp
。
分离初始化
您可以将DittoStore
的初始化与DittoMaterialApp
分开进行:
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化 DittoStore
await DittoStore().initialize(
configs: DittoConfigData.base(
projectId: '<YOUR_PROJECT_ID>',
apiKey: '<YOUR_API_KEY>',
),
);
runApp(const MyApp());
}
class _MyAppState extends State<MyApp> {
[@override](/user/override)
Widget build(BuildContext context) {
return DittoMaterialApp(
title: 'Ditto 测试',
fallbackLocale: const Locale('en'),
home: const MyHomePage(),
);
}
}
集成初始化
也可以让DittoMaterialApp
组件直接处理DittoStore
的初始化,通过传递DittoConfigData
实现:
class _MyAppState extends State<MyApp> {
[@override](/user/override)
Widget build(BuildContext context) {
return DittoMaterialApp(
title: 'Ditto 测试',
fallbackLocale: const Locale('en'),
home: const MyHomePage(),
configData: DittoConfigData.base(
projectId: '<YOUR_PROJECT_ID>',
apiKey: '<YOUR_API_KEY>',
),
loadingPlaceholder: Container(
color: Theme.of(context).primaryColor,
child: const Center(
child: CircularProgressIndicator(color: Colors.white),
),
),
);
}
}
翻译
在包裹了DittoMaterialApp
后,您可以使用String.translate()
扩展方法来翻译文本。
示例代码
简单翻译
'simple_key'.translate()
带变量的翻译
'variable_key'.translate({'var_name': 'var_value'})
// 如果想隐藏变量,可以传入 `null`
'variable_key'.translate({'var_name': null})
带复数的翻译
'plural_key'.translate({'var_name': 'var_value'}, 2)
完整示例代码
以下是一个完整的示例代码,展示了如何使用flutter_ditto
插件:
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_ditto/api/configs/config_data.dart';
import 'package:flutter_ditto/flutter_ditto.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
runApp(
InheritedDitto(
config: DittoConfigData(
projectId: '<YOUR-PROJECT-ID>',
apiKey: '<YOUR-API-KEY>',
),
onlyNetworkLabels: true,
defaultLocale: const Locale('it'),
loadingWidget: const Center(child: CircularProgressIndicator()),
child: const MyApp(),
),
);
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Ditto 测试',
localizationsDelegates: [
InheritedDitto.of(context).localizationsDelegate,
...defaultDelegates,
],
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _emailNotifier = ValueNotifier<String?>(null);
final _clickedNotifier = ValueNotifier<int>(0);
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('appbar_title'.translate(context)),
),
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
decoration: InputDecoration(
hintText: 'hint_email'.translate(context),
),
onChanged: (value) => _emailNotifier.value = value,
),
TextField(
decoration: InputDecoration(
hintText: 'text.hint.password'.translate(context),
),
),
ValueListenableBuilder<String?>(
valueListenable: _emailNotifier,
builder: (context, snap, _) => Visibility(
visible: snap != null && snap.isNotEmpty,
child: Padding(
padding: const EdgeInsets.only(top: 20),
child: Text(
'text_inserted_email'
.translate(context, variables: {'email': snap ?? '-'}),
),
),
),
),
const SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () =>
_clickedNotifier.value = _clickedNotifier.value + 1,
child: const Text('+'),
),
const SizedBox(width: 10),
ElevatedButton(
onPressed: () =>
_clickedNotifier.value = max(0, _clickedNotifier.value - 1),
child: const Text('-'),
),
],
),
ValueListenableBuilder<int>(
valueListenable: _clickedNotifier,
builder: (context, data, _) => Text(
'text_clicked'
.translate(context, variables: {'count': data.toString()}, count: data),
),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () {},
child: Text('button.login'.translate(context)),
),
],
),
),
);
}
}
更多关于Flutter插件flutter_ditto的介绍与使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter插件flutter_ditto的介绍与使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_ditto
是一个用于 Flutter 的插件,它主要用于帮助开发者在应用程序中实现多语言支持(国际化)。通过 flutter_ditto
,你可以轻松地管理和切换应用程序中的不同语言资源,而无需手动处理复杂的字符串映射和语言切换逻辑。
主要功能
- 多语言支持:
flutter_ditto
允许你为应用程序定义多种语言的字符串资源,并在运行时动态切换语言。 - 动态更新:你可以在不重启应用程序的情况下更新语言资源。
- 简单易用:通过简单的 API,你可以轻松地获取和显示不同语言的字符串。
- 与 Flutter 集成:
flutter_ditto
与 Flutter 的Localizations
和MaterialApp
无缝集成,使得多语言支持更加方便。
安装
首先,你需要在 pubspec.yaml
文件中添加 flutter_ditto
依赖:
dependencies:
flutter:
sdk: flutter
flutter_ditto: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
基本用法
-
初始化 Ditto: 在应用程序的入口处初始化
flutter_ditto
,并加载语言资源。import 'package:flutter_ditto/flutter_ditto.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Ditto.initialize( apiKey: 'YOUR_API_KEY', // 你的 Ditto API Key projectId: 'YOUR_PROJECT_ID', // 你的项目 ID ); runApp(MyApp()); }
-
定义语言资源: 在 Ditto 平台上定义你的语言资源,并确保它们与你的项目 ID 关联。
-
使用 Ditto 获取字符串: 在应用程序中使用
Ditto.of(context).get('key')
来获取特定语言的字符串。import 'package:flutter/material.dart'; import 'package:flutter_ditto/flutter_ditto.dart'; class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text(Ditto.of(context).get('app_title')), ), body: Center( child: Text(Ditto.of(context).get('welcome_message')), ), ), ); } }
-
切换语言: 你可以通过
Ditto.setLocale
方法来动态切换语言。Ditto.setLocale('en'); // 切换到英语 Ditto.setLocale('es'); // 切换到西班牙语
高级用法
-
自定义语言资源: 你可以在 Ditto 平台上自定义语言资源,并通过 API 动态加载它们。
-
监听语言变化: 你可以使用
Ditto.addListener
来监听语言变化,并在语言切换时更新 UI。Ditto.addListener(() { // 语言变化时更新 UI });