ИСПРАВЛЕНИЕ: регрессия I18n из-за недавнего обновления ruby-i18n

В 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 не исправит эту проблему.

4 лайка

Спасибо за отчёт, я уже разбираюсь.

4 лайка