Configure Rails i18n y la localización para su aplicación. Organice archivos de traducción, cambie entre idiomas y automatice traducciones con IA.
Para mostrar 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]Esta configuración indica a Rails:
- El inglés (
:en) es el idioma predeterminado - La aplicación admite inglés, español y alemán
- Los usuarios pueden cambiar entre estos tres idiomas
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
endEsto crea URL específicas de configuración regional para su aplicación Rails. Los usuarios pueden acceder a diferentes versiones de idioma cambiando el parámetro de configuración regional en la URL.
Configurar 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
endEste código:
- Lee la configuración regional del parámetro de URL
- Recurre a la configuración regional predeterminada si no hay ningún parámetro presente
- 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 globales necesitan una forma de cambiar entre idiomas. Rails hace esto sencillo porque el método default_url_options en ApplicationController incluye automáticamente la configuración regional actual en todas las URL generadas.
Esto significa que puede crear un selector de idiomas 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, el selector se añade 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_localeen ApplicationController detecta el cambio - Rails renderiza la página en el nuevo idioma
Debido a que definió default_url_options en ApplicationController, Rails incluye automáticamente la configuración regional en todos los enlaces generados. Esto significa que la configuración regional persiste mientras los usuarios navegan por su aplicación. 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
Rails utiliza el auxiliar integrado I18n.t (o simplemente t) para buscar cadenas de sus archivos de traducción.
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>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.
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 utilizar los nombres de variables 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, necesita definir esas claves en un archivo YAML. Rails almacena estas definiciones en el directorio config/locales/.
Añadir claves a su archivo en inglés
Los archivos de traducción de Rails utilizan una estructura simple de clave-valor. 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"
En esta estructura Rails i18n:
enes el código de idioma (inglés)hello,current_timeyrefreshson claves de traducción- Las cadenas de la derecha son el texto real
%{time}es un placeholder para contenido dinámico (interpolación)
Este es su archivo fuente. Contiene todo el texto en su idioma predeterminado. Más adelante en este tutorial, utilizará PTC para generar automáticamente versiones en español, alemán y otros idiomas.
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
Sus vistas de Rails están ahora internacionalizadas, pero ¿qué pasa con JavaScript? Rails no extrae automáticamente texto de archivos JavaScript. Si su aplicación tiene texto del lado del cliente como alertas, información sobre herramientas o mensajes de confirmación, necesita añadirlos a su archivo de traducción en inglés.
Por ejemplo, para traducir una ventana emergente de confirmación, añada la cadena a config/locales/en.yml:
# 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 traducciones para todo el texto de su aplicación almacenado en el archivo YAML. En lugar de traducir manualmente cientos de cadenas, puede utilizar Private Translation Cloud (PTC).
PTC utiliza IA para traducir automáticamente sus archivos YAML de Rails preservando su estructura y claves. Puede comenzar con la prueba gratuita, que le permite traducir 20.000 palabras a dos idiomas, sin necesidad de tarjeta de crédito. Después de eso, pague solo por lo que traduzca (sin tarifas de suscripción).
Una vez que cargue y traduzca su primer archivo, puede pasar a un flujo de trabajo de localización continua:
- Integración con GitHub, GitLab o Bitbucket: conecte su repositorio. PTC encuentra sus archivos YAML, los traduce y envía una solicitud de fusión con los nuevos archivos de idioma.
- API/CLI: integre en su pipeline de CI/CD utilizando la API de PTC. Vea un repositorio Rails de ejemplo con GitHub Actions.
Para esta guía, utilizamos integración con Git para un flujo de trabajo completamente automatizado. PTC se conectó a nuestro repositorio, creó versiones traducidas como es.yml y de.yml, y abrió una solicitud de extracción con los nuevos archivos en la misma carpeta.
Una vez que fusione la solicitud de extracción, Rails carga automáticamente las traducciones. Cuando los usuarios cambian de idioma, su aplicación muestra el texto correcto.
Para ver un tutorial completo de configuración, consulte nuestra Guía de introducción.
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.
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.
