我正在尝试将本地化添加到我的 WPF Blazor 应用程序,但它不起作用。即使我设置了不同的区域性,我用共享资源注入的 IStringLocalizer 始终返回默认的英语资源。
我之前制作过 WPF Blazor 应用程序。
我正在尝试再次执行此操作,但这次我尝试添加本地化 根据 Microsoft 的文档和其他
(除了不依赖本地存储,我依赖配置文件。我可以从配置加载区域性信息,并使用我想要的 CultureInfo 设置 DefaultThreadCurrentCulture 和 DefaultThreadCurrentUICulture)
这对于标准 Blazor WASM 应用程序来说效果很好,但似乎不适用于 WPF Blazor 应用程序
当我尝试获取本地化字符串时,它总是返回默认的英文资源。
我怀疑这与删除这条线有关
- await builder.Build().RunAsync();
更换
builder.Services.AddLocalization();
var host = builder.Build();
const string defaultCulture = "en-US";
var js = host.Services.GetRequiredService<IJSRuntime>();
var result = await js.InvokeAsync<string>("blazorCulture.get");
var culture = CultureInfo.GetCultureInfo(result ?? defaultCulture);
if (result == null)
{
await js.InvokeVoidAsync("blazorCulture.set", defaultCulture);
}
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;
await host.RunAsync();
但我不知道如何在主机构建之后、运行之前访问主机。使用 WPF Blazor 应用程序时,我可以为 Blazor 组件设置服务,如下所示
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var serviceCollection = new ServiceCollection();
serviceCollection.AddWpfBlazorWebView();
Resources.Add("services", serviceCollection.BuildServiceProvider());
}
}
有谁知道如何在主机构建之后但运行之前访问主机?或者更优选地如何让本地化在 WPF Blazor 应用程序中工作?
巧了,有谁知道为什么必须在主机构建之后、运行之前设置文化?我不确定我是否完全理解它是如何工作的。
我也对此进行了调查,因为它可以访问主机,但我无法让 .NET 8 版本正常工作 https://github.com/DotNetExtension/BlazorDesktop
编辑:
也许我应该尝试使用Extensions.Hosting?这会有帮助吗?
啊哈
在本文中,您将学习如何使用 IStringLocalizer 和 IStringLocalizerFactory 实现。本文中的所有示例源代码都依赖于 Microsoft.Extensions.Localization 和 Microsoft.Extensions.Hosting NuGet 包。有关托管的更多信息,请参阅 .NET 通用主机。
也许会有帮助
在我的例子中,只需在项目的 MainWindlow.xaml.cs 下设置当前 UICulture 并为两者设置默认线程区域性(CultureInfo.DefaultThreadCurrentCulture、CultureInfo.DefaultThreadCurrentUICulture),就像设置具有本地化的 WPF 应用程序一样。
并进行所有其他 Blazor 本地化设置。 (添加 Microsoft.Extensions.Localization 并在 .razor 页面中调用 @localizer)
它对我有用。