当前位置: 首页 > article >正文

Flutter国际化与本地化完全指南

Flutter国际化与本地化完全指南引言国际化是构建全球化应用的关键环节Flutter提供了完善的国际化支持。本文将深入探讨Flutter中的国际化和本地化技术。一、基础配置1.1 添加依赖dependencies: flutter_localizations: sdk: flutter intl: ^0.18.11.2 更新main.dartimport package:flutter_localizations/flutter_localizations.dart; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); override Widget build(BuildContext context) { return MaterialApp( title: Flutter Demo, localizationsDelegates: const [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: const [ Locale(en, ), Locale(zh, CN), Locale(ja, ), ], home: const HomePage(), ); } }二、创建本地化资源2.1 创建arb文件lib/l10n/app_en.arb{ locale: en, title: Hello World, welcome: Welcome to our app!, greeting: Hello {name}!, count: {count, plural, zero{No items} one{One item} other{{count} items}}, gender: {gender, select, male{He} female{She} other{They}} likes this. }lib/l10n/app_zh.arb{ locale: zh, title: 你好世界, welcome: 欢迎来到我们的应用, greeting: 你好 {name}, count: {count, plural, zero{没有项目} one{一个项目} other{{count}个项目}}, gender: {gender, select, male{他} female{她} other{他们}}喜欢这个。 }lib/l10n/app_ja.arb{ locale: ja, title: こんにちは世界, welcome: アプリへようこそ, greeting: こんにちは {name}, count: {count, plural, zero{アイテムがありません} one{アイテム1つ} other{アイテム{count}個}}, gender: {gender, select, male{彼は} female{彼女は} other{彼らは}}これが好きです。 }2.2 配置pubspec.yamlflutter: generate: true assets: - lib/l10n/2.3 生成代码flutter pub get三、使用本地化字符串3.1 基础使用import package:flutter_gen/gen_l10n/app_localizations.dart; class HomePage extends StatelessWidget { const HomePage({super.key}); override Widget build(BuildContext context) { final loc AppLocalizations.of(context)!; return Scaffold( appBar: AppBar(title: Text(loc.title)), body: Center( child: Column( children: [ Text(loc.welcome), Text(loc.greeting(John)), ], ), ), ); } }3.2 复数处理Text(loc.count(0)); // No items / 没有项目 / アイテムがありません Text(loc.count(1)); // One item / 一个项目 / アイテム1つ Text(loc.count(5)); // 5 items / 5个项目 / アイテム5個3.3 性别选择Text(loc.gender(male)); // He likes this. / 他喜欢这个。 / 彼はこれが好きです。 Text(loc.gender(female)); // She likes this. / 她喜欢这个。 / 彼女はこれが好きです。 Text(loc.gender(other)); // They like this. / 他们喜欢这个。 / 彼らはこれが好きです。四、动态切换语言4.1 创建语言提供器class LocaleProvider extends ChangeNotifier { Locale _locale const Locale(en); Locale get locale _locale; void setLocale(Locale locale) { _locale locale; notifyListeners(); } }4.2 使用Provider包装void main() { runApp( ChangeNotifierProvider( create: (_) LocaleProvider(), child: const MyApp(), ), ); } class MyApp extends StatelessWidget { const MyApp({super.key}); override Widget build(BuildContext context) { final localeProvider Provider.ofLocaleProvider(context); return MaterialApp( locale: localeProvider.locale, localizationsDelegates: const [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: const [ Locale(en, ), Locale(zh, CN), Locale(ja, ), ], home: const HomePage(), ); } }4.3 创建语言选择器class LanguageSelector extends StatelessWidget { const LanguageSelector({super.key}); override Widget build(BuildContext context) { final localeProvider Provider.ofLocaleProvider(context); return DropdownButtonLocale( value: localeProvider.locale, items: const [ DropdownMenuItem(value: Locale(en), child: Text(English)), DropdownMenuItem(value: Locale(zh, CN), child: Text(中文)), DropdownMenuItem(value: Locale(ja), child: Text(日本語)), ], onChanged: (locale) { if (locale ! null) { localeProvider.setLocale(locale); } }, ); } }五、日期和数字本地化5.1 日期格式化import package:intl/intl.dart; void formatDate() { final date DateTime.now(); // 默认格式 print(DateFormat.yMMMd().format(date)); // 中文格式 print(DateFormat.yMMMd(zh_CN).format(date)); // 日文格式 print(DateFormat.yMMMd(ja).format(date)); // 自定义格式 print(DateFormat(yyyy-MM-dd HH:mm:ss).format(date)); }5.2 数字格式化void formatNumber() { final number 1234567.89; // 默认格式 print(NumberFormat().format(number)); // 中文格式 print(NumberFormat.currency(locale: zh_CN).format(number)); // 百分比 print(NumberFormat.percentPattern().format(0.75)); }六、RTL支持6.1 配置RTLMaterialApp( locale: const Locale(ar), supportedLocales: const [ Locale(ar), ], localizationsDelegates: const [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, ], home: const HomePage(), );6.2 处理RTL布局class RtlAwareWidget extends StatelessWidget { const RtlAwareWidget({super.key}); override Widget build(BuildContext context) { final textDirection Directionality.of(context); return Row( textDirection: textDirection, children: [ const Text(First), const Text(Second), ], ); } }七、最佳实践7.1 提取本地化键// 不好 Text(AppLocalizations.of(context)!.title); // 好 extension AppLocalizationsExtension on BuildContext { AppLocalizations get loc AppLocalizations.of(this)!; } // 使用 Text(context.loc.title);7.2 处理缺失翻译// 在arb文件中添加默认值 { title: Hello World, title: { description: The title of the app, type: text, placeholders: {} } }7.3 测试多语言void main() { testWidgets(English locale, (tester) async { await tester.pumpWidget( MaterialApp( locale: const Locale(en), localizationsDelegates: const [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, ], home: const HomePage(), ), ); expect(find.text(Hello World), findsOneWidget); }); testWidgets(Chinese locale, (tester) async { await tester.pumpWidget( MaterialApp( locale: const Locale(zh, CN), localizationsDelegates: const [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, ], home: const HomePage(), ), ); expect(find.text(你好世界), findsOneWidget); }); }总结国际化是构建全球化应用的重要环节通过合理使用Flutter的国际化支持你可以支持多种语言轻松添加新语言支持格式化日期和数字根据区域设置自动格式化支持RTL语言正确处理阿拉伯语、希伯来语等动态切换语言提供良好的用户体验掌握国际化技术让你的应用走向全球

相关文章:

Flutter国际化与本地化完全指南

Flutter国际化与本地化完全指南 引言 国际化是构建全球化应用的关键环节,Flutter提供了完善的国际化支持。本文将深入探讨Flutter中的国际化和本地化技术。 一、基础配置 1.1 添加依赖 dependencies:flutter_localizations:sdk: flutterintl: ^0.18.11.2 更新main.d…...

CSS背景效果完全指南

CSS背景效果完全指南 引言 CSS背景效果是美化网页的重要手段,通过合理使用背景属性,可以创造出丰富的视觉效果。本文将深入探讨CSS背景的各种属性和高级技巧。 一、背景基础 1.1 background-color .element {background-color: #4CAF50;background-color…...

2026免费一键去图片水印App详细教程,哪个好用一看就会

你是不是也遇到过这种抓狂瞬间:好不容易找到一张绝美壁纸,下载下来发现右下角有个硕大的水印;刷小红书看到一张干货满满的食谱长图,想保存下来慢慢看,结果水印刚好盖在关键步骤上;又或者自己做图时手滑把水…...

144-基于Flask的电商超市数据可视化分析系统

基于 Flask 的电商超市数据可视化分析系统 — 技术文档 目录 项目概述技术栈项目结构系统架构数据库设计后端路由设计数据分析引擎前端页面设计API 接口文档用户认证与权限管理后台部署与运行依赖清单 1. 项目概述 本系统是一个基于 Flask 框架的电商超市数据可视化分析平台…...

Codeforces Round 1058

【实况】Codeforces Round 1058 (Div. 2)(rk3194;perf1423;solve3) https://www.bilibili.com/video/BV1Tv4GzwE5r/ 【赛时3/7】Codeforces Round 1058(Div.2)上1000了记录一下 https://www.bilibili.com/video/BV1BC4kzMEoa/ Codeforces Round 1058 (Di…...

2026最新免费图片去水印工具详细教程丨手把手教会你,一看就会

你是不是也遇到过这样的抓狂时刻:相册里翻到一张超好看的壁纸,刚想设成桌面,角落那个大大的水印瞬间让人没了心情;做课件做汇报,急需一张干净的产品图,翻遍全网不是带标的就是要付费;刷视频看到…...

Kubernetes成本优化与资源管理:降低云原生基础设施成本

Kubernetes成本优化与资源管理:降低云原生基础设施成本 一、成本优化概述 Kubernetes成本优化是通过合理配置资源、优化调度策略、选择合适的实例类型等方式,降低云原生基础设施的运营成本。 1.1 成本组成 成本类型说明优化方向计算成本CPU、内存资源…...

Kubernetes事件驱动架构设计:构建响应式微服务系统

Kubernetes事件驱动架构设计:构建响应式微服务系统 一、事件驱动架构概述 事件驱动架构(EDA) 是一种设计模式,其中系统的行为由事件触发。在Kubernetes环境中,事件驱动架构可以实现松耦合、高可扩展的微服务系统。 …...

Linux渗透测试实战命令指南:从信息收集到横向移动

1. 这不是命令手册,而是一张渗透测试现场的“作战地图”你有没有过这样的经历:坐在靶机前,刚扫出一个Web服务,脑子里立刻蹦出七八个工具名——nmap、gobuster、sqlmap、hydra……可手一伸向键盘,却卡在了第一个参数上&…...

Linux端口敲门原理与knockd实战部署指南

1. 端口敲门不是玄学,是可控的“隐形门铃”很多人第一次听说“SSH端口敲门”,第一反应是:这玩意儿是不是给服务器加了一把看不见的锁?听起来很酷,但真用起来会不会像在黑盒里调音——敲对了门开,敲错了直接…...

AWVS 25.5 Windows版深度部署指南:CVE精准验证与DevSecOps集成

1. 这不是普通安装教程:AWVS 25.5 Windows版的真实价值在哪?很多人搜“AWVS安装教程”,点进来第一反应是“又要填注册码、改hosts、下破解补丁?”——这种认知已经严重落后于2025年的真实技术现场。我用AWVS 25.5在三个不同行业的…...

2026年AI论文写作工具实测认证:5款神器从文献到降重一站式避坑指南

写论文的焦虑,是每个科研人和学生绕不开的“必修课”。选题无从下手,文献检索耗时费力,格式调整反复修改,查重降重更是让人抓耳挠腮。2026年的AI工具早已不是当年的“辅助软件”,而是升级为能理解学术逻辑、生成高质量…...

2026年AI论文写作软件盘点:12款神器助你高效完成去痕改写、润色和过检

随着 AI 技术的持续突破,2026 年的论文写作工具市场已进入“智能化、精细化、合规化”的全新发展阶段。从本科生的课程论文到研究生的学位论文,再到科研人员的期刊投稿,AI 工具正以强大的技术支撑覆盖各类学术场景。无论是选题方向的启发、文…...

《当下的力量》7-10章终章解读:从临在到臣服,活出生命的终极自由

《当下的力量》7-10章终章解读:从临在到臣服,活出生命的终极自由终章:这是全书最具力量的部分,它将告诉你如何在最艰难的人生境遇中,依然保持内心的平静与自由前言 在前六章中,我们已经了解了人类痛苦的根源…...

Python算法基础篇之广度优先搜索(BFS)

一、什么是广度优先搜索(BFS)? 广度优先搜索(Breadth-First Search, BFS) 是一种用于遍历或搜索图、树的算法。其核心策略是:从起始节点出发,先访问所有直接邻居(第1层)&…...

Python算法基础篇之深度优先搜索(DFS)

一、什么是深度优先搜索(DFS)? 深度优先搜索(Depth-First Search, DFS) 是一种用于遍历或搜索图、树的算法。其核心策略是:从起始节点出发,沿着一条路径尽可能深入地探索,直到无法继…...

信创中间件深度解析:东方通TongWeb vs 金蝶天燕 vs 宝兰德,企业级选型指南

📚 信创中间件 🔧 企业级部署 🚀 国产化替代 ⏱️ 阅读约15分钟开篇导读:你是否在信创改造中不知道用什么替代WebLogic或WebSphere?网上搜到的中间件资料要么只讲产品功能不讲迁移方案,要么直接给配置却不解…...

中小企业AI落地成本杀手!DeepSeek计费冷知识曝光(含4个可立即启用的免费优化开关)

更多请点击: https://codechina.net 第一章:中小企业AI落地成本杀手!DeepSeek计费冷知识曝光(含4个可立即启用的免费优化开关) 很多中小企业误以为调用 DeepSeek API 的成本仅取决于 token 数量,却忽略了隐…...

网络技术05-TCP拥塞控制算法——从CUBIC到BBR的性能进化

🚗 一句话总结:TCP拥塞控制就像开车——看到前面堵车就减速(拥塞避免),路通畅了就慢慢加速(慢启动)。CUBIC是"看到堵车就猛踩刹车",BBR是"根据路况预测提前调整"…...

eClinMed 中国人民解放军总医院第五医学中心介入超声科:基于超声的可解释性机器学习模型用于≤3cm肝细胞癌分类的开发与验证

01文献信息本次分享的文献是由中国人民解放军总医院第五医学中心介入超声科联合厦门大学附属翔安医院、南开大学医学院和福州市第一总医院超声科等55家医院在2025年2月在柳叶刀子刊《eClinicalMedicine》(中科院1区,IF10.0)上的研究“Develop…...

J Thorac Oncol(IF=20.8)广东省人民医院钟文昭教授团队:基于影像组学的支持向量机区分驱动肺腺癌进展的分子事件

01文献信息本次分享的文献是由广东省人民医院肺癌研究所钟文昭教授团队联合华南理工大学医学院、广东省人民医院病理科、核医学科等多学科团队在2024年9月19日在《Journal of Thoracic Oncology》(中科院1区,IF20.8)上发表的研究“Radiomics-…...

Claude Code 2026 全命令实战:6分钟开发完整坦克对战游戏

文章目录前言第一步:新建文件夹,然后输入一个单词第二步:/plan命令,比产品经理还贴心的规划师第三步:看着AI写代码,自己在旁边喝咖啡第四步:/rewind命令,程序员的后悔药第五步&#…...

深度剖析Claude Code实操逻辑,解锁AI编程高效开发方式

文章目录前言一、我用Claude Code的翻车现场,能写一本《程序员血泪史》二、Claude Code的核心设计思想:你以为它是保姆,其实它是保安三、普通模式vs规划模式:一个是临时工,一个是项目经理四、两条核心指令,…...

掌握AI技能配置技巧 大幅提升日常办公开发效率

P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能…...

量子机器学习模型安全:反向工程威胁与防御策略解析

1. 量子机器学习模型的反向工程:安全威胁与防御策略量子计算与机器学习的结合,正以前所未有的方式重塑我们处理复杂问题的能力。作为一名长期关注量子算法与信息安全交叉领域的研究者,我亲眼见证了量子机器学习从理论构想走向实际应用的飞速发…...

【Sora 2视频后期处理黄金法则】:20年AI影像专家亲授5大不可绕过的帧级调优技巧

更多请点击: https://codechina.net 第一章:Sora 2视频后期处理的底层逻辑与帧级思维重构 Sora 2并非传统时间轴驱动的剪辑工具,其视频后期处理建立在扩散模型与隐空间帧序列联合优化的基础之上。每一帧不再作为孤立图像存在,而是…...

Burp Suite实操避坑指南:从抓包失败到漏洞验证的完整链路

1. 这不是又一本“Burp Suite入门指南”,而是一份我亲手调试过37次配置、在真实客户环境里跑通21个靶场、被5个刚转行的安全新人追着问细节的实操手记你点开这个标题,大概率正站在两个路口之间:一边是满屏英文弹窗、Proxy拦截失败、Repeater发…...

【2024新闻稿生产力白皮书】:实测17款Prompt后沉淀出的唯一高通过率模板(附A/B测试数据:发布成功率↑410%)

更多请点击: https://codechina.net 第一章:ChatGPT新闻稿写作模板的底层逻辑与范式演进 新闻稿生成并非简单拼接关键词,而是语义意图建模、事实锚定与传播修辞三重机制协同作用的结果。早期模板依赖规则引擎(如正则匹配预设句式…...

安卓高版本APP抓包失败原因与BurpSuite+雷电模拟器9实战绕过指南

1. 为什么高版本安卓APP抓包变得像拆弹——从Android 7到12的证书信任机制演进你有没有试过把BurpSuite的CA证书拖进雷电模拟器9里,双击安装,弹出“已安装但无法启用”的提示?或者App一启动就报“网络连接异常”,连登录页都打不开…...

Gemini模型迭代、推理成本、合规折旧、业务适配率——四大价值损耗源深度拆解,附可落地的季度健康度自检表

更多请点击: https://codechina.net 第一章:Gemini生命周期价值分析 Gemini 模型作为 Google 推出的多模态大语言模型系列,其生命周期价值不仅体现在推理性能与响应速度上,更贯穿于训练、部署、监控、迭代与退役全过程。理解这一…...