Flutter国际化插件tolgee的使用

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

Flutter国际化插件Tolgee的使用

Tolgee是一个多平台的Flutter SDK,用于Tolgee本地化平台。通过Tolgee,您可以轻松地为您的Flutter应用添加国际化支持。以下是关于如何使用Tolgee插件的完整示例demo。

1. 注册并创建项目

首先,您需要在Tolgee官网注册一个账号,并创建一个新的项目。这将为您提供一个API密钥和API URL,稍后在初始化SDK时会用到。

2. 初始化Tolgee SDK

main.dart文件中初始化Tolgee SDK。如果您提供了apiKeyapiUrl,SDK将从Tolgee平台获取翻译内容。如果没有提供这些参数,SDK将默认以静态模式运行,从lib/tolgee/目录读取翻译文件。

import 'package:tolgee/tolgee.dart';

Future<void> main() async {
  // 初始化Tolgee。如果未提供apiKey和apiUrl,
  // 应用将以静态模式初始化。
  // 翻译内容将从`lib/tolgee/`目录读取。
  await Tolgee.init(
    apiKey: const String.fromEnvironment('TOLGEE_API_KEY'),
    apiUrl: const String.fromEnvironment('TOLGEE_API_URL'),
  );

  runApp(const MyApp());
}

3. 使用TranslationTextTranslationWidget显示翻译文本

Tolgee提供了两种方式来显示翻译文本:TranslationTextTranslationWidgetTranslationText是一个简单的文本小部件,而TranslationWidget则允许您使用自定义的构建器函数来动态生成翻译内容。

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<Locale> supportedLocales = Tolgee.supportedLocales.toList();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: Tolgee.baseLocale.languageCode,
      localizationsDelegates: Tolgee.localizationDelegates,
      supportedLocales: Tolgee.supportedLocales,
      locale: supportedLocales.first,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: TranslationWidget(
            builder: (context, tr) => Text(
              tr('title'), // 显示标题的翻译
            ),
          ),
        ),
        body: SafeArea(
          child: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.end,
                    children: [
                      for (var locale in supportedLocales)
                        OutlinedButton(
                          onPressed: () {
                            setState(() {
                              Tolgee.setCurrentLocale(locale); // 切换语言
                            });
                          },
                          child: Text(locale.languageCode), // 显示语言代码
                        ),
                    ].divided(width: 8), // 添加间距
                  ),
                ),
                const Spacer(),
                const Text('static text'), // 静态文本
                const Divider(),
                const TranslationText('title'), // 显示标题的翻译
                const Divider(),
                TranslationWidget(
                  builder: (context, tr) => Column(
                    children: [
                      Text(
                        tr('title'), // 显示标题的翻译
                      ),
                      Text(
                        tr('subtitle', {'name': 'John'}), // 显示带有参数的翻译
                      ),
                    ],
                  ),
                ),
                const Divider(),
                TranslationWidget(builder: (context, tr) {
                  return OutlinedButton(
                    onPressed: () {
                      ScaffoldMessenger.of(context).showSnackBar(
                        const SnackBar(
                          content: Text('Clicked!'), // 显示点击提示
                          duration: Duration(milliseconds: 1000),
                        ),
                      );
                    },
                    child: Text(
                      tr('button'), // 显示按钮的翻译
                    ),
                  );
                }),
                const Spacer(),
              ],
            ),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () => Tolgee.highlightTolgeeWidgets(), // 高亮Tolgee小部件
          tooltip: 'Toggle',
          child: const Icon(Icons.swap_horizontal_circle_outlined),
        ),
      ),
    );
  }
}

4. 运行应用

当您运行应用时,Tolgee会从Tolgee平台获取翻译内容并显示在应用中。您还可以使用Tolgee.highlightTolgeeWidgets()方法高亮显示使用Tolgee SDK的小部件,并直接从应用中添加或修改翻译内容。

5. 导出翻译文件

您可以通过Tolgee平台导出翻译文件,并将其添加到lib/tolgee/目录中。这样即使在离线状态下,应用也可以使用这些翻译文件。您需要在pubspec.yaml文件中添加以下配置:

flutter:
  assets:
    - lib/tolgee/

6. 静态模式

如果您希望以静态模式使用Tolgee SDK,可以在初始化时不提供apiKeyapiUrl

import 'package:tolgee/tolgee.dart';

Future<void> main() async {
  // 以静态模式初始化Tolgee
  await Tolgee.init();

  runApp(const MyApp());
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用Tolgee国际化插件的示例代码。Tolgee是一个现代化的国际化(i18n)管理工具,可以帮助开发者轻松管理和应用多语言支持。以下是如何在Flutter项目中集成和使用Tolgee的示例。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加Tolgee的依赖。不过,请注意,截至我最后更新的时间(2023年),Flutter官方插件库中可能没有直接的Tolgee插件。因此,你可能需要通过HTTP请求与Tolgee API进行交互。以下示例将使用http包来与Tolgee后端通信。

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.4  # 确保使用最新版本

2. 导入包

在你的Dart文件中导入必要的包:

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

3. 配置Tolgee API

你需要在Tolgee后台获取你的项目API密钥和项目ID。然后,你可以使用这些凭据来配置API请求。

class TolgeeService {
  final String apiKey;
  final String projectId;
  final String baseUrl = 'https://api.tolgee.io/v2';

  TolgeeService({required this.apiKey, required this.projectId});

  Future<Map<String, String>> fetchTranslations(String languageCode) async {
    final url = '$baseUrl/projects/$projectId/translations?languageCode=$languageCode';
    final headers = {
      'Authorization': 'Bearer $apiKey',
      'Content-Type': 'application/json',
    };

    final response = await http.get(Uri.parse(url), headers: headers);

    if (response.statusCode == 200) {
      final body = jsonDecode(response.body) as Map<String, dynamic>;
      final translations = body['data']['translations'] as Map<String, dynamic>;
      return translations.mapKeysValues((key, value) => MapEntry(key, value['message']));
    } else {
      throw Exception('Failed to load translations');
    }
  }
}

4. 使用翻译

在你的Flutter应用中,你可以创建一个Localizations委托来处理翻译。以下是一个简单的实现:

class TolgeeLocalizations {
  final Map<String, String> translations;

  TolgeeLocalizations(this.translations);

  String translate(String key) {
    return translations[key] ?? key; // 如果找不到翻译,返回key本身
  }
}

class TolgeeLocalizationsDelegate extends LocalizationsDelegate<TolgeeLocalizations> {
  final TolgeeService tolgeeService;
  final String languageCode;

  TolgeeLocalizationsDelegate({required this.tolgeeService, required this.languageCode});

  @override
  Future<TolgeeLocalizations> load(Locale locale) async {
    final translations = await tolgeeService.fetchTranslations(languageCode);
    return TolgeeLocalizations(translations);
  }

  @override
  bool isSupported(Locale locale) => true; // 假设支持所有语言

  @override
  bool shouldReload(covariant LocalizationsDelegate<TolgeeLocalizations> oldDelegate) {
    return false; // 根据需要实现重载逻辑
  }
}

5. 应用本地化

在你的MaterialApp中使用TolgeeLocalizationsDelegate

void main() {
  final tolgeeService = TolgeeService(apiKey: 'YOUR_API_KEY', projectId: 'YOUR_PROJECT_ID');
  runApp(MyApp(tolgeeService: tolgeeService));
}

class MyApp extends StatelessWidget {
  final TolgeeService tolgeeService;

  MyApp({required this.tolgeeService});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      locale: Locale('en'), // 初始语言,可以从用户设置获取
      localizationsDelegates: [
        TolgeeLocalizationsDelegate(tolgeeService: tolgeeService, languageCode: 'en'),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('en'),
        // 添加更多支持的语言
      ],
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final tolgee = Localizations.of<TolgeeLocalizations>(context, TolgeeLocalizations)!;
    return Scaffold(
      appBar: AppBar(
        title: Text(tolgee.translate('app_title')), // 假设你在Tolgee中有'app_title'的翻译
      ),
      body: Center(
        child: Text(tolgee.translate('welcome_message')), // 假设你有'welcome_message'的翻译
      ),
    );
  }
}

这个示例展示了如何在Flutter应用中集成Tolgee进行国际化。请注意,由于Tolgee的具体API和实现可能会有所变化,因此你可能需要参考Tolgee的官方文档来更新和调整代码。

回到顶部