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)
                }
            });
}

我的解决方案包括几个项目。我需要在包含我的业务逻辑-xxx.Handlers的项目中使用StringLocalizer。我还创建了一个名为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.Shared使用UserMessagesclass创建Resources文件夹并使用Shared.UserMessages.en-US.resxfile创建文件夹(不知道为什么创建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-clickProjectB DependenciesAdd 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.HomeController:

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();
    }
}

结果:

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章