对于 Blazor,我几乎是个新手。我想在我的 Blazor Web 应用程序 (Blazor United) 中以 InteractiveAuto 渲染模式实现多语言。
教程很长,所以我无法发布所有代码。
按照教程中的所有内容操作后,代码成功运行。
但是,我的程序中的默认语言不是英语。我在program.cs中的这段代码中提前设置了默认语言。
var supportedCultures = new[] { "zh-hans","en" };
var localizationOptions = new RequestLocalizationOptions()
.SetDefaultCulture(supportedCultures[0])
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions);
app.MapControllers();
这是我在 MainLayout 中测试它的代码:
@inherits LayoutComponentBase
@inject IStringLocalizer<MainLayout> Localizer
@inject Blazored.LocalStorage.ISyncLocalStorageService LocalStorage
@code {
protected override async Task OnAfterRenderAsync(bool firstRender)
{
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("zh-hans");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("zh-hans"); }
abc = CultureInfo.CurrentCulture.ToString();
}
string abc { get; set; } = "456";
}
<div class="page">
<div class="sidebar">
<div>@abc</div>
</div>
<main>
<div class="top-row px-4">
<a href="https://learn.microsoft.com/aspnet/core/" target="_blank">About</a>
</div>
<article class="content px-4">
@Body
</article>
</main>
</div>
<div id="blazor-error-ui" style="display:flex;">
@Localizer["AnUnhandledErrorHasOccurred"]
<a href="" class="reload"> @Localizer["Reload"]</a>
<a class="dismiss">🗙</a>
</div>
但是我发现了一个奇怪的问题,当程序在Start Debugging模式下运行时,一切正常。但是,当我在“启动而不调试”模式下运行它时,默认语言被强制更改为英语。
我什至将这段代码添加到MainLayout中:
protected override async Task OnAfterRenderAsync(bool firstRender)
{
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("zh-hans");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("zh-hans");
}
但是语言仍然无法更改。这是什么原因造成的?为了方便使用热重载,我在“启动而不调试”模式下运行它。我该如何解决这个问题?
我找到了解决办法(虽然到现在我也不知道问题是什么,也没有人能解决。这种方式可以解决问题,但我不知道它是如何运作的):
添加此代码:
localizationOptions.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(async context =>
{
return await Task.FromResult(new ProviderCultureResult("zh-Hans"));
}));
在此代码之后:
var supportedCultures = new[] { "zh-Hans", "en-us" };
var localizationOptions = new RequestLocalizationOptions()
.SetDefaultCulture(supportedCultures[0])
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions);
就像这样:
var supportedCultures = new[] { "zh-Hans", "en-us" };
var localizationOptions = new RequestLocalizationOptions()
.SetDefaultCulture(supportedCultures[0])
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
localizationOptions.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(async context =>
{
return await Task.FromResult(new ProviderCultureResult("zh-Hans"));
}));
app.UseRequestLocalization(localizationOptions);