ASP.NET Core Web API中StringLocalizer无法读取resx文件值的问题
解决ASP.NET Core Web API中IStringLocalizer无法找到德语资源的问题
我来帮你排查并解决这个资源找不到的问题,咱们一步步来:
1. 调整ConfigureServices的配置顺序
你当前的配置是先调用AddMvc再AddLocalization,这会导致Mvc无法正确应用本地化的配置规则。应该先注册本地化服务,再配置Mvc:
public void ConfigureServices(IServiceCollection services) { // 先添加本地化服务,指定资源文件存放路径 services.AddLocalization(options => options.ResourcesPath = "Resources"); services.AddMvc() .SetCompatibilityVersion(CompatibilityVersion.Version_2_2) .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix) .AddDataAnnotationsLocalization(); services.Configure<RequestLocalizationOptions>(options => { var supportedCultures = new[] { new CultureInfo("de") }; options.DefaultRequestCulture = new RequestCulture(culture: "de", uiCulture: "de"); options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; }); }
2. 确保资源文件的路径与生成配置正确
因为你设置了ResourcesPath = "Resources",资源文件的存放路径/命名必须和控制器的命名空间对应,同时要设置正确的生成操作:
路径规则二选一:
- 文件夹结构匹配命名空间:创建路径
Resources/StringLocalizer/Controllers/Values.de.resx - 扁平化命名:直接放在Resources文件夹下,命名为
Resources/StringLocalizer.Controllers.Values.de.resx
关键配置:设置生成操作为嵌入资源
在解决方案资源管理器中右键点击你的.resx文件 → 选择「属性」→ 把「生成操作」改为嵌入的资源 → 保存更改。如果没设置这个,框架根本找不到嵌入的资源文件。
3. 简化控制器的本地化注入(推荐)
没必要手动使用IStringLocalizerFactory,直接注入泛型的IStringLocalizer<ValuesController>,框架会自动匹配对应的资源文件,避免手动输入名称出错:
namespace StringLocalizer.Controllers { [Route("api/[controller]")] [ApiController] public class ValuesController : Controller { private readonly IStringLocalizer<ValuesController> _localizer; // 直接注入泛型本地化器 public ValuesController(IStringLocalizer<ValuesController> localizer) { _localizer = localizer; } [HttpGet] public ActionResult<string> Get() { // 直接使用索引器,不需要.Value(框架会自动返回本地化字符串) string result = _localizer["Hello"]; return result; } } }
4. 验证请求文化与中间件顺序
确保UseRequestLocalization放在UseMvc之前,否则本地化规则不会生效:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } // 先启用请求本地化,再启用Mvc var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>(); app.UseRequestLocalization(locOptions.Value); app.UseMvc(); }
你还可以在Get方法里加一行代码,验证当前的UI文化是否为德语:
var currentCulture = System.Globalization.CultureInfo.CurrentUICulture.Name;
如果输出不是de,那说明请求本地化规则没生效,需要检查RequestLocalizationOptions的配置。
5. (可选)如果坚持使用IStringLocalizerFactory
如果你一定要手动创建本地化器,要确保传入的资源名称和程序集名称完全正确:
public ValuesController(IStringLocalizerFactory _localizerFactory) { // 用控制器类型获取程序集名称,避免硬编码出错 var assemblyName = typeof(ValuesController).Assembly.GetName().Name; m_Localizer = _localizerFactory.Create("StringLocalizer.Controllers.Values", assemblyName); }
按照上面的步骤调整后,你的本地化字符串应该能正常返回HalloWelt了。
内容的提问来源于stack exchange,提问作者pospich0815
相关产品推荐
相关产品推荐

