You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 16:47:04