Как я могу установить текущий язык для выполняемого сообщения в masstransit?

#.net #masstransit

#.net #masstransit

Вопрос:

Я разрабатываю API dotnet и уже реализовал все функции локализации, но при обработке сообщения из очереди 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».

Как я могу установить текущую культуру для каждого полученного сообщения?

Ответ №1:

Чтобы передать язык, вам нужно будет записать язык для идентификатора пользователя и сохранить его либо в заголовке сообщения, либо в сообщении (возможно, первом), а затем использовать это значение для выбора языка, который будет использоваться при использовании сообщения.

Нет встроенного средства, которое автоматически передаст язык от отправителя сообщения потребителю.

Комментарии:

1. В дополнение к этому я в конечном итоге реализую an DefaultCulturePipeSpecification<T> : IPipeSpecification<T> , который считывает заголовок culture info и устанавливает CultureInfo.CurrentUICulture . Спасибо