Flutter 国际化:多语言资源与动态切换

Flutter 国际化通过 flutter_localizationsintl 包实现,包含多语言资源管理与运行时动态切换。以下是完整实现流程:


1. 添加依赖

pubspec.yaml 中添加:

dependencies:
  flutter_localizations:
    sdk: flutter
  intl: ^0.18.0


2. 创建多语言资源文件

在项目根目录创建 l10n 文件夹,并添加 .arb 文件:

  • app_en.arb(英语)
{
  "helloWorld": "Hello World!",
  "@helloWorld": {
    "description": "首页欢迎语"
  }
}

  • app_zh.arb(中文)
{
  "helloWorld": "你好,世界!"
}


3. 生成本地化类

pubspec.yaml 中启用代码生成:

flutter:
  generate: true

运行命令生成代码:

flutter pub get && flutter gen-l10n

生成文件位于 lib/l10n,包含 AppLocalizations 类。


4. 配置 MaterialApp

main.dart 中设置本地化代理:

import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:your_app/l10n/app_localizations.dart';

MaterialApp(
  localizationsDelegates: const [
    AppLocalizations.delegate, // 生成的代理
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
  ],
  supportedLocales: const [
    Locale('en'), // 英语
    Locale('zh'), // 中文
  ],
  home: MyHomePage(),
);


5. 动态切换语言

使用 Provider 实现运行时切换:
(1) 添加状态管理依赖

dependencies:
  provider: ^6.0.0

(2) 创建语言状态类

class LocaleProvider with ChangeNotifier {
  Locale _locale = const Locale('en');
  
  Locale get locale => _locale;
  
  void setLocale(Locale loc) {
    _locale = loc;
    notifyListeners();
  }
}

(3) 在 MaterialApp 中绑定状态

ChangeNotifierProvider(
  create: (_) => LocaleProvider(),
  child: Consumer<LocaleProvider>(
    builder: (context, provider, child) {
      return MaterialApp(
        locale: provider.locale, // 动态绑定语言
        // ...其他配置
      );
    },
  ),
);

(4) 切换语言按钮

ElevatedButton(
  onPressed: () {
    final provider = Provider.of<LocaleProvider>(context, listen: false);
    provider.setLocale(const Locale('zh')); // 切换到中文
  },
  child: Text('切换中文'),
);


6. 使用多语言文本

在组件中通过 AppLocalizations 调用:

Text(AppLocalizations.of(context)!.helloWorld),

效果:

  • 默认显示英语:Hello World!
  • 点击按钮后切换为中文:你好,世界!

关键优化点
  1. 热重载支持:修改 .arb 文件后运行 flutter gen-l10n 可实时生效
  2. 占位符处理:在 .arb 中使用 {variable} 语法:
    "welcome": "Hello, {name}!",
    

    调用代码:
    AppLocalizations.of(context)!.welcome('Alice')
    

  3. 复数与性别:通过 intlplural()gender() 方法处理复杂语法

注意事项

  • 确保所有 .arb 文件的 key 完全一致
  • 动态切换时需重建 MaterialApp(通过 Provider 通知)
  • 测试时使用 flutter test --dart-define=FLUTTER_TEST=true 模拟多语言环境
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐