Flutter语言辅助插件language_helper的功能使用

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

Flutter语言辅助插件language_helper的功能使用

描述

language_helper 是一个用于Flutter应用的多语言工具,它具有高效的生成器和自定义的GPT-4翻译器,可以轻松实现应用的本地化。以下是它的主要功能和使用方法。

功能特性

核心功能

  • 自动设备语言:首次打开应用时,自动使用当前设备的语言(如果可能)。
  • 文本翻译控制:通过LanguageConditions完全控制翻译文本。
  • 缺失文本分析:支持分析特定语言中缺少的文本或在应用中存在但在语言数据中不存在的文本。
  • 快速提取文本:从所有.dart文件中提取需要翻译的文本,不依赖于build_runner或自定义解析器,非常快速可靠。
  • 集成GPT-4翻译器:提供一个基于Chat GPT-4的翻译助手,方便将语言数据翻译成目标语言。

设置与使用

安装配置

  1. 添加language_helper到项目

    使用命令行安装包:

    flutter pub add language_helper
    
  2. 开发期间初始化空的LanguageHelper

    main.dart中初始化LanguageHelper

    final languageHelper = LanguageHelper.instance;
    
    main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await languageHelper.initial(data: []);
      runApp(const MyApp());
    }
    
  3. 为需要的字符串添加.tr.trP

    • 普通翻译:
      Text('Translate this text'.tr)
      
    • 带参数的翻译:
      Text('Hello @{name}'.trP({'name': name}))
      
    • 复数形式:
      Text('We have @{number} dollar'.trP({'number': number}))
      
  4. iOS配置

    修改Infi.plist以支持特定语言:

    <key>CFBundleLocalizations</key>
    <array>
       <string>en</string>
       <string>vi</string>
    </array>
    

生成器工作流

Dart Map

  • 生成代码

    dart run language_helper:generate
    

    默认生成路径如下:

    |-- .lib
    |   |--- resources
    |   |    |--- language_helper
    |   |    |    |--- language_data.dart
    |   |    |    |--- languages
    |   |    |    |    |--- _generated.dart   ; This file will be overwritten when re-generating
    
  • 添加到项目

    final languageHelper = LanguageHelper.instance;
    final languageDataProvider = LanguageDataProvider.data(languageData);
    
    main() async {
      await languageHelper.initial(
          data: [languageDataProvider],
      );
    
      runApp(const MyApp());
    }
    

JSON格式

  • 生成JSON文件

    dart run language_helper:generate --json
    

    文件结构如:

    |-- assets
    |   |--- resources
    |   |    |--- language_helper
    |   |    |    |--- codes.json
    |   |    |    |--- languages
    |   |    |    |    |--- _generated.json ; This file will be overwritten when re-generating
    
  • 加载JSON资源

    final languageHelper = LanguageHelper.instance;
    final languageDataProvider = LanguageDataProvider.asset('assets/resources');
    
    main() async {
      await languageHelper.initial(
          data: [languageDataProvider],
      );
    
      runApp(const MyApp());
    }
    

手动流程

创建翻译数据

  • Dart Map示例

    final en = {
      'Translate this text': 'Translate this text',
      'Hello @{name}': 'Hello @{name}',
      'We have @{number} dollar': LanguageConditions(
        param: 'number',
        conditions: {
          '0': 'We have zero dollar',
          '1': 'We have one dollar',
          '_': 'We have @{number} dollars', // 默认值
        }
      ),
    };
    
    const vi = {
      'Translate this text': 'Dịch chữ này',
      'Hello @{name}': 'Xin chào @{name}',
      'We have @{number} dollar': 'Chúng ta có @{number} đô-la', 
    };
    
    LanguageData languageData = {
      LanguageCodes.en: en,
      LanguageCodes.vi: vi,
    };
    
  • JSON格式

    • codes.json包含所有语言代码。
    • 各个语言的具体翻译文件,如en.jsonvi.json等。

使用LanguageBuilder更新字符串

MaterialApp中:

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

  @override
  Widget build(BuildContext context) {
    return LanguageBuilder(
      builder: (context) {
        return MaterialApp(
          localizationsDelegates: languageHelper.delegates,
          supportedLocales: languageHelper.locales,
          locale: languageHelper.locale,
          home: const HomePage(),
        );
      }
    );
  }
}

在组件中:

LanguageBuilder(
    builder: (context) {
        return Scaffold(
          body: Column(
            children: [
              Text('Hello @{name}'.tr),
              Text('We have @{number} dollar'.tr),
            ],
          ),
        );
    },
),

或者更简洁的方式:

Tr((_) => Text('Hello @{name}'.tr)),

控制翻译行为

更改语言

languageHelper.change(LanguageCodes.vi);

添加新的语言数据

languageHelper.addData(LanguageDataProvider.data(newLanguageData));

获取支持的语言列表

final codes = languageHelper.codes; // 包含所有支持的语言代码

监听语言变化

final sub = languageHelper.stream.listen((code) => print(code));
// 不再使用时记得取消订阅以防止内存泄漏
sub.cancel();

分析翻译状态

languageHelper.analyze();

此功能会在initial初始化时自动调用(仅当isDebug=true时)。

高级生成器选项

可以通过命令行参数修改输入输出路径:

dart run language_helper:generate --path=./lib --output=./lib/resources

也可以将LanguageData导出为JSON:

void main() {
  test('', () {
    languageData.exportJson('./assets/resources');
  });
}

数据序列化

LanguageData转换为JSON:

final json = data.toJson();

从JSON转换回LanguageData

final data = LanguageDataSerializer.fromJson(json);

自定义GPT-4翻译器

利用提供的模板向Language Helper Translator发送待翻译内容,并确保保持原有的键名和注释格式不变。

其他信息

  • 应用会尝试使用设备的默认语言设置作为初始语言;若无法获取,则采用第一个可用语言。
  • 插件优化了性能,只重建最外层的LanguageBuilder,除非特别指定了forceRebuild=true
  • 支持多种参数占位符语法(如@{param}),确保翻译过程中正确处理变量替换。

示例代码

完整示例请参阅GitHub仓库中的example/lib/main.dart,该文件展示了如何结合上述功能创建一个多语言支持的应用程序。


更多关于Flutter语言辅助插件language_helper的功能使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter语言辅助插件language_helper的功能使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,作为一个IT专家,下面我将通过代码示例来展示如何在Flutter项目中使用language_helper插件来实现语言辅助功能。假设language_helper是一个虚构的插件,用于国际化和本地化应用中的文本。在实际项目中,你可能需要使用一个真实存在的插件,比如flutter_localizations,但这里我们将基于language_helper的概念来展示。

首先,确保你已经在pubspec.yaml文件中添加了language_helper依赖:

dependencies:
  flutter:
    sdk: flutter
  language_helper: ^x.y.z  # 替换为实际版本号

然后运行flutter pub get来获取依赖。

接下来,我们将展示如何使用这个插件来设置和获取本地化文本。

1. 初始化插件

在你的应用入口文件(通常是main.dart)中初始化language_helper插件:

import 'package:flutter/material.dart';
import 'package:language_helper/language_helper.dart';  // 假设这是插件的导入路径

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化插件,假设有一个全局的initialize方法
  LanguageHelper.initialize();

  runApp(MyApp());
}

2. 设置支持的语言

在应用的某个地方(可能是设置页面),你可以让用户选择语言:

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

class SettingsPage extends StatefulWidget {
  @override
  _SettingsPageState createState() => _SettingsPageState();
}

class _SettingsPageState extends State<SettingsPage> {
  List<String> languages = ['en', 'zh', 'fr'];  // 支持的语言列表

  void _changeLanguage(String languageCode) {
    // 假设插件有一个方法来设置语言
    LanguageHelper.setLocale(Locale(languageCode));
    // 更新应用状态,可能需要重新构建UI
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Settings'),
      ),
      body: ListView.builder(
        itemCount: languages.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(languages[index].toUpperCase()),
            onTap: () => _changeLanguage(languages[index]),
          );
        },
      ),
    );
  }
}

3. 获取本地化文本

在你的应用中,你可以使用LanguageHelper来获取本地化的文本:

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

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    String welcomeMessage = LanguageHelper.translate('welcome_message');

    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Center(
        child: Text(welcomeMessage),
      ),
    );
  }
}

4. 提供翻译资源

通常,插件会有一个方法来加载翻译文件。假设language_helper允许你通过JSON文件提供翻译:

// en.json
{
  "welcome_message": "Welcome"
}

// zh.json
{
  "welcome_message": "欢迎"
}

在初始化插件时,你可能需要加载这些文件:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 加载翻译文件
  LanguageHelper.loadTranslations({
    'en': 'assets/translations/en.json',
    'zh': 'assets/translations/zh.json',
    // 更多语言...
  });

  LanguageHelper.initialize();

  runApp(MyApp());
}

注意

请注意,上述代码是基于假设的language_helper插件的功能。在实际项目中,你需要查阅插件的官方文档来了解如何正确初始化和使用它。Flutter社区中常用的国际化插件是flutter_localizations,它配合intl包使用,提供了强大的本地化支持。

希望这些示例代码能帮助你理解如何在Flutter应用中使用语言辅助插件。如果有任何进一步的问题,请随时询问!

回到顶部