C# Asp.NET核心不可预测的本地化结果

C# Asp.NET核心不可预测的本地化结果,c#,asp.net-core,asp.net-core-localization,C#,Asp.net Core,Asp.net Core Localization,我在我的ASP.Net Core 3.0 Web API项目中实现了以下文档中的本地化: 我做每件事的方式与示例所示几乎相同,但为了完整起见,我将在这里发布相关的代码片段。本地化的配置方式如下: Startup.cs EmailSender类位于Helpers文件夹中,my.resx文件位于Strings文件夹中,名称如下: Helpers.EmailSender.en-US.resx Helpers.EmailSender.bs-Latn-BA.resx 结果: 当我手动更改默认区域性时,一切

我在我的ASP.Net Core 3.0 Web API项目中实现了以下文档中的本地化:

我做每件事的方式与示例所示几乎相同,但为了完整起见,我将在这里发布相关的代码片段。本地化的配置方式如下:

Startup.cs

EmailSender
类位于Helpers文件夹中,my.resx文件位于Strings文件夹中,名称如下:

Helpers.EmailSender.en-US.resx

Helpers.EmailSender.bs-Latn-BA.resx

结果:

当我手动更改默认区域性时,一切都按预期进行,并且始终返回正确版本的资源字符串

但是,我希望文化由
QueryStringRequestCultureProvider
提供,但是当我通过使用Postman或Swagger创建请求来测试我的应用程序时,结果是不可预测的

请求的格式如下所示: . 在启动/查询区域性组合中更改默认区域性将得到以下结果:

en-US/en-US->en-US

en US/bs Latn BA->en US(这是错误的)

bs Latn BA/en US->en US

bs Latn BA/bs Latn BA->bs Latn BA

因此,当bs Latn BA为默认值时,更改区域性是有效的,但当en US为默认值时,则不起作用


我真的被这种行为弄糊涂了,甚至正在考虑本地化框架中可能存在的错误。

很可能是配置中的错误<当找不到请求的区域性时,code>en-US是默认的回退区域性。您发布的组合表明,
bs-Latn-BA
根本不起作用。@PanagiotisKanavos但我确实得到了bs-Latn-BA字符串,这是默认的和请求的区域性。此外,当bs Latn BA为默认值且我请求英语时,返回英语,这表明我的bs Latn BA资源和解析查询字符串都有效…在.NET(所有堆栈、版本)中,本地化由线程的UICulture和区域性属性控制。UICulture影响UI和资源、区域性解析和格式设置。尝试调试
EmailSender
,并检查这些属性是否用于请求线程。可能是字符串定位器被三部分文化阻塞了。如果您进行检查,您会发现代码非常简单,您还可以尝试使用不同的区域性字符串来隔离问题。如果两个部分可以工作,但三个部分失败,如果线程、请求区域性正常,您就会知道问题与资源文件有关。我已经用两个部分的区域性进行了测试,没有任何区别。另外,UICulture默认设置为Culture,所以我没有在请求中显式设置它也没关系,很可能是配置中的错误<当找不到请求的区域性时,code>en-US是默认的回退区域性。您发布的组合表明,
bs-Latn-BA
根本不起作用。@PanagiotisKanavos但我确实得到了bs-Latn-BA字符串,这是默认的和请求的区域性。此外,当bs Latn BA为默认值且我请求英语时,返回英语,这表明我的bs Latn BA资源和解析查询字符串都有效…在.NET(所有堆栈、版本)中,本地化由线程的UICulture和区域性属性控制。UICulture影响UI和资源、区域性解析和格式设置。尝试调试
EmailSender
,并检查这些属性是否用于请求线程。可能是字符串定位器被三部分文化阻塞了。如果您进行检查,您会发现代码非常简单,您还可以尝试使用不同的区域性字符串来隔离问题。如果两个部分可以工作,但三个部分失败,如果线程、请求区域性正常,您就会知道问题与资源文件有关。我已经用两个部分的区域性进行了测试,没有任何区别。此外,UICulture默认设置为Culture,因此我在请求中没有显式设置它也不重要。
public void ConfigureServices(IServiceCollection services) 
{    
  services.AddLocalization(options => options.ResourcesPath = "Strings");    
  services.Configure<RequestLocalizationOptions>(options =>    
  {
      options.DefaultRequestCulture = new RequestCulture("en-US");
      options.SupportedCultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("bs-Latn-BA") };
      options.RequestCultureProviders = new List<IRequestCultureProvider>()
      {
         new QueryStringRequestCultureProvider()
      };    
  });    
 services.AddTransient<EmailSender>(); 
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{      
  app.UseRequestLocalization();
} 
public EmailSender(IStringLocalizer<EmailSender> stringLocalizer)
{
   myResource = stringLocalizer["MyResourceName"];
}