decidim-term_customizer 0.16.3 → 0.16.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/commands/decidim/term_customizer/admin/import_translation_keys.rb +5 -6
- data/app/controllers/decidim/term_customizer/admin/caches_controller.rb +24 -0
- data/app/controllers/decidim/term_customizer/admin/translations_controller.rb +4 -1
- data/app/views/decidim/term_customizer/admin/translation_sets/index.html.erb +15 -5
- data/app/views/decidim/term_customizer/admin/translations/index.html.erb +1 -0
- data/config/locales/ca.yml +4 -0
- data/config/locales/en.yml +4 -0
- data/config/locales/es.yml +4 -0
- data/config/locales/fi.yml +4 -0
- data/config/locales/sv.yml +4 -0
- data/lib/decidim/term_customizer/admin_engine.rb +6 -0
- data/lib/decidim/term_customizer/engine.rb +54 -2
- data/lib/decidim/term_customizer/i18n_backend.rb +2 -17
- data/lib/decidim/term_customizer/loader.rb +86 -0
- data/lib/decidim/term_customizer/resolver.rb +2 -2
- data/lib/decidim/term_customizer/version.rb +1 -1
- data/lib/decidim/term_customizer.rb +2 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9473c65d949ac1f1c14f152bad4cd0c04ffcff5f2a9ad377dc470f2af4fc256
|
4
|
+
data.tar.gz: 64b870998a9239a6242ea2bd1ebe0ac1e00b1bcb9812d7b5bd3efa2618dbbb68
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '08f642fc149b9d8664081607afe9fb167fcc42dc7f6e2f02a8b73c0a0efd746f2c015e0023d46b5e6d4241e342bb13dbf7a2e2087508c850060a44378435933f'
|
7
|
+
data.tar.gz: c6648b9f8d3e89a7308d4b320a4bf96b6e09fa5d958a5005b343832534eae8c827d8171fa7a9f0bb669d9f6c350dcdb46bfc5b92986b39e3610ae0491d3ad944
|
@@ -38,20 +38,19 @@ module Decidim
|
|
38
38
|
attr_reader :form
|
39
39
|
|
40
40
|
def create_translations
|
41
|
-
form.keys.
|
42
|
-
form.current_organization.available_locales.
|
41
|
+
items = form.keys.map do |key|
|
42
|
+
form.current_organization.available_locales.map do |locale|
|
43
43
|
attrs = {
|
44
|
-
translation_set: form.translation_set,
|
45
44
|
key: key,
|
46
45
|
locale: locale
|
47
46
|
}
|
48
47
|
next unless TermCustomizer::Translation.find_by(attrs).nil?
|
49
48
|
|
50
|
-
|
51
|
-
attrs.merge(value: I18n.t(key, locale: locale, default: ""))
|
52
|
-
)
|
49
|
+
attrs.merge(value: I18n.t(key, locale: locale, default: ""))
|
53
50
|
end
|
54
51
|
end.flatten
|
52
|
+
|
53
|
+
form.translation_set.translations.create!(items)
|
55
54
|
end
|
56
55
|
end
|
57
56
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module TermCustomizer
|
5
|
+
module Admin
|
6
|
+
class CachesController < TermCustomizer::Admin::ApplicationController
|
7
|
+
def index
|
8
|
+
enforce_permission_to :update, :organization
|
9
|
+
|
10
|
+
redirect_to translation_sets_path
|
11
|
+
end
|
12
|
+
|
13
|
+
def clear
|
14
|
+
enforce_permission_to :update, :organization
|
15
|
+
|
16
|
+
TermCustomizer.loader.clear_cache
|
17
|
+
flash[:notice] = I18n.t("caches.clear.success", scope: "decidim.term_customizer.admin")
|
18
|
+
|
19
|
+
redirect_to translation_sets_path
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -88,7 +88,10 @@ module Decidim
|
|
88
88
|
end
|
89
89
|
|
90
90
|
def translations
|
91
|
-
@translations ||= SetTranslations.new(
|
91
|
+
@translations ||= SetTranslations.new(
|
92
|
+
translation_set,
|
93
|
+
current_locale
|
94
|
+
).query.page(params[:page]).per(30)
|
92
95
|
end
|
93
96
|
|
94
97
|
def translation
|
@@ -1,10 +1,20 @@
|
|
1
1
|
<div class="card" id="translation_sets">
|
2
2
|
<div class="card-divider">
|
3
|
-
<h2 class="card-title">
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
<h2 class="card-title flex--sbc">
|
4
|
+
<div>
|
5
|
+
<%= t "decidim.admin.titles.translation_sets" %>
|
6
|
+
</div>
|
7
|
+
|
8
|
+
<div class="flex--cc flex-gap--1">
|
9
|
+
<div id="js-other-actions-wrapper">
|
10
|
+
<% if allowed_to? :create, :translation_set %>
|
11
|
+
<%= link_to t("actions.new_translation_set", scope: "decidim.admin"), new_translation_set_path, class: "button tiny button--simple" %>
|
12
|
+
<% end %>
|
13
|
+
<% if allowed_to? :update, :organization %>
|
14
|
+
<%= link_to t("actions.clear_cache", scope: "decidim.admin"), clear_caches_path, method: :delete, class: "button tiny button--simple", data: { confirm: t("actions.confirm_destroy", scope: "decidim.admin") } %>
|
15
|
+
<% end %>
|
16
|
+
</div>
|
17
|
+
</div>
|
8
18
|
</h2>
|
9
19
|
</div>
|
10
20
|
<div class="card-section">
|
data/config/locales/ca.yml
CHANGED
@@ -15,6 +15,7 @@ ca:
|
|
15
15
|
actions:
|
16
16
|
add_multiple_translations: Afegir múltiples
|
17
17
|
back: Enrere
|
18
|
+
clear_cache: Clear cache
|
18
19
|
new_translation_set: Nou set/joc de traducció
|
19
20
|
new_translation: Nova traducció
|
20
21
|
models:
|
@@ -35,6 +36,9 @@ ca:
|
|
35
36
|
index:
|
36
37
|
add: Afegir
|
37
38
|
search: Buscar
|
39
|
+
caches:
|
40
|
+
clear:
|
41
|
+
success: Cache cleared successfully
|
38
42
|
translation_sets:
|
39
43
|
constraint_fields:
|
40
44
|
constraint: Obligatori
|
data/config/locales/en.yml
CHANGED
@@ -15,6 +15,7 @@ en:
|
|
15
15
|
actions:
|
16
16
|
add_multiple_translations: Add multiple
|
17
17
|
back: Back
|
18
|
+
clear_cache: Clear cache
|
18
19
|
new_translation_set: New translation set
|
19
20
|
new_translation: New translation
|
20
21
|
models:
|
@@ -35,6 +36,9 @@ en:
|
|
35
36
|
index:
|
36
37
|
add: Add
|
37
38
|
search: Search
|
39
|
+
caches:
|
40
|
+
clear:
|
41
|
+
success: Cache cleared successfully
|
38
42
|
translation_sets:
|
39
43
|
constraint_fields:
|
40
44
|
constraint: Constraint
|
data/config/locales/es.yml
CHANGED
@@ -15,6 +15,7 @@ es:
|
|
15
15
|
actions:
|
16
16
|
add_multiple_translations: Agregar varios
|
17
17
|
back: Volver
|
18
|
+
clear_cache: Clear cache
|
18
19
|
new_translation_set: Nuevo grupo de traducciones
|
19
20
|
new_translation: Nueva traducción
|
20
21
|
models:
|
@@ -35,6 +36,9 @@ es:
|
|
35
36
|
index:
|
36
37
|
add: Añadir
|
37
38
|
search: Buscar
|
39
|
+
caches:
|
40
|
+
clear:
|
41
|
+
success: Cache cleared successfully
|
38
42
|
translation_sets:
|
39
43
|
constraint_fields:
|
40
44
|
constraint: Ámbito
|
data/config/locales/fi.yml
CHANGED
@@ -15,6 +15,7 @@ fi:
|
|
15
15
|
actions:
|
16
16
|
add_multiple_translations: Lisää useita
|
17
17
|
back: Takaisin
|
18
|
+
clear_cache: Tyhjennä välimuisti
|
18
19
|
new_translation_set: Uusi käännöspaketti
|
19
20
|
new_translation: Uusi käännös
|
20
21
|
models:
|
@@ -35,6 +36,9 @@ fi:
|
|
35
36
|
index:
|
36
37
|
add: Lisää
|
37
38
|
search: Hae
|
39
|
+
caches:
|
40
|
+
clear:
|
41
|
+
success: Välimuistin tyhjennys onnistui
|
38
42
|
translation_sets:
|
39
43
|
constraint_fields:
|
40
44
|
constraint: Rajaussääntö
|
data/config/locales/sv.yml
CHANGED
@@ -15,6 +15,7 @@ sv:
|
|
15
15
|
actions:
|
16
16
|
add_multiple_translations: Add multiple
|
17
17
|
back: Back
|
18
|
+
clear_cache: Clear cache
|
18
19
|
new_translation_set: New translation set
|
19
20
|
new_translation: New translation
|
20
21
|
models:
|
@@ -35,6 +36,9 @@ sv:
|
|
35
36
|
index:
|
36
37
|
add: Add
|
37
38
|
search: Search
|
39
|
+
caches:
|
40
|
+
clear:
|
41
|
+
success: Cache cleared successfully
|
38
42
|
translation_sets:
|
39
43
|
constraint_fields:
|
40
44
|
constraint: Constraint
|
@@ -18,17 +18,69 @@ module Decidim
|
|
18
18
|
# environment variables within Decidim.
|
19
19
|
ActiveSupport::Notifications.subscribe "start_processing.action_controller" do |_name, _started, _finished, _unique_id, data|
|
20
20
|
env = data[:headers].env
|
21
|
+
controller = data[:headers].env["action_controller.instance"]
|
22
|
+
|
23
|
+
# E.g. at the participatory process controller the
|
24
|
+
# `decidim.current_participatory_space` environment variable has not
|
25
|
+
# been set. Therefore, we need to fetch it directly from the
|
26
|
+
# controller using its private method.
|
27
|
+
space =
|
28
|
+
if controller.respond_to?(:current_participatory_space, true)
|
29
|
+
controller.send(:current_participatory_space)
|
30
|
+
else
|
31
|
+
env["decidim.current_participatory_space"]
|
32
|
+
end
|
21
33
|
|
22
34
|
# Create a new resolver instance within the current request scope
|
23
|
-
|
35
|
+
resolver = Resolver.new(
|
24
36
|
env["decidim.current_organization"],
|
25
|
-
|
37
|
+
space,
|
26
38
|
env["decidim.current_component"]
|
27
39
|
)
|
28
40
|
|
41
|
+
# Create the loader for the backend to fetch the translations from
|
42
|
+
TermCustomizer.loader = Loader.new(resolver)
|
43
|
+
|
29
44
|
# Force the backend to reload the translations for the current request
|
30
45
|
customizer_backend.reload!
|
31
46
|
end
|
47
|
+
|
48
|
+
# The jobs are generally run in different context than the controllers
|
49
|
+
# which causes the term customizations not to be active. During the
|
50
|
+
# jobs, only the organization and global context translations are loaded
|
51
|
+
# because otherwise this would have to be job specific.
|
52
|
+
#
|
53
|
+
# Currently this has been only tested against the event notification
|
54
|
+
# jobs but it may work for other jobs as well. Because the jobs
|
55
|
+
# themselves don't carry any other context information than their
|
56
|
+
# arguments, it is difficult to resolve their correct context. Note also
|
57
|
+
# that e.g. the email notifications are always created through a single
|
58
|
+
# job that may be fired by another job (i.e. the notification job is
|
59
|
+
# always performed last).
|
60
|
+
ActiveSupport::Notifications.subscribe "perform_start.active_job" do |_name, _started, _finished, _unique_id, data|
|
61
|
+
# Figure out the organization and user through the job arguments if
|
62
|
+
# passed for the job.
|
63
|
+
organization = nil
|
64
|
+
user = nil
|
65
|
+
data[:job].arguments.each do |arg|
|
66
|
+
organization = arg if arg.is_a?(Decidim::Organization)
|
67
|
+
user = arg if arg.is_a?(Decidim::User)
|
68
|
+
end
|
69
|
+
|
70
|
+
# In case an organization was not passed for the job, check it through
|
71
|
+
# the user.
|
72
|
+
organization = user.organization if organization.nil? && user
|
73
|
+
|
74
|
+
# Create resolver for the target organization or global context in
|
75
|
+
# case organization was not found
|
76
|
+
resolver = Resolver.new(organization, nil, nil)
|
77
|
+
|
78
|
+
# Create the loader for the backend to fetch the translations from
|
79
|
+
TermCustomizer.loader = Loader.new(resolver)
|
80
|
+
|
81
|
+
# Force the backend to reload the translations for the job
|
82
|
+
customizer_backend.reload!
|
83
|
+
end
|
32
84
|
end
|
33
85
|
end
|
34
86
|
end
|
@@ -32,24 +32,9 @@ module Decidim
|
|
32
32
|
|
33
33
|
def translations
|
34
34
|
return @translations if @translations
|
35
|
-
return {} unless TermCustomizer.
|
35
|
+
return {} unless TermCustomizer.loader
|
36
36
|
|
37
|
-
@translations =
|
38
|
-
|
39
|
-
TermCustomizer.resolver.translations.each do |tr|
|
40
|
-
keyparts = [tr.locale] + tr.key.split(".")
|
41
|
-
lastkey = keyparts.pop.to_sym
|
42
|
-
|
43
|
-
current = @translations
|
44
|
-
keyparts.each do |key|
|
45
|
-
current[key.to_sym] ||= {}
|
46
|
-
current = current[key.to_sym]
|
47
|
-
end
|
48
|
-
|
49
|
-
current[lastkey] = tr.value
|
50
|
-
end
|
51
|
-
|
52
|
-
@translations
|
37
|
+
@translations = TermCustomizer.loader.translations_hash
|
53
38
|
end
|
54
39
|
|
55
40
|
protected
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module TermCustomizer
|
5
|
+
# The loader class is a middleman that converts the Translation model
|
6
|
+
# objects to a flat translation hash that can be directly used in the i18n
|
7
|
+
# backend. The main purpose of this class is to add caching possibility for
|
8
|
+
# the translation hashes.
|
9
|
+
class Loader
|
10
|
+
def initialize(resolver)
|
11
|
+
@resolver = resolver
|
12
|
+
end
|
13
|
+
|
14
|
+
# Converts the translation objects to a flat hash where the keys are
|
15
|
+
# the translatable keys used in the i18n backend containing the locales.
|
16
|
+
# The values of the hash are the translations for the keys.
|
17
|
+
#
|
18
|
+
# The final hash looks similar like this:
|
19
|
+
# {
|
20
|
+
# en: {
|
21
|
+
# decidim: {
|
22
|
+
# translation: "Term EN"
|
23
|
+
# }
|
24
|
+
# },
|
25
|
+
# fi: {
|
26
|
+
# decidim: {
|
27
|
+
# translation: "Term FI"
|
28
|
+
# }
|
29
|
+
# }
|
30
|
+
# }
|
31
|
+
#
|
32
|
+
# This will also cache the results and fetch the result directly from
|
33
|
+
# cache on consequent calls until the cache is expired.
|
34
|
+
def translations_hash
|
35
|
+
@translations_hash ||= Rails.cache.fetch(
|
36
|
+
cache_key,
|
37
|
+
expires_in: 24.hours
|
38
|
+
) do
|
39
|
+
final_hash = {}
|
40
|
+
resolver.translations.each do |tr|
|
41
|
+
keyparts = [tr.locale] + tr.key.split(".")
|
42
|
+
lastkey = keyparts.pop.to_sym
|
43
|
+
|
44
|
+
current = final_hash
|
45
|
+
keyparts.each do |key|
|
46
|
+
current[key.to_sym] ||= {}
|
47
|
+
current = current[key.to_sym]
|
48
|
+
end
|
49
|
+
|
50
|
+
current[lastkey] = tr.value
|
51
|
+
end
|
52
|
+
final_hash
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Clears the translations cache only for the current context defined by
|
57
|
+
# the resolver.
|
58
|
+
def clear_cache
|
59
|
+
Rails.cache.delete_matched("#{cache_key_base}/*")
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
attr_reader :resolver
|
65
|
+
|
66
|
+
def cache_key
|
67
|
+
parts = [cache_key_base]
|
68
|
+
parts << "space_#{resolver.space.id}" if resolver.space
|
69
|
+
parts << "component_#{resolver.component.id}" if resolver.component
|
70
|
+
|
71
|
+
parts.join("/")
|
72
|
+
end
|
73
|
+
|
74
|
+
def cache_key_base
|
75
|
+
main_key =
|
76
|
+
if resolver.organization
|
77
|
+
"organization_#{resolver.organization.id}"
|
78
|
+
else
|
79
|
+
"system"
|
80
|
+
end
|
81
|
+
|
82
|
+
"decidim_term_customizer/#{main_key}"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -3,6 +3,8 @@
|
|
3
3
|
module Decidim
|
4
4
|
module TermCustomizer
|
5
5
|
class Resolver
|
6
|
+
attr_reader :organization, :space, :component
|
7
|
+
|
6
8
|
def initialize(organization, space, component)
|
7
9
|
@organization = organization
|
8
10
|
@space = space
|
@@ -19,8 +21,6 @@ module Decidim
|
|
19
21
|
|
20
22
|
private
|
21
23
|
|
22
|
-
attr_reader :organization, :space, :component
|
23
|
-
|
24
24
|
def resolve_translations_query
|
25
25
|
query = translations_base_query
|
26
26
|
translations_add_constraints_query(query)
|
@@ -8,6 +8,7 @@ require_relative "term_customizer/admin_engine"
|
|
8
8
|
module Decidim
|
9
9
|
module TermCustomizer
|
10
10
|
autoload :I18nBackend, "decidim/term_customizer/i18n_backend"
|
11
|
+
autoload :Loader, "decidim/term_customizer/loader"
|
11
12
|
autoload :Resolver, "decidim/term_customizer/resolver"
|
12
13
|
autoload :TranslationDirectory, "decidim/term_customizer/translation_directory"
|
13
14
|
autoload :TranslationStore, "decidim/term_customizer/translation_store"
|
@@ -15,7 +16,7 @@ module Decidim
|
|
15
16
|
EMPTY_HASH = {}.freeze
|
16
17
|
|
17
18
|
class << self
|
18
|
-
attr_accessor :
|
19
|
+
attr_accessor :loader
|
19
20
|
end
|
20
21
|
end
|
21
22
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: decidim-term_customizer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.16.
|
4
|
+
version: 0.16.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Antti Hukkanen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-03-
|
11
|
+
date: 2019-03-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: decidim-admin
|
@@ -118,6 +118,7 @@ files:
|
|
118
118
|
- app/commands/decidim/term_customizer/admin/update_translation_set.rb
|
119
119
|
- app/controllers/decidim/term_customizer/admin/add_translations_controller.rb
|
120
120
|
- app/controllers/decidim/term_customizer/admin/application_controller.rb
|
121
|
+
- app/controllers/decidim/term_customizer/admin/caches_controller.rb
|
121
122
|
- app/controllers/decidim/term_customizer/admin/translation_sets_controller.rb
|
122
123
|
- app/controllers/decidim/term_customizer/admin/translations_controller.rb
|
123
124
|
- app/forms/decidim/term_customizer/admin/translation_form.rb
|
@@ -157,6 +158,7 @@ files:
|
|
157
158
|
- lib/decidim/term_customizer/admin_engine.rb
|
158
159
|
- lib/decidim/term_customizer/engine.rb
|
159
160
|
- lib/decidim/term_customizer/i18n_backend.rb
|
161
|
+
- lib/decidim/term_customizer/loader.rb
|
160
162
|
- lib/decidim/term_customizer/resolver.rb
|
161
163
|
- lib/decidim/term_customizer/test/factories.rb
|
162
164
|
- lib/decidim/term_customizer/translation_directory.rb
|