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

如何在Flutter应用运行时切换Locale(本地化语言)?

Flutter应用内切换语言失败(无法加载JSON语言文件)解决方案

你直接调用LocalJsonLocalization.delegate.load()无法触发语言切换,本质是没有通过MaterialApp的locale状态驱动本地化资源加载,再加上可能存在JSON文件路径配置问题,才导致加载失败。以下是具体解决步骤:

1. 检查并配置JSON语言文件路径

  • 将JSON语言文件放在lib/locales/目录下(比如en.json、zh.json)
  • 在pubspec.yaml中声明assets路径,否则Flutter无法访问这些文件:
flutter:
  assets:
    - lib/locales/

2. 通过状态管理Locale实现切换

不能直接调用delegate的load方法,需要用StatefulWidget管理当前Locale,修改后触发MaterialApp重建,自动加载对应语言的JSON:

完整示例代码

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:localization/localization.dart';
import 'package:intl/intl.dart';

void main() {
  runApp(const MyApp());
}

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

  @override
  State<MyApp> createState() => _MyAppState();

  // 提供外部调用的切换方法
  static void switchLocale(BuildContext context, Locale newLocale) {
    final state = context.findAncestorStateOfType<_MyAppState>();
    state?.updateLocale(newLocale);
  }
}

class _MyAppState extends State<MyApp> {
  Locale? _currentLocale;

  void updateLocale(Locale locale) {
    setState(() => _currentLocale = locale);
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    // 初始化时获取系统默认语言
    if (_currentLocale == null) {
      setState(() => _currentLocale = Localizations.localeOf(context));
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      locale: _currentLocale, // 绑定当前Locale
      localizationsDelegates: const [
        LocalJsonLocalization.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: const [
        Locale('en'), // 支持的语言列表
        Locale('zh'),
      ],
      home: const HomePage(),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('app_title'.i18n())),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('welcome_msg'.i18n()),
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => MyApp.switchLocale(context, const Locale('en')),
              child: const Text('切换到英文'),
            ),
            ElevatedButton(
              onPressed: () => MyApp.switchLocale(context, const Locale('zh')),
              child: const Text('切换到中文'),
            ),
          ],
        ),
      ),
    );
  }
}

3. 确保JSON文件格式正确

示例lib/locales/en.json:

{
  "app_title": "Localization Demo",
  "welcome_msg": "Welcome to our app!"
}

示例lib/locales/zh.json:

{
  "app_title": "本地化演示",
  "welcome_msg": "欢迎使用我们的应用!"
}

关键说明

  • 本地化系统依赖MaterialApp的locale属性决定加载哪套语言资源,直接调用delegate.load()不会触发UI和资源更新,必须通过修改locale并触发重建。
  • 如果日志仍提示无法加载JSON,优先检查pubspec.yaml的assets配置是否正确,以及JSON文件的路径、命名是否和supportedLocales中的Locale匹配(比如Locale('zh')对应zh.json,不要写成zh_CN.json除非你指定了完整Locale)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:45:34