安装插件
安装依赖
在pubspec.yaml文件中添加国际化依赖,代码和添加效果如下图
flutter_localizations:
sdk: flutter
声明好依赖后,执行fluter pub get 拉取依赖
项目初始化国际化模块
使用Flutter Intl插件的初始化功能
执行完命令后在pubspec.yaml 中多了一个配置
lib 文件夹中多了两个文件夹 generated 和 i10n
generated 我们不用管,Flutter Intl插件负责维护
我们需要关注的是 l10n
l10n文件夹下目前只有一个文件 intl_en.arb
arb 文件扩展名为:Application Resource Bundle 缩写,意为应用程序资源包,并得到Google的支持,每个 .arb 文件都包含一个JSON表,该表从资源ID映射到本地化值
目前国际化只支持一种语言:en 英文
我们需要增加支持的语言该怎么做?
使用插件Flutter Intl的功能:
项目国际化配置
import 'package:flutter/material.dart';
// 导入国际化模块
import 'package:flutter_localizations/flutter_localizations.dart';
import 'generated/l10n.dart';
void main() async {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
// 在这里初始化数据
}
@override
void dispose() {
// 在这里清理资源
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
// 国际化模块 开始
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate
],
supportedLocales: S.delegate.supportedLocales,
// 国际化模块 结束
);
}
}
arb文件的内容
内容是类似json的数据格式
key和value都需要使用 "" 包裹起来
并且支持占位符写法,如上图的test
国际化的基本使用方法
页面使用
Widget build 和 逻辑函数中都是一样的使用方法
// 不带占位符的数据
S.of(context).homePage
// 带占位符的数据
S.of(context).test('麦克')
拿不到 context 怎么办
用 S.current 可以替代 S.of(context)
S.current.title
获取当前App语言
var locale = Localizations.localeOf(context);
手动改变 Locale
比如当按一个按钮的时候需要切换为美国英语,执行下面的代码就行。
S.load(Locale('en', 'US'));
注意:
改变语言的功能只是App本次进程改变了语言,重新启动App还是使用的是默认语言
插件配置的小知识
在 pubspec.yaml 文件的最后有两行配置,除了enabled,还有另外两个选项可以配置
- class_name 前面我们用了很多的 S ,是类名,如果你不喜欢这个名字,可以修改。
- main_locale 设置默认的 locale。
flutter_intl:
enabled: true
class_name: S # 可选。 Default: S
main_locale: en # 可选。可以改成 zh_CN 中文简体,这关系到默认生成的arb文件的名字。Default: en