官方的文档一言难尽,又臭又长,网上搜索得到一个插件:flutter_i18n
这个插件可以自动生成国际化代码,我们要做的就是在 /res/values文件夹下编写我们的arb文件,类似于android开发的strings.xml。
首先安装插件,搜索Flutter i18n安装即可,不再赘述。
安装完成后,重启,会在项目中自动生成一下文件(若没有生成,是as抽风了,再重启一次):
-
lib/generated/i18n.dart 主要的国际化文件,主要使用的类为S
-
res/values/string_en.arb 该文件主要适配英文语言,内容为json格式
注意默认会生成res/values/strings_en.arb文件,每一个arb文件都依赖于它。例如在res/values/strings_de.arb中有一个字符串,但是strings_en.arb没有这个字符串,那么这个字符串方法不会生成,意味着你找不到它。所以,国际化时必须先确认strings_en.arb有这个字符串。
字符串内容同strings.xml文件一样,支持动态替换内容:
{
"aboutListTileTitle": "About $applicationName"
}
可以这样调用:
S.of(context).aboutListTileTitle(yourAppTitle)
我们可以创建需要的arb文件用于国际化:
左侧选择国家语言,右侧选择特定的区域:
然后在我们的项目的pubspec.yaml下添加flutter_localizations:
dependencies:
flutter_localizations:
sdk: flutter
packages get后回到我们有MaterialApp或者CupertinoApp的文件下,导入以下包:
import 'generated/i18n.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
至此,准备工作做完了,开始编写具体的逻辑代码!
1.设置localizationsDelegates 和supportedLocales 表明程序支持的语言。
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
onGenerateTitle: (BuildContext context) => S.of(context).app_name,
localizationsDelegates: const [
S.delegate,
//如果你在使用 material library,需要添加下面两个delegate
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: S.delegate.supportedLocales,
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
当用户将设备语言设置为你不支持的语言,我们可以提供一个备用区域设置,默认的解决方式是:
1.若用户设备的语言与你支持的一致,则启用该语言
2.若不包含用户的语言,则默认启用你的支持列表中的第一个语言
若你想改变这种方式,可以这么做:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
localizationsDelegates: [
S.delegate,
// You need to add them if you are using the material library.
// The material components usses this delegates to provide default
// localization
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: S.delegate.supportedLocales,
localeResolutionCallback:
S.delegate.resolution(fallback: const Locale('en', '')),
// 或者
localeListResolutionCallback:
S.delegate.listResolution(fallback: const Locale('en', '')),
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}