如何为WPF Blazor应用添加本地化?解决本地化失效问题
WPF Blazor本地化失效解决方案
问题背景
为WPF Blazor应用添加本地化功能时,即使设置了非默认文化,通过共享资源注入的IStringLocalizer始终返回默认英文资源。此前在Blazor WASM中使用的配置方式(通过配置文件加载文化并设置DefaultThreadCurrentCulture/DefaultThreadCurrentUICulture)在WPF Blazor中无效,且不清楚如何在宿主构建后、运行前进行访问配置。
解决方案:使用.NET Generic Host重构服务配置
WPF Blazor默认的简单服务注册方式无法提供完整的宿主生命周期控制,改用.NET Generic Host可以像Blazor WASM一样管理宿主,从而正确设置本地化文化。
1. 重构MainWindow的服务配置
替换原有直接使用ServiceCollection的方式,改用Host.CreateDefaultBuilder构建宿主:
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // 构建.NET Generic Host var host = Host.CreateDefaultBuilder() .ConfigureServices((context, services) => { // 注册WPF Blazor WebView服务 services.AddWpfBlazorWebView(); // 配置本地化服务,指定资源文件存放路径 services.AddLocalization(options => options.ResourcesPath = "Resources"); // 设置支持的文化列表 services.Configure<RequestLocalizationOptions>(options => { var supportedCultures = new[] { new CultureInfo("en-US"), new CultureInfo("zh-CN"), // 添加其他需要支持的文化 }; options.DefaultRequestCulture = new RequestCulture("en-US"); options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; }); }) .Build(); // 从配置文件读取默认文化(示例:从appsettings.json读取) var config = host.Services.GetRequiredService<IConfiguration>(); var cultureName = config["AppSettings:DefaultCulture"] ?? "en-US"; var targetCulture = CultureInfo.GetCultureInfo(cultureName); // 设置线程默认文化 CultureInfo.DefaultThreadCurrentCulture = targetCulture; CultureInfo.DefaultThreadCurrentUICulture = targetCulture; // 将宿主服务提供者注入WPF资源 Resources.Add("services", host.Services); // 启动宿主 host.StartAsync(); } }
2. 创建共享资源文件
- 在项目中创建
Resources文件夹 - 添加默认资源文件
SharedResources.resx(英文内容,访问修饰符设为public) - 添加对应文化的资源文件,比如
SharedResources.zh-CN.resx(中文内容)
3. 在Blazor组件中使用本地化
注入IStringLocalizer<SharedResources>并调用:
@inject IStringLocalizer<SharedResources> Localizer <div>@Localizer["Greeting"]</div>
关键原理:为何要在宿主构建后、运行前设置文化
IStringLocalizer等本地化服务在初始化时,会读取当前线程的UICulture来确定加载哪个资源文件- 如果在宿主运行后设置文化,已经初始化的本地化服务不会重新读取文化配置,导致始终使用默认资源
- 宿主构建完成后,所有服务注册已完成但尚未启动,此时设置线程文化,后续服务初始化时会自动使用新的文化配置
内容的提问来源于stack exchange,提问作者Shadesver
相关产品推荐
相关产品推荐

