无法访问 .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 获取参考。您也可以查看他们的示例代码。
已将新的 .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 获取参考。您也可以查看他们的示例代码。