Cómo hacer que su aplicación Rails sea multilingüe

Enfoque gema Rails, enfoque MySQL y estructura Rails multilingüe

La mayor parte del mundo no habla inglés. Ahí es donde entran en juego la internacionalización y la localización. Rails tiene una gran API i18n.
Referencia: http://guides.rubyonrails.org/i18n.html

Proporciona un marco fácil de usar y extensible para traducir su aplicación a un único idioma personalizado distinto del inglés o para proporcionar soporte multilingüe en nuestra aplicación.

API I18n:
Los métodos más importantes de la API I18n son:
translate # Buscar traducciones de texto
localize # Localizar objetos de fecha y hora a formatos locales

Estos tienen los alias #t y #l para que puedas utilizarlos así:

I18n.t 'app.title'
I18n.l Hora.ahora

Rails-i18n gem:
Instalación:
Añadir al Gemfile:

gem 'rails-i18n', github: 'svenfuchs/rails-i18n', branch: 'master' # Para 5.x

Configuración:
Por defecto rails-i18n carga todos los archivos de configuración regional, reglas de pluralización y transliteración disponibles en la gema. Este comportamiento puede cambiarse si especificamos en config/environments/* las configuraciones regionales que deben cargarse mediante la opción I18n.available_locales:

config.i18n.available_locales = ['es-CO', :de]

o

config.i18n.available_locales = :nl

También podemos utilizar otra gema:

Globalizar la gema:
Biblioteca estándar I18n de Rails para la traducción de modelos y datos de ActiveRecord. Globalize se basa en la API I18n de Ruby on Rails para añadir traducciones de modelos a los modelos de ActiveRecord.

Instalación:
Cuando se utiliza bundler poner esto en nuestro Gemfile:

gem 'globalize', '~> 5.0.0'
Para usar globalize con Rails 5 añadimos esto en nuestro Gemfile
gem 'activemodel-serializers-xml'

2. 2. Documentación: https://github.com/globalize/globalize

Diseño de BD para aplicación multilingüe (inglés y árabe):

Enfoque para admitir 2 o 3 idiomas:

1. Enfoque en columna:

Crear modelo de aproximación de columnas con columnas de idioma;
`title_en` varchar(255) NOT NULL,
`title_ar` varchar(255) NOT NULL,

Ahora bien, la forma de consultarlo también es bastante sencilla. Podemos hacerlo seleccionando automáticamente las columnas adecuadas según el idioma elegido.

Ventajas:

  • Simplicidad: fácil de aplicar
  • Consultas sencillas, sin necesidad de JOIN
  • Sin duplicados - no tiene contenido duplicado

Desventajas:

  • Difícil de mantener - funciona de manera sencilla para 2-3 idiomas, pero se vuelve realmente difícil cuando se tienen muchas columnas o muchos idiomas.
  • Difícil añadir una nueva lengua

2. Tabla de traducción Enfoque:
Disponer de una tabla de traducción relacionada para cada tabla traducible.

CREAR TABLA PRODUCTO (id int, PRECIO NÚMERO(18, 2))
CREAR TABLA PRODUCT_tr (id int, product_id INT FK, languagecode varchar, name text, description text)

De esta forma, si tenemos varias columnas traducibles, sólo necesitaríamos una única unión para obtenerlas y podría ser más fácil importar artículos junto con sus traducciones correspondientes.

  • No es necesario modificar el esquema de la base de datos para los nuevos idiomas (lo que limita los cambios de código).
  • No requiere mucho espacio para idiomas no implementados o traducciones de un artículo concreto.
    Proporciona la mayor flexibilidad
  • No acabamos con tablas dispersas
  • No tenemos que preocuparnos de claves nulas ni de comprobar que estamos mostrando una traducción existente en lugar de una entrada nula.

Aplicación multilingüe con Rails-5 (inglés y árabe):
El enfoque para las aplicaciones Rails multilingües es muy similar al de las monolingües. En este caso tenemos que definir archivos de idioma YAML para todos los idiomas necesarios e indicar a la aplicación Rails qué idioma debe utilizar en cada momento. Esto se hace mediante I18n.locale.

Configuración de I18n.locale mediante el prefijo de ruta URL
Queremos que http://0.0.0.0:3000/ar muestre la versión árabe y http://0.0.0.0:3000/en la versión inglesa.

config/rutas.rb

Myapp::Application.routes.draw do
 scope "(:locale)", :locale => /en|ar/ do
  root :to => 'página#index'
  get "página/índice"
 end
end

Establecer un antes_del_filtro en app/controllers/application_controller.rb.

clase ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_locale

  privado
  def set_locale
  I18n.locale = params[:locale] || I18n.default_locale
 end
end

Para probarlo, ve a la URL;

http://0.0.0.0:3000/ar

O

http://0.0.0.0:3000/ar/page/index

Establecer un idioma por defecto:

app/controllers/application_controller.rb:
class ControladorDeAplicacion < ControladorDeAccion::Base
  protect_from_forgery
  before_filter :set_locale

  privado
  def set_locale
  I18n.locale = params[:locale] || I18n.default_locale
  Rails.application.routes.default_url_options[:locale]= I18n.locale
 end
end

Por lo tanto, no es necesario hacer nada más. Todos los enlaces generados mediante el generador de andamios se modifican automáticamente en consecuencia.

Configuración de I18n.locale a través del encabezado HTTP Accept Language del navegador:

app/controllers/application_controller.rbclass
ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_locale
  privado
  def extract_locale_from_accept_language_header
   request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first
  end
  def set_locale
   I18n.locale = extract_locale_from_accept_language_header || I18n.default_locale
  end
 fin

Aquí podemos cambiar limpiar nuestro archivo de rutas:

config/routes.rb:
Myapp::Application.routes.draw do
 get "página/índice"
 root :to => 'página#index'
end

Almacenamiento de I18n.locale en la sesión

app/controllers/set_mylanguage_controller.rb:
class SetMylanguageController < ApplicationController
 #English
 def en
  I18n.locale = :en
  set_session_and_redirect
 end

 1TP5Árabe
 def ar
  I18n.locale = :ar
  set_session_and_redirect
 end

 privado
 def set_session_and_redirect
  session[:locale] = I18n.locale
  redirect_to :back
  rescue ActionController::RedirectBackError
  redirect_to :root
 end
end

Cambio en el controlador de la aplicación:

app/controllers/application_controller.rb:
class ControladorDeAplicacion < ControladorDeAccion::Base
 protect_from_forgery
 before_filter :set_locale

 privado
 def set_locale
  I18n.locale = sesión[:locale] || I18n.default_locale
  session[:locale] = I18n.locale
 end
end

Para poner árabe:

http://0.0.0.0:3000/set_mylanguage/ar

Para configurar el inglés:

http://0.0.0.0:3000/set_mylanguage/en

Bloques de texto en formato YAML:

Cree primero los siguientes directorios:

$ mkdir -p config/locales/models/item
$ mkdir -p config/locales/views/item

Inserte las siguientes líneas en el archivo config/application.rb:

# La configuración regional por defecto es :en y todas las traducciones de config/locales/*.rb,yml se cargan automáticamente.

config.i18n.load_path += Dir[Rails.root.join('config', 'locales', 'models', '*', '*.yml').to_s]
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', 'views', '*', '*.yml').to_s]
config.i18n.default_locale = :en

Tendremos que crear un archivo aquí; config/locales/models/item
config/locales/models/item/ar.yml para el árabe
y asegúrese de que en.yml está presente para el inglés.

Inglés YAML:
Como la mayoría de las cosas ya están presentes en el sistema para Inglés
Inserte lo siguiente en el archivo es.yml.

# ruby encoding: utf-8
es
 vistas:
  mostrar: Mostrar
  editar: Edit
  destruir: Borrar
  are_you_sure: ¿Estás seguro?
  back: Atrás: Atrás
  ítem
   índice:
     título: Lista de todos los elementos
   nuevo
     título: Nuevo elemento
   mensajes_flash:
     item_was_successfully_created: 'El artículo se ha creado correctamente.'

YAML árabe:
Tendremos que insertar valores/textos en árabe en ar.yml como en en.yml
Incluso podemos copiar una traducción por defecto ya hecha por Sven Fuchs desde su repositorio de github https://github.com/svenfuchs/rails-i18n:

$ cd config/locales
$ curl -O https://raw.github.com/svenfuchs/rails-i18n/master/rails/locale/ar.yml

Traducir a la vista:
Podemos usar human_attribute_name() para los atributos y los enlaces necesitan ser traducidos con I18n.t. Podemos usar number_to_currency() para mostrar la cantidad/precio en formato:

Ejemplos:

 

<% = t ‘views.item.index.listing_items’ %>


 

Traducción de mensajes Flash en el controlador

si @elemento.guardar
   format.html { redirect_to @item, notice:
I18n.t('views.item.flash_messages.item_was_successfully_created') }
   format.json { render json: @item, status: :created, location: @elemento }
else
   format.html { renderizar acción: "nuevo" }
   format.json { render json: @item.errors, status: :unprocessable_entity }
end

Para otras traducciones de idiomas ya hechas:
https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale

LUBAIB CEEJEY
Desarrollador Sr. Ruby on Rails

Suscríbete para recibir las últimas actualizaciones

Artículos Relacionados

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

es_ESSpanish