إصلاح: تراجع في دعم i18n بسبب تحديث ruby-i18n الأخير

في DEPS: Bump i18n from 1.14.8 to 1.15.2 - Pull Request #41242%D8%8C - 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 الأب.

لذلك، إذا كان الـ Fiber الأب يحتوي حاليًا على:

I18n.locale == :zh_CN

يمكن لـ Fiber فرعي أن يرث إعدادات منسوخة لا تزال تحتوي على:

@locale == :zh_CN

على الرغم من أن هذا الـ Fiber الفرعي يمثل الآن طلبًا مختلفًا يجب أن يُحل إلى الإنجليزية.

يسبب هذا مشكلة في discourse. عندما يكون المستخدم يستخدم لغة عرض مختلفة عن اللغة الافتراضية. على سبيل المثال، إذا كانت اللغة الافتراضية للموقع هي الصينية ولغة العرض هي الإنجليزية، فقد تُعرض الصفحات عن طريق الخطأ بالصينية، أو بمزيج من الإنجليزية والصينية.

تم رفع commit لتراجع عن تحديث الإصدار وإضافة بعض المواصفات (specs)، وربما يكون إيقاف التحديث مؤقتًا حتى يتم إصلاح المشكلة من قبل المطورين الأصليين فكرة رائعة.

4 إعجابات

شكراً لك على الإبلاغ، سأقوم بالتحقق من الأمر.

4 إعجابات