Translate draw messages

Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
Emmy D'Anello 2024-07-05 10:41:48 +02:00
parent d84db949c6
commit 05c6333c5e
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
3 changed files with 360 additions and 133 deletions

View File

@ -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&nbsp;% 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',

View File

@ -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 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 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:

View File

@ -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&nbsp;% 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"