Flutter国际化多语言实现

906 阅读2分钟

前言

作为一个flutter萌新,由于项目项目中有Getx,想要实现一个flutter项目多语言功能的方法现在有两种,一种是使用Getx给的多语言方法,一种是使用官方文档中的flutter_localizations packge来实现,最后秉着”插件单一化“原则(狗头),还是使用官方的办法来实现多语言功能。

实现

跟随官方文档的步骤来,于是我新建了个demo工程来实现多语言。

第一步

要先在pubspec.yaml中添加packge依赖

pubspec.yaml

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  intl: any

添加完以后运行Pub get,下载依赖,完成后我们在main.dart中引入,这里我们使用的是MaterialAPP

import 'package:flutter_localizations/flutter_localizations.dart';
return MaterialApp(
      localizationsDelegates: const [
        GlobalMaterialLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: const [
        Locale('en'),//支持英文
        Locale('zh'),//支持中文
      ],
      title: 'Flutter l10n Demo tdsss',
      home: const MyHomePage(title: 'tdsss l10n test'),
    );

第二步

回到pubspec.yaml文件中,我们找到文件偏底部的flutter部分,添加generate: true

# The following section is specific to Flutter packages.
flutter:
  generate: true

然后在项目的根目录下添加一个新的yaml文件,命名为l10n.yaml 然后添加内容

arb-dir: lib/l10n
template-arb-file: intl_en.arb
output-localization-file: app_localizations.dart

参数解释如下:详情可以见官方文档 image.png

这个时候,我们去lib文件夹下新建一个l10n的目录,然后新建一个intl_en.arb文件。

第三步(可选步骤)

我使用的是Android Studio这个时候IDE会提示我们去下载flutter Intl插件 image.png 下载完成后,重启IDE并初始化项目。

操作方法:点击Tools -> Flutter Intl -> Initialize for the Project image.png

第四步

这个时候我们已经在lib/l10n目录下创建了intl_en.arb文件,在里面添加

{
  "helloWorld": "Hello World!",
  "@helloWorld": {
    "description": "The conventional newborn programmer greeting"
  }
}

然后在同一目录下,新建一个intl_zh.arb的文件,在里面添加

{
  "helloWorld": "你好,世界!"
}

然后在项目路径的终端运行 flutter gen-l10n 命令,你就会在.dart_tool/flutter_gen/gen_l10n下看到自动生成的文件

第五步

回到main.dart文件,引入刚刚自动生成的类

import 'package:flutter_gen/gen_l10n/app_localizations.dart';

然后在你的MaterialApp中添加一行

return MaterialApp(
      localizationsDelegates: const [
        AppLocalizations.delegate,//-----这里是新加的一行
        GlobalMaterialLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: const [
        Locale('en'),//支持英文
        Locale('zh'),//支持中文
      ],
      title: 'Flutter l10n Demo tdsss',
      home: const MyHomePage(title: 'tdsss l10n test'),
    );

现在你就可以在任何地方使用你准备好的多语言了

使用方法

在新建的demo的HomePage中,把刚刚我们写进的helloWorld显示出来,具体代码如下: class MyHomePage

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(AppLocalizations.of(context)!.helloWorld),
          ],
        ),
      ),
    );
  }
}

运行项目,如果你的设备默认语言是中文,那就会显示“你好,世界!”,如果是英文,就会显示"Hello World!",我这里使用模拟器,先把语言设置为中文,打开APP

image.png

image.png 看到的是中文,我们在设置里切换为英文试试。

image.png

image.png

成功了!