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?

Este sitio utiliza cookies.    Leer más
Privacidad