修正: 最近のruby-i18n更新による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 で問題が発生します。ユーザーがデフォルト言語とは異なる表示言語を使用している場合です。例えば、サイトのデフォルト言語が中国語で、表示言語が英語の場合、ページが誤って中国語で表示されたり、英語と中国語の組み合わせで表示されたりする可能性があります。

バージョンの更新をロールバックするコミットを作成し、いくつかのスペックを追加しました。おそらく、アップストリームがそれを修正するまで、更新を保留にすることが良い考えかもしれません。

「いいね!」 4

ご報告ありがとうございます。確認してみます。

「いいね!」 4