Flutter进阶(2):国际化开发

news/2024/10/18 10:08:54

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

先看下效果图:

Flutter_multiLanguage.gif


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

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

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

二、部署环境&初始化

(1)这边用到vscode进行开发,需要下载 Flutter Intl 插件。

Flutter_mulitLanguage_A.png


(2)下载完成后,在项目中的pubspec.yaml添加依赖库:

dependencies:flutter:sdk: flutterflutter_localizations:sdk: flutter

(3)在vscode中按command\ctrl+shift+p,然后会弹出一个输入vscode内置命令的输入框和下拉结果。在 flutter 项目中,首次需要搜索Flutter Intl: Initialize命令,回车即可初始化和生成国际化相关文件代码。

Flutter_mulitLanguage_C.png


Flutter_mulitLanguage_D.png


就在项目中lib中默认生成了以下文件:

|-- generated 自动生成的文件,不需要手动编辑|-- intl|   |-- messages_all.dart 桥接多个语言文件 下面en zh等文件。|   |-- messages_en.dart 转译文件 自动从l10n/intl_en.arb 提取key/value 自动生成代码|-- l10n.dart 入口文件代码,不需要手动编辑
|-- l10n  存放国际化json文件位置 arb=json|-- intl_en.arb

三、修改 MaterialApp 以支持国际化

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

class MyApp extends StatefulWidget {const MyApp({super.key});  @overrideState<MyApp> createState() => _MyAppState();
}class _MyAppState extends State<MyApp> {Locale _locale = Locale('en'); // 默认语言void setLocale(Locale locale) {setState(() {_locale = locale;});}@overrideWidget build(BuildContext context) {return MaterialApp(locale: _locale,// 设置当前的 LocalelocalizationsDelegates: 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);},),);}
}

四、添加和生成语言文件(新增国际化)

intl使用.arb文件来存储不同语言的翻译资源。

(1)添加新的国际化文件可以搜索Flutter Intl: Add Locale命令,回车会切换到输入国际化编码。

Flutter_mulitLanguage_E.png


(2)然后在编辑框会提示输入国际化编码,例如要添加简体中文就输入:zh,添加繁体中文就添加:zh_TW。

(3)然后就会在l10n文件夹,自动添加 intl_zh.arbintl_zh_TW.arb文件,以及在generated/l10n文件夹中生成转译文件。

Flutter_mulitLanguage_F.png


语言文件示例

lib/l10n/intl_en.arb:

{"content": "china"
}

lib/l10n/intl_zh.arb:

{"content": "中国"
}

lib/l10n/intl_zh_TW.arb:

{"content": "中國"
}

五、动态切换语言

代码如下:

class MyHomePage extends StatelessWidget {final Function(Locale) onLocaleChange;const MyHomePage({super.key, required this.onLocaleChange});@overrideWidget 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'), '英文'),],),),);}// 动态切换语言Widget changeButton(Locale newLocale, String text) {return ElevatedButton(onPressed: () {onLocaleChange(newLocale); // 调用 MyAppState 的 setLocale 方法},child: Text(text),);}
}

六、通过手机系统语言来显示对应语言的话

代码如下:

class _MyAppState extends State<MyApp> {Locale _locale = const Locale('en', 'US'); // 默认语言void setLocale(Locale locale) {setState(() {_locale = locale;});}@overrideWidget build(BuildContext context) {return MaterialApp(//locale: _locale, // 【(1)localec参数不用设置】// 设置当前的 LocalelocalizationsDelegates: const [S.delegate,GlobalMaterialLocalizations.delegate,GlobalWidgetsLocalizations.delegate,GlobalCupertinoLocalizations.delegate,],supportedLocales: const [Locale('en', 'US'), //英文Locale('zh', 'CN'), //简体中文Locale('zh', 'TW') //繁体中文],//如果使用系统语言,使用下面的:【(2)判断是什么系统语言,就返回下面的语言值】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);},),);}
}

七、完整示例代码

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'generated/l10n.dart';void main() {runApp(const MyApp());
}class MyApp extends StatefulWidget {const MyApp({super.key});@overrideState<MyApp> createState() => _MyAppState();
}class _MyAppState extends State<MyApp> {Locale _locale = const Locale('en', 'US'); // 默认语言void setLocale(Locale locale) {setState(() {_locale = locale;});}@overrideWidget build(BuildContext context) {return MaterialApp(locale: _locale,// 设置当前的 LocalelocalizationsDelegates: const [S.delegate,GlobalMaterialLocalizations.delegate,GlobalWidgetsLocalizations.delegate,GlobalCupertinoLocalizations.delegate,],supportedLocales: const [Locale('en', 'US'), //英文Locale('zh', 'CN'), //简体中文Locale('zh', 'TW') //繁体中文],//如果使用系统语言,使用下面的:/*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({super.key, required this.onLocaleChange});@overrideWidget 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'), '英文'),],),),);}Widget changeButton(Locale newLocale, String text) {return ElevatedButton(onPressed: () {onLocaleChange(newLocale); // 调用 MyAppState 的 setLocale 方法},child: Text(text),);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/72957.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

网站后台如何修改网页?公司网站修改怎么做?

要修改网站后台中的网页,通常涉及以下几个步骤:登录后台管理系统:使用管理员账号和密码登录到网站的后台管理系统。导航至页面管理:在后台管理系统中找到“页面管理”、“内容管理”或类似名称的模块。选择要编辑的页面:在页面列表中找到你需要修改的页面,点击编辑按钮。…

基于 Python + Vue3!一个轻量级的域名和 SSL 证书监测平台!

Domain Admin —— 一个基于 Python + Vue3.js 技术栈实现的域名和 SSL 证书监测平台。大家好,我是 Java陈序员。 在企业开发中,由于业务众多,涉及到很多业务域名证书,证书过期由于遗忘常常未能及时续期,导致线上访问异常,给企业带来损失! 今天,给大家介绍一个轻量级的…

怎么修改网站ftp密码?

修改网站FTP密码的方法取决于你使用的FTP服务提供商或Web主机控制面板。以下是一些常见的方法:通过cPanel修改FTP密码:登录到你的cPanel账户。 在文件部分找到“FTP 账户”选项并点击。 找到你想要更改密码的FTP账户。 点击“更改密码”或类似的按钮。 输入新密码,并确认。 …

麻将计分器微信小程序的开发

如何开发微信小程序 前言 因为最近沉迷和朋友们一起下班去打麻将,他们推荐了一个计分的小程序,就不需要每局都转账或者用扑克牌记录了,但是这个小程序不仅打开有广告,各个页面都植入了广告,用起来十分不适。 于是我就心里暗自下定决心,一定要撸一个没有广告的小程序。一周…

python+selenium+pycharm自动化环境搭建

一、python环境搭建: 工具及驱动: 通过百度网盘分享的文件:自动化学习链接:https://pan.baidu.com/s/1_-KX_s1WeLBa7UV3y0H3zQ 提取码:m8nx 1. python下载地址: 官网下载地址:https://www.python.org/57 2.根据自己的电脑环境下载安装即可; 3.环境变量配置:将D:\pytho…

模板网站可以修改内容吗?网站修改资料页面模板?

模板网站通常提供了多种方式让用户自定义和修改内容,具体方法取决于所使用的模板平台或工具。以下是几种常见的修改方式:文本编辑:大多数模板网站允许用户直接在页面上编辑文本内容,如标题、段落等。 图片更换:用户可以通过上传自己的图片来替换模板中的默认图片。 颜色调…

TowardsDataScience-博客中文翻译-2022-五十二-

TowardsDataScience 博客中文翻译 2022(五十二)原文:TowardsDataScience 协议:CC BY-NC-SA 4.0一维信号的迁移学习原文:https://towardsdatascience.com/transfer-learning-with-a-one-dimensional-signal-76a0d543e9aa加上数据洞察力图片作者。 目录——简介 ——信号统计…

网站中的修改在后台哪里?

对于大多数网站来说,修改内容通常需要通过后台管理系统进行。具体步骤可能因不同网站而异,但一般流程如下:登录后台:首先,你需要登录到网站的后台管理系统。这通常需要一个管理员账号或具有相应权限的账号。 找到内容管理:登录后,查找“内容管理”、“页面管理”或类似名…