我遵循了文档,并像文章中那样100%地实现了我的Blazor Wasm的本地化。Microsoft建议在应用程序启动时调用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).
当我按control +f5强制重新加载缓存的数据时,错误消失了。这可能会导致什么问题,如何解决它?
编辑:下面是我的Index.html Body的样子,这里我怀疑由于cultureget.js cultureset.js是最后一个,其他js文件的加载时间比Blazor启动要长,尽管它并不总是发生。因此,由于blazor已经启动,并且在blazor启动后加载了最后一个js文件,因此会发生此错误。问题是有办法确保所有的js文件加载之前Blazor开始?当然,更快的解决办法是将这些js移到blazor.webassembly.js之后。
<script src="_framework/blazor.webassembly.js"></script>
<script src="_content/Radzen.Blazor/Radzen.Blazor.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/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添加到程序中。. 更新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
}
}
}