Hay ciertos casos en que hace sentido guardar las traducciones de internacionalización (i18n) en la base de datos, ya sea porque los archivos yml no están hechos para textos largos >>, o porque se trata de asociarla a modelos para tener sus datos en distintos idiomas (en mi caso), etc.
Rails soporta otros backends aparte del default >>> Para base de datos hay que usar la gema i18n-active_record.
En el Gemfile:
gem 'i18n-active_record', github: 'svenfuchs/i18n-active_record', require: 'i18n/active_record'
y luego correr
$ bundle install
En este caso queremos en efecto concatenar el ActiveRecord (base de datos) con el Simple (default), para que use siempre este último, excepto en el caso de los susodichos modelos.
Para ésto hay que crear un archivo config/initializers/locale.rb con lo siguiente
I18n.backend = I18n::Backend::Chain.new(I18n::Backend::ActiveRecord.new, I18n.backend)
En seguida hay que crear el modelo Translation >>
rails g model Translations locale:string key:string value:text interpolations:text is_proc:boolean
El cual luego modificamos con is_proc default:false, para ser estrictos
def change create_table :translations do |t| t.string :locale t.string :key t.text :value t.text :interpolations t.boolean :is_proc, default: false #ojo t.timestamps end end
y migramos
rake db:migrate
Ahora se supone que cuando haga una traducción la buscará en la base de datos – y si no la encuentra allí en los archivos yml (¿no puede ser ésto terriblemente ineficiente?). Veamos.
$ rake test /home/user/.rvm/gems/ruby-2.0.0-p0/bundler/gems/rails-202041e762a9/activerecord/lib/active_record/dynamic_matchers.rb:22:in `method_missing': undefined method `set_table_name' for # (NoMethodError)
¿Qué significa ésto?
Que esta gema no es compatible con Rails 4 >>>
¿’la solución: Globalize?