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.
