تغيير جماعي للإعدادات عبر سطر الأوامر في ملفات تعريف المستخدمين/تفضيلات متعددة

مرحبًا بالجميع،

لدي منتدى متعدد اللغات، لذا قمت بتفعيل خيار “السماح للمستخدم باختيار لغته” و"تحديد اللغة من رأس طلب القبول (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، لذا ربما توجد طريقة أكثر ذكاءً للقيام بذلك. لكن هذا يعمل بالنسبة لي :wink: . شكرًا لك.