Sat 2010-07-10 ( En pr )

I’m sure I’m not the first one to find this, but here’s a working example for a i18n version of Integer#ordinalize.

Setup

First, you need to define <locale>.rb files in you lib/locales folder for each language. Here are examples for English, German, and French:

# lib/locales/en.rb
{
  :en => {
    :ordinal => proc { |number| number.ordinalize }
  }
}

This is using the built-in ordinalize extension, which does the English job.

# lib/locales/de.rb
{
  :de => {
    :ordinal => proc { |number| "#{number}." }
  }
}

German ordinalization is really easy.

# lib/locales/fr.rb
{
  :fr => {
    :ordinal => proc { |number| "#{number}#{number == 1 ? 'er/re' : 'e'}" }
  }
}

You’ll have to find out how to apply the correct genus all by yourself if you don’t like the self-service-slash :P

More languages can be added, but it gets really complicated for Spanish or Finnish.

Usage

After you restart your server (also in development mode!), I18n.t('ordinal') will return a Proc object. You can use it in your view like this:

<%= I18n.t('ordinal')[count] + ' ' + I18n.t("article") %>

Notice the use of [] for the object returned by the I18n.t call: It’s calling the Proc, passing the number argument, which is then ordinalized according to the current locale. You could also use .call(count), or even .(count) in Ruby 1.9, but I prefer the brackets.

Say something! / Sag was!

No markup, just plain monospace text. / Kein Markup, nur Normschrift-Klartext.