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.