Blazor Server本地化资源无法找到:项目命名连字符引发异常
解决Blazor Server(.NET 6.0)本地化资源找不到问题
问题背景
在.NET 6.0的Blazor Server应用中集成本地化实现语言切换时,新项目测试成功,但实际项目出现资源无法加载的情况。通过对比两个测试项目(EMV和E_M_V)发现,项目名称中的连字符会被自动替换为命名空间中的下划线,这直接导致资源查找路径不匹配,最终只能显示资源键名而非对应值。
已完成的配置包括:
- 添加
Resources文件夹及App.resx资源文件(包含TestString键,对应值为This is a Test) - 安装
Microsoft.Extensions.Localization 7.0.0,并在_Imports.razor中引入相关命名空间 - 在
Program.cs中配置本地化服务 - 在
Index.razor中注入IStringLocalizer<App>并调用资源键
解决方案
1. 显式指定资源路径
在Program.cs配置本地化服务时,通过ResourcesPath参数指定资源文件所在的路径,确保命名空间转换后的路径能正确匹配资源文件位置:
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources"); // 后续配置本地化中间件等 builder.Services.AddControllersWithViews() .AddDataAnnotationsLocalization();
2. 调整资源文件命名匹配命名空间
如果项目名称带连字符(比如E-M-V),其命名空间会被转为E_M_V,此时需要将资源文件命名为E_M_V.App.resx(而非E-M-V.App.resx),放在Resources文件夹下,确保本地化组件能正确找到对应资源。
3. 验证本地化上下文命名空间
注入IStringLocalizer时,确保泛型参数的命名空间与资源文件的命名空间匹配。例如如果项目命名空间是E_M_V,则应注入IStringLocalizer<E_M_V.App>,或者创建一个与资源文件命名匹配的空类作为本地化标记:
// 在项目根目录创建App.cs(命名空间为E_M_V) namespace E_M_V; public class App { }
关键说明
这不是框架Bug,而是项目名称特殊字符导致的命名空间与资源文件命名不匹配问题。核心是确保资源文件的命名(含命名空间前缀)与项目实际生成的命名空间完全一致,或者通过显式指定ResourcesPath来消除路径匹配误差。
内容的提问来源于stack exchange,提问作者SideSky
相关产品推荐
相关产品推荐

