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

如何在Flutter中获取手机默认语言并切换应用语言?

Flutter 获取系统默认语言并切换应用语言

一、检测手机默认语言

Flutter 中可以直接通过平台调度器获取系统当前的语言设置,代码如下:

import 'package:flutter/material.dart';

// 获取系统完整Locale(包含语言和地区,如zh_CN、en_US)
Locale getSystemLocale() {
  return WidgetsBinding.instance.platformDispatcher.locale;
}

// 获取语言标签字符串(如"zh-CN"、"en-US")
String getSystemLocaleTag() {
  return WidgetsBinding.instance.platformDispatcher.locale.toLanguageTag();
}

调用后会返回系统当前的语言设置,比如中文简体环境下返回Locale('zh', 'CN'),英文环境返回Locale('en', 'US')。

二、根据系统语言切换应用语言

要实现应用内语言跟随系统,需要结合多语言资源配置和MaterialApp的本地化参数,步骤如下:

1. 准备多语言资源

创建i18n文件夹,存放不同语言的JSON文件:

  • i18n/en.json
{
  "hello": "Hello World",
  "settings": "Settings"
}
  • i18n/zh.json
{
  "hello": "你好世界",
  "settings": "设置"
}

在pubspec.yaml中声明资源路径:

flutter:
  assets:
    - i18n/en.json
    - i18n/zh.json

2. 实现本地化代理类

创建app_localizations.dart文件,封装多语言加载和读取逻辑:

import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class AppLocalizations {
  final Locale locale;

  AppLocalizations(this.locale);

  static AppLocalizations of(BuildContext context) {
    return Localizations.of<AppLocalizations>(context, AppLocalizations)!;
  }

  static const LocalizationsDelegate<AppLocalizations> delegate = _AppLocalizationsDelegate();

  Map<String, String> _localizedStrings = {};

  Future<void> load() async {
    String jsonString = await rootBundle.loadString('i18n/${locale.languageCode}.json');
    Map<String, dynamic> jsonMap = json.decode(jsonString);
    _localizedStrings = jsonMap.map((key, value) => MapEntry(key, value.toString()));
  }

  String translate(String key) {
    return _localizedStrings[key] ?? key;
  }
}

class _AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {
  const _AppLocalizationsDelegate();

  @override
  bool isSupported(Locale locale) {
    return ['en', 'zh'].contains(locale.languageCode);
  }

  @override
  Future<AppLocalizations> load(Locale locale) async {
    AppLocalizations localizations = AppLocalizations(locale);
    await localizations.load();
    return localizations;
  }

  @override
  bool shouldReload(_AppLocalizationsDelegate old) => false;
}

3. 配置MaterialApp并绑定系统语言

在主入口中初始化应用语言为系统默认值,同时支持手动切换和监听系统语言变化:

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

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

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

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

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

  @override
  void initState() {
    super.initState();
    // 初始化时获取系统默认语言
    _appLocale = WidgetsBinding.instance.platformDispatcher.locale;
    // 监听系统语言变化,自动同步应用语言
    WidgetsBinding.instance.platformDispatcher.onLocaleChanged = () {
      setState(() {
        _appLocale = WidgetsBinding.instance.platformDispatcher.locale;
      });
    };
  }

  void _updateLocale(Locale newLocale) {
    setState(() {
      _appLocale = newLocale;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      locale: _appLocale,
      supportedLocales: const [
        Locale('en', 'US'),
        Locale('zh', 'CN'),
      ],
      localizationsDelegates: const [
        AppLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      home: HomePage(onLocaleChanged: _updateLocale),
    );
  }
}

class HomePage extends StatelessWidget {
  final Function(Locale) onLocaleChanged;

  const HomePage({super.key, required this.onLocaleChanged});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(AppLocalizations.of(context).translate('settings'))),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(AppLocalizations.of(context).translate('hello')),
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => onLocaleChanged(const Locale('en', 'US')),
              child: const Text('切换到英文'),
            ),
            ElevatedButton(
              onPressed: () => onLocaleChanged(const Locale('zh', 'CN')),
              child: const Text('切换到中文'),
            ),
            ElevatedButton(
              onPressed: () => onLocaleChanged(WidgetsBinding.instance.platformDispatcher.locale),
              child: const Text('恢复系统默认语言'),
            ),
          ],
        ),
      ),
    );
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:15:30