Traducciones en Rails con la API i18n: errores, modelos, atributos…

Traducci贸n de un art铆culo e Risa Fujii sobre traduccion e internacionalizacion de sitios web y apps basadas en Rails: 芦The Basics of Rails I18n – Translate errors, models, and attributes禄. C贸mo traducir mensajes de error, modelos, atributos, etc. Un articulo de Risa Fujii publicado en dev.to

i18ninternacionalizacionrails
5 mayo, 2021 informaci贸n sobre c贸mo usar la API i18n Rails
5 mayo, 2021 informaci贸n sobre c贸mo usar la API i18n Rails

Dentro de las Gu铆as de Traducci贸n web de nuestro blog, en las que tratamos sobre traducci贸n e internacionalizaci贸n de webs, eCommerce y tiendas online, incluimos la traducci贸n de este art铆culo sobre c贸mo internacionalizar Ruby on Rails mediante la API i18n.

Texto original de Risa Fujii, redactado en Ingl茅s y publicado en Dev.to.

* * *

 

La API i18n (acr贸nimo de internacionalizaci贸n) es la forma est谩ndar de integrar localizaci贸n en Rails. La gu铆a oficial tiene toda la informaci贸n que necesitas, pero es muy larga. Este art铆culo se basa en las notas que tom茅 cuando aprend铆 a configurar i18n y mi objetivo es ofrecer una gu铆a m谩s accesible. Esta publicaci贸n abarca la configuraci贸n del archivo YAML para los mensajes de error y los nombres de los modelos/atributos, y la b煤squeda utilizando el m茅todo I18n.t .

Por qu茅 escrib铆 esta publicaci贸n

Mi primer contacto con i18n fue el rails-i18n que proporciona traducciones por defecto para los mensajes de error m谩s utilizados, los d铆as de la semana, etc. Aunque puedes instalarla y dar por terminado el trabajo, saber c贸mo configurar i18n por ti mismo es necesario si:

  • deseas usar traducciones diferentes a las proporcionadas por rails-i18n
  • deseas incluir idiomas no incluidos en rails-i18n
  • solo necesitas traducciones para unos pocos idiomas y no quieres realizar la instalaci贸n completa que incluye docenas de idiomas

En mi caso, fue por la tercera raz贸n: solo necesitaba traducciones a japon茅s.

脥ndice de contenidos

0. C贸mo establecer la configuraci贸n regional por defecto

Yo puse la m铆a en japon茅s.

# config/application.rb
config.i18n.default_locale = :ja

1. Traducci贸n de nombres de modelos y atributos

Documentos: https://guides.rubyonrails.org/i18n.html#translations-for-active-record-models

1.1 Definir las traducciones

En primer lugar, define las traducciones de los nombres y atributos de tu modelo en un archivo YAML como el siguiente. Este ejemplo es para un user con dos atributos.

# config/locales/ja.yml
ja:
activerecord:
    modelos:
      usuario: '銉︺兗銈' #<locale>.activerecord.models<model name>
    atributos:
      usuario:
        nombre: '鍚嶅墠' #<locale>.activerecord.attributes.<attribute name>
        contrase帽a: '銉戙偣銉兗銉'

1.2 Acceso a las traducciones de modelos y atributos

# C贸mo buscar las traducciones de los nombres de los modelos Usuario.nombre_modelo.humano
=> "銉︺兗銈"

# C贸mo buscar las traducciones de los atributos (puede utilizar s铆mbolos o cadenas)
User.human_attribute_name('nombre')
=> "鍚嶅墠"

User.human_attribute_name(:name)
=> "鍚嶅墠"

2. Traducci贸n de errores de ActiveRecord

Documentos: https://guides.rubyonrails.org/i18n.html#error-message-scopes

2.1 Desglose de mensajes de error

Traducir los mensajes de error es un poco m谩s complicado que con los modelos. Hablemos primero de la estructura de los mensajes de error. ActiveRecord tiene algunos errores de validaci贸n incorporados que se producen si el registro no es v谩lido. Considere este ejemplo:

class User < ApplicationRecord
validates :name, presence: true
end

Si su configuraci贸n regional es :en, este mensaje de error se muestre cuando se intenta crear un registro no v谩lido.

User.create!(name: '')
=> ActiveRecord::RecordInvalid: Validation failed: Name can't be blank

Este mensaje consta en realidad de varias partes.

1. ActiveRecord::RecordInvalid:

El tipo de error, que es el mismo independientemente de la configuraci贸n regional. No es necesario traducirlo.

2. Validation failed:

La descripci贸n de este RecordInvalid en ingl茅s, definida en Rails en.yml (c贸digo fuente). Se necesita traducci贸n para su(s) locale(s).

3. Name can’t be blank

Este es el mensaje de error para los registros que infringen presence: true. Consta de dos partes: el atributo Name y el mensaje no pueden estar en blanco (c贸digo fuente). Resulta que el formato del mensaje de error por defecto es una interpolaci贸n de dos elementos: 芦%{atribute} %{message}禄 (c贸digo fuente).  Se necesita traducci贸n para su(s) locale(s) .

Nota: La traducci贸n para el attribute se tomar谩 de las traducciones de atributos del modelo definidas en la secci贸n 1. Si no hay traducci贸n, Rails imprimir谩 el nombre del atributo en ingl茅s.

驴Qu茅 sucede si se cambia la configuraci贸n regional de :en a :ja sin definir las traducciones correspondientes? El mensaje de error que se muestra es translation missing.

User.create!(name: '')
# => ActiveRecord::RecordInvalid: translation missing: ja.activerecord.errors.messages.record_invalid

As铆 que vamos a ver c贸mo proporcionar traducciones a continuaci贸n.

2.2 Definir las traducciones

Seg煤n la gu铆a oficial hay algunos lugares en los que Rails buscar谩 una traducci贸n para su error, en este orden.

  • activerecord.errors.models.[model_name].attributes.[attribute_name]
  • activerecord.errors.models.[model_name]
  • activerecord.errors.messages
  • errores.atributos.[nombre_atributo]
  • mensajes.de.error

Esto significa que si quieres establecer mensajes de error espec铆ficos para un modelo o un atributo, tambi茅n puedes hacerlo. Pero en este caso, digamos que queremos que el record_invalid y blank se traduzcan de la misma manera independientemente del modelo. Aqu铆 hay un ejemplo de configuraci贸n:

# config/locales/ja.yml

ja:
  activerecord:
    errors:
      messages:
        record_invalid: '銉愩儶銉囥兗銈枫儳銉炽伀澶辨晽銇椼伨銇椼仧: %{errores}'
  errors:
    format: "%{atributo}%{mensaje}
    messages:
      # Tambi茅n deber铆as incluir traducciones para otros errores de ActiveRecord como "empty", "taken", etc.
      blank: '銈掑叆鍔涖仐銇︺亸銇犮仌銇'

Sobre rails-i18n

La configuraci贸n anterior est谩 tomada del ja.yml archivo rails-i18n que mencion茅 en la introducci贸n. La instalaci贸n es una forma r谩pida de configurar las traducciones por defecto. No viene preinstalado en tu proyecto Rails, as铆 que consulta la documentaci贸n para m谩s detalles sobre la instalaci贸n y el uso.

2.3 Acceso a sus traducciones con I18n.t

Ahora que has proporcionado traducciones para los mensajes de error, Rails mostrar谩 realmente los mensajes de error en lugar de translation missing.

La siguiente pregunta es: 驴c贸mo se pueden buscar las traducciones definidas? Por ejemplo, 驴qu茅 pasa si quieres afirmar que alg煤n mensaje est谩 siendo levantado en una prueba?

test 'user is invalid if name is blank' do
  invalid_user = User.new(name: '')
  assert invalid_user.errors.messages[:name].include?(<cannot be blank message>)
end

Aqu铆 es donde I18n.t entra en juego. La t significa 芦traducir禄, y le permite acceder a cualquier traducci贸n definida en sus archivos YAML. Para este ejemplo, queremos acceder al mensaje errors.messages.blank (consulte el apartado 2.2 para ver el archivo YAML). Hay dos maneras de hacerlo.

I18n.t('errors.messages.blank')
# => "銈掑叆鍔涖仐銇︺亸銇犮仌銇"

I18n.t('blank', scope: ['errores', 'mensajes'])
# => "銈掑叆鍔涖仐銇︺亸銇犮仌銇"

As铆 de f谩cil, 隆puedes buscar cualquier traducci贸n que hayas definido!

Nota: Puedes buscar los nombres de los modelos y de los atributos sin utilizar el m茅todo human como por ejemplo I18n.t(‘activerecord.models.user’).

test 'user is invalid if name is blank' do  
invalid_user = User.create(name: '')
expected_error = I18n.t('errors.messages.blank')
  assert invalid_user.errors.messages[:name].include?(expected_error)
end

2.4 B煤squeda de errores con interpolaci贸n de cadenas

https://guides.rubyonrails.org/i18n.html#error-message-interpolation

Si echas un vistazo a cualquiera de los archivos YAML en el directorio rails-i18n te dar谩s cuenta de que algunos mensajes utilizan la interpolaci贸n de cadenas. Por ejemplo, si su mensaje de error de validaci贸n es para greater_than,  deber谩s establecer must be greater than %{count} y rellenar el n煤mero de count. Rails lo rellenar谩 por ti cuando se produzca el error real, pero 驴c贸mo podemos rellenar en count cuando busques el mensaje de error usando I18n.t?

I18n.t('errors.messages.greater_than')
# => "銇%{count}銈堛倞澶с亶銇勫ゃ伀銇椼仸銇忋仩銇曘亜"

Puedes pasarlo como argumento:

I18n.t('errors.messages.greater_than', count: 5)
# => "銇5銈堛倞澶с亶銇勫ゃ伀銇椼仸銇忋仩銇曘亜"

路路路路路路路路路路路路路路路路路路路路路路路路路路路路路路路路

S茅 que esto no es sino un fragmento de todo lo que se puede hacer con i18n en Rails, pero espero que sea una introducci贸n 煤til. 隆Gracias por leerlo!

 

 

[Nota del Traductor]

Traducci贸n /internacionalizaci贸n de sitios web

Risa Fujii, programadora web en una peque帽a compa帽铆a tecnol贸gica de Tokio, Jap贸n, nos resume aqu铆 las principales claves sobre c贸mo internacionalizar Rails, m谩s all谩 de las traducciones por defecto facilitadas por rails-i18n.

Internacionalizar una app o una web, com煤nmente referido como i18n, es mucho m谩s que traducir sus contenidos. Internacionalizar supone adaptar los contenidos a las peculiaridades de un idioma y un pais o regi贸n particular. Obviamente que se traducen los contenidos, pero adem谩s se deben traducir o adaptar la moneda, las unidades de medida, los tallajes, los tel茅fonos, incluso algunas descripciones, o peculiaridades como el tono, o la posibilidad de tratar al cliente de t煤 o de usted. Todo esto son 芦particularidades regionales禄 incluidas en el concepto 芦internacionalizacion禄.

En Ibidem Group contamos con traductores expertos en traducci贸n de eCommerce, habituados a realizar traducciones seo-friendly, que estar谩n encantados de ayudarte a traducir y localizar tu web o tu tienda online, ya sea un WordPress (WooCommerce), Shopify, Prestahop o Magento.

Valora este art铆culo

Articulos relacionados


Texto original de Alex Pareto, publicado en Ingl茅s y traducido aqu铆 en Espa帽ol, sobre los cambios y mejoras que requiere un proyecto web al crecer y alcanzar los 100.000 usuarios.

Traducci贸n de un articulo sobre p谩ginas web, c贸digo Html y accesibilidad. C贸mo programar una web sin perder de vista la accesibilidad, c贸mo mejorar el uso de etiquetas web para ofrecer a los usuarios mayor facilidad para navegar e interactuar.

Traducci贸n al espa帽ol del art铆culo 芦Upconversion禄 originalmente publicado en ingl茅s