decidim-core 0.31.2 → 0.31.3

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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/content_blocks/highlighted_elements_with_cell_for_list_cell.rb +5 -1
  3. data/app/cells/decidim/report_button/already_reported_modal.erb +1 -1
  4. data/app/cells/decidim/report_button/flag_modal.erb +1 -1
  5. data/app/cells/decidim/report_user_button/already_reported_modal.erb +1 -1
  6. data/app/cells/decidim/report_user_button/flag_modal.erb +1 -1
  7. data/app/cells/decidim/share_text_widget/modal.erb +1 -1
  8. data/app/cells/decidim/upload_modal/files.erb +5 -1
  9. data/app/cells/decidim/upload_modal_cell.rb +10 -1
  10. data/app/commands/decidim/multiple_attachments_methods.rb +20 -3
  11. data/app/jobs/decidim/find_and_update_descendants_job.rb +8 -2
  12. data/app/jobs/decidim/update_search_indexes_job.rb +2 -2
  13. data/app/packs/src/decidim/a11y.js +29 -0
  14. data/app/packs/src/decidim/a11y.test.js +81 -0
  15. data/app/packs/src/decidim/confirm.js +8 -1
  16. data/app/packs/src/decidim/confirm.test.js +225 -0
  17. data/app/packs/src/decidim/controllers/language_change/controller.js +1 -0
  18. data/app/packs/src/decidim/controllers/language_change/language_change.test.js +13 -0
  19. data/app/packs/src/decidim/datepicker/datepicker_functions.js +26 -0
  20. data/app/packs/src/decidim/datepicker/generate_datepicker.js +2 -1
  21. data/app/packs/src/decidim/datepicker/generate_timepicker.js +3 -2
  22. data/app/packs/src/decidim/datepicker/test/datepicker_functions_adjust_picker_position.test.js +234 -0
  23. data/app/packs/src/decidim/refactor/moved/focus_guard.js +4 -4
  24. data/app/packs/stylesheets/decidim/_cards.scss +12 -4
  25. data/app/packs/stylesheets/decidim/_flash.scss +1 -1
  26. data/app/views/decidim/devise/invitations/edit.html.erb +3 -3
  27. data/config/initializers/devise.rb +6 -0
  28. data/config/locales/ar.yml +3 -3
  29. data/config/locales/bg.yml +0 -4
  30. data/config/locales/ca-IT.yml +7 -6
  31. data/config/locales/ca.yml +7 -6
  32. data/config/locales/cs.yml +5 -8
  33. data/config/locales/de.yml +4 -8
  34. data/config/locales/el.yml +0 -2
  35. data/config/locales/en.yml +5 -4
  36. data/config/locales/es-MX.yml +10 -9
  37. data/config/locales/es-PY.yml +10 -9
  38. data/config/locales/es.yml +12 -11
  39. data/config/locales/eu.yml +4 -5
  40. data/config/locales/fi-plain.yml +5 -4
  41. data/config/locales/fi.yml +6 -5
  42. data/config/locales/fr-CA.yml +7 -5
  43. data/config/locales/fr.yml +8 -7
  44. data/config/locales/gl.yml +0 -2
  45. data/config/locales/hu.yml +4 -8
  46. data/config/locales/id-ID.yml +0 -2
  47. data/config/locales/it.yml +1 -3
  48. data/config/locales/ja.yml +7 -8
  49. data/config/locales/lb.yml +0 -2
  50. data/config/locales/lt.yml +1 -3
  51. data/config/locales/lv.yml +0 -2
  52. data/config/locales/nl.yml +0 -2
  53. data/config/locales/no.yml +0 -2
  54. data/config/locales/pl.yml +0 -4
  55. data/config/locales/pt-BR.yml +4 -5
  56. data/config/locales/pt.yml +0 -2
  57. data/config/locales/ro-RO.yml +1 -5
  58. data/config/locales/ru.yml +0 -2
  59. data/config/locales/sk.yml +0 -4
  60. data/config/locales/sv.yml +8 -7
  61. data/config/locales/tr-TR.yml +17 -5
  62. data/config/locales/zh-CN.yml +0 -2
  63. data/config/locales/zh-TW.yml +1 -3
  64. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +1 -1
  65. data/lib/decidim/core/version.rb +1 -1
  66. data/lib/decidim/form_builder.rb +58 -36
  67. data/lib/decidim/maintenance/taxonomy_importer.rb +1 -1
  68. data/lib/decidim/searchable.rb +4 -4
  69. metadata +9 -6
@@ -2,7 +2,7 @@
2
2
  /* eslint max-lines: ["error", 310] */
3
3
 
4
4
  import icon from "src/decidim/refactor/moved/icon"
5
- import { changeHourDisplay, changeMinuteDisplay, formatDate, hourDisplay, minuteDisplay, formatTime, setHour, setMinute, updateTimeValue, updateInputValue } from "src/decidim/datepicker/datepicker_functions"
5
+ import { changeHourDisplay, changeMinuteDisplay, formatDate, hourDisplay, minuteDisplay, formatTime, setHour, setMinute, updateTimeValue, updateInputValue, adjustPickerPosition } from "src/decidim/datepicker/datepicker_functions"
6
6
  import { timeKeyDownListener, timeBeforeInputListener } from "src/decidim/datepicker/datepicker_listeners";
7
7
  import { getDictionary } from "src/decidim/refactor/moved/i18n";
8
8
 
@@ -29,7 +29,6 @@ export default function generateTimePicker(input, row, formats) {
29
29
  clock.setAttribute("disabled", input.attributes.disabled);
30
30
  };
31
31
 
32
-
33
32
  timeColumn.appendChild(time);
34
33
  timeColumn.appendChild(clock);
35
34
 
@@ -279,6 +278,8 @@ export default function generateTimePicker(input, row, formats) {
279
278
  event.preventDefault();
280
279
  timePicker.style.display = "block";
281
280
  document.addEventListener("click", timePickerDisplay);
281
+ adjustPickerPosition(time, timePicker, ".datepicker__time-column")
282
+
282
283
  hours.value = hourDisplay(hour);
283
284
  minutes.value = minuteDisplay(minute);
284
285
  });
@@ -0,0 +1,234 @@
1
+ /* global jest */
2
+
3
+ import { adjustPickerPosition } from "src/decidim/datepicker/datepicker_functions";
4
+
5
+ describe("adjustDatePickerPosition", () => {
6
+ let input = null;
7
+ let parent = null;
8
+ let datePickerContainer = null;
9
+
10
+ let originalInnerHeight = window.innerHeight;
11
+
12
+ beforeEach(() => {
13
+ // Setup DOM structure
14
+ parent = document.createElement("div");
15
+ parent.className = "datepicker__date-column";
16
+ document.body.appendChild(parent);
17
+
18
+ input = document.createElement("input");
19
+ Reflect.defineProperty(input, "offsetHeight", {
20
+ configurable: true,
21
+ value: 40
22
+ });
23
+ parent.appendChild(input);
24
+
25
+ datePickerContainer = document.createElement("div");
26
+ datePickerContainer.className = "datepicker__container";
27
+ parent.appendChild(datePickerContainer);
28
+
29
+ // Mock offsetHeight for calendar
30
+ Reflect.defineProperty(datePickerContainer, "offsetHeight", {
31
+ configurable: true,
32
+ value: 300
33
+ });
34
+
35
+ // store original viewport height
36
+ originalInnerHeight = window.innerHeight;
37
+ });
38
+
39
+ afterEach(() => {
40
+ document.body.removeChild(parent);
41
+
42
+ Reflect.defineProperty(window, "innerHeight", {
43
+ writable: true,
44
+ configurable: true,
45
+ value: originalInnerHeight
46
+ });
47
+
48
+ jest.restoreAllMocks();
49
+ });
50
+
51
+ it("sets parent position to relative when static", () => {
52
+ parent.style.position = "static";
53
+
54
+ adjustPickerPosition(input, datePickerContainer, ".datepicker__date-column");
55
+
56
+ expect(parent.style.position).toBe("relative");
57
+ });
58
+
59
+ it("does not change parent position when already positioned", () => {
60
+ parent.style.position = "absolute";
61
+
62
+ adjustPickerPosition(input, datePickerContainer, ".datepicker__date-column");
63
+
64
+ expect(parent.style.position).toBe("absolute");
65
+ });
66
+
67
+ it("opens below when sufficient space below", () => {
68
+ jest.spyOn(input, "getBoundingClientRect").mockReturnValue({
69
+ top: 100,
70
+ bottom: 140
71
+ });
72
+
73
+ Reflect.defineProperty(window, "innerHeight", {
74
+ writable: true,
75
+ configurable: true,
76
+ value: 800
77
+ });
78
+
79
+ adjustPickerPosition(input, datePickerContainer, ".datepicker__date-column");
80
+
81
+ expect(datePickerContainer.style.top).toBe("40px");
82
+ expect(datePickerContainer.style.bottom).toBe("");
83
+ });
84
+
85
+ it("opens above when insufficient space below", () => {
86
+ jest.spyOn(input, "getBoundingClientRect").mockReturnValue({
87
+ top: 400,
88
+ bottom: 440
89
+ });
90
+
91
+ Reflect.defineProperty(window, "innerHeight", {
92
+ writable: true,
93
+ configurable: true,
94
+ value: 500
95
+ });
96
+
97
+ adjustPickerPosition(input, datePickerContainer, ".datepicker__date-column");
98
+
99
+ expect(datePickerContainer.style.top).toBe("");
100
+ expect(datePickerContainer.style.bottom).toBe("40px");
101
+ });
102
+
103
+ it("prefers opening below when space is equal above and below", () => {
104
+ jest.spyOn(input, "getBoundingClientRect").mockReturnValue({
105
+ top: 250,
106
+ bottom: 290
107
+ });
108
+
109
+ Reflect.defineProperty(window, "innerHeight", {
110
+ writable: true,
111
+ configurable: true,
112
+ value: 540
113
+ });
114
+
115
+ adjustPickerPosition(input, datePickerContainer, ".datepicker__date-column");
116
+
117
+ expect(datePickerContainer.style.top).toBe("40px");
118
+ expect(datePickerContainer.style.bottom).toBe("");
119
+ });
120
+
121
+ it("always sets right position to 0px", () => {
122
+ jest.spyOn(input, "getBoundingClientRect").mockReturnValue({
123
+ top: 100,
124
+ bottom: 140
125
+ });
126
+
127
+ adjustPickerPosition(input, datePickerContainer, ".datepicker__date-column");
128
+
129
+ expect(datePickerContainer.style.right).toBe("0px");
130
+ });
131
+ });
132
+
133
+
134
+ describe("adjustTimePickerPosition", () => {
135
+ let input = null;
136
+ let parent = null;
137
+ let timePicker = null;
138
+
139
+ let originalInnerHeight = window.innerHeight;
140
+
141
+ beforeEach(() => {
142
+ parent = document.createElement("div");
143
+ parent.className = "datepicker__time-column";
144
+ document.body.appendChild(parent);
145
+
146
+ input = document.createElement("input");
147
+ Reflect.defineProperty(input, "offsetHeight", {
148
+ configurable: true,
149
+ value: 30
150
+ });
151
+ parent.appendChild(input);
152
+
153
+ timePicker = document.createElement("div");
154
+ timePicker.className = "timepicker__container";
155
+ parent.appendChild(timePicker);
156
+
157
+ Reflect.defineProperty(timePicker, "offsetHeight", {
158
+ configurable: true,
159
+ value: 200
160
+ });
161
+
162
+ // store original value before any test mutates it
163
+ originalInnerHeight = window.innerHeight;
164
+ });
165
+
166
+ afterEach(() => {
167
+ // restore DOM
168
+ document.body.removeChild(parent);
169
+
170
+ // restore window.innerHeight (fix for CodeRabbit warning)
171
+ Reflect.defineProperty(window, "innerHeight", {
172
+ writable: true,
173
+ configurable: true,
174
+ value: originalInnerHeight
175
+ });
176
+
177
+ jest.restoreAllMocks();
178
+ });
179
+
180
+ it("sets parent position to relative when static", () => {
181
+ parent.style.position = "static";
182
+
183
+ adjustPickerPosition(input, timePicker, ".datepicker__time-column");
184
+
185
+ expect(parent.style.position).toBe("relative");
186
+ });
187
+
188
+ it("opens below when there is enough space", () => {
189
+ jest.spyOn(input, "getBoundingClientRect").mockReturnValue({
190
+ top: 100,
191
+ bottom: 130
192
+ });
193
+
194
+ Reflect.defineProperty(window, "innerHeight", {
195
+ writable: true,
196
+ configurable: true,
197
+ value: 700
198
+ });
199
+
200
+ adjustPickerPosition(input, timePicker, ".datepicker__time-column");
201
+
202
+ expect(timePicker.style.top).toBe("30px");
203
+ expect(timePicker.style.bottom).toBe("");
204
+ });
205
+
206
+ it("opens above when there is not enough space below", () => {
207
+ jest.spyOn(input, "getBoundingClientRect").mockReturnValue({
208
+ top: 400,
209
+ bottom: 430
210
+ });
211
+
212
+ Reflect.defineProperty(window, "innerHeight", {
213
+ writable: true,
214
+ configurable: true,
215
+ value: 500
216
+ });
217
+
218
+ adjustPickerPosition(input, timePicker, ".datepicker__time-column");
219
+
220
+ expect(timePicker.style.top).toBe("");
221
+ expect(timePicker.style.bottom).toBe("30px");
222
+ });
223
+
224
+ it("always aligns to the right", () => {
225
+ jest.spyOn(input, "getBoundingClientRect").mockReturnValue({
226
+ top: 100,
227
+ bottom: 130
228
+ });
229
+
230
+ adjustPickerPosition(input, timePicker, ".datepicker__time-column");
231
+
232
+ expect(timePicker.style.right).toBe("0px");
233
+ });
234
+ });
@@ -78,16 +78,16 @@ export default class FocusGuard {
78
78
 
79
79
  let target = null;
80
80
  if (guard.dataset.position === "start") {
81
- // Focus at the start guard, so focus the first focusable element after that
82
- for (let ind = 0; ind < visibleNodes.length; ind += 1) {
81
+ // Focus at the start guard, so focus the last focusable element (cycle forward to end)
82
+ for (let ind = visibleNodes.length - 1; ind >= 0; ind -= 1) {
83
83
  if (!this.isFocusGuard(visibleNodes[ind]) && this.isFocusable(visibleNodes[ind])) {
84
84
  target = visibleNodes[ind];
85
85
  break;
86
86
  }
87
87
  }
88
88
  } else {
89
- // Focus at the end guard, so focus the first focusable element after that
90
- for (let ind = visibleNodes.length - 1; ind >= 0; ind -= 1) {
89
+ // Focus at the end guard, so focus the first focusable element (cycle back to start)
90
+ for (let ind = 0; ind < visibleNodes.length; ind += 1) {
91
91
  if (!this.isFocusGuard(visibleNodes[ind]) && this.isFocusable(visibleNodes[ind])) {
92
92
  target = visibleNodes[ind];
93
93
  break;
@@ -116,7 +116,7 @@
116
116
  }
117
117
 
118
118
  &__calendar {
119
- @apply w-14 flex flex-col justify-start rounded overflow-hidden bg-background text-center;
119
+ @apply w-20 flex flex-col justify-start rounded overflow-hidden bg-background text-center;
120
120
 
121
121
  /* overwrite defaults */
122
122
  &-list__reset {
@@ -128,17 +128,25 @@
128
128
  }
129
129
 
130
130
  &-day {
131
- @apply text-black text-2xl font-bold;
131
+ @apply text-black text-xl font-semibold;
132
132
  }
133
133
 
134
134
  &-year {
135
- @apply text-black text-xs;
135
+ @apply text-black text-xs mb-0.5;
136
136
  }
137
137
 
138
138
  &-month,
139
139
  &-day,
140
140
  &-year {
141
- @apply inline-flex items-center justify-evenly empty:[&>div]:hidden;
141
+ @apply inline-flex items-center justify-center empty:[&>div]:hidden;
142
+ }
143
+
144
+ &-separator {
145
+ @apply mx-2 font-normal text-sm;
146
+ }
147
+
148
+ .card__list-content {
149
+ @apply mt-0.5;
142
150
  }
143
151
  }
144
152
 
@@ -1,5 +1,5 @@
1
1
  .flash {
2
- @apply flex justify-start gap-4 border-l-4 border-secondary my-4 p-4 bg-secondary/5 break-all;
2
+ @apply flex justify-start gap-4 border-l-4 border-secondary my-4 p-4 bg-secondary/5;
3
3
 
4
4
  &__icon {
5
5
  svg {
@@ -4,7 +4,7 @@
4
4
  <h1 class="title-decorator inline-block text-left mb-12"><%= t "devise.invitations.edit.header" %></h1>
5
5
 
6
6
  <p class="text-lg text-gray-2">
7
- <%= t("devise.invitations.edit.subtitle").html_safe %>
7
+ <%= current_organization.users_registration_mode_disabled? ? t("devise.invitations.edit.subtitle_no_password").html_safe : t("devise.invitations.edit.subtitle").html_safe %>
8
8
  </p>
9
9
  </div>
10
10
 
@@ -16,8 +16,8 @@
16
16
 
17
17
  <%= f.text_field :nickname, help_text: t("devise.invitations.edit.nickname_help", organization: current_organization_name), required: "required", autocomplete: "nickname" %>
18
18
 
19
- <% if f.object.class.require_password_on_accepting %>
20
- <%= render partial: "decidim/account/password_fields", locals: { form: f, user: :user } %>
19
+ <% unless current_organization.users_registration_mode_disabled? %>
20
+ <%= render partial: "decidim/account/password_fields", locals: { form: f, user: resource.admin? ? :admin : :user } %>
21
21
  <% end %>
22
22
  </div>
23
23
 
@@ -175,6 +175,12 @@ Devise.setup do |config|
175
175
  # Default: true
176
176
  config.allow_insecure_sign_in_after_accept = true
177
177
 
178
+ # Require password when user accepts the invitation.
179
+ # Disable if you do not want to ask for or enforce setting a password while accepting,
180
+ # because it is set when the user is invited or will be set later.
181
+ # Default: true
182
+ config.require_password_on_accepting = false
183
+
178
184
  # A period that the user is allowed to confirm their account before their
179
185
  # token becomes invalid. For example, if set to 3.days, the user can confirm
180
186
  # their account within 3 days after the mail was sent, but on the fourth day
@@ -1123,8 +1123,6 @@ ar:
1123
1123
  submit_button: ارسل دعوة
1124
1124
  no_invitations_remaining: لا توجد دعوات متبقية
1125
1125
  send_instructions: تم إرسال دعوة بريد إلكتروني إلى %{email}.
1126
- updated: تم ضبط كلمة مرورك بنجاح. انت الآن مسجل دخولك.
1127
- updated_not_active: تم ضبط كلمة مرورك بنجاح.
1128
1126
  mailer:
1129
1127
  confirmation_instructions:
1130
1128
  action: تأكيد حسابي
@@ -1186,6 +1184,7 @@ ar:
1186
1184
  links:
1187
1185
  back: الى الخلف
1188
1186
  forgot_your_password: نسيت رقمك السري؟
1187
+ log_in: تسجيل الدخول
1189
1188
  log_in_with_provider: تسجيل الدخول باستخدام %{provider}
1190
1189
  minimum_password_length:
1191
1190
  zero: "(%{count} حرف كحد أدنى)"
@@ -1274,7 +1273,7 @@ ar:
1274
1273
  description: وصف
1275
1274
  name: اسم
1276
1275
  service: الخدمة
1277
- type: نوع
1276
+ type: النوع
1278
1277
  items:
1279
1278
  _session_id:
1280
1279
  description: يسمح للمواقع بتذكر المستخدم داخل الموقع عندما ينتقل بين صفحات الويب.
@@ -1324,6 +1323,7 @@ ar:
1324
1323
  data_consent_settings: إعدادات ملفات تعريف الارتباط
1325
1324
  decidim_logo: شعار Decidim
1326
1325
  decidim_title: Decidim
1326
+ log_in: تسجيل الدخول
1327
1327
  made_with_open_source: موقع تم إنشاؤه <a target="_blank" href="https://github.com/decidim/decidim">بالبرمجيات الحرة</a>.
1328
1328
  resources: الموارد
1329
1329
  header:
@@ -1314,8 +1314,6 @@ bg:
1314
1314
  submit_button: Изпрати покана
1315
1315
  no_invitations_remaining: Няма останали покани
1316
1316
  send_instructions: Писмо с покана беше изпратено до %{email}.
1317
- updated: Вашата парола беше зададена успешно. Вече сте влезли.
1318
- updated_not_active: Вашата парола беше зададена успешно.
1319
1317
  mailer:
1320
1318
  confirmation_instructions:
1321
1319
  action: Потвърди профила ми
@@ -1372,8 +1370,6 @@ bg:
1372
1370
  confirm_new_password: Потвърди нова парола
1373
1371
  new_password: Нова парола
1374
1372
  old_password_help: За да потвърдите промените във вашия акаунт, моля, въведете текущата си парола.
1375
- password_help: "Минимум %{minimum_characters} символа, не трябва да са разпространени (например, 123456) и трябва да са различни от вашите име и ел. поща."
1376
- password_help_admin: "Минимум %{minimum_characters} символа, не трябва да са разпространени (например, 123456) и трябва да са различни от вашите име и ел. поща."
1377
1373
  title: Промяна на паролата
1378
1374
  new:
1379
1375
  forgot_your_password: Забравили сте паролата си?
@@ -1422,7 +1422,7 @@ ca-IT:
1422
1422
  download:
1423
1423
  components: Components
1424
1424
  core: Nucli
1425
- spaces: Espai participatiu
1425
+ spaces: Espais de participació
1426
1426
  title: Descarregar recursos
1427
1427
  download_open_data: Descarrega tots els fitxers de dades obertes
1428
1428
  download_resource: Descarregar "%{resource_name}" en format CSV
@@ -1550,7 +1550,7 @@ ca-IT:
1550
1550
  user:
1551
1551
  actions:
1552
1552
  disabled_message: Missatge
1553
- edit_profile: Edita el perfil
1553
+ edit_profile: Editar el perfil
1554
1554
  message: Missatge
1555
1555
  resend_email_confirmation_instructions: Reenvia un correu electrònic amb les instruccions de confirmació
1556
1556
  qr:
@@ -1819,6 +1819,7 @@ ca-IT:
1819
1819
  nickname_help: El teu àlies a %{organization}. Només pot contenir lletres, números, '-' i '_'.
1820
1820
  submit_button: Desa
1821
1821
  subtitle: Si acceptes la invitació, si us plau, estableix el teu àlies i contrasenya.
1822
+ subtitle_no_password: Si acceptes la invitació, si us plau, estableix el teu àlies o sobrenom.
1822
1823
  invitation_removed: S'ha eliminat la teva invitació.
1823
1824
  invitation_token_invalid: El token de invitació proporcionat no és vàlid!
1824
1825
  new:
@@ -1826,8 +1827,8 @@ ca-IT:
1826
1827
  submit_button: Enviar una invitació
1827
1828
  no_invitations_remaining: No queden invitacions
1828
1829
  send_instructions: S'ha enviat una invitació via correu electrònic a %{email}.
1829
- updated: La teva contrasenya s'ha establert correctament. Ja has iniciat sessió.
1830
- updated_not_active: La teva contrasenya s'ha establert correctament.
1830
+ updated: La invitació s'ha acceptat correctament. S'ha iniciat la teva sessió.
1831
+ updated_not_active: La invitació s'ha acceptat correctament.
1831
1832
  mailer:
1832
1833
  confirmation_instructions:
1833
1834
  action: Confirma el meu compte
@@ -1886,8 +1887,8 @@ ca-IT:
1886
1887
  confirm_new_password: Confirmar la nova contrasenya
1887
1888
  new_password: Nova contrasenya
1888
1889
  old_password_help: Per tal de confirmar els canvis al teu compte, si us plau, proporciona'ns la teva contrasenya actual.
1889
- password_help: "%{minimum_characters} caràcters mínim, no ha de ser massa comú (per exemple 123456) i ha de ser diferent del teu àlies i la teva adreça de correu electrònic."
1890
- password_help_admin: "%{minimum_characters} caràcters mínim, no ha de ser massa comú (per exemple 123456) i ha de ser diferent del teu àlies, del teu correu electrònic i de les teves antigues contrasenyes."
1890
+ password_help: "La contrasenya ha de tenir com a mínim %{minimum_characters} caràcters, d'aquests, almenys 5 caràcters han de ser diferents, no han de ser massa comuns (p. ex. 123456) i ha de ser diferent del número, sobrenom, correu electrònic i del domini de la plataforma."
1891
+ password_help_admin: "La contrasenya ha de tenir com a mínim %{minimum_characters} caràcters, d'aquests, almenys 5 caràcters han de ser diferents, no han de ser massa comuns (p. ex. 123456) i ha de ser diferent del número, sobrenom, correu electrònic, domini de la plataforma o contrasenyes antigues."
1891
1892
  title: Canvi de contrasenya
1892
1893
  new:
1893
1894
  forgot_your_password: Has oblidat la teva contrasenya?
@@ -1422,7 +1422,7 @@ ca:
1422
1422
  download:
1423
1423
  components: Components
1424
1424
  core: Nucli
1425
- spaces: Espai participatiu
1425
+ spaces: Espais de participació
1426
1426
  title: Descarregar recursos
1427
1427
  download_open_data: Descarrega tots els fitxers de dades obertes
1428
1428
  download_resource: Descarregar "%{resource_name}" en format CSV
@@ -1550,7 +1550,7 @@ ca:
1550
1550
  user:
1551
1551
  actions:
1552
1552
  disabled_message: Missatge
1553
- edit_profile: Edita el perfil
1553
+ edit_profile: Editar el perfil
1554
1554
  message: Missatge
1555
1555
  resend_email_confirmation_instructions: Reenvia un correu electrònic amb les instruccions de confirmació
1556
1556
  qr:
@@ -1819,6 +1819,7 @@ ca:
1819
1819
  nickname_help: El teu àlies a %{organization}. Només pot contenir lletres, números, '-' i '_'.
1820
1820
  submit_button: Desa
1821
1821
  subtitle: Si acceptes la invitació, si us plau, estableix el teu àlies i contrasenya.
1822
+ subtitle_no_password: Si acceptes la invitació, si us plau, estableix el teu àlies o sobrenom.
1822
1823
  invitation_removed: S'ha eliminat la teva invitació.
1823
1824
  invitation_token_invalid: El token de invitació proporcionat no és vàlid!
1824
1825
  new:
@@ -1826,8 +1827,8 @@ ca:
1826
1827
  submit_button: Enviar una invitació
1827
1828
  no_invitations_remaining: No queden invitacions
1828
1829
  send_instructions: S'ha enviat una invitació via correu electrònic a %{email}.
1829
- updated: La teva contrasenya s'ha establert correctament. Ja has iniciat sessió.
1830
- updated_not_active: La teva contrasenya s'ha establert correctament.
1830
+ updated: La invitació s'ha acceptat correctament. S'ha iniciat la teva sessió.
1831
+ updated_not_active: La invitació s'ha acceptat correctament.
1831
1832
  mailer:
1832
1833
  confirmation_instructions:
1833
1834
  action: Confirma el meu compte
@@ -1886,8 +1887,8 @@ ca:
1886
1887
  confirm_new_password: Confirmar la nova contrasenya
1887
1888
  new_password: Nova contrasenya
1888
1889
  old_password_help: Per tal de confirmar els canvis al teu compte, si us plau, proporciona'ns la teva contrasenya actual.
1889
- password_help: "%{minimum_characters} caràcters mínim, no ha de ser massa comú (per exemple 123456) i ha de ser diferent del teu àlies i la teva adreça de correu electrònic."
1890
- password_help_admin: "%{minimum_characters} caràcters mínim, no ha de ser massa comú (per exemple 123456) i ha de ser diferent del teu àlies, del teu correu electrònic i de les teves antigues contrasenyes."
1890
+ password_help: "La contrasenya ha de tenir com a mínim %{minimum_characters} caràcters, d'aquests, almenys 5 caràcters han de ser diferents, no han de ser massa comuns (p. ex. 123456) i ha de ser diferent del número, sobrenom, correu electrònic i del domini de la plataforma."
1891
+ password_help_admin: "La contrasenya ha de tenir com a mínim %{minimum_characters} caràcters, d'aquests, almenys 5 caràcters han de ser diferents, no han de ser massa comuns (p. ex. 123456) i ha de ser diferent del número, sobrenom, correu electrònic, domini de la plataforma o contrasenyes antigues."
1891
1892
  title: Canvi de contrasenya
1892
1893
  new:
1893
1894
  forgot_your_password: Has oblidat la teva contrasenya?
@@ -307,7 +307,7 @@ cs:
307
307
  delete: "%{user_name} odstranila %{resource_name} aplikaci OAuth"
308
308
  update: "%{user_name} aktualizovala %{resource_name} aplikaci OAuth"
309
309
  organization:
310
- update: "%{user_name} aktualizovala nastavení organizace"
310
+ update: "%{user_name} aktualizoval nastavení organizace"
311
311
  update_external_domain: "%{user_name} aktualizoval externí domény organizace"
312
312
  participatory_space_private_user:
313
313
  create: "%{user_name} pozval %{resource_name} aby se stal soukromým uživatelem"
@@ -625,7 +625,7 @@ cs:
625
625
  global_menu:
626
626
  name: Globální menu
627
627
  hero:
628
- name: Obrázek hrdiny a CTA
628
+ name: Obrázek hrdiny a výzva k akci
629
629
  hero_settings_form:
630
630
  background_image: Obrázek pozadí
631
631
  cta_button_path: URL tlačítka Výzvy k akci
@@ -1142,7 +1142,7 @@ cs:
1142
1142
  description: Odznaky jsou uznání akcí účastníků a pokrok v platformě. Jakmile začnete objevovat, účastnit se a spolupracovat v platformě, získáte různé odznaky.
1143
1143
  level: Úroveň %{level}
1144
1144
  reached_top: Dosáhli jste nejvyšší úrovně tohoto odznaku.
1145
- title: Jaké jsou odznaky?
1145
+ title: Co jsou odznaky?
1146
1146
  groups:
1147
1147
  roles:
1148
1148
  admin: Správce
@@ -1575,7 +1575,7 @@ cs:
1575
1575
  user:
1576
1576
  actions:
1577
1577
  disabled_message: Zpráva
1578
- edit_profile: Editovat profil
1578
+ edit_profile: Upravit profil
1579
1579
  message: Zpráva
1580
1580
  resend_email_confirmation_instructions: Znovu odeslat pokyny pro potvrzení e-mailu
1581
1581
  qr:
@@ -1847,8 +1847,6 @@ cs:
1847
1847
  submit_button: Odeslat pozvánku
1848
1848
  no_invitations_remaining: Žádné zbývající pozvánky
1849
1849
  send_instructions: Pozvánka byla odeslána na %{email}.
1850
- updated: Vaše heslo bylo úspěšně nastaveno. Nyní jste přihlášeni.
1851
- updated_not_active: Vaše heslo bylo úspěšně nastaveno.
1852
1850
  mailer:
1853
1851
  confirmation_instructions:
1854
1852
  action: Potvrďte svůj účet
@@ -1908,8 +1906,6 @@ cs:
1908
1906
  confirm_new_password: Potvrďte nové heslo
1909
1907
  new_password: Nové heslo
1910
1908
  old_password_help: Chcete-li potvrdit změny vašeho účtu, zadejte prosím své aktuální heslo.
1911
- password_help: "minimální počet znaků je %{minimum_characters}, nesmí být příliš obvyklý (např. 123456) a musí se lišit od vašeho uživatelského jména a e-mailu."
1912
- password_help_admin: "minimální počet znaků je %{minimum_characters}, nesmí být příliš časté (např. 123456), musí se lišit od vaší přezdívky a e-mailu a musí se lišit od vašich starých hesel."
1913
1909
  title: Změna hesla
1914
1910
  new:
1915
1911
  forgot_your_password: Zapomněli jste heslo?
@@ -2159,6 +2155,7 @@ cs:
2159
2155
  confirm_title_close_ephemeral_session: Před opuštěním této stránky…
2160
2156
  log_in: Přihlásit
2161
2157
  main_menu: Hlavní menu
2158
+ mobile_account_greeting: Dobrý den %{user_name}
2162
2159
  user_menu: Uživatelské Menu
2163
2160
  impersonation_warning:
2164
2161
  close_session: Zavřít sezení
@@ -108,7 +108,7 @@ de:
108
108
  date:
109
109
  buttons:
110
110
  close: Schliessen
111
- select: Wählen
111
+ select: Auswählen
112
112
  formats:
113
113
  decidim_short: "%d/%m/%Y"
114
114
  decidim_short_dashed: "%d-%m-%Y"
@@ -1523,7 +1523,7 @@ de:
1523
1523
  error: Es gab ein Problem bei der Aktualisierung des Passwortes.
1524
1524
  success: Passwort erfolgreich aktualisiert.
1525
1525
  profile:
1526
- deleted: Gelöschter Benutzer
1526
+ deleted: Gelöschter Teilnehmer
1527
1527
  inaccessible_message: Dieses Profil ist wegen Verletzung der Nutzungsbedingungen nicht zugänglich!
1528
1528
  profiles:
1529
1529
  default_officialization_text_for_users: Dieser Teilnehmer ist öffentlich verifiziert, sein/ihr Name oder seine/ihre Rolle wurde auf Übereinstimmung mit dem wirklichen Namen und der wirklichen Rolle überprüft.
@@ -1540,7 +1540,7 @@ de:
1540
1540
  disabled_message: Nachricht
1541
1541
  edit_profile: Profil bearbeiten
1542
1542
  message: Nachricht
1543
- resend_email_confirmation_instructions: Senden Sie die E-Mail-Bestätigungsanweisungen erneut
1543
+ resend_email_confirmation_instructions: E-Mail-Bestätigungsanweisungen erneut versenden
1544
1544
  qr:
1545
1545
  show:
1546
1546
  scan: QR-Code scannen
@@ -1799,8 +1799,6 @@ de:
1799
1799
  submit_button: Eine Einladung schicken
1800
1800
  no_invitations_remaining: Keine Einladungen übrig
1801
1801
  send_instructions: Eine Einladungs-E-Mail wurde an %{email}gesendet.
1802
- updated: Ihr Passwort wurde erfolgreich vergeben. Sie sind jetzt angemeldet.
1803
- updated_not_active: Ihr Passwort wurde erfolgreich vergeben.
1804
1802
  mailer:
1805
1803
  confirmation_instructions:
1806
1804
  action: Konto bestätigen
@@ -1858,8 +1856,6 @@ de:
1858
1856
  confirm_new_password: Bestätige neues Passwort
1859
1857
  new_password: Neues Passwort
1860
1858
  old_password_help: Um die Änderungen an Ihrem Konto zu bestätigen, geben Sie bitte Ihr aktuelles Passwort ein.
1861
- password_help: "Das Passwort muss aus mindestens %{minimum_characters} Zeichen bestehen, darf nicht zu gewöhnlich sein (z. B. 123456) oder Ihren Kontonamen bzw. Ihre E-Mail-Adresse enthalten."
1862
- password_help_admin: "Das Passwort muss aus mindestens %{minimum_characters} Zeichen bestehen, darf nicht zu gewöhnlich sein (z. B. 123456) oder Ihren Kontonamen oder Ihre E-Mail-Adresse enthalten und muss sich von Ihren alten Passwörtern unterscheiden."
1863
1859
  title: Passwort ändern
1864
1860
  new:
1865
1861
  forgot_your_password: Haben Sie Ihr Passwort vergessen?
@@ -2202,7 +2198,7 @@ de:
2202
2198
  buttons:
2203
2199
  close: Schliessen
2204
2200
  reset: Zurücksetzen
2205
- select: Wählen
2201
+ select: Auswählen
2206
2202
  formats:
2207
2203
  day_of_month: "%d. %b"
2208
2204
  day_of_week: "%a"
@@ -975,8 +975,6 @@ el:
975
975
  submit_button: Στείλτε μια πρόσκληση
976
976
  no_invitations_remaining: Δεν απομένουν προσκλήσεις
977
977
  send_instructions: Στάλθηκε ένα email πρόσκλησης στη διεύθυνση %{email}.
978
- updated: Ο κωδικός πρόσβασης ορίστηκε με επιτυχία. Έχετε συνδεθεί.
979
- updated_not_active: Ο κωδικός πρόσβασης ορίστηκε με επιτυχία.
980
978
  mailer:
981
979
  confirmation_instructions:
982
980
  action: Επιβεβαίωση του λογαριασμού μου