Modification en masse de la configuration via CLI dans plusieurs profils/préférences utilisateur

Bonjour à tous,

J’ai un forum multilingue, j’ai donc activé « autoriser la localisation utilisateur » et « définir la localisation à partir de l’en-tête Accept-Language », et cela fonctionne parfaitement. J’ai enregistré un utilisateur de test et j’ai remarqué que la langue du navigateur web de l’utilisateur est enregistrée dans le profil du nouvel utilisateur (au lieu de « (par défaut) »), ce qui est idéal.

Le seul problème que je rencontre est que j’ai migré 800 utilisateurs depuis phpBB et ils ont tous « (par défaut) » dans leur profil. Je sais qu’une grande partie d’entre eux aimeraient utiliser une autre langue, mais je ne veux pas modifier l’anglais par défaut dans la configuration globale, car je souhaite que l’anglais reste la langue par défaut.

Pourriez-vous s’il vous plaît me dire s’il serait possible d’entrer dans Discourse (./launcher enter app) et de parcourir la liste des noms d’utilisateurs / IDs (n’importe quoi) pour modifier la langue dans les profils d’utilisateurs spécifiés ?

Je pensais créer un simple script bash comme celui-ci :

while IFS= read -r username; do
  rails r "u = User.... $username"
done < list_of_usernames.txt

Mais je manque de connaissances sur Discourse pour exécuter une commande permettant de modifier les préférences des utilisateurs… Pourriez-vous m’aider avec cela ?

Merci.

Rudy

Oui, cela peut être fait depuis la console Rails. Pour accéder à la console Rails, exécutez ./launcher enter app, puis saisissez rails c à l’invite pour lancer la console Rails.

Je serais prudent en parcourant tous les utilisateurs jusqu’à ce que vous soyez certain de ce qui va se passer. Voici comment je l’ai testé pour un utilisateur individuel sur mon site :

Tout d’abord, obtenez une liste des locales utilisées par Discourse :

I18n.available_locales

Cela affichera une longue liste de symboles que Discourse utilise pour les locales. Par exemple :be, :bg, :bs_BA, :ca...

Vous pouvez utiliser ces symboles pour définir la locale. Par exemple, pour mettre à jour la locale d’un utilisateur en français :

u = User.find(1)
u.update(locale: :fr)

Si vous souhaitez parcourir les utilisateurs, vous devrez déterminer comment obtenir des tableaux d’utilisateurs pour chaque locale afin de pouvoir les parcourir. Si vous avez des listes de noms d’utilisateurs pour chaque locale, celles-ci peuvent être utilisées pour trouver les utilisateurs. La façon simple de le faire depuis la console est de convertir une liste de noms d’utilisateurs en un tableau. Par exemple :

fr_users = ['bob', 'sally', 'john']

fr_users.each do |username|
    u = User.find_by(username: username)
    u.update(locale: :fr)
end

Si vous essayez cela, procédez avec prudence. Assurez-vous de créer une sauvegarde de la base de données de votre site avant d’apporter des modifications.

Merci beaucoup @simon — ce code m’a beaucoup aidé.

Je n’ai absolument aucune expérience avec Ruby, mais j’ai de l’expérience avec d’autres langages, donc cela ne m’a pas pris trop de temps pour écrire le code suivant :

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
        # sauter cet utilisateur
        puts "------: #{user.id}: #{user.trust_level}: \"#{user.username}\""
    end
end

Je ne connais rien à Ruby, il y a probablement une façon plus élégante de faire cela. Mais cela fonctionne pour moi :wink: . Merci.