C# MAUI怎么做国际化 MAUI多语言支持教程
发布时间 - 2025-12-27 00:00:00 点击率:次MAUI国际化通过.resx资源文件、Culture切换和XAML绑定实现,需设Build Action为Embedded Resource、严格命名、在MauiProgram中预设Culture,并用OnPropertyChanged刷新绑定。
MAUI 的国际化主要靠 资源文件(.resx) + Culture 切换 + 绑定支持 实现,不依赖第三方库也能完成基础多语言切换,关键是把资源管理好、Culture 设置对、XAML 中用对绑定方式。
准备多语言资源文件
在 MAUI 项目中新建 Resources 文件夹(推荐),然后添加默认资源文件和对应语言的本地化版本:
-
AppResources.resx—— 默认语言(如中文简体),放在 Resources 文件夹下 -
AppResources.zh-Hans.resx—— 中文简体(可选,与默认一致时可省略) -
AppResources.en-US.resx—— 英文美国 -
AppResources.es-ES.resx—— 西班牙语西班牙
注意:所有 .resx 文件的 Build Action 必须设为 "Embedded Resource";文件名必须严格匹配 基名.区域名.resx 格式;Visual Studio 会自动生成强类型类 AppResources,供 C# 和 XAML 使用。
在 XAML 中使用本地化字符串
MAUI 支持直接在 XAML 中通过静态资源引用 A 类的属性:
ppResources
- 先在 XAML 根节点添加命名空间:
xmlns:resources="clr-namespace:YourApp.Resources" - 然后这样写文本:
Text="{x:Static resources:AppResources.LoginButton}" - 按钮/标签等控件都适用,无需额外代码
⚠️ 注意:XAML 不支持动态刷新(比如切语言后界面不会自动重绘),需要手动触发或配合 MVVM 重绑定(见下一条)。
运行时切换语言并刷新界面
切换语言本质是设置当前线程的 CultureInfo,再通知 UI 重新加载资源。关键三步:
- 设置
Thread.CurrentThread.CurrentCulture和.CurrentUICulture - 调用
ResourceManager.Current.ChangeCulture(newCulture)(MAUI 7+ 自动支持) - 刷新当前页面:可
Navigation.PopAsync()再PushAsync(new MainPage()),或更轻量地——
在 ViewModel 中用OnPropertyChanged(nameof(LocalizedText))触发绑定更新(需将资源访问封装为属性)
示例(ViewModel 中):
private string _greeting; public string Greeting => AppResources.HelloWorld; // 直接读取,但不会自动更新
改成可通知的写法:
public string Greeting => AppResources.HelloWorld; // 切语言后调用: OnPropertyChanged(nameof(Greeting));
进阶:自动识别系统语言 + 持久化用户选择
首次启动时读系统语言:
- 用
Thread.CurrentThread.CurrentUICulture.Name获取当前 UI 区域名 - 或跨平台更稳的方式:
Microsoft.Maui.Devices.DeviceInfo.Platform+ 平台特定代码(如 Android 的Java.Util.Locale.Default)
保存用户选择:
- 用
Preferences.Set("LanguageCode", "en-US")记录偏好 - 下次启动时读取并提前设置
Thread.CurrentThread.CurrentUICulture,最好在MauiProgram.CreateMauiApp()之后、MainWindow创建前完成
基本上就这些。不复杂但容易忽略 Build Action 和 Culture 设置时机 —— 这两点错一个,多语言就静默失效。
# java
# android
# app
# ai
# win
# microsoft
# 多语言
# 本地化
# c#
# 多语言切换
# 重绘
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
nodejs redis 发布订阅机制封装实现方法及实例代码
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
*服务器网站为何频现安全漏洞?
如何在VPS电脑上快速搭建网站?
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
如何选择可靠的免备案建站服务器?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
如何用y主机助手快速搭建网站?
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)
常州企业网站制作公司,全国继续教育网怎么登录?
如何用5美元大硬盘VPS安全高效搭建个人网站?
Laravel如何使用Collections进行数据处理?(实用方法示例)
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
如何快速查询网址的建站时间与历史轨迹?
Laravel如何实现模型的全局作用域?(Global Scope示例)
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
装修招标网站设计制作流程,装修招标流程?
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
大连 网站制作,大连天途有线官网?
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
如何挑选优质建站一级代理提升网站排名?
php json中文编码为null的解决办法
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
如何在局域网内绑定自建网站域名?
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
再谈Python中的字符串与字符编码(推荐)
C++时间戳转换成日期时间的步骤和示例代码
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
如何在香港服务器上快速搭建免备案网站?
php结合redis实现高并发下的抢购、秒杀功能的实例
网站制作报价单模板图片,小松挖机官方网站报价?
Laravel怎么实现模型属性的自动加密
如何快速搭建高效香港服务器网站?
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
深圳网站制作平台,深圳市做网站好的公司有哪些?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
如何快速搭建支持数据库操作的智能建站平台?
高端建站三要素:定制模板、企业官网与响应式设计优化
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
Linux后台任务运行方法_nohup与&使用技巧【技巧】

