Dans DEPS: Bump i18n from 1.14.8 to 1.15.2 - Pull Request #41242 - discourse/discourse - GitHub, nous avons mis à jour ruby-i18n vers la version 1.15.x ; cependant, cette version présente un défaut.
Analyse
Premièrement, la configuration est désormais stockée sur la Fiber :
Fiber[:i18n_config]
La nouvelle implémentation détecte lorsqu’une Fiber hérite d’une configuration appartenant à une autre Fiber :
if current.respond_to?(:owned_by?) && !current.owned_by?(Fiber.current)
current = current.dup
Fiber[:i18n_config] = current
end
Le problème réside dans I18n::Config#initialize_copy :
def initialize_copy(other)
@owner = Fiber.current
end
Il modifie le propriétaire de la configuration copiée, mais ne réinitialise pas le @locale copié. Autrement dit, la Fiber enfant hérite du @locale explicite de la Fiber parente.
Ainsi, si la Fiber parente a actuellement :
I18n.locale == :zh_CN
une Fiber enfant peut hériter d’une configuration copiée qui contient toujours :
@locale == :zh_CN
alors que cette Fiber enfant représente désormais une requête différente qui devrait être résolue en anglais.
Cela provoque un problème dans discourse. Lorsque l’utilisateur utilise une langue d’affichage différente de la langue par défaut. Par exemple, si le chinois est la langue par défaut du site et l’anglais la langue d’affichage, les pages peuvent s’afficher accidentellement en chinois, ou en un mélange d’anglais et de chinois.
Un commit a été soumis pour annuler la mise à jour de version et quelques spécifications ont été ajoutées. Il serait peut-être une bonne idée de suspendre la mise à jour jusqu’à ce que le correctif amont soit disponible.