news 2026/7/30 17:45:13

Flutter实现国际化(多语言)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flutter实现国际化(多语言)

在全球化趋势下,应用支持多语言是非常重要的。Flutter 提供了强大的国际化(i18n)支持,可以通过 flutter_localizations 与 gen-l10n 工具生成的本地化类来实现不同区域和语言的适配。本篇博客将介绍如何在 Flutter 项目中使用 flutter_localizations,并实现多语言支持与动态切换。

效果图:

1. 什么是国际化(i18n)和本地化(l10n)?

国际化(i18n)是指编写软件,使其能够在不同的语言和文化环境中运行。它包含了将软件中的文本、日期、时间等元素抽象出来,以便根据用户的区域设置进行翻译和显示。

本地化(l10n)是国际化的具体应用步骤,它包括将应用程序的语言、日期格式、货币符号等内容适配到特定地区。

2. 配置

在settings -> plugins里下载intl插件

需要在 pubspec.yaml 中添加依赖:

dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter

在最底部加上:

flutter_intl: enabled: true

运行 flutter pub get 下载依赖,会自动生成文件,他默认生成一个英文的文件:


修改 MaterialApp 以支持国际化

在 MaterialApp 中配置 localizationsDelegates 和 supportedLocales 以支持本地化。具体代码如下:

class MyApp extends StatefulWidget { @override State<MyApp> createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { Locale _locale = Locale('en'); // 默认语言 void setLocale(Locale locale) { setState(() { _locale = locale; }); } @override Widget build(BuildContext context) { return MaterialApp( locale: _locale,// 设置当前的 Locale localizationsDelegates: const [ S.delegate, GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: const [ Locale('en', 'US'), //英文 Locale('zh', 'CN'), //简体中文 Locale('zh', 'TW') //繁体中文 ], home: MyHomePage( onLocaleChange: (Locale locale) { setLocale(locale); }, ), ); } }

3. 添加和生成语言文件

intl 使用 .arb 文件来存储不同语言的翻译资源。接下来,我们点击:Tools -> Flutter Intl -> Add Local,可以新增其他语言

我们可以加上中文简体:zh 和繁体:zh_TW:

语言文件示例

lib/l10n/intl_en.arb:

{ "content": "china" }

lib/l10n/intl_zh.arb:

{ "content": "中国" }

lib/l10n/intl_zh_TW.arb:

{ "content": "中國" }

4.动态切换语言:

5.通过手机系统语言来显示对应语言的话:

6.完整示例代码:

import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'generated/l10n.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override State<MyApp> createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { Locale _locale = const Locale('en', 'US'); // 默认语言 void setLocale(Locale locale) { setState(() { _locale = locale; }); } @override Widget build(BuildContext context) { return MaterialApp( locale: _locale, // 设置当前的 Locale localizationsDelegates: const [ S.delegate, GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: const [ Locale('en', 'US'), //英文 Locale('zh', 'CN'), //简体中文 Locale('zh', 'TW'), //繁体中文 Locale('zh', 'UG') //维语 ], //如果使用系统语言,使用下面的: /*localeResolutionCallback: (locale, supportedLocales) { if (locale?.countryCode == 'CN') {// 如果语言是简体 return const Locale('zh', 'CN'); } else if (locale?.countryCode == 'TW') {// 如果语言繁体 return const Locale('zh', 'TW'); } else { return const Locale('en', 'US'); } },*/ home: MyHomePage( onLocaleChange: (Locale locale) { setLocale(locale); }, ), ); } } class MyHomePage extends StatelessWidget { final Function(Locale) onLocaleChange; const MyHomePage({Key? key, required this.onLocaleChange}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Flutter 国际化 Demo'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ //此处国际化文字 Text( S.current.content, style: const TextStyle( color: Colors.red, fontSize: 50, fontWeight: FontWeight.w700), ), changeButton(const Locale('zh', 'CN'), '简体'), changeButton(const Locale('zh', 'TW'), '繁体'), changeButton(const Locale('en', 'US'), '英文'), changeButton(const Locale('zh', 'UG'), '维语'), ], ), ), ); } Widget changeButton(Locale newLocale, String text) { return ElevatedButton( onPressed: () { onLocaleChange(newLocale); // 调用 MyAppState 的 setLocale 方法 }, child: Text(text), ); } }

希望这篇文章对你了解 Flutter 国际化有所帮助!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/30 17:42:33

无线动能开关|现代写字楼免布线智慧控灯方案

一.系统概述现代商务写字楼装修迭代快、办公格局灵活多变&#xff0c;开放式办公区、独立办公室、会议室、公共大堂灯光点位多、控灯需求复杂。传统按键开关需要预埋布线、凿墙走线&#xff0c;改造施工繁琐、工期长、成本高&#xff0c;且后期工位调整、格局改动时&#xff0c…

作者头像 李华
网站建设 2026/7/30 17:40:43

计算机毕业设计之基于springboot宾馆住宿管理系统

随着经济的发展&#xff0c;互联网络时代也在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势。本文将讲述设计开发一个宾馆住宿管理系统&#xff0c;这个宾馆住宿管理系统包括二个部分&#xff1a;前台与后台。系…

作者头像 李华
网站建设 2026/7/30 17:40:21

CodeBox终极指南:5分钟解决CSDN、知乎等网站内容获取难题

CodeBox终极指南&#xff1a;5分钟解决CSDN、知乎等网站内容获取难题 【免费下载链接】code-box 本插件可以用于CSDN/知乎/脚本之家/博客园/掘金等网站,一键下载文章html或markdown文件;实现无需登录一键复制代码;支持选中代码;或者代码右上角按钮的一键复制;解除关注博主即可阅…

作者头像 李华
网站建设 2026/7/30 17:40:11

WebAssembly for Proxies (Go SDK)未来路线图:wasip1支持与新特性展望

WebAssembly for Proxies (Go SDK)未来路线图&#xff1a;wasip1支持与新特性展望 【免费下载链接】proxy-wasm-go-sdk WebAssembly for Proxies (Go SDK) 项目地址: https://gitcode.com/gh_mirrors/pr/proxy-wasm-go-sdk WebAssembly for Proxies (Go SDK) 作为一款专…

作者头像 李华
网站建设 2026/7/30 17:40:03

如何用GetQzonehistory找回十年QQ空间记忆:三步实现数字时光机

如何用GetQzonehistory找回十年QQ空间记忆&#xff1a;三步实现数字时光机 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾翻看QQ空间&#xff0c;试图找回十年前写下第一条说说…

作者头像 李华
网站建设 2026/7/30 17:39:30

计算机视觉40例:案例33绘制关键点案例34勾勒五官轮廓

案例33绘制关键点# 使用dlib进行人脸关键点检测&#xff08;68个特征点&#xff09;## 完整代码python import numpy as np import cv2 import dlib# 读取图像 img cv2.imread("people.jpg")# Step 1&#xff1a;构造人脸检测器&#xff08;dlib初始化&#xff09; …

作者头像 李华