首页 > 解决方案 > 在公共交通中,如何将当前文化设置为正在执行的消息?

问题描述

我正在开发一个 dotnet api,并且已经实现了所有本地化功能,但是在处理来自队列的消息时,没有正确设置 CurrentCulture/CurrentUiCulture,因此正在以不需要的文化检索 IStringLocalizer 资源。

我正在将masstransit 与AmazonSQS 一起使用。

在 web api 项目中,我的本地化配置是这样的:

public static IServiceCollection ConfigureLocalization(this IServiceCollection serviceCollection)
{
    return serviceCollection.Configure<RequestLocalizationOptions>(options =>
        {
            var supportedCultures = new[] { new CultureInfo("pt-BR"), };

            options.DefaultRequestCulture = new RequestCulture("pt-BR");

            options.SupportedCultures = supportedCultures;

            options.SupportedUICultures = supportedCultures;
        })
        .AddLocalization();
}

在另一个项目中,我的 Masstransit 消费者喜欢:

public class UserConsumers : IConsumer<IRunTestMessage>
{
    private readonly ILogger<UserConsumers> _logger;
    private readonly IUserHandlers _userHandlers;

    public UserConsumers(ILogger<UserConsumers> logger, IUserHandlers userHandlers)
    {
        _logger = logger;
        _userHandlers = userHandlers;
    }

    public async Task Consume(ConsumeContext<IRunTestMessage> context)
    {
        await _userHandlers.RunTestAsync(context.Message.UserId);
    }
}

收到任何消息时,CurrentCulture/CurrentUiCulture 始终为“en-US”。

如何设置收到的每条消息的 CurrentUiCulture?

标签: .netmasstransit

解决方案


要传递文化,您需要捕获 UserId 的文化并将其存储在消息头或消息(可能是第一个)中,然后使用该值选择在使用消息时要使用的文化。

没有内置工具可以自动将文化从消息发起者转移到消费者。


推荐阅读