我已按照 文档 进行操作,并按照文章中的说明 100% 实现了我的 Blazor Wasm 本地化。微软建议在应用程序启动时调用js,如下所示。
builder.Services.AddLocalization();
var host = builder.Build();
CultureInfo culture;
var js = host.Services.GetRequiredService<IJSRuntime>();
var result = await js.InvokeAsync<string>("blazorCulture.get");
if (result != null)
{
culture = new CultureInfo(result);
}
else
{
culture = new CultureInfo("en-US");
await js.InvokeVoidAsync("blazorCulture.set", "en-US");
}
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;
await host.RunAsync();
这工作正常,但有时当我打开起始页时,它会返回一个 Js 错误告诉我
blazor.webassembly.js:1 Microsoft.JSInterop.JSException: Could not find 'blazorCulture.get' ('getBlazorCulture' was undefined). blazor.webassembly.js:1 Error: Could not find 'blazorCulture.get' ('blazorCulture.get' was undefined).
当我按 contol+f5 强制重新加载缓存数据时,错误消失。什么可能导致此问题以及如何解决它?
编辑: 下面是我的 Index.html Body 的样子,在这里我怀疑由于cultureget.jscultureset.js是最后一个,其他js文件加载时间比Blazor启动时间更长,尽管这种情况并不总是发生。因此,由于 blazor 已经启动,并且最后一个 js 文件是在 blazor 启动后加载的,因此会发生此错误。问题是有没有办法确保在 Blazor 启动之前加载所有 js 文件?当然,更快的修复可以在这里将这些 js 移到 blazor.web assembly.js 之后。
<script src="_framework/blazor.webassembly.js"></script>
<script src="_content/Radzen.Blazor/Radzen.Blazor.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
<!-- third party -->
<script src="https://unpkg.com/js-logger/src/logger.min.js"></script>
<!-- custom code -->
<script type="module" src="_content/logger.js"></script>
<script type="module" src="_content/eventHandlerUtils.js"></script>
<script src="_content/cultureget.js"></script>
<script src="_content/cultureset.js"></script>
我制作了以下代码补丁,因为我遇到了同样的问题。然而,应该找到更好的解决方案。但是,如果我们向用户提供错误消息,他们将能够理解出了什么问题。
将用于获取文化的 try-catch 添加到 program.cs 中。使用以下代码更新您的 MainLayout.razor:
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
var getCulture = await JS.InvokeAsync<string>("blazorCulture.get");
if (!string.IsNullOrWhiteSpace(getCulture) && !CultureInfo.DefaultThreadCurrentCulture!.Name.Equals(getCulture))
{
// Show error popup or toastr
}
}
}
我很长一段时间都遇到同样的问题,现在我通过为 blazor 文化内容制作一个单独的 js 文件来修复它,就像您对“cultureget.js 和cultureset.js”所做的那样,并将其放在上面 “_framework/blazor.web assembly.js”,因为这个主脚本抛出文化内容未定义的错误。
现在,culture js 的东西会首先加载,我不会再遇到那个烦人的错误了。
希望我能帮忙:D