1、所需要的依赖
其实flutter项目中引入多语言文件的文章有很多,这个地方就不再仔细的说,这里主要是写一下我工作中遇到的多语言问题,以及我的解决方式。
intl: ^0.17.0 #多语言
2、使用
(1)所有需要配置多语言的资源都放在 I10n 文件夹下面,这里只是英文(intl_en.arb)和中文(intl_zh_CN.arb),这两个.arb文件中存放的是Json格式的字符串,例如下面就是(测试、即将开放、重新登录的中英文配置啦)
注意!!!
冒号的左边不可以有空格和特殊字符,只能有字母和数字组合成的字符串,第一个字符不能为数字;
在写配置的时候,冒号的左边中英文都需要一样,比如说测试的配置(如果你中文配置是这样写的 [ “test”: “测试” ],而英文配置是【 “test2”: “test”,】)那么你的中英文只会显示英文或者中文,达不到你想要的效果(也可以认为是你给它们起的名字不一样)。
(2)当我们需要在页面中使用多语言的时候,我们需要引入generated文件夹下面的 I10n.dart 文件
import 'package:XXX/generated/l10n.dart';//这里的 XXX 一般是你的项目名称,也就是说你只需要在这个项目中找到这个I10n.dart 文件就可以了
(3)引入文件之后我们就需要使用了。在页面上需要显示,那么你可以这样写
S.current.test
之后在你成功切换语言的时候就可以显示对应的中英文了
需要注意的是,如果你在这样写以后出现报错信息: Error: The getter ‘current’ isn’t defined for the class ‘String’.Try correcting the name to the name of an existing getter, or defining a getter or field named ‘current’. S.current.test,
这个问题是由于你引入的其他的文件的类名和咱们自己的语言资源文件【/generated/l10n.dart】的类名冲突了,这个时候你只需要将第(2)点中的引入变成
import 'package:XXX/generated/l10n.dart' as T;//当然,这里的 T 可以是任意的,相当于给这个文件的类型另外起了一个名字,解决冲突
使用的方式也需要变成:T.S.current.test
(此处的 T 和as 后面的 T 保持一致)
(4)那么我们要如何实现切换语言呢?
我们只需要在切换语言的页面点击 事件中使用
S.load(Locale('zh', 'CN'));//切换成中文
S.load(Locale('en', 'US'));//切换成英文
(5)flutter 使用多语言,也需要在main.dart入口文件的MaterialApp组件中写
return MaterialApp(
navigatorKey: navigatorKey,
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate
],
// supportedLocales:S.delegate.supportedLocales,
supportedLocales:[
const Locale('en', ''), // English这里是写英文作为首选项的,也就是我们app默认显示的语言,可以自行更改
// const Locale('zh', 'CN'),
],
localeListResolutionCallback: (locale, supportedLocales) {
return null;
},
);