Flutter本地化翻译管理插件weblate_sdk的使用
Flutter本地化翻译管理插件weblate_sdk的使用
weblate_sdk
是一个非官方的 SDK,用于在Flutter项目中集成Weblate服务,实现基于Web的持续本地化。以下是关于如何在Flutter项目中配置和使用weblate_sdk
的详细指南。
开始使用
1. 添加依赖
首先,在pubspec.yaml
文件中添加weblate_sdk
包和Flutter本地化支持:
dependencies:
weblate_sdk: latest
flutter_localizations:
sdk: flutter
2. 初始化SDK
接下来,在main.dart
文件中的main
函数里初始化WebLateSdk
:
await WebLateSdk.initialize(
token: 'your token', // 替换为你的token
host: 'your host', // 替换为你的Weblate主机地址,例如'https://weblate.company.link'
projectName: 'name of project', // 替换为你的项目名称
componentName: 'name of component', // 替换为你的组件名称
defaultLanguage: 'en', // 设置默认语言
disableCache: false, // 可选参数,默认情况下禁用缓存(debug模式)或启用缓存(release模式)
cacheLive: const Duration(days: 1), // 可选参数,设置缓存存活时间,默认为2小时
fallbackJson: 'assets/default.json', // 可选参数,设置回退翻译文件路径
);
3. Android设置
确保在build.gradle
中将minSdkVersion
设置为至少19:
defaultConfig {
minSdkVersion 19
}
参数说明
token
: 你的项目Token,可以在Weblate项目API访问设置中创建,并至少设置Languages权限。host
: Weblate主机URL,必须以https://
开头。projectName
: Weblate项目名称。componentName
: 项目的组件名称。defaultLanguage
: 如果当前语言找不到键值,则使用此默认语言。disableCache
: 是否禁用缓存,默认在调试模式下禁用,在发布模式下启用。cacheLive
: 缓存的有效期,默认为2小时。fallbackTranslations
: 回退翻译文件,在SDK未正确初始化或用户无网络连接时使用。
4. 配置MaterialApp
在MaterialApp
中添加对本地化的支持:
supportedLocales: WebLateSdk.supportedLocales,
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
WebLateSdk.delegate,
]
5. 使用本地化字符串
在代码中使用context.localizedValueOf('key')
来获取已本地化的字符串。如果需要格式化,可以这样做:
context.localizedValueOf('key', format: ['John Doe']);
注意:对于需要替换的部分,应该用大括号括起来,例如'Welcome {username}!'
。
示例代码
下面是一个完整的示例应用,展示了如何在Flutter应用中使用weblate_sdk
进行本地化:
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:weblate_sdk/weblate_sdk.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await WebLateSdk.initialize(
token: 'your token',
host: 'your host',
projectName: 'name of project',
componentName: 'name of component',
defaultLanguage: 'en',
disableCache: false,
cacheLive: const Duration(days: 1),
fallbackJson: 'assets/default.json',
);
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return MaterialApp(
supportedLocales: WebLateSdk.supportedLocales,
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
WebLateSdk.delegate,
],
home: WebLateSdk.isSDKInitialized
? const HomeScreen()
: const InitializationErrorScreen(),
);
}
}
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(context.localizedValueOf('tab_home')),
),
extendBodyBehindAppBar: true,
body: Center(
child: Text(
context.localizedValueOf(
'test_welcoming',
format: ['John Doe'],
),
),
),
);
}
}
class InitializationErrorScreen extends StatelessWidget {
const InitializationErrorScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Initialization Error'),
),
body: const Padding(
padding: EdgeInsets.all(8.0),
child: Center(
child: Text(
'Running app first time?\nPlease check your internet connection and try again.',
textAlign: TextAlign.center,
),
),
),
);
}
}
请根据实际情况调整上述代码中的占位符(如your token
、your host
等),并确保按照文档中的提示完成所有必要的配置。此外,请不要忘记为各个平台添加互联网权限。如果你有任何建议或发现了bug,可以通过GitHub Issues向开发者反馈。
更多关于Flutter本地化翻译管理插件weblate_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter本地化翻译管理插件weblate_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter项目中管理本地化翻译时,使用Weblate SDK可以大大提高效率。Weblate 是一个开源的 Web 界面,用于翻译文件,它支持多种文件格式和版本控制系统。虽然 Weblate 本身并不直接提供一个官方的 Flutter SDK,但你可以通过其 API 来实现与 Weblate 的集成,以管理应用的本地化翻译。
以下是一个示例,展示了如何在 Flutter 中使用 Weblate 的 REST API 来管理本地化翻译。这个示例将包括基本的 HTTP 请求来获取和更新翻译。
前提条件
- 确保你已经在 Weblate 上设置好了你的项目,并获取了必要的 API 密钥。
- 确保你的 Flutter 项目已经设置好基本的国际化支持。
步骤
-
添加依赖
在你的
pubspec.yaml
文件中添加http
依赖,用于发送 HTTP 请求。dependencies: flutter: sdk: flutter http: ^0.13.3 # 确保使用最新版本
-
创建 Weblate 服务类
创建一个新的 Dart 文件(例如
weblate_service.dart
),用于封装与 Weblate 的交互逻辑。import 'package:http/http.dart' as http; import 'dart:convert'; class WeblateService { private static const String baseUrl = 'https://your-weblate-instance.org/api/projects/your-project/translations/'; private static const String apiKey = 'your-api-key'; private final http.Client client; WeblateService(this.client); Future<List<dynamic>> getTranslations(String lang) async { final response = await client.get( Uri.parse('$baseUrl$lang/'), headers: { 'Authorization': 'Token $apiKey', 'Content-Type': 'application/json', }, ); if (response.statusCode == 200) { return jsonDecode(response.body) as List<dynamic>; } else { throw Exception('Failed to fetch translations'); } } Future<void> updateTranslation(String lang, String unitId, String content) async { final url = Uri.parse('$baseUrl$lang/units/$unitId/'); final body = jsonEncode({'string': content}); final response = await client.put( url, headers: { 'Authorization': 'Token $apiKey', 'Content-Type': 'application/json', }, body: Body.fromJson(body), ); if (response.statusCode != 200) { throw Exception('Failed to update translation'); } } }
-
使用 Weblate 服务
在你的 Flutter 应用中,你可以通过实例化
WeblateService
类来使用上述方法。例如,在一个按钮点击事件中获取翻译或更新翻译。import 'package:flutter/material.dart'; import 'weblate_service.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Weblate SDK Example'), ), body: Center( child: WeblateExample(), ), ), ); } } class WeblateExample extends StatefulWidget { @override _WeblateExampleState createState() => _WeblateExampleState(); } class _WeblateExampleState extends State<WeblateExample> { final http.Client client = http.Client(); final WeblateService weblateService = WeblateService(client); @override Widget build(BuildContext context) { return Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ ElevatedButton( onPressed: () async { try { final translations = await weblateService.getTranslations('en'); print(translations); } catch (e) { print(e); } }, child: Text('Get Translations'), ), ElevatedButton( onPressed: () async { try { await weblateService.updateTranslation('en', 'unit-id', 'New Translation Content'); print('Translation updated'); } catch (e) { print(e); } }, child: Text('Update Translation'), ), ], ); } @override void dispose() { client.close(); super.dispose(); } }
注意
- 替换
your-weblate-instance.org
、your-project
和your-api-key
为你的实际 Weblate 实例信息。 - 确保你的 Weblate 实例启用了 API,并且你有足够的权限来执行所需的操作。
- 根据你的实际需求,你可能需要调整 API 调用和错误处理逻辑。
通过上述步骤,你可以在 Flutter 应用中集成 Weblate 的本地化翻译管理功能。