수정: 최근 ruby-i18n 업데이트로 인한 I18n 회귀 문제

DEPS: Bump i18n from 1.14.8 to 1.15.2 - Pull Request #41242%EC%97%90%EC%84%9C - discourse/discourse - GitHub ruby-i18n을 1.15.x로 업데이트했지만, 해당 버전에는 결함이 있습니다.

분석

먼저, 설정(configuration)이 이제 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에서 문제를 일으킵니다. 사용자가 기본 언어와 다른 표시 언어를 사용하는 경우입니다. 예를 들어 사이트 기본 언어가 중국어이고 표시 언어가 영어인 경우, 페이지가 의도치 않게 중국어로 표시되거나 영어와 중국어가 혼합되어 표시될 수 있습니다.

버전 업데이트를 되돌리는 커밋을 생성하고 일부 스펙을 추가했으며, 아마도 업스트림에서 해당 문제를 수정할 때까지 업데이트를 일시 중지하는 것이 좋은 아이디어일 것입니다.

4개의 좋아요

보고해줘서 감사합니다. 확인해 보겠습니다.

4개의 좋아요