ruby-i18n / i18n

Internationalization (i18n) library for Ruby
MIT License
988 stars 411 forks source link

Bug: Pluralization and Fallbacks modules do not play well together #124

Open yaroslav opened 13 years ago

yaroslav commented 13 years ago

Related (RU, may want to use Google Translate): https://github.com/yaroslav/russian/issues/29#issuecomment-2693629

Summary:

pluralize method of Backend::Pluralization relies on resolving pluralize rule this way:


        def pluralizer(locale)
          pluralizers[locale] ||= I18n.t(:'i18n.plural.rule', :locale => locale, :resolve => false)
        end

# ...

        pluralizer = pluralizer(locale)
        if pluralizer.respond_to?(:call)
          # ... do call that ...
        else
          super
        end

Unfortunately, if you have a locale with non-english transliteration rule as I18n default (say, :ru that may return any of [:one, :few, :many, :other]), then enable I18n fallback and use :en locale as current, Pluralization module will look up for pluralize lambda in current locale, fallback to :ru, use russian pluralization rule and fail miserably with simple :en translations (such as the ones shipped with Rails).

Now, regarding the fix.. It seems that we can't really tell if we are receiving a translation that was fallback'd, so, basically two options that come to mind (probably there is a perfect solution, but I'm not there yet):

  1. Load :en pluralization rule when enabling Pluralization module. That one is a bit stupid, because that won't fix anything on :en-US locale, and basically with every other locale that shares a pluralization rule with English.
  2. Have a key when using translations that can be taken into account by Fallbacks module (fallbacks.rb L38): this way, we can just immideately cancel searching for a translation and return the result for current locale only. I'm not sure if options[:fallback] does exactly this — seems that it is done for a different purpose of not going deep into recursive fallbacks when falling back to search at least one locale with the key. Anywho, we can document options[:fallback] or introduce options[:no_fallback](TBD naming): it's does not make much sence that options[:fallback] when set to true will skip callbacks and not vice verca.

Can implement both fixes but we probably gotta talk about this first. /cc @svenfuchs, @clemens?

yaroslav commented 13 years ago

/cc @josevalim

sashazykov commented 12 years ago

Please, fix this bug.

kirs commented 11 years ago

We still have this issue in 0.6.5. @josevalim @svenfuchs any ideas?

sponomarev commented 9 years ago

check this, please!

radar commented 8 years ago

I would accept a PR to fix this issue.

Matt-Yorkley commented 4 years ago

Did this ever get fixed..?

radar commented 4 years ago

@Matt-Yorkley The card's still open, so I am guessing not.

papa-cool commented 1 month ago

We have many open cards for the same issue. https://github.com/svenfuchs/rails-i18n/issues/893 https://github.com/ruby-i18n/i18n/issues/493

I've already proposed a fix which has been closed without any explanation. It's a pity. https://github.com/ruby-i18n/i18n/pull/502