In DEPS: Bump i18n from 1.14.8 to 1.15.2 - Pull Request #41242 - discourse/discourse - GitHub, haben wir ruby-i18n auf 1.15.x aktualisiert, jedoch weist diese Version einen Defekt auf.
Analyse
Zunächst wird die Konfiguration nun auf dem Fiber gespeichert:
Fiber[:i18n_config]
Die neue Implementierung erkennt, wenn ein Fiber eine Konfiguration geerbt hat, die einem anderen Fiber gehört:
if current.respond_to?(:owned_by?) && !current.owned_by?(Fiber.current)
current = current.dup
Fiber[:i18n_config] = current
end
Das Problem liegt in I18n::Config#initialize_copy:
def initialize_copy(other)
@owner = Fiber.current
end
Es ändert den Besitzer der kopierten Konfiguration, räumt aber das kopierte @locale nicht auf, d. h. ein Kind-Fiber erbt das explizite @locale des Eltern-Fibers.
Wenn also der Eltern-Fiber aktuell Folgendes hat:
I18n.locale == :zh_CN
kann ein Kind-Fiber eine kopierte Konfiguration erben, die immer noch Folgendes enthält:
@locale == :zh_CN
obwohl dieses Kind-Fiber nun einen anderen Request darstellt, der auf Englisch aufgelöst werden sollte.
Dies verursacht ein Problem in discourse. Wenn ein Benutzer eine Anzeigesprache verwendet, die von der Standardsprache abweicht. Sagen wir, Chinesisch als Standardsprache der Website und Englisch als Anzeigesprache, können Seiten versehentlich auf Chinesisch angezeigt werden oder eine Mischung aus Englisch und Chinesisch.
Ein Commit wurde erstellt, um die Versionsaktualisierung zurückzunehmen und einige Specs hinzuzufügen. Die Aktualisierung bis zu einer Korrektur durch den Upstream zu pausieren, wäre vielleicht eine gute Idee.