【问题标题】:Translations not working remotely only in a local environment翻译不能仅在本地环境中远程工作
【发布时间】:2019-02-17 18:24:06
【问题描述】:

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

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

我不确定如何进一步诊断它,或者是否将 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 中这两种情况都不起作用。

【问题讨论】:

  • 您是否使用 cookie 本地化? Edge 中的 cookie 可能(但我不确定)有问题。所以尝试通过查询字符串指定文化,看看它是否适用于 Edge。
  • @Alexander 我知道我不清楚这个问题。这些字符串不会在任何浏览器中翻译,除非该浏览器“从以前开始”使用过。不知道多久,但我通常在 Cr 和 FF 中运行我的东西,它可以在我的电脑上运行。但是,另一台计算机上的相同浏览器会失败。更奇怪的是,即使在 IE 和 Eg 中本地运行也会失败。但只是为了排除它与 cookie 相关的可能性 - 我将如何根据您的建议指定 cookie?
  • 好的,如果 cookie 有问题,您仍然应该看到默认文化的翻译(在您的情况下为 se)。它在一个浏览器中工作而在另一个浏览器中不起作用,这有点奇怪,因为浏览器不会影响本地化过程(嗯,它只设置请求文化,仅此而已)。如果它以前有效而现在无效,则您必须更改项目中的某些内容,特别是本地化文件。什么是虚拟文件?您的本地化文件的名称是什么?
  • 这个启动代码你改了吗?诚然,您说这是可行的,但我希望 RequestLocalizationOptions 服务能够传递给 UseRequestLocalization。像 var locOptions = app.ApplicationServices.GetService>(); app.UseRequestLocalization(locOptions.Value);
  • @Alexander 好点。它在 Cr 和 FF(本地和远程)中仍然工作并工作。它在 Eg 和 IE(loco 和 remo)中不起作用。我目前要求人们安装浏览器并检查他们的系统。看起来好像最初在开发中使用的浏览器出现了一些问题......至于虚拟 - 它只是我在注入 IStringLocalization 时使用的一个空类。我的 RESX 文件名为 Ling.se.resx(我还创建了 Controller.Lingo.se.resx 在纯粹的破坏中)。出于实际原因,我现在想将所有翻译保存在一个文件中。帮忙?

标签: c# razor asp.net-core internationalization asp.net-core-2.2


【解决方案1】:

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

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 文化,它们都不匹配supportedCultures(它们是sv-SEse),框架会退回到DefaultRequestCulture(即@987654336 @) 并从Lingo.se.resx 读取资源,一切都很好。但看起来 Edge(在任何其他浏览器上,但在另一台计算机上)在 Accept-Language 标头中发送了不同的文化集,其中包括 sv-SE 包含在 supportedCultures 中。因此资源阅读器搜索了Lingo.sv-se.resxLingo.sv.resx 文件,但没有成功,因此没有提供翻译。

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

【讨论】:

    猜你喜欢
    • 2019-04-18
    • 1970-01-01
    • 2016-07-16
    • 2018-03-23
    • 2016-08-09
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多