无法访问 .net Core 3 中的 resx 文件

Unable to access resx file in .net Core 3

已将新的 .Resx 文件添加到 .Net Core Web 3 项目下的 Resources 文件夹中。

当尝试访问 resx 文件时,它在控制器或验证属性上不可用。

在 .Net Core 中使用 Resx 文件的正确方法是什么。

在Controller中配置本地化,可以参考以下步骤

1.Configure Startup.ConfigureServices 方法中的本地化和 Startup.Configure 方法中的设置文化。本地化中间件必须在任何可能检查请求文化的中间件之前配置:

public void ConfigureServices(IServiceCollection services)
    {
       //Adds the localization services to the services container. The code above also sets the resources path to "Resources"
        services.AddLocalization(options => options.ResourcesPath = "Resources");

        services.AddControllersWithViews()
            .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
            .AddDataAnnotationsLocalization();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        var supportedCultures = new[]
        {
            new CultureInfo("en-US"),
            new CultureInfo("fr"),
        };

        app.UseRequestLocalization(new RequestLocalizationOptions
        {
            DefaultRequestCulture = new RequestCulture("en-US"),
            // Formatting numbers, dates, etc.
            SupportedCultures = supportedCultures,
            // UI strings that we have localized.
            SupportedUICultures = supportedCultures
        });

        ...
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }

2.The ConfigureServices 方法将 ResourcesPath 设置为 "Resources",因此家庭控制器的法语资源文件的项目相对路径为 Resources/Controllers.HomeController.fr.resx。或者,您可以使用文件夹来组织资源文件。对于家庭控制器,路径为 Resources/Controllers/HomeController.fr.resx

然后使用 IStringLocalizer,它使用 ResourceManager 和 ResourceReader 在 运行 时提供文化特定资源以访问 Controller 中的 Resx 文件。

public class HomeController : Controller
{
    private readonly IStringLocalizer<HomeController> _localizer;

    public HomeController(IStringLocalizer<HomeController> localizer)
    {
        _localizer = localizer;
    }

    public IActionResult About()
    {
        ViewData["Message"] = _localizer["Your application description page."];

        return View();
    }
}

有关详细信息,您可以参考包含示例代码和 DataAnnotations 本地化的 official doc

我确实尝试按照上面的答案中解释的方式进行操作,但我感到很困惑,似乎要完成该操作还有很多事情要做。当我正在寻找可以使用资源文件的东西时,就像我们以前在 Asp.Net webforms 中所做的那样。我发现了一个不太复杂的解决方案,说我们可以使用 Resource.ResourceManager.GetString("Hello", new CultureInfo("Ar")) 其中“Hello”是您从资源字符串中使用的字符串键,“Ar”是您想要激活的文化。 这似乎不是最合适的方式,但它对我有用。我们可以管理从哪里获得文化。我已经使用 Session 对其进行了管理。您可以从 Globalization and localization in ASP.NET Core With Resource Files 获取参考。您也可以查看他们的示例代码。