WIP traducciones
This commit is contained in:
parent
3fa6ca4e1e
commit
343e692bc7
14 changed files with 79 additions and 48 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -11,6 +11,6 @@ class MetadataLang < MetadataTemplate
|
||||||
end
|
end
|
||||||
|
|
||||||
def values
|
def values
|
||||||
I18n.available_locales
|
site.locales
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 }
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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
|
||||||
= submit_tag t('posts.reorder'), class: 'btn submit-reorder'
|
.d-flex.justify-content-between.align-items-center
|
||||||
-# TODO: Permitir cambiar el idioma
|
= submit_tag t('posts.reorder'), class: 'btn submit-reorder'
|
||||||
|
|
||||||
|
-#
|
||||||
|
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|
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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
|
||||||
post :'posts/reorder', to: 'posts#reorder'
|
nested do
|
||||||
resources :posts
|
scope '(:locale)' do
|
||||||
|
post :'posts/reorder', to: 'posts#reorder'
|
||||||
|
resources :posts
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Gestionar traducciones
|
# Gestionar traducciones
|
||||||
get 'i18n', to: 'i18n#index'
|
get 'i18n', to: 'i18n#index'
|
||||||
|
|
Loading…
Reference in a new issue