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.