Configure Rails i18n y la localización para su aplicación. Organice archivos de traducción, cambie entre idiomas y automatice traducciones con IA.
Esta guía cubre el flujo de trabajo completo de internacionalización de Rails: configuración de i18n, organización de archivos de traducción YAML, gestión de contenido dinámico y automatización de traducciones. También aborda la localización de software de forma más amplia, porque preparar tu aplicación Rails para la traducción es solo una parte de la entrega de un producto que funcione para usuarios en otros idiomas.
Para mostrarle cómo funciona la internacionalización de Rails en la práctica, hemos creado una pequeña aplicación de demostración en Ruby on Rails. La aplicación muestra la hora actual del servidor con un botón de actualización e incluye un selector de idiomas sencillo.
Puede aplicar estos conceptos a su aplicación Rails existente, o crear una nueva aplicación Rails con rails new YourAppName y desarrollarla junto con nosotros.
Para ver el código fuente completo, consulte GitHub: Aplicación de demostración Rails i18n
Configuración de la internacionalización (i18n) de Rails
La internacionalización de Rails requiere tres pasos de configuración: establecer las configuraciones regionales disponibles, añadir la configuración regional a sus URL y hacer que Rails cargue la configuración regional correcta para cada solicitud. También querrá instalar la gema rails-i18n, que proporciona datos de configuración regional como nombres de meses traducidos, reglas de pluralización y mensajes de error predeterminados de Rails.
Establecer las configuraciones regionales disponibles
Primero, en config/application.rb, indique a Rails qué idiomas debe admitir la aplicación y establezca una configuración regional predeterminada:
config.i18n.default_locale = :en
config.i18n.available_locales = [:en, :es, :de]Esto le indica a Rails que el inglés es el idioma predeterminado y que la aplicación admite inglés, español y alemán. Puede añadir los códigos de idioma que necesite.
Añadir configuración regional a las URL
A continuación, añada la configuración regional a la URL para que cada idioma tenga su propia ruta, como /en/time o /es/time:
# config/routes.rb
scope "/:locale" do
get '/time', to: 'home#index', as: :time_display
endConfigurar el cambio de configuración regional
Por último, en app/controllers/application_controller.rb, asegúrese de que Rails cargue la configuración regional correcta desde la URL y la incluya en todos los enlaces:
class ApplicationController < ActionController::Base
around_action :switch_locale
def switch_locale(&action)
locale = params[:locale] || I18n.default_locale
I18n.with_locale(locale, &action)
end
def default_url_options
{ locale: I18n.locale }
end
endEsto lee la configuración regional del parámetro de la URL, recurre a la configuración regional predeterminada si no hay ninguna presente y garantiza que todas las URL generadas incluyan la configuración regional actual.
Instalar la gema rails-i18n
La gema rails-i18n proporciona datos de configuración regional para múltiples idiomas, incluidos nombres de meses traducidos, reglas de pluralización y mensajes de error predeterminados de Rails. Esto le ahorra tener que traducir estas cadenas estándar usted mismo.
Añádala a su Gemfile:
gem 'rails-i18n'
Luego ejecute:
bundle install
Rails está ahora completamente configurado para la internacionalización.
Añadir un selector de idiomas
Ahora que su aplicación Rails admite múltiples configuraciones regionales, sus usuarios necesitan una forma de cambiar entre idiomas. Dado que el método default_url_options en ApplicationController incluye automáticamente la configuración regional actual en todas las URL generadas, puede crear un selector que solo actualice el parámetro de configuración regional mientras mantiene al usuario en la misma página.
Crear la interfaz del selector de idiomas
Añada el selector de idiomas a su archivo de diseño. En nuestra aplicación de demostración, va en app/views/layouts/application.html.erb:
<nav>
<%= link_to "English", url_for(locale: :en) %> |
<%= link_to "Español", url_for(locale: :es) %> |
<%= link_to "Deutsch", url_for(locale: :de) %>
</nav>Cada enlace utiliza url_for(locale: :locale_code) para generar una URL con la configuración regional especificada. Cuando un usuario hace clic en un enlace, el método switch_locale en ApplicationController detecta el cambio y Rails renderiza la página en el nuevo idioma.
Dado que default_url_options está definido, la configuración regional persiste a medida que los usuarios navegan. No necesita añadir manualmente parámetros de configuración regional a cada enlace.
Dar estilo a su selector de idiomas
Puede dar estilo al selector de idiomas en app/assets/stylesheets/application.css para que coincida con su diseño. La aplicación de demostración incluye estilos básicos para hacer que el selector sea visible y fácil de usar.
Configuración de claves de traducción en vistas de Rails
Antes de poder traducir su aplicación, todo el texto visible para el usuario debe estar en archivos i18n de Rails en lugar de estar codificado. Rails proporciona el método auxiliar t (abreviatura de translate) para buscar y mostrar cadenas traducidas.
Reemplazar texto codificado con claves de traducción
El texto codificado no aparecerá en su archivo YAML, lo que significa que no se puede traducir más adelante. Utilice siempre claves de traducción para cualquier texto visible para el usuario.
Correcto (usando claves de traducción):
<h1><%= t(:hello) %></h1>
<p><%= t(:current_time, time: @time) %></p>
<button id="click-me"><%= t(:refresh) %></button>
Incorrecto (texto codificado):
<h1>Hello</h1>
<p>Current time: <%= @time %></p>
<button>Refresh</button>Uso de interpolación en traducciones
¿Ha notado el parámetro time: @time en el ejemplo anterior? Esto se llama interpolación: le permite insertar valores dinámicos en sus traducciones. La cadena de traducción en su archivo YAML utiliza %{time} como placeholder:
current_time: "Current time: %{time}"Cuando llama al auxiliar t con time: @time, Rails reemplaza %{time} con el valor real. Puede usar los nombres de variable que desee, solo asegúrese de que coincidan entre el archivo YAML y su vista.
Búsqueda diferida para un código más limpio
Cuando sus claves de traducción están organizadas para coincidir con la estructura de carpetas de su vista, Rails le permite utilizar un atajo llamado búsqueda diferida. En lugar de escribir la ruta completa de la clave, utilice un punto inicial:
<!-- Instead of this: -->
<%= t('home.index.hello') %>
<!-- You can write this: -->
<%= t('.hello') %>
Rails examina en qué archivo de vista se encuentra (home/index.html.erb) y añade automáticamente home.index. delante de su clave. Esto mantiene su código más limpio y facilita mover vistas. Si cambia el nombre o reubica una vista, las rutas de búsqueda diferida se actualizan automáticamente.
Creación y organización de archivos de traducción
Ahora que ha añadido claves de traducción a sus vistas, debe definir esas claves en un archivo YAML. Rails las almacena en el directorio config/locales/.
Añadir claves a su archivo de idioma de origen
Abra config/locales/en.yml y añada las claves a las que hizo referencia en sus vistas:
# config/locales/en.yml
en:
hello: "Hello"
current_time: "Current time: %{time}"
refresh: "Refresh"
Este es su archivo de origen: contiene todo el texto en su idioma predeterminado. Las claves de la izquierda son a las que hacen referencia sus vistas; las cadenas de la derecha son lo que se muestra.
Organización de claves con anidamiento
Para utilizar la búsqueda diferida (el atajo .hello de la sección anterior), organice sus claves para que coincidan con la estructura de carpetas de su vista:
en:
home:
index:
hello: "Hello"
current_time: "Current time: %{time}"
refresh: "Refresh"
Esto agrupa todas las traducciones para app/views/home/index.html.erb bajo home.index. Ahora puede utilizar t('.hello') en esa vista en lugar de t('home.index.hello').
A medida que su aplicación Rails crece, también puede crear espacios de nombres para traducciones compartidas (como shared.navigation para menús) para mantener las cosas organizadas, pero esto es opcional.
Añadir cadenas de JavaScript a YAML
Rails no extrae automáticamente texto de los archivos JavaScript. Si su aplicación tiene texto del lado del cliente, como alertas, información sobre herramientas o mensajes de confirmación, añádalos a su archivo de traducción al inglés:
# config/locales/en.yml
en:
confirm: "Are you sure?"En este punto, su archivo en.yml contiene todo el texto que aparece en su aplicación, tanto en vistas de Rails como en JavaScript.
Cuando utilice PTC para traducir su aplicación (cubierto en la siguiente sección), estas cadenas de JavaScript se traducirán junto con todo lo demás.
Traducción de aplicaciones Rails con PTC
Ahora es el momento de obtener las traducciones de todo el texto de su archivo YAML. En lugar de traducir manualmente cientos de cadenas, puede utilizar Private Translation Cloud (PTC).
PTC utiliza IA para traducir sus archivos YAML, preservando su estructura, claves y placeholders. Puede empezar con la prueba gratuita, que le permite traducir 20.000 palabras a dos idiomas cualesquiera, sin necesidad de tarjeta de crédito. Después, solo paga por lo que traduce.
Si quiere saber cómo serán los costes de su proyecto antes de registrarse, la calculadora de precios le da una estimación por adelantado.
Después de registrarse, un asistente de configuración le guiará a través de unos sencillos pasos: subir su archivo YAML y establecer las rutas de salida, seleccionar sus idiomas de destino y añadir una breve descripción de su aplicación y su público. Para una guía completa, consulte nuestra Guía de inicio.
Conversión de traducciones para JavaScript
Ahora que tiene archivos YAML traducidos de PTC, necesita hacer que esas traducciones estén disponibles para JavaScript. JavaScript no puede leer archivos YAML directamente; necesita archivos JSON.
Instalación de i18n-js
La gema i18n-js convierte sus archivos de traducción YAML en formato JSON que los navegadores pueden leer.
Añada la gema a su Gemfile:
gem 'i18n-js'
Luego ejecute:
bundle install
Después de la instalación, inicialice la gema:
i18n init
Esto genera un archivo de configuración. Actualícelo para exportar traducciones a public/locales.json:
# config/i18n.rb
require "i18n-js"
I18n::JS.config do |config|
config.export_i18n_js = false
config.translations_path = "public/locales.json"
end
Exportación de traducciones a JSON
Ejecute el comando de exportación para generar el archivo JSON:
i18n export
Esto lee todos sus archivos YAML (en.yml, es.yml, de.yml) y crea public/locales.json con todas las traducciones en un formato que JavaScript puede utilizar.
Carga de traducciones en JavaScript
Rails 7+ incluye Importmap para gestionar dependencias de JavaScript sin empaquetadores.
Fije la biblioteca i18n-js en config/importmap.rb:
# config/importmap.rb
pin "i18n-js", to: "https://esm.sh/i18n-js@latest/dist/import/index.js"
pin "load_locale", to: "load_locale.js"
Cree una función de carga en app/javascript/load_locale.js:
// app/javascript/load_locale.js
export async function loadLocale() {
const response = await fetch('/locales.json');
const data = await response.json();
return data;
}
Esta función obtiene el archivo JSON que contiene todas sus traducciones.
Uso de traducciones en JavaScript
Pase la configuración regional actual a JavaScript añadiéndola a la etiqueta <body> en su diseño:
<!-- app/views/layouts/application.html.erb -->
<body data-locale="<%= I18n.locale %>">Luego importe i18n-js y utilice traducciones en su JavaScript:
// app/javascript/application.js
import { I18n } from "i18n-js"
import { loadLocale } from "./load_locale"
document.addEventListener('turbo:load', async () => {
// Load all translations
const translations = await loadLocale()
const i18n = new I18n(translations)
// Set the locale from the body tag
i18n.locale = document.body.dataset['locale']
// Use translations in your JavaScript
if (confirm(i18n.t('confirm'))) {
// User clicked OK
}
})
El método i18n.t() funciona como el auxiliar t de Rails. Cuando los usuarios cambian de idioma, JavaScript utiliza automáticamente las traducciones correctas del atributo data-locale.
Traducción de contenido de base de datos
La sección anterior le mostró cómo traducir cadenas estáticas en sus archivos YAML. Si su aplicación almacena contenido en la base de datos, como entradas de blog, descripciones de productos o cualquier cosa creada a través de un CMS, esas cadenas no aparecerán en sus archivos YAML y no podrán traducirse de la misma manera.
Para el contenido de la base de datos, puede usar la API de PTC directamente. Funciona enviando su contenido a PTC y luego recuperando las traducciones una vez que estén listas. Puede usar una URL de devolución de llamada para que PTC notifique a su aplicación cuando las traducciones estén completas, o consultar el estado desde un trabajo en segundo plano.
Consulte los pasos completos en la guía para traducir contenido dinámico en Rails.
Otras funciones de Rails i18n
Esta guía cubrió el flujo de trabajo básico de internacionalización de Rails: configurar i18n, organizar traducciones y automatizar el proceso de traducción. Rails i18n incluye funciones adicionales que podría necesitar a medida que su aplicación crece.
¿Cómo localizo fechas y horas?
Rails proporciona el auxiliar l (abreviatura de localizar) para formatear fechas y horas según las convenciones de cada configuración regional:
<%= l Time.now, format: :long %>La gema rails-i18n que instaló proporciona formatos predeterminados de fecha y hora para muchos idiomas, incluidos nombres de meses traducidos y formato específico de configuración regional. También puede definir formatos personalizados en sus archivos YAML.
¿Cómo localizo números y moneda?
Rails incluye auxiliares para formatear números y moneda según la configuración regional:
<%= number_to_currency(100, locale: :es) %> <!-- €100.00 -->
<%= number_with_delimiter(1000000) %> <!-- 1,000,000 -->
Estos auxiliares respetan las convenciones específicas de configuración regional para separadores decimales, delimitadores de miles y símbolos de moneda.
¿Puedo crear diferentes archivos de vista para cada idioma?
Sí. Para páginas con contenido significativamente diferente por configuración regional, puede crear archivos de vista separados:
app/views/pages/
about.html.erb <!-- Default -->
about.es.html.erb <!-- Spanish version -->
about.de.html.erb <!-- German version -->
Rails renderiza automáticamente la vista apropiada según la configuración regional actual.
¿Listo para traducir su aplicación Rails?
Inicie su prueba gratuita de 30 días con PTC y traduzca 20.000 palabras a dos idiomas, sin necesidad de tarjeta de crédito.
