【Flutter】多语言方案一:flutter_localizations 与 GetX 配合版

2024-04-19 12:04

本文主要是介绍【Flutter】多语言方案一:flutter_localizations 与 GetX 配合版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

介绍

多语言方案:flutter_localizations 与 GetX 配合版,好处:命令行生成多语言字符串的引用常量类,缺点:切换语言以后,主界面需要手动触发setState,重绘将最新的Locale数据设置给GetMaterialApp。


文章目录

  • 介绍
  • 运行效果
  • 一、安装
  • 二、使用
    • 1.lib文件夹中新建文件夹l10n/arb,并在其中创建app_en.arb 、app_zh.arb、app_zh_HK.arb文件
    • 2.项目的根目录中添加l10n.yaml,配置如下
    • 3.添加完成之后,执行命令`flutter gen-l10n`,执行命令`flutter run`,.dart_tools会自动生成相关的文件
    • 4.MaterialApp或GetMaterialApp配置国际化字段
    • 5.调用
    • 6.多语言切换


运行效果

在这里插入图片描述

一、安装

dependencies:
flutter_localizations:
sdk: flutter
intl: any
get: ^4.6.6flutter:
uses-material-design: true
generate: true

二、使用

1.lib文件夹中新建文件夹l10n/arb,并在其中创建app_en.arb 、app_zh.arb、app_zh_HK.arb文件

app_en.arb类

{"@@locale": "en","appName": "BraveComponent","@appName": {"description": "备注"},"helloWorld": "HelloWorld","followerSystemLanguage": "FollowerSystemLanguage","simplifiedChinese": "SimplifiedChinese","traditionalChinese": "TraditionalChinese","english": "English","setting": "Setting","multiLanguage": "MultiLanguage","theme": "Theme"
}

app_zh.arb类

{"@@locale": "zh","appName": "BraveComponent","@appName": {"description": "备注"},"helloWorld": "你好,世界","followerSystemLanguage": "跟随系统语言","simplifiedChinese": "简体中文","traditionalChinese": "繁体中文","english": "英文","setting": "设置","multiLanguage": "多语言","theme": "主题"
}

app_zh.arb类

{"@@locale": "zh_HK","appName": "BraveComponent","@appName": {"description": "備注"},"helloWorld": "妳好,世界","followerSystemLanguage": "跟隨系統語言","simplifiedChinese": "簡體中文","traditionalChinese": "繁體中文","english": "英文","setting": "設置","multiLanguage": "多語言","theme": "主題"
}

2.项目的根目录中添加l10n.yaml,配置如下

arb-dir: lib/l10n/arb
template-arb-file: app_zh.arb
output-localization-file: app_localizations.dart
output-class: AppLocalizations
use-deferred-loading: true
nullable-getter: false

3.添加完成之后,执行命令flutter gen-l10n,执行命令flutter run,.dart_tools会自动生成相关的文件

在这里插入图片描述

4.MaterialApp或GetMaterialApp配置国际化字段

l10n_app.dart类代码

import 'package:brave_component/core/utils/language_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:get/get.dart';import 'l10n/l10n.dart';
import 'routes/route_pages.dart';
import 'routes/route_path.dart';class L10nApp extends StatefulWidget {bool _init = true;L10nApp({super.key});@overrideState<L10nApp> createState() => L10nAppState();
}class L10nAppState extends State<L10nApp> {// 供外部使用的_AppSetting实例,用于修改app的状态static AppSetting setting = AppSetting.instance;@overridevoid initState() {super.initState();//第一次进入app时,获取本地多语言的countryCodeif (widget._init) {setting.setLocale();widget._init = false;}// 更改语言setting.changeLocale = () {setState(() {});};}@overrideWidget build(BuildContext context) {return GetMaterialApp(initialRoute: RoutePath.l10n_main,getPages: RoutePages.getPages,title: 'component',theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),useMaterial3: true,),locale: setting._locale,fallbackLocale: const Locale("zh", "CN"),localeResolutionCallback: (deviceLocale, supportedLocales) {print('当前语言:${deviceLocale.toString()}');return;},supportedLocales: AppLocalizations.supportedLocales,localizationsDelegates: const [AppLocalizations.delegate,GlobalCupertinoLocalizations.delegate,GlobalWidgetsLocalizations.delegate,GlobalMaterialLocalizations.delegate],);}
}class AppSetting {AppSetting._();static final AppSetting _instance = AppSetting._();static AppSetting get instance => _instance;Locale? _locale;Function()? changeLocale;void setLocale() {_locale = LanguageUtils.getLocale();}
}

language_utils.dart类代码

import 'package:brave_component/l10n/l10n.dart';
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';import '../../l10n_app.dart';
import '../cache/helpers/cache_helper.dart';
import '../enums/language.dart';class LanguageUtils {static String getLanguage(BuildContext context, String code) {late String language;switch (code) {case 'fs-Lan':language = context.l10n.followerSystemLanguage;break;case 'zh-CN':language = context.l10n.simplifiedChinese;break;case 'zh-HK':language = context.l10n.traditionalChinese;break;case 'en-US':language = context.l10n.english;break;default:language = context.l10n.followerSystemLanguage;break;}return language;}static Locale? getLocale() {Locale? locale;String code = CacheHelper.countryCode;List<String> lang = code.split('-');locale = (code == Language.fsLan.countryCode)? Get.deviceLocale: Locale(lang[0], lang[1]);return locale;}static void updateLocale(String countryCode, {bool isL10n = false}) {List<String> lang = countryCode.split('-');Get.updateLocale((countryCode == Language.fsLan.countryCode)? Get.deviceLocale!: Locale(lang[0], lang[1]));CacheHelper.saveCountryCode(countryCode);if (isL10n) {L10nAppState.setting.changeLocale!();}}
}

mian.dart类

import 'package:flutter/material.dart';import 'app.dart';
import 'core/cache/cache/cache.dart';
import 'l10n_app.dart';void main() async {await Cache.instance.init();runApp(L10nApp()); //flutter_localizations与GetX配合版的多语言// runApp(const App()); //GetX版多语言
}

5.调用

  1. 直接使用 Text(AppLocalizations.of(context).helloWorld)
  2. 扩展使用
    - 扩展BuildContext
extension BuildContextExtension on BuildContext {    AppLocalizations get l10n => AppLocalizations.of(this);    
}
 - 使用   Text(context.l10n.helloWorld)  

6.多语言切换

l10n_multi_language_view.dart类

import 'package:brave_component/core/enums/language.dart';
import 'package:brave_component/l10n/l10n.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';import '../../../../../core/res/colours.dart';
import '../../../../../widgets/base/texts.dart';
import 'l10n_multi_language_logic.dart';class L10nMultiLanguagePage extends StatelessWidget {L10nMultiLanguagePage({super.key});final logic = Get.find<L10nMultiLanguageLogic>();@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Texts.fontSize18Normal(context.l10n.multiLanguage,color: Colours.titleColor),leading: GestureDetector(onTap: () {Get.back(result: 'changeLanguage');},child: const Icon(Icons.arrow_back),),),body: Container(padding: const EdgeInsets.symmetric(vertical: 15),// child: ListView(//   children: ListTile.divideTiles(//           context: context,//           tiles: Language.values//               .map((e) =>//                   GetBuilder<MultiLanguageLogic>(builder: (logic) {//                     return ListTile(//                       title: Texts.fontSize14Normal(e.title,//                           color: Colours.titleColor),//                       trailing: e.countryCode == logic.countryCode//                           ? const Icon(Icons.check,//                               color: Colours.primaryColor)//                           : null,//                       onTap: () {//                         logic.changeLanguage(e.countryCode);//                       },//                     );//                   }))//               .toList())//       .toList(),// ),child: ListView.separated(itemBuilder: (context, index) {return _itemContent(context, index);},separatorBuilder: (_, index) => const Divider(),itemCount: Language.values.length),),);}Widget _itemContent(BuildContext context, int index) {return GetBuilder<L10nMultiLanguageLogic>(builder: (logic) {return Container(padding: const EdgeInsets.symmetric(horizontal: 15),height: 44,child: GestureDetector(onTap: () {logic.changeLanguage(Language.values[index].countryCode);},child: Row(children: [Expanded(child: Texts.fontSize14Normal(Language.values[index].title,color: Colours.titleColor)),Visibility(visible:logic.countryCode == Language.values[index].countryCode,child: const Icon(Icons.check, color: Colours.primaryColor))],),),);});}
}

l10n_multi_language_logic.dart类

import 'package:brave_component/core/cache/helpers/cache_helper.dart';
import 'package:brave_component/core/utils/language_utils.dart';
import 'package:get/get.dart';class L10nMultiLanguageLogic extends GetxController {late String countryCode;@overridevoid onInit() {super.onInit();countryCode = CacheHelper.countryCode;}void changeLanguage(String code) {countryCode = code;LanguageUtils.updateLocale(code, isL10n: true);//切换Localeupdate();}
}

l10n_multi_language_binding.dart类

import 'package:get/get.dart';import 'l10n_multi_language_logic.dart';class L10nMultiLanguageBinding extends Bindings {@overridevoid dependencies() {Get.lazyPut(() => L10nMultiLanguageLogic());}
}

language 类

enum Language {fsLan(title: "跟随系统语言", countryCode: "fs-Lan"),zhCN(title: "简体中文", countryCode: "zh-CN"),zhHK(title: "繁体中文", countryCode: "zh-HK"),enUS(title: "English", countryCode: "en-US");final String title;final String countryCode;const Language({required this.title, required this.countryCode});
}

这里关于GetX的binding用法不会的可以参考Flutter GetX使用—简洁的魅力!这个博主开发的GetX插件,生成模版代码提高研发效率,建议看看用起来。

持久化就不赘述了,参考源码
源码

下一篇 多语言方案二:GetX 版

这篇关于【Flutter】多语言方案一:flutter_localizations 与 GetX 配合版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/917489

相关文章

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

C语言逗号运算符和逗号表达式的使用小结

《C语言逗号运算符和逗号表达式的使用小结》本文详细介绍了C语言中的逗号运算符和逗号表达式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接其一般形式为:表达

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

使用MyBatis TypeHandler实现数据加密与解密的具体方案

《使用MyBatisTypeHandler实现数据加密与解密的具体方案》在我们日常的开发工作中,经常会遇到一些敏感数据需要存储,比如用户的手机号、身份证号、银行卡号等,为了保障数据安全,我们通常会对... 目录1. 核心概念:什么是 TypeHandler?2. 实战场景3. 代码实现步骤步骤 1:定义 E

Python实现繁体转简体功能的三种方案

《Python实现繁体转简体功能的三种方案》在中文信息处理中,繁体字与简体字的转换是一个常见需求,无论是处理港澳台地区的文本数据,还是开发面向不同中文用户群体的应用,繁简转换都是不可或缺的功能,本文将... 目录前言为什么需要繁简转换?python实现方案方案一:使用opencc库方案二:使用zhconv库

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

Go语言中如何进行数据库查询操作

《Go语言中如何进行数据库查询操作》在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三... 查询函数QueryRow和Query详细对比特性QueryRowQuery返回值数量1个:*sql