decidim 0.31.5 → 0.32.0.rc2
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/decidim-core/lib/decidim/shakapacker/runner.rb +4 -4
- data/decidim-core/lib/decidim/shakapacker/shakapacker.yml +28 -3
- data/decidim.gemspec +21 -24
- data/docs/antora.yml +1 -1
- data/docs/modules/configure/pages/environment_variables.adoc +4 -26
- data/docs/modules/customize/pages/logic.adoc +31 -0
- data/docs/modules/develop/assets/images/maintainers-backports-checker.png +0 -0
- data/docs/modules/develop/pages/api/authentication.adoc +95 -0
- data/docs/modules/develop/pages/api/core-concepts.adoc +535 -0
- data/docs/modules/develop/pages/api/index.adoc +83 -0
- data/docs/modules/develop/pages/api/reference/components/debates/close.adoc +48 -0
- data/docs/modules/develop/pages/api/reference/components/debates/create.adoc +58 -0
- data/docs/modules/develop/pages/api/reference/components/debates/update.adoc +63 -0
- data/docs/modules/develop/pages/api/reference/components/debates.adoc +9 -0
- data/docs/modules/develop/pages/api/reference/components/meetings/close.adoc +48 -0
- data/docs/modules/develop/pages/api/reference/components/meetings/create.adoc +108 -0
- data/docs/modules/develop/pages/api/reference/components/meetings/update.adoc +95 -0
- data/docs/modules/develop/pages/api/reference/components/meetings/withdraw.adoc +36 -0
- data/docs/modules/develop/pages/api/reference/components/meetings.adoc +10 -0
- data/docs/modules/develop/pages/api/reference/components/proposals/answer.adoc +82 -0
- data/docs/modules/develop/pages/api/reference/components/proposals/create.adoc +78 -0
- data/docs/modules/develop/pages/api/reference/components/proposals/update.adoc +66 -0
- data/docs/modules/develop/pages/api/reference/components/proposals/vote.adoc +73 -0
- data/docs/modules/develop/pages/api/reference/components/proposals/withdraw.adoc +38 -0
- data/docs/modules/develop/pages/api/reference/components/proposals.adoc +14 -0
- data/docs/modules/develop/pages/api/reference/errors/attribute_validation_error.adoc +38 -0
- data/docs/modules/develop/pages/api/reference/errors/introspection_disabled_error.adoc +19 -0
- data/docs/modules/develop/pages/api/reference/errors/invalid_locale_error.adoc +30 -0
- data/docs/modules/develop/pages/api/reference/errors/locale_error.adoc +30 -0
- data/docs/modules/develop/pages/api/reference/errors/not_found.adoc +30 -0
- data/docs/modules/develop/pages/api/reference/errors/permission_not_set.adoc +46 -0
- data/docs/modules/develop/pages/api/reference/errors/recursion_limit_exceeded_error.adoc +19 -0
- data/docs/modules/develop/pages/api/reference/errors/too_many_aliases_error.adoc +23 -0
- data/docs/modules/develop/pages/api/reference/errors/unauthorized_field.adoc +30 -0
- data/docs/modules/develop/pages/api/reference/errors/unauthorized_mutation.adoc +30 -0
- data/docs/modules/develop/pages/api/reference/errors/unauthorized_object.adoc +30 -0
- data/docs/modules/develop/pages/api/reference/errors/validation_error.adoc +30 -0
- data/docs/modules/develop/pages/api/reference/errors.adoc +29 -0
- data/docs/modules/develop/pages/backports.adoc +100 -19
- data/docs/modules/develop/pages/c4_component.adoc +0 -3
- data/docs/modules/develop/pages/classes/models.adoc +0 -1
- data/docs/modules/develop/pages/components.adoc +67 -1
- data/docs/modules/develop/pages/machine_translations.adoc +1 -1
- data/docs/modules/develop/pages/maintainers/releases.adoc +34 -21
- data/docs/modules/develop/pages/maintainers/security.adoc +15 -1
- data/docs/modules/develop/partials/api/decidim_version.adoc +102 -0
- data/docs/modules/install/pages/manual.adoc +4 -3
- data/docs/modules/install/pages/update.adoc +7 -24
- data/docs/modules/install/partials/version_matrix.adoc +4 -8
- data/docs/modules/services/pages/activestorage.adoc +40 -0
- data/docs/modules/services/pages/aitools.adoc +0 -1
- data/docs/modules/services/pages/index.adoc +1 -0
- data/docs/modules/services/pages/machine_translation.adoc +139 -2
- data/docs/modules/services/pages/maps.adoc +42 -0
- data/lib/decidim/gem_manager.rb +16 -2
- data/lib/decidim/version.rb +1 -1
- data/lib/decidim.rb +0 -1
- data/package-lock.json +21945 -12726
- data/package.json +5 -4
- data/packages/browserslist-config/package.json +1 -1
- data/packages/core/package.json +28 -28
- data/packages/dev/package.json +2 -2
- data/packages/eslint-config/package.json +1 -1
- data/packages/prettier-config/package.json +1 -1
- data/packages/stylelint-config/package.json +1 -1
- data/packages/webpacker/package.json +12 -12
- data/packages/webpacker/src/override-config.js +1 -1
- metadata +73 -58
- data/docs/modules/develop/pages/api.adoc +0 -21
|
@@ -16,7 +16,15 @@ class MyTranslationService
|
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def translate
|
|
19
|
-
# Actual code
|
|
19
|
+
# Actual code for translating the text
|
|
20
|
+
translated_text = "#{target_locale} - #{text}"
|
|
21
|
+
|
|
22
|
+
Decidim::MachineTranslationSaveJob.perform_later(
|
|
23
|
+
resource,
|
|
24
|
+
field_name,
|
|
25
|
+
target_locale,
|
|
26
|
+
translated_text
|
|
27
|
+
)
|
|
20
28
|
end
|
|
21
29
|
end
|
|
22
30
|
....
|
|
@@ -34,5 +42,134 @@ Then you will need to configure it with the help of Environment Variables:
|
|
|
34
42
|
[source,bash]
|
|
35
43
|
....
|
|
36
44
|
export DECIDIM_ENABLE_MACHINE_TRANSLATION="true"
|
|
37
|
-
export DECIDIM_MACHINE_TRANSLATION_SERVICE="
|
|
45
|
+
export DECIDIM_MACHINE_TRANSLATION_SERVICE="MyTranslationService"
|
|
46
|
+
....
|
|
47
|
+
|
|
48
|
+
You also need to enable the setting "Enable machine translations" in `Settings` -> `Configuration`.
|
|
49
|
+
|
|
50
|
+
You can read more about the details of how this service work at `xref:develop:machine_translations.adoc[Using machine translations].
|
|
51
|
+
|
|
52
|
+
== Examples
|
|
53
|
+
|
|
54
|
+
=== LibreTranslate
|
|
55
|
+
|
|
56
|
+
https://github.com/LibreTranslate/LibreTranslate[LibreTranslate] is a Free and Open Source Machine Translation API. Self-hosted, offline capable and easy to setup. If you do not want to self-host it, they also offer a paid service at https://libretranslate.com/[libretranslate.com].
|
|
57
|
+
|
|
58
|
+
For using it, follow these steps:
|
|
59
|
+
|
|
60
|
+
. https://docs.libretranslate.com/guides/installation/[Install LibreTranslate] with any of the methods proposed on their documentation. For demonstration purposes, it will be installed at `http://localhost:5000`. You have a Docker Compose configuration based on the LibreTranslate documentation.
|
|
61
|
+
. Add the file `app/services/libre_translate_service.rb` to your application
|
|
62
|
+
. Add these Environment Variables:
|
|
63
|
+
[source,bash]
|
|
64
|
+
....
|
|
65
|
+
export DECIDIM_ENABLE_MACHINE_TRANSLATION="true"
|
|
66
|
+
export DECIDIM_MACHINE_TRANSLATION_SERVICE="LibreTranslateService"
|
|
67
|
+
export DECIDIM_LIBRE_TRANSLATE_SERVICE_URL="http://localhost:5000"
|
|
68
|
+
....
|
|
69
|
+
[start=4]
|
|
70
|
+
. Restart the web application and queue servers
|
|
71
|
+
. Sign in as administrator
|
|
72
|
+
. Go to the admin panel and go into in `Settings` -> `Configuration`
|
|
73
|
+
. Enable the settings "Enable machine translations" and "Translated text first"
|
|
74
|
+
. Create a new Process or Edit an existing one
|
|
75
|
+
. Go to the frontend and change the language
|
|
76
|
+
|
|
77
|
+
==== Docker compose
|
|
78
|
+
|
|
79
|
+
[source,yaml]
|
|
80
|
+
....
|
|
81
|
+
services:
|
|
82
|
+
libretranslate:
|
|
83
|
+
image: libretranslate/libretranslate
|
|
84
|
+
container_name: libretranslate
|
|
85
|
+
ports:
|
|
86
|
+
- "${LT_PORT:-5000}:5000"
|
|
87
|
+
volumes:
|
|
88
|
+
- lt-local:/home/libretranslate/.local
|
|
89
|
+
# Uncomment the line below if using --api-keys
|
|
90
|
+
# - lt-db:/app/db
|
|
91
|
+
stdin_open: true
|
|
92
|
+
tty: true
|
|
93
|
+
restart: unless-stopped
|
|
94
|
+
# Add any additional command arguments here
|
|
95
|
+
# command: ["--api-keys"]
|
|
96
|
+
|
|
97
|
+
volumes:
|
|
98
|
+
lt-local:
|
|
99
|
+
name: lt-local
|
|
100
|
+
....
|
|
101
|
+
|
|
102
|
+
==== `app/services/libre_translate_service.rb`
|
|
103
|
+
|
|
104
|
+
[source,ruby]
|
|
105
|
+
....
|
|
106
|
+
# frozen_string_literal: true
|
|
107
|
+
|
|
108
|
+
require "faraday"
|
|
109
|
+
require "json"
|
|
110
|
+
|
|
111
|
+
# This translator uses LibreTranslate API to translate text
|
|
112
|
+
# from one locale to another.
|
|
113
|
+
class LibreTranslateService
|
|
114
|
+
attr_reader :text, :source_locale, :target_locale, :resource, :field_name
|
|
115
|
+
|
|
116
|
+
def initialize(resource, field_name, text, target_locale, source_locale)
|
|
117
|
+
@resource = resource
|
|
118
|
+
@field_name = field_name
|
|
119
|
+
@text = text
|
|
120
|
+
@target_locale = target_locale
|
|
121
|
+
@source_locale = source_locale
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def translate
|
|
125
|
+
translated_text = fetch_translation || text
|
|
126
|
+
|
|
127
|
+
Decidim::MachineTranslationSaveJob.perform_later(
|
|
128
|
+
resource,
|
|
129
|
+
field_name,
|
|
130
|
+
target_locale,
|
|
131
|
+
translated_text
|
|
132
|
+
)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
private
|
|
136
|
+
|
|
137
|
+
def fetch_translation
|
|
138
|
+
response = Faraday.post("#{host}/translate") do |req|
|
|
139
|
+
req.headers["Content-Type"] = "application/json"
|
|
140
|
+
req.body = translation_payload.to_json
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
parse_response(response)
|
|
144
|
+
rescue => e
|
|
145
|
+
log_error(e)
|
|
146
|
+
nil
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def translation_payload
|
|
150
|
+
{
|
|
151
|
+
q: text,
|
|
152
|
+
source: source_locale,
|
|
153
|
+
target: target_locale,
|
|
154
|
+
api_key: api_key
|
|
155
|
+
}.compact
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def parse_response(response)
|
|
159
|
+
result = JSON.parse(response.body)
|
|
160
|
+
result["translatedText"]
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def host
|
|
164
|
+
Decidim::Env.new("DECIDIM_LIBRE_TRANSLATE_SERVICE_URL", "https://libretranslate.com").value
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def api_key
|
|
168
|
+
Decidim::Env.new("DECIDIM_LIBRE_TRANSLATE_API_KEY").value
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def log_error(error)
|
|
172
|
+
Rails.logger.error("LibreTranslate translation error: #{error.message}")
|
|
173
|
+
end
|
|
174
|
+
end
|
|
38
175
|
....
|
|
@@ -83,6 +83,48 @@ MAPS_API_KEY=your_api_key_here
|
|
|
83
83
|
|
|
84
84
|
For further information, see the service provider's documentation or take a look at the <<hosting-your-own-map-services,Hosting your own map services>> section.
|
|
85
85
|
|
|
86
|
+
==== Tile layer configuration options
|
|
87
|
+
|
|
88
|
+
Some tile servers use the https://en.wikipedia.org/wiki/Tile_Map_Service[TMS (Tile Map Service)] specification instead of the standard XYZ tile scheme.
|
|
89
|
+
If your tile server requires TMS, you can enable it by setting the `tms` option to `true`:
|
|
90
|
+
|
|
91
|
+
[source,ruby]
|
|
92
|
+
----
|
|
93
|
+
config.maps = {
|
|
94
|
+
provider: :osm,
|
|
95
|
+
api_key: ENV["MAPS_API_KEY"],
|
|
96
|
+
dynamic: {
|
|
97
|
+
tile_layer: {
|
|
98
|
+
url: "https://tiles.example.org/{z}/{x}/{y}.png",
|
|
99
|
+
tms: true,
|
|
100
|
+
attribution: %(
|
|
101
|
+
<a href="https://www.openstreetmap.org/copyright" target="_blank">© OpenStreetMap</a> contributors
|
|
102
|
+
).strip
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
----
|
|
107
|
+
|
|
108
|
+
Alternatively, you can use the `MAPS_EXTRA_VARS` xref:configure:environment_variables.adoc[Environment Variable] to set the `tms` option:
|
|
109
|
+
|
|
110
|
+
[source,bash]
|
|
111
|
+
----
|
|
112
|
+
MAPS_EXTRA_VARS="tms=true"
|
|
113
|
+
----
|
|
114
|
+
|
|
115
|
+
All configuration options supported by https://leafletjs.com/reference.html#tilelayer[Leaflet's TileLayer] can be passed to the `tile_layer` configuration, including:
|
|
116
|
+
|
|
117
|
+
* `minZoom` - Minimum zoom level
|
|
118
|
+
* `maxZoom` - Maximum zoom level
|
|
119
|
+
* `subdomains` - Subdomains for the tile server (e.g., `"abc"` or `["a", "b", "c"]`)
|
|
120
|
+
* `errorTileUrl` - URL for error tiles
|
|
121
|
+
* `zoomOffset` - Zoom offset
|
|
122
|
+
* `tms` - Set to `true` if your tile server uses TMS specification
|
|
123
|
+
* `zoomReverse` - Set to `true` to reverse zoom levels
|
|
124
|
+
* `detectRetina` - Set to `true` to request retina tiles
|
|
125
|
+
* `crossOrigin` - CrossOrigin attribute for tiles (e.g., `"anonymous"`)
|
|
126
|
+
* `referrerPolicy` - Referrer policy for tiles (e.g., `"no-referrer-when-downgrade"`)
|
|
127
|
+
|
|
86
128
|
=== Combining multiple service providers
|
|
87
129
|
|
|
88
130
|
It is also possible to combine multiple service providers for the different categories of map services.
|
data/lib/decidim/gem_manager.rb
CHANGED
|
@@ -33,7 +33,6 @@ module Decidim
|
|
|
33
33
|
pages
|
|
34
34
|
proposals
|
|
35
35
|
surveys
|
|
36
|
-
sortitions
|
|
37
36
|
blogs
|
|
38
37
|
).freeze
|
|
39
38
|
|
|
@@ -63,6 +62,19 @@ module Decidim
|
|
|
63
62
|
end
|
|
64
63
|
end
|
|
65
64
|
|
|
65
|
+
def replace_gemspec_version
|
|
66
|
+
Dir.chdir(@dir) do
|
|
67
|
+
gemspec_file = Dir.glob("*.gemspec").first
|
|
68
|
+
return unless gemspec_file
|
|
69
|
+
|
|
70
|
+
replace_file(
|
|
71
|
+
gemspec_file,
|
|
72
|
+
/(?<!required_ruby_)version = "[^"]*"/,
|
|
73
|
+
"version = \"#{version}\""
|
|
74
|
+
)
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
66
78
|
def replace_package_version
|
|
67
79
|
Dir.chdir(@dir) do
|
|
68
80
|
replace_file(
|
|
@@ -98,7 +110,9 @@ module Decidim
|
|
|
98
110
|
|
|
99
111
|
def replace_versions
|
|
100
112
|
all_dirs do |dir|
|
|
101
|
-
new(dir)
|
|
113
|
+
manager = new(dir)
|
|
114
|
+
manager.replace_gem_version
|
|
115
|
+
manager.replace_gemspec_version
|
|
102
116
|
end
|
|
103
117
|
|
|
104
118
|
package_dirs do |dir|
|
data/lib/decidim/version.rb
CHANGED