C# AspNetCore2.0本地化不适用于HTML

C# AspNetCore2.0本地化不适用于HTML,c#,asp.net-core,localization,C#,Asp.net Core,Localization,我在视图中设置本地化时遇到问题,而在控制器上设置本地化时,本地化工作正常。以下是我遵循的步骤 public void ConfigureServices(IServiceCollection services) { services.AddLocalization(option=>option.ResourcesPath="services.AddLocalization(options => options.ResourcesPath = "Str

我在视图中设置本地化时遇到问题,而在控制器上设置本地化时,本地化工作正常。以下是我遵循的步骤

public void ConfigureServices(IServiceCollection services)
{            
     services.AddLocalization(option=>option.ResourcesPath="services.AddLocalization(options => options.ResourcesPath = "StringResources");");

     // Add application services.
     services.AddTransient<IEmailSender, EmailSender>();

     services.AddMvc()
             .AddViewLocalization(Microsoft.AspNetCore.Mvc.Razor.LanguageViewLocationExpanderFormat.Suffix);
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{            
     var supportedCultures = new[]
     {
           new CultureInfo("nb-NO"),
           new CultureInfo("en-US"),
           new CultureInfo("zh-CN"),               
     };
     app.UseRequestLocalization(new RequestLocalizationOptions
     {
           DefaultRequestCulture = new RequestCulture("en-US"),
           // Formatting numbers, dates, etc.
           SupportedCultures = supportedCultures,
           // UI strings that we have localized.
           SupportedUICultures = supportedCultures
     });
     app.UseStaticFiles();            
}
上述操作在控制器中有效,但在视图中无效。我的HTML如下所示

@inject IHtmlLocalizer<SharedResources> SharedLocalizer;
<h1>@SharedLocalizer["LogInTo"]<br>
@inject IHtmlLocalizer SharedLocalizer;
@SharedLocalizer[“登录”]
现在视图上的输出是LogInTo,而我希望它是
Logg inn

每次聊天我们都能找出问题的原因

基本上,奇怪的是,
IStringLocalizer
似乎能工作,而
IHtmlLocalizer
却不能。这通常不应该是一个问题,因为
IHtmlLocalizer
实际上只是字符串定位器周围的一个很薄的层,它添加了一些HTML编码,以便在Razor视图中使用

因此,我们研究的另一个角度是控制器中是否有任何其他代码会影响定位器的工作方式。以前的测试代码显式设置了当前线程的区域设置,因此我们必须确保这不是问题所在,并且控制器和视图中的定位器都在同一上下文中执行

这就给我们留下了航道本身。泛型本地化程序的工作方式是使用泛型类型参数进行命名,以解析资源源。一个本地化程序能够从资源文件生成字符串,而另一个无法解析任何字符串,这意味着两个本地化程序显然使用了不同的资源文件

这确实是问题所在:在视图中注入的
IHtmlLocalizer
引用的
SharedResources
类型与注入视图的
IStringLocalizer
不同

除非视图中有明确的
@using
指令,否则Razor引擎将尊重
\u ViewImports.cshtml
文件中的using指令。在该文件中使用的
@很可能授予了对
共享资源
类型的访问权限,该类型位于与预期类型不同的命名空间中。所以Razor并没有抱怨,因为它可以找到一个具有该名称的类型,但它最终是一个不同的类型

就像在普通C#代码中一样,您可以始终使用完整的命名空间指定类型。这样可以避免在不同名称空间中存在同名类型时发生冲突。因此,避免此问题的最安全方法是将
@inject
指令更改为使用
SharedResources
类型的完整命名空间:

@inject IHtmlLocalizer<Utilities.Resources.SharedResources> SharedLocalizer
@inject IHtmlLocalizer SharedLocalizer

每次聊天我们都能找出问题的原因

基本上,奇怪的是,
IStringLocalizer
似乎能工作,而
IHtmlLocalizer
却不能。这通常不应该是一个问题,因为
IHtmlLocalizer
实际上只是字符串定位器周围的一个很薄的层,它添加了一些HTML编码,以便在Razor视图中使用

因此,我们研究的另一个角度是控制器中是否有任何其他代码会影响定位器的工作方式。以前的测试代码显式设置了当前线程的区域设置,因此我们必须确保这不是问题所在,并且控制器和视图中的定位器都在同一上下文中执行

这就给我们留下了航道本身。泛型本地化程序的工作方式是使用泛型类型参数进行命名,以解析资源源。一个本地化程序能够从资源文件生成字符串,而另一个无法解析任何字符串,这意味着两个本地化程序显然使用了不同的资源文件

这确实是问题所在:在视图中注入的
IHtmlLocalizer
引用的
SharedResources
类型与注入视图的
IStringLocalizer
不同

除非视图中有明确的
@using
指令,否则Razor引擎将尊重
\u ViewImports.cshtml
文件中的using指令。在该文件中使用
@很可能授予了对
共享资源
类型的访问权限,该类型位于与预期类型不同的命名空间中。所以Razor并没有抱怨,因为它可以找到一个具有该名称的类型,但它最终是一个不同的类型

就像在普通C#代码中一样,您可以始终使用完整的命名空间指定类型。这样可以避免在不同名称空间中存在同名类型时发生冲突。因此,避免此问题的最安全方法是将
@inject
指令更改为使用
SharedResources
类型的完整命名空间:

@inject IHtmlLocalizer<Utilities.Resources.SharedResources> SharedLocalizer
@inject IHtmlLocalizer SharedLocalizer

还不完全清楚您的预期输出是什么。您将支持的区域性定义为
en-us
zh-cn
,创建
en-us
资源文件,并尝试将区域设置为
sv-se
,对吗?这可能与命名不一致有关吗?SharedResources vs SharedResources..resx。或者这只是你的一个问题?如果它在控制器中工作,但在view@Tewr是的,这是一个打字错误,是的,但我仍然不明白它不是完全清楚你的预期输出将是什么。您将支持的区域性定义为
en-us
zh-cn
,创建
en-us
资源文件,并尝试将区域设置为
sv-se
,对吗?这可能与命名不一致有关吗?SharedResources vs SharedResources..resx。或者这只是你的一个问题?如果它在控制器中工作,但在view@Tewr是的,这是一个打字错误,是的,但我还是想不出好的答案,