Introducción
En el desarrollo de aplicaciones modernas, es común que el software se utilice en distintos países, lenguajes y contextos culturales. La internacionalización (I18n) y localización (L10n) son las técnicas que permiten que una aplicación pueda adaptar sus textos, formatos de fecha, números, monedas y mensajes al idioma y cultura del usuario final.
En Ruby on Rails, esto se implementa con el sistema
de locales, que usa archivos de traducción
(.yml o .rb) para centralizar los textos y
otros elementos culturales.
Conceptos clave
- Internacionalización (I18n): el proceso de preparar
la aplicación para soportar múltiples lenguajes y culturas. (Ej: usar
t('buttons.save')en lugar de texto fijo). - Localización (L10n): la adaptación concreta de la aplicación a un idioma y cultura específicos (ej: español de México, inglés de EE.UU.).
- Locale: el código que representa el idioma y la
región, por ejemplo:
es→ Español (genérico)es-MX→ Español de Méxicoen→ Inglés (genérico)en-US→ Inglés de EE.UU.
Archivos de locales en Rails
Rails busca los archivos en config/locales/ de manera
predeterminada. Generalmente son archivos YAML con la
siguiente estructura:
es:
hello: "Hola mundo"
en:
hello: "Hello world"Uso en vistas:
<%= t('hello') %>
Configuración básica en Rails
En config/application.rb:
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
config.i18n.available_locales = %i[es en]
config.i18n.default_locale = :es
config.i18n.fallbacks = [:es]Explicación:
available_locales: define los idiomas que tu aplicación soporta.default_locale: el idioma por defecto si el usuario no especifica otro.fallbacks: indica a qué idioma recurrir si falta una traducción.
Uso en la aplicación
1. Vistas
<%= t('buttons.save') %>
<%= f.submit t('buttons.save') %>
2. Controladores
redirect_to users_path, notice: t('flash.actions.create.success', model: User.model_name.human)3. Validaciones y ActiveRecord
es:
activerecord:
models:
user: "Usuario"
attributes:
user:
email: "Correo electrónico"
errors:
messages:
blank: "no puede estar en blanco"Rails usará estas traducciones en formularios y validaciones.
Opciones avanzadas
Pluralización
Rails soporta pluralización automática con count:
es:
notifications:
items:
one: "Tienes 1 artículo."
other: "Tienes %{count} artículos."Uso:
<%= t('notifications.items', count: @articulos.count) %>
Formatos de fechas y números
es:
date:
formats:
default: "%d/%m/%Y"
time:
formats:
long: "%d de %B de %Y %H:%M"Uso en vistas:
<%= l(Time.current, format: :long) %>
<%= number_to_currency(1234.56) %>
Lazy lookup en vistas
Cuando usas t('.title') dentro de una vista
users/index.html.erb, Rails busca automáticamente:
views.users.index.title
Esto simplifica el mantenimiento.
Organización de locales
Se recomienda dividir los locales en múltiples archivos por dominio:
config/locales/
es/
buttons.yml
flash.yml
activerecord.yml
views/
users.yml
recibos.yml
Esto facilita la traducción, corrección ortográfica y mantenimiento.
Herramientas útiles
- i18n-tasks: gema para detectar claves faltantes, duplicadas o no utilizadas.
- i18n-js: permite exportar traducciones a JavaScript para usarlas en el frontend.
- fallbacks: útil si un idioma está incompleto y quieres mostrar textos de otro idioma como respaldo.
Buenas prácticas
Nunca uses texto fijo en vistas/controladores, siempre
t('...').Usa interpolación (
%{name}) en lugar de concatenación de cadenas.Reutiliza claves semánticas (
buttons.save) en lugar de frases completas como claves.Divide los archivos por contexto (botones, modelos, vistas).
En desarrollo, activa errores de traducción:
config.action_view.raise_on_missing_translations = true
Conclusión
El sistema de locales en Rails permite que tu aplicación sea flexible, escalable y lista para múltiples idiomas y culturas. Con una buena organización de los archivos, podrás gestionar fácilmente traducciones, correcciones ortográficas y expansión a nuevos mercados.