翻译不能仅在本地环境中远程工作

问题描述 投票:1回答:1

在我的浏览器上,我从我的本地environemnt运行,字符串被翻译为应该。当我上传到Azure时,它仍然有效。但是,当我切换到Edge(我从不使用除了下载FireFox之外的任何东西)时,字符串不再被翻译。我在各种浏览器上与外部用户进行了验证,这似乎是与平台无关的问题。

我将所有翻译放在根目录中的全局文件中,并且我有虚拟文件,因此我可以将其注入到视图和控制器中,如文档所建议的那样。不知何故,似乎找不到RESX文件,所以我把它放在Always upload上。但是,不良行为没有改变。

我不确定如何进一步诊断它,或者是否将RESX文件编译到DLL中或直接上传到服务器并即时读取。有可能以某种方式验证文件是“在那里”吗?

我的配置是这样的。

public void ConfigureServices(IServiceCollection services)
{
  ...
  services.AddLocalization(a => a.ResourcesPath = "");

  services.Configure<RequestLocalizationOptions>(a =>
    {
      CultureInfo[] supportedCultures = {
        new CultureInfo("sv-SE"),
        new CultureInfo("se")
      };
      a.DefaultRequestCulture = new RequestCulture("se");
      a.SupportedCultures = supportedCultures;
      a.SupportedUICultures = supportedCultures;
    });
  ...
  services.AddMvc()
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  ...
  app.UseRequestLocalization();
  ...
  app.UseMvcWithDefaultRoute();
}

编辑

我注意到当我有这些线时,它在Chrome中有效。

RequestLocalizationOptions options = app.ApplicationServices
  .GetService<IOptions<RequestLocalizationOptions>>().Value;
app.UseRequestLocalization(options);

当我有那些时,它停止工作。

  //RequestLocalizationOptions options = app.ApplicationServices
  //  .GetService<IOptions<RequestLocalizationOptions>>().Value;
  app.UseRequestLocalization();

在IE中,它在任何一种情况下都不起作用。

c# razor asp.net-core internationalization asp.net-core-2.2
1个回答
2
投票

关于文化配置的夫妇词。我想你只想指定瑞典语语言环境,所以你有这些代码行

CultureInfo[] supportedCultures = {
    new CultureInfo("sv-SE"),
    new CultureInfo("se")
};

事实证明,sv-SE绝对是瑞典文化,但se是北萨米文化。如果你的意图只是瑞典文化,你需要设置sv而不是se

CultureInfo[] supportedCultures = {
    new CultureInfo("sv-SE"),
    new CultureInfo("sv")
};
a.DefaultRequestCulture = new RequestCulture("sv");

回到主要问题。默认情况下,有3种方法可以通过查询字符串,cookie或Accept-Language标头设置请求文化。看起来您没有在请求cookie或查询字符串中指定文化,但是您的浏览器会发送Accept-Language标头,ASP.NET Core会从中读取请求文化。如果浏览器发送en-USensv文化,它们都没有匹配supportedCulturessv-SEse)框架回落到DefaultRequestCulture(这是se)并从Lingo.se.resx读取资源,一切都很好。但它看起来像Edge(在任何其他浏览器上,但在另一台计算机上)在Accept-Language标题内发送了不同的文化集,其中包括sv-SE中包含的supportedCultures。所以资源读者搜索Lingo.sv-se.resxLingo.sv.resx文件,但没有运气,因此没有提供翻译。

如果我的假设是正确的将se更改为代码中的sv并将Lingo.se.resx重命名为Lingo.sv.resx将解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.