Refactor translations to XLIFF format, enhance elimination workflows, and update compose configuration

This commit switches translations from YAML to XLIFF format for better standardization, updates the elimination preparation process with UI and functionality improvements, tweaks form structures, adjusts compose.override.yaml for improved asset handling, and optimizes back office usability with refined translation handling.
This commit is contained in:
2025-06-01 21:16:32 +02:00
parent cd5946bda8
commit c6f9b57c60
27 changed files with 645 additions and 114 deletions

View File

@@ -23,7 +23,7 @@ fixtures:
docker compose exec php bin/console doctrine:fixtures:load --purge-with-truncate --no-interaction
translations:
docker compose exec php bin/console translation:extract --domain=messages --force --format=yaml --sort=asc --clean nl
docker compose exec php bin/console translation:extract --force --format=xliff --sort=asc --clean nl
fix-cs:
docker compose exec php vendor/bin/php-cs-fixer fix

View File

@@ -1,4 +1,4 @@
import 'bootstrap/dist/css/bootstrap.min.css'
import * as bootstrap from 'bootstrap'
import './styles/app.scss';
import './styles/backoffice.scss';

BIN
assets/img/green.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 479 KiB

BIN
assets/img/red.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 KiB

View File

@@ -2,3 +2,23 @@ import 'bootstrap/dist/css/bootstrap.min.css'
import * as bootstrap from 'bootstrap'
import './styles/quiz.scss'
document.addEventListener('DOMContentLoaded', function() {
// Check if we're on the elimination candidate screen
const eliminationScreen = document.querySelector('.elimination-screen');
if (eliminationScreen) {
// Add event listener for any keypress
document.addEventListener('keydown', function(event) {
// Get the current URL
const currentUrl = window.location.href;
// Extract the elimination ID from the URL
const urlParts = currentUrl.split('/');
// Remove the candidate hash (last part of the URL)
urlParts.pop();
// Construct the URL to the main elimination page
const redirectUrl = urlParts.join('/');
// Redirect to the main elimination page
window.location.href = redirectUrl;
});
}
});

View File

@@ -10,3 +10,17 @@ html, body {
align-items: center;
justify-self: center;
}
.elimination-screen {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100vh;
object-fit: contain;
background-color: white;
z-index: 1000;
display: flex;
justify-content: center;
align-items: center;
}

View File

@@ -9,6 +9,7 @@ services:
- ./frankenphp/Caddyfile:/etc/caddy/Caddyfile:ro
- ./frankenphp/conf.d/20-app.dev.ini:/usr/local/etc/php/app.conf.d/20-app.dev.ini:ro
- ./frankenphp/data:/data
- sass:/app/var/sass
environment:
MERCURE_EXTRA_DIRECTIVES: demo
# See https://xdebug.org/docs/all_settings#mode
@@ -34,7 +35,8 @@ services:
sass:
image: ${IMAGES_PREFIX:-}app-php
volumes:
- ./:/app
- ./:/app:ro
- sass:/app/var/sass
entrypoint: ''
depends_on:
- php
@@ -42,6 +44,7 @@ services:
- bin/console
- sass:build
- --watch
- -v
###> symfony/mercure-bundle ###
###< symfony/mercure-bundle ###
@@ -62,3 +65,6 @@ services:
MP_SMTP_AUTH_ACCEPT_ANY: 1
MP_SMTP_AUTH_ALLOW_INSECURE: 1
###< symfony/mailer ###
volumes:
sass:

View File

@@ -31,7 +31,7 @@ class ClaimSeasonCommand extends Command
protected function configure(): void
{
$this
->addArgument('email', InputArgument::REQUIRED, 'The email of the user to make admin')
->addArgument('email', InputArgument::REQUIRED, 'The email of the user thats claims the season')
->addArgument('season', InputArgument::REQUIRED, 'The season to claim')
;
}

View File

@@ -2,7 +2,7 @@
declare(strict_types=1);
namespace App\Controller;
namespace App\Controller\Backoffice;
use App\Entity\Elimination;
use App\Entity\Quiz;
@@ -31,6 +31,9 @@ final class PrepareEliminationController extends AbstractController
$elimination->updateFromInputBag($request->request);
$em->flush();
if (true === $request->request->getBoolean('start')) {
return $this->redirectToRoute('app_elimination', ['elimination' => $elimination->getId()]);
}
$this->addFlash('success', 'Elimination updated');
}

View File

@@ -5,12 +5,14 @@ declare(strict_types=1);
namespace App\Controller;
use App\Entity\Candidate;
use App\Entity\Season;
use App\Entity\Elimination;
use App\Enum\FlashType;
use App\Form\EliminationEnterNameType;
use App\Helpers\Base64;
use App\Repository\CandidateRepository;
use App\Security\Voter\SeasonVoter;
use Symfony\Bridge\Doctrine\Attribute\MapEntity;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Attribute\AsController;
use Symfony\Component\Routing\Attribute\Route;
@@ -25,30 +27,50 @@ final class EliminationController extends AbstractController
{
public function __construct(private readonly TranslatorInterface $translator) {}
#[Route('/elimination/{seasonCode}', name: 'app_elimination')]
#[IsGranted(SeasonVoter::ELIMINATION, 'season')]
public function index(#[MapEntity] Season $season): Response
#[Route('/elimination/{elimination}', name: 'app_elimination')]
#[IsGranted(SeasonVoter::ELIMINATION, 'elimination')]
public function index(#[MapEntity] Elimination $elimination, Request $request): Response
{
return $this->render('elimination/index.html.twig', [
$form = $this->createForm(EliminationEnterNameType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$name = $form->get('name')->getData();
return $this->redirectToRoute('app_elimination_candidate', ['elimination' => $elimination->getId(), 'candidateHash' => Base64::base64UrlEncode($name)]);
}
return $this->render('quiz/elimination/index.html.twig', [
'form' => $form,
'controller_name' => 'EliminationController',
]);
}
#[Route('/elimination/{seasonCode}/{candidateHash}', name: 'app_elimination_cadidate')]
#[IsGranted(SeasonVoter::ELIMINATION, 'season')]
public function candidateScreen(Season $season, string $candidateHash, CandidateRepository $candidateRepository): Response
#[Route('/elimination/{elimination}/{candidateHash}', name: 'app_elimination_candidate')]
#[IsGranted(SeasonVoter::ELIMINATION, 'elimination')]
public function candidateScreen(Elimination $elimination, string $candidateHash, CandidateRepository $candidateRepository): Response
{
$candidate = $candidateRepository->getCandidateByHash($season, $candidateHash);
$candidate = $candidateRepository->getCandidateByHash($elimination->getQuiz()->getSeason(), $candidateHash);
if (!$candidate instanceof Candidate) {
$this->addFlash(FlashType::Warning,
t('Cound not find candidate with name %name%', ['%name%' => Base64::base64UrlDecode($candidateHash)])->trans($this->translator)
);
throw new \InvalidArgumentException('Candidate not found');
return $this->redirectToRoute('app_elimination', ['elimination' => $elimination->getId()]);
}
return $this->render('elimination/candidate.html.twig', [
'season' => $season,
$screenColour = $elimination->getScreenColour($candidate->getName());
if (null === $screenColour) {
$this->addFlash(FlashType::Warning, $this->translator->trans('Cound not find candidate with name %name% in elimination.', ['%name%' => $candidate->getName()]));
return $this->redirectToRoute('app_elimination', ['elimination' => $elimination->getId()]);
}
return $this->render('quiz/elimination/candidate.html.twig', [
'candidate' => $candidate,
'colour' => $screenColour,
]);
}
}

View File

@@ -76,6 +76,11 @@ class Elimination
return $this;
}
public function getScreenColour(?string $name): ?string
{
return $this->data[$name] ?? null;
}
#[ORM\PrePersist]
public function setCreatedAtValue(): void
{

View File

@@ -0,0 +1,30 @@
<?php
declare(strict_types=1);
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
/** @extends AbstractType<null> */
class EliminationEnterNameType extends AbstractType
{
public function __construct(private readonly TranslatorInterface $translator) {}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('name', TextType::class,
[
'required' => true,
'label' => $this->translator->trans('Enter name'),
'translation_domain' => false,
'attr' => ['autofocus' => true],
],
)
;
}
}

View File

@@ -22,6 +22,7 @@ class EnterNameType extends AbstractType
'required' => true,
'label' => $this->translator->trans('Enter your name'),
'translation_domain' => false,
'attr' => ['autofocus' => true],
],
)
;

View File

@@ -19,10 +19,13 @@ class SelectSeasonType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('season_code', TextType::class,
['required' => true, 'constraints' => new Regex(pattern: "/^[A-Za-z\d]{5}$/"), 'label' => $this->translator->trans('Season Code'), 'translation_domain' => false]
)
;
->add('season_code', TextType::class, [
'required' => true,
'constraints' => new Regex(pattern: "/^[A-Za-z\d]{5}$/"),
'label' => $this->translator->trans('Season Code'),
'translation_domain' => false,
'attr' => ['autofocus' => true],
]);
}
public function configureOptions(OptionsResolver $resolver): void

View File

@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Security\Voter;
use App\Entity\Elimination;
use App\Entity\Season;
use App\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
@@ -21,10 +22,10 @@ final class SeasonVoter extends Voter
protected function supports(string $attribute, mixed $subject): bool
{
return \in_array($attribute, [self::EDIT, self::DELETE, self::ELIMINATION], true)
&& $subject instanceof Season;
&& ($subject instanceof Season || $subject instanceof Elimination);
}
/** @param Season $subject */
/** @param Season|Elimination $subject */
protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token): bool
{
$user = $token->getUser();
@@ -36,8 +37,10 @@ final class SeasonVoter extends Voter
return true;
}
$season = $subject instanceof Season ? $subject : $subject->getQuiz()->getSeason();
return match ($attribute) {
self::EDIT, self::DELETE, self::ELIMINATION => $subject->isOwner($user),
self::EDIT, self::DELETE, self::ELIMINATION => $season->isOwner($user),
default => false,
};
}

View File

@@ -24,16 +24,18 @@
<div class="col-4">
<select id="colour-{{ candidate|lower }}" class="form-select"
name="colour-{{ candidate|lower }}">
<option value="green"{% if colour == 'green' %} selected{% endif %}>Green</option>
<option value="red"{% if colour == 'red' %} selected{% endif %}>Red</option>
<option
value="green"{% if colour == 'green' %} selected{% endif %}>{{ 'Green'|trans }}</option>
<option
value="red"{% if colour == 'red' %} selected{% endif %}>{{ 'Red'|trans }}</option>
</select>
</div>
</div>
{% endfor %}
<div class="btn-group py-2">
<button type="submit" class="btn btn-primary" name="start" value="1">{{ 'Save'|trans }}</button>
<button type="submit" class="btn btn-primary" name="start" value="0">{{ 'Save'|trans }}</button>
<button type="submit" class="btn btn-success" name="start"
value="0">{{ 'Save and start elimination'|trans }}</button>
value="1">{{ 'Save and start elimination'|trans }}</button>
<a href="{{ path('app_backoffice_quiz', {seasonCode: elimination.quiz.season.seasonCode, quiz: elimination.quiz.id}) }}"
class="btn btn-secondary">{{ 'Back'|trans }}</a>
</div>

View File

@@ -53,7 +53,7 @@
<h4 class="py-2">{{ 'Score'|trans }}</h4>
<div class="btn-toolbar" role="toolbar">
<div class="btn-group btn-group-lg me-2">
<a class="btn btn-primary">{{ 'Start Elimination'|trans }}</a>
{# <a class="btn btn-primary">{{ 'Start Elimination'|trans }}</a> #}
<a href="{{ path('app_prepare_elimination', {seasonCode: season.seasonCode, quiz: quiz.id}) }}"
class="btn btn-secondary">{{ 'Prepare Custom Elimination'|trans }}</a>
{%~ if not quiz.eliminations.empty %}

View File

@@ -1,3 +1,7 @@
{% extends 'quiz/base.html.twig' %}
{% block body %}
<img src="{{ asset("img/#{colour}.png") }}" class="elimination-screen" id="{{ colour }}"
alt="Screen with colour {{ colour }}">
{% endblock %}

View File

@@ -1,20 +1,4 @@
<!DOCTYPE html>
<title>Hello EliminationController!</title>
{% extends 'quiz/base.html.twig' %}
{% block body %}
<style>
.example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; }
.example-wrapper code { background: #F5F5F5; padding: 2px 6px; }
</style>
<div class="example-wrapper">
<h1>Hello {{ controller_name }}! ✅</h1>
This friendly message is coming from:
<ul>
<li>Your controller at <code>/app/src/Controller/EliminationController.php</code></li>
<li>Your template at <code>/app/templates/elimination/index.html.twig</code></li>
</ul>
</div>
{% endblock %}
{{ form(form) }}
{% endblock body %}

View File

@@ -1,5 +1,4 @@
{% extends 'quiz/base.html.twig' %}
{% block body %}
{{ season.name }}
{{ form(form) }}
{% endblock body %}

View File

@@ -0,0 +1,190 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="nl" target-language="nl" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="ecFC4Sv" resname="action.add_new_item">
<source>action.add_new_item</source>
<target>Voeg een item toe</target>
</trans-unit>
<trans-unit id="wPEuKmL" resname="action.cancel">
<source>action.cancel</source>
<target>Annuleren</target>
</trans-unit>
<trans-unit id="Yy_rDAt" resname="action.choose_file">
<source>action.choose_file</source>
<target>Bestand kiezen</target>
</trans-unit>
<trans-unit id="PO_UHtX" resname="action.close">
<source>action.close</source>
<target>Sluiten</target>
</trans-unit>
<trans-unit id="Cd4XVNn" resname="action.delete">
<source>action.delete</source>
<target>Verwijderen</target>
</trans-unit>
<trans-unit id="FI_qUZL" resname="action.entity_actions">
<source>action.entity_actions</source>
<target>Acties</target>
</trans-unit>
<trans-unit id="b5M9sxm" resname="action.remove_item">
<source>action.remove_item</source>
<target>Verwijder dit item</target>
</trans-unit>
<trans-unit id="tKPecTw" resname="action.search">
<source>action.search</source>
<target>Zoeken</target>
</trans-unit>
<trans-unit id="_EDCsYO" resname="autocomplete.loading-more-results">
<source>autocomplete.loading-more-results</source>
<target>Meer resultaten laden…</target>
</trans-unit>
<trans-unit id="Mi9fRIF" resname="autocomplete.no-more-results">
<source>autocomplete.no-more-results</source>
<target>Niet meer resultaten gevonden…</target>
</trans-unit>
<trans-unit id="dc37768" resname="autocomplete.no-results-found">
<source>autocomplete.no-results-found</source>
<target>Geen resultaten gevonden…</target>
</trans-unit>
<trans-unit id="1QzA7HJ" resname="batch_action_modal.action">
<source>batch_action_modal.action</source>
<target>Verdergaan</target>
</trans-unit>
<trans-unit id="HzIn9A_" resname="batch_action_modal.content">
<source>batch_action_modal.content</source>
<target>Je kan deze actie niet ongedaan maken.</target>
</trans-unit>
<trans-unit id="IvOrJqD" resname="batch_action_modal.title">
<source>batch_action_modal.title</source>
<target>Wil je alle geselecteerde items bewerken?</target>
</trans-unit>
<trans-unit id="GTjPPy9" resname="datagrid.hidden_results">
<source>datagrid.hidden_results</source>
<target>Sommige resultaten konden niet worden weergegeven, toegang geweigerd.</target>
</trans-unit>
<trans-unit id="CO0E0pU" resname="datagrid.no_results">
<source>datagrid.no_results</source>
<target>Geen resultaten gevonden.</target>
</trans-unit>
<trans-unit id="O8SUipq" resname="delete_modal.content">
<source>delete_modal.content</source>
<target>Deze actie kan niet ongedaan worden gemaakt.</target>
</trans-unit>
<trans-unit id=".DbNkeY" resname="delete_modal.title">
<source>delete_modal.title</source>
<target>Weet je zeker dat je dit item wilt verwijderen?</target>
</trans-unit>
<trans-unit id="MJQ4k4D" resname="field.code_editor.view_code">
<source>field.code_editor.view_code</source>
<target>Bekijk code</target>
</trans-unit>
<trans-unit id="11gUR_y" resname="field.text_editor.view_content">
<source>field.text_editor.view_content</source>
<target>Bekijk inhoud</target>
</trans-unit>
<trans-unit id="3Mq5DeM" resname="files">
<source>files</source>
<target>__files</target>
</trans-unit>
<trans-unit id="F7_Hyy1" resname="filter.button.apply">
<source>filter.button.apply</source>
<target>Toepassen</target>
</trans-unit>
<trans-unit id="GapHtez" resname="filter.button.clear">
<source>filter.button.clear</source>
<target>Wis filters</target>
</trans-unit>
<trans-unit id="VH1tHkH" resname="filter.title">
<source>filter.title</source>
<target>Filters</target>
</trans-unit>
<trans-unit id="3VqDiBO" resname="form.tab.error_badge_title">
<source>form.tab.error_badge_title</source>
<target>Een ongeldige input|%count% ongeldige inputs</target>
</trans-unit>
<trans-unit id="S2q7CDj" resname="label.empty">
<source>label.empty</source>
<target>Leeg</target>
</trans-unit>
<trans-unit id="0EqWTob" resname="label.inaccessible">
<source>label.inaccessible</source>
<target>Niet toegankelijk</target>
</trans-unit>
<trans-unit id="OLmlP81" resname="label.inaccessible.explanation">
<source>label.inaccessible.explanation</source>
<target>Getter bestaat niet voor dit veld of de eigenschap is niet public</target>
</trans-unit>
<trans-unit id="fAVSIIs" resname="label.null">
<source>label.null</source>
<target>Niets</target>
</trans-unit>
<trans-unit id="IsDUuMi" resname="login_page.forgot_password">
<source>login_page.forgot_password</source>
<target>Wachtwoord vergeten?</target>
</trans-unit>
<trans-unit id="uxJWiMn" resname="login_page.password">
<source>login_page.password</source>
<target>Wachtwoord</target>
</trans-unit>
<trans-unit id="GNqK_5o" resname="login_page.remember_me">
<source>login_page.remember_me</source>
<target>Onthoud mij</target>
</trans-unit>
<trans-unit id="eiGmhDt" resname="login_page.sign_in">
<source>login_page.sign_in</source>
<target>Inloggen</target>
</trans-unit>
<trans-unit id="iFP0IOu" resname="login_page.username">
<source>login_page.username</source>
<target>Gebruikersnaam</target>
</trans-unit>
<trans-unit id="nRSzgzm" resname="page_title.exception">
<source>page_title.exception</source>
<target>Fout|Fouten</target>
</trans-unit>
<trans-unit id="SaZbUiU" resname="paginator.next">
<source>paginator.next</source>
<target>Volgende</target>
</trans-unit>
<trans-unit id="ANpWHHW" resname="paginator.previous">
<source>paginator.previous</source>
<target>Vorige</target>
</trans-unit>
<trans-unit id="ZsypGha" resname="paginator.results">
<source>paginator.results</source>
<target><![CDATA[{0} Geen resultaten|{1} <strong>1</strong> resultaat|]1,Inf] <strong>%count%</strong> resultaten]]></target>
</trans-unit>
<trans-unit id="8ViDiWx" resname="settings.appearance.auto">
<source>settings.appearance.auto</source>
<target>Automatisch</target>
</trans-unit>
<trans-unit id="h3pBR4_" resname="settings.appearance.dark">
<source>settings.appearance.dark</source>
<target>Donker</target>
</trans-unit>
<trans-unit id="JBbrEd7" resname="settings.appearance.label">
<source>settings.appearance.label</source>
<target>Weergave</target>
</trans-unit>
<trans-unit id="vxKYCsn" resname="settings.appearance.light">
<source>settings.appearance.light</source>
<target>Licht</target>
</trans-unit>
<trans-unit id="E5cimFA" resname="settings.locale">
<source>settings.locale</source>
<target>Taal</target>
</trans-unit>
<trans-unit id=".eqAPKs" resname="user.anonymous">
<source>user.anonymous</source>
<target>Anonieme gebruiker</target>
</trans-unit>
<trans-unit id="kgatv6N" resname="user.logged_in_as">
<source>user.logged_in_as</source>
<target>Aangemeld als</target>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="nl" target-language="nl" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="EgM1sAf" resname="download">
<source>download</source>
<target>download</target>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,270 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="nl" target-language="nl" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="uyMngrK" resname="Active Quiz">
<source>Active Quiz</source>
<target>Actieve test</target>
</trans-unit>
<trans-unit id="g.hyGgB" resname="Add">
<source>Add</source>
<target>Toevoegen</target>
</trans-unit>
<trans-unit id="pv1legV" resname="Add Candidate">
<source>Add Candidate</source>
<target>Voeg kandidaat toe</target>
</trans-unit>
<trans-unit id="7aI6qex" resname="Add Candidates">
<source>Add Candidates</source>
<target>Voeg kandidaten toe</target>
</trans-unit>
<trans-unit id="ehB6pAw" resname="Add a quiz to %name%">
<source>Add a quiz to %name%</source>
<target>Voeg een test toe aan %name%</target>
</trans-unit>
<trans-unit id="qiXD5ve" resname="All Seasons">
<source>All Seasons</source>
<target>Alle seizoenen</target>
</trans-unit>
<trans-unit id="PaW5ihf" resname="Already have an account? Log in">
<source>Already have an account? Log in</source>
<target>Heb je al een account? Log in</target>
</trans-unit>
<trans-unit id=".QFPbFe" resname="Back">
<source>Back</source>
<target>Terug</target>
</trans-unit>
<trans-unit id="T6TIfj7" resname="Candidate">
<source>Candidate</source>
<target>Kandidaat</target>
</trans-unit>
<trans-unit id="TiTLBGW" resname="Candidate not found">
<source>Candidate not found</source>
<target>Kandidaat niet gevonden</target>
</trans-unit>
<trans-unit id="WJJE4q_" resname="Candidates">
<source>Candidates</source>
<target>Kandidaten</target>
</trans-unit>
<trans-unit id="sFpB4C2" resname="Correct Answers">
<source>Correct Answers</source>
<target>Goede antwoorden</target>
</trans-unit>
<trans-unit id="YrMVdGf" resname="Corrections">
<source>Corrections</source>
<target>Jokers</target>
</trans-unit>
<trans-unit id="Lu7u8U2" resname="Cound not find candidate with name %name%">
<source>Cound not find candidate with name %name%</source>
<target>Kon kandidaat met naam %name% niet vinden</target>
</trans-unit>
<trans-unit id="YQUiB4T" resname="Cound not find candidate with name %name% in elimination.">
<source>Cound not find candidate with name %name% in elimination.</source>
<target>Kon geen kandidaat vinden met de naam %name% in de eliminatie</target>
</trans-unit>
<trans-unit id="0DvmToq" resname="Create a season">
<source>Create a season</source>
<target>Maak een seizoen aan</target>
</trans-unit>
<trans-unit id="Wsms_zc" resname="Create an account">
<source>Create an account</source>
<target>Maak een account aan</target>
</trans-unit>
<trans-unit id="w9AyAnn" resname="Deactivate Quiz">
<source>Deactivate Quiz</source>
<target>Deactiveer test</target>
</trans-unit>
<trans-unit id="R9yHzHv" resname="Download Template">
<source>Download Template</source>
<target>Download sjabloon</target>
</trans-unit>
<trans-unit id="JZi_tm0" resname="Email">
<source>Email</source>
<target>E-mail</target>
</trans-unit>
<trans-unit id="mSo9TGC" resname="Enter name">
<source>Enter name</source>
<target>Voer een naam in</target>
</trans-unit>
<trans-unit id="RnI7jJT" resname="Enter your name">
<source>Enter your name</source>
<target>Voor je naam in</target>
</trans-unit>
<trans-unit id="OGiIhMH" resname="Green">
<source>Green</source>
<target>Groen</target>
</trans-unit>
<trans-unit id="k1X7w12" resname="Invalid season code">
<source>Invalid season code</source>
<target>Ongeldige seizoencode</target>
</trans-unit>
<trans-unit id="q0FeoCr" resname="Load Prepared Elimination">
<source>Load Prepared Elimination</source>
<target>Laad voorbereide eliminatie</target>
</trans-unit>
<trans-unit id="JKl2Twv" resname="Logout">
<source>Logout</source>
<target>Uitloggen</target>
</trans-unit>
<trans-unit id="NCItilE" resname="Make active">
<source>Make active</source>
<target>Maak actief</target>
</trans-unit>
<trans-unit id="WP2lXKC" resname="Manage">
<source>Manage</source>
<target>Beheren</target>
</trans-unit>
<trans-unit id="LZzySF." resname="Manage Quiz">
<source>Manage Quiz</source>
<target>Beheer test</target>
</trans-unit>
<trans-unit id="wbMeKOh" resname="Name">
<source>Name</source>
<target>Naam</target>
</trans-unit>
<trans-unit id="nOHriCl" resname="No active quiz">
<source>No active quiz</source>
<target>Geen actieve test</target>
</trans-unit>
<trans-unit id="swW4qFE" resname="No results">
<source>No results</source>
<target>Geen resultaten</target>
</trans-unit>
<trans-unit id="k7Eqnjt" resname="Number of dropouts:">
<source>Number of dropouts:</source>
<target>Aantal afvallers:</target>
</trans-unit>
<trans-unit id="PywqOf4" resname="Owner(s)">
<source>Owner(s)</source>
<target>Eigena(a)r(en)</target>
</trans-unit>
<trans-unit id="GqmFSHc" resname="Password">
<source>Password</source>
<target>Wachtwoord</target>
</trans-unit>
<trans-unit id="6EclFME" resname="Please Confirm your Email">
<source>Please Confirm your Email</source>
<target>messages</target>
</trans-unit>
<trans-unit id="lSX_PHJ" resname="Please sign in">
<source>Please sign in</source>
<target>Log in aub</target>
</trans-unit>
<trans-unit id="ruFGaU." resname="Please upload a valid XLSX file">
<source>Please upload a valid XLSX file</source>
<target>Upload een geldig XLSX-bestand</target>
</trans-unit>
<trans-unit id="YG9Osau" resname="Prepare Custom Elimination">
<source>Prepare Custom Elimination</source>
<target>Bereid aangepaste eliminatie voor</target>
</trans-unit>
<trans-unit id="Rx5irUP" resname="Questions">
<source>Questions</source>
<target>Vragen</target>
</trans-unit>
<trans-unit id="0tv0gq." resname="Quiz">
<source>Quiz</source>
<target>Test</target>
</trans-unit>
<trans-unit id="4BzxOP3" resname="Quiz (xlsx)">
<source>Quiz (xlsx)</source>
<target>Test (xlsx)</target>
</trans-unit>
<trans-unit id="nU5BEhV" resname="Quiz Added!">
<source>Quiz Added!</source>
<target>Test toegevoegd!</target>
</trans-unit>
<trans-unit id="LbVe.2c" resname="Quiz completed">
<source>Quiz completed</source>
<target>Test voltooid</target>
</trans-unit>
<trans-unit id="frxoIkW" resname="Quiz name">
<source>Quiz name</source>
<target>Testnaam</target>
</trans-unit>
<trans-unit id="bggVfH9" resname="Quizzes">
<source>Quizzes</source>
<target>Tests</target>
</trans-unit>
<trans-unit id="P1HcfAu" resname="Red">
<source>Red</source>
<target>Rood</target>
</trans-unit>
<trans-unit id="fGfBzt6" resname="Register">
<source>Register</source>
<target>Registreren</target>
</trans-unit>
<trans-unit id="WevL4T_" resname="Remember me">
<source>Remember me</source>
<target>Onthoud mij</target>
</trans-unit>
<trans-unit id="Z9CSKpk" resname="Repeat Password">
<source>Repeat Password</source>
<target>Herhaal wachtwoord</target>
</trans-unit>
<trans-unit id="z9OKodR" resname="Save">
<source>Save</source>
<target>Opslaan</target>
</trans-unit>
<trans-unit id="8HUcmWU" resname="Save and start elimination">
<source>Save and start elimination</source>
<target>Opslaan en start eliminatie</target>
</trans-unit>
<trans-unit id="uRWqG15" resname="Score">
<source>Score</source>
<target>Score</target>
</trans-unit>
<trans-unit id="yH9A3q0" resname="Season">
<source>Season</source>
<target>Seizoen</target>
</trans-unit>
<trans-unit id="yj8.c2D" resname="Season Code">
<source>Season Code</source>
<target>Seizoencode</target>
</trans-unit>
<trans-unit id="1ULw_4S" resname="Season Name">
<source>Season Name</source>
<target>Seizoennaam</target>
</trans-unit>
<trans-unit id="kc_J96C" resname="Seasons">
<source>Seasons</source>
<target>Seizoenen</target>
</trans-unit>
<trans-unit id="pNIxNSX" resname="Sign in">
<source>Sign in</source>
<target>Log in</target>
</trans-unit>
<trans-unit id="2QO7aYC" resname="Start Elimination">
<source>Start Elimination</source>
<target>Start eliminatie</target>
</trans-unit>
<trans-unit id="9m8DOBg" resname="Submit">
<source>Submit</source>
<target>Verstuur</target>
</trans-unit>
<trans-unit id="_z4el3Z" resname="The password fields must match.">
<source>The password fields must match.</source>
<target>De wachtwoorden moeten overeen komen.</target>
</trans-unit>
<trans-unit id="HuzRgeN" resname="There are no answers for this question">
<source>There are no answers for this question</source>
<target>Er zijn geen antwoorden voor deze vraag</target>
</trans-unit>
<trans-unit id="Dptvysv" resname="Time">
<source>Time</source>
<target>Tijd</target>
</trans-unit>
<trans-unit id="vVQAP9A" resname="Your Seasons">
<source>Your Seasons</source>
<target>Jouw seizoenen</target>
</trans-unit>
<trans-unit id="m80cBv0" resname="Your email address has been verified.">
<source>Your email address has been verified.</source>
<target>Je e-mailadres is geverifieerd.</target>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,61 +0,0 @@
'Active Quiz': 'Actieve test'
Add: Toevoegen
'Add Candidate': 'Voeg kandidaat toe'
'Add Candidates': 'Voeg kandidaten toe'
'Add a quiz to %name%': 'Voeg een test toe aan %name%'
'All Seasons': 'Alle seizoenen'
'Already have an account? Log in': 'Heb je al een account? Log in'
Back: Terug
Candidate: Kandidaat
'Candidate not found': 'Kandidaat niet gevonden'
Candidates: Kandidaten
'Correct Answers': 'Goede antwoorden'
Corrections: Jokers
'Cound not find candidate with name %name%': 'Kon kandidaat met naam %name% niet vinden'
'Create a season': 'Maak een seizoen aan'
'Create an account': 'Maak een account aan'
'Deactivate Quiz': 'Deactiveer test'
'Download Template': 'Download sjabloon'
Email: E-mail
'Enter your name': 'Voor je naam in'
'Invalid season code': 'Ongeldige seizoencode'
'Load Prepared Elimination': 'Laad voorbereide eliminatie'
Logout: Uitloggen
'Make active': 'Maak actief'
Manage: Beheren
'Manage Quiz': 'Beheer test'
Name: Naam
'No active quiz': 'Geen actieve test'
'No results': 'Geen resultaten'
'Number of dropouts:': 'Aantal afvallers:'
Owner(s): Eigena(a)r(en)
Password: Wachtwoord
'Please Confirm your Email': messages
'Please sign in': 'Log in aub'
'Please upload a valid XLSX file': 'Upload een geldig XLSX-bestand'
'Prepare Custom Elimination': 'Bereid aangepaste eliminatie voor'
Questions: Vragen
Quiz: Test
'Quiz (xlsx)': 'Test (xlsx)'
'Quiz Added!': 'Test toegevoegd!'
'Quiz completed': 'Test voltooid'
'Quiz name': Testnaam
Quizzes: Tests
Register: Registreren
'Remember me': 'Onthoud mij'
'Repeat Password': 'Herhaal wachtwoord'
Save: Opslaan
'Save and start elimination': 'Opslaan en start eliminatie'
Score: Score
Season: Seizoen
'Season Code': Seizoencode
'Season Name': Seizoennaam
Seasons: Seizoenen
'Sign in': 'Log in'
'Start Elimination': 'Start eliminatie'
Submit: Verstuur
'The password fields must match.': 'De wachtwoorden moeten overeen komen.'
'There are no answers for this question': 'Er zijn geen antwoorden voor deze vraag'
Time: Tijd
'Your Seasons': 'Jouw seizoenen'
'Your email address has been verified.': 'Je e-mailadres is geverifieerd.'

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="nl" target-language="nl" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="B9r0Hn5" resname="Error">
<source>Error</source>
<target>Fout</target>
</trans-unit>
<trans-unit id="B7yoMOR" resname="Please enter a password">
<source>Please enter a password</source>
<target>Voer je wachtwoord in</target>
</trans-unit>
<trans-unit id="vsM4tSv" resname="There is already an account with this email">
<source>There is already an account with this email</source>
<target>Er is al een account met dit e-mailadres</target>
</trans-unit>
<trans-unit id="_OmnKuR" resname="Your password should be at least {{ limit }} characters">
<source>Your password should be at least {{ limit }} characters</source>
<target>Je wachtwoord moet minimaal {{ limit }} karakters lang zijn</target>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,4 +0,0 @@
Error: Fout
'Please enter a password': 'Voer je wachtwoord in'
'There is already an account with this email': 'Er is al een account met dit e-mailadres'
'Your password should be at least {{ limit }} characters': 'Je wachtwoord moet minimaal {{ limit }} karakters lang zijn'