You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:51:16