WIP traducciones

This commit is contained in:
f 2020-05-23 12:38:03 -03:00
parent 3fa6ca4e1e
commit 343e692bc7
14 changed files with 79 additions and 48 deletions

View file

@ -5,9 +5,8 @@ class ApplicationController < ActionController::Base
include ExceptionHandler include ExceptionHandler
protect_from_forgery with: :exception protect_from_forgery with: :exception
before_action :configure_permitted_parameters, if: :devise_controller? before_action :configure_permitted_parameters, if: :devise_controller?
before_action :set_locale around_action :set_locale
before_action do before_action do
if current_usuarie.try(:ends_with?, '@' + ENV.fetch('SUTTY', 'sutty.nl')) if current_usuarie.try(:ends_with?, '@' + ENV.fetch('SUTTY', 'sutty.nl'))
@ -36,8 +35,11 @@ class ApplicationController < ActionController::Base
site site
end end
def set_locale # El idioma es el preferido por le usuarie, pero no necesariamente se
I18n.locale = current_usuarie.lang if current_usuarie # corresponde con el idioma de los artículos, porque puede querer
# traducirlos.
def set_locale(&action)
I18n.with_locale(current_usuarie.try(:lang) || I18n.default_locale, &action)
end end
protected protected

View file

@ -5,17 +5,24 @@ class PostsController < ApplicationController
include Pundit include Pundit
before_action :authenticate_usuarie! before_action :authenticate_usuarie!
# Las URLs siempre llevan el idioma actual o el de le usuarie
def default_url_options
{ locale: params[:locale] || current_usuarie.try(:lang) || I18n.locale }
end
def index def index
authorize Post authorize Post
@site = find_site @site = find_site
@category = session[:category] = params.dig(:category) @category = params.dig(:category)
@layout = params.dig(:layout).try :to_sym @layout = params.dig(:layout).try(:to_sym)
# XXX: Cada vez que cambiamos un Post tocamos el sitio con lo que es # XXX: Cada vez que cambiamos un Post tocamos el sitio con lo que es
# más simple saber si hubo cambios. # más simple saber si hubo cambios.
if @category || @layout || stale?(@site) if @category || @layout || stale?(@site)
# TODO: Aplicar policy_scope # TODO: Aplicar policy_scope
@posts = @site.posts(lang: lang) @posts = @site.posts(lang: locale)
# Orden descendiente por número y luego por fecha
@posts.sort_by!(:order, :date).reverse! @posts.sort_by!(:order, :date).reverse!
@usuarie = @site.usuarie? current_usuarie @usuarie = @site.usuarie? current_usuarie
end end
@ -23,7 +30,7 @@ class PostsController < ApplicationController
def show def show
@site = find_site @site = find_site
@post = @site.posts(lang: lang).find params[:id] @post = @site.posts(lang: locale).find params[:id]
authorize @post authorize @post
fresh_when @post fresh_when @post
@ -32,7 +39,7 @@ class PostsController < ApplicationController
def new def new
authorize Post authorize Post
@site = find_site @site = find_site
@post = @site.posts.build(lang: lang, layout: params[:layout]) @post = @site.posts.build(lang: locale, layout: params[:layout])
end end
def create def create
@ -53,14 +60,14 @@ class PostsController < ApplicationController
def edit def edit
@site = find_site @site = find_site
@post = @site.posts(lang: lang).find params[:id] @post = @site.posts(lang: locale).find params[:id]
authorize @post authorize @post
end end
def update def update
@site = find_site @site = find_site
@post = @site.posts(lang: lang).find params[:id] @post = @site.posts(lang: locale).find params[:id]
authorize @post authorize @post
@ -81,7 +88,7 @@ class PostsController < ApplicationController
# Eliminar artículos # Eliminar artículos
def destroy def destroy
@site = find_site @site = find_site
@post = @site.posts(lang: lang).find params[:id] @post = @site.posts(lang: locale).find params[:id]
authorize @post authorize @post
@ -111,11 +118,15 @@ class PostsController < ApplicationController
end end
# Devuelve el idioma solicitado a través de un parámetro, validando # Devuelve el idioma solicitado a través de un parámetro, validando
# que el sitio soporte ese idioma # que el sitio soporte ese idioma, de lo contrario devuelve el idioma
def lang # actual.
return unless params[:lang] #
return unless @site.try(:locales).try(:include?, params[:lang]) # TODO: Debería devolver un error o mostrar una página donde se
# solicite a le usuarie crear el nuevo idioma y que esto lo agregue al
params[:lang] # _config.yml del sitio en lugar de mezclar idiomas.
def locale
@site.try(:locales).try(:find, -> { I18n.locale.to_s }) do |l|
l == params[:locale]
end
end end
end end

View file

@ -11,6 +11,6 @@ class MetadataLang < MetadataTemplate
end end
def values def values
I18n.available_locales site.locales
end end
end end

View file

@ -17,10 +17,8 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
# Valores posibles, busca todos los valores actuales en otros # Valores posibles, busca todos los valores actuales en otros
# artículos del mismo sitio # artículos del mismo sitio
#
# TODO: Implementar lang!
def values def values
site.everything_of(name) site.everything_of(name, lang: post.try(:lang).try(:value))
end end
# Valor actual o por defecto # Valor actual o por defecto

View file

@ -197,6 +197,15 @@ class Site < ApplicationRecord
@posts[lang] @posts[lang]
end end
# Todos los Post del sitio para poder buscar en todos.
#
# @return PostRelation
def docs
@docs ||= PostRelation.new(site: self).push(locales.flat_map do |locale|
posts(lang: locale)
end).flatten!
end
# Elimina un artículo de la colección # Elimina un artículo de la colección
def delete_post(post) def delete_post(post)
lang = post.lang.value lang = post.lang.value
@ -226,11 +235,14 @@ class Site < ApplicationRecord
# #
# TODO: Traer recursivamente, si el campo contiene Hash # TODO: Traer recursivamente, si el campo contiene Hash
# #
# @param attr [Symbol|String] El atributo a buscar
# @return Array # @return Array
def everything_of(attr, lang: nil) def everything_of(attr, lang: nil)
posts(lang: lang).map do |p| attr = attr.to_sym
posts(lang: lang).flat_map do |p|
p.send(attr).try(:value) if p.attribute? attr p.send(attr).try(:value) if p.attribute? attr
end.flatten.uniq.compact end.uniq.compact
end end
# Poner en la cola de compilación # Poner en la cola de compilación

View file

@ -8,8 +8,8 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do
# #
# @return Post # @return Post
def create def create
self.post = site.posts(lang: lang) self.post = site.posts(lang: locale)
.build(layout: params[:post][:layout]) .build(layout: layout)
post.usuaries << usuarie post.usuaries << usuarie
params[:post][:draft] = true if site.invitade? usuarie params[:post][:draft] = true if site.invitade? usuarie
@ -24,8 +24,8 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do
def create_anonymous def create_anonymous
# XXX: Confiamos en el parámetro de idioma porque estamos # XXX: Confiamos en el parámetro de idioma porque estamos
# verificándolos en Site#posts # verificándolos en Site#posts
self.post = site.posts(lang: lang) self.post = site.posts(lang: locale)
.build(layout: params[:post][:layout]) .build(layout: layout)
# Los artículos anónimos siempre son borradores # Los artículos anónimos siempre son borradores
params[:post][:draft] = true params[:post][:draft] = true
@ -58,7 +58,7 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do
# #
# { uuid => 2, uuid => 1, uuid => 0 } # { uuid => 2, uuid => 1, uuid => 0 }
def reorder def reorder
posts = site.posts(lang: lang) posts = site.posts(lang: locale)
reorder = params.require(:post).permit(reorder: {}).try(:[], :reorder) reorder = params.require(:post).permit(reorder: {}).try(:[], :reorder)
modified = PostRelation.new(site: site) modified = PostRelation.new(site: site)
@ -97,20 +97,13 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do
# Eliminar metadatos internos # Eliminar metadatos internos
def anon_post_params def anon_post_params
post_params.delete_if do |k, _| params.permit(post.params).delete_if do |k, _|
%w[date slug order uuid].include? k %w[date slug order uuid].include? k
end end
end end
# Devuelve el idioma solicitado a través de un parámetro, validando def locale
# que el sitio soporte ese idioma params.dig(:post, :lang) || I18n.locale
#
# TODO: DRY
def lang
return unless params[:lang]
return unless site.try(:locales).try(:include?, params[:lang])
params[:lang]
end end
def layout def layout

View file

@ -63,6 +63,8 @@ SiteService = Struct.new(:site, :usuarie, :params, keyword_init: true) do
# Crea la licencia del sitio para cada locale disponible en el sitio # Crea la licencia del sitio para cada locale disponible en el sitio
def add_licencias def add_licencias
site.locales.map(&:to_sym).each do |locale| site.locales.map(&:to_sym).each do |locale|
next unless I18n.available_locales.include? locale
Mobility.with_locale(locale) do Mobility.with_locale(locale) do
add_licencia lang: locale add_licencia lang: locale
end end

View file

@ -1,3 +1,3 @@
%tr{ id: attribute } %tr{ id: attribute }
%th= post_label_t(attribute, post: post) %th= post_label_t(attribute, post: post)
%td= t(".#{metadata.value}") %td= t(metadata.value)

View file

@ -14,5 +14,5 @@
post: post, attribute: attribute, metadata: metadata post: post, attribute: attribute, metadata: metadata
%datalist{ id: id_for_datalist(attribute) } %datalist{ id: id_for_datalist(attribute) }
- site.everything_of(attribute).each do |value| - metadata.values.each do |value|
%option{ value: value } %option{ value: value }

View file

@ -1,2 +1 @@
-# TODO: Implementar i18n = hidden_field_tag 'post[lang]', post.try(:lang).try(:value)
= hidden_field_tag 'post[lang]', I18n.locale.to_s

View file

@ -30,8 +30,16 @@
%h2= t('posts.none') %h2= t('posts.none')
- else - else
= form_tag site_posts_reorder_path, method: :post do = form_tag site_posts_reorder_path, method: :post do
.d-flex.justify-content-between.align-items-center
= submit_tag t('posts.reorder'), class: 'btn submit-reorder' = submit_tag t('posts.reorder'), class: 'btn submit-reorder'
-# TODO: Permitir cambiar el idioma
-#
TODO: Pensar una interfaz mejor para cuando haya más de tres
idiomas
.locales
- @site.locales.each do |locale|
= link_to t(locale), site_posts_path(@site, locale: locale),
class: 'mr-2 mt-2 mb-2'
%table.table.table-condensed.table-draggable %table.table.table-condensed.table-draggable
%tbody %tbody
- @posts.each_with_index do |post, i| - @posts.each_with_index do |post, i|

View file

@ -35,6 +35,7 @@ en:
no_method: '%{method} not allowed' no_method: '%{method} not allowed'
es: Castillian Spanish es: Castillian Spanish
en: English en: English
ar: Arabic
seconds: '%{seconds} seconds' seconds: '%{seconds} seconds'
contact_mailer: contact_mailer:
subject: '[%site] Contact form' subject: '[%site] Contact form'

View file

@ -37,6 +37,7 @@ es:
no_method: '%{method} no está permitido' no_method: '%{method} no está permitido'
es: Castellano es: Castellano
en: Inglés en: Inglés
ar: Árabe
seconds: '%{seconds} segundos' seconds: '%{seconds} segundos'
contact_mailer: contact_mailer:
subject: '[%{site}] Formulario de contacto' subject: '[%{site}] Formulario de contacto'

View file

@ -46,9 +46,13 @@ Rails.application.routes.draw do
get 'collaborate', to: 'collaborations#collaborate' get 'collaborate', to: 'collaborations#collaborate'
post 'collaborate', to: 'collaborations#accept_collaboration' post 'collaborate', to: 'collaborations#accept_collaboration'
# Gestionar artículos # Gestionar artículos según idioma
nested do
scope '(:locale)' do
post :'posts/reorder', to: 'posts#reorder' post :'posts/reorder', to: 'posts#reorder'
resources :posts resources :posts
end
end
# Gestionar traducciones # Gestionar traducciones
get 'i18n', to: 'i18n#index' get 'i18n', to: 'i18n#index'