Rails 7: Pass default values to I18n's `translate` method


Rails provides fantastic internationalization options with its I18n library. However, its translate method sometimes behaves unpredictably. Fortunately, Rails 7 irons out of most of those irregularities.

Before

I18n’s #translate method behaves differently when different default values are passed to it. This inconsistency led to unexpected problems. Let’s look at some examples!

I18n’s translate method accepts a default parameter which returns this value when the translation key is not found. Below we can see it in action. There is a key called hello in our en.yml file, but the hi key is missing. This is how the default parameter handles this situation.

> ApplicationController.helpers.t('hello', default: "Hey there!")
=> "Hello world"

> ApplicationController.helpers.t('hi', default: "Hey there!")
=> "Hey there!"

Let’s now pass in a proc instead (using Rails 6.1.1),

> ApplicationController.helpers.t('hi', default: Proc.new { "Hey there!" })
=> #<Proc:0x000055d6898cc188@(irb):3>

However the same using I18n#t works as expected,

> I18n.t('hi', default: Proc.new { "Hey there!" })
=> "Hey there!"

Let’s look at another example. This time by passing a hash that needs resolutions via the :count option.

> ApplicationController.helpers.t :count, default: { one: '1 bug', other: '%{count} bugs' }, count: 2
=> "1 bug"

This is wrong since the count was passed as 2. The same works perfectly using I18n#t,

> I18n.t :count, default: { one: '1 bug', other: '%{count} bugs' }, count: 2
=> "2 bugs"

After

Thanks to this PR, a default value can be a string that needs interpolation, a hash that needs resolution via the :count option, or a Proc that needs evaluation. It just works!

> ApplicationController.helpers.t :count, default: { one: '1 bug', other: '%{count} bugs' }, count: 2
=> "2 bugs"

Now, let’s try passing in a proc,

> ApplicationController.helpers.t('hi', default: Proc.new { "Hey there!" })
=> "Hey there!"

The translate helper now passes default values that aren’t translation keys through I18n.translate for interpolation.

Join Our Newsletter