alphagov/whitehall

Pluralisations quirk will cause fallbacks to English locale

ChrisBAshton opened this issue · 0 comments

Looking at cy.yml:

      blog_post:
        few:
        many:
        one: Postiad blog
        other: Postiadau blog
        two:
        zero:

If we spin up a Rails console locally, and try out the Rails i18n commands, I think we'll be surprised at the result:

irb(main):003:0> I18n.translate("document.type.blog_post", count: 1, locale: "cy")
=> "Postiad blog"
# So far, so good

irb(main):004:0> I18n.translate("document.type.blog_post", count: 2, locale: "cy")
=> "Blog posts"
# not good!

irb(main):005:0> I18n.translate("document.type.blog_post", count: 3, locale: "cy")
=> "Blog posts"
# still not good!

irb(main):006:0> I18n.translate("document.type.blog_post", count: 0, locale: "cy")

=> "Blog posts"
# still not good!

irb(main):007:0> I18n.translate("document.type.blog_post", count: 5, locale: "cy")
=> "Postiadau blog"
# better

Suggested action

It seems that in languages with the same pluralisation rules as English, we need to duplicate the value for other across the other keys, e.g.

      blog_post:
        few: Postiadau blog
        one: Postiad blog
        other: Postiadau blog
        two: Postiadau blog

This fixes the output:

irb(main):001:0> I18n.translate("document.type.blog_post", count: 2, locale: "cy")
=> "Postiadau blog"
irb(main):002:0> I18n.translate("document.type.blog_post", count: 3, locale: "cy")
=> "Postiadau blog"
irb(main):003:0> I18n.translate("document.type.blog_post", count: 4, locale: "cy")
=> "Postiadau blog"
irb(main):004:0> I18n.translate("document.type.blog_post", count: 10, locale: "cy")
=> "Postiadau blog"
irb(main):005:0> I18n.translate("document.type.blog_post", count: 100000, locale: "cy")
=> "Postiadau blog"

Note that I did try removing the empty keys as per the English version, but it causes runtime errors:

irb(main):001:0> I18n.translate("document.type.blog_post", count: 2, locale: "cy")
Traceback (most recent call last):
       16: from thor (1.2.1) lib/thor/invocation.rb:127:in `invoke_command'
       15: from thor (1.2.1) lib/thor/command.rb:27:in `run'
       14: from railties (6.1.5) lib/rails/commands/console/console_command.rb:102:in `perform'
       13: from railties (6.1.5) lib/rails/commands/console/console_command.rb:19:in `start'
       12: from railties (6.1.5) lib/rails/commands/console/console_command.rb:70:in `start'
       11: from (irb):1
       10: from i18n (1.10.0) lib/i18n.rb:217:in `translate'
        9: from i18n (1.10.0) lib/i18n.rb:217:in `catch'
        8: from i18n (1.10.0) lib/i18n.rb:221:in `block in translate'
        7: from i18n (1.10.0) lib/i18n/backend/fallbacks.rb:47:in `translate'
        6: from i18n (1.10.0) lib/i18n/backend/fallbacks.rb:47:in `each'
        5: from i18n (1.10.0) lib/i18n/backend/fallbacks.rb:49:in `block in translate'
        4: from i18n (1.10.0) lib/i18n/backend/fallbacks.rb:49:in `catch'
        3: from i18n (1.10.0) lib/i18n/backend/fallbacks.rb:50:in `block (2 levels) in translate'
        2: from i18n (1.10.0) lib/i18n/backend/base.rb:50:in `translate'
        1: from i18n (1.10.0) lib/i18n/backend/pluralization.rb:37:in `pluralize'
I18n::InvalidPluralizationData (translation data {:one=>"Postiad blog", :other=>"Postiadau blog"} can not be used with :count => 2. key 'two' is missing.)

I18n.translate("document.type.blog_post", count: 2, locale: "en")
=> "Blog posts"

Thoughts welcome!