You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter应用全局动态切换语言需求求助(无需语言JSON文件)

Flutter 无JSON文件动态多语言切换实现方案

针对你需要实现无需JSON文件的全应用动态语言切换需求,同时修复现有AutoLocalBuilder扩展失效问题,以下是完整实现方案:

核心思路

  • 用全局状态管理维护当前语言环境与翻译映射
  • 扩展String类型简化翻译调用
  • 通过状态监听组件自动触发UI重建,实现实时语言切换

完整实现代码

1. 语言状态管理类

import 'package:flutter/foundation.dart';

class LanguageProvider extends ChangeNotifier {
  // 存储多语言翻译映射,key为原字符串,value对应各语言翻译
  Map<String, Map<String, String>> _translations = {
    'en': {
      'hello': 'Hello',
      'welcome': 'Welcome to our app',
    },
    'zh': {
      'hello': '你好',
      'welcome': '欢迎使用我们的应用',
    },
    'es': {
      'hello': 'Hola',
      'welcome': 'Bienvenido a nuestra aplicación',
    },
  };

  String _currentLocale = 'zh'; // 默认中文

  String get currentLocale => _currentLocale;

  // 获取当前语言对应的翻译
  String translate(String key) {
    return _translations[_currentLocale]?[key] ?? key;
  }

  // 切换语言并通知所有监听组件更新
  void switchLocale(String locale) {
    if (_translations.containsKey(locale)) {
      _currentLocale = locale;
      notifyListeners();
    }
  }
}

2. 修复String扩展方法

替换你原有的translates扩展,改为依赖状态管理实现:

import 'package:flutter/material.dart';
import 'language_provider.dart';

extension StringLocalization on String {
  Widget translates({
    TextAlign? textAlign,
    TextStyle? style,
    int? maxLines,
    TextOverflow? overflow,
  }) {
    return Consumer<LanguageProvider>(
      builder: (context, provider, child) {
        return Text(
          provider.translate(this),
          overflow: overflow,
          maxLines: maxLines,
          style: style,
          textAlign: textAlign,
        );
      },
    );
  }
}

3. 全局注入状态管理

在main.dart中用状态管理包裹根组件:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'language_provider.dart';

void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) => LanguageProvider(),
      child: const MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Dynamic Localization Demo',
      home: const HomePage(),
    );
  }
}

4. 语言切换UI示例

class HomePage extends StatelessWidget {
  const HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    final languageProvider = Provider.of<LanguageProvider>(context);
    return Scaffold(
      appBar: AppBar(title: '语言切换示例'.translates()),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            'hello'.translates(style: const TextStyle(fontSize: 24)),
            const SizedBox(height: 20),
            'welcome'.translates(style: const TextStyle(fontSize: 18)),
            const SizedBox(height: 40),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                ElevatedButton(
                  onPressed: () => languageProvider.switchLocale('zh'),
                  child: '中文'.translates(),
                ),
                const SizedBox(width: 10),
                ElevatedButton(
                  onPressed: () => languageProvider.switchLocale('en'),
                  child: 'English'.translates(),
                ),
                const SizedBox(width: 10),
                ElevatedButton(
                  onPressed: () => languageProvider.switchLocale('es'),
                  child: 'Español'.translates(),
                ),
              ],
            )
          ],
        ),
      ),
    );
  }
}

关键说明

  • 无需JSON文件:所有翻译直接维护在LanguageProvider的_translations映射中,可按需增删语言条目
  • 动态切换:调用switchLocale后,所有使用.translates()的文本组件会自动重建更新
  • 复用性强:任意字符串只需调用.translates()即可实现多语言支持,无需重复编写监听逻辑

内容的提问来源于stack exchange,提问作者Zeelkumar Sojitra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:57:58