为什么不能使用ASP.NET Core Localization

时间:2018-03-21 18:30:43

标签: c# asp.net-core localization

我创建了一个空项目。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddLocalization(s => s.ResourcesPath = "Resources");
    var supportedCultures = new CultureInfo[]
    {
        new CultureInfo("de-CH"),
        new CultureInfo("en-GB"),
    };

    services.Configure<RequestLocalizationOptions>(s =>
    {
        s.SupportedCultures = supportedCultures;
        s.SupportedUICultures = supportedCultures;
        s.DefaultRequestCulture = new RequestCulture(culture: "de-CH", uiCulture: "de-CH");
    });

    services.AddMvc()
        .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
        .AddDataAnnotationsLocalization();
}


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{

    app.UseStaticFiles();

    // Using localization 
    var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
    app.UseRequestLocalization(locOptions.Value);

    app.UseMvc();
}

文件夹结构

Resources
|
|--Controllers 
|       HomeController.de.resx
|       HomeController.en.resx
|       HomeController.resx

控制器

public class HomeController : Controller
{
    private readonly IStringLocalizer<HomeController> _stringLocalizer;

    public HomeController(IStringLocalizer<HomeController> stringLocalizer)
    {
        _stringLocalizer = stringLocalizer;
    }

    public IActionResult Index()
    {
        string testValue = _stringLocalizer["Test"];
        return View();
    }
}

我是关于asp.net核心的新手,我只是想了解,为什么testValue总是返回Test,它有点令人困惑。我做错了什么?如果你帮助我,我会很高兴。

2 个答案:

答案 0 :(得分:8)

只需添加包 Microsoft.Extensions.Localization
即可 这样做之后就行了 ResourcePath是可选的,如果保留为null,则资源文件组织样式与经典Asp.Net应用程序相同(在目标类的相同位置)。

答案 1 :(得分:2)

此处有两个不同的错误会阻止正确加载本地化资源。

  1. 您在ResourcesPath电话中设置了错误的AddLocalization()。由于您的resx文件放在Resources/Controllers目录中,您应该替换call

    services.AddLocalization(s => s.ResourcesPath = "Resources");
    

    services.AddLocalization(s => s.ResourcesPath = "Resources/Controllers");
    
  2. 您对resx文件使用了错误的名称。查看Resource file naming文章中的Globalization and localization in ASP.NET Core部分:

      

    资源以其类的完整类型名称减去   装配名称。例如,项目中的法语资源主要是   该课程的汇编为LocalizationWebsite.Web.dll   LocalizationWebsite.Web.Startup将命名为 Startup.fr.resx 。一个   班级资源   LocalizationWebsite.Web.Controllers.HomeController将被命名    Controllers.HomeController.fr.resx 。如果你的目标类的命名空间   与程序集名称相同,您需要完整的类型名称。   例如,在示例项目中为该类型的资源   ExtraNamespace.Tools将命名为 ExtraNamespace.Tools.fr.resx

    因此,如果您的程序集被调用TestMvcApplicationHomeController驻留在名称空间TestMvcApplication.Controllers中,那么您应该按以下方式调用resx文件:

    Resources
    |
    |--Controllers 
    |       Controllers.HomeController.de.resx
    |       Controllers.HomeController.en.resx
    |       Controllers.HomeController.resx
    
  3. 我相信在您对项目进行上述更改后,本地化将正常运行。