Traducciones en Rails con la API i18n: errores, modelos y 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

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 .

Disclaimer: Este es un ejercicio de traducción realizado por un estudiante de traducción en prácticas. Si lo que necesitas son servicios de traducción profesional, contacta con la empresa de traducción Ibidem Group, en su agencia de traducciones en Barcelona. Ahora también agencia de traducciones en Madrid.

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.

Rate this post

Articulos relacionados


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...

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...

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...