Flutter国际化插件tolgee的使用
Flutter国际化插件Tolgee的使用
Tolgee是一个多平台的Flutter SDK,用于Tolgee本地化平台。通过Tolgee,您可以轻松地为您的Flutter应用添加国际化支持。以下是关于如何使用Tolgee插件的完整示例demo。
1. 注册并创建项目
首先,您需要在Tolgee官网注册一个账号,并创建一个新的项目。这将为您提供一个API密钥和API URL,稍后在初始化SDK时会用到。
2. 初始化Tolgee SDK
在main.dart
文件中初始化Tolgee SDK。如果您提供了apiKey
和apiUrl
,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. 使用TranslationText
和TranslationWidget
显示翻译文本
Tolgee提供了两种方式来显示翻译文本:TranslationText
和TranslationWidget
。TranslationText
是一个简单的文本小部件,而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,可以在初始化时不提供apiKey
和apiUrl
:
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
更多关于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的官方文档来更新和调整代码。