繁体   English   中英

ASP.NET 端点不尊重使用一次性文化切换器设置的当前线程 UI 文化

[英]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-GBen-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM