Flutter 国际化:多语言资源与动态切换
包实现,包含多语言资源管理与运行时动态切换。Flutter 国际化通过。
·
Flutter 国际化:多语言资源与动态切换
Flutter 国际化通过 flutter_localizations 和 intl 包实现,包含多语言资源管理与运行时动态切换。以下是完整实现流程:
1. 添加依赖
在 pubspec.yaml 中添加:
dependencies:
flutter_localizations:
sdk: flutter
intl: ^0.18.0
2. 创建多语言资源文件
在项目根目录创建 l10n 文件夹,并添加 .arb 文件:
app_en.arb(英语)
{
"helloWorld": "Hello World!",
"@helloWorld": {
"description": "首页欢迎语"
}
}
app_zh.arb(中文)
{
"helloWorld": "你好,世界!"
}
3. 生成本地化类
在 pubspec.yaml 中启用代码生成:
flutter:
generate: true
运行命令生成代码:
flutter pub get && flutter gen-l10n
生成文件位于 lib/l10n,包含 AppLocalizations 类。
4. 配置 MaterialApp
在 main.dart 中设置本地化代理:
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:your_app/l10n/app_localizations.dart';
MaterialApp(
localizationsDelegates: const [
AppLocalizations.delegate, // 生成的代理
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: const [
Locale('en'), // 英语
Locale('zh'), // 中文
],
home: MyHomePage(),
);
5. 动态切换语言
使用 Provider 实现运行时切换:
(1) 添加状态管理依赖
dependencies:
provider: ^6.0.0
(2) 创建语言状态类
class LocaleProvider with ChangeNotifier {
Locale _locale = const Locale('en');
Locale get locale => _locale;
void setLocale(Locale loc) {
_locale = loc;
notifyListeners();
}
}
(3) 在 MaterialApp 中绑定状态
ChangeNotifierProvider(
create: (_) => LocaleProvider(),
child: Consumer<LocaleProvider>(
builder: (context, provider, child) {
return MaterialApp(
locale: provider.locale, // 动态绑定语言
// ...其他配置
);
},
),
);
(4) 切换语言按钮
ElevatedButton(
onPressed: () {
final provider = Provider.of<LocaleProvider>(context, listen: false);
provider.setLocale(const Locale('zh')); // 切换到中文
},
child: Text('切换中文'),
);
6. 使用多语言文本
在组件中通过 AppLocalizations 调用:
Text(AppLocalizations.of(context)!.helloWorld),
效果:
- 默认显示英语:
Hello World! - 点击按钮后切换为中文:
你好,世界!
关键优化点
- 热重载支持:修改
.arb文件后运行flutter gen-l10n可实时生效 - 占位符处理:在
.arb中使用{variable}语法:
调用代码:"welcome": "Hello, {name}!",AppLocalizations.of(context)!.welcome('Alice') - 复数与性别:通过
intl的plural()和gender()方法处理复杂语法
注意事项:
- 确保所有
.arb文件的 key 完全一致- 动态切换时需重建 MaterialApp(通过
Provider通知)- 测试时使用
flutter test --dart-define=FLUTTER_TEST=true模拟多语言环境
更多推荐



所有评论(0)