refactor: move help content out of translations into locale-specific partials

Replace the instructions translation domain with plain HTML files under
templates/backoffice/help/nl/. Each help/*.html.twig is now a locale
dispatch shim that tries the current locale first and falls back to nl,
so adding English (or any other language) is simply a matter of creating
a help/en/ directory with the translated files — no code changes needed.

Removes instructions+intl-icu.nl.xliff.
This commit is contained in:
2026-07-04 23:18:27 +02:00
parent 482ca8be7e
commit 052268e042
31 changed files with 133 additions and 382 deletions
+4 -10
View File
@@ -1,10 +1,4 @@
<h6>{{ 'Getting started'|trans({}, 'instructions') }}</h6>
<p>{{ 'Each season groups one play round with all its quizzes and candidates. The season code is the link candidates use to start a quiz — this link only works when there is an active quiz.'|trans({}, 'instructions') }}</p>
<h6>{{ 'How it works'|trans({}, 'instructions') }}</h6>
<ol>
<li><strong>{{ 'Create a season and add candidates'|trans({}, 'instructions') }}</strong></li>
<li><strong>{{ 'Add a quiz via XLSX or the question bank'|trans({}, 'instructions') }}</strong></li>
<li>{{ 'Finalize and activate the quiz'|trans({}, 'instructions') }}</li>
<li>{{ 'Let candidates take the quiz (own device or shared laptop)'|trans({}, 'instructions') }}</li>
<li>{{ 'View results and start the elimination'|trans({}, 'instructions') }}</li>
</ol>
{{ include([
'backoffice/help/' ~ app.request.locale ~ '/index.html.twig',
'backoffice/help/nl/index.html.twig',
]) }}
@@ -0,0 +1,10 @@
<h6>Aan de slag</h6>
<p>Elk seizoen groepeert één speelronde met alle bijbehorende testen en kandidaten. De seizoenscode is de link die kandidaten gebruiken om een test te starten — deze link is alleen actief als er een actieve test is.</p>
<h6>Globale werkwijze</h6>
<ol>
<li><strong>Seizoen aanmaken</strong> en kandidaten toevoegen</li>
<li><strong>Test aanmaken</strong> via XLSX of de vragenbank</li>
<li>Test <strong>afronden</strong> en <strong>activeren</strong></li>
<li>Kandidaten laten <strong>deelnemen</strong> (eigen apparaat of gedeelde laptop)</li>
<li><strong>Resultaten</strong> bekijken en eliminatie starten</li>
</ol>
@@ -0,0 +1,3 @@
<h6>Eliminatie voorbereiden</h6>
<p>Kies voor elke kandidaat een kleur: <strong>groen</strong> betekent veilig, <strong>rood</strong> betekent geëlimineerd.</p>
<p>Gebruik <strong>Opslaan en starten</strong> om de eliminatie direct af te spelen, of sla eerst op en start later via het tabblad Resultaten.</p>
@@ -0,0 +1,8 @@
<h6>Test uploaden via XLSX</h6>
<p>Upload een XLSX-bestand met de vragen voor deze test. Na het uploaden kun je de vragen bekijken, controleren en de test afronden.</p>
<h6>Verwacht formaat</h6>
<ul>
<li>Eerste kolom: de vraagtekst</li>
<li>Volgende kolommen: de antwoordopties</li>
<li>Markeer het juiste antwoord via de spreadsheet</li>
</ul>
@@ -0,0 +1,3 @@
<h6>Lege test aanmaken</h6>
<p>Maak een lege test aan en voeg vragen toe vanuit de vragenbank. Handig als je vragen hergebruikt of ze van tevoren in de bank hebt klaargezet.</p>
<p>Na het aanmaken open je de test, voeg je vragen toe via het tabblad Overzicht en ronde je de test af voordat je hem activeert.</p>
@@ -0,0 +1,3 @@
<h6>Antwoorden invullen</h6>
<p>Gebruik dit overzicht om handmatig antwoorden toe te wijzen — bijvoorbeeld bij technische problemen of als iemand de test op papier heeft ingevuld.</p>
<p>Navigeer met de knoppen Vorige en Volgende tussen vragen. Vink per kandidaat het gegeven antwoord aan en sla op.</p>
@@ -0,0 +1,6 @@
<h6>Kandidaten laten deelnemen</h6>
<p>Kandidaten kunnen de test op twee manieren invullen:</p>
<p><strong>Optie 1 — eigen apparaat:</strong> Deel de seizoenscode. Elke kandidaat bezoekt de site op zijn of haar telefoon, voert de eigen naam in en start de test.</p>
<p><strong>Optie 2 — gedeelde laptop:</strong> Open de naamsinvoerpagina van tevoren op een laptop. Elke kandidaat typt zijn of haar naam en start. Na afloop kan de volgende kandidaat hetzelfde doen.</p>
<h6>Status</h6>
<p>Deactiveer een kandidaat als deze de test niet hoeft te maken, bijvoorbeeld na eerder uitgeschakeld zijn. Deactivering is per test en heeft geen invloed op andere testen.</p>
@@ -0,0 +1,5 @@
<h6>Overzicht &amp; afronden</h6>
<p>Vragen met een rode markering in de lijst hiernaast bevatten een fout. Herstel deze vóór het afronden.</p>
<p><strong>Afronden</strong> vergrendelt de test voor bewerking en maakt hem klaar voor kandidaten. Daarna kun je hem activeren.</p>
<p><strong>Activeren</strong> stelt de test beschikbaar aan kandidaten. Er kan maar één test tegelijk actief zijn — activeer de volgende test pas als iedereen de huidige heeft afgerond.</p>
<p><strong>Test wissen</strong> verwijdert alle gegeven antwoorden en heft het afronden op, zodat je de test opnieuw kunt bewerken en uitvoeren.</p>
@@ -0,0 +1,4 @@
<h6>Vraag toevoegen</h6>
<p>Voer de vraag in en voeg minimaal twee antwoordopties toe. Markeer precies één antwoord als correct.</p>
<p>Gebruik labels om vragen te organiseren in de vragenbank, bijvoorbeeld per aflevering of thema.</p>
<p>Markeer een vraag als <em>herbruikbaar</em> als deze in meerdere testen mag voorkomen — anders kan een vraag maar aan één test worden gekoppeld.</p>
@@ -0,0 +1,5 @@
<h6>Resultaten</h6>
<p>De tabel toont het eindresultaat per kandidaat gesorteerd op score. Rode rijen zijn de kandidaten met de laagste score die risico lopen op eliminatie.</p>
<p><strong>Correcties</strong> voeg je toe voor bonuspunten of jokeraftrek (halve punten zijn mogelijk).</p>
<p><strong>Straf</strong> is tijdstraf in seconden en wordt meegewogen bij gelijke score.</p>
<p>Via <strong>Eliminatie voorbereiden</strong> stel je de schermkleuren handmatig in en start je de eliminatiereeks.</p>
@@ -0,0 +1,3 @@
<h6>Nieuw seizoen</h6>
<p>Een seizoen groepeert alle testen en kandidaten voor één speelronde. Geef het seizoen een herkenbare naam — de seizoenscode wordt automatisch gegenereerd.</p>
<p>Na het aanmaken voeg je kandidaten toe en maak je testen aan via de seizoenpagina.</p>
@@ -0,0 +1,3 @@
<h6>Kandidaten toevoegen</h6>
<p>Voer één naam per regel in. Dit zijn de spelers die deelnemen aan dit seizoen.</p>
<p>Je kunt later altijd nog kandidaten toevoegen via het tabblad Kandidaten. Gebruik dezelfde schrijfwijze van namen die je in het spel gebruikt.</p>
@@ -0,0 +1,3 @@
<h6>Kandidaten</h6>
<p>Dit zijn de spelers van dit seizoen. Voeg alle deelnemers toe voordat je de eerste test start — kandidaten worden automatisch aan nieuwe testen gekoppeld.</p>
<p>Namen zijn vrij in te voeren; gebruik dezelfde schrijfwijze die je in het spel gebruikt.</p>
@@ -0,0 +1,3 @@
<h6>Vragenbank</h6>
<p>De vragenbank is een bibliotheek met vragen die aan meerdere testen kunnen worden gekoppeld. Markeer een vraag als <em>herbruikbaar</em> als deze in meerdere testen mag voorkomen (bijv. "Wie is de Mol?").</p>
<p>Na het bewerken van een bankenvraag worden testen die de vraag al bevatten <strong>niet</strong> automatisch bijgewerkt — gebruik de synchronisatieknop (↻) naast een test om de meest recente versie door te zetten.</p>
@@ -0,0 +1,3 @@
<h6>Seizoensinstellingen</h6>
<p>Pas hier de naam en overige instellingen van dit seizoen aan.</p>
<p>De seizoenscode staat vast na aanmaken en bepaalt de URL die kandidaten gebruiken om in te loggen.</p>
@@ -0,0 +1,11 @@
<h6>Testen beheren</h6>
<p>Voeg een test toe vanuit een XLSX-bestand of maak een lege test aan en vul deze via de vragenbank. Open daarna de test om hem te bekijken en af te ronden.</p>
<p>Een test moet eerst <strong>afgerond</strong> zijn voordat je hem kunt activeren. Slechts één test kan tegelijk actief zijn — dit is de test die kandidaten op dat moment kunnen invullen.</p>
<h6>Volgorde van werken</h6>
<ol>
<li>Test aanmaken (XLSX of leeg)</li>
<li>Vragen controleren en test afronden</li>
<li>Test activeren</li>
<li>Kandidaten laten deelnemen</li>
<li>Resultaten bekijken en eliminatie voorbereiden</li>
</ol>
@@ -1,3 +1,4 @@
<h6>{{ 'Prepare elimination'|trans({}, 'instructions') }}</h6>
<p>{{ 'Choose a colour for each candidate: green means safe, red means eliminated.'|trans({}, 'instructions') }}</p>
<p>{{ 'Use Save and start to play the elimination immediately, or save first and start later via the Results tab.'|trans({}, 'instructions') }}</p>
{{ include([
'backoffice/help/' ~ app.request.locale ~ '/prepare_elimination.html.twig',
'backoffice/help/nl/prepare_elimination.html.twig',
]) }}
+4 -8
View File
@@ -1,8 +1,4 @@
<h6>{{ 'Upload quiz via XLSX'|trans({}, 'instructions') }}</h6>
<p>{{ 'Upload an XLSX file with the questions for this quiz. After uploading you can review, check and finalize the quiz.'|trans({}, 'instructions') }}</p>
<h6>{{ 'Expected format'|trans({}, 'instructions') }}</h6>
<ul>
<li>{{ 'First column: question text'|trans({}, 'instructions') }}</li>
<li>{{ 'Next columns: answer options'|trans({}, 'instructions') }}</li>
<li>{{ 'Mark the correct answer in the spreadsheet'|trans({}, 'instructions') }}</li>
</ul>
{{ include([
'backoffice/help/' ~ app.request.locale ~ '/quiz_add.html.twig',
'backoffice/help/nl/quiz_add.html.twig',
]) }}
@@ -1,3 +1,4 @@
<h6>{{ 'Create blank quiz'|trans({}, 'instructions') }}</h6>
<p>{{ 'Create an empty quiz and add questions from the question bank. Useful if you reuse questions or have prepared them in the bank in advance.'|trans({}, 'instructions') }}</p>
<p>{{ 'After creating, open the quiz, add questions via the Overview tab and finalize the quiz before activating it.'|trans({}, 'instructions') }}</p>
{{ include([
'backoffice/help/' ~ app.request.locale ~ '/quiz_add_blank.html.twig',
'backoffice/help/nl/quiz_add_blank.html.twig',
]) }}
@@ -1,3 +1,4 @@
<h6>{{ 'Fill in answers'|trans({}, 'instructions') }}</h6>
<p>{{ 'Use this overview to manually assign answers — for example in case of technical problems or if someone took the quiz on paper.'|trans({}, 'instructions') }}</p>
<p>{{ 'Navigate between questions using the Previous and Next buttons. Tick the given answer per candidate and save.'|trans({}, 'instructions') }}</p>
{{ include([
'backoffice/help/' ~ app.request.locale ~ '/quiz_answer_mapping.html.twig',
'backoffice/help/nl/quiz_answer_mapping.html.twig',
]) }}
@@ -1,6 +1,4 @@
<h6>{{ 'Let candidates take the quiz'|trans({}, 'instructions') }}</h6>
<p>{{ 'Candidates can take the quiz in two ways:'|trans({}, 'instructions') }}</p>
<p>{{ 'Option 1 — own device: Share the season code. Each candidate visits the site on their phone, enters their own name and starts the quiz.'|trans({}, 'instructions') }}</p>
<p>{{ 'Option 2 — shared laptop: Open the name entry page in advance on a laptop. Each candidate types their name and starts. After finishing, the next candidate can do the same.'|trans({}, 'instructions') }}</p>
<h6>{{ 'Status'|trans({}, 'instructions') }}</h6>
<p>{{ 'Deactivate a candidate if they should not take this quiz, for example after being eliminated earlier. Deactivation is per quiz and does not affect other quizzes.'|trans({}, 'instructions') }}</p>
{{ include([
'backoffice/help/' ~ app.request.locale ~ '/quiz_candidates.html.twig',
'backoffice/help/nl/quiz_candidates.html.twig',
]) }}
@@ -1,5 +1,4 @@
<h6>{{ 'Overview & finalize'|trans({}, 'instructions') }}</h6>
<p>{{ 'Questions with a red marker in the list have an error. Fix these before finalizing.'|trans({}, 'instructions') }}</p>
<p><strong>{{ 'Finalize'|trans }}</strong> — {{ 'Finalize locks the quiz for editing and makes it ready for candidates. You can then activate it.'|trans({}, 'instructions') }}</p>
<p><strong>{{ 'Make active'|trans }}</strong> — {{ 'Activate makes the quiz available to candidates. Only one quiz can be active at a time — only activate the next quiz when everyone has completed the current one.'|trans({}, 'instructions') }}</p>
<p><strong>{{ 'Clear Quiz...'|trans }}</strong> — {{ 'Clear quiz removes all given answers and undoes finalization, so you can edit and run the quiz again.'|trans({}, 'instructions') }}</p>
{{ include([
'backoffice/help/' ~ app.request.locale ~ '/quiz_overview.html.twig',
'backoffice/help/nl/quiz_overview.html.twig',
]) }}
@@ -1,4 +1,4 @@
<h6>{{ 'Add question'|trans({}, 'instructions') }}</h6>
<p>{{ 'Enter the question and add at least two answer options. Mark exactly one answer as correct.'|trans({}, 'instructions') }}</p>
<p>{{ 'Use labels to organise questions in the question bank, for example by episode or theme.'|trans({}, 'instructions') }}</p>
<p>{{ 'Mark a question as reusable if it may appear in multiple quizzes — otherwise a question can only be linked to one quiz.'|trans({}, 'instructions') }}</p>
{{ include([
'backoffice/help/' ~ app.request.locale ~ '/quiz_question_bank_form.html.twig',
'backoffice/help/nl/quiz_question_bank_form.html.twig',
]) }}
@@ -1,5 +1,4 @@
<h6>{{ 'Results'|trans({}, 'instructions') }}</h6>
<p>{{ 'The table shows the final result per candidate sorted by score. Red rows are the candidates with the lowest score who are at risk of elimination.'|trans({}, 'instructions') }}</p>
<p><strong>{{ 'Corrections'|trans }}</strong> — {{ 'Corrections are added for bonus points or joker deductions (half points are possible).'|trans({}, 'instructions') }}</p>
<p><strong>{{ 'Penalty'|trans }}</strong> — {{ 'Penalty is a time penalty in seconds and is taken into account when scores are tied.'|trans({}, 'instructions') }}</p>
<p>{{ 'Via Prepare elimination you set the screen colours manually and start the elimination sequence.'|trans({}, 'instructions') }}</p>
{{ include([
'backoffice/help/' ~ app.request.locale ~ '/quiz_result.html.twig',
'backoffice/help/nl/quiz_result.html.twig',
]) }}
@@ -1,3 +1,4 @@
<h6>{{ 'New season'|trans({}, 'instructions') }}</h6>
<p>{{ 'A season groups all quizzes and candidates for one play round. Give the season a recognisable name — the season code is generated automatically.'|trans({}, 'instructions') }}</p>
<p>{{ 'After creating, add candidates and quizzes from the season page.'|trans({}, 'instructions') }}</p>
{{ include([
'backoffice/help/' ~ app.request.locale ~ '/season_add.html.twig',
'backoffice/help/nl/season_add.html.twig',
]) }}
@@ -1,3 +1,4 @@
<h6>{{ 'Add candidates'|trans({}, 'instructions') }}</h6>
<p>{{ 'Enter one name per line. These are the players participating in this season.'|trans({}, 'instructions') }}</p>
<p>{{ 'You can always add more candidates later via the Candidates tab. Use the same spelling of names you use in the game.'|trans({}, 'instructions') }}</p>
{{ include([
'backoffice/help/' ~ app.request.locale ~ '/season_add_candidates.html.twig',
'backoffice/help/nl/season_add_candidates.html.twig',
]) }}
@@ -1,3 +1,4 @@
<h6>{{ 'Candidates'|trans({}, 'instructions') }}</h6>
<p>{{ 'These are the players of this season. Add all participants before starting the first quiz — candidates are automatically linked to new quizzes.'|trans({}, 'instructions') }}</p>
<p>{{ 'Names are entered freely; use the same spelling you use in the game.'|trans({}, 'instructions') }}</p>
{{ include([
'backoffice/help/' ~ app.request.locale ~ '/season_candidates.html.twig',
'backoffice/help/nl/season_candidates.html.twig',
]) }}
@@ -1,3 +1,4 @@
<h6>{{ 'Question bank'|trans({}, 'instructions') }}</h6>
<p>{{ "The question bank is a library of questions that can be linked to multiple quizzes. Mark a question as reusable if it may appear in multiple quizzes (e.g. 'Who is de Mol?')."|trans({}, 'instructions') }}</p>
<p>{{ 'After editing a bank question, quizzes that already contain it are not updated automatically — use the sync button next to a quiz to push the latest version.'|trans({}, 'instructions') }}</p>
{{ include([
'backoffice/help/' ~ app.request.locale ~ '/season_question_bank.html.twig',
'backoffice/help/nl/season_question_bank.html.twig',
]) }}
@@ -1,3 +1,4 @@
<h6>{{ 'Season settings'|trans({}, 'instructions') }}</h6>
<p>{{ 'Adjust the name and other settings for this season here.'|trans({}, 'instructions') }}</p>
<p>{{ 'The season code is fixed after creation and determines the URL candidates use to log in.'|trans({}, 'instructions') }}</p>
{{ include([
'backoffice/help/' ~ app.request.locale ~ '/season_settings.html.twig',
'backoffice/help/nl/season_settings.html.twig',
]) }}
@@ -1,11 +1,4 @@
<h6>{{ 'Managing quizzes'|trans({}, 'instructions') }}</h6>
<p>{{ 'Add a quiz from an XLSX file or create a blank one and fill it via the question bank. Then open the quiz to review and finalize it.'|trans({}, 'instructions') }}</p>
<p>{{ 'A quiz must be finalized before it can be activated. Only one quiz can be active at a time — this is the quiz candidates can currently take.'|trans({}, 'instructions') }}</p>
<h6>{{ 'Order of operations'|trans({}, 'instructions') }}</h6>
<ol>
<li>{{ 'Create the quiz (XLSX or blank)'|trans({}, 'instructions') }}</li>
<li>{{ 'Review questions and finalize the quiz'|trans({}, 'instructions') }}</li>
<li>{{ 'Activate the quiz'|trans({}, 'instructions') }}</li>
<li>{{ 'Let candidates take the quiz'|trans({}, 'instructions') }}</li>
<li>{{ 'View results and prepare the elimination'|trans({}, 'instructions') }}</li>
</ol>
{{ include([
'backoffice/help/' ~ app.request.locale ~ '/season_tests.html.twig',
'backoffice/help/nl/season_tests.html.twig',
]) }}