Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用IStringLocalizer从ASP.NET核心控制器获取本地化字符串?_C#_Asp.net Core_Localization_Asp.net Core 2.0_Asp.net Core Localization - Fatal编程技术网

C# 如何使用IStringLocalizer从ASP.NET核心控制器获取本地化字符串?

C# 如何使用IStringLocalizer从ASP.NET核心控制器获取本地化字符串?,c#,asp.net-core,localization,asp.net-core-2.0,asp.net-core-localization,C#,Asp.net Core,Localization,Asp.net Core 2.0,Asp.net Core Localization,这里有点混乱,ASP.NETCore2.0中的超级简单HelloWorld本地化示例。MyAbout页面设置为呈现两个本地化字符串: 从视图中(使用IViewLocalizer) 来自代码(通过控制器使用IStringLocalizer) 控制器中的代码拒绝正确获取loc字符串。这并不复杂,我遗漏了什么明显的东西 关于.cshtml @使用Microsoft.AspNetCore.Mvc.Localization @注入IViewLocalizer定位器 @{ ViewData[“Title”]

这里有点混乱,ASP.NETCore2.0中的超级简单HelloWorld本地化示例。MyAbout页面设置为呈现两个本地化字符串:

  • 从视图中(使用
    IViewLocalizer
  • 来自代码(通过控制器使用IStringLocalizer)
  • 控制器中的代码拒绝正确获取loc字符串。这并不复杂,我遗漏了什么明显的东西

    关于.cshtml

    @使用Microsoft.AspNetCore.Mvc.Localization
    @注入IViewLocalizer定位器
    @{
    ViewData[“Title”]=“关于”;
    }
    @ViewData[“标题”]
    @ViewData[“消息”]
    @定位器[“使用此区域提供附加信息。”]

    ^注意这两个字符串:“Message”将使用
    IStringLocalizer
    从代码中本地化(请参见下面的HomeController),而@Localizer将使用
    IViewLocalizer

    HomeController.cs

    公共类HomeController:控制器
    {
    专用只读IStringLocalizer\u localizer;
    公共家庭控制器(IStringLocalizer)
    {
    _定位器=定位器;
    }
    公共IActionResult索引()
    {
    返回视图();
    }
    公共IActionResult About()
    {
    ViewData[“Message”]=“本地化程序[“您的应用程序描述页];
    返回视图();
    }
    }
    
    Startup.cs(相关部分)

    public void配置服务(IServiceCollection服务)
    {
    services.AddLocalization(options=>options.ResourcesPath=“Resources”);
    services.AddMvc()
    .AddViewLocalization(LanguageViewLocationExpanderFormat.后缀)
    .AddDataAnnotationsLocalization();
    配置(选项=>
    {
    var supportedCultures=new[]
    {
    新文化信息(“美国”),
    新文化信息(“fr CH”),
    };
    options.DefaultRequestCulture=newrequestculture(culture:“en-US”,uiCulture:“en-US”);
    options.SupportedCultures=SupportedCultures;
    options.supportedCultures=supportedCultures;
    });
    }
    公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
    {
    var locOptions=app.ApplicationServices.GetService();
    app.UseRequestLocalization(locOptions.Value);
    if(env.IsDevelopment())
    {
    app.UseBrowserLink();
    app.UseDeveloperExceptionPage();
    }
    其他的
    {
    app.UseExceptionHandler(“/Home/Error”);
    }
    app.UseStaticFiles();
    app.UseMvc(路由=>
    {
    routes.MapRoute(
    名称:“默认”,
    模板:“{controller=Home}/{action=Index}/{id?}”);
    });
    }
    
    资源:

    Views.Home.About.fr-CH.resx

    ^其中包含两个值:

    • “使用此区域可提供其他信息。”=“使用此区域” 区域…fr CH的成功!“
    • “您的应用程序说明页。”= “您的应用程序描述……fr CH成功!”
    我的结果:

    本地主机:56073/主页/关于

    ^这将按照en US中的预期呈现字符串(默认情况下不查找任何内容,使用实际硬编码的字符串)

    localhost:56073/Home/About?culture=fr CH

    ^这仅呈现第二个字符串:“使用此区域…fr-CH成功!”,这显然意味着所有连接的代码都正常工作,并按预期查找fr-CH.resx

    但是,第一个字符串(在代码中设置为
    ViewData[“Message”]
    )没有获得fr CH版本!这就像
    IStringLocalizer
    未能意识到指定了lang,或者未能找到明显可用的fr-CH.resx

    为什么

    顺便说一句,我也尝试过使用ShareResource示例(参见下面的链接),并在工厂中以
    IStringLocalizerFactory工厂
    的形式将其传递给HomeController ctor,同样没有love,仍然没有获得fr CH资源。唉

    其他注意事项:

    将此作为我的主要参考:


    使用VS 2017,最新更新,使用ASP.Net Core 2.0

    您正在控制器中使用
    IStringLocalizer
    作为定位器来查找本地化字符串。本地化程序将在
    Resources
    文件夹中查找
    YouControllerNameSpace.HomeController
    资源文件,由于找不到该文件,它将返回您传递给本地化程序的原始密钥

    要解决此问题,可以使用以下选项之一:

    • 注入
      IStringLocalizer
    • Inject
      IStringLocalizerFactory
    有关资源文件名的更多信息,请参阅文档中的一节

    注入IStringLocalizer 使用此选项,您应该有一个与T全名同名的资源文件,在您的情况下,控制器代码应该与它相同:

    IStringLocalizer _localizer;
    public HomeController(IStringLocalizer<HomeController> localizer)
    {
       _localizer = localizer;
    }
    
    对于资源文件:

    • 确保您有
      视图.Home.About
      资源文件
    • 确保资源文件中有指定的字符串
    • 确保您有不同区域性的资源文件

    尝试tmg在中描述的技术

    具体来说,尝试添加行

    options.RequestCultureProviders = new List<IRequestCultureProvider>
    {
        new QueryStringRequestCultureProvider(),
        new CookieRequestCultureProvider()
    };
    
    options.RequestCultureProviders=新列表
    {
    新建QueryStringRequestCultureProvider(),
    新CookiierRequestCultureProvider()
    };
    

    对于ConfigureServices()函数,问题在于ASP.NET Core使用IStringLocalizer为本地化创建了错误的RESX命名空间。如果代码中有

    services.AddLocalization(options => options.ResourcesPath = "Resources");
    
    然后注入服务IStringLocalizer的实例在名称空间中有两个“Resources”,名称空间看起来是“Resources.Resources”。这是无法找到RESX的根本原因。

    sna
    services.AddLocalization(options => options.ResourcesPath = "Resources");