has_foreign_language is a Ruby on Rails plugin by factor[e] that makes it easy to internationalize your database without mucking up your views and controllers or having to write a bunch of YAML. Just create fields for each locale you want to support in addition to your default field and has_foreign_language will automatically call the appropriate one based on the current locale.


Install it into your Rails application by running

script/plugin install git://github.com/factore/has_foreign_language.git


First create your model:

script/generate model books title:string title_fr:string title_de:string author:string

Then specify which fields need to be internationalized in your model:

class Country < ActiveRecord::Base
has_foreign_language :title

Now let's create a book in the console and see how this works:

I18n.default_locale = "en"
b = Book.new(:title => "Slaughterhouse Five", :title_fr => "Abattoir Cinq", :title_de => "Schlachthof Fünf")
b.title # Slaughterhouse Five

I18n.locale = "fr"
b.title # Abattoir Cinq

I18n.locale = "de"
b.title # Schlachthof Fünf

Calling title on the model returns the appropriate column depending on which locale we're in. This also works when we change the attribute:

I18n.locale = "de"
b.title = "Etwas Anderes"
b # Book id: nil, title: "Slaughterhouse Five", title_fr: "Abattoir Cinq", title_de: "Etwas Anderes"

If you want to set or return the default language attribute while in a different locale, you can call it the way you would call any other. Assuming the default is "en", you would run:

b.title_en # Slaughterhouse Five
b.title_en = "Something Else" # Book id: nil, title: "Something Else", title_fr: "Abattoir Cinq", title_de: "Etwas Anderes"


Validations with has_foreign_language are easy. Just run the validation on the default field name and it will apply to whatever locale you're in.

class Country < ActiveRecord::Base
has_foreign_language :title
validates_presence_of :title

I18n.locale = "de"
b = Book.new(:title => "Etwas Anderes") # Book id: nil, title: nil, title_fr: nil, title_de: "Etwas Anderes"
b.valid? # true

I18n.locale = "en"
b.valid? # false

b.title = "Slaughterhouse Five"
b.valid? # true

Share this post:

Let's Talk

We want to help businesses get where they want to go by developing one awesome website at a time. A customized website that is designed to meet your business’ needs is an integral aspect in achieving your goals and reaching your maximum potential.

factor[e] design initiative
The Empire Times Building
301-41 King William St.
Hamilton, Ontario L8R 1A2
Office hours:
Monday - FrIday: 9:00 am - 5:00 pm
Phone: 905 522 7894
Fax: 905 522 0060
Email: info@factore.ca
Get Directions
Thank you for sending your contact request!



Subscribe for regular updates