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

Translations not working remotely only in a local environment

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

我将所有翻译都放在根目录下的全局文件中,并且我有虚拟文件,因此我可以按照文档的建议将其注入视图和控制器。不知何故,似乎找不到 RESX 文件,所以我将其设置为 Always upload。不过,不当行为没有改变。

我不确定如何进一步诊断它,或者 RESX 文件是编译到 DLL 中还是直接上传到服务器并即时读取。是否可以通过某种方式验证该文件是 "up there"?

我的配置是这样的

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 中,这两种情况都不起作用。

关于文化配置的几句话。我猜你只想指定瑞典语言环境,所以你有这行代码

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 header。看起来您没有在请求 cookie 或查询字符串中指定文化,但您的浏览器发送 Accept-Language header,ASP.NET 核心从中读取请求文化。如果浏览器发送 en-USensv 文化,其中 none 匹配 supportedCultures(即 sv-SEse) 框架回退到 DefaultRequestCulture(即 se)并从 Lingo.se.resx 读取资源,一切正常。但看起来 Edge(在任何其他浏览器上,但在另一台计算机上)在 Accept-Language header 中发送了不同的文化集,其中包括 sv-SE 包含在 supportedCultures 中。因此资源 reader 搜索了 Lingo.sv-se.resxLingo.sv.resx 文件但没有成功,因此没有提供翻译。

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