Flutter - 国际化

Flutter开发之——国际化支持,flutter面试题2020 static AppLocalizations? of(BuildContext context) { return Localizations.of(context, AppLocalizations); } static Map<String, Map<String, String>> _localizedValues = { ‘en’: { ‘title’: ‘Hello World’, }, ‘zh’: { ‘title’: ‘你好’, }, }; String? get t 阅读详情
AI摘要

本文介绍了 Flutter 国际化的相关内容。首先说明了环境要求,接着阐述配置过程,包括安装依赖包、修改 pubspec.yaml 和 l10n.yaml 文件等。还介绍了不同场景下的使用方法,如系统 Widgets、自定义、切换语言、占位符等,同时提及避免语法解析和配置 l10n.yaml 文件的要点。

环境

Flutter 3.29
macOS Sequoia 15.4.1
Xcode 16.3

配置

安装依赖包

默认情况下,Flutter只提供美式英语的本地化,可以通过flutter_localizations这个package来实现国际化。

创建flutter工程后执行

¥ flutter pub add flutter_localizations --sdk=flutter
¥ flutter pub add intl:any

执行后的pubspec.yaml文件的效果

dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.8
  flutter_localizations:
    sdk: flutter
  intl: any

安装对应的package

¥ flutter pub get 

2025-05-22 11.28.32.png

pubspec.yaml文件

在 Flutter 项目的根目录中添加一个新的 yaml 文件,命名为 l10n.yaml,其内容如下:

arb-dir: lib/common/localization/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart 
  1. 将 应用资源包 (.arb) 的输入路径指定为 ${FLUTTER_PROJECT}/lib/common/localization/l10n。
  2. 将英文的语言模板设定为 app_en.arb。
  3. 指定 Flutter 生成本地化内容到 app_localizations.dart 文件。

要在pubspec.yaml 文件中,设置generate为true,执行命令时才会生成对应的app_localizations.dart文件

flutter:
    generate: true

指定这个是为了生成项目时能自动生成对应的.dart代码文件

在 ${FLUTTER_PROJECT}/lib/common/localization/l10n 添加 app_en.arb 模板文件

{
    "helloWorld": "Hello World!"
}

在同一目录下添加中文的模板文件 app_zh.arb

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

执行命令生成.dart文件

¥ flutter run

运行报错

Synthetic package output (package:flutter_gen) is deprecated: https://flutter.dev/to/flutter-gen-deprecation. In a future release, synthetic-package will
default to `false` and will later be removed entirely.
Generating synthetic localizations package failed with 1 error:

Error: Attempted to generate localizations code without having the flutter: generate flag turned on.
Check pubspec.yaml and ensure that flutter: generate: true has been added and rebuild the project. Otherwise, the localizations source code will not be
importable.

有两个问题,一个是使用flutter_gen生成synthetic package 的方式已经过期,推荐使用在 Flutter 项目中指定的目录下生成国际化资源代码文件。该标志默认为 true,还有一个报错是因为pubspec.yaml没有设置允许自动生成代码

解决方案: l10n.yaml文件中追加设置不使用Synthetic package的方式生成国际化资源文件

synthetic-package: false

解决方案: pubspec.yaml设置允许自动生成代码

flutter:
  generate: true

重新运行 flutter run

报错消失,并在l10n目录下生成对应的.dart代码文件

2025-05-22 14.16.28.png

打开 app_localizations.dart

import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart' as intl;

import 'app_localizations_en.dart';
import 'app_localizations_zh.dart';


abstract class AppLocalizations {
  AppLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString());

  final String localeName;

  static AppLocalizations? of(BuildContext context) {
    return Localizations.of<AppLocalizations>(context, AppLocalizations);
  }

  static const LocalizationsDelegate<AppLocalizations> delegate = _AppLocalizationsDelegate();
    
  /// 国际化代理对象的集合
  /// 代理中实现支持哪些语言,是否重新加载
  static const List<LocalizationsDelegate<dynamic>> localizationsDelegates = <LocalizationsDelegate<dynamic>>[
    delegate,
    /// Material风格的组件的国际化
    GlobalMaterialLocalizations.delegate,
    /// iOS风格的组件的国际化
    GlobalCupertinoLocalizations.delegate,
    /// Widget组件的国际化
    GlobalWidgetsLocalizations.delegate,
  ];

  /// A list of this localizations delegate's supported locales.
  /// 支持的语言列表
  static const List<Locale> supportedLocales = <Locale>[
    Locale('en'),
    Locale('zh')
  ];
  
  /// 国际化的词条
  String get helloWorld;
}

/// 自定义的词条的代理对象
class _AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {
  const _AppLocalizationsDelegate();

  
  Future<AppLocalizations> load(Locale locale) {
  /// 同步加载资源
    return SynchronousFuture<AppLocalizations>(lookupAppLocalizations(locale));
  }

  
  bool isSupported(Locale locale) => <String>['en', 'zh'].contains(locale.languageCode);

  
  /// Returns true if the resources for this delegate should be loaded again by calling the [load] method.

  /// 调用load方法后是否要重新加载
  bool shouldReload(_AppLocalizationsDelegate old) => false;
}

AppLocalizations lookupAppLocalizations(Locale locale) {


  // Lookup logic when only language code is specified.
  switch (locale.languageCode) {
    case 'en': return AppLocalizationsEn();
    case 'zh': return AppLocalizationsZh();
  }

  throw FlutterError(
    'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
    'an issue with the localizations generation tool. Please file an issue '
    'on GitHub with a reproducible sample app and the gen-l10n configuration '
    'that was used.'
  );
}

使用

场景: 系统的Widgets

使用系统的组件,比如日历


  Widget build(BuildContext context) {
    return MaterialApp(
      title: "localization示例",
      /// 1. 设置代理对象列表
      /// 一般开发都会有业务相关的词条,会创建词条,根据上面的代码可以传AppLocalizations.localizationsDelegates
      /// 没有其它自定义词条时也可以
      /// GlobalMaterialLocalizations.delegate,
      /// GlobalWidgetsLocalizations.delegate,
      /// GlobalCupertinoLocalizations.delegate,
      localizationsDelegates: AppLocalizations.localizationsDelegates,
      /// 2. 设置支持语言
      supportedLocales: [Locale('en'), Locale('zh')],
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
      ),
      home: MyHomePage(title: 'home page'),
      locale: Locale("zh"), /// 设置应用是中文还是英文,默认跟随系统
    );
  }
...
children: <Widget>[
    CalendarDatePicker(
      initialDate: DateTime.now(),
      firstDate: DateTime(2020, 3, 30),
      lastDate: DateTime(2025, 6, 31),
      onDateChanged: (value) => {logger.d(value.toString())},
    ),
],
...

2025-05-22 16.14.00.png

locale参数传Locale("en") 再次运行

2025-05-22 17.00.22.png

场景: 自定义

实现业务过程中相关的自定义的词条

...
return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(AppLocalizations.of(context)!.helloWorld),
      ),
...

效果同上,中文时显示你好,世界,英文时显示Hello World

场景: 切换语言

添加get依赖

get: 4.7.2

  Widget build(BuildContext context) {
    /// 1.MaterialApp => GetMaterialApp
    return GetMaterialApp(
      title: "localization示例",
      localizationsDelegates: AppLocalizations.localizationsDelegates,
      supportedLocales: [Locale('en'), Locale('zh')],
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
      ),
      home: MyHomePage(title: 'home page'),
      locale: Locale("en"),
    );
  }
/// 使用updateLocale来设置语言
if (Get.locale?.languageCode == "zh") {
    Get.updateLocale(Locale('en'));
} else {
    Get.updateLocale(Locale('zh'));
}

202505221709.gif

场景: 占位符,复数和选项

当需要再词条中接收变量时可以使用占位符

"hello": "Hello {userName}"
"@hello": {
  "description": "A message with a single parameter",
  "placeholders": {
    "userName": {
      "type": "String",
      "example": "Bob"
    }
  }
}
 "hello": "你好 {userName}",
 "@hello": {
    "description": "A message with a single parameter",
    "placeholders": {
        "userName": {
        "type": "String",
        "example": "张三"
        }
    }
 }
...
Text(AppLocalizations.of(context)!.hello("Programmer")),
...

20250523082627.gif

你还可以使用数字占位符来指定多个值。不同的语言有不同的单词复数化形式。该语法还支持指定单词的复数化形式。

"{countPlaceholder, plural, =0{message0} =1{message1} =2{message2} few{messageFew} many{messageMany} other{messageOther}}"

countPlaceholder: 变量名
plural: 固定搭配
=0{message0} =1{message1}…: 参数0时显示message0,参数1时显示message1

app_en.arb

"people": "{count, plural, =0{no people} =1{person} other{people} }",
"@people": {
  "description": "A plural people",
  "placeholders": {
    "count": {
      "type": "num",
      "format": "compact"
    }
  }
}

app_zh.arb

 "people": "{count, plural, =0{没有人} =1{一个人} other{人群}}",
"@people": {
  "description": "A plural people",
  "placeholders": {
    "count": {
      "type": "num",
      "format": "compact"
    }
  }
}

other的情况必须填写,不然会报

[app_en.arb:people] ICU Syntax Error: Plural expressions must have an “other” case.
{count, plural, =0{no people} =1{person} few{some people} }
^
[app_zh.arb:people] ICU Syntax Error: Plural expressions must have an “other” case.
{count, plural, =0{没有人} =1{一个人} few{一些人} }
^
Found syntax errors.

添加词条后可以在.arb文件中右键然后选择Generate Localizations 生成国际化的.dart文件

2025-05-23 08.40.56.png

...
Text(AppLocalizations.of(context)!.people(0)),
Text(AppLocalizations.of(context)!.people(1)),
Text(AppLocalizations.of(context)!.people(2)),
...

20250523084809.gif

也可以使用String占位符来表示选择一个值,类似词条使用case语句的感觉

"{selectPlaceholder, select, case{message} ... other{messageOther}}"

selectPlaceholder: 变量名
select: 固定搭配
case…other: 情况1,情况2,其它情况

"pronoun": "{gender, select, male{he} other{she}}",
"@pronoun": {
  "description": "A gendered message",
  "placeholders": {
    "gender": {
      "type": "String"
    }
  }
}
"pronoun": "{gender, select, male{他} other{她}}",
"@pronoun": {
  "description": "A gendered message",
  "placeholders": {
    "gender": {
      "type": "String"
    }
  }
}
Text(AppLocalizations.of(context)!.pronoun('male')),
Text(AppLocalizations.of(context)!.pronoun('female')),

20250523085334.gif

其它

避免语法解析

有时候符号(例如{或})也可能是普通文本的部分,如果不想被解析为一种语法,可以在l10n.yaml中设置use-escaping

use-escaping: true

启用后,解析器会忽略使用一对单引号包括的文字,如果在文字中又想使用单个单引号,需要使用成对的单引号进行转义。

配置l10n.yaml文件

通过l10n.yaml文件,可以配置gen-l10n工具,指定以下内容

  • 所有输入文件的位置
  • 所有输出文件的创建位置
  • 为本地化代理设置自定义的类名

可以在命令行运行 flutter gen-10n --help 获取命令的具体使用

详见Flutter 应用里的国际化

参考

  1. Flutter 应用里的国际化
  2. Localized messages are generated into source, not a synthetic package.
Flutter开发之——国际化支持(1) 我一直以来都有整理练习大厂面试题的习惯,有随时跳出舒服圈的准备,也许求职者已经很满意现在的工作,薪酬,觉得习惯而且安逸。不过如果公司突然倒闭,或者部门被裁减,还能找到这样或者更好的工作吗?我建议各位,多刷刷面试题,知道最新的技术,每三个月可以去面试一两家公司,因为你已经有不错的工作了,所以可以带着轻松的心态去面试,同时也可以增加面试的经验。我可以将最近整理的一线互联网公司面试真题+解析分享给大家,大概花了三个月的时间整理2246页,帮助大家学习进步。 阅读详情

相关推荐

Flutter开发之——国际化之Intl插件

首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶注解原理丶注解原理丶序列化Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)代码框架结构优化(数据结构丶排序算法丶设计模式)APP性能优化(用户体验优化丶适配丶代码调优)热修复丶热升级丶Hook技术丶IOC架构设计。

erhtre的博客 1446

flutter实现语言的国际化

今天特意准备了这篇实现国际化的文章,和大家一起,用最简单快速的方式实现 Flutter 国际化。我们从一个最简单的工程开始,看一下如何是实现Flutter应用程序的国际化。

我叫柱子哥 3980

Flutter 国际化适配

借助App Store与Google Play,全世界任何一个国家的使用者都可以使用我们开发的应用,不过由于应用的使用者来自不同国家,所以在应用正式上架之前需要让应用能够支持多种语言,即应用的国际化。 在Flutter开发中,应用的国际化主要涉及语言和地区差异性配置两个方面,它们是应用程序的组成部分之一。关于语言的国际化比较好理解,而地区差异性配置指的是根据国家风俗的不同进行的差异性配置。按照Fl...

xiangzhihong8的专栏 1498

Flutter之国际化(多语言处理)

Flutter 国际化(多语言处理)

好好学习的博客 4074

Flutter GetX 之 国际化

打开插件网站,搜索 get 插件 进行引用Flutter 插件社区​​​​​然后执行pub get进行引用。

WangQingLei0307的博客 1159

Win10插网线显示未识别网络的三种解决方法

本文介绍了三种解决Win10插网线显示未识别网络问题的方法:更新或重启网络设备驱动程序、重置Winsock目录、启用Network Setup Service服务。这些方法都是基于常见的网络问题和解决方案而设计的,适用于大多数Win10用户。如果你遇到了这一问题,可以按照上述步骤进行操作,相信一定能够找到解决问题的方法。需要注意的是,在进行任何操作之前,请务必备份重要数据以防万一。此外,如果你对计算机硬件或软件不熟悉,建议寻求专业人士的帮助以避免造成不必要的损失。

nntxthml的博客 6770

Flutter实现国际化

j

qq_27909209的博客 4111

嵌入式开发语言-C语言编程

C语言编程概述环境在Windows上构建C语言的环境安装在Mac上构建C语言的环境安装 概述 “C语言”被称为适合嵌入式系统开发的编程语言之一。 C语言在一般的编程中也是熟悉的开发语言,但实际上,如果试着使用C语言制作微型计算机的控制程序等,就必须使用与“普通的C程序”不同的使用方法。 作为一般的C语言的学习方法,使用“printf”“scanf”等标准函数的程序开发是固定的,但这些都是以UNIX和Windows等环境上的应用程序开发为前提的。 对此,没有显示器和键盘的嵌入式系统的微型计算机控制程序,该如何

编程老王 7975

Flutter国际化

官方的文档一言难尽,又臭又长,网上搜索得到一个插件:flutter_i18n 这个插件可以自动生成国际化代码,我们要做的就是在 /res/values文件夹下编写我们的arb文件,类似于android开发的strings.xml。 首先安装插件,搜索Flutter i18n安装即可,不再赘述。 安装完成后,重启,会在项目中自动生成一下文件(若没有生成,是as抽风了,再重启一次): lib/ge...

jielundewode的专栏 1298

CodeBlocks如何将英文环境改为中文

一、下载汉化包(链接如下) 链接:https://pan.baidu.com/s/166U9WGPbJXu2hyD7q9EiJQ 提取码:2333 二、选择路径 将汉化包中的文件(CodeBlocks.mo、zh_CN.mo、zh_CN.po)放到CodeBlocks安装路径下的​​​​​​CodeBlocks/share/CodeBlocks/locale/zh_CN文件夹中,路径中的文件夹没有就新建。 注:此处需严格按照要求来,切勿自定义文件夹名 三、内部调试 打开CodeBlocks,..

云隐雾匿的博客 2万+

硬件工程师笔试面试高频考点汇总——(2025版)

《硬件工程师笔试面试知识汇总》一文系统梳理了硬件领域的核心知识体系,涵盖电子器件、模拟电路、数字电路等模块。文章详细解析了电阻、电容、电感等基础元件的选型与应用,深入探讨了三极管、MOS管等半导体器件的工作原理,并对比分析了DCDC与LDO等电源方案。在电路设计方面,提供了滤波器、放大器等实用电路的设计方法与仿真案例,同时包含UART、I2C等通信协议的实现要点。文章还整合了戴维宁定理等电路分析理论,并附有美团、联想等名企真题解析。通过器件特性、电路设计、企业真题三维度内容,为硬件工程师构建了完整的知识框架

XU157303764的博客 1万+

flutter 国际化_Flutter 中文文档:Flutter 应用里的国际化

你将学习到如何去获取设备的语言环境(用户首选的语言)。如何去管理特定语言环境下的 app 值。如何去定义 app 支持的语言环境。如果你的 app 会部署给说其他语言的用户使用,那么你就需要对它进行国际化。这就意味着你在编写 app 的时候,需要采用一种容易对它进行本地化的方式进行开发,这种方式让你能够为每一种语言或者 app 所支持的语言环境下的文本和布局等进行本地化。Flutter ...

weixin_32083393的博客 964

maxim max96712+max96717调试笔记

mxxim max96712 和max96717调试笔记

libuping2023的博客 1万+

flutter国际化

1、配置flutter_localizations依赖 找到pubspec.yaml配置flutter_localizations dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter 2、导入国际化的包 flutter_localizations import 'package:...

BLUESKYHOST的博客 293

《人工智能基础》[工具篇2]:ChatBox怎么使用本地模型和知识库配置教程

通过设置-知识库,添加,填入知识库名称、选用的嵌入模型创建好知识库后,点击添加文件按钮+,可以上传本地文件、拖动文件支持上传PDF、DOCX等格式的文档。系统会自动对文档进行处理。批量上传:一次最多上传 50 个文档,总大小不超过 2GB;格式检测:支持 PDF/DOCX/TXT/Markdown,不支持 EXE/RAR 等二进制文件。‌文档类‌图片类‌代码类‌:Python、Java、JavaScript等编程文件‌其他‌:Markdown(用于导出对话记录) ‌。

专注大数据、云计算、人工智能、机器人领域技术传播 2934

半导体器件仿真:双极型晶体管仿真_15.双极型晶体管的高级仿真技术

双极型晶体管(Bipolar Junction Transistor, BJT)是一种重要的半导体器件,广泛应用于放大、开关和调制等电路中。随着半导体技术的发展,对BJT的仿真要求也越来越高。本节将详细介绍双极型晶体管的高级仿真技术,包括器件模型的选择、仿真参数的优化、温度效应的考虑以及噪声分析等。

2401_87715305的博客 1241

Flutter国际化:Flutter Intl 插件实现国际化 --- AndroidStudio

Flutter Intl插件国际化,超简单

Crystalqt的博客 1036

Buck电源设计常见的一些问题(四)MOS管振荡抑制方法(二)

另一方面,开关振铃为远超开关频率的高频振铃,并伴随很高的 dV/dt,会带来传导和辐射的 EMI 问题,可能会使得终端产品不能通过 EMI 标准测试,更严重时甚至会干扰开关电源自身的信号电路或临近的其他功能电路的正常工作。选用二极管反向特性好的器件;该电路可等效成图 3 中 LC 谐振电路,新的 LR和 CR为 Lp1、Lp5,Lp3, Lp4, CD等所有参与振铃的寄生感容的复合值。通常 Snubber 的 Csnub取值在数 nF 以上,在振铃频率 fR(加了 snubber 后)下的阻抗很小。

小幽余生不加糖 2892

Flutter(十七) 实现国际化

一. 国际化的认识 二. 国际化的适配 三. 国际化的工具

goodswifter 6582

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

实用的 Flutter 国际化指南

作为一个 Android 开发者,Flutter 上来就让我把各类字符串写在 widget 里,其实我心里是拒绝的。硬编码是不可能硬编码的。国际化又不会,就是只能去看看文档,才能学点新姿势这样子。看了文档之后,觉得国际化这部分,还是有点麻烦的,我觉得有必要拎出来单独写写。 个人希望能把应用的字符串资源独立出来,以方便管理。至于支持多语言这种,反而是顺带完成的结果。本文以实用优先,因为我认为这部分内...

weixin_34015336的博客 641

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Flutter 实现国际化_系统自带控件的国际化和其他文本国际化

一. 国际化的认识 开发一个App,如果我们的App需要面向不同的语种(比如中文、英文、繁体等),那么我们需要对齐进行国际化开发。 国际化的英文称呼:internationalization(简称为i18n,取前后两个字母,18表示中间省略字母的个数) App国际化开发主要包括:文本国际化(包括文本的顺序),Widget显示的国际化: 比如我们下面开发的这个App 某些文本在英文环境下应该显示为英文; 某些Widget在中文环境下,应该显示中文(比如弹出的时间选择器);

KEEP RUNNING的博客 1278

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

flutter 专题 五十一 Flutter 国际化适配

其中,localizationsDelegates表示应用程序的翻译回调,supportedLocales表示应用所支持的语言地区属性,而S.delegate则是Flutter i18n插件自动生成的类,包含Flutter所支持的语言地区属性以及对应的文案翻译映射。需要说明的是,由于i18n.dart文件的代码是由插件自动生成的,所以不要手动修改里面的内容。接下来,切换系统中的英文和中文,然后运行上面的代码,可以看到,应用的内容会随着系统的语言进行切换,效果下图所示。

m0_61164038的博客 1376
上一篇: Flutter - 集成三方库:数据库(sqflite)
下一篇: Flutter - 原生交互 - 相机Camera - 01
忘川三
博客等级 码龄12年 208粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值