Flutter 国际化

206 阅读2分钟

安装插件

image.png

安装依赖

在pubspec.yaml文件中添加国际化依赖,代码和添加效果如下图

flutter_localizations:
    sdk: flutter

image.png

声明好依赖后,执行fluter pub get 拉取依赖

项目初始化国际化模块

使用Flutter Intl插件的初始化功能

image.png

执行完命令后在pubspec.yaml 中多了一个配置

lib 文件夹中多了两个文件夹 generated 和 i10n

image.png

generated 我们不用管,Flutter Intl插件负责维护

我们需要关注的是 l10n

l10n文件夹下目前只有一个文件 intl_en.arb

arb 文件扩展名为:Application Resource Bundle 缩写,意为应用程序资源包,并得到Google的支持,每个 .arb 文件都包含一个JSON表,该表从资源ID映射到本地化值

目前国际化只支持一种语言:en 英文

我们需要增加支持的语言该怎么做?

使用插件Flutter Intl的功能:

image.png

项目国际化配置

import 'package:flutter/material.dart';

// 导入国际化模块
import 'package:flutter_localizations/flutter_localizations.dart';
import 'generated/l10n.dart';

void main() async {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    // 在这里初始化数据
  }

  @override
  void dispose() {
    // 在这里清理资源
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      // 国际化模块 开始
      localizationsDelegates: const [
        S.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate
      ],
      supportedLocales: S.delegate.supportedLocales,
      // 国际化模块 结束
    );
  }
}

arb文件的内容

image.png

内容是类似json的数据格式

key和value都需要使用 "" 包裹起来

并且支持占位符写法,如上图的test

国际化的基本使用方法

页面使用

Widget build 和 逻辑函数中都是一样的使用方法

// 不带占位符的数据
S.of(context).homePage
// 带占位符的数据
S.of(context).test('麦克')

拿不到 context 怎么办

用 S.current 可以替代 S.of(context)

S.current.title

获取当前App语言

var locale = Localizations.localeOf(context);

手动改变 Locale

比如当按一个按钮的时候需要切换为美国英语,执行下面的代码就行。

S.load(Locale('en', 'US'));

注意:

改变语言的功能只是App本次进程改变了语言,重新启动App还是使用的是默认语言

插件配置的小知识

在 pubspec.yaml 文件的最后有两行配置,除了enabled,还有另外两个选项可以配置

  • class_name 前面我们用了很多的 S ,是类名,如果你不喜欢这个名字,可以修改。
  • main_locale 设置默认的 locale。
flutter_intl:
  enabled: true
  class_name: S # 可选。 Default: S
  main_locale: en # 可选。可以改成 zh_CN 中文简体,这关系到默认生成的arb文件的名字。Default: en