翻译不能仅在本地环境中远程工作
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-US
、en
和 sv
文化,其中 none 匹配 supportedCultures
(即 sv-SE
和 se
) 框架回退到 DefaultRequestCulture
(即 se
)并从 Lingo.se.resx
读取资源,一切正常。但看起来 Edge(在任何其他浏览器上,但在另一台计算机上)在 Accept-Language
header 中发送了不同的文化集,其中包括 sv-SE
包含在 supportedCultures
中。因此资源 reader 搜索了 Lingo.sv-se.resx
或 Lingo.sv.resx
文件但没有成功,因此没有提供翻译。
如果我的假设是正确的,在您的代码中将 se
更改为 sv
并将 Lingo.se.resx
重命名为 Lingo.sv.resx
将解决问题。
在我 运行 来自本地环境的浏览器上,字符串按预期进行了翻译。当我上传到 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-US
、en
和 sv
文化,其中 none 匹配 supportedCultures
(即 sv-SE
和 se
) 框架回退到 DefaultRequestCulture
(即 se
)并从 Lingo.se.resx
读取资源,一切正常。但看起来 Edge(在任何其他浏览器上,但在另一台计算机上)在 Accept-Language
header 中发送了不同的文化集,其中包括 sv-SE
包含在 supportedCultures
中。因此资源 reader 搜索了 Lingo.sv-se.resx
或 Lingo.sv.resx
文件但没有成功,因此没有提供翻译。
如果我的假设是正确的,在您的代码中将 se
更改为 sv
并将 Lingo.se.resx
重命名为 Lingo.sv.resx
将解决问题。