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

Flutter 实现多语言

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

本文同步本人掘金平台的文章:
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

相关推荐

redis的八种使用场景

前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...

基于Redis的3种分布式ID生成策略

在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...

基于OpenWrt系统路由器的模式切换与网页设计

摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...

这篇文章教你看明白 nginx-ingress 控制器

主机nginx一般nginx做主机反向代理(网关)有以下配置...

如何用redis实现注册中心

一句话总结使用Redis实现注册中心:服务注册...

爱可可老师24小时热门分享(2020.5.10)

No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...

Apportable:拯救程序员,IOS一秒变安卓

摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...

JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透

以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...

3月26日更新 快速施法自动施法可独立设置

2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...

Redis 是如何提供服务的

在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...

lua _G、_VERSION使用

到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...

China&#39;s top diplomat to chair third China-Pacific Island countries foreign ministers&#39; meeting

BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...

移动工作交流工具Lua推出Insights数据分析产品

Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...

Redis 7新武器:用Redis Stack实现向量搜索的极限压测

当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...

Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求

重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...