Load i18n translations into your activerecord database

Victor VelazquezJul 26, 2012

Whenever you are working on a project using i18n Internationalization, all your translations are specified on a bunch of yml files located at db/locales/en|es. What if you wanted to load those translations into your activerecord database?

There's a gem for that: i18n-active_record

Installation

First of all you need to put into your Gemfile:

 gem 'i18n-active_record', git:'git://github.com/svenfuchs/i18n-active_record.git',
  require: 'i18n/active_record'

Then just go to your terminal bundle:

$ bundle install

Configuration

Now create an activerecord model with the name Translation using the Rails Generator or just create the class, as you prefer.

The thing that matters is that it has the following attribute structure:

class CreateTranslations < ActiveRecord::Migration
  def self.up
    create_table "translations", :force => true do |t|
      t.string   "locale"
      t.string   "key"
      t.text     "value"
      t.text     "interpolations"
      t.boolean  "is_proc",        :default => false
      t.datetime "created_at",   :null => false
      t.datetime "updated_at",  :null => false    
      t.timestamps
    end
  end

  def self.down
    drop_table :translations
  end
end

Using this model you'll be able to manage your translations, and add new ones as you need to do so.

To load I18n::Backend::ActiveRecord into your Rails application, create a new file in config/initializers named locale.rb.

A simple configuration for your locale.rb should look like this:

require 'i18n/backend/active_record'
I18n.backend = I18n::Backend::ActiveRecord.new

Or

if ActiveRecord::Base.connection.table_exists? 'translations'
  require 'i18n/backend/active_record'
  I18n.backend = I18n::Backend::Chain.
  new(I18n::Backend::ActiveRecord.new, I18n.backend)
end

If for any reason you are using the Simple Backend and you want to load/reload an internationalization yml file after the activerecord internationalization has been loaded you can call the load_translations method:

$ rails c
$ I18n.backend.load_translations

This method accepts a list of paths to different translation files.

You can use I18n.t('Your String') to lookup translations in the database. or just t('Your String') with I18n.backend_loadtranslations, as you wish.

You can also watch this gem's sourcecode from its github repo: https://github.com/svenfuchs/i18n-active_record/

Thanks for reading me!, I hope I have been of some help to you.

Follow me on twitter: @zazvick and stay in touch!.

blog comments powered byDisqus