Flutter国际化

官方的文档一言难尽,又臭又长,网上搜索得到一个插件: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'),
    );
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值