Flutter国际化插件ezi18n的使用
Flutter国际化插件ezi18n的使用
EzI18n 是一个轻量级的国际化(i18n)库,专为 Flutter 设计。它简化了翻译管理,并支持动态参数替换,使得多语言应用开发变得轻松愉快。🚀
特性 🛠️
- 🌍 支持通用语言(如
pt
)和特定语言(如pt_BR
)。 - 🔄 动态参数替换(如
@{name}
)。 - 🛡️ 缺失翻译的回退机制。
- 📦 与 Flutter 的本地化框架无缝集成。
入门指南 🏁
安装 📥
在 pubspec.yaml
文件中添加 EzI18n:
dependencies:
ezi18n: ^1.0.0
然后运行以下命令获取依赖项:
flutter pub get
注意事项 📝
对于原生 Widget 的翻译,你需要使用 flutter_localizations
包来加载委托,如示例代码所示。
使用 🚀
1. 定义翻译 🗂️
创建一个实现 EzMessages
接口的类来定义翻译内容。
import 'package:ezi18n/ezi18n.dart';
class AppMessages implements EzMessages {
[@override](/user/override)
Map<String, Map<String, String>> get keys => {
'en': {'greeting': 'Hello, @{name}!', 'farewell': 'Goodbye, @{name}!'},
'pt': {'greeting': 'Olá, @{name}!', 'farewell': 'Adeus, @{name}!'},
'pt_BR': {'greeting': 'Olá, @{name}!', 'farewell': 'Tchau, @{name}!'},
};
}
2. 在应用中设置本地化 ⚙️
配置 MaterialApp
,并添加 EzI18nDelegate
以启用多语言支持。
import 'package:ezi18n/ezi18n.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
locale: Locale('en'), // 设置默认语言
localizationsDelegates: [
EzI18nDelegate(AppMessages()), // 添加 EzI18n 的翻译委托
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [Locale('en'), Locale('pt'), Locale('pt', 'BR')], // 支持的语言列表
home: MyHomePage(),
);
}
}
3. 在页面中使用翻译 📝
通过调用 .tr()
方法来使用翻译,并传递参数。
import 'package:flutter/material.dart';
import 'package:ezi18n/ezi18n.dart';
class MyHomePage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('greeting'.tr(context, params: {'name': 'Alice'})), // 动态替换参数
),
body: Center(
child: Text('greeting'.tr(context, params: {'name': 'Bob'})),
),
);
}
}
示例代码
以下是完整的示例代码,展示了如何使用 EzI18n 实现多语言支持。
import 'package:example/messages.dart'; // 引入自定义的翻译文件
import 'package:ezi18n/ezi18n.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'home_page.dart';
void main() {
runApp(MyApp(
messages: AppMessages(), // 自定义翻译类
supportedLocales: [
Locale('en'),
Locale('pt'),
Locale('pt', 'BR'),
],
locale: Locale('pt', 'BR'), // 默认语言
));
}
class MyApp extends StatefulWidget {
final Locale locale;
final EzMessages messages;
final List<Locale> supportedLocales;
MyApp({
required this.messages,
required this.supportedLocales,
required this.locale,
});
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Locale _currentLocale;
_MyAppState() : _currentLocale = Locale('en'); // 初始语言
[@override](/user/override)
void initState() {
_currentLocale = widget.locale;
super.initState();
}
void _changeLanguage(Locale locale) {
setState(() {
_currentLocale = locale;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
locale: _currentLocale,
debugShowCheckedModeBanner: false,
localizationsDelegates: [
EzI18nDelegate(widget.messages), // 加载自定义翻译
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: widget.supportedLocales,
home: MyHomePage(
onChangeLanguage: _changeLanguage,
supportedLocales: widget.supportedLocales,
currentLocale: _currentLocale,
),
);
}
}
更多关于Flutter国际化插件ezi18n的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter国际化插件ezi18n的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
ezi18n
是一个用于 Flutter 应用国际化的插件,它可以帮助开发者轻松管理多语言支持。使用 ezi18n
,你可以将应用中的文本翻译成多种语言,并根据用户的语言偏好动态切换显示语言。
1. 安装 ezi18n
插件
首先,你需要在 pubspec.yaml
文件中添加 ezi18n
依赖:
dependencies:
flutter:
sdk: flutter
ezi18n: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 创建翻译文件
ezi18n
使用 .json
文件来存储翻译内容。你可以在项目中创建一个 i18n
文件夹,并在其中为每种语言创建一个 .json
文件。例如:
lib/
i18n/
en.json
es.json
fr.json
每个 .json
文件包含键值对,键是翻译的标识符,值是翻译后的文本。例如,en.json
文件可能如下所示:
{
"hello": "Hello",
"welcome": "Welcome to our app"
}
es.json
文件可能如下所示:
{
"hello": "Hola",
"welcome": "Bienvenido a nuestra aplicación"
}
3. 初始化 ezi18n
在应用的入口文件(通常是 main.dart
)中,初始化 ezi18n
并设置默认语言:
import 'package:flutter/material.dart';
import 'package:ezi18n/ezi18n.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化 ezi18n
await Ezi18n.init(
defaultLang: 'en', // 默认语言
supportedLangs: ['en', 'es', 'fr'], // 支持的语言
assetsPath: 'assets/i18n', // 翻译文件路径
);
runApp(MyApp());
}
4. 使用 ezi18n
进行翻译
在应用中使用 Ezi18n
来获取翻译文本。你可以通过 Ezi18n.of(context)
来获取当前语言的翻译文本。
import 'package:flutter/material.dart';
import 'package:ezi18n/ezi18n.dart';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text(Ezi18n.of(context).get('welcome')),
),
body: Center(
child: Text(Ezi18n.of(context).get('hello')),
),
),
);
}
}
5. 动态切换语言
你可以使用 Ezi18n.setLocale
方法来动态切换应用的语言。例如,可以在设置页面提供一个语言选择器:
import 'package:flutter/material.dart';
import 'package:ezi18n/ezi18n.dart';
class SettingsPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Settings'),
),
body: ListView(
children: [
ListTile(
title: Text('English'),
onTap: () async {
await Ezi18n.setLocale('en');
Navigator.pop(context);
},
),
ListTile(
title: Text('Español'),
onTap: () async {
await Ezi18n.setLocale('es');
Navigator.pop(context);
},
),
ListTile(
title: Text('Français'),
onTap: () async {
await Ezi18n.setLocale('fr');
Navigator.pop(context);
},
),
],
),
);
}
}
6. 处理语言切换后的界面更新
为了在语言切换后立即更新界面,你可以使用 Ezi18n
提供的 Ezi18nBuilder
或者 Ezi18n.of(context)
来监听语言变化并重建界面。
import 'package:flutter/material.dart';
import 'package:ezi18n/ezi18n.dart';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Ezi18nBuilder(
builder: (context) {
return Scaffold(
appBar: AppBar(
title: Text(Ezi18n.of(context).get('welcome')),
),
body: Center(
child: Text(Ezi18n.of(context).get('hello')),
),
);
},
),
);
}
}
7. 处理动态文本
如果你需要在翻译文本中插入动态数据,可以使用 Ezi18n
提供的 get
方法的 params
参数。例如:
{
"greeting": "Hello, {name}!"
}
在代码中使用:
Text(Ezi18n.of(context).get('greeting', params: {'name': 'John'}));