在 Debian 上为 Flutter 应用启用本地化
一 环境准备与项目配置
- 在 Debian 上安装 Flutter SDK,创建项目并确认可运行:flutter create my_app && cd my_app。
- 添加依赖(两种常用方案,二选一或混用):
- 使用 flutter_localizations(推荐):提供 Material/Cupertino/Widgets 的本地化委托与多语言支持。
- 使用 intl:提供日期、数字、复数等格式化能力。
- 在 pubspec.yaml 启用代码生成并添加依赖:
- 启用生成:flutter: generate: true
- 依赖示例:
- flutter_localizations: sdk: flutter
- intl: ^0.19.0(请使用最新稳定版)
- 安装依赖:flutter pub get。
二 方案A 使用 flutter_localizations 与 arb 文件
- 目录约定:在 lib/l10n/ 放置 .arb 文件,例如 app_en.arb、app_zh.arb。
- 示例 app_en.arb:
{
“hello_world”: “Hello, World!”,
“app_name”: “My App”
}
- 示例 app_zh.arb:
{
“hello_world”: “你好,世界!”,
“app_name”: “我的应用”
}
- 生成 Dart 本地化代码:flutter gen-l10n(Flutter 3.16+ 内置工具,自动生成 l10n/*.dart 与委托)。
- 在 MaterialApp 中启用本地化:
- 导入:import ‘package:flutter_localizations/flutter_localizations.dart’;
- 配置:
- localizationsDelegates: [GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, AppLocalizations.delegate],
- supportedLocales: [Locale(‘en’), Locale(‘zh’)],
- locale: Locale(‘zh’)(可选,默认跟随系统)。
- 在代码中使用:AppLocalizations.of(context)!.helloWorld。
三 方案B 使用 intl 与消息提取生成
- 初始化与添加语言(可选,使用 flutter_intl 插件更便捷):
- Android Studio:Tools → Flutter Intl → Initialize for the Project(生成 l10n/intl_en.arb 等)。
- 添加语言:Tools → Flutter Intl → Add Local(生成 intl_zh_CN.arb 等)。
- 提取与生成代码(旧版工作流,适用于不使用 gen-l10n 的项目):
- 提取模板:flutter pub run intl_translation:extract_to_arb --output-dir=lib/l10n lib/localization.dart
- 生成 Dart:flutter pub run intl_translation:generate_from_arb --output-dir=lib/l10n --no-use-deferred-loading lib/localization.dart lib/l10n/intl_*.arb
- 在代码中使用 Intl.message 或生成的 messages_all.dart 访问翻译:
- Intl.message(‘Hello, World!’, name: ‘helloWorld’)
- 或使用 Messages.of(context).helloWorld。
四 运行时切换语言与系统语言适配
- 应用内切换语言(临时覆盖):
- 使用 Localizations.override 包裹需要切换语言的页面或组件,指定目标 Locale(如 Locale(‘zh’))。
- 跟随系统语言:
- 不显式设置 MaterialApp.locale,或在桌面平台按系统区域设置选择 supportedLocales 中最匹配项。
- 测试要点:
- 在 Debian 上运行 flutter run,切换系统语言与应用内语言,核对界面文本、日期与数字格式是否正确。
五 常见问题与最佳实践
- 字符串提取遗漏:确保所有需要翻译的文本都写入 .arb,并重新运行生成命令;使用 arb 的 @key 注释为翻译人员提供上下文。
- 复数与性别:使用 intl 的 Intl.plural/Intl.gender 等 API,避免硬编码字符串拼接。
- 字体与排版:为不同语言(如 中文/阿拉伯文/印地语)准备合适的字体与 TextDirection,避免截断与断行。
- 构建与打包:本地化代码由 gen-l10n 或生成脚本在构建阶段纳入,确保 CI/CD 执行 flutter pub get 与代码生成步骤。
- 桌面平台细节:Linux/Debian 环境下,确保系统已安装所需语言包与字体,以获得完整的本地化体验。