Translate draw messages
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
parent
d84db949c6
commit
05c6333c5e
|
@ -122,6 +122,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
self.tournament = await Tournament.objects.filter(pk=self.tournament_id)\
|
||||
.prefetch_related('draw__current_round__current_pool__current_team__participation__team').aget()
|
||||
|
||||
translation.activate(settings.PREFERRED_LANGUAGE_CODE)
|
||||
|
||||
match content['type']:
|
||||
case 'set_language':
|
||||
# Update the translation language
|
||||
|
@ -233,8 +235,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
await self.channel_layer.group_send(f"tournament-{self.tournament.id}",
|
||||
{'tid': self.tournament_id, 'type': 'draw.notify',
|
||||
'title': 'Tirage au sort du TFJM²',
|
||||
'body': "Le tirage au sort du tournoi de "
|
||||
f"{self.tournament.name} a commencé !"})
|
||||
'body': _("The draw of tournament {tournament} started!")
|
||||
.format(tournament=self.tournament.name)})
|
||||
|
||||
async def draw_start(self, content) -> None:
|
||||
"""
|
||||
|
@ -403,8 +405,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
await self.channel_layer.group_send(
|
||||
f"team-{dup.participation.team.trigram}",
|
||||
{'tid': self.tournament_id, 'type': 'draw.notify', 'title': 'Tirage au sort du TFJM²',
|
||||
'body': 'Votre score de dé est identique à celui de une ou plusieurs équipes. '
|
||||
'Veuillez le relancer.'}
|
||||
'body': _("Your dice score is identical to the one of one or multiple teams. "
|
||||
"Please relaunch it.")}
|
||||
)
|
||||
# Alert the tournament
|
||||
await self.channel_layer.group_send(
|
||||
|
@ -448,7 +450,7 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
# We can add a joker team if there is not already a team in the pool that was in the same pool
|
||||
# in the first round, and such that the number of such jokers is exactly the free space of the current pool.
|
||||
# Exception: if there is one only pool with 5 teams, we exchange the first and the last teams of the pool.
|
||||
if not self.tournament.final:
|
||||
if not self.tournament.final and settings.TFJM_APP == "TFJM":
|
||||
tds_copy = sorted(tds, key=lambda td: (td.passage_index, -td.pool.letter,))
|
||||
jokers = [td for td in tds if td.passage_index == 4]
|
||||
round2 = await self.tournament.draw.round_set.filter(number=2).aget()
|
||||
|
@ -502,12 +504,11 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
await self.tournament.draw.current_round.asave()
|
||||
|
||||
# Display dice result in the header of the information alert
|
||||
msg = "Les résultats des dés sont les suivants : "
|
||||
msg += ", ".join(f"<strong>{td.participation.team.trigram}</strong> ({td.passage_dice})" for td in tds)
|
||||
msg += ". L'ordre de passage et les compositions des différentes poules sont affiché⋅es sur le côté. "
|
||||
msg += "Les ordres de passage pour le premier tour sont déterminés à partir des scores des dés, "
|
||||
msg += "dans l'ordre croissant. Pour le deuxième tour, les ordres de passage sont déterminés à partir "
|
||||
msg += "des ordres de passage du premier tour."
|
||||
trigrams = ", ".join(f"<strong>{td.participation.team.trigram}</strong> ({td.passage_dice})" for td in tds)
|
||||
msg = _("The dice results are the following: {trigrams}. "
|
||||
"The passage order and the compositions of the different pools are displayed on the side. "
|
||||
"The passage orders for the first round are determined from the dice scores, in increasing order. "
|
||||
"For the second round, the passage orders are determined from the passage orders of the first round.")
|
||||
self.tournament.draw.last_message = msg
|
||||
await self.tournament.draw.asave()
|
||||
|
||||
|
@ -610,8 +611,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
# Notify the team that it can draw a problem
|
||||
await self.channel_layer.group_send(f"team-{tds[0].participation.team.trigram}",
|
||||
{'tid': self.tournament_id, 'type': 'draw.notify',
|
||||
'title': "À votre tour !",
|
||||
'body': "C'est à vous de tirer un nouveau problème !"})
|
||||
'title': _("Your turn!"),
|
||||
'body': _("It's your turn to draw a problem!")})
|
||||
|
||||
async def select_problem(self, **kwargs):
|
||||
"""
|
||||
|
@ -631,7 +632,7 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
.prefetch_related('team').aget()
|
||||
# Ensure that the user can draws a problem at this time
|
||||
if participation.id != td.participation_id:
|
||||
return await self.alert("This is not your turn.", 'danger')
|
||||
return await self.alert(_("This is not your turn."), 'danger')
|
||||
|
||||
while True:
|
||||
# Choose a random problem
|
||||
|
@ -702,19 +703,20 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
.prefetch_related('team').aget()
|
||||
# Ensure that the user can accept a problem at this time
|
||||
if participation.id != td.participation_id:
|
||||
return await self.alert("This is not your turn.", 'danger')
|
||||
return await self.alert(_("This is not your turn."), 'danger')
|
||||
|
||||
td.accepted = td.purposed
|
||||
td.purposed = None
|
||||
await td.asave()
|
||||
|
||||
trigram = td.participation.team.trigram
|
||||
msg = f"L'équipe <strong>{trigram}</strong> a accepté le problème <strong>{td.accepted} : " \
|
||||
f"{settings.PROBLEMS[td.accepted - 1]}</strong>. "
|
||||
msg = _("The team <strong>{trigram}</strong> accepted the problem <string>{problem}</strong>: "
|
||||
"{problem_name}. ").format(trigram=trigram, problem=td.accepted,
|
||||
problem_name=settings.PROBLEMS[td.accepted - 1])
|
||||
if pool.size == 5 and await pool.teamdraw_set.filter(accepted=td.accepted).acount() < 2:
|
||||
msg += "Une équipe peut encore l'accepter."
|
||||
msg += _("One team more can accept this problem.")
|
||||
else:
|
||||
msg += "Plus personne ne peut l'accepter."
|
||||
msg += _("No team can accept this problem anymore.")
|
||||
self.tournament.draw.last_message = msg
|
||||
await self.tournament.draw.asave()
|
||||
|
||||
|
@ -749,8 +751,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
# Notify the team that it can draw a problem
|
||||
await self.channel_layer.group_send(f"team-{new_trigram}",
|
||||
{'tid': self.tournament_id, 'type': 'draw.notify',
|
||||
'title': "À votre tour !",
|
||||
'body': "C'est à vous de tirer un nouveau problème !"})
|
||||
'title': _("Your turn!"),
|
||||
'body': _("It's your turn to draw a problem!")})
|
||||
else:
|
||||
# Pool is ended
|
||||
await self.end_pool(pool)
|
||||
|
@ -808,8 +810,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
'problems': [td.accepted async for td in pool.team_draws],
|
||||
})
|
||||
|
||||
msg += f"<br><br>Le tirage de la poule {pool.get_letter_display()}{r.number} est terminé. " \
|
||||
f"Le tableau récapitulatif est en bas."
|
||||
msg += "<br><br>" + _("The draw of the pool {pool} is ended. The summary is below.") \
|
||||
.format(pool=f"{pool.get_letter_display()}{r.number}")
|
||||
self.tournament.draw.last_message = msg
|
||||
await self.tournament.draw.asave()
|
||||
|
||||
|
@ -826,8 +828,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
# Notify the team that it can draw a dice
|
||||
await self.channel_layer.group_send(f"team-{td.participation.team.trigram}",
|
||||
{'tid': self.tournament_id, 'type': 'draw.notify',
|
||||
'title': "À votre tour !",
|
||||
'body': "C'est à vous de lancer le dé !"})
|
||||
'title': _("Your turn!"),
|
||||
'body': _("It's your turn to launch the dice!")})
|
||||
|
||||
await self.channel_layer.group_send(f"tournament-{self.tournament.id}",
|
||||
{'tid': self.tournament_id, 'type': 'draw.dice_visibility',
|
||||
|
@ -843,11 +845,11 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
"""
|
||||
msg = self.tournament.draw.last_message
|
||||
|
||||
if r.number < settings.NB_ROUNDS and not self.tournament.final:
|
||||
if r.number < settings.NB_ROUNDS and not self.tournament.final and settings.TFJM_APP == "TFJM":
|
||||
# Next round
|
||||
next_round = await self.tournament.draw.round_set.filter(number=r.number + 1).aget()
|
||||
self.tournament.draw.current_round = next_round
|
||||
msg += f"<br><br>Le tirage au sort du tour {r.number} est terminé."
|
||||
msg += "<br><br>" + _("The draw of the round {round} is ended.").format(round=r.number)
|
||||
self.tournament.draw.last_message = msg
|
||||
await self.tournament.draw.asave()
|
||||
|
||||
|
@ -860,8 +862,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
# Notify the team that it can draw a dice
|
||||
await self.channel_layer.group_send(f"team-{participation.team.trigram}",
|
||||
{'tid': self.tournament_id, 'type': 'draw.notify',
|
||||
'title': "À votre tour !",
|
||||
'body': "C'est à vous de lancer le dé !"})
|
||||
'title': _("Your turn!"),
|
||||
'body': _("It's your turn to launch the dice!")})
|
||||
|
||||
# Reorder dices
|
||||
await self.channel_layer.group_send(f"tournament-{self.tournament.id}",
|
||||
|
@ -888,9 +890,9 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
await self.channel_layer.group_send(f"volunteer-{self.tournament.id}",
|
||||
{'tid': self.tournament_id, 'type': 'draw.dice_visibility',
|
||||
'visible': True})
|
||||
elif r.number == 1 and self.tournament.final:
|
||||
elif r.number == 1 and (self.tournament.final or settings.TFJM_APP == "ETEAM"):
|
||||
# For the final tournament, we wait for a manual update between the two rounds.
|
||||
msg += "<br><br>Le tirage au sort du tour 1 est terminé."
|
||||
msg += "<br><br>" + _("The draw of the first round is ended.")
|
||||
self.tournament.draw.last_message = msg
|
||||
await self.tournament.draw.asave()
|
||||
|
||||
|
@ -919,7 +921,7 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
.prefetch_related('team').aget()
|
||||
# Ensure that the user can reject a problem at this time
|
||||
if participation.id != td.participation_id:
|
||||
return await self.alert("This is not your turn.", 'danger')
|
||||
return await self.alert(_("This is not your turn."), 'danger')
|
||||
|
||||
# Add the problem to the rejected problems list
|
||||
problem = td.purposed
|
||||
|
@ -933,15 +935,16 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
|
||||
# Update messages
|
||||
trigram = td.participation.team.trigram
|
||||
msg = f"L'équipe <strong>{trigram}</strong> a refusé le problème <strong>{problem} : " \
|
||||
f"{settings.PROBLEMS[problem - 1]}</strong>. "
|
||||
msg = _("The team <strong>{trigram}</strong> refused the problem <strong>{problem}</strong>: "
|
||||
"{problem_name}.").format(trigram=trigram, problem=problem,
|
||||
problem_name=settings.PROBLEMS[problem - 1]) + " "
|
||||
if remaining >= 0:
|
||||
msg += f"Il lui reste {remaining} refus sans pénalité."
|
||||
msg += _("It remains {remaining} refusals without penalty.").format(remaining=remaining)
|
||||
else:
|
||||
if already_refused:
|
||||
msg += "Cela n'ajoute pas de pénalité."
|
||||
msg += _("This problem was already refused by this team.")
|
||||
else:
|
||||
msg += "Cela ajoute une pénalité de 25 % sur le coefficient de l'oral de la défense."
|
||||
msg += _("It adds a 25% penalty on the coefficient of the oral defense.")
|
||||
self.tournament.draw.last_message = msg
|
||||
await self.tournament.draw.asave()
|
||||
|
||||
|
@ -984,8 +987,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
# Notify the team that it can draw a problem
|
||||
await self.channel_layer.group_send(f"team-{new_trigram}",
|
||||
{'tid': self.tournament_id, 'type': 'draw.notify',
|
||||
'title': "À votre tour !",
|
||||
'body': "C'est à vous de tirer un nouveau problème !"})
|
||||
'title': _("Your turn!"),
|
||||
'body': _("It's your turn to draw a problem!")})
|
||||
|
||||
@ensure_orga
|
||||
async def export(self, **kwargs):
|
||||
|
@ -1022,17 +1025,17 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
|
||||
r2 = await self.tournament.draw.round_set.filter(number=2).aget()
|
||||
self.tournament.draw.current_round = r2
|
||||
msg = "Le tirage au sort pour le tour 2 va commencer. " \
|
||||
"L'ordre de passage est déterminé à partir du classement du premier tour, " \
|
||||
"de sorte à mélanger les équipes entre les deux jours."
|
||||
msg = _("The draw of the round 2 is starting. "
|
||||
"The passage order is determined from the ranking of the first round, "
|
||||
"in order to mix the teams between the two days.")
|
||||
self.tournament.draw.last_message = msg
|
||||
await self.tournament.draw.asave()
|
||||
|
||||
# Send notification to everyone
|
||||
await self.channel_layer.group_send(f"tournament-{self.tournament.id}",
|
||||
{'tid': self.tournament_id, 'type': 'draw.notify',
|
||||
'title': 'Tirage au sort du TFJM²',
|
||||
'body': "Le tirage au sort pour le second tour de la finale a commencé !"})
|
||||
'title': _("Draw") + " " + settings.APP_NAME,
|
||||
'body': _("The draw of the second round is starting!")})
|
||||
|
||||
# Set the first pool of the second round as the active pool
|
||||
pool = await Pool.objects.filter(round=self.tournament.draw.current_round, letter=1).aget()
|
||||
|
@ -1082,8 +1085,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||
# Notify the team that it can draw a problem
|
||||
await self.channel_layer.group_send(f"team-{td.participation.team.trigram}",
|
||||
{'tid': self.tournament_id, 'type': 'draw.notify',
|
||||
'title': "À votre tour !",
|
||||
'body': "C'est à vous de tirer un nouveau problème !"})
|
||||
'title': _("Your turn!"),
|
||||
'body': _("It's your turn to draw a problem!")})
|
||||
|
||||
await self.channel_layer.group_send(f"volunteer-{self.tournament.id}",
|
||||
{'tid': self.tournament_id, 'type': 'draw.dice_visibility',
|
||||
|
|
|
@ -110,58 +110,61 @@ class Draw(models.Model):
|
|||
# Waiting for dices to determine pools and passage order
|
||||
if self.current_round.number == 1:
|
||||
# Specific information for the first round
|
||||
s += """Nous allons commencer le tirage des problèmes.<br>
|
||||
Vous pouvez à tout moment poser toute question si quelque chose
|
||||
n'est pas clair ou ne va pas.<br><br>
|
||||
Nous allons d'abord tirer les poules et l'ordre de passage
|
||||
pour le premier tour avec toutes les équipes puis pour chaque poule,
|
||||
nous tirerons l'ordre de tirage pour le tour et les problèmes.<br><br>"""
|
||||
s += """
|
||||
Les capitaines, vous pouvez désormais toustes lancer un dé 100,
|
||||
en cliquant sur le gros bouton. Les poules et l'ordre de passage
|
||||
lors du premier tour sera l'ordre croissant des dés, c'est-à-dire
|
||||
que le plus petit lancer sera le premier à passer dans la poule A."""
|
||||
s += _("We are going to start the problem draw.<br>"
|
||||
"You can ask any question if something is not clear or wrong.<br><br>"
|
||||
"We are going to first draw the pools and the passage order for the first round "
|
||||
"with all the teams, then for each pool, we will draw the draw order and the problems.")
|
||||
s += "<br><br>"
|
||||
s += _("The captains, you can now all throw a 100-sided dice, by clicking on the big dice button. "
|
||||
"The pools and the passage order during the first round will be the increasing order "
|
||||
"of the dices, ie. the smallest dice will be the first to pass in pool A.")
|
||||
case 'DICE_ORDER_POULE':
|
||||
# Waiting for dices to determine the choice order
|
||||
s += f"""Nous passons au tirage des problèmes pour la poule
|
||||
<strong>{self.current_round.current_pool}</strong>, entre les équipes
|
||||
<strong>{', '.join(td.participation.team.trigram
|
||||
for td in self.current_round.current_pool.teamdraw_set.all())}</strong>.
|
||||
Les capitaines peuvent lancer un dé 100 en cliquant sur le gros bouton
|
||||
pour déterminer l'ordre de tirage. L'équipe réalisant le plus gros score pourra
|
||||
tirer en premier."""
|
||||
s += _("We are going to start the problem draw for the pool <strong>{pool}</strong>, "
|
||||
"between the teams <strong>{teams}</strong>. "
|
||||
"The captains can throw a 100-sided dice by clicking on the big dice button "
|
||||
"to determine the order of draw. The team with the highest score will draw first.") \
|
||||
.format(pool=self.current_round.current_pool,
|
||||
teams=', '.join(td.participation.team.trigram
|
||||
for td in self.current_round.current_pool.teamdraw_set.all()))
|
||||
case 'WAITING_DRAW_PROBLEM':
|
||||
# Waiting for a problem draw
|
||||
td = self.current_round.current_pool.current_team
|
||||
s += f"""C'est au tour de l'équipe <strong>{td.participation.team.trigram}</strong>
|
||||
de choisir son problème. Cliquez sur l'urne au milieu pour tirer un problème au sort."""
|
||||
s += _("The team <strong>{trigram}</strong> is going to draw a problem. "
|
||||
"Click on the urn in the middle to draw a problem.") \
|
||||
.format(trigram=td.participation.team.trigram)
|
||||
case 'WAITING_CHOOSE_PROBLEM':
|
||||
# Waiting for the team that can accept or reject the problem
|
||||
td = self.current_round.current_pool.current_team
|
||||
s += f"""L'équipe <strong>{td.participation.team.trigram}</strong> a tiré le problème
|
||||
<strong>{td.purposed} : {settings.PROBLEMS[td.purposed - 1]}</strong>. """
|
||||
s += _("The team <strong>{trigram}</strong> drew the problem <strong>{problem}: "
|
||||
"{problem_name}</strong>.") \
|
||||
.format(trigram=td.participation.team.trigram,
|
||||
problem=td.purposed, problem_name=settings.PROBLEMS[td.purposed - 1]) + " "
|
||||
if td.purposed in td.rejected:
|
||||
# The problem was previously rejected
|
||||
s += """Elle a déjà refusé ce problème auparavant, elle peut donc le refuser sans pénalité et
|
||||
tirer un nouveau problème immédiatement, ou bien revenir sur son choix."""
|
||||
s += _("It already refused this problem before, so it can refuse it without penalty and "
|
||||
"draw a new problem immediately, or change its mind.")
|
||||
else:
|
||||
# The problem can be rejected
|
||||
s += "Elle peut décider d'accepter ou de refuser ce problème. "
|
||||
s += _("It can decide to accept or refuse this problem.") + " "
|
||||
if len(td.rejected) >= len(settings.PROBLEMS) - settings.RECOMMENDED_SOLUTIONS_COUNT:
|
||||
s += "Refuser ce problème ajoutera une nouvelle pénalité de 25 % sur le coefficient de l'oral de la défense."
|
||||
s += _("Refusing this problem will add a new penalty of 25% "
|
||||
"on the coefficient of the oral defense.")
|
||||
else:
|
||||
s += f"Il reste {len(settings.PROBLEMS) - settings.RECOMMENDED_SOLUTIONS_COUNT - len(td.rejected)} refus sans pénalité."
|
||||
s += _("There are still {remaining} refusals without penalty.").format(
|
||||
remaining=len(settings.PROBLEMS) - settings.RECOMMENDED_SOLUTIONS_COUNT - len(td.rejected))
|
||||
case 'WAITING_FINAL':
|
||||
# We are between the two rounds of the final tournament
|
||||
s += "Le tirage au sort pour le tour 2 aura lieu à la fin du premier tour. Bon courage !"
|
||||
s += _("The draw for the second round will take place at the end of the first round. Good luck!")
|
||||
case 'DRAW_ENDED':
|
||||
# The draw is ended
|
||||
s += "Le tirage au sort est terminé. Les solutions des autres équipes peuvent être trouvées dans l'onglet « Ma participation »."
|
||||
s += _("The draw is ended. The solutions of the other teams can be found in the tab "
|
||||
"\"My participation\".")
|
||||
|
||||
s += "<br><br>" if s else ""
|
||||
s += """Pour plus de détails sur le déroulement du tirage au sort,
|
||||
le règlement est accessible sur
|
||||
<a class="alert-link" href="https://tfjm.org/reglement">https://tfjm.org/reglement</a>."""
|
||||
rules_link = "https://tfjm.org/reglement" if settings.TFJM_APP == "TFJM" else "https://eteam.tfjm.org/rules/"
|
||||
s += _("For more details on the draw, the rules are available on "
|
||||
"<a class=\"alert-link\" href=\"{link}\">{link}</a>.").format(link=rules_link)
|
||||
return s
|
||||
|
||||
async def ainformation(self) -> str:
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: TFJM\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-06-13 10:56+0200\n"
|
||||
"POT-Creation-Date: 2024-07-05 10:38+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Emmy D'Anello <emmy.danello@animath.fr>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -93,7 +93,7 @@ msgstr ""
|
|||
"Pour une permission qui concerne un tournoi, indique quel est le tournoi "
|
||||
"concerné."
|
||||
|
||||
#: chat/models.py:73 draw/models.py:429 draw/models.py:456
|
||||
#: chat/models.py:73 draw/models.py:432 draw/models.py:459
|
||||
#: participation/admin.py:136 participation/admin.py:155
|
||||
#: participation/models.py:1515 participation/models.py:1524
|
||||
#: participation/tables.py:84
|
||||
|
@ -264,12 +264,12 @@ msgstr "Connexion"
|
|||
msgid "teams"
|
||||
msgstr "équipes"
|
||||
|
||||
#: draw/admin.py:92 draw/models.py:234 draw/models.py:448
|
||||
#: draw/admin.py:92 draw/models.py:237 draw/models.py:451
|
||||
#: participation/models.py:1016
|
||||
msgid "round"
|
||||
msgstr "tour"
|
||||
|
||||
#: draw/apps.py:10 tfjm/templates/navbar.html:68
|
||||
#: draw/apps.py:10 draw/consumers.py:1037 tfjm/templates/navbar.html:68
|
||||
msgid "Draw"
|
||||
msgstr "Tirage au sort"
|
||||
|
||||
|
@ -277,67 +277,182 @@ msgstr "Tirage au sort"
|
|||
msgid "You are not an organizer."
|
||||
msgstr "Vous n'êtes pas un⋅e organisateur⋅rice."
|
||||
|
||||
#: draw/consumers.py:165
|
||||
#: draw/consumers.py:167
|
||||
msgid "The draw is already started."
|
||||
msgstr "Le tirage a déjà commencé."
|
||||
|
||||
#: draw/consumers.py:171
|
||||
#: draw/consumers.py:173
|
||||
msgid "Invalid format"
|
||||
msgstr "Format invalide"
|
||||
|
||||
#: draw/consumers.py:176
|
||||
#: draw/consumers.py:178
|
||||
#, python-brace-format
|
||||
msgid "The sum must be equal to the number of teams: expected {len}, got {sum}"
|
||||
msgstr ""
|
||||
"La somme doit être égale au nombre d'équipes : attendu {len}, obtenu {sum}"
|
||||
|
||||
#: draw/consumers.py:181
|
||||
#: draw/consumers.py:183
|
||||
msgid "There can be at most one pool with 5 teams."
|
||||
msgstr "Il ne peut y avoir au plus qu'une seule poule de 5 équipes."
|
||||
|
||||
#: draw/consumers.py:221
|
||||
#: draw/consumers.py:223
|
||||
msgid "Draw started!"
|
||||
msgstr "Le tirage a commencé !"
|
||||
|
||||
#: draw/consumers.py:243
|
||||
#: draw/consumers.py:238
|
||||
#, python-brace-format
|
||||
msgid "The draw of tournament {tournament} started!"
|
||||
msgstr "Le tirage au sort du tournoi {tournament} a commencé !"
|
||||
|
||||
#: draw/consumers.py:245
|
||||
#, python-brace-format
|
||||
msgid "The draw for the tournament {tournament} will start."
|
||||
msgstr "Le tirage au sort du tournoi {tournament} va commencer."
|
||||
|
||||
#: draw/consumers.py:254 draw/consumers.py:280 draw/consumers.py:690
|
||||
#: draw/consumers.py:907 draw/consumers.py:996 draw/consumers.py:1018
|
||||
#: draw/consumers.py:1109 draw/templates/draw/tournament_content.html:5
|
||||
#: draw/consumers.py:256 draw/consumers.py:282 draw/consumers.py:691
|
||||
#: draw/consumers.py:909 draw/consumers.py:999 draw/consumers.py:1021
|
||||
#: draw/consumers.py:1112 draw/templates/draw/tournament_content.html:5
|
||||
msgid "The draw has not started yet."
|
||||
msgstr "Le tirage au sort n'a pas encore commencé."
|
||||
|
||||
#: draw/consumers.py:267
|
||||
#: draw/consumers.py:269
|
||||
#, python-brace-format
|
||||
msgid "The draw for the tournament {tournament} is aborted."
|
||||
msgstr "Le tirage au sort du tournoi {tournament} est annulé."
|
||||
|
||||
#: draw/consumers.py:307 draw/consumers.py:328 draw/consumers.py:624
|
||||
#: draw/consumers.py:695 draw/consumers.py:912
|
||||
#: draw/consumers.py:309 draw/consumers.py:330 draw/consumers.py:625
|
||||
#: draw/consumers.py:696 draw/consumers.py:914
|
||||
msgid "This is not the time for this."
|
||||
msgstr "Ce n'est pas le moment pour cela."
|
||||
|
||||
#: draw/consumers.py:320 draw/consumers.py:323
|
||||
#: draw/consumers.py:322 draw/consumers.py:325
|
||||
msgid "You've already launched the dice."
|
||||
msgstr "Vous avez déjà lancé le dé."
|
||||
|
||||
#: draw/consumers.py:326
|
||||
#: draw/consumers.py:328
|
||||
msgid "It is not your turn."
|
||||
msgstr "Ce n'est pas votre tour."
|
||||
|
||||
#: draw/consumers.py:413
|
||||
#: draw/consumers.py:408
|
||||
msgid ""
|
||||
"Your dice score is identical to the one of one or multiple teams. Please "
|
||||
"relaunch it."
|
||||
msgstr ""
|
||||
"Votre score de dé est identique à celui d'une ou plusieurs équipes. Merci de "
|
||||
"le relancer."
|
||||
|
||||
#: draw/consumers.py:415
|
||||
#, python-brace-format
|
||||
msgid "Dices from teams {teams} are identical. Please relaunch your dices."
|
||||
msgstr ""
|
||||
"Les dés des équipes {teams} sont identiques. Merci de relancer vos dés."
|
||||
|
||||
#: draw/consumers.py:1021
|
||||
#: draw/consumers.py:508
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"The dice results are the following: {trigrams}. The passage order and the "
|
||||
"compositions of the different pools are displayed on the side. The passage "
|
||||
"orders for the first round are determined from the dice scores, in "
|
||||
"increasing order. For the second round, the passage orders are determined "
|
||||
"from the passage orders of the first round."
|
||||
msgstr ""
|
||||
"Les résultats des dés sont les suivants : {trigrams}. L'ordre de passage et "
|
||||
"les compositions des différentes poules sont affichés sur le côté. Les "
|
||||
"ordres de passage pour le premier tour sont déterminés à partir des scores "
|
||||
"de dés, par ordre croissant. Pour le deuxième tour, les ordres de passage "
|
||||
"sont déterminés à partir des ordres de passage du premier tour."
|
||||
|
||||
#: draw/consumers.py:614 draw/consumers.py:754 draw/consumers.py:831
|
||||
#: draw/consumers.py:865 draw/consumers.py:990 draw/consumers.py:1088
|
||||
msgid "Your turn!"
|
||||
msgstr "À votre tour !"
|
||||
|
||||
#: draw/consumers.py:615 draw/consumers.py:755 draw/consumers.py:991
|
||||
#: draw/consumers.py:1089
|
||||
msgid "It's your turn to draw a problem!"
|
||||
msgstr "C'est à vous de tirer un problème !"
|
||||
|
||||
#: draw/consumers.py:635 draw/consumers.py:706 draw/consumers.py:924
|
||||
msgid "This is not your turn."
|
||||
msgstr "Ce n'est pas votre tour."
|
||||
|
||||
#: draw/consumers.py:713
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"The team <strong>{trigram}</strong> accepted the problem <string>{problem}</"
|
||||
"strong>: {problem_name}. "
|
||||
msgstr ""
|
||||
"L'équipe <strong>{trigram}</strong> a accepté le problème <strong>{problem}</"
|
||||
"strong> : {problem_name}. "
|
||||
|
||||
#: draw/consumers.py:717
|
||||
msgid "One team more can accept this problem."
|
||||
msgstr "Une équipe de plus peut accepter ce problème."
|
||||
|
||||
#: draw/consumers.py:719
|
||||
msgid "No team can accept this problem anymore."
|
||||
msgstr "Aucune autre équipe ne peut accepter ce problème."
|
||||
|
||||
#: draw/consumers.py:813
|
||||
#, python-brace-format
|
||||
msgid "The draw of the pool {pool} is ended. The summary is below."
|
||||
msgstr "Le tirage de la poule {pool} est terminé. Le résumé est ci-dessous."
|
||||
|
||||
#: draw/consumers.py:832 draw/consumers.py:866
|
||||
msgid "It's your turn to launch the dice!"
|
||||
msgstr "C'est à vous de lancer le dé !"
|
||||
|
||||
#: draw/consumers.py:852
|
||||
#, python-brace-format
|
||||
msgid "The draw of the round {round} is ended."
|
||||
msgstr "Le tirage au sort du tour {round} est annulé."
|
||||
|
||||
#: draw/consumers.py:895
|
||||
msgid "The draw of the first round is ended."
|
||||
msgstr "Le tirage au sort du premier tour est terminé."
|
||||
|
||||
#: draw/consumers.py:938
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"The team <strong>{trigram}</strong> refused the problem <strong>{problem}</"
|
||||
"strong>: {problem_name}."
|
||||
msgstr ""
|
||||
"L'équipe <strong>{trigram}</strong> a refusé le problème <strong>{problem}</"
|
||||
"strong> : {problem_name}."
|
||||
|
||||
#: draw/consumers.py:942
|
||||
#, python-brace-format
|
||||
msgid "It remains {remaining} refusals without penalty."
|
||||
msgstr "Il reste {remaining} refus sans pénalité."
|
||||
|
||||
#: draw/consumers.py:945
|
||||
msgid "This problem was already refused by this team."
|
||||
msgstr "Ce problème a déjà été refusé par cette équipe."
|
||||
|
||||
#: draw/consumers.py:947
|
||||
msgid "It adds a 25% penalty on the coefficient of the oral defense."
|
||||
msgstr ""
|
||||
"Cela ajoute une pénalité de 25 % sur le coefficient de l'oral de la "
|
||||
"défense."
|
||||
|
||||
#: draw/consumers.py:1024
|
||||
msgid "This is only available for the final tournament."
|
||||
msgstr "Cela n'est possible que pour la finale."
|
||||
|
||||
#: draw/consumers.py:1028
|
||||
msgid ""
|
||||
"The draw of the round 2 is starting. The passage order is determined from "
|
||||
"the ranking of the first round, in order to mix the teams between the two "
|
||||
"days."
|
||||
msgstr ""
|
||||
"Le tirage au sort du tour 2 commence. L'ordre de passage est déterminé à "
|
||||
"partir du classement du premier tour, afin de mélanger les équipes entre les "
|
||||
"deux jours."
|
||||
|
||||
#: draw/consumers.py:1038
|
||||
msgid "The draw of the second round is starting!"
|
||||
msgstr "Le tirage au sort du deuxième tour commence !"
|
||||
|
||||
#: draw/models.py:27
|
||||
msgid "The associated tournament."
|
||||
msgstr "Le tournoi associé."
|
||||
|
@ -362,154 +477,260 @@ msgstr "Le dernier message qui est affiché sur l'interface de tirage."
|
|||
msgid "State"
|
||||
msgstr "État"
|
||||
|
||||
#: draw/models.py:174
|
||||
#: draw/models.py:113
|
||||
msgid ""
|
||||
"We are going to start the problem draw.<br>You can ask any question if "
|
||||
"something is not clear or wrong.<br><br>We are going to first draw the pools "
|
||||
"and the passage order for the first round with all the teams, then for each "
|
||||
"pool, we will draw the draw order and the problems."
|
||||
msgstr ""
|
||||
"Nous allons commencer le tirage des problèmes.<br>Vous pouvez poser des "
|
||||
"questions si quelque chose n'est pas clair ou faux.<br><br>Nous allons "
|
||||
"d'abord tirer les poules et l'ordre de passage pour le premier tour avec "
|
||||
"toutes les équipes, puis pour chaque poule, nous allons tirer l'ordre de "
|
||||
"tirage et les problèmes."
|
||||
|
||||
#: draw/models.py:118
|
||||
msgid ""
|
||||
"The captains, you can now all throw a 100-sided dice, by clicking on the big "
|
||||
"dice button. The pools and the passage order during the first round will be "
|
||||
"the increasing order of the dices, ie. the smallest dice will be the first "
|
||||
"to pass in pool A."
|
||||
msgstr ""
|
||||
"Les capitaines, vous pouvez maintenant tous lancer un dé à 100 faces, en "
|
||||
"cliquant sur le gros bouton de dé. Les poules et l'ordre de passage pendant "
|
||||
"le premier tour seront l'ordre croissant des dés, c'est-à-dire que le plus "
|
||||
"petit dé passera en premier dans la poule A."
|
||||
|
||||
#: draw/models.py:123
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"We are going to start the problem draw for the pool <strong>{pool}</strong>, "
|
||||
"between the teams <strong>{teams}</strong>. The captains can throw a 100-"
|
||||
"sided dice by clicking on the big dice button to determine the order of "
|
||||
"draw. The team with the highest score will draw first."
|
||||
msgstr ""
|
||||
"Nous allons commencer le tirage des problèmes pour la poule <strong>{pool}"
|
||||
"</strong>, entre les équipes <strong>{teams}</strong>. Les capitaines peuvent "
|
||||
"lancer un dé à 100 faces en cliquant sur le gros bouton de dé pour déterminer "
|
||||
"l'ordre de tirage. L'équipe avec le score le plus élevé tirera en premier."
|
||||
|
||||
#: draw/models.py:133
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"The team <strong>{trigram}</strong> is going to draw a problem. Click on the "
|
||||
"urn in the middle to draw a problem."
|
||||
msgstr ""
|
||||
"L'équipe <strong>{trigram}</strong> va tirer un problème. Cliquez sur l'urne "
|
||||
"au milieu pour tirer un problème."
|
||||
|
||||
#: draw/models.py:139
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"The team <strong>{trigram}</strong> drew the problem <strong>{problem}: "
|
||||
"{problem_name}</strong>."
|
||||
msgstr ""
|
||||
"L'équipe <strong>{trigram}</strong> a tiré le problème <strong>{problem} : "
|
||||
"{problem_name}</strong>."
|
||||
|
||||
#: draw/models.py:145
|
||||
msgid ""
|
||||
"It already refused this problem before, so it can refuse it without penalty "
|
||||
"and draw a new problem immediately, or change its mind."
|
||||
msgstr ""
|
||||
"Elle a déjà refusé ce problème auparavant, donc elle peut le refuser sans "
|
||||
"pénalité et tirer un nouveau problème immédiatement, ou changer d'avis."
|
||||
|
||||
#: draw/models.py:149
|
||||
msgid "It can decide to accept or refuse this problem."
|
||||
msgstr "Elle peut décider d'accepter ou de refuser ce problème."
|
||||
|
||||
#: draw/models.py:151
|
||||
msgid ""
|
||||
"Refusing this problem will add a new penalty of 25% on the coefficient of "
|
||||
"the oral defense."
|
||||
msgstr ""
|
||||
"Refuser ce problème ajoutera une nouvelle pénalité de 25 % sur le coefficient "
|
||||
"de l'oral de la défense."
|
||||
|
||||
#: draw/models.py:154
|
||||
#, python-brace-format
|
||||
msgid "There are still {remaining} refusals without penalty."
|
||||
msgstr "Il reste {remaining} refus sans pénalité."
|
||||
|
||||
#: draw/models.py:158
|
||||
msgid ""
|
||||
"The draw for the second round will take place at the end of the first round. "
|
||||
"Good luck!"
|
||||
msgstr ""
|
||||
"Le tirage au sort du deuxième tour aura lieu à la fin du premier tour. Bonne "
|
||||
"chance !"
|
||||
|
||||
#: draw/models.py:161
|
||||
msgid ""
|
||||
"The draw is ended. The solutions of the other teams can be found in the tab "
|
||||
"\"My participation\"."
|
||||
msgstr ""
|
||||
"Le tirage est terminé. Les solutions des autres équipes peuvent être trouvées "
|
||||
"dans l'onglet « Ma participation »."
|
||||
|
||||
#: draw/models.py:166
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"For more details on the draw, the rules are available on <a class=\"alert-"
|
||||
"link\" href=\"{link}\">{link}</a>."
|
||||
msgstr ""
|
||||
"Pour plus de détails sur le tirage, les règles sont disponibles sur <a class="
|
||||
"\"alert-link\" href=\"{link}\">{link}</a>."
|
||||
|
||||
#: draw/models.py:177
|
||||
#, python-brace-format
|
||||
msgid "Draw of tournament {tournament}"
|
||||
msgstr "Tirage au sort du tournoi {tournament}"
|
||||
|
||||
#: draw/models.py:177 draw/models.py:189
|
||||
#: draw/models.py:180 draw/models.py:192
|
||||
msgid "draw"
|
||||
msgstr "tirage au sort"
|
||||
|
||||
#: draw/models.py:178
|
||||
#: draw/models.py:181
|
||||
msgid "draws"
|
||||
msgstr "tirages au sort"
|
||||
|
||||
#: draw/models.py:194
|
||||
#: draw/models.py:197
|
||||
msgid "Round 1"
|
||||
msgstr "Tour 1"
|
||||
|
||||
#: draw/models.py:195
|
||||
#: draw/models.py:198
|
||||
msgid "Round 2"
|
||||
msgstr "Tour 2"
|
||||
|
||||
#: draw/models.py:196
|
||||
#: draw/models.py:199
|
||||
msgid "Round 3"
|
||||
msgstr "Tour 3"
|
||||
|
||||
#: draw/models.py:197
|
||||
#: draw/models.py:200
|
||||
msgid "number"
|
||||
msgstr "numéro"
|
||||
|
||||
#: draw/models.py:198
|
||||
#: draw/models.py:201
|
||||
msgid "The number of the round, 1 or 2 (or 3 for ETEAM)"
|
||||
msgstr "Le numéro du tour, 1 ou 2 (ou 3 pour ETEAM)"
|
||||
|
||||
#: draw/models.py:208
|
||||
#: draw/models.py:211
|
||||
msgid "current pool"
|
||||
msgstr "poule actuelle"
|
||||
|
||||
#: draw/models.py:209
|
||||
#: draw/models.py:212
|
||||
msgid "The current pool where teams select their problems."
|
||||
msgstr "La poule en cours, où les équipes choisissent leurs problèmes"
|
||||
|
||||
#: draw/models.py:235
|
||||
#: draw/models.py:238
|
||||
msgid "rounds"
|
||||
msgstr "tours"
|
||||
|
||||
#: draw/models.py:257 participation/models.py:1024
|
||||
#: draw/models.py:260 participation/models.py:1024
|
||||
msgid "letter"
|
||||
msgstr "lettre"
|
||||
|
||||
#: draw/models.py:258
|
||||
#: draw/models.py:261
|
||||
msgid "The letter of the pool: A, B, C or D."
|
||||
msgstr "La lettre de la poule : A, B, C ou D."
|
||||
|
||||
#: draw/models.py:262
|
||||
#: draw/models.py:265
|
||||
#: participation/templates/participation/tournament_detail.html:15
|
||||
msgid "size"
|
||||
msgstr "taille"
|
||||
|
||||
#: draw/models.py:264
|
||||
#: draw/models.py:267
|
||||
msgid "The number of teams in this pool, between 3 and 5."
|
||||
msgstr "Le nombre d'équipes dans la poule, entre 3 et 5."
|
||||
|
||||
#: draw/models.py:273
|
||||
#: draw/models.py:276
|
||||
msgid "current team"
|
||||
msgstr "équipe actuelle"
|
||||
|
||||
#: draw/models.py:274
|
||||
#: draw/models.py:277
|
||||
msgid "The current team that is selecting its problem."
|
||||
msgstr "L'équipe qui est en train de choisir son problème."
|
||||
|
||||
#: draw/models.py:283
|
||||
#: draw/models.py:286
|
||||
msgid "associated pool"
|
||||
msgstr "poule associée"
|
||||
|
||||
#: draw/models.py:284
|
||||
#: draw/models.py:287
|
||||
msgid "The full pool instance."
|
||||
msgstr "L'instance complète de la poule."
|
||||
|
||||
#: draw/models.py:426
|
||||
#: draw/models.py:429
|
||||
#, python-brace-format
|
||||
msgid "Pool {letter}{number}"
|
||||
msgstr "Poule {letter}{number}"
|
||||
|
||||
#: draw/models.py:430 participation/models.py:1516
|
||||
#: draw/models.py:433 participation/models.py:1516
|
||||
msgid "pools"
|
||||
msgstr "poules"
|
||||
|
||||
#: draw/models.py:442 participation/models.py:1002 participation/models.py:1665
|
||||
#: draw/models.py:445 participation/models.py:1002 participation/models.py:1665
|
||||
#: participation/models.py:1695 participation/models.py:1737
|
||||
msgid "participation"
|
||||
msgstr "participation"
|
||||
|
||||
#: draw/models.py:463
|
||||
#: draw/models.py:466
|
||||
msgid "passage index"
|
||||
msgstr "numéro de passage"
|
||||
|
||||
#: draw/models.py:464
|
||||
#: draw/models.py:467
|
||||
msgid ""
|
||||
"The passage order in the pool, between 0 and the size of the pool minus 1."
|
||||
msgstr ""
|
||||
"L'ordre de passage dans la poule, de 0 à la taille de la poule moins 1."
|
||||
|
||||
#: draw/models.py:472
|
||||
#: draw/models.py:475
|
||||
msgid "choose index"
|
||||
msgstr "numéro de choix"
|
||||
|
||||
#: draw/models.py:473
|
||||
#: draw/models.py:476
|
||||
msgid ""
|
||||
"The choice order in the pool, between 0 and the size of the pool minus 1."
|
||||
msgstr ""
|
||||
"L'ordre de choix dans la poule, entre 0 et la taille de la poule moins 1."
|
||||
|
||||
#: draw/models.py:479 draw/models.py:502 participation/models.py:1538
|
||||
#: draw/models.py:482 draw/models.py:505 participation/models.py:1538
|
||||
#: participation/models.py:1702
|
||||
#, python-brace-format
|
||||
msgid "Problem #{problem}"
|
||||
msgstr "Problème n°{problem}"
|
||||
|
||||
#: draw/models.py:483
|
||||
#: draw/models.py:486
|
||||
msgid "accepted problem"
|
||||
msgstr "problème accepté"
|
||||
|
||||
#: draw/models.py:490
|
||||
#: draw/models.py:493
|
||||
msgid "passage dice"
|
||||
msgstr "dé d'ordre de passage"
|
||||
|
||||
#: draw/models.py:497
|
||||
#: draw/models.py:500
|
||||
msgid "choice dice"
|
||||
msgstr "dé d'ordre de choix"
|
||||
|
||||
#: draw/models.py:506
|
||||
#: draw/models.py:509
|
||||
msgid "purposed problem"
|
||||
msgstr "problème proposé"
|
||||
|
||||
#: draw/models.py:511
|
||||
#: draw/models.py:514
|
||||
msgid "rejected problems"
|
||||
msgstr "problèmes rejetés"
|
||||
|
||||
#: draw/models.py:540
|
||||
#: draw/models.py:543
|
||||
#, python-brace-format
|
||||
msgid "Draw of the team {trigram} for the pool {letter}{number}"
|
||||
msgstr "Tirage de l'équipe {trigram} pour la poule {letter}{number}"
|
||||
|
||||
#: draw/models.py:546
|
||||
#: draw/models.py:549
|
||||
msgid "team draw"
|
||||
msgstr "tirage d'équipe"
|
||||
|
||||
#: draw/models.py:547
|
||||
#: draw/models.py:550
|
||||
msgid "team draws"
|
||||
msgstr "tirages d'équipe"
|
||||
|
||||
|
|
Loading…
Reference in New Issue