Merge branch 'thubrecht/traduction' into 'master'
Thubrecht/traduction Closes #2 See merge request klub-dev-ens/kadenios!4
This commit is contained in:
commit
9d316a3044
15 changed files with 945 additions and 81 deletions
|
@ -1,3 +1,5 @@
|
||||||
|
from translated_fields import language_code_formfield_callback
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.forms.models import inlineformset_factory
|
from django.forms.models import inlineformset_factory
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
@ -8,6 +10,8 @@ from .utils import check_csv
|
||||||
|
|
||||||
|
|
||||||
class ElectionForm(forms.ModelForm):
|
class ElectionForm(forms.ModelForm):
|
||||||
|
formfield_callback = language_code_formfield_callback
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
cleaned_data = super().clean()
|
cleaned_data = super().clean()
|
||||||
if cleaned_data["start_date"] < timezone.now():
|
if cleaned_data["start_date"] < timezone.now():
|
||||||
|
@ -23,16 +27,18 @@ class ElectionForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Election
|
model = Election
|
||||||
fields = [
|
fields = [
|
||||||
"name",
|
*Election.name.fields,
|
||||||
"description",
|
|
||||||
"vote_restrictions",
|
|
||||||
"restricted",
|
|
||||||
"start_date",
|
"start_date",
|
||||||
"end_date",
|
"end_date",
|
||||||
|
*Election.description.fields,
|
||||||
|
"restricted",
|
||||||
|
*Election.vote_restrictions.fields,
|
||||||
]
|
]
|
||||||
widgets = {
|
widgets = {
|
||||||
"description": forms.Textarea(attrs={"rows": 4}),
|
"description_en": forms.Textarea(attrs={"rows": 4}),
|
||||||
"vote_restrictions": forms.Textarea(attrs={"rows": 4}),
|
"description_fr": forms.Textarea(attrs={"rows": 4}),
|
||||||
|
"vote_restrictions_en": forms.Textarea(attrs={"rows": 4}),
|
||||||
|
"vote_restrictions_fr": forms.Textarea(attrs={"rows": 4}),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -59,17 +65,21 @@ class VoterMailForm(forms.Form):
|
||||||
|
|
||||||
|
|
||||||
class QuestionForm(forms.ModelForm):
|
class QuestionForm(forms.ModelForm):
|
||||||
|
formfield_callback = language_code_formfield_callback
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Question
|
model = Question
|
||||||
fields = ["text", "type"]
|
fields = [*Question.text.fields, "type"]
|
||||||
widgets = {"text": forms.TextInput}
|
widgets = {"text_fr": forms.TextInput, "text_en": forms.TextInput}
|
||||||
|
|
||||||
|
|
||||||
class OptionForm(forms.ModelForm):
|
class OptionForm(forms.ModelForm):
|
||||||
|
formfield_callback = language_code_formfield_callback
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Option
|
model = Option
|
||||||
fields = ["text"]
|
fields = [*Option.text.fields]
|
||||||
widgets = {"text": forms.TextInput}
|
widgets = {"text_fr": forms.TextInput, "text_en": forms.TextInput}
|
||||||
|
|
||||||
|
|
||||||
class DeleteVoteForm(forms.Form):
|
class DeleteVoteForm(forms.Form):
|
||||||
|
|
63
elections/migrations/0022_auto_20210415_1050.py
Normal file
63
elections/migrations/0022_auto_20210415_1050.py
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
# Generated by Django 3.2 on 2021-04-15 08:50
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("elections", "0021_election_vote_restrictions"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name="election",
|
||||||
|
old_name="description",
|
||||||
|
new_name="description_fr",
|
||||||
|
),
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name="election",
|
||||||
|
old_name="name",
|
||||||
|
new_name="name_fr",
|
||||||
|
),
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name="election",
|
||||||
|
old_name="vote_restrictions",
|
||||||
|
new_name="vote_restrictions_fr",
|
||||||
|
),
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name="option",
|
||||||
|
old_name="text",
|
||||||
|
new_name="text_fr",
|
||||||
|
),
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name="question",
|
||||||
|
old_name="text",
|
||||||
|
new_name="text_fr",
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name="election",
|
||||||
|
name="description_en",
|
||||||
|
field=models.TextField(blank=True, verbose_name="description"),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name="election",
|
||||||
|
name="name_en",
|
||||||
|
field=models.CharField(blank=True, max_length=255, verbose_name="nom"),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name="election",
|
||||||
|
name="vote_restrictions_en",
|
||||||
|
field=models.TextField(blank=True, verbose_name="conditions de vote"),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name="option",
|
||||||
|
name="text_en",
|
||||||
|
field=models.TextField(blank=True, verbose_name="texte"),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name="question",
|
||||||
|
name="text_en",
|
||||||
|
field=models.TextField(blank=True, verbose_name="question"),
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,3 +1,5 @@
|
||||||
|
from translated_fields import TranslatedFieldWithFallback
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth.models import AbstractUser
|
from django.contrib.auth.models import AbstractUser
|
||||||
from django.db import models, transaction
|
from django.db import models, transaction
|
||||||
|
@ -25,14 +27,18 @@ from .utils import (
|
||||||
|
|
||||||
|
|
||||||
class Election(models.Model):
|
class Election(models.Model):
|
||||||
name = models.CharField(_("nom"), max_length=255)
|
name = TranslatedFieldWithFallback(models.CharField(_("nom"), max_length=255))
|
||||||
short_name = models.SlugField(_("nom bref"), unique=True)
|
short_name = models.SlugField(_("nom bref"), unique=True)
|
||||||
description = models.TextField(_("description"), blank=True)
|
description = TranslatedFieldWithFallback(
|
||||||
|
models.TextField(_("description"), blank=True)
|
||||||
|
)
|
||||||
|
|
||||||
start_date = models.DateTimeField(_("date et heure de début"))
|
start_date = models.DateTimeField(_("date et heure de début"))
|
||||||
end_date = models.DateTimeField(_("date et heure de fin"))
|
end_date = models.DateTimeField(_("date et heure de fin"))
|
||||||
|
|
||||||
vote_restrictions = models.TextField(_("conditions de vote"), blank=True)
|
vote_restrictions = TranslatedFieldWithFallback(
|
||||||
|
models.TextField(_("conditions de vote"), blank=True)
|
||||||
|
)
|
||||||
|
|
||||||
restricted = models.BooleanField(
|
restricted = models.BooleanField(
|
||||||
_("restreint le vote à une liste de personnes"), default=True
|
_("restreint le vote à une liste de personnes"), default=True
|
||||||
|
@ -69,7 +75,7 @@ class Question(models.Model):
|
||||||
election = models.ForeignKey(
|
election = models.ForeignKey(
|
||||||
Election, related_name="questions", on_delete=models.CASCADE
|
Election, related_name="questions", on_delete=models.CASCADE
|
||||||
)
|
)
|
||||||
text = models.TextField(_("question"), blank=False)
|
text = TranslatedFieldWithFallback(models.TextField(_("question"), blank=False))
|
||||||
type = models.CharField(
|
type = models.CharField(
|
||||||
_("type de question"),
|
_("type de question"),
|
||||||
choices=QUESTION_TYPES,
|
choices=QUESTION_TYPES,
|
||||||
|
@ -125,7 +131,7 @@ class Option(models.Model):
|
||||||
question = models.ForeignKey(
|
question = models.ForeignKey(
|
||||||
Question, related_name="options", on_delete=models.CASCADE
|
Question, related_name="options", on_delete=models.CASCADE
|
||||||
)
|
)
|
||||||
text = models.TextField(_("texte"), blank=False)
|
text = TranslatedFieldWithFallback(models.TextField(_("texte"), blank=False))
|
||||||
|
|
||||||
winner = models.BooleanField(_("option gagnante"), default=False)
|
winner = models.BooleanField(_("option gagnante"), default=False)
|
||||||
voters = models.ManyToManyField(
|
voters = models.ManyToManyField(
|
||||||
|
|
|
@ -2,6 +2,24 @@
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block extra_head %}
|
||||||
|
<script>
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
var $modalButtons = document.querySelectorAll('.modal-button') || [];
|
||||||
|
|
||||||
|
$modalButtons.forEach(function($el) {
|
||||||
|
$el.addEventListener('click', function() {
|
||||||
|
var $target = document.getElementById($el.dataset.target);
|
||||||
|
$target_form = $target.querySelector("form");
|
||||||
|
$target_form.action = $el.dataset.post_url;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<div class="level is-block-tablet is-block-desktop is-flex-fullhd">
|
<div class="level is-block-tablet is-block-desktop is-flex-fullhd">
|
||||||
|
@ -217,55 +235,38 @@
|
||||||
|
|
||||||
{# Rajout d'une option #}
|
{# Rajout d'une option #}
|
||||||
{% if election.start_date > current_time %}
|
{% if election.start_date > current_time %}
|
||||||
<form action="{% url 'election.add-option' q.pk %}" method="post">
|
<div class="panel-block">
|
||||||
<div class="panel-block field has-addons">
|
<button class="button modal-button is-primary is-outlined is-fullwidth" data-post_url="{% url 'election.add-option' q.pk %}" data-target="modal-add_option">
|
||||||
{% csrf_token %}
|
<span class="icon">
|
||||||
|
<i class="fas fa-plus"></i>
|
||||||
<div class="control has-icons-left is-expanded">
|
</span>
|
||||||
<input class="input is-success" type="text" name="text" id="id_text" placeholder="{% trans "Rajouter une option" %}">
|
<span>{% trans "Rajouter une option" %}</span>
|
||||||
<span class="icon is-left">
|
</button>
|
||||||
<i class="fas fa-plus"></i>
|
</div>
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="control">
|
|
||||||
<button class="button is-success">{% trans "Valider" %}</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
{# Rajout d'une question #}
|
{# Rajout d'une question #}
|
||||||
{% if election.start_date > current_time %}
|
{% if election.start_date > current_time %}
|
||||||
|
|
||||||
|
{# Rajout d'une option #}
|
||||||
|
{% trans "Rajouter une option" as modal_title %}
|
||||||
|
{% include "forms/modal-form.html" with modal_id="add_option" form=o_form %}
|
||||||
|
|
||||||
|
{# Rajout d'une question #}
|
||||||
|
{% trans "Rajouter une question" as modal_title %}
|
||||||
|
{% include "forms/modal-form.html" with modal_id="add_question" form=q_form %}
|
||||||
|
|
||||||
|
|
||||||
<div class="columns is-centered" id="q_add">
|
<div class="columns is-centered" id="q_add">
|
||||||
<div class="column is-two-thirds">
|
<div class="column is-two-thirds">
|
||||||
<form action="{% url 'election.add-question' election.pk %}" method="post">
|
<button class="button modal-button is-primary is-outlined is-fullwidth" data-post_url="{% url 'election.add-question' election.pk %}" data-target="modal-add_question">
|
||||||
{% csrf_token %}
|
<span class="icon">
|
||||||
|
<i class="fas fa-question"></i>
|
||||||
<div class="field has-addons">
|
</span>
|
||||||
<div class="control has-icons-left is-expanded">
|
<span>{% trans "Rajouter une question" %}</span>
|
||||||
<input class="input is-primary" type="text" name="text" id="id_text" placeholder="{% trans "Rajouter une question" %}">
|
</button>
|
||||||
<span class="icon is-left">
|
|
||||||
<i class="fas fa-question"></i>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="control">
|
|
||||||
<span class="select is-primary">
|
|
||||||
<select name="type" id="id_type">
|
|
||||||
{% for val, choice in question_types %}
|
|
||||||
<option value="{{ val }}">{{ choice }}</option>
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="control">
|
|
||||||
<button class="button is-primary is-outlined">{% trans "Valider" %}</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -90,8 +90,16 @@ class ElectionAdminView(CreatorOnlyMixin, DetailView):
|
||||||
return reverse("election.view", args=[self.object.pk])
|
return reverse("election.view", args=[self.object.pk])
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
|
from django.utils.translation import get_language
|
||||||
|
|
||||||
|
print(get_language())
|
||||||
kwargs.update(
|
kwargs.update(
|
||||||
{"current_time": timezone.now(), "question_types": QUESTION_TYPES}
|
{
|
||||||
|
"current_time": timezone.now(),
|
||||||
|
"question_types": QUESTION_TYPES,
|
||||||
|
"o_form": OptionForm,
|
||||||
|
"q_form": QuestionForm,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
return super().get_context_data(**kwargs)
|
return super().get_context_data(**kwargs)
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from django.urls import reverse_lazy
|
from django.urls import reverse_lazy
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
# #############################################################################
|
# #############################################################################
|
||||||
# Secrets
|
# Secrets
|
||||||
|
@ -59,6 +60,7 @@ INSTALLED_APPS = [
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
"django.middleware.security.SecurityMiddleware",
|
"django.middleware.security.SecurityMiddleware",
|
||||||
"django.contrib.sessions.middleware.SessionMiddleware",
|
"django.contrib.sessions.middleware.SessionMiddleware",
|
||||||
|
"django.middleware.locale.LocaleMiddleware",
|
||||||
"django.middleware.common.CommonMiddleware",
|
"django.middleware.common.CommonMiddleware",
|
||||||
"django.middleware.csrf.CsrfViewMiddleware",
|
"django.middleware.csrf.CsrfViewMiddleware",
|
||||||
"django.contrib.auth.middleware.AuthenticationMiddleware",
|
"django.contrib.auth.middleware.AuthenticationMiddleware",
|
||||||
|
@ -132,6 +134,13 @@ USE_I18N = True
|
||||||
USE_L10N = True
|
USE_L10N = True
|
||||||
USE_TZ = True
|
USE_TZ = True
|
||||||
|
|
||||||
|
LANGUAGES = [
|
||||||
|
("fr", _("Français")),
|
||||||
|
("en", _("Anglais")),
|
||||||
|
]
|
||||||
|
|
||||||
|
LOCALE_PATHS = [os.path.join(BASE_DIR, "shared", "locale")]
|
||||||
|
|
||||||
# #############################################################################
|
# #############################################################################
|
||||||
# Paramètres des fichiers statiques
|
# Paramètres des fichiers statiques
|
||||||
# #############################################################################
|
# #############################################################################
|
||||||
|
|
|
@ -10,6 +10,7 @@ urlpatterns = [
|
||||||
path("elections/", include("elections.urls")),
|
path("elections/", include("elections.urls")),
|
||||||
path("auth/", include("shared.auth.urls")),
|
path("auth/", include("shared.auth.urls")),
|
||||||
path("authens/", include("authens.urls")),
|
path("authens/", include("authens.urls")),
|
||||||
|
path("i18n/", include("django.conf.urls.i18n")),
|
||||||
]
|
]
|
||||||
|
|
||||||
if "debug_toolbar" in settings.INSTALLED_APPS:
|
if "debug_toolbar" in settings.INSTALLED_APPS:
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
django==3.2.*
|
django==3.2.*
|
||||||
|
django-translated-fields==0.11.1
|
||||||
authens>=0.1b2
|
authens>=0.1b2
|
||||||
numpy
|
numpy
|
||||||
networkx
|
networkx
|
||||||
|
|
BIN
shared/locale/en/LC_MESSAGES/django.mo
Normal file
BIN
shared/locale/en/LC_MESSAGES/django.mo
Normal file
Binary file not shown.
697
shared/locale/en/LC_MESSAGES/django.po
Normal file
697
shared/locale/en/LC_MESSAGES/django.po
Normal file
|
@ -0,0 +1,697 @@
|
||||||
|
# Kadenios translations.
|
||||||
|
# Copyright (C) 2021 Klub Dev ENS
|
||||||
|
# This file is distributed under the same license as the kadenios package.
|
||||||
|
# Klub Dev ENS <klub-dev@ens.fr>, 2021.
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: 0.1\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2021-04-15 16:56+0200\n"
|
||||||
|
"PO-Revision-Date: 2021-04-15 16:57+0200\n"
|
||||||
|
"Last-Translator: Test Translator <test@translator>\n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"Language: en\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
"X-Generator: Poedit 2.4.1\n"
|
||||||
|
|
||||||
|
#: elections/forms.py:29
|
||||||
|
msgid "Impossible de faire débuter l'élection dans le passé"
|
||||||
|
msgstr "Impossible to start the election in the past"
|
||||||
|
|
||||||
|
#: elections/forms.py:33
|
||||||
|
msgid "Impossible de terminer l'élection avant de la commencer"
|
||||||
|
msgstr "Impossible to end the election before it starts"
|
||||||
|
|
||||||
|
#: elections/forms.py:56
|
||||||
|
msgid "Sélectionnez un fichier .csv"
|
||||||
|
msgstr "Select a .csv file"
|
||||||
|
|
||||||
|
#: elections/forms.py:66
|
||||||
|
msgid "Extension de fichier invalide, il faut un fichier au format CSV."
|
||||||
|
msgstr "Invalid file extension, a CSV file is required."
|
||||||
|
|
||||||
|
#: elections/forms.py:100
|
||||||
|
msgid "Supprimer le vote de {} ({}) ?"
|
||||||
|
msgstr "Delete the vote of {} ({}) ?"
|
||||||
|
|
||||||
|
#: elections/forms.py:105 elections/templates/elections/election_admin.html:168
|
||||||
|
#: elections/templates/elections/election_admin.html:195
|
||||||
|
#: elections/templates/elections/election_voters.html:57
|
||||||
|
msgid "Supprimer"
|
||||||
|
msgstr "Delete"
|
||||||
|
|
||||||
|
#: elections/forms.py:105
|
||||||
|
msgid "Non"
|
||||||
|
msgstr "No"
|
||||||
|
|
||||||
|
#: elections/forms.py:105
|
||||||
|
msgid "Oui"
|
||||||
|
msgstr "Yes"
|
||||||
|
|
||||||
|
#: elections/models.py:31
|
||||||
|
msgid "nom"
|
||||||
|
msgstr "name"
|
||||||
|
|
||||||
|
#: elections/models.py:32
|
||||||
|
msgid "nom bref"
|
||||||
|
msgstr "short name"
|
||||||
|
|
||||||
|
#: elections/models.py:34
|
||||||
|
msgid "description"
|
||||||
|
msgstr "description"
|
||||||
|
|
||||||
|
#: elections/models.py:37
|
||||||
|
msgid "date et heure de début"
|
||||||
|
msgstr "start date and time"
|
||||||
|
|
||||||
|
#: elections/models.py:38
|
||||||
|
msgid "date et heure de fin"
|
||||||
|
msgstr "end date and time"
|
||||||
|
|
||||||
|
#: elections/models.py:41
|
||||||
|
msgid "conditions de vote"
|
||||||
|
msgstr "voting requirements"
|
||||||
|
|
||||||
|
#: elections/models.py:45
|
||||||
|
msgid "restreint le vote à une liste de personnes"
|
||||||
|
msgstr "restricts the vote to a list of people"
|
||||||
|
|
||||||
|
#: elections/models.py:49
|
||||||
|
msgid "mail avec les identifiants envoyé"
|
||||||
|
msgstr "mail with credentials sent"
|
||||||
|
|
||||||
|
#: elections/models.py:66
|
||||||
|
msgid "résultats publics"
|
||||||
|
msgstr "results published"
|
||||||
|
|
||||||
|
#: elections/models.py:67
|
||||||
|
msgid "dépouillée"
|
||||||
|
msgstr "counted"
|
||||||
|
|
||||||
|
#: elections/models.py:69
|
||||||
|
msgid "archivée"
|
||||||
|
msgstr "archived"
|
||||||
|
|
||||||
|
#: elections/models.py:79
|
||||||
|
msgid "question"
|
||||||
|
msgstr "question"
|
||||||
|
|
||||||
|
#: elections/models.py:81
|
||||||
|
msgid "type de question"
|
||||||
|
msgstr "type of question"
|
||||||
|
|
||||||
|
#: elections/models.py:88
|
||||||
|
msgid "nombre maximal de votes reçus"
|
||||||
|
msgstr "maximal number of votes received"
|
||||||
|
|
||||||
|
#: elections/models.py:135
|
||||||
|
msgid "texte"
|
||||||
|
msgstr "text"
|
||||||
|
|
||||||
|
#: elections/models.py:137
|
||||||
|
msgid "option gagnante"
|
||||||
|
msgstr "winning option"
|
||||||
|
|
||||||
|
#: elections/models.py:145
|
||||||
|
msgid "nombre de votes reçus"
|
||||||
|
msgstr "number of votes received"
|
||||||
|
|
||||||
|
#: elections/models.py:164
|
||||||
|
msgid "rang de l'option"
|
||||||
|
msgstr "option's ranking"
|
||||||
|
|
||||||
|
#: elections/models.py:180
|
||||||
|
msgid "votes supplémentaires"
|
||||||
|
msgstr "extra votes"
|
||||||
|
|
||||||
|
#: elections/models.py:196
|
||||||
|
msgid "Nom et Prénom"
|
||||||
|
msgstr "Name and surname"
|
||||||
|
|
||||||
|
#: elections/models.py:218 elections/tests/test_models.py:57
|
||||||
|
msgid "identifiants spécifiques"
|
||||||
|
msgstr "dedicated credentials"
|
||||||
|
|
||||||
|
#: elections/models.py:222
|
||||||
|
msgid "Peut administrer des élections"
|
||||||
|
msgstr "Can manage elections"
|
||||||
|
|
||||||
|
#: elections/staticdefs.py:26 elections/tests/test_models.py:56
|
||||||
|
msgid "mot de passe"
|
||||||
|
msgstr "password"
|
||||||
|
|
||||||
|
#: elections/staticdefs.py:27 elections/tests/test_models.py:55
|
||||||
|
msgid "CAS"
|
||||||
|
msgstr "CAS"
|
||||||
|
|
||||||
|
#: elections/staticdefs.py:31
|
||||||
|
msgid "Assentiment"
|
||||||
|
msgstr "Assent"
|
||||||
|
|
||||||
|
#: elections/staticdefs.py:32
|
||||||
|
msgid "Uninominal"
|
||||||
|
msgstr "Uninominal"
|
||||||
|
|
||||||
|
#: elections/staticdefs.py:33
|
||||||
|
msgid "Condorcet"
|
||||||
|
msgstr "Condorcet"
|
||||||
|
|
||||||
|
#: elections/staticdefs.py:44
|
||||||
|
msgid ""
|
||||||
|
"Le mode de scrutin pour cette question est un vote par assentiment. Vous "
|
||||||
|
"pouvez donc sélectionner autant d'options que vous souhaitez. Vous pouvez "
|
||||||
|
"également ne sélectionner aucune option."
|
||||||
|
msgstr ""
|
||||||
|
"The voting method for this question is a assent vote. You can therefore "
|
||||||
|
"select as many options as you wish. You can also select no options at all."
|
||||||
|
|
||||||
|
#: elections/staticdefs.py:49
|
||||||
|
msgid ""
|
||||||
|
"Le mode de scrutin pour cette question est un vote uninominal. Vous ne "
|
||||||
|
"pouvez donc sélectionner qu'une seule option."
|
||||||
|
msgstr ""
|
||||||
|
"The voting method for this question is a uninominal vote. You can therefore "
|
||||||
|
"only select one option."
|
||||||
|
|
||||||
|
#: elections/staticdefs.py:53
|
||||||
|
#, python-brace-format
|
||||||
|
msgid ""
|
||||||
|
"Le mode de scrutin pour cette question est un vote de type condorcet. Vous "
|
||||||
|
"devez classer les options <b>entre 1 et {nb_options}</b>, l'option classée 1 "
|
||||||
|
"étant votre préférée. <b>Vous pouvez donner le même classement à plusieurs "
|
||||||
|
"options</b>, si vous laissez vide le classement d'une option, elle sera "
|
||||||
|
"classée dernière automatiquement."
|
||||||
|
msgstr ""
|
||||||
|
"The voting method for this question is a condorcet vote. You must rank the "
|
||||||
|
"options <b>between 1 and {nb_options}</b>, with the option ranked 1 being "
|
||||||
|
"your favourite. <b>You can give the same ranking to more than one option</"
|
||||||
|
"b>, if you leave an option's ranking blank, it will be ranked last "
|
||||||
|
"automatically."
|
||||||
|
|
||||||
|
#: elections/templates/elections/delete_vote.html:7
|
||||||
|
msgid "Supprimer un vote"
|
||||||
|
msgstr "Delete a vote"
|
||||||
|
|
||||||
|
#: elections/templates/elections/delete_vote.html:23
|
||||||
|
#: elections/templates/elections/election_create.html:41
|
||||||
|
#: elections/templates/elections/election_update.html:47
|
||||||
|
#: elections/templates/elections/option_update.html:29
|
||||||
|
#: elections/templates/elections/question_update.html:29
|
||||||
|
#: elections/templates/elections/vote.html:125
|
||||||
|
#: shared/templates/auth/election_login.html:25
|
||||||
|
#: shared/templates/authens/pwd_login.html:25
|
||||||
|
#: shared/templates/authens/pwd_reset_confirm.html:25
|
||||||
|
#: shared/templates/forms/modal-form.html:23
|
||||||
|
msgid "Enregistrer"
|
||||||
|
msgstr "Save"
|
||||||
|
|
||||||
|
#: elections/templates/elections/delete_vote.html:32
|
||||||
|
#: elections/templates/elections/election_update.html:55
|
||||||
|
#: elections/templates/elections/election_voters.html:19
|
||||||
|
#: elections/templates/elections/mail_voters.html:43
|
||||||
|
#: elections/templates/elections/option_update.html:37
|
||||||
|
#: elections/templates/elections/question_update.html:37
|
||||||
|
#: elections/templates/elections/upload_voters.html:46
|
||||||
|
#: elections/templates/elections/vote.html:134
|
||||||
|
#: shared/templates/auth/election_login.html:34
|
||||||
|
#: shared/templates/authens/pwd_login.html:34
|
||||||
|
#: shared/templates/authens/pwd_reset.html:34
|
||||||
|
msgid "Retour"
|
||||||
|
msgstr "Back"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election.html:20
|
||||||
|
msgid "Votant·e·s"
|
||||||
|
msgstr "Voters"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election.html:29
|
||||||
|
msgid "Élection terminée"
|
||||||
|
msgstr "Election completed"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election.html:31
|
||||||
|
msgid "Élection en cours"
|
||||||
|
msgstr "Election in progress"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election.html:40
|
||||||
|
#: elections/templates/elections/election_list.html:72
|
||||||
|
msgid "Administrer"
|
||||||
|
msgstr "Manage"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election.html:67
|
||||||
|
#, python-format
|
||||||
|
msgid "Créé par %(creator)s"
|
||||||
|
msgstr "Created by %(creator)s"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election.html:80
|
||||||
|
msgid "Votre vote a bien été enregistré."
|
||||||
|
msgstr "Your vote has been recorded."
|
||||||
|
|
||||||
|
#: elections/templates/elections/election.html:107
|
||||||
|
msgid "Voter"
|
||||||
|
msgstr "Vote"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election.html:118
|
||||||
|
msgid ""
|
||||||
|
"Pour voter lors de cette élection, vous devez vous connecter à l'aide des "
|
||||||
|
"identifiants reçus par mail."
|
||||||
|
msgstr ""
|
||||||
|
"To vote in this election, you must log in using the login credentials you "
|
||||||
|
"received by e-mail."
|
||||||
|
|
||||||
|
#: elections/templates/elections/election.html:120
|
||||||
|
#: elections/templates/elections/election_voters.html:44
|
||||||
|
msgid ""
|
||||||
|
"Pour voter lors de cette élection, vous devez vous connecter à l'aide du CAS "
|
||||||
|
"élève, d'autres restrictions peuvent s'appliquer et votre vote pourra être "
|
||||||
|
"supprimé si vous n'avez pas le droit de vote."
|
||||||
|
msgstr ""
|
||||||
|
"To vote in this election you must log in using the student CAS, other "
|
||||||
|
"restrictions may apply and your vote may be deleted if you are not eligible "
|
||||||
|
"to vote."
|
||||||
|
|
||||||
|
#: elections/templates/elections/election.html:136
|
||||||
|
msgid "Connexion par identifiants"
|
||||||
|
msgstr "Login with credentials"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election.html:147
|
||||||
|
#: shared/templates/authens/login_switch.html:20
|
||||||
|
msgid "Connexion via CAS"
|
||||||
|
msgstr "Login via CAS"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election.html:175
|
||||||
|
msgid "A voté"
|
||||||
|
msgstr "Voted"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_admin.html:41
|
||||||
|
msgid "Actions"
|
||||||
|
msgstr "Actions"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_admin.html:54
|
||||||
|
#: elections/templates/elections/election_admin.html:177
|
||||||
|
#: elections/templates/elections/election_admin.html:200
|
||||||
|
msgid "Modifier"
|
||||||
|
msgstr "Edit"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_admin.html:63
|
||||||
|
#: elections/templates/elections/upload_voters.html:25
|
||||||
|
msgid "Gestion de la liste de votant·e·s"
|
||||||
|
msgstr "Management of the voters' list"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_admin.html:75
|
||||||
|
#: elections/templates/elections/election_voters.html:27
|
||||||
|
msgid "Liste des votant·e·s"
|
||||||
|
msgstr "Voters' list"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_admin.html:83
|
||||||
|
msgid "Dépouiller"
|
||||||
|
msgstr "Count"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_admin.html:94
|
||||||
|
msgid "Publier"
|
||||||
|
msgstr "Publish"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_admin.html:96
|
||||||
|
msgid "Dépublier"
|
||||||
|
msgstr "De-publish"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_admin.html:106
|
||||||
|
msgid "Archiver"
|
||||||
|
msgstr "Archive"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_admin.html:243
|
||||||
|
#: elections/templates/elections/election_admin.html:254
|
||||||
|
msgid "Rajouter une option"
|
||||||
|
msgstr "Add an option"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_admin.html:258
|
||||||
|
#: elections/templates/elections/election_admin.html:268
|
||||||
|
msgid "Rajouter une question"
|
||||||
|
msgstr "Add a question"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_create.html:31
|
||||||
|
msgid "Création d'une élection"
|
||||||
|
msgstr "Creating an election"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_list.html:10
|
||||||
|
msgid "Liste des élections"
|
||||||
|
msgstr "List of elections"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_list.html:21
|
||||||
|
msgid "Créer une élection"
|
||||||
|
msgstr "Create an election"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_list.html:54
|
||||||
|
msgid "Élection dépouillée"
|
||||||
|
msgstr "Election counted"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_list.html:60
|
||||||
|
msgid "Élection publiée"
|
||||||
|
msgstr "Published election"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_list.html:66
|
||||||
|
msgid "Élection archivée"
|
||||||
|
msgstr "Archived election"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_update.html:31
|
||||||
|
msgid "Modification d'une élection"
|
||||||
|
msgstr "Editing an election"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_voters.html:42
|
||||||
|
msgid ""
|
||||||
|
"Seules les personnes présentes sur cette liste peuvent voter, vous avez dû "
|
||||||
|
"recevoir un mail avec vos identifiants de connexion."
|
||||||
|
msgstr ""
|
||||||
|
"Only people on this list can vote, you should have received an e-mail with "
|
||||||
|
"your login credentials."
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_voters.html:54
|
||||||
|
#: elections/templates/elections/upload_voters.html:105
|
||||||
|
msgid "Nom"
|
||||||
|
msgstr "Name"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_voters.html:55
|
||||||
|
msgid "Vote enregistré"
|
||||||
|
msgstr "Recorded vote"
|
||||||
|
|
||||||
|
#: elections/templates/elections/election_voters.html:89
|
||||||
|
#, python-format
|
||||||
|
msgid "Supprimer le vote de %(v_name)s"
|
||||||
|
msgstr "Delete the vote of %(v_name)s"
|
||||||
|
|
||||||
|
#: elections/templates/elections/mail_voters.html:7
|
||||||
|
msgid "Composition du mail aux votant·e·s"
|
||||||
|
msgstr "Composition of the e-mail to voters"
|
||||||
|
|
||||||
|
#: elections/templates/elections/mail_voters.html:12
|
||||||
|
msgid ""
|
||||||
|
"Assurez-vous que la liste des votant·e·s est complète, en effet, une fois le "
|
||||||
|
"mail envoyé, il ne sera plus possible de la modifier."
|
||||||
|
msgstr ""
|
||||||
|
"Make sure that the list of voters is complete, as once the e-mail is sent, "
|
||||||
|
"it will not be possible to change it."
|
||||||
|
|
||||||
|
#: elections/templates/elections/mail_voters.html:17
|
||||||
|
#, python-brace-format
|
||||||
|
msgid ""
|
||||||
|
"Rajoutez le message à envoyer aux électeurs entre 'Dear {full_name}' et "
|
||||||
|
"l'url de l'élection."
|
||||||
|
msgstr ""
|
||||||
|
"Add the message to be sent to voters between 'Dear {full_name}' and the "
|
||||||
|
"election url."
|
||||||
|
|
||||||
|
#: elections/templates/elections/mail_voters.html:34
|
||||||
|
msgid "Envoyer"
|
||||||
|
msgstr "Send"
|
||||||
|
|
||||||
|
#: elections/templates/elections/option_update.html:13
|
||||||
|
msgid "Modification d'une option"
|
||||||
|
msgstr "Editing an option"
|
||||||
|
|
||||||
|
#: elections/templates/elections/question_update.html:13
|
||||||
|
msgid "Modification d'une question"
|
||||||
|
msgstr "Editing a question"
|
||||||
|
|
||||||
|
#: elections/templates/elections/results/rank.html:39
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"L'option %(winner)s est préférée à l'option %(loser)s par %(cell)s voix."
|
||||||
|
msgstr ""
|
||||||
|
"The %(winner)s option is preferred to the %(loser)s option by %(cell)s votes."
|
||||||
|
|
||||||
|
#: elections/templates/elections/results/rank.html:51
|
||||||
|
msgid ""
|
||||||
|
"La matrice des résultats montre les points d'avance, l'option gagnante est "
|
||||||
|
"affichée sur la colonne et la perdante sur la ligne. "
|
||||||
|
msgstr ""
|
||||||
|
"The results matrix shows the lead points, with the winning option displayed "
|
||||||
|
"in the column and the losing option in the row. "
|
||||||
|
|
||||||
|
#: elections/templates/elections/results/select.html:4
|
||||||
|
msgid "L'option majoritaire et gagnante est colorée en vert."
|
||||||
|
msgstr "The dominant and winning option is coloured green."
|
||||||
|
|
||||||
|
#: elections/templates/elections/upload_voters.html:36
|
||||||
|
msgid "Envoyer le mail d'annonce"
|
||||||
|
msgstr "Send the announcement e-mail"
|
||||||
|
|
||||||
|
#: elections/templates/elections/upload_voters.html:57
|
||||||
|
msgid ""
|
||||||
|
"Importez un fichier au format CSV, avec sur la première colonne le login, "
|
||||||
|
"sur la deuxième, le nom et prénom et enfin l'adresse email sur la troisième. "
|
||||||
|
"Soit :<br><br><pre>Login_1,Prénom/Nom_1,mail_1@machin.test<br>Login_2,Prénom/"
|
||||||
|
"Nom_2,mail_2@bidule.test<br>...</pre>"
|
||||||
|
msgstr ""
|
||||||
|
"Import a file in CSV format, with the login in the first column, the first "
|
||||||
|
"and last name in the second and the e-mail address in the third. So:"
|
||||||
|
"<br><br><pre>Login_1,Firstname/Lastname_1,mail_1@thing.test<br>Login_2,"
|
||||||
|
"Firstname/Lastname_2,mail_2@thingy.test<br>...</pre>"
|
||||||
|
|
||||||
|
#: elections/templates/elections/upload_voters.html:83
|
||||||
|
msgid "Importer"
|
||||||
|
msgstr "Import"
|
||||||
|
|
||||||
|
#: elections/templates/elections/upload_voters.html:96
|
||||||
|
msgid "Liste des votant·e·s pour cette élection"
|
||||||
|
msgstr "List of voters for this election"
|
||||||
|
|
||||||
|
#: elections/templates/elections/upload_voters.html:104
|
||||||
|
msgid "Login"
|
||||||
|
msgstr "Login"
|
||||||
|
|
||||||
|
#: elections/templates/elections/upload_voters.html:106
|
||||||
|
msgid "Email"
|
||||||
|
msgstr "E-mail"
|
||||||
|
|
||||||
|
#: elections/templates/elections/vote.html:25
|
||||||
|
#: elections/templates/elections/vote.html:76
|
||||||
|
msgid "Option(s) selectionnée(s)"
|
||||||
|
msgstr "Selected option(s)"
|
||||||
|
|
||||||
|
#: elections/templates/elections/vote.html:75
|
||||||
|
msgid "Classement"
|
||||||
|
msgstr "Ranking"
|
||||||
|
|
||||||
|
#: elections/templates/elections/vote.html:101
|
||||||
|
msgid "Vote pour la question :"
|
||||||
|
msgstr "Vote for the question:"
|
||||||
|
|
||||||
|
#: elections/templates/elections/vote.html:142
|
||||||
|
msgid "Confirmation du vote"
|
||||||
|
msgstr "Confirmation of the vote"
|
||||||
|
|
||||||
|
#: elections/templates/elections/vote.html:154
|
||||||
|
msgid "Confirmer"
|
||||||
|
msgstr "Confirm"
|
||||||
|
|
||||||
|
#: elections/templates/elections/vote.html:161
|
||||||
|
#: shared/templates/forms/modal-form.html:30
|
||||||
|
msgid "Annuler"
|
||||||
|
msgstr "Cancel"
|
||||||
|
|
||||||
|
#: elections/utils.py:206
|
||||||
|
msgid "Vous devez sélectionnner une option."
|
||||||
|
msgstr "You must select an option."
|
||||||
|
|
||||||
|
#: elections/utils.py:211
|
||||||
|
msgid "Vous ne pouvez pas sélectionner plus d'une option."
|
||||||
|
msgstr "You cannot select more than one option."
|
||||||
|
|
||||||
|
#: elections/utils.py:228
|
||||||
|
msgid "Le classement maximal est {}."
|
||||||
|
msgstr "The maximum ranking is {}."
|
||||||
|
|
||||||
|
#: elections/utils.py:232
|
||||||
|
msgid "Le classement minimal est 1."
|
||||||
|
msgstr "The minimum ranking is 1."
|
||||||
|
|
||||||
|
#: elections/utils.py:289
|
||||||
|
msgid ""
|
||||||
|
"Format invalide. Vérifiez que le fichier est bien formé (i.e. chaque ligne "
|
||||||
|
"de la forme 'login,nom,email')."
|
||||||
|
msgstr ""
|
||||||
|
"Invalid format. Check that the file is properly formed (i.e. each line of "
|
||||||
|
"the form 'login,name,e-mail')."
|
||||||
|
|
||||||
|
#: elections/utils.py:303
|
||||||
|
msgid "La ligne {} n'a pas le bon nombre d'éléments."
|
||||||
|
msgstr "The line {} has the wrong number of elements."
|
||||||
|
|
||||||
|
#: elections/utils.py:308
|
||||||
|
msgid "Valeur manquante dans la ligne {} : 'login'."
|
||||||
|
msgstr "Missing value in line {}: 'login'."
|
||||||
|
|
||||||
|
#: elections/utils.py:313
|
||||||
|
msgid "Doublon dans les logins : lignes {} et {}."
|
||||||
|
msgstr "Duplicate logins: lines {} and {}."
|
||||||
|
|
||||||
|
#: elections/utils.py:321
|
||||||
|
msgid "Valeur manquante dans la ligne {} : 'nom'."
|
||||||
|
msgstr "Missing value in line {}: 'name'."
|
||||||
|
|
||||||
|
#: elections/utils.py:327
|
||||||
|
msgid "Adresse mail invalide à la ligne {} : '{}'."
|
||||||
|
msgstr "Invalid e-mail address in line {}: '{}'."
|
||||||
|
|
||||||
|
#: elections/views.py:69
|
||||||
|
msgid "Élection créée avec succès !"
|
||||||
|
msgstr "Election successfully created!"
|
||||||
|
|
||||||
|
#: elections/views.py:113
|
||||||
|
msgid "Liste de votant·e·s importée avec succès !"
|
||||||
|
msgstr "Voters list successfully imported!"
|
||||||
|
|
||||||
|
#: elections/views.py:147
|
||||||
|
msgid "Mail d'annonce envoyé avec succès !"
|
||||||
|
msgstr "Announcement e-mail sent successfully!"
|
||||||
|
|
||||||
|
#: elections/views.py:179
|
||||||
|
msgid "Élection modifiée avec succès !"
|
||||||
|
msgstr "Election successfully modified!"
|
||||||
|
|
||||||
|
#: elections/views.py:249
|
||||||
|
msgid "Élection dépouillée avec succès !"
|
||||||
|
msgstr "Election successfully counted!"
|
||||||
|
|
||||||
|
#: elections/views.py:275
|
||||||
|
msgid "Élection publiée avec succès !"
|
||||||
|
msgstr "Election successfully published!"
|
||||||
|
|
||||||
|
#: elections/views.py:276
|
||||||
|
msgid "Élection dépubliée avec succès !"
|
||||||
|
msgstr "Election successfully de-published!"
|
||||||
|
|
||||||
|
#: elections/views.py:288
|
||||||
|
msgid "Élection archivée avec succès !"
|
||||||
|
msgstr "Election successfully archived!"
|
||||||
|
|
||||||
|
#: elections/views.py:320
|
||||||
|
msgid "Question modifiée avec succès !"
|
||||||
|
msgstr "Question successfully modified!"
|
||||||
|
|
||||||
|
#: elections/views.py:332
|
||||||
|
msgid "Question supprimée !"
|
||||||
|
msgstr "Question deleted!"
|
||||||
|
|
||||||
|
#: elections/views.py:370
|
||||||
|
msgid "Option modifiée avec succès !"
|
||||||
|
msgstr "Option successfully modified!"
|
||||||
|
|
||||||
|
#: elections/views.py:382
|
||||||
|
msgid "Option supprimée !"
|
||||||
|
msgstr "Option deleted!"
|
||||||
|
|
||||||
|
#: elections/views.py:522
|
||||||
|
msgid "Votre choix a bien été enregistré !"
|
||||||
|
msgstr "Your choice has been recorded!"
|
||||||
|
|
||||||
|
#: kadenios/settings/common.py:138
|
||||||
|
msgid "Français"
|
||||||
|
msgstr "French"
|
||||||
|
|
||||||
|
#: kadenios/settings/common.py:139
|
||||||
|
msgid "Anglais"
|
||||||
|
msgstr "English"
|
||||||
|
|
||||||
|
#: shared/auth/forms.py:13
|
||||||
|
msgid "Identifiant"
|
||||||
|
msgstr "Username"
|
||||||
|
|
||||||
|
#: shared/auth/forms.py:15
|
||||||
|
msgid "Mot de passe"
|
||||||
|
msgstr "Password"
|
||||||
|
|
||||||
|
#: shared/auth/forms.py:50
|
||||||
|
msgid ""
|
||||||
|
"Aucun·e électeur·ice avec cet identifiant et mot de passe n'existe pour "
|
||||||
|
"cette élection. Vérifiez que les informations rentrées sont correctes, les "
|
||||||
|
"champs sont sensibles à la casse."
|
||||||
|
msgstr ""
|
||||||
|
"No voter with this username and password exists for this election. Check "
|
||||||
|
"that the information entered is correct, the fields are case sensitive."
|
||||||
|
|
||||||
|
#: shared/templates/auth/election_login.html:9
|
||||||
|
#: shared/templates/authens/login_switch.html:33
|
||||||
|
#: shared/templates/authens/pwd_login.html:9
|
||||||
|
msgid "Connexion par mot de passe"
|
||||||
|
msgstr "Password login"
|
||||||
|
|
||||||
|
#: shared/templates/authens/login_switch.html:9
|
||||||
|
msgid "Choisissez la méthode de connexion"
|
||||||
|
msgstr "Choose the connection method"
|
||||||
|
|
||||||
|
#: shared/templates/authens/pwd_login.html:42
|
||||||
|
msgid "Mot de passe oublié :"
|
||||||
|
msgstr "Forgotten password:"
|
||||||
|
|
||||||
|
#: shared/templates/authens/pwd_login.html:48
|
||||||
|
msgid "Réinitialiser mon mot de passe."
|
||||||
|
msgstr "Reset my password."
|
||||||
|
|
||||||
|
#: shared/templates/authens/pwd_reset.html:9
|
||||||
|
#: shared/templates/authens/pwd_reset_confirm.html:9
|
||||||
|
msgid "Réinitialisation du mot de passe"
|
||||||
|
msgstr "Password reset"
|
||||||
|
|
||||||
|
#: shared/templates/authens/pwd_reset.html:25
|
||||||
|
msgid "Envoyer un mail"
|
||||||
|
msgstr "Send an e-mail"
|
||||||
|
|
||||||
|
#: shared/templates/base.html:113
|
||||||
|
msgid "Élections"
|
||||||
|
msgstr "Elections"
|
||||||
|
|
||||||
|
#: shared/templates/base.html:125
|
||||||
|
#, python-format
|
||||||
|
msgid "Connecté·e en tant que %(name)s par %(connection)s"
|
||||||
|
msgstr "Logged in as %(name)s via %(connection)s"
|
||||||
|
|
||||||
|
#: shared/templates/base.html:141
|
||||||
|
msgid "Se connecter"
|
||||||
|
msgstr "Log in"
|
||||||
|
|
||||||
|
#: shared/templates/base.html:224
|
||||||
|
msgid ""
|
||||||
|
"Développé par <a class=\"tag is-light is-danger\" href=\"https://www.eleves."
|
||||||
|
"ens.fr/kde\">KDEns</a>. En cas de pépin, contacter <span class=\"tag is-info "
|
||||||
|
"is-light\">klub-dev [at] ens [dot] fr</span>."
|
||||||
|
msgstr ""
|
||||||
|
"Developed by <a class=\"tag is-light is-danger\" href=\"https://www.eleves."
|
||||||
|
"ens.fr/kde\">KDEns</a>. In case of glitches, contact <span class=\"tag is-"
|
||||||
|
"info is-light\">klub-dev [at] ens [dot] fr</span>."
|
||||||
|
|
||||||
|
#: shared/templates/forms/file.html:17
|
||||||
|
msgid "Choisissez un fichier..."
|
||||||
|
msgstr "Choose a file..."
|
||||||
|
|
||||||
|
#: shared/templates/forms/file.html:21
|
||||||
|
msgid "Aucun fichier sélectionné"
|
||||||
|
msgstr "No file selected"
|
||||||
|
|
||||||
|
#: shared/templates/kadenios.html:7
|
||||||
|
msgid "Bienvenue sur Kadenios"
|
||||||
|
msgstr "Welcome to Kadenios"
|
||||||
|
|
||||||
|
#: shared/templates/kadenios.html:10
|
||||||
|
msgid "La plateforme Kadenios permet de créer des élections."
|
||||||
|
msgstr "The Kadenios platform provides a way to create elections."
|
||||||
|
|
||||||
|
#: shared/templates/registration/logged_out.html:9
|
||||||
|
msgid "Déconnexion réussie"
|
||||||
|
msgstr "Successfully logged out"
|
||||||
|
|
||||||
|
#: shared/templates/registration/logged_out.html:22
|
||||||
|
msgid "Se reconnecter"
|
||||||
|
msgstr "Log back in"
|
||||||
|
|
||||||
|
#: shared/templates/registration/logged_out.html:31
|
||||||
|
msgid "Accueil"
|
||||||
|
msgstr "Home"
|
||||||
|
|
||||||
|
#~ msgid " [{}] :"
|
||||||
|
#~ msgstr " [{}]:"
|
||||||
|
|
||||||
|
#~ msgid "Valider"
|
||||||
|
#~ msgstr "Confirm"
|
7
shared/static/images/en.svg
Normal file
7
shared/static/images/en.svg
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" id="flag-icon-css-gb" viewBox="0 0 640 480">
|
||||||
|
<path fill="#012169" d="M0 0h640v480H0z"/>
|
||||||
|
<path fill="#FFF" d="M75 0l244 181L562 0h78v62L400 241l240 178v61h-80L320 301 81 480H0v-60l239-178L0 64V0h75z"/>
|
||||||
|
<path fill="#C8102E" d="M424 281l216 159v40L369 281h55zm-184 20l6 35L54 480H0l240-179zM640 0v3L391 191l2-44L590 0h50zM0 0l239 176h-60L0 42V0z"/>
|
||||||
|
<path fill="#FFF" d="M241 0v480h160V0H241zM0 160v160h640V160H0z"/>
|
||||||
|
<path fill="#C8102E" d="M0 193v96h640v-96H0zM273 0v480h96V0h-96z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 538 B |
7
shared/static/images/fr.svg
Normal file
7
shared/static/images/fr.svg
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" id="flag-icon-css-fr" viewBox="0 0 640 480">
|
||||||
|
<g fill-rule="evenodd" stroke-width="1pt">
|
||||||
|
<path fill="#fff" d="M0 0h640v480H0z"/>
|
||||||
|
<path fill="#00267f" d="M0 0h213.3v480H0z"/>
|
||||||
|
<path fill="#f31830" d="M426.7 0H640v480H426.7z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 292 B |
|
@ -82,6 +82,16 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Language selection
|
||||||
|
var $langs = document.querySelectorAll('.dropdown-item.lang-selector') || [];
|
||||||
|
|
||||||
|
$langs.forEach($lang => {
|
||||||
|
$lang.addEventListener('click', () => {
|
||||||
|
document.getElementById('lang-input').value = $lang.dataset.lang;
|
||||||
|
document.getElementById('lang-form').submit();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
@ -105,35 +115,81 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% block auth %}
|
|
||||||
<div class="level-right px-5">
|
<div class="level-right px-5">
|
||||||
{% if user.is_authenticated %}
|
{% block auth %}
|
||||||
<div class="level is-mobile">
|
<div class="level-item">
|
||||||
<div class="level-item mr-5">
|
{% if user.is_authenticated %}
|
||||||
<div class="tag">
|
<div class="level is-mobile">
|
||||||
{% blocktrans with name=user.get_username connection=user.connection_method %}Connecté·e en tant que {{ name }} par {{ connection }}{% endblocktrans %}
|
<div class="level-item">
|
||||||
|
<div class="tag">
|
||||||
|
{% blocktrans with name=user.get_username connection=user.connection_method %}Connecté·e en tant que {{ name }} par {{ connection }}{% endblocktrans %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="level-item">
|
||||||
|
<a class="button is-primary" href="{% url 'authens:logout' %}?next={% if view.get_next_url %}{{ view.get_next_url }}{% else %}/{% endif %}">
|
||||||
|
<span class="icon is-size-1">
|
||||||
|
<i class="fas fa-sign-out-alt"></i>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% else %}
|
||||||
|
|
||||||
<div class="level-item ml-3 py-4">
|
<div class="level-item py-2">
|
||||||
<a class="icon is-size-1 has-text-white" href="{% url 'authens:logout' %}?next={% if view.get_next_url %}{{ view.get_next_url }}{% else %}/{% endif %}">
|
<a class="button" href="{% url 'authens:login' %}?next={{ request.path }}">
|
||||||
<i class="fas fa-sign-out-alt"></i>
|
<span class="is-size-5">{% trans "Se connecter" %}</span>
|
||||||
|
<span class="icon is-size-4">
|
||||||
|
<i class="fas fa-sign-in-alt"></i>
|
||||||
|
</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% endblock %}
|
||||||
|
|
||||||
<div class="level-item py-2">
|
{# Choix de la langue #}
|
||||||
<a class="tag has-text-primary is-size-5" href="{% url 'authens:login' %}?next={{ request.path }}">
|
<div class="level-item">
|
||||||
<span>{% trans "Se connecter" %}</span>
|
{% get_current_language as LANGUAGE_CODE %}
|
||||||
<span class="icon">
|
{% get_available_languages as LANGUAGES %}
|
||||||
<i class="fas fa-sign-in-alt"></i>
|
{% get_language_info_list for LANGUAGES as langs %}
|
||||||
</span>
|
|
||||||
</a>
|
<form action="{% url "set_language" %}" method="POST" id="lang-form">
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="hidden" name="language" id="lang-input">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<div class="dropdown is-hoverable is-right">
|
||||||
|
<div class="dropdown-trigger">
|
||||||
|
<a class="button is-primary is-large" aria-haspopup="true" aria-controls="dropdown-menu">
|
||||||
|
<span class="icon is-size-2">
|
||||||
|
<i class="fas fa-language"></i>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="dropdown-menu">
|
||||||
|
<div class="dropdown-content">
|
||||||
|
{% for lang in langs %}
|
||||||
|
{% with lang_svg="images/"|add:lang.code|add:".svg" %}
|
||||||
|
<a class="dropdown-item lang-selector" data-lang="{{ lang.code }}">
|
||||||
|
<span class="icon-text">
|
||||||
|
<span class="icon">
|
||||||
|
<img src="{% static lang_svg %}">
|
||||||
|
</span>
|
||||||
|
<span class="ml-1">{{ lang.name_translated }}</span>
|
||||||
|
</span>
|
||||||
|
{% endwith %}
|
||||||
|
</a>
|
||||||
|
{% if not forloop.last %}
|
||||||
|
<hr class="dropdown-divider">
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
|
||||||
</nav>
|
</nav>
|
||||||
{% block layout %}
|
{% block layout %}
|
||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
<a class="button is-primary button-close">
|
<a class="button is-primary button-close">
|
||||||
<span class="icon">
|
<span class="icon">
|
||||||
<i class="fas fa-undo-alt"></i>
|
<i class="fas fa-times"></i>
|
||||||
</span>
|
</span>
|
||||||
<span>{% trans "Annuler" %}</span>
|
<span>{% trans "Annuler" %}</span>
|
||||||
</a>
|
</a>
|
||||||
|
|
|
@ -4,11 +4,9 @@
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
{% blocktrans %}
|
<h1 class="title">{% trans "Bienvenue sur Kadenios" %}</h1>
|
||||||
<h1 class="title">Bienvenue sur Kadenios</h1>
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
La plateforme Kadenios permet de créer des élections.
|
{% trans "La plateforme Kadenios permet de créer des élections." %}
|
||||||
{% endblocktrans %}
|
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
Loading…
Reference in a new issue