元の依頼について、具体的な実装のスケッチを追記します。方向性が妥当であれば、PRの作成にも協力できます。
問題点: カテゴリのトピックテンプレート(categories.topic_template)はローカライズできません。CategoryLocalization モデルと Localizable concern は name と description しかカバーしておらず、AI コンテンツローカライゼーションのパイプラインもテンプレートを無視しています。そのため、コンポーザーはユーザーのロケールに関係なく、常にベースロケールのテンプレートが挿入されます。
ユースケース: 本番環境で Discourse AI コンテンツローカライゼーション(自動翻訳機能付き)を使用したバイリンガル(DE/EN)コミュニティを運営しています。投稿やトピックの翻訳はうまく機能していますが、構造化コンテンツ用のカテゴリテンプレート(チェックリスト付きのバグレポートフォーム、[event] BBCode を使った RSVP フローなど)は、機能的な BBCode が正確に1回だけ存在しなければならないため、言語ごとに複製できません。唯一の回避策は、読みづらいバイリンガルのラベル(例: “App-Version / App version:”)を含む単一のテンプレートを使用することですが、これはすべてのユーザーにとって読みやすさを損ないます。
提案:
category_localizationsテーブルに NULL 可能なtopic_templateテキストカラムを追加する- コンポーザー: ユーザーの現在のロケールに対応するローカライズが存在する場合、そのテンプレートを使用し、なければ
category.topic_templateにフォールバックする - カテゴリ管理 UI で、ローカライズされた名前や説明の隣に、ロケールごとにフィールドを公開/永続化する
- カテゴリを翻訳する際、AI コンテンツローカライゼーションのパイプラインに
topic_templateを含める(descriptionと同様に)
マイグレーションは自明です(add_column :category_localizations, :topic_template, :text)。主な作業はコンポーザーの選択ロジックと管理 UI です。
検討した代替案:
- バイリンガルの単一テンプレート(現在の回避策)— 機能的な BBCode ブロックがあると機能しなくなる
- ロケールごとにテキストを注入するテーマコンポーネント — 脆弱で、サーバーサイドの検証がなく、API コンポーザーが壊れる