FlutterComponent最佳实践之国际化

668a11565885e38322d51d285922e257.png

点击上方蓝字关注我,知识会给你力量

5c6602634aa9aa0bfe81696201a48f78.png

在Android中,我们可以通过不同的strings.xml文件来实现国际化的不同语言需求,那么在Flutter中,官方同样也提供了国际化的适配方案,官方文档如下所示。
https://docs.flutter.dev/development/accessibility-and-localization/internationalization

本地化与国际化

本地化(Localization)指的是:使程序支持显示数字、货币、日期和复数的本地格式,因为对于另一个地区来说,这些可能是不同的展示样式。
5af13742094ca3128a2e05f6a246567d.png
国际化(Internationalization)指的是:使应用程序在特定的地区表现不同的语言展示。国际化包括创建多个基于本地的语言文件、assets等等。
6fb378b68503f2e0c5c3f29863bff92c.png

flutter_localizations的使用

当然,官方的方案是比较传统的方案,社区里有很多工具,可以极大的简化国际化的处理流程,让我们可以很快的进行国际化适配,这里使用到的就是一个名为「Flutter Intl」的插件。

安装好这个插件后,我们在yaml中增加国际化的依赖:

flutter_localizations:
    sdk: flutter

执行pub get之后,在Tools -> Flutter Intl -> Initialize for the Project中对项目进行初始化。我们选择add local后,可以继续添加不同类型的语言文件。

初始化完成后,yaml里会自动增加下面的内容。

flutter_intl:
  enabled: true

这样处理完之后,插件就会自动帮我们生成相应的国际化所需要的文件。
d42fb5b27662e5e330cf9559860c47f6.png
我们要做的,就是在arb文件中,添加相应的对应字符串即可。

intl_zh.arb
{
  "my_task": "我的任务",
  "today": "今日"
}

intl_en.arb
{
  "my_task": "My Task",
  "today": "Today"
}

我们所有需要用到文字,都会通过Json的方式在这里添加,插件会自动帮我们同步到messages_xx文件中。

那么这些国家地区的Code怎么写呢?我们可以借助Android Studio。在资源目录下,创建Local类型的资源文件,然后在这里就可以看到所有的Language Code和Regina Code了。
e65b3e1babdec37f543f962d787b6c29.png
有了这些code,就可以组成国际化的arb文件了,例如zh_CN,zh_HK,zh_TW这样的。

有个地方需要注意,那就是如果设置了Regina Code,例如zh_CN,那么所有的zh相关的文件,就必须包含Regina Code,否则会导致切换异常。

接下来,我们需要在项目中配置国际化的适配,在MaterialApp中配置下面的代码即可。

return MaterialApp(
  localizationsDelegates: const [
    S.delegate,
    GlobalMaterialLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
  ],
  supportedLocales: S.delegate.supportedLocales,
  ……
);

这些东西,都是插件生成的,它们的含义如下。

  • localizationsDelegates:国际化的代理工厂类

  • S.delegate:插件生成的国际化委托类,它会根据你的arb文件自动生成对应的方法调用

  • GlobalMaterialLocalizations.delegate:为Material Components提供了国际化字符串处理

  • GlobalCupertinoLocalizations.delegate:为Cupertino Components提供了国际化字符串处理

  • GlobalWidgetsLocalizations.delegate:为Widget提供默认的国际化处理,例如文字方向等

我们在使用时,只需要将原本的字符串使用,改成通过S.of(context)来调用即可,例如下面的代码。

Text('today')
替换为
Text(S.of(context).today)

同时,arb文件还支持使用占位符,通过{}来引用一个变量,如下所示。

"x_of_x_completed": "{todoCount} of {totalCount} completed"
使用时
S.of(context).x_of_x_completed(todoCount, totalCount)

上面这些配置好后,当App启动时,就会根据手机当前的语言状态来切换不同的语言文件了。

使用拓展函数简化。

extension LocalizedBuildContext on BuildContext {
  S get loc => S.of(this);
}

context.loc.my_task

在需要主动切换语言的地方,可以通过下面的代码来快速切换全局的语言。

S.load(Locale('zh', 'CN');

AppName国际化

对于Android项目来说,做国际化依然是通过value文件夹的国家Code限定符来处理。

在values目录下创建strings.xml文件,这里是默认的语言,我们可以将中文放在这里,再创建一个values-en文件夹,这里处理的是英文,我们创建一个strings.xml,将英文翻译放在这里即可。

这样我们使用不同的系统语言时,就会展示不同的AppName了。

一些第三方的国际化工具

除了官方的这个方案以外,Easy Localization也是用的比较多的一个社区方案。
https://pub.dev/packages/easy_localization
这篇文章对国际化的讲解也非常详细。
https://www.kodeco.com/10794904-internationalizing-and-localizing-your-flutter-app

向大家推荐下我的网站 https://www.yuque.com/xuyisheng  点击原文一键直达

专注 Android-Kotlin-Flutter 欢迎大家访问

往期推荐

本文原创公众号:群英传,授权转载请联系微信(Tomcat_xu),授权后,请在原创发表24小时后转载。

< END >

作者:徐宜生

更文不易,点个“三连”支持一下👇

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值