Flutter本地化翻译加载插件translations_loader的使用
Flutter本地化翻译加载插件translations_loader的使用
简介
translations_loader
是一个简单的库,用于从资源文件夹加载翻译。该库应与 GetX
或类似的框架一起使用,因为它仅将文件加载为 <code>Map<String, String></code>
。
支持的文件格式
json
properties
特性
- 简化的国际化
- 支持
json
和properties
文件 - 所有键从 JSON 文件转换为
object1.object2.value
,以便它们与properties
文件相同
配置步骤
首先,你需要在 pubspec.yaml
文件中配置资源文件夹:
flutter:
uses-material-design: true
assets:
- assets/i18n/
在该文件夹中放置所有翻译文件。该库不使用 Locale
的 countryCode
,仅使用 languageCode
。
例如:
en.json
{
"app": {
"name": "Test application",
"version": "1",
"bar": {
"title": "My title"
}
}
}
hr.properties
app.name=Testna aplikacija
app.version=1
app.bar.title=Moj naslov
使用方法
要获取翻译,只需使用 TranslationsLoader
类中的静态方法 loadTranslations
。例如:TranslationsLoader.loadTranslations("assets/i18n")
。
要将此库与 GetX
库一起使用,需要实现 Translations
类:
class ApplicationTranslations extends Translations {
final Map<String, Map<String, String>> _translationKeys;
ApplicationTranslations(this._translationKeys);
[@override](/user/override)
Map<String, Map<String, String>> get keys => _translationKeys;
}
然后可以在设置 GetMaterialApp
时使用它:
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
runApp(GetMaterialApp(
translations: ApplicationTranslations(
await TranslationsLoader.loadTranslations("assets/i18n"),
),
locale: Get.deviceLocale,
fallbackLocale: defaultLocale,
supportedLocales: supportedLocales,
localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
home: const MyHomePage(),
));
}
示例代码
以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:get/get.dart';
import 'package:translations_loader/translations_loader.dart';
const defaultLocale = Locale("en", "US");
const supportedLocales = [
defaultLocale,
Locale.fromSubtags(languageCode: "hr")
];
/// Class which extends Get Translations
class ApplicationTranslations extends Translations {
final Map<String, Map<String, String>> _translationKeys;
ApplicationTranslations(this._translationKeys);
[@override](/user/override)
Map<String, Map<String, String>> get keys => _translationKeys;
}
/// Main method
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
runApp(GetMaterialApp(
translations: ApplicationTranslations(
await TranslationsLoader.loadTranslations(
"assets/i18n")), // can add supported locales param
locale: Get.deviceLocale,
fallbackLocale: defaultLocale,
supportedLocales: supportedLocales,
localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
home: const MyHomePage()));
}
/// Some default page
class MyHomePage extends StatelessWidget {
const MyHomePage({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('app.bar.title'.tr),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'page.home.current_lang'.tr +
': ' +
'lang.${Get.locale?.languageCode}'.tr,
),
Card(
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
MaterialButton(
child: Text('lang.en'.tr),
onPressed: () => {Get.updateLocale(supportedLocales[0])},
),
MaterialButton(
child: Text('lang.hr'.tr),
onPressed: () => {Get.updateLocale(supportedLocales[1])},
)
],
),
)
],
),
),
);
}
}
更多关于Flutter本地化翻译加载插件translations_loader的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter本地化翻译加载插件translations_loader的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用translations_loader
插件进行本地化翻译加载的代码示例。这个插件可以帮助你自动化地加载和管理翻译文件。
首先,确保你已经在pubspec.yaml
文件中添加了translations_loader
依赖:
dependencies:
flutter:
sdk: flutter
translations_loader: ^x.y.z # 请替换为最新版本号
然后,运行flutter pub get
来安装依赖。
1. 创建翻译文件
假设你有两个语言环境的翻译文件:英语(en.json
)和中文(zh.json
)。将这些文件放在assets/translations
目录下。
assets/translations/en.json
:
{
"welcome": "Welcome",
"goodbye": "Goodbye"
}
assets/translations/zh.json
:
{
"welcome": "欢迎",
"goodbye": "再见"
}
2. 更新pubspec.yaml
以包含翻译文件
在pubspec.yaml
中添加翻译文件到assets部分:
flutter:
assets:
- assets/translations/en.json
- assets/translations/zh.json
3. 配置translations_loader
创建一个新的Dart文件,例如translations_config.dart
,来配置translations_loader
:
import 'package:flutter/material.dart';
import 'package:translations_loader/translations_loader.dart';
class TranslationsConfig {
static final TranslationLoader translationLoader = TranslationLoader(
supportedLocales: [
Locale('en', ''),
Locale('zh', ''),
],
basePath: 'assets/translations',
fallbackLanguage: 'en', // 如果找不到特定语言的翻译,则回退到这种语言
);
}
4. 使用翻译
现在,你可以在你的应用中加载和使用翻译。创建一个服务或帮助类来访问翻译,例如localization_service.dart
:
import 'package:flutter/material.dart';
import 'translations_config.dart';
class LocalizationService {
static LocalizationService? _instance;
final BuildContext context;
Locale? _locale;
Map<String, String>? _localizedValues;
LocalizationService._(this.context) {
_locale = Localizations.localeOf(context);
_loadTranslations();
}
factory LocalizationService.of(BuildContext context) {
_instance ??= LocalizationService._(context);
return _instance!;
}
void _loadTranslations() async {
_localizedValues = await TranslationsConfig.translationLoader.load(_locale!.languageCode!);
}
String translate(String key) {
return _localizedValues![key] ?? key; // 如果找不到翻译,则返回键名
}
}
5. 在Widget中使用翻译
在你的应用中,你可以这样使用LocalizationService
来获取翻译文本:
import 'package:flutter/material.dart';
import 'localization_service.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
localizationsDelegates: [
// 添加你的localizations delegates,如果有的话
// 通常这里会包含GlobalMaterialLocalizations.delegate等
],
supportedLocales: TranslationsConfig.translationLoader.supportedLocales,
locale: Localizations.localeOf(context),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final localizationService = LocalizationService.of(context);
return Scaffold(
appBar: AppBar(
title: Text(localizationService.translate('welcome')),
),
body: Center(
child: Text(localizationService.translate('goodbye')),
),
);
}
}
这样,你就成功地配置并使用了translations_loader
插件来进行Flutter应用的本地化翻译加载。这个示例展示了如何设置翻译文件、加载翻译以及在Widget中使用翻译。