[英]Set culture and ui-culture in appsettings.json (asp.net core localization)?
[英]ASP.NET endpont not respecting current thread UI culture set with a disposable culture switcher
我在 netcore 3.1 上运行的 ASP.net 应用程序有一个奇怪的翻译问题,在部署后大约 20 分钟,资源字符串仅以设置为主要文化的语言出现。
该项目使用 .resx 文件来存储三种语言(general/generic/en、sv、en)的字符串,这些字符串存储在一个单独的项目中,以便它们可以被引用为例如Lang.General.EmailSubject
。 除了此端点之外,这在其他任何地方都有效,但它是唯一具有此逻辑的端点。
有两种部署,一种以主要文化为sv-SE
,另一种为en-GB
。 端点的调用者可以将“requestedCulture”指定为其他内容,可以是sv-GB
或en-SE
。
99% 的情况下,这种请求的文化与主要文化相同。 但是,有时它的指定不同,然后翻译是错误的。 虽然我可以在每次部署后复制它,但我不明白原因?
代码如下所示;
public sealed class TemporaryLanguageSwitcher : IDisposable
{
private readonly CultureInfo initialCulture;
private readonly CultureInfo initialUiCulture;
public TemporaryLanguageSwitcher(CultureInfo culture)
{
initialCulture = CultureInfo.CurrentCulture;
initialUiCulture = CultureInfo.CurrentUICulture;
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
void IDisposable.Dispose()
{
CultureInfo.CurrentCulture = initialCulture;
CultureInfo.CurrentUICulture = initialUiCulture;
}
}
public static class CultureInfoExtensions
{
public static TemporaryLanguageSwitcher AsThreadCulture(this CultureInfo culture)
{
return new TemporaryLanguageSwitcher(culture);
}
}
public class MailController : ControllerBase
{
public static IDisposable CultureSetter(CultureInfo newCulture) => newCulture.AsThreadCulture();
public static IDisposable CreateEmailRequestScope(EmailRequest request)
{
string culture = string.IsNullOrEmpty(request.requestedCulture) ? "sv-SE" : request.requestedCulture; //en-SE
return CultureSetter(CultureInfo.GetCultureInfo(culture));
}
[HttpPost]
public async Task<MailResponse> SendEmail([FromBody] EmailRequest request)
{
var requestCulture = request.requestedCulture; //en-SE
var emailSubject = Lang.General.EmailSubject; //This is always the default
using (CreateEmailRequestScope(request))
{
var emailSubject = Lang.General.EmailSubject; //This is wrong 10-20 mins after deployment - Should be Hello, But is Hej
request.emailSubject = emailSubject;
return await mailer.Send(request);
}
}
}
感谢您的任何建议!
最后,我在其他来源的帮助下找到了问题的原因。
我们正在使用 ResX 资源管理器,它在我们的静态类型化翻译中添加了一个覆盖,它覆盖了 Thread.CurrentUICulture 并始终返回相同的翻译。 在这种情况下,它是一个名为Culture
的领域
端点文化中的其他地方已设置,之后翻译停止在此端点上工作。
希望这对其他人有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.