🌎

【Rails】ActiveSupportのordinalizeを使うとtranslation missing ja~

2022/12/14に公開

前提

RailsのActiveSupport::Inflectorには便利なメソッドが用意されていて、そのひとつにordinalizeがある。

数字.ordinalizeを実行すると、以下のような文字列を返してくれる。

irb(main):001:0> 1.ordinalize
=> "1st"
irb(main):002:0> 2.ordinalize
=> "2nd"
irb(main):003:0> 3.ordinalize
=> "3rd"

Turns a number into an ordinal string used to denote the position in an ordered sequence such as 1st, 2nd, 3rd, 4th.

ordinalize (ActiveSupport::Inflector) - APIdock

起きたこと

ordinalizeを実行すると、以下のようなエラーメッセージが返ってきた。

irb(main):001:0> 1.ordinalize
=> "translation missing: ja.number.nth.ordinalized"

調べた結果、config/application.rbconfig.i18n.default_locale = :jaを記述していると上記のエラーが発生することがわかった。

Railsのソースコードを見ると、ordinalizeI18n.translateを呼んでいる。
https://github.com/rails/rails/blob/b738f1930f3c82f51741ef7241c1fee691d7deb2/activesupport/lib/active_support/inflector/methods.rb#L357-L359

解決

そもそもst, nd, thなどは英語特有の文字なので、この場合は英語の訳文を見て欲しい。
よって、config.i18n.fallbacks = %i[ja en]config/application.rbに追記する。

config/application.rb
module ScaffoldTest
  class Application < Rails::Application
    config.load_defaults 7.0
    config.i18n.default_locale = :ja
    config.i18n.fallbacks = %i[ja en]
  end
end

https://railsguides.jp/configuring.html#config-i18n-fallbacks

これを設定することで、日本語の訳文がないときに英語のほうを見てくれる。

irb(main):001:0> 1.ordinalize
=> "1st"

今回の学び:困ったときはRailsガイド

Discussion