Massenänderung der Konfiguration über die CLI in mehreren Benutzerprofilen/Einstellungen

Hallo zusammen,

ich habe ein mehrsprachiges Forum und habe allow user locale sowie set locale from accept language header aktiviert. Das funktioniert hervorragend. Ich habe einen Testbenutzer angelegt und festgestellt, dass die Sprache des Webbrowser des Benutzers im neuen Benutzerprofil gespeichert wird (anstatt (default)), was perfekt ist.

Das einzige Problem, das ich habe, ist, dass ich 800 Benutzer von phpBB migriert habe und alle (default) in ihrem Benutzerprofil haben. Ich weiß, dass ein großer Teil von ihnen gerne eine andere Sprache verwenden würde, aber ich möchte die Standard-Sprache Englisch in der globalen Konfiguration nicht ändern, da Englisch die Standardsprache bleiben soll.

Könntet ihr mir bitte sagen, ob es möglich wäre, Discourse (./launcher enter app) zu betreten und durch eine Liste von Benutzernamen/IDs (oder ähnlichem) zu iterieren, um die Sprache in den angegebenen Benutzerprofilen zu ändern?

Ich hatte daran gedacht, ein einfaches Bash-Skript wie folgendes zu erstellen:

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

Aber mir fehlt das Discourse-Wissen, um einen Befehl zum Bearbeiten der Benutzereinstellungen auszuführen… Könntet ihr mir bitte dabei helfen?

Vielen Dank.

Rudy

Ja, das kann über die Rails-Konsole erledigt werden. Um zur Rails-Konsole zu gelangen, führe ./launcher enter app aus und gib dann am Prompt rails c ein, um die Rails-Konsole zu starten.

Ich wäre vorsichtig damit, alle Benutzer durchzugehen, bis du sicher bist, was passieren wird. So habe ich es für einen einzelnen Benutzer auf meiner Seite getestet:

Zuerst hole dir eine Liste der von Discourse verwendeten Locales:

I18n.available_locales

Das gibt eine lange Liste von Symbolen aus, die Discourse für Locales verwendet. Zum Beispiel :be, :bg, :bs_BA, :ca...

Du kannst diese Symbole verwenden, um das Locale festzulegen. Um beispielsweise das Locale eines Benutzers auf Französisch zu aktualisieren:

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

Wenn du die Benutzer durchgehen möchtest, musst du herausfinden, wie du für jedes Locale Benutzerarrays erhältst, damit du sie durchlaufen kannst. Wenn du Listen von Benutzernamen für jedes Locale hast, können diese verwendet werden, um die Benutzer zu finden. Der einfache Weg, dies von der Konsole aus zu tun, besteht darin, eine Liste von Benutzernamen in ein Array umzuwandeln. Zum Beispiel:

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

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

Wenn du dies ausprobierst, gehe vorsichtig vor. Stelle sicher, dass du vor den Änderungen ein Backup der Datenbank deiner Seite erstellst.

Vielen Dank @simon – dieser Code hat mir sehr geholfen.

Ich habe absolut keine Erfahrung mit Ruby, aber Erfahrung mit anderen Sprachen, sodass es nicht lange gedauert hat, bis ich den folgenden Code erstellt habe:

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
        # diesen Benutzer überspringen
        puts "------: #{user.id}: #{user.trust_level}: \"#{user.username}\""
    end
end

Ich weiß nichts über Ruby, daher gibt es wahrscheinlich eine elegantere Lösung. Aber für mich funktioniert das :wink: . Vielen Dank.