Blazor 中使用
IStringLocalizer实现多语言,核心是结合 .NET 的本地化服务 + 资源文件(.resx)+ 语言切换逻辑。它不依赖 JavaScript,完全在 C# 层完成,适合 Server、WASM 和 Hybrid 项目。
配置本地化服务
在
Program.cs(.NET 6+)中注册本地化服务: Server 项目:调用
builder.Services.AddRazorComponents().AddInteractiveServerComponents()后,添加
AddLocalization()WASM 项目:同样调用
AddLocalization(),并确保资源文件被正确发布(默认会自动包含) 语言文化需通过
RequestLocalizationOptions设置支持列表,例如
new[] { "zh-CN", "en-US", "ja-JP" }
准备资源文件(.resx)
资源文件必须按命名规范放置,Blazor 才能自动匹配:
新建文件夹Resources(推荐),在其中创建
SharedResource.resx(默认语言,如中文) 对应英文版:
SharedResource.en-US.resx;日文版:
SharedResource.ja-JP.resx文件属性中,将
Build Action设为
Embedded Resource,
Custom Tool留空(不要设为 PublicResXFileCodeGenerator) 类名不重要,但资源键名要统一,比如
WelcomeMessage,各语言文件里填对应翻译
在组件中注入并使用 IStringLocalizer
以 Razor 组件为例(如
Counter.razor): 顶部注入:
@inject IStringLocalizer<sharedresource> localizer</sharedresource>(注意泛型参数是资源类类型,不是字符串) 使用方式:
@localizer["WelcomeMessage"]或带参数的
@localizer["HelloName", @name]若资源类未显式定义(即只用 .resx),可借助一个空的
SharedResource.cs文件(内容仅
public class SharedResource { }),让编译器生成类型引用
动态切换语言并持久化用户选择
切换语言本质是改变当前线程/请求的
CultureInfo,并在客户端保存偏好: Server 渲染:通过中间件或自定义
ICultureService在每次请求前设置
HttpContext.Features.Get<irequestculturefeature>().RequestCulture</irequestculturefeature>WASM 渲染:无法改线程文化,改用
JSInterop存 localStorage,再在
App.razor中用
CultureChanged事件触发重载,或配合
NavigationManager.Refresh()推荐轻量方案:封装一个
LanguageService,提供
ChangeLanguage(string culture)方法,内部更新
CultureInfo.DefaultThreadCurrentCulture(WASM 不生效,仅作标记)+ 触发状态通知
基本上就这些。关键点是资源文件命名、注入方式、以及区分 Server/WASM 的文化切换机制。不需要第三方库,.NET 原生支持很稳。
