C# ASP.NET Core 3.0的本地化不';行不通

C# ASP.NET Core 3.0的本地化不';行不通,c#,asp.net-core,.net-core,localization,C#,Asp.net Core,.net Core,Localization,正如标题所说,本地化不起作用,我得到的唯一关键不是这里的值是所有必要的代码 配置服务 public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer( Configuration.Ge

正如标题所说,本地化不起作用,我得到的唯一关键不是这里的值是所有必要的代码

配置服务

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();
        services.AddControllersWithViews();
        services.AddRazorPages();

        services.AddLocalization(options => options.ResourcesPath = "Resources");
        services.AddMvc().AddDataAnnotationsLocalization().AddViewLocalization(Microsoft.AspNetCore.Mvc.Razor.LanguageViewLocationExpanderFormat.Suffix, options =>
        options.ResourcesPath = "Resources");

        services.Configure<RequestLocalizationOptions>(options =>
        {
            var supportedCultures = new[]
            {
                new CultureInfo("en"),
                new CultureInfo("sr")
            };

            options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en");
            options.SupportedCultures = supportedCultures;
            options.SupportedUICultures = supportedCultures;

        });
    }
控制器

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

    public HomeController(
        ILogger<HomeController> logger,
        IStringLocalizer<Resource> localizer)
    {
        _logger = logger;
        _localizer = localizer;
    }

    public IActionResult Index()
    {
        return View();
    }

    [HandleError]
    public IActionResult Privacy()
    {
        throw new Exception();
    }

    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
    public IActionResult Error()
    {
        return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
    }
}
Index.cshtml

@{
    ViewData["Title"] = "Home Page";
}

@using Microsoft.Extensions.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@using WebApplication.Resources

@inject IStringLocalizer<Resource> localizer
@inject IViewLocalizer _localizer

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
    <p>@localizer["Hello"]</p>
    <p>@_localizer["Hello"]</p>
</div>
@{
ViewData[“Title”]=“主页”;
}
@使用Microsoft.Extensions.Localization
@使用Microsoft.AspNetCore.Mvc.Localization
@使用WebApplication.Resources
@注入IStringLocalizer定位器
@注入IViewLocalizer\u定位器
欢迎
了解

@定位器[“你好”]

@_定位器[“你好”]


在Resources文件夹中,我有类资源和两个.resx文件(Resource.en.resx,Resource.sr.resx),它们都包含一个键Hello。在视图中,我试图用IStringLocalizer和IViewLocalizer显示该键的值,但运气不好。谁能告诉我哪里出了问题,我做错了什么

您必须小心要获取的类的名称空间
IStringLocalizer
。发件人:

资源是根据其类的完整类型名减去程序集名来命名的

Resource
类的完整类型名为
WebApplication.Resources.Resource
并减去获得的程序集名
Resources.Resource
。此外,您还指定了“Resources”作为资源文件的根路径(
services.AddLocalization(options=>options.ResourcesPath=“Resources”)
)。这意味着,当您获取
IStringLocalizer
时,它将尝试在
/Resources/Resources.resource.en.resx
中找到您的资源文件(用于英语本地化)

您有几个选择:

1.修改资源类的命名空间 在
Resource.cs
中,使用以下命名空间:

namespace WebApplication
{ ... }
现在,定位器将在
/Resources/resource.en.resx
处查找资源文件(或
/Resources.resource.en.resx
-点或路径分隔符无关紧要)

2.重命名您的RESX文件 由于本地化程序当前正在
/Resources/Resources.Resource.en.resx
中查找文件,您只需将
Resource.en.resx
重命名为
Resources.Resource.en.resx

3.不要设置相对资源SPATH 在
Startup.cs
中配置本地化时,可以跳过设置
ResourcesPath
,以便本地化程序将查找相对于项目根文件夹的文件:

// Startup.cs -> ConfigureServices()
services.AddLocalization();

现在,定位器将在路径
/Resources/Resource.en.resx

中查找文件,谢谢您,先生。你是个英雄!
namespace WebApplication
{ ... }
// Startup.cs -> ConfigureServices()
services.AddLocalization();