在我的浏览器上,我从我的本地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中,它在任何一种情况下都不起作用。
关于文化配置的夫妇词。我想你只想指定瑞典语语言环境,所以你有这些代码行
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-US
,en
和sv
文化,它们都没有匹配supportedCultures
(sv-SE
和se
)框架回落到DefaultRequestCulture
(这是se
)并从Lingo.se.resx
读取资源,一切都很好。但它看起来像Edge(在任何其他浏览器上,但在另一台计算机上)在Accept-Language
标题内发送了不同的文化集,其中包括sv-SE
中包含的supportedCultures
。所以资源读者搜索Lingo.sv-se.resx
或Lingo.sv.resx
文件,但没有运气,因此没有提供翻译。
如果我的假设是正确的将se
更改为代码中的sv
并将Lingo.se.resx
重命名为Lingo.sv.resx
将解决问题。