繁体   English   中英

如何在 .NET Core 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM