لدي منتدى متعدد اللغات، لذا قمت بتفعيل خيار “السماح للمستخدم باختيار لغته” و"تحديد اللغة من رأس طلب القبول (Accept-Language Header)"، ويعمل ذلك بشكل ممتاز. لقد سجلت مستخدمًا تجريبيًا ولاحظت أن لغة متصفح المستخدم تُحفظ في ملف المستخدم الجديد (بدلاً من “(افتراضي)”)، وهو أمر مثالي.
المشكلة الوحيدة التي أواجهها هي أنني قمت بنقل 800 مستخدم من phpBB، وجميعهم لديهم قيمة “(افتراضي)” في ملفاتهم الشخصية. أعرف أن جزءًا كبيرًا منهم يفضل استخدام لغة مختلفة، لكنني لا أريد تغيير اللغة الافتراضية الإنجليزية في الإعدادات العامة لأنني أريد أن تبقى الإنجليزية هي الافتراضية.
هل يمكنكم إخباري إذا كان من الممكن الدخول إلى Discourse عبر الأمر (./launcher enter app) ثم التكرار عبر قائمة أسماء المستخدمين أو معرفاتهم (أو أي شيء آخر) لتغيير اللغة في ملفات المستخدمين المحددة؟
كنت أفكر في إنشاء سكريبت بسيط بلغة bash كالتالي:
while IFS= read -r username; do
rails r "u = User.... $username"
done < list_of_usernames.txt
لكنني أفتقر إلى معرفة كافية بـ Discourse لتشغيل أمر لتعديل تفضيلات المستخدم… هل يمكنكم مساعدتي في ذلك؟
نعم، يمكن القيام بذلك من وحدة تحكم Rails. للوصول إلى وحدة تحكم Rails، قم بتشغيل ./launcher enter app، ثم أدخل rails c في المطالبة لبدء وحدة تحكم Rails.
أود أن أكون حذرًا بشأن التنقل عبر جميع المستخدمين حتى تتأكد تمامًا مما سيحدث. إليك كيف اختبرته لمستخدم واحد على موقعي:
أولاً، احصل على قائمة باللغات المستخدمة في Discourse:
I18n.available_locales
سيؤدي ذلك إلى طباعة قائمة طويلة من الرموز التي يستخدمها Discourse للغات. على سبيل المثال :be, :bg, :bs_BA, :ca...
يمكنك استخدام هذه الرموز لتعيين اللغة. على سبيل المثال، لتحديث لغة المستخدم إلى الفرنسية:
u = User.find(1)
u.update(locale: :fr)
إذا كنت ترغب في التنقل عبر المستخدمين، فستحتاج إلى معرفة كيفية الحصول على مصفوفات من المستخدمين لكل لغة حتى تتمكن من التنقل بينها. إذا كان لديك قوائم بأسماء المستخدمين لكل لغة، فيمكن استخدامها للعثور على المستخدمين. الطريقة البسيطة للقيام بذلك من وحدة التحكم هي تحويل قائمة بأسماء المستخدمين إلى مصفوفة. على سبيل المثال:
fr_users = ['bob', 'sally', 'john']
fr_users.each do |username|
u = User.find_by(username: username)
u.update(locale: :fr)
end
إذا جربت هذا، فاستمر بحذر. تأكد من إنشاء نسخة احتياطية من قاعدة بيانات موقعك قبل إجراء التغييرات.
شكرًا جزيلاً لك يا @simon — لقد ساعدني هذا الكود كثيرًا.
ليس لدي أي خبرة على الإطلاق مع Ruby، لكن لدي خبرة في لغات أخرى، لذا لم يستغرق مني وقتًا طويلاً لكتابة الكود التالي:
all_users = User.find_each()
all_users.each do |user|
if user.id > 70 and user.active == true and user.admin == false and user.trust_level == 1 and user.suspended_at == nil and user.moderator == false
puts "MODIFY: #{user.id}: #{user.trust_level}: \"#{user.username}\""
user.update(locale: :fr)
else
# تخطي هذا المستخدم
puts "------: #{user.id}: #{user.trust_level}: \"#{user.username}\""
end
end
لا أعرف شيئًا عن Ruby، لذا ربما توجد طريقة أكثر ذكاءً للقيام بذلك. لكن هذا يعمل بالنسبة لي . شكرًا لك.