decidim-forms 0.16.0

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 (75) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +65 -0
  3. data/Rakefile +3 -0
  4. data/app/assets/config/admin/decidim_forms_manifest.js +1 -0
  5. data/app/assets/config/decidim_forms_manifest.js +1 -0
  6. data/app/assets/images/decidim/surveys/icon.svg +19 -0
  7. data/app/assets/javascripts/decidim/forms/admin/auto_buttons_by_min_items.component.js.es6 +25 -0
  8. data/app/assets/javascripts/decidim/forms/admin/auto_select_options_by_total_items.component.js.es6 +23 -0
  9. data/app/assets/javascripts/decidim/forms/admin/forms.js.es6 +188 -0
  10. data/app/assets/javascripts/decidim/forms/autosortable_checkboxes.component.js.es6 +65 -0
  11. data/app/assets/javascripts/decidim/forms/forms.js.es6 +20 -0
  12. data/app/assets/javascripts/decidim/forms/option_attached_inputs.component.js.es6 +32 -0
  13. data/app/commands/decidim/forms/admin/update_questionnaire.rb +86 -0
  14. data/app/commands/decidim/forms/answer_questionnaire.rb +54 -0
  15. data/app/controllers/decidim/forms/admin/concerns/has_questionnaire.rb +95 -0
  16. data/app/controllers/decidim/forms/concerns/has_questionnaire.rb +84 -0
  17. data/app/forms/decidim/forms/admin/answer_option_form.rb +23 -0
  18. data/app/forms/decidim/forms/admin/question_form.rb +35 -0
  19. data/app/forms/decidim/forms/admin/questionnaire_form.rb +27 -0
  20. data/app/forms/decidim/forms/answer_choice_form.rb +15 -0
  21. data/app/forms/decidim/forms/answer_form.rb +69 -0
  22. data/app/forms/decidim/forms/questionnaire_form.rb +22 -0
  23. data/app/helpers/decidim/forms/admin/application_helper.rb +19 -0
  24. data/app/models/concerns/decidim/forms/has_questionnaire.rb +20 -0
  25. data/app/models/decidim/forms/answer.rb +45 -0
  26. data/app/models/decidim/forms/answer_choice.rb +15 -0
  27. data/app/models/decidim/forms/answer_option.rb +11 -0
  28. data/app/models/decidim/forms/application_record.rb +10 -0
  29. data/app/models/decidim/forms/question.rb +36 -0
  30. data/app/models/decidim/forms/questionnaire.rb +23 -0
  31. data/app/queries/decidim/forms/questionnaire_user_answers.rb +28 -0
  32. data/app/views/decidim/forms/admin/questionnaires/_answer_option.html.erb +44 -0
  33. data/app/views/decidim/forms/admin/questionnaires/_form.html.erb +51 -0
  34. data/app/views/decidim/forms/admin/questionnaires/_question.html.erb +115 -0
  35. data/app/views/decidim/forms/admin/questionnaires/edit.html.erb +7 -0
  36. data/app/views/decidim/forms/questionnaires/_answer.html.erb +94 -0
  37. data/app/views/decidim/forms/questionnaires/show.html.erb +84 -0
  38. data/config/locales/ca.yml +79 -0
  39. data/config/locales/de.yml +79 -0
  40. data/config/locales/en.yml +79 -0
  41. data/config/locales/es-PY.yml +79 -0
  42. data/config/locales/es.yml +79 -0
  43. data/config/locales/eu.yml +79 -0
  44. data/config/locales/fi-pl.yml +79 -0
  45. data/config/locales/fi.yml +79 -0
  46. data/config/locales/fr.yml +79 -0
  47. data/config/locales/gl.yml +79 -0
  48. data/config/locales/hu.yml +79 -0
  49. data/config/locales/id-ID.yml +1 -0
  50. data/config/locales/it.yml +79 -0
  51. data/config/locales/nl.yml +79 -0
  52. data/config/locales/pl.yml +79 -0
  53. data/config/locales/pt-BR.yml +79 -0
  54. data/config/locales/pt.yml +79 -0
  55. data/config/locales/ru.yml +1 -0
  56. data/config/locales/sv.yml +79 -0
  57. data/config/locales/tr-TR.yml +1 -0
  58. data/config/locales/uk.yml +1 -0
  59. data/db/migrate/20170511092231_create_decidim_forms_questionnaires.rb +15 -0
  60. data/db/migrate/20170515090916_create_decidim_forms_questions.rb +17 -0
  61. data/db/migrate/20170515144119_create_decidim_forms_answers.rb +15 -0
  62. data/db/migrate/20180405015012_create_decidim_forms_answer_options.rb +11 -0
  63. data/db/migrate/20180405015147_create_decidim_forms_answer_choices.rb +13 -0
  64. data/lib/decidim/forms.rb +13 -0
  65. data/lib/decidim/forms/admin.rb +9 -0
  66. data/lib/decidim/forms/admin_engine.rb +21 -0
  67. data/lib/decidim/forms/data_portability_user_answers_serializer.rb +37 -0
  68. data/lib/decidim/forms/engine.rb +14 -0
  69. data/lib/decidim/forms/test.rb +4 -0
  70. data/lib/decidim/forms/test/factories.rb +55 -0
  71. data/lib/decidim/forms/test/shared_examples/has_questionnaire.rb +524 -0
  72. data/lib/decidim/forms/test/shared_examples/manage_questionnaires.rb +626 -0
  73. data/lib/decidim/forms/user_answers_serializer.rb +29 -0
  74. data/lib/decidim/forms/version.rb +10 -0
  75. metadata +165 -0
@@ -0,0 +1,7 @@
1
+ <%= decidim_form_for(@form, url: update_url, method: :put, html: { class: "form edit_questionnaire" }) do |form| %>
2
+ <%= render partial: "decidim/forms/admin/questionnaires/form", object: form, locals: { title: t(".title") } %>
3
+
4
+ <div class="button--double form-general-submit">
5
+ <%= form.submit t(".save"), class: "button" %>
6
+ </div>
7
+ <% end %>
@@ -0,0 +1,94 @@
1
+ <% field_id = "questionnaire_answers_#{answer_idx}" %>
2
+ <%= label_tag field_id, answer.label(answer_idx), class: "questionnaire-question" %>
3
+
4
+ <% if translated_attribute(answer.question.description).present? %>
5
+ <div class="help-text">
6
+ <%= decidim_sanitize translated_attribute(answer.question.description) %>
7
+ </div>
8
+ <% end %>
9
+
10
+ <% case answer.question.question_type %>
11
+ <% when "short_answer" %>
12
+ <%= answer_form.text_field :body, label: false, id: field_id, disabled: disabled %>
13
+ <% when "long_answer" %>
14
+ <%= answer_form.text_area :body, label: false, id: field_id, rows: 10, disabled: disabled %>
15
+ <% when "single_option" %>
16
+ <div class="radio-button-collection">
17
+ <% choice = answer.choices.first %>
18
+
19
+ <% answer.question.answer_options.each_with_index do |answer_option, idx| %>
20
+ <% choice_id = "#{field_id}_choices_#{idx}" %>
21
+
22
+ <%= label_tag "#{choice_id}_body" do %>
23
+ <%= radio_button_tag "questionnaire[answers][#{answer_idx}][choices][][body]",
24
+ translated_attribute(answer_option.body),
25
+ choice.try(:body),
26
+ id: "#{choice_id}_body", disabled: disabled %>
27
+
28
+ <%= translated_attribute(answer_option.body) %>
29
+
30
+ <% if answer_option.free_text %>
31
+ <%= text_field_tag "questionnaire[answers][#{answer_idx}][choices][][custom_body]",
32
+ choice.try(:custom_body),
33
+ id: "#{choice_id}_custom_body",
34
+ disabled: true %>
35
+ <% end %>
36
+
37
+ <%= hidden_field_tag "questionnaire[answers][#{answer_idx}][choices][][answer_option_id]",
38
+ answer_option.id,
39
+ id: "#{choice_id}_answer_option",
40
+ disabled: true %>
41
+ <% end %>
42
+ <% end %>
43
+ </div>
44
+ <% when "multiple_option" %>
45
+ <div class="check-box-collection">
46
+ <% answer.question.answer_options.each_with_index do |answer_option, idx| %>
47
+ <% choice = answer.selected_choices.find { |choice| choice.answer_option_id == answer_option.id } %>
48
+
49
+ <%= label_tag do %>
50
+ <%= check_box_tag "questionnaire[answers][#{answer_idx}][choices][#{idx}][body]",
51
+ translated_attribute(answer_option.body),
52
+ choice.present?, disabled: disabled %>
53
+
54
+ <%= translated_attribute(answer_option.body) %>
55
+
56
+ <% if answer_option.free_text %>
57
+ <%= text_field_tag "questionnaire[answers][#{answer_idx}][choices][#{idx}][custom_body]",
58
+ choice.try(:custom_body),
59
+ disabled: true %>
60
+ <% end %>
61
+
62
+ <%= hidden_field_tag "questionnaire[answers][#{answer_idx}][choices][#{idx}][answer_option_id]", answer_option.id %>
63
+ <% end %>
64
+ <% end %>
65
+ </div>
66
+ <% when "sorting" %>
67
+ <div class="sortable-check-box-collection">
68
+ <% answer.question.answer_options.each_with_index do |answer_option, idx| %>
69
+ <% choice = answer.selected_choices.find { |choice| choice.answer_option_id == answer_option.id } %>
70
+
71
+ <%= label_tag do %>
72
+ <%= check_box_tag "questionnaire[answers][#{answer_idx}][choices][#{idx}][body]",
73
+ translated_attribute(answer_option.body),
74
+ choice.present?, disabled: disabled %>
75
+
76
+ <span class="position"><%= choice.try(:position) %></span>
77
+
78
+ <%= translated_attribute(answer_option.body) %>
79
+
80
+ <%= hidden_field_tag "questionnaire[answers][#{answer_idx}][choices][#{idx}][position]",
81
+ choice.try(:position),
82
+ disabled: true %>
83
+
84
+ <%= hidden_field_tag "questionnaire[answers][#{answer_idx}][choices][#{idx}][answer_option_id]", answer_option.id %>
85
+ <% end %>
86
+ <% end %>
87
+ </div>
88
+ <% end %>
89
+
90
+ <%= answer_form.hidden_field :question_id %>
91
+
92
+ <% answer.errors.full_messages.each do |msg| %>
93
+ <small class="form-error is-visible"><%= msg %></small>
94
+ <% end %>
@@ -0,0 +1,84 @@
1
+ <% add_decidim_meta_tags({
2
+ title: translated_attribute(questionnaire.title),
3
+ description: translated_attribute(questionnaire.description),
4
+ }) %>
5
+
6
+ <%= render partial: "decidim/shared/component_announcement" %>
7
+
8
+ <div class="row columns">
9
+ <h2 class="section-heading"><%= translated_attribute questionnaire.title %></h2>
10
+ <div class="row">
11
+ <div class="columns large-6 medium-centered lead">
12
+ <%= decidim_sanitize translated_attribute questionnaire.description %>
13
+ </div>
14
+ </div>
15
+ </div>
16
+
17
+ <div class="row">
18
+ <div class="columns large-6 medium-centered">
19
+ <div class="card">
20
+ <div class="card__content">
21
+ <% if allow_answers? %>
22
+ <% if current_user %>
23
+ <% if questionnaire.answered_by?(current_user) %>
24
+ <div class="section">
25
+ <div class="callout success">
26
+ <h5><%= t(".questionnaire_answered.title") %></h5>
27
+ <p><%= t(".questionnaire_answered.body") %></p>
28
+ </div>
29
+ </div>
30
+ <% else %>
31
+ <div class="answer-questionnaire">
32
+ <% unless current_participatory_space.can_participate?(current_user) %>
33
+ <div class="section">
34
+ <div class="callout alert">
35
+ <h5><%= t(".questionnaire_for_private_users.title") %></h5>
36
+ <p><%= t(".questionnaire_for_private_users.body") %></p>
37
+ </div>
38
+ </div>
39
+ <% end %>
40
+
41
+ <%= decidim_form_for(@form, url: update_url, method: :post, html: { class: "form answer-questionnaire" }) do |form| %>
42
+ <% @form.answers.each_with_index do |answer, answer_idx| %>
43
+ <div class="row column">
44
+ <%= fields_for "questionnaire[answers][#{answer_idx}]", answer do |answer_form| %>
45
+ <%= render "decidim/forms/questionnaires/answer", answer_form: answer_form, answer: answer, answer_idx: answer_idx, disabled: !current_participatory_space.can_participate?(current_user) %>
46
+ <% end %>
47
+ </div>
48
+ <% end %>
49
+
50
+ <div class="row column tos-agreement">
51
+ <%= form.check_box :tos_agreement, label: t(".tos_agreement"), id: "questionnaire_tos_agreement", disabled: !current_participatory_space.can_participate?(current_user) %>
52
+ <div class="help-text">
53
+ <%= decidim_sanitize translated_attribute questionnaire.tos %>
54
+ </div>
55
+ </div>
56
+
57
+ <div class="button--double form-general-submit">
58
+ <%= form.submit t(".submit"), class: "button", disabled: !current_participatory_space.can_participate?(current_user), data: { confirm: t(".are_you_sure"), disable: true } %>
59
+ </div>
60
+ <% end %>
61
+ </div>
62
+ <% end %>
63
+ <% else %>
64
+ <div class="answer-questionnaire">
65
+ <h5 class="section-heading"><%= t(".answer_questionnaire.title") %></h5>
66
+ <p>
67
+ <%= t(".answer_questionnaire.anonymous_user_message", sign_in_link: decidim.new_user_session_path, sign_up_link: decidim.new_user_registration_path).html_safe %>
68
+ </p>
69
+ </div>
70
+ <% end %>
71
+ <% else %>
72
+ <div class="section">
73
+ <div class="callout warning">
74
+ <h5><%= t(".questionnaire_closed.title") %></h5>
75
+ <p><%= t(".questionnaire_closed.body") %></p>
76
+ </div>
77
+ </div>
78
+ <% end %>
79
+ </div>
80
+ </div>
81
+ </div>
82
+ </div>
83
+
84
+ <%= javascript_include_tag "decidim/forms/forms" %>
@@ -0,0 +1,79 @@
1
+ ca:
2
+ activemodel:
3
+ attributes:
4
+ answer:
5
+ body: Resposta
6
+ question:
7
+ max_choices: Nombre màxim d'opcions
8
+ question_type: Escriu
9
+ questionnaire_question:
10
+ mandatory: Obligatori
11
+ errors:
12
+ models:
13
+ answer:
14
+ attributes:
15
+ choices:
16
+ missing: no estan complerts
17
+ too_many: n'hi ha massa
18
+ decidim:
19
+ forms:
20
+ admin:
21
+ models:
22
+ components:
23
+ description: Descripció
24
+ tos: Termes i condicions d'ús
25
+ questionnaires:
26
+ answer_option:
27
+ answer_option: Opció de resposta
28
+ free_text: Text lliure
29
+ remove: Elimina
30
+ statement: Declaració
31
+ edit:
32
+ save: Desar
33
+ title: Títol
34
+ form:
35
+ add_question: Afegeix una pregunta
36
+ already_answered_warning: No pots modificar les pregunte d'aquest qüestionari perquè ja ha estat contestat per alguns usuaris.
37
+ question:
38
+ add_answer_option: Afegeix una opció de resposta
39
+ any: Cap
40
+ description: Descripció
41
+ down: Baixar
42
+ question: Pregunta
43
+ remove: Eliminar
44
+ statement: Declaració
45
+ up: Pujar
46
+ update:
47
+ invalid: S'han produït alguns errors en desar el qüestionari.
48
+ success: Els qüestionaris s'han desat correctament.
49
+ errors:
50
+ answer:
51
+ body: El camp no pot estar en blanc
52
+ question_types:
53
+ long_answer: Resposta llarga
54
+ multiple_option: Opció múltiple
55
+ short_answer: Resposta curta
56
+ single_option: Opció única
57
+ sorting: Ordenació
58
+ questionnaires:
59
+ answer:
60
+ invalid: S'han produït errors en respondre el qüestionari.
61
+ success: El qüestionari ha estat respost amb èxit.
62
+ question:
63
+ max_choices: 'Opcions màximes: %{n}'
64
+ show:
65
+ answer_questionnaire:
66
+ anonymous_user_message: <a href="%{sign_in_link}">Inicia sessió amb el teu compte</a> o <a href="%{sign_up_link}">registra't</a> per respondre el qüestionari.
67
+ title: Respon el qüestionari
68
+ are_you_sure: Aquesta acció no es pot desfer i no podràs editar les teves respostes. Estàs segur?
69
+ questionnaire_answered:
70
+ body: Ja has respost a aquest qüestionari.
71
+ title: Ja has respost
72
+ questionnaire_closed:
73
+ body: El qüestionari està tancat i no es pot respondre.
74
+ title: S'ha tancat el qüestionari
75
+ questionnaire_for_private_users:
76
+ body: El qüestionari només està disponible per a usuaris privats
77
+ title: S'ha tancat el qüestionari
78
+ submit: Enviar respostes
79
+ tos_agreement: En participar, acceptes els Termes i condicions d'ús
@@ -0,0 +1,79 @@
1
+ de:
2
+ activemodel:
3
+ attributes:
4
+ answer:
5
+ body: Antworten
6
+ question:
7
+ max_choices: Maximale Anzahl von Auswahlmöglichkeiten
8
+ question_type: Art
9
+ questionnaire_question:
10
+ mandatory: Verpflichtend
11
+ errors:
12
+ models:
13
+ answer:
14
+ attributes:
15
+ choices:
16
+ missing: sind nicht vollständig
17
+ too_many: sind zu viele
18
+ decidim:
19
+ forms:
20
+ admin:
21
+ models:
22
+ components:
23
+ description: Beschreibung
24
+ tos: Nutzungsbedingungen
25
+ questionnaires:
26
+ answer_option:
27
+ answer_option: Antwortoption
28
+ free_text: Freier Text
29
+ remove: Löschen
30
+ statement: Aussage
31
+ edit:
32
+ save: sparen
33
+ title: Titel
34
+ form:
35
+ add_question: Frage hinzufügen
36
+ already_answered_warning: Der Fragebogen wird bereits von einigen Benutzern beantwortet, sodass Sie die Fragen nicht ändern können.
37
+ question:
38
+ add_answer_option: Antwortoption hinzufügen
39
+ any: Irgendein
40
+ description: Beschreibung
41
+ down: Nieder
42
+ question: Frage
43
+ remove: Löschen
44
+ statement: Aussage
45
+ up: Oben
46
+ update:
47
+ invalid: Beim Speichern des Fragebogens sind Fehler aufgetreten.
48
+ success: Fragebögen wurden erfolgreich gespeichert.
49
+ errors:
50
+ answer:
51
+ body: Körper kann nicht leer sein
52
+ question_types:
53
+ long_answer: Lange Antwort
54
+ multiple_option: Mehrfachoption
55
+ short_answer: Kurze Antwort
56
+ single_option: Einzelne Option
57
+ sorting: Sortierung
58
+ questionnaires:
59
+ answer:
60
+ invalid: Bei der Beantwortung des Fragebogens sind Fehler aufgetreten.
61
+ success: Fragebogen erfolgreich beantwortet.
62
+ question:
63
+ max_choices: 'Max Auswahlmöglichkeiten: %{n}'
64
+ show:
65
+ answer_questionnaire:
66
+ anonymous_user_message: <a href="%{sign_in_link}">Melden Sie sich mit Ihrem Konto an</a> oder <a href="%{sign_up_link}">Melden Sie sich an</a> , um den Fragebogen zu beantworten.
67
+ title: Beantworten Sie den Fragebogen
68
+ are_you_sure: Diese Aktion kann nicht rückgängig gemacht werden und Sie können Ihre Antworten nicht bearbeiten. Bist du sicher?
69
+ questionnaire_answered:
70
+ body: Sie haben diesen Fragebogen bereits beantwortet.
71
+ title: Schon beantwortet
72
+ questionnaire_closed:
73
+ body: Der Fragebogen ist geschlossen und kann nicht beantwortet werden.
74
+ title: Fragebogen geschlossen
75
+ questionnaire_for_private_users:
76
+ body: Der Fragebogen ist nur für Privatanwender verfügbar
77
+ title: Fragebogen geschlossen
78
+ submit: einreichen
79
+ tos_agreement: Mit der Teilnahme stimmen Sie den Nutzungsbedingungen zu
@@ -0,0 +1,79 @@
1
+ en:
2
+ activemodel:
3
+ attributes:
4
+ answer:
5
+ body: Answer
6
+ question:
7
+ max_choices: Maximum number of choices
8
+ question_type: Type
9
+ questionnaire_question:
10
+ mandatory: Mandatory
11
+ errors:
12
+ models:
13
+ answer:
14
+ attributes:
15
+ choices:
16
+ missing: are not complete
17
+ too_many: are too many
18
+ decidim:
19
+ forms:
20
+ admin:
21
+ models:
22
+ components:
23
+ description: Description
24
+ tos: Terms of service
25
+ questionnaires:
26
+ answer_option:
27
+ answer_option: Answer option
28
+ free_text: Free text
29
+ remove: Remove
30
+ statement: Statement
31
+ edit:
32
+ save: Save
33
+ title: Title
34
+ form:
35
+ add_question: Add question
36
+ already_answered_warning: The questionnaire is already answered by some users so you cannot modify its questions.
37
+ question:
38
+ add_answer_option: Add answer option
39
+ any: Any
40
+ description: Description
41
+ down: Down
42
+ question: Question
43
+ remove: Remove
44
+ statement: Statement
45
+ up: Up
46
+ update:
47
+ invalid: There's been errors when saving the questionnaire.
48
+ success: Questionnaires saved successfully.
49
+ errors:
50
+ answer:
51
+ body: Body can't be blank
52
+ question_types:
53
+ long_answer: Long answer
54
+ multiple_option: Multiple option
55
+ short_answer: Short answer
56
+ single_option: Single option
57
+ sorting: Sorting
58
+ questionnaires:
59
+ answer:
60
+ invalid: There's been errors when answering the questionnaire.
61
+ success: Questionnaire answered successfully.
62
+ question:
63
+ max_choices: 'Max choices: %{n}'
64
+ show:
65
+ answer_questionnaire:
66
+ anonymous_user_message: <a href="%{sign_in_link}">Sign in with your account</a> or <a href="%{sign_up_link}">sign up</a> to answer the questionnaire.
67
+ title: Answer the questionnaire
68
+ are_you_sure: This action cannot be undone and you will not be able to edit your answers. Are you sure?
69
+ questionnaire_answered:
70
+ body: You have already answered this questionnaire.
71
+ title: Already answered
72
+ questionnaire_closed:
73
+ body: The questionnaire is closed and cannot be answered.
74
+ title: Questionnaire closed
75
+ questionnaire_for_private_users:
76
+ body: The questionnaire is available only for private users
77
+ title: Questionnaire closed
78
+ submit: Submit
79
+ tos_agreement: By participating you accept its Terms of Service
@@ -0,0 +1,79 @@
1
+ es-PY:
2
+ activemodel:
3
+ attributes:
4
+ answer:
5
+ body: Responder
6
+ question:
7
+ max_choices: Número máximo de opciones
8
+ question_type: Tipo
9
+ questionnaire_question:
10
+ mandatory: Obligatorio
11
+ errors:
12
+ models:
13
+ answer:
14
+ attributes:
15
+ choices:
16
+ missing: no están completos
17
+ too_many: son demasiados
18
+ decidim:
19
+ forms:
20
+ admin:
21
+ models:
22
+ components:
23
+ description: Descripción
24
+ tos: Términos y condiciones de uso
25
+ questionnaires:
26
+ answer_option:
27
+ answer_option: Opción de respuesta
28
+ free_text: Texto libre
29
+ remove: Retirar
30
+ statement: Declaración
31
+ edit:
32
+ save: Guardar
33
+ title: Título
34
+ form:
35
+ add_question: Añadir pregunta
36
+ already_answered_warning: Algunos usuarios ya han respondido al cuestionario, por lo que no puedes modificar las preguntas.
37
+ question:
38
+ add_answer_option: Añadir opción de respuesta
39
+ any: Alguna
40
+ description: Descripción
41
+ down: Abajo
42
+ question: Pregunta
43
+ remove: Borrar
44
+ statement: Declaración
45
+ up: Arriba
46
+ update:
47
+ invalid: Ha habido errores al guardar el cuestionario.
48
+ success: Cuestionarios guardados con éxito.
49
+ errors:
50
+ answer:
51
+ body: El campo no puede estar en blanco
52
+ question_types:
53
+ long_answer: Respuesta larga
54
+ multiple_option: Opción múltiple
55
+ short_answer: Respuesta corta
56
+ single_option: Opción única
57
+ sorting: Ordenación
58
+ questionnaires:
59
+ answer:
60
+ invalid: Ha habido errores al responder al cuestionario.
61
+ success: Has respondido al cuestionario con éxito.
62
+ question:
63
+ max_choices: 'Opciones máximas: %{n}'
64
+ show:
65
+ answer_questionnaire:
66
+ anonymous_user_message: <a href="%{sign_in_link}">Inicia sesión con tu cuenta</a> o <a href="%{sign_up_link}">regístrese</a> para responder al cuestionario.
67
+ title: Responde al cuestionario
68
+ are_you_sure: Esta acción no se puede deshacer y no podrás editar tus respuestas. ¿Estás seguro?
69
+ questionnaire_answered:
70
+ body: Ya has respondido este cuestionario.
71
+ title: Ya has respondido
72
+ questionnaire_closed:
73
+ body: El cuestionario está cerrado y ya no puedes responder.
74
+ title: Cuestionario cerrado
75
+ questionnaire_for_private_users:
76
+ body: El cuestionario está disponible solo para usuarios privados
77
+ title: Cuestionario cerrado
78
+ submit: Enviar
79
+ tos_agreement: Al responder aceptas los Términos y condiciones de uso