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