Flutter国际化
App 项目为什么需要国际化?
公司项目的国际化需求来得很突然,就是因为要参加国外的展会,方便展示给客户使用App的操作步骤。正常情况下国际化无非是通过将应用程序本地化为不同的语言和地区,可以使应用在全球范围内更具吸引力,从而扩大市场覆盖范围。当你的应用能够以用户熟悉和舒适的语言呈现时,吸引更多的用户成为可能,同时也提升用户的使用体验,或者是遵守当地法律法规及政策的要求。
Flutter 项目国际化需要做哪些准备?
作为设计者首先要对现有的技术进行一个选型,如果没有再考虑造轮子。
intl
包
- 官方支持:由 Dart 官方团队维护,稳定且广泛使用。
- 功能丰富:支持复杂的国际化需求,如日期、数字、货币格式化,复数、性别等高级本地化功能。
- 依赖较多:需要结合
flutter_localizations
和intl_utils
等工具使用。
easy_localization
库
- 第三方库:由社区维护,旨在简化国际化过程。
- 易于使用:提供简洁的 API 和配置方式,适合快速实现多语言支持。
- 功能全面:支持动态语言切换、嵌套翻译、复数等功能,但在某些高级用法上可能不如
intl
灵活。
详细对比
特性 | intl | easy_localization |
---|---|---|
安装和配置 | 需要在 pubspec.yaml 中添加多个依赖(intl , flutter_localizations , intl_utils )并配置 ARB 文件。 | 更简洁的安装,仅需添加 easy_localization 依赖,并配置翻译文件路径。 |
本地化文件格式 | 使用 ARB(JSON 格式)文件,适合与 intl 工具链集成。 | 支持 JSON、YAML、CSV 等多种格式,灵活性更高。 |
代码生成 | 依赖 intl_utils 进行代码生成,生成强类型的本地化类,确保编译时类型安全。 | 不依赖代码生成,通过键值对进行字符串查找,适合快速开发但缺乏编译时类型检查。 |
动态语言切换 | 支持,但需要手动实现语言切换逻辑。 | 内置支持动态切换语言,提供简单的 API(如 context.setLocale )。 |
复数和性别支持 | 提供强大的复数、性别等高级本地化支持,适合需要复杂语言处理的应用。 | 支持基本的复数和性别处理,但在复杂场景下可能不如 intl 灵活。 |
格式化支持 | 内置支持日期、时间、数字、货币等格式化,使用 intl 提供的格式化方法。hhh | 主要依赖自身或其他包进行格式化,格式化功能不如 intl 完备。 |
学习曲线 | 较陡,需要理解 ARB 文件结构、代码生成工具以及 intl 的 API。 | 更平缓,API 简单易懂,适合快速上手。 |
社区支持与文档 | 拥有丰富的文档和广泛的社区支持,是官方推荐的国际化方案。 | 社区活跃,文档详细,但相对于 intl 可能资源略少。 |
灵活性和定制化 | 高度灵活,适合复杂和大型项目,支持高度定制化的国际化需求。 | 提供足够的灵活性满足大多数应用需求,但在某些高级用法上可能需要额外实现。 |
性能 | 性能优秀,尤其在使用强类型本地化类时,字符串查找更高效。 | 性能良好,适用于大多数应用场景,但由于使用键值对查找,可能在极端情况下略逊于 intl 。 |
支持的语言和地区 | 广泛支持多种语言和地区,适合国际化要求高的应用。 | 同样支持多种语言和地区,但在处理特定语言需求时可能需要更多手动配置。 |
右到左语言支持 | 完全支持,通过 flutter_localizations 提供 RTL 支持。 | 同样支持 RTL,通过 Flutter 本身的国际化支持实现。 |
集成第三方工具 | 与许多国际化工具和服务(如翻译管理系统)集成良好,适合需要与外部系统协作的项目。 | 集成相对简单,但在与特定工具或服务的集成上可能需要额外工作。 |
维护和更新 | 由 Dart 官方团队维护,更新频率高,稳定性好。 | 由社区维护,活跃度高,但依赖社区的更新速度和维护质量。 |
intl方案
工具类别 | 工具及描述 |
---|---|
本地化支持 | flutter_localizations - 提供 Flutter 内置的本地化支持,如本地化组件文本。 |
代码生成 | intl_utils - 自动生成强类型的本地化类,简化 intl 的使用过程。 |
添加依赖:在你的 pubspec.yaml 文件中添加 intl 和 intl_utils 依赖:
dev_dependencies:
intl: ^0.17.0 #自行根据flutter以及dart选择版本
intl_utils: ^2.4.0
然后在pubspec.yaml中对flutter_intl进行配置
flutter_intl: enabled: true class_name: S main_locale: en output_dir: lib/language/generated arb_dir: lib/language/l10n
工作流程
设置依赖:在 pubspec.yaml
中添加 intl
和 intl_utils
。
标记待翻译的字符串:在代码中使用 Intl.message()
包装所有需要本地化的字符串。
生成 ARB 文件:运行 flutter pub run intl_utils:generate
生成 ARB 文件。
翻译 ARB 文件:手动翻译或使用翻译管理平台进行翻译。
生成本地化代码:运行 flutter pub run intl_utils:generate
生成本地化 Dart 代码。
使用本地化字符串:在 MaterialApp
或 CupertinoApp
中配置本地化支持,并在 UI 中使用本地化字符串。