Desafío Latam
Uncategorized

I18n en Rails

flags of the world with names capital

flags of the world with names capital

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

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.

Artículos relacionados

Recursos anidados en ActiveAdmin

Sebastián Jiménez
10 años ago

Configurando Git y GitHub en OSX y Linux

Alex Pacheco
9 años ago

¿Cómo enviar archivos grandes a través de internet?

Alejandro Mendoza
4 años ago
Salir de la versión móvil