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

1 回复

更多关于Flutter插件flutter_ditto的介绍与使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_ditto 是一个用于 Flutter 的插件,它主要用于帮助开发者在应用程序中实现多语言支持(国际化)。通过 flutter_ditto,你可以轻松地管理和切换应用程序中的不同语言资源,而无需手动处理复杂的字符串映射和语言切换逻辑。

主要功能

  1. 多语言支持flutter_ditto 允许你为应用程序定义多种语言的字符串资源,并在运行时动态切换语言。
  2. 动态更新:你可以在不重启应用程序的情况下更新语言资源。
  3. 简单易用:通过简单的 API,你可以轻松地获取和显示不同语言的字符串。
  4. 与 Flutter 集成flutter_ditto 与 Flutter 的 LocalizationsMaterialApp 无缝集成,使得多语言支持更加方便。

安装

首先,你需要在 pubspec.yaml 文件中添加 flutter_ditto 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_ditto: ^1.0.0  # 请使用最新版本

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

基本用法

  1. 初始化 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());
    }
    
  2. 定义语言资源: 在 Ditto 平台上定义你的语言资源,并确保它们与你的项目 ID 关联。

  3. 使用 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')),
            ),
          ),
        );
      }
    }
    
  4. 切换语言: 你可以通过 Ditto.setLocale 方法来动态切换语言。

    Ditto.setLocale('en');  // 切换到英语
    Ditto.setLocale('es');  // 切换到西班牙语
    

高级用法

  1. 自定义语言资源: 你可以在 Ditto 平台上自定义语言资源,并通过 API 动态加载它们。

  2. 监听语言变化: 你可以使用 Ditto.addListener 来监听语言变化,并在语言切换时更新 UI。

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