I18n (o internacionalización) es una gema incluida dentro de Rails que nos permite traducir texto y formatos de fechas y números de forma automática en base a a la localización
Como configurar la localización dentro de nuestro proyecto
- Podemos hacerlo a través del idioma por defecto del navegador
- Utilizando un selector de idioma
- y la mejor (SEO-friendly) es tener la localización en la url
La gema I18n tiene 2 métodos principales
Translate, el cual sirve para traducciones
localize que sirve para fechas, números, etc
Seteando la Localización por defecto
En el archivo application.rb vamos a setear la localización por defecto, para eso buscamos la línea que dice config.i18n.default_locale y la cambiamos por la de nuestra preferencia, si queremos que esté en español lo cambiamos por :es
config.i18n.default_locale = :es
otra opción para setear el locale por defecto es crear un archivo locale.rb dentro de config/initializers y poner
I18n.default_locale = :es
y el siguiente paso es reiniciar el servidor y ya tenemos funcionando nuestra internacionalización
Agregando traducciones Custom
dentro de config/locales/ Podemos agregar nuestras propios archivos de traducción, por ejemplo si ahora queremos agregar las traducciones al español de Devise, para no tener que escribir uno desde cero, podemos descargarlo desde:
al copiar y pegar el archivo ten mucho cuidado de que estés ocupando espacios y no tabulaciones, para los YML ocupa 2 espacios.
Por cada cambio del archivo locale hay que reiniciar el server.
Aceptando varios idiomas
agregamos al application controller la capacidad de setear el locale en base a un parámetro (que luego pasaremos por la URL), si no está, va a ocupar el por defecto.
before_action :set_locale def set_locale I18n.locale = params[:locale] || I18n.default_locale end
Un paso un poco más avanzado es la capacidad de leer los lenguajes del header, para eso agregamos justo debajo de set_locale, otro método
def extract_locale_from_accept_language_header request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first locale if ['es', 'en'].include? locale.to_s end
Este método extrae de los headers enviados por el navegador el primero de los lenguajes aceptados, y ahora vamos a mejorar el primer método, para que utilice el extract locale o el default en caso de que extract no esté dentro de los definidos.
before_action :set_locale def set_locale I18n.locale = params[:locale] || extract_locale_from_accept_language_header || I18n.default_locale end
Modificando la estructura de las rutas
Para que las rutas queden de la forma /es en lugar ?locale=”es”, debemos utilizar el método default_url_options
Cambiando el query params para que sea en la ruta
def dafault_url_options(options={}) {locale: I18n.locale} end
en el archivo de routes
lo probamos con
rake routes
Adaptando todos los métodos del routes
si tenemos un método get, debería quedar asi:
get '/:locale' to: "controller#method"
si tenemos resources, o activeadmin tenemos que envolverlo en un scope
scope "(:locale)", locale: /es|en/ do end
Traduciendo tu propios textos
Ocupando el método t, podemos utlizar nuestras propias traducciones para todas las secciones de nuestro sitio, ej:
<%= t('cualquier texto') %>
para eso, cualquier texto debe estar definido dentro de los archivos es.yml y en.yml (y todos los otros lenguajes que queramos utilizar)
Tip pro existe una plugin i18n para sublime.
Este plugin sirve para destacar dentro de tu vistas cuales textos te falta por traducir.