Blazor WASM启动时如何读取ASP.NET Culture Cookie?
Blazor WASM 没有提供类似Blazor Server的UseRequestLocalization中间件来自动读取文化Cookie,但可以借助框架内置的CookieRequestCultureProvider类结合JS互操作实现,具体步骤如下:
1. 编写JS方法读取Cookie
在wwwroot/js目录下创建cookieUtils.js文件,添加读取Cookie的方法:
window.getCookie = function(name) { let cookieValue = null; if (document.cookie && document.cookie !== '') { const cookies = document.cookie.split(';'); for (let i = 0; i < cookies.length; i++) { const cookie = cookies[i].trim(); if (cookie.startsWith(name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; };
在index.html中引入该脚本:
<script src="js/cookieUtils.js"></script>
2. 解析Cookie并设置线程文化
方案一:在Program.cs初始化时设置
在程序启动阶段读取Cookie并设置默认文化,确保所有组件初始化前文化已生效:
using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using Microsoft.AspNetCore.Localization; using System.Globalization; var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add<App>("#app"); var host = builder.Build(); var jsRuntime = host.Services.GetRequiredService<IJSRuntime>(); var cultureCookie = await jsRuntime.InvokeAsync<string>("getCookie", CookieRequestCultureProvider.DefaultCookieName); if (!string.IsNullOrEmpty(cultureCookie)) { var requestCulture = CookieRequestCultureProvider.ParseCookieValue(cultureCookie); if (requestCulture != null) { CultureInfo.DefaultThreadCurrentCulture = requestCulture.Culture; CultureInfo.DefaultThreadCurrentUICulture = requestCulture.UICulture; } } await host.RunAsync();
方案二:在根组件中设置
如果需要在组件初始化后处理,可在App.razor的生命周期方法中执行:
@inject IJSRuntime JS @using Microsoft.AspNetCore.Localization @using System.Globalization @code { protected override async Task OnInitializedAsync() { var cultureCookie = await JS.InvokeAsync<string>("getCookie", CookieRequestCultureProvider.DefaultCookieName); if (!string.IsNullOrEmpty(cultureCookie)) { var requestCulture = CookieRequestCultureProvider.ParseCookieValue(cultureCookie); if (requestCulture != null) { CultureInfo.DefaultThreadCurrentCulture = requestCulture.Culture; CultureInfo.DefaultThreadCurrentUICulture = requestCulture.UICulture; StateHasChanged(); // 刷新组件应用文化变更 } } } }
3. 验证本地化
确保项目已配置本地化资源文件(如Resources/App.resx、Resources/App.zh-CN.resx),通过IStringLocalizer使用本地化文本:
@inject IStringLocalizer<App> Localizer <h1>@Localizer["Welcome"]</h1>
说明
Blazor WASM 没有内置的自动读取文化Cookie的中间件,但CookieRequestCultureProvider是官方本地化组件的一部分,可用于解析Cookie格式的文化值,结合JS互操作读取浏览器Cookie即可实现与Blazor Server一致的文化切换效果。
内容的提问来源于stack exchange,提问作者buga
相关产品推荐
相关产品推荐

