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