В DEPS: Bump i18n from 1.14.8 to 1.15.2 - Pull Request #41242 - discourse/discourse - GitHub мы
обновили ruby-i18n до версии 1.15.x, однако в этой версии есть дефект.
Анализ
Во-первых, конфигурация теперь хранится в Fiber:
Fiber[:i18n_config]
Новая реализация обнаруживает, когда Fiber унаследовал конфигурацию, принадлежащую другому Fiber:
if current.respond_to?(:owned_by?) && !current.owned_by?(Fiber.current)
current = current.dup
Fiber[:i18n_config] = current
end
Проблема заключается в I18n::Config#initialize_copy:
def initialize_copy(other)
@owner = Fiber.current
end
Она изменяет владельца скопированной конфигурации, но не очищает скопированный @locale, то есть дочерний Fiber наследует явный @locale родительского.
Таким образом, если в родительском Fiber в данный момент:
I18n.locale == :zh_CN
дочерний Fiber может унаследовать скопированную конфигурацию, которая все еще содержит:
@locale == :zh_CN
даже если этот дочерний Fiber теперь представляет другой запрос, который должен быть обработан на английском языке.
Это вызывает проблему в discourse. Когда пользователь использует язык отображения, отличный от языка по умолчанию. Например, если китайский — язык сайта по умолчанию, а английский — язык отображения, страницы могут случайно отображаться на китайском языке или в сочетании английского и китайского.
Предлагаю сделать коммит для отката обновления версии и добавить несколько спецификаций. Возможно, стоит приостановить обновление, пока upstream не исправит эту проблему.