CORREGIDO: regresión de i18n por la reciente actualización de ruby-i18n

En DEPS: Bump i18n from 1.14.8 to 1.15.2 - Pull Request #41242 - discourse/discourse - GitHub, actualizamos ruby-i18n a la versión 1.15.x; sin embargo, esta versión presenta un defecto.

Análisis

En primer lugar, la configuración ahora se almacena en la Fiber:

Fiber[:i18n_config]

La nueva implementación detecta cuándo una Fiber ha heredado una configuración perteneciente a otra Fiber:

if current.respond_to?(:owned_by?) && !current.owned_by?(Fiber.current)
  current = current.dup
  Fiber[:i18n_config] = current
end

El problema radica en I18n::Config#initialize_copy:

def initialize_copy(other)
  @owner = Fiber.current
end

Este método cambia el propietario de la configuración copiada, pero no limpia el atributo @locale copiado, es decir, la Fiber hija hereda el @locale explícito de la Fiber padre.

Por lo tanto, si la Fiber padre tiene actualmente:

I18n.locale == :zh_CN

una Fiber hija puede heredar una configuración copiada que aún contiene:

@locale == :zh_CN

aunque esa Fiber hija ahora represente una solicitud diferente que debería resolverse en inglés.

Esto causa un problema en Discourse. Cuando el usuario utiliza un idioma de visualización diferente al idioma predeterminado. Por ejemplo, si el chino es el idioma predeterminado del sitio y el inglés es el idioma de visualización, es posible que las páginas se muestren accidentalmente en chino, o en una combinación de inglés y chino.

Se ha creado un commit para revertir la actualización de la versión y se han añadido algunas especificaciones (specs). Tal vez sea una gran idea pausar la actualización hasta que el equipo de desarrollo (upstream) lo corrija.

4 Me gusta

Gracias por el informe, lo estoy revisando.

4 Me gusta