複数のユーザープロファイル/設定でCLI経由の一括設定変更

こんにちは、皆様。

多言語対応のフォーラムを運営しており、「ユーザーのロケールを許可」および「Accept-Language ヘッダーからロケールを設定」を有効にしました。これにより、非常にうまく動作しています。テストユーザーを登録したところ、新しいユーザーのプロファイルに、ブラウザの言語が(default) ではなく正しく保存されていることに気づきました。これは完璧です。

唯一の問題は、phpBB から 800 人のユーザーを移行したところ、全員のプロファイルに(default) と表示されていることです。多くのユーザーが異なる言語を希望していることは分かっていますが、英語をデフォルト言語として維持したいと考えているため、グローバル設定のデフォルトを英語から変更したくありません。

Discourse に入り(./launcher enter app)、ユーザー名や ID のリストをループして、指定されたユーザーのプロファイル内の言語を変更することは可能でしょうか?

以下のようなシンプルな bash スクリプトを作成しようと考えています。

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

しかし、ユーザー設定を編集するコマンドを実行する方法が分からず、Discourse の知識が不足しています。お手伝いいただけますでしょうか?

よろしくお願いいたします。

Rudy

はい、Rails コンソールから実行可能です。Rails コンソールにアクセスするには、./launcher enter appを実行し、プロンプトでrails cと入力して起動してください。

何が起こるかを確信するまで、すべてのユーザーをループするのは慎重に行ってください。以下は、当サイトでの個別のユーザーに対してテストした方法です。

まず、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: 。ありがとうございました。