Primeiro, a configuração agora é armazenada na Fiber:
Fiber[:i18n_config]
A nova implementação detecta quando uma Fiber herdou uma configuração pertencente a outra Fiber:
if current.respond_to?(:owned_by?) && !current.owned_by?(Fiber.current)
current = current.dup
Fiber[:i18n_config] = current
end
O problema está em I18n::Config#initialize_copy:
def initialize_copy(other)
@owner = Fiber.current
end
Ele altera o proprietário da configuração copiada, mas não limpa o @locale copiado, ou seja, a Fiber filha herda o @locale explícito da Fiber pai.
Portanto, se a Fiber pai atualmente tiver:
I18n.locale == :zh_CN
uma Fiber filha pode herdar uma configuração copiada que ainda contém:
@locale == :zh_CN
mesmo que essa Fiber filha agora represente uma solicitação diferente que deveria ser resolvida em inglês.
Isso causa um problema no Discourse. Quando o usuário está usando um idioma de exibição diferente do idioma padrão. Por exemplo, se o idioma padrão do site for chinês e o idioma de exibição for inglês, as páginas podem ser exibidas acidentalmente em chinês, ou em uma combinação de inglês e chinês.
Criamos um commit para reverter a atualização de versão e adicionamos alguns testes. Talvez pausar a atualização até que o upstream corrija o problema seja uma ótima ideia.