百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Flutter 实现多语言

wptr33 2025-04-26 21:40 14 浏览

本文同步本人掘金平台的文章:
https://juejin.cn/post/7164571616314130469

我们在处理跨国业务、跨地区(比如港澳台)业务的时候,需要针对当地的语言来做兼容。所以,我们必须处理 app 的多语言。

本文,我们来讲讲,如何结合 flutter_localizations 和 intl 来实现中英文语言的切换。

项目初始化

为了演示多语言的功能,我们新建一个项目:

flutter create jimmy_lang

更改下代码:

// lib/main.dart

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Multiple Languages'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);
  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>[
            const Text(
              'Hello World!',
            )
          ],
        ),
      ),
    );
  }
}
复制代码

在 ios 模拟器上的效果:

我们新建了一个很简单的项目。文本 Hello World! 展示在屏幕的正中间。下面我们会对其进行翻译。我们会怎么做呢?请接着往下读...

更新项目 pubspec.yaml 文件

该项目的 pubspec.yaml 中,添加 flutter_localizations 和 intl 包。并设定 generate 为 true,当项目运行起来后,生成本地化工具代码。

dependencies:
  flutter:
    skd: flutter
  # 国际化支持
  flutter_localizations:
    skd: flutter
  intl: ^0.17.0 # 截止更文,该包稳定版本是 0.17.0
  
flutter:
  # 添加代码生成(合成包)支持
  generate: true
复制代码

版本 Flutter 3.0.5 o channel stable o github.com/flutter/flu…

添加文件 l10n.yaml

在项目的根目录(跟 lib 文件夹同级)创建文件 l10n.yaml,添加如下内容:

arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
复制代码

l10n.yaml 配置文件的用途是:自定义生成将导入应用程序本地化类的工具。

  • arb-dir 指明从哪里找输入的文件,文件夹内包含的文件后缀是 .arb。
  • template-arb-file 模版文件,定义翻译的元数据,该文件必须在 arb-dir 文件夹内创建。
  • output-localization-file 定义该工具将生成的主要 Dart 类文件。并且应用程序将导入。所有生成的文件都是通过文件夹 arb-dir 下的文件生成。

创建模板 ARB 文件,比如 lib/l10n/app_en.arb

比如:

// lib/l10n/app_en.arb
{
  "@@locale": "en",
  
  "helloWorld": "Hello World!"
}
复制代码

@@locale 指明本地化的英文,当然你也可以不要这个声明。通过方法 helloWorld 获取 Hello World! 信息。

此时运行 flutter pub get 获取包,你将生成对应的 dart 工具:

集成自动化生成的本地类

导入上面生成的 app_localizations.dart 文件,在应用中集成 AppLocalizations 类。并使用现在生成的英文本地化 helloWolrd:

// lib/main.dart

import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; // 引入对应的本地化类

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // 添加本地化支持
      localizationsDelegates: AppLocalizations.localizationsDelegates,
      supportedLocales: AppLocalizations.supportedLocales,
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Multiple Languages'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);
  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 文件内容
            Text(
              AppLocalizations.of(context)!.helloWorld, // 注意 !. 的使用
            )
          ],
        ),
      ),
    );
  }
}
复制代码

运行后,在 ios 模拟器上,我们依旧能得到正确的结果:

添加中文语言

我们来添加中文翻译。

我们添加 app_zh.arb 文件:

// lib/l10n/app_zh.arb
{
  "@@locale": "zh",
  
  "helloWorld": "世界,你好"
}
复制代码

重新运行,你会发现在
./dart_tool/flutter_gen/gen_l10n 中多出一份配置 app_localizations_zh.dart 文件 。

我们调整 ios 模拟器中系统设置的语言为中文,再查看 app。

我们 Gif 图走一个

参考

  • Guide for building internationalized Flutter apps

相关推荐

每天一个编程技巧!掌握这7个神技,代码效率飙升200%

“同事6点下班,你却为改BUG加班到凌晨?不是你不努力,而是没掌握‘偷懒’的艺术!本文揭秘谷歌工程师私藏的7个编程神技,每天1分钟,让你的代码从‘能用’变‘逆天’。文末附《Python高效代码模板》,...

Git重置到某个历史节点(Sourcetree工具)

前言Sourcetree回滚提交和重置当前分支到此次提交的区别?回滚提交是指将改动的代码提交到本地仓库,但未推送到远端仓库的时候。...

git工作区、暂存区、本地仓库、远程仓库的区别和联系

很多程序员天天写代码,提交代码,拉取代码,对git操作非常熟练,但是对git的原理并不甚了解,借助豆包AI,写个文章总结一下。Git的四个核心区域(工作区、暂存区、本地仓库、远程仓库)是版本控制的核...

解锁人生新剧本的密钥:学会让往事退场

开篇:敦煌莫高窟的千年启示在莫高窟321窟的《降魔变》壁画前,讲解员指着斑驳色彩说:"画师刻意保留了历代修补痕迹,因为真正的传承不是定格,而是流动。"就像我们的人生剧本,精彩章节永远...

Reset local repository branch to be just like remote repository HEAD

技术背景在使用Git进行版本控制时,有时会遇到本地分支与远程分支不一致的情况。可能是因为误操作、多人协作时远程分支被更新等原因。这时就需要将本地分支重置为与远程分支的...

Git恢复至之前版本(git恢复到pull之前的版本)

让程序回到提交前的样子:两种解决方法:回退(reset)、反做(revert)方法一:gitreset...

如何将文件重置或回退到特定版本(怎么让文件回到初始状态)

技术背景在使用Git进行版本控制时,经常会遇到需要将文件回退到特定版本的情况。可能是因为当前版本出现了错误,或者想要恢复到之前某个稳定的版本。Git提供了多种方式来实现这一需求。...

git如何正确回滚代码(git命令回滚代码)

方法一,删除远程分支再提交①首先两步保证当前工作区是干净的,并且和远程分支代码一致$gitcocurrentBranch$gitpullorigincurrentBranch$gi...

[git]撤销的相关命令:reset、revert、checkout

基本概念如果不清晰上面的四个概念,请查看廖老师的git教程这里我多说几句:最开始我使用git的时候,我并不明白我为什么写完代码要用git的一些列指令把我的修改存起来。后来用多了,也就明白了为什么。gi...

利用shell脚本将Mysql错误日志保存到数据库中

说明:利用shell脚本将MYSQL的错误日志提取并保存到数据库中步骤:1)创建数据库,创建表CreatedatabaseMysqlCenter;UseMysqlCenter;CREATET...

MySQL 9.3 引入增强的JavaScript支持

MySQL,这一广泛采用的开源关系型数据库管理系统(RDBMS),发布了其9.x系列的第三个更新版本——9.3版,带来了多项新功能。...

python 连接 mysql 数据库(python连接MySQL数据库案例)

用PyMySQL包来连接Python和MySQL。在使用前需要先通过pip来安装PyMySQL包:在windows系统中打开cmd,输入pipinstallPyMySQL ...

mysql导入导出命令(mysql 导入命令)

mysql导入导出命令mysqldump命令的输入是在bin目录下.1.导出整个数据库  mysqldump-u用户名-p数据库名>导出的文件名  mysqldump-uw...

MySQL-SQL介绍(mysql sqlyog)

介绍结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同...

MySQL 误删除数据恢复全攻略:基于 Binlog 的实战指南

在MySQL的世界里,二进制日志(Binlog)就是我们的"时光机"。它默默记录着数据库的每一个重要变更,就像一位忠实的史官,为我们在数据灾难中提供最后的救命稻草。本文将带您深入掌握如...