Flutter-国际化适配终结者
大家好,很久不见,甚是想念,今天,我们来学习以下如何使用国际化神器
Flutter i18n
,该神器为一位叫Razvan Lung
的外国大佬开发的!完美解决Flutter
在开发应用时,字符串资源统一存放的问题,好的,我们现在开始学习吧!
Flutter i18n官网
安装插件
image.png该神器为
idea
的一款插件,名为Flutter i18n
,大家可以到开发工具的设置中找得到。我这里使用的是Android Studio
工具开发,idea
工具也是可以找到的,vscode
就不知道了,哈哈。
如图,先打开到上面的
Plugins
这一栏,然后点击插件列表下面的Browe repositories
,然后在弹出的界面中输入Flutter i18n
。image.png
然后点击右边的绿色按钮
install
,下载安装完之后会要求重启开发工具,重启就可以了image.png
使用
如果你已经成功安装插件,打开项目后,会发现自动添加以下两个文件:
-
lib/generated/i18n.dart
主要的国际化文件,主要使用的类为S
-
res/values/string_en.arb
该文件主要适配英文语言,内容为json
格式
到这里我们会出现疑惑,.arb
是什么格式的文件,下面我们来了解以下.arb
格式
ARB文件
arb文件.pngARB文件扩展名为:Application Resource Bundle 意为应用程序资源包,并得到Google的支持,每个
.arb
文件都包含一个JSON表,该表从资源ID映射到本地化值,文件名包含已为其转换值的语言环境,你可以选中res/values
点击右键-New-Arb File,在弹出的界面中选择你要的语言环境image.png
如图上:
- 第一栏为语言
- 第二栏为特定的区域
为了方便理解我们在Language
一栏中拉到底部找到zh:Chinese
,在右边可以很明确的知道特定区域表示什么
image.png - Any Region 表示所有地区,优先级为:特定地区>所有地区
- CN:China 中国(大陆)
- HK:Hong Kong SAR China 香港特别行政区
- MO:Macau SAR China 澳门特别行政区
- SG:Singapore 新加波
- TW:Taiwan 台湾
看到这里,是不是清晰了很多
添加国际化支持
在使用该插件支持,我们还是要知道,该插件依赖插件包
flutter_localizations
,否则会出现某些地区支持会出错
在我们的项目的pubspec.yaml
下添加flutter_localizations
....
dependencies:
flutter_localizations:
sdk: flutter
....
然后在命令行运行下Flutter packages get
回到我们有MaterialApp
或者MaterialApp
或者CupertinoApp
的文件下,导入以下包,我的是main.dart
文件
import 'generated/i18n.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
我使用的是刚新建的Flutter
项目,添加下面的内容
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.red,
),
// new
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate
],
supportedLocales: S.delegate.supportedLocales,
// new
home: MyHomePage(title: '本地化'),
);
}
}
来一个一个的解释以下:
-
localizationsDelegates
本地化委托参数 -
S.delegate
我们项目的本地化委托类,这个你不用管,他会根据你的arb
文件自动生成对应的函数 -
GlobalMaterialLocalizations.delegate
和GlobalWidgetsLocalizations.delegate
为flutter_localizations
插件包提供的委托,如果你使用MaterialApp
这个部件的GlobalMaterialLocalizations.delegate
这个可以用不 -
supportedLocales
支持的本地化 -
S.delegate.supportedLocales
我们项目支持的本地化,这个你不用管,它会在你添加arb
文件时自动更新你的支持的本地化
声明资源
现在我们可以在.arb
文件下添加JSON内容了
string_en.arb
添加如下:
{
"appName":"Carpe Diem"
}
如果你想支持中文,可以按上面的Ard
文件操作步骤进行创建
string_zn_CN.arb
内容如下:
{
"appName":"及时行乐"
}
支持香港
string_zn_HK.arb
内容如下:
{
"appName":"及時行樂"
}
使用资源
使用资源,我们只需要一行代码
S.of(context).appName
why?这样就可以了?嗯,是的,插件会在你写json
的时候会自动生成函数
S
类自动添加:
String get appName => "Carpe Diem";
$zh_CN
类自动添加
@override
String get appName => "及时行乐";
$zh_HK
类自动添加
@override
String get appName => "及時行樂";
Arb文件更多语法
- 1.占位符
{
"dialogTip":"Hello $name"
}
使用:
S.of(context).dialogTip("Rhyme");
- 2.复数
支持语法为:key+zero
/one
/many
/other
{
"selectZero":"没有了",
"selectOne":"一个",
"selectMany":"很多",
"selectOther":"其它"
}
使用:
S.of(context).select(0);//零个
S.of(context).select(1);//一个
S.of(context).select("many");//多个
S.of(context).select(null);//其它
- 3.忽略
$
符号
如果你要忽略该符号,请在前面加\
反斜杠
以上就是这篇文章的全部内容,阅读完后就会发现,跟Android中的R文件有异曲同工的效果!如果你学会了,希望能收到你的大礼包(****** 点亮红心 ****** 关注 ****** 转发 ******) 你的支持,是我创作和分享的动力!