Files
survey-bundle/translations/messages.en.yaml
T
Jürgen Mummert db7094fd1e Fix frontend CSRF, clean reader URLs, and review findings
CSRF / actions:
- List action forms now send both REQUEST_TOKEN (Contao gate) and _token
  (Symfony, validated via isCsrfTokenValid) — mirrors the editor; fixes
  the 400/500 "Ungültiger CSRF-Token" on publish/toggle/duplicate/delete

Public reader / URLs:
- Reader & results read auto_item via Input::get (marks the route param used)
  so clean path URLs /<page>/<alias> no longer 404
- List controller generates path URLs via ['parameters' => '/'.$alias]
- Allow re-participation in the same session after a 60s cooldown

Review fixes:
- Results: merge answer snapshots by questionId+type (no more split cards on
  label edits); seed "Vielleicht" when allowMaybe so screen matches Excel
- Reader: replace generic answer hint with per-option "weiter zu Frage X"
  only when a jump is configured; strip HTML tags from survey description
- PDF: render free-text frequency summary; drop duplicate "Minimum" label
- Drag-sort: bundle SortableJS locally, drop the duplicated inline sort CSS/JS
  from _survey_assets, throttle the backend MutationObserver
- Backend: move hardcoded tl_survey operation labels to TL_LANG (de+en)
- Remove dead code: SurveyEditorVoter, SurveyPermissionService,
  categoryFilter/categorySummary + helpers, orphaned publishSurvey lang key

Reader layout:
- max-width 1000px (other views keep 1400px); back/next buttons fill the
  width as equal, card-sized halves; sort handle icon offset tweak

Docs: update AI_HANDOVER (dual-token CSRF, clean URLs) and README

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 13:00:05 +02:00

157 lines
6.4 KiB
YAML

survey:
list:
login_required: "This area uses the regular Contao member login. Please place the module on a protected page or provide a separate login page."
create: "Create new survey"
duplicate: "Duplicate"
duplicate_confirm: "Are you sure you want to duplicate the survey \"%title%\" with all questions?"
delete: "Delete"
delete_confirm: "Delete this survey? This will permanently remove all questions, answers, and results as well. Alternatively, you can simply deactivate the survey temporarily."
delete_confirm_second: "Are you really sure?"
published: "published"
draft: "Draft"
locked: "locked"
active: "active"
inactive: "inactive"
questions: "%count% questions"
participations: "%count% participations"
edit: "Edit"
public_view: "Public view"
draft_view: "Draft view"
show_results: "Show results"
publish: "Publish survey"
publish_done: "Survey published"
publish_help: "Publish survey. No further changes will be possible afterwards."
empty: "There is currently no survey assigned to the logged-in member."
edit:
login_required: "This frontend module is intended for logged-in members. Please use the regular Contao member login on a protected page."
entry_not_allowed: "This page cannot be opened directly. Please switch to edit mode via the survey list."
create_title: "Create new survey"
label_title: "Title"
label_survey_title: "Survey title"
label_description: "Description"
create_submit: "Create survey"
back_to_list: "Back to list"
editors: "Editors"
editors_count: "%count% member(s)"
published: "published"
draft: "draft"
locked: "locked"
structure_locked: "The questions of this survey are locked because the survey was published or first participations already exist. The metadata can still be maintained."
publish_confirm: "Are you really sure? After the survey has been published, no further changes will be possible!"
deactivate_survey: "Temporarily deactivate survey"
activate_survey: "Reactivate survey"
save: "Save"
save_metadata: "Save metadata"
save_this_question: "Save this question"
save_new_question: "Save new question"
dirty_metadata: "Unsaved changes in metadata"
dirty_question: "Unsaved changes in this question"
dirty_new_question: "Unsaved changes in the new question"
editors_title: "Editing members"
no_editors: "No editors configured."
responses_title: "Answers and results"
completed: "completed"
open: "open"
started_at: "Started"
completed_at: "Completed"
unknown: "unknown"
participation_code: "Participation code"
no_submissions: "No participations yet."
questions_title: "Edit questions"
edit_mode: "Edit mode"
label_type: "Question type"
label_question: "Question"
mandatory: "Required question"
active: "Active"
allow_maybe: "Offer maybe"
jump_yes: "Jump to question on yes"
jump_no: "Jump to question on no"
allow_multiple: "Enable multiple choice"
answer_option: "Answer %number%"
range_min: "Minimum value"
range_max: "Maximum value"
range_step: "Step size"
update_question: "Update question"
save_question: "Save question"
mandatory_badge: "Required"
start_badge: "Start"
no_extra_description: "No additional description."
delete_question_confirm: "Delete this question?"
delete: "Delete"
no_questions: "No questions created yet."
new_question: "Create new question"
reorder_question: "Reorder question"
save_question_order: "Save new order"
open_question: "Open accordion"
close_question: "Close accordion"
conditions_title: "Jump rules"
source_question: "Source question"
answer: "Answer"
next_question: "Next question"
update_condition: "Update condition"
save_condition: "Save condition"
condition_prefix: "If answer = %value%"
continue_to: "continue to %target%"
question_fallback: "Question #%id%"
edit_condition: "Edit"
delete_condition_confirm: "Delete this condition?"
no_conditions: "No conditions defined yet."
survey:
default_description: "Please answer the following questions. Each question is shown individually."
thanks_title: "Thank you for completing the survey."
thanks_text: "Your answers have been stored anonymously. No participant identity was linked to this survey run."
question_type_yes_no_maybe: "Yes/No/Maybe"
question_type_choice: "Choice"
question_type_range: "Rating"
question_type_text: "Free text"
answer_yes: "Yes"
answer_no: "No"
answer_maybe: "Maybe"
question_progress: "Question %current%"
jump_to: "continue to question %position%: %label%"
current_value: "Current value"
back: "Back"
next: "Next"
preview_badge: "Draft"
preview_notice: "This is a draft view. Answers can be tested, but they will not be stored."
preview_thanks_text: "The test run is complete. Answers were not stored."
results:
no_description: "No description available."
completed_submissions: "%count% completed participations"
participations: "%count% participations"
questions: "%count% questions"
download_excel: "Download results as Excel"
download_pdf: "Download results as PDF"
answers: "%count% answers"
response_rate: "%rate%% response rate"
minimum: "Minimum"
maximum: "Maximum"
average: "Average"
no_ratings: "No ratings available yet."
no_text_responses: "No free-text responses available yet."
no_questions: "No questions have been created for this survey yet."
pdf:
no_description: "No description available."
completed_submissions: "%count% completed participations"
participations: "%count% participations"
questions: "%count% questions"
export_prefix: "Export %date%"
answers: "%count% answers"
response_rate: "%rate%% response rate"
minimum: "Minimum"
maximum: "Maximum"
average: "Average"
chart_hint: "The points are color-coded to match the values in the table."
color: "Color"
option: "Option"
value: "Value"
answer_group: "Answer group"
count: "Count"
share: "Share"
no_data: "No data available yet."
no_ratings: "No ratings available yet."
no_text_responses: "No free-text responses available yet."
no_questions_title: "No questions available"
no_questions_text: "No questions have been created for this survey yet."
footer: "Survey bundle PDF export"