CORREÇÃO: regressão de i18n causada pela atualização recente do ruby-i18n

Em DEPS: Bump i18n from 1.14.8 to 1.15.2 - Pull Request #41242 - discourse/discourse - GitHub, atualizamos o ruby-i18n para a versão 1.15.x; no entanto, essa versão apresenta um defeito.

Análise

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.

4 curtidas

Obrigado pelo relato, estou verificando.

4 curtidas