大道至简,知易行难
广阔天地,大有作为

Flutter速成(四)国际化

新建的Flutter应用不支持多语言。

一、安装flutter-intl插件

在flutter-intl之前,一般国际化用的是flutter_i18n,但目前flutter_i18n不再维护,且插件已被作者从插件市场中下架。因为是速成,所以建议直接用插件flutter-intl(https://plugins.jetbrains.com/plugin/13666-flutter-intl):

安装Flutter Intl插件

安装Flutter Intl插件

插件安装完成后,在菜单中选择Tools–>Flutter Intl–>Initialize for the Project:

Flutter Intl初始化

Flutter Intl初始化

初始化结束后,pubspec.yaml的最后会自动增加以下内容:

在pubspec.yaml中添加依赖:

然后运行:

lib目录下会新增generated和l10n两个目录,其中l10n目录下为arb文件,generated目录下为根据arb文件自动生成的、用于映射对应语种的dart代码(原理可参见参考文档1):

Flutter Intl自动生成的代码

Flutter Intl自动生成的代码

二、初始化国际化的逻辑

在main.dart中,引用flutter_localizations、l10n相关的包,并在MaterialApp的构造方法中给localizationsDelegates和supportedLocales两个可选参数赋值:

请注意,某些陈旧的文章中提到可能需要特殊的代码逻辑才能正确处理繁体、简体,但现在实测上述的代码已经支持。请注意,supportedLocales中的第一个语言为所有语言+地区均不匹配时使用的默认语言。

三、增加语种

ARB(Application Resource Bundle,应用资源包)是Google开发的,Dart使用其作为国际化https://github.com/google/app-resource-bundle,官方描述为:

Application Resource Bundle (abbr. ARB) is a localization resource format that is simple (based on JSON), extensible (vocabulary can be added without affecting existing tools and usage), and directly usable (applications can access the resource directly from this format without converting to another form).

In ARB, localizable resources are encoded as a JSON object. Each resource will have a resource entry identified by resource key, and an optional resource attribute entry with resource attribute key.

在Android Studio中,我们可以在res/values上右键,选择New–>Values Resource File–>Locale:

Android Studio中的Locale-1

Android Studio中的Locale-1

选择Locale:

Android Studio中的Locale-2

Android Studio中的Locale-2

就可以看到所有的语言及地区:

Android Studio中的Locale-3

Android Studio中的Locale-3

其中Any Region表示所有地区:

Android Studio中的Locale-4

Android Studio中的Locale-4

优先级为特定地区>所有地区

Android Studio中的Locale-5

Android Studio中的Locale-5

当需要增加一个语种时,在菜单中选择Tools–>Flutter Intl–>Add Locale:

Flutter Intl Add Locale-1

Flutter Intl Add Locale-1

如果不知道用什么编码,可以参考Android Studio中的Language和Region。填入local code:

Flutter Intl Add Locale-2

Flutter Intl Add Locale-2

我们为了测试,创建不指定地区的zh、大陆的简体zh_CN、香港地区的繁体zh_HK和台湾地区的zh_TW,之后会在lib/generated/intl目录下生成对应语种的messages_xx.dart:

Flutter Intl Add Locale-3

Flutter Intl Add Locale-3

注意,generate目录下文件是根据arb自动生成的,如果需要修改的话直接修改arb文件即可。所谓的语言和地区是与手机中的语言和地区一一对应的,如果要测试的话添加几种语言并切换地区即可测试:

安卓设置语言和地区

安卓设置语言和地区

四、国际化的使用

flutter-intl官网给出了几个例子:

In the example above we have 5 keys:

  • pageHomeConfirm – A very simple key
  • pageHomeWelcome – A key which translation contains a placeholder name
  • pageHomeWelcomeGender – A gender key whose translation depends on a placeholder gender. Genders are formatted in ICU format.
  • pageHomeWelcomeRole – A select key whose translation depends on a placeholder role. Selects are formatted in ICU format.
  • pageNotificationsCount – A plural key whose translation depends on a placeholder howMany. Plurals are formatted in ICU format.

一般使用方法:

五、iOS中的使用

https://flutter.dev/docs/development/accessibility-and-localization/internationalization#appendix-updating-the-ios-app-bundle

参考文档:
1、https://www.jianshu.com/p/8356a3bc8f6c,里面有一些原理及动态设置语言
2、https://plugins.jetbrains.com/plugin/13666-flutter-intl
3、https://juejin.im/post/5e4536d0e51d4526ef5f85a9#heading-5

转载时请保留出处,违法转载追究到底:进城务工人员小梅 » Flutter速成(四)国际化

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址