コンテンツにスキップ

rigor-rails-i18n

t('key.path') / I18n.t(...) / I18n.translate(...)の呼び出しをconfig/locales/*.ymlに照らして検証します。検証対象は、存在しないキー(did-you-mean候補つき)、ロケールごとのカバレッジ漏れ、補間変数の不一致です。Railsランタイムへの依存はなく、ロケールファイルはPrismとYAML.safe_loadのみを通して読み込まれます。

このプラグインはrigortypeにバンドルされて提供されます。plugins:の下で有効化してください。

plugins:
- rigor-rails-i18n

ロケールカタログに照らして、静的に解決可能なすべての呼び出し箇所が検証されます。

demo.rb:14:1: info: `t('users.welcome')` resolves in en, ja
errors_demo.rb:12:1: error: missing translation key `users.welcom` in any locale (did you mean `users.welcome`?)
errors_demo.rb:16:1: error: `t('users.welcome')` expects interpolation `name`, got (none)
errors_demo.rb:20:1: warning: `t('users.welcome')` does not use interpolation `extra` (known placeholders: `name`)
errors_demo.rb:25:1: warning: `t('errors.messages.blank')` is missing from locale(s) ja
  1. キーの存在 — どのロケールにも存在しないキーはDidYouMeanの近似候補つきで指摘されます。
  2. ロケールごとのカバレッジ — 一部のconfigured_localesには存在するが他には存在しないキーはmissing-locale警告を出します(呼び出しがdefault:を渡している場合は抑制されます)。
  3. 補間変数 — リーフ文字列の%{var}プレースホルダーは、呼び出しのキーワード引数と一致しなければなりません。必須のプレースホルダーが欠けている場合はエラー、余分なものは警告です。予約されたI18nオプションキー(default: / scope: / locale: / count: / raise: / …)は除外されます。

リテラルの第1引数を伴うt(...)(暗黙のself)、I18n.t(...)I18n.translate(...)です。遅延キー(コントローラー内のt('.title'))は、ファイルパスと最も内側を囲むdefから<controller_scope>.<action>.<key>に展開され、Railsの慣習に従います。コントローラー以外のファイル内の遅延キーはスキップされます(スコープを静的に決定できないため)。リテラルでないキーを伴う呼び出し(t(some_variable))はチェックされずに通過します。

Railsとrails-i18ngem自身が提供するプレフィックス(date. / time. / datetime. / number. / errors.messages. / errors.format / support.array. / helpers.{select,submit,label}. / i18n.transliterate. / activerecord.errors.{messages,models}.)配下のキーは、フレームワークが提供するため不明キーとして指摘されません。

plugins:
- gem: rigor-rails-i18n
config:
locale_search_paths: ["config/locales"] # default
configured_locales: ["en"] # default

configured_localesはプロジェクトが提供するロケールの集合です。これを["en", "ja"]に設定すると、キーが一方では解決できるがもう一方では解決できない場合にmissing-locale警告が有効になります。

  • リテラル文字列キーのみ — 変数キーは通過します。
  • コントローラー外の遅延キーはスキップされるt('.x')が依存するコントローラー/アクションのスコープは、モデル/ヘルパー/メーラーでは導出できません。
  • 複数形は認識されるが検証されないcount:は予約オプションとして扱われます。ロケールが:zero / :one / :otherを定義しているかどうかはチェックされません。
  • ロケールごとの補間の違いは1つのプレースホルダー集合にマージされるen%{name}を使いja%{user_name}を使う場合、両方とも必須として扱われます)。
  • safe_loadのみ — YAMLのエイリアス/マージは受け入れられますが、YAML内のカスタムRubyクラスは受け入れられません。

ロケールローダー/インデックス、キャッシュされた:locale_indexプロデューサー、デモ、そしてこのプラグインが利用する契約(contract)のサーフェス(surface)については、プラグインのREADMEを参照してください。プラグインの書き方については、examples/rigor-plugin-authorスキルを参照してください。

© 2026 TypedDuck. Licensed under CC BY-SA 4.0.