[英]Using DataAnnotation localizer in your extension method for HtmlHelper in ASP.net core mvc 3.1
[英]How to properly use resource files with string localizer in .NET Core 3.1?
我有一个项目,我使用资源文件来存储一些文本,我还尝试使用 StringLocalizer<> 从资源文件中获取所需的消息。 我已经在 Startup 类中配置了本地化设置,如下所示:
internal static class LocalizationConfiguration
{
private const string ResourcesPath = "Resources";
private const string DefaultCulture = "en-US";
internal static IServiceCollection ConfigureLocalizationSettings(this IServiceCollection services) =>
services
.AddLocalization(options =>
options.ResourcesPath = ResourcesPath);
internal static IApplicationBuilder UseRequestLocalizationMiddleware(this IApplicationBuilder builder) =>
builder
.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture(DefaultCulture),
SupportedCultures = new List<CultureInfo>
{
new CultureInfo(DefaultCulture)
}
});
}
我的解决方案包括几个项目。 我需要在包含我的业务逻辑的项目中使用 StringLocalizer - xxx.Handlers。 我还创建了一个名为 xxx.Resources 的项目,用于存储包含两个目录的资源:
这是我的 UserMessages 类(它是空的虚拟类,遵循https://docs.microsoft.com/pl-pl/aspnet/core/fundamentals/localization?view=aspnetcore-3.1 ):
public class UserMessages
{
}
我将 StringLocalizer 注入我的命令处理程序,然后像下面这样使用它(UserConstants.UserNotFoundMessageKey 是好的):
var userEntity = await _userRepository.GetUserByIdAsync(command.UserId);
if (userEntity is null)
{
var message = _stringLocalizer[UserConstants.UserNotFoundMessageKey];
var statusCode = (int) HttpStatusCode.NotFound;
throw new CommandException(message, statusCode);
}
问题是,我的消息没有以正确的方式本地化,表达式“_stringLocalizer[UserConstants.UserNotFoundMessageKey]”实际上返回 UserNotFoundMessageKey 的值而不是位于资源文件中的消息。 我究竟做错了什么?? 如何正确本地化这些消息?
这是关于如何在单独的项目中创建共享资源的完整工作解决方案:
在 ProjectA 中(在我的解决方案中是SharedResource3_1
):
1.Create Shared
folder with UserMessages
class and Create Resources
folder with Shared.UserMessages.en-US.resx
file(不知道你为什么创建Shared.UserMessages.en-US.Designer.cs
,但它似乎没有用):
UserMessages.cs
:
namespace SharedResource3_1.Shared
{
public class UserMessages
{
}
}
Shared.UserMessages.en-US.resx
:
在 ProjectB 中(在我的解决方案中是MvcCore3_1
):
1.在ProjectA中添加项目引用:
Right-click
ProjectB Dependencies
并选择Add Project Reference
然后选择 ProjectA:
然后你可以得到如下参考:
2.Startup.cs:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
//add this...
LocalizationConfiguration.ConfigureLocalizationSettings(services);
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//add this...
LocalizationConfiguration.UseRequestLocalizationMiddleware(app);
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
internal static class LocalizationConfiguration
{
private const string ResourcesPath = "Resources";
private const string DefaultCulture = "en-US";
internal static IServiceCollection ConfigureLocalizationSettings(this IServiceCollection services) =>
services
.AddLocalization(options =>
options.ResourcesPath = ResourcesPath);
internal static IApplicationBuilder UseRequestLocalizationMiddleware(this IApplicationBuilder builder) =>
builder
.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture(DefaultCulture),
SupportedCultures = new List<CultureInfo>
{
new CultureInfo(DefaultCulture)
}
});
}
3.家庭控制器:
using SharedResource3_1.Shared; //add the reference for the UserMessages in ProjectA
public class HomeController : Controller
{
private readonly IStringLocalizer<UserMessages> _stringLocalizer;
public HomeController(IStringLocalizer<UserMessages> stringLocalizer)
{
_stringLocalizer = stringLocalizer;
}
public IActionResult Index()
{
ViewBag.data = _stringLocalizer["cześć"]; //the key name should be the Name in your resx file...
return View();
}
}
结果:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.