文章目录

  • 一、下载intl插件
  • 二、初始化项目
  • 三、配置pubspec.yaml
  • 四、创建l10n.yaml
  • 五、main.dart代码使用
  • 1、导入依赖:
  • 2、初始化语言配置
  • 3、引用定义的文本内容
  • 六、创建中文内容
  • 七、参考链接:



记录Flutter中语言国际化的方式,该过程中可能会有冗余步骤,但是却可以实现功能。

这是根据Flutter默认项目进行的更改

环境: Windows、Android Studio

一、下载intl插件

File->Settings->Plugins->Maketplace中搜索Flutter Intl,安装后重启Android Studio

二、初始化项目

通过Tools->Flutter Intl->Initialize for the project进行项目初始化

三、配置pubspec.yaml

name: flutter_app
description: 这是一个flutter项目
version: 1.0.0+1

environment:
  sdk: ">=2.7.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.0
  flutter_localizations:
    sdk: flutter
  intl: ^0.16.1 # Add this line

dev_dependencies:
  flutter_test:
    sdk: flutter
flutter:
  uses-material-design: true
  generate: true # 生成国际化启用标志
flutter_intl:
  enabled: true

然后下载依赖

现在项目会生成一些文件(默认只有en的文件,其他是后加上去的),如下:

android国际化图片 android 国际化插件_android国际化图片


这里看下intl_zn.arb的内容,定义的文本内容都是在这里面写的

android国际化图片 android 国际化插件_flutter_02

这里注意下l10n.dart的内容,内容如下:

android国际化图片 android 国际化插件_Text_03

可以看到类名为S,这个类一会儿会使用,这个名字每个项目不一定叫这个,记得随时看下就好。

四、创建l10n.yaml

这个文件不知道有啥用。官网是这样写的

代码如下(注意文件名要跟生成的文件名一致):

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

五、main.dart代码使用

1、导入依赖:

import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_dq_app/generated/l10n.dart'; //位置可能不一样,注意下生成的位置就好

2、初始化语言配置

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: [
        // ... app-specific localization delegate[s] here
        S.delegate,//注意这个名字
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: [//这里面的语言最好是定义好的
        const Locale('en', ''), // English, no country code
        const Locale('ar', ''), // Arabic, no country code
        const Locale.fromSubtags(languageCode: 'zh'), // Chinese *See Advanced Locales below*
        // ... other locales the app supports
      ],
...
...

3、引用定义的文本内容

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              S.of(context).helloWorld,//注意这个类名和引用的文本名字,还有所处的位置
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

六、创建中文内容

定义的文本内容是在arb文件内,初始的文件只有英文,中文需要自己创建,创建方式如下(方式有很多种,这里介绍一种):

项目根目录右键新建arb文件,如下:

android国际化图片 android 国际化插件_初始化_04


android国际化图片 android 国际化插件_初始化_05

然后会在l10n文件夹下面创建新的文件intl_zh.arb

里面内容定义如下:

{
  "helloWorld": "你好!"
}

然后运行项目就好,没有效果的话重新clean项目

android国际化图片 android 国际化插件_初始化_06