flutter学习-day19-国际化支持

文章目录

  • 1. 介绍
  • 2. 使用
  • 3. 获取当前区域Locale
  • 4. 监听语言切换
  • 5. 实现国际化
    • 5-1. 添加依赖
    • 5-2. 创建arb文件
    • 5-3. 添加provider状态管理
    • 5-4. 完成切换

本文学习和引用自《Flutter实战·第二版》:作者:杜文

1. 介绍

默认情况下,Flutter SDK中的组件仅提供美国英语本地化资源(主要是文本)。要添加对其他语言的支持,应用程序须添加一个名为“flutter_localizations”的包依赖,然后还需要在MaterialApp中进行一些配置。

2. 使用

首先安装flutter_localizations

flutter pub add flutter_localizations

然后修改main.dart,指定MaterialApp的localizationsDelegates和supportedLocales。

import 'package:flutter_localizations/flutter_localizations.dart';MaterialApp(localizationsDelegates: [// 本地化的代理类GlobalMaterialLocalizations.delegate,GlobalWidgetsLocalizations.delegate,],supportedLocales: [const Locale('en', 'US'), // 美国英语const Locale('zh', 'CN'), // 中文简体// 其他Locales],
)

3. 获取当前区域Locale

Locale类是用来标识用户的语言环境的,它包括语言和国家两个标志,如下:

const Locale('zh', 'CN')

可以通过以下方式来获取应用的当前区域Locale:

Locale myLocale = Localizations.localeOf(context);

4. 监听语言切换

当我们更改系统语言设置时,APP中的Localizations组件会重新构建,Localizations.localeOf(context) 获取的Locale就会更新,最终界面会重新build达到切换语言的效果。

class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(localizationsDelegates: [GlobalMaterialLocalizations.delegate,GlobalWidgetsLocalizations.delegate,],// 语言切换回调localeResolutionCallback: (locales, supportedLocales) {// 在这里自定义语言环境if(true) {return const Locale('zh', 'CN');} else {return const Locale('en', 'US');}},home: MyHomePage(),);}
}

5. 实现国际化

这里我们使用intl来实现国际化。

5-1. 添加依赖

在pubspec.yaml里添加intlflutter_localizations依赖。以及开启生成器。

dependencies:flutter:sdk: flutter# 国际化intl: ^0.18.1 # addflutter_localizations: # addsdk: flutter # add
# The following section is specific to Flutter packages.
flutter:generate: true # add

5-2. 创建arb文件

在Android studio内直接搜索flutter Intl,添加插件,安装完成后,点击顶部工具栏,选择Tools =》 flutter intl =》 lnitalize for the project,初始化一下。插件会默认创建l10n文件夹,generated文件夹,里面包含messages_all.dart、messages_en.dart以及intl_en.arb文件。

如果要新建语言类型,点击顶部工具栏,选择Tools =》 flutter intl =》 add locale,输入语言类型,插件会自动创建对应语言的arb文件。

然后就是填写你的文案字段了。

  • intl_zh.arb
{"appName": "例子","appTitle": "你好世界!"
}
  • intl_en.arb
{"appName": "例子","appTitle": "你好世界!"
}

5-3. 添加provider状态管理

这里为什么要添加provider呢,因为我们切换语言后的当前语言环境,我们要保存住,然后通过provider通知到其他组件。这样才是一个完整的国际化。

在pubspec.yaml里添加provider依赖,然后pub get一下。

# 状态管理:https://pub.dev/packages/provider
provider: ^6.1.1

在lib文件夹下创建一个provider文件夹,在provider文件夹下创建language.dart文件用来管理语言,添加如下代码:

import 'package:flutter/material.dart';class LanguageProvider extends ChangeNotifier {/// 默认语言Locale currentLanguage = const Locale('zh', 'CN');/// 获取当前语言Locale get getCurrentLanguage => currentLanguage;/// 修改语言void changeLanguage(Locale newLanguage) {currentLanguage = newLanguage;notifyListeners();}
}

然后修改main.dart的代码,添加语言包和一些代理,以及provider的状态。如下:

import 'package:flutter/material.dart';
import 'views/home/view.dart';
import 'package:demo2/generated/l10n.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:demo2/provider/language.dart';
import 'package:provider/provider.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);Widget build(BuildContext context) {return MultiProvider(// 所有要使用的provider都放到这里providers: [ChangeNotifierProvider(create: (context) => LanguageProvider())],builder: (context, child) {return MaterialApp(title: 'Flutter Demo',theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),useMaterial3: true,),// 设置当前语言locale: Provider.of<LanguageProvider>(context).currentLanguage,// 设置语言类型有哪几种supportedLocales: S.delegate.supportedLocales,// 初始化指定语言localizationsDelegates: const [// 本地化的代理类S.delegate,// 指定本地化的字符串和一些其他的值GlobalMaterialLocalizations.delegate,// 对应的Cupertino风格GlobalCupertinoLocalizations.delegate,// 指定默认的文本排列方向, 由左到右或由右到左GlobalWidgetsLocalizations.delegate],home: const HomePage(),);},);}
}

5-4. 完成切换

然后在页面中使用语言切换

import 'package:flutter/material.dart';
import 'package:demo2/provider/language.dart';
import 'package:demo2/config/config.dart';
import 'package:demo2/generated/l10n.dart';
import 'package:provider/provider.dart';class HomePage extends StatefulWidget {const HomePage({super.key});State<HomePage> createState() => HomePageState();
}class HomePageState extends State<HomePage> {int self = 1;Widget build(BuildContext context) {return Scaffold(appBar: AppBar(// 这样使用title: Text(S.of(context).appTitle),),body: Center(child: Text('${S.of(context).appName}$self'),),floatingActionButton: FloatingActionButton(onPressed: () {setState(() {self++;});// 获取语言管理provider 并且不监听变化final languageProvider = Provider.of<LanguageProvider>(context, listen: false);late Locale newLanguage;if (self % 2 == 0) {newLanguage = const Locale('en', 'US');} else {newLanguage = const Locale('zh', 'CN');}languageProvider.changeLanguage(newLanguage);},child: const Icon(Icons.add),),);}
}

本次分享就到这儿啦,我是鹏多多,如果您看了觉得有帮助,欢迎评论,关注,点赞,转发,我们下次见~

往期文章

  • flutter学习-day1-环境搭建和启动第一个项目
  • flutter学习-day6-路由和传参和守卫
  • Vue2全家桶+Element搭建的PC端在线音乐网站
  • vue3+element-plus配置cdn
  • 助你上手Vue3全家桶之Vue3教程
  • 助你上手Vue3全家桶之VueX4教程
  • 助你上手Vue3全家桶之Vue-Router4教程
  • 超详细!Vue的九种通信方式
  • 超详细!Vuex手把手教程
  • 使用nvm管理node.js版本以及更换npm淘宝镜像源
  • vue中利用.env文件存储全局环境变量,以及配置vue启动和打包命令
  • 超详细!Vue-Router手把手教程

个人主页

  • CSDN
  • GitHub
  • 简书
  • 博客园
  • 掘金

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

svn外网打不开url地址怎么解决

在家或者出差在外经常会有连接到公司内部SVN服务器的需求&#xff0c; 但是 svn外网打不开url地址怎么解决&#xff1f;如何才能连接到公司内部SVN服务器&#xff1f;今天小编教你一招&#xff0c;在本地SVN服务的内网IP端口用快解析软件添加映射&#xff0c;一步就可以提供让公…

Python模块、包与面向对象综合案例

Python模块、包与面向对象综合案例 一、Python内置模块 1、什么是Python模块 Python 模块(Module),是一个Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。模块能定义函数,类和变量,模块里也能包含可执行的代码。 2、模块的分类 在Python中,模块通常可…

TypeScript接口

1.TypeScript接口基本使用 声明接口需要使用 interface 关键字。 interface User {name: string;age: number; } 使用接口约束对象的类型。 const user: User {name: "张三",age: 20, }; 使用接口约束函数的类型。 interface Sum {(n: number, m: number): nu…

缺失的第一个正数(LeetCode 41)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路4.1 暴力4.2 排序4.3 哈希表4.4 空间复杂度为 O(1) 的哈希表4.5 置换 参考文献 1.问题描述 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级…

WPF Button使用漂亮 控件模板ControlTemplate 按钮使用控制模板实例及源代码 设计一个具有圆角边框、鼠标悬停时颜色变化的按钮模板

续前两篇模板文章 模板介绍1 模板介绍2 WPF中的Button控件默认样式简洁&#xff0c;但可以通过设置模板来实现更丰富的视觉效果和交互体验。按钮模板主要包括背景、边框、内容&#xff08;通常为文本或图像&#xff09;等元素。通过自定义模板&#xff0c;我们可以改…

会议室占用时间段 - 华为OD统一考试

OD统一考试 题解: Java / Python / C++ 题目描述 现有若干个会议,所有会议共享一个会议室,用数组表示各个会议的开始时间和结束时间, 格式为: [[会议1开始时间,会议1结束时间],[会议2开始时间,会议2结束时间]] 请计算会议室占用时间段。 输入描述 [[会议1开始时间,…

this和static和const关键字

1. this指针 1.1 基本认识 C中成员函数的特性&#xff0c;在类的非静态成员函数中都会存在一个this指针&#xff0c;来指向当前类&#xff0c;它是隐式的不可见的&#xff0c;是作为函数的第一个参数可以通过this指针来解决二义性的问题 是的&#xff0c;this指针是与类的实例相…

最快速度与最简代码搭建卷积神经网络,并快速训练模型,每日坚持手撕默写代码

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下最快速度与最简代码搭建卷积神经网络&#xff0c;并快速训练模型&#xff0c;每日坚持手撕默写代码。随着人工智能的快速发展&#xff0c;去年有强大的大模型ChatGPT横空出世&#xff0c;国内的大模型也紧追其后的发…

写一个java状态模式的详细实例

以下是一个示例的 Java 状态模式实现&#xff1a; java Copy code // 定义状态接口 interface State { void handleState(Context context); } // 具体状态类 1 class ConcreteState1 implements State { public void handleState(Context context) { System…

基于ssm西安旅游管理系统论文

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对西安旅游信息管理的提升&#x…

JavaScript----字符串拼接

1、字符串拼接 字符串拼接使用: "" 运算符 var iNum1 10; var fNum2 11.1; var sStr abc;result iNum1 fNum2; alert(result); // 弹出21.1result fNum2 sStr; alert(result); // 弹出11.1abc说明 数字和字符串拼接会自动进行类型转换(隐士类型转换)&#…

使用pandas绘图,并保存,支持中文

使用pandas绘图&#xff0c;并保存&#xff0c;支持中文 支持中文标题绘图创建DataFrame绘制图形添加其他绘图细节保存图形显示图形 支持中文标题 import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties import matplotlib.font_manager as fm…

深入理解Java集合框架

导语&#xff1a; Java集合框架是Java提供的一组用于管理对象的类和接口&#xff0c;它是Java编程中非常重要的一部分。Java集合框架通过提供诸如List、Set、Map等数据结构&#xff0c;为程序员提供了一种方便、高效的管理对象的方式。本文将深入理解Java集合框架&#xff0c;包…

RuntimeError: “slow_conv2d_cpu“ not implemented for ‘Half‘

目录 临时解决方法&#xff1a; RuntimeError: "slow_conv2d_cpu" not implemented for Half train_lora.py中&#xff1a; 原因&#xff1a;cpu不支持fp16类型&#xff0c; 临时解决方法&#xff1a; 注释掉fp16模式&#xff0c; weight_dtype torch.float32i…

Mediapipe绘制实时3d铰接骨架图——Mediapipe实时姿态估计

一、前言 大约两年前&#xff0c;基于自己的理解我曾写了几篇关于Mediapipe的文章&#xff0c;似乎帮助到了一些人。这两年&#xff0c;忙于比赛、实习、毕业、工作和考研。上篇文章已经是一年多前发的了。这段时间收到很多私信和评论&#xff0c;请原谅无法一一回复了。我将尝…

Redis缓存与数据库如何保证一致性

数据库和缓存如何保证一致性&#xff1f; 目录 数据库和缓存如何保证一致性&#xff1f;背景方案先更新数据库&#xff0c;还是先更新缓存&#xff1f;先更新数据库&#xff0c;再更新缓存先更新缓存&#xff0c;再更新数据库 先更新数据库&#xff0c;还是先删除缓存&#xff…

安装 PyQt5 保姆级教程

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 博主之前做应用层开发用的一直是 Qt&#xff0c;这次尝试一下在 python 中使用 Pyqt5 模块来开发 UI 界面&#xff0c;这里做一些…

certum的ip证书购买流程

Certum是成立于欧洲的CA认证机构&#xff0c;经过二十几年的发展Certum已经成为欧洲知名的CA认证机构之一&#xff0c;拥有广泛的客户群体和合作伙伴。IP证书是Certum为只有公网IP地址的网站准备的数字加密服务。今天就随SSL盾小编了解购买Certum旗下的IP证书流程。 第一步&am…

WPF Grid

Resource 在 WPF 中&#xff0c;“Grid” 是一种用于布局的面板控件&#xff0c;而 “Resource” 是一种用于定义可重用对象的机制。您可以将资源定义为 Grid 控件的一部分&#xff0c;以便在整个应用程序中共享和重用。 使用资源可以帮助您简化界面的创建和维护。在 Grid 控件…

总结一些好用的函数

1. <string.h>/<cstring>头文件 中的 memset函数 作用&#xff1a;用于将一段内存区域设置为特定的值(它作用的基本单位是字节) 可以对变量&#xff0c;数组&#xff08;一维数组和二维数组&#xff09;&#xff0c;结构体进行初始化&#xff0c;但是不能对vecto…