1
0
mirror of https://gitlab.com/animath/si/plateforme.git synced 2024-12-25 18:22:23 +00:00

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)\ self.tournament = await Tournament.objects.filter(pk=self.tournament_id)\
.prefetch_related('draw__current_round__current_pool__current_team__participation__team').aget() .prefetch_related('draw__current_round__current_pool__current_team__participation__team').aget()
translation.activate(settings.PREFERRED_LANGUAGE_CODE)
match content['type']: match content['type']:
case 'set_language': case 'set_language':
# Update the translation language # Update the translation language
@ -233,8 +235,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
await self.channel_layer.group_send(f"tournament-{self.tournament.id}", await self.channel_layer.group_send(f"tournament-{self.tournament.id}",
{'tid': self.tournament_id, 'type': 'draw.notify', {'tid': self.tournament_id, 'type': 'draw.notify',
'title': 'Tirage au sort du TFJM²', 'title': 'Tirage au sort du TFJM²',
'body': "Le tirage au sort du tournoi de " 'body': _("The draw of tournament {tournament} started!")
f"{self.tournament.name} a commencé !"}) .format(tournament=self.tournament.name)})
async def draw_start(self, content) -> None: async def draw_start(self, content) -> None:
""" """
@ -403,8 +405,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
await self.channel_layer.group_send( await self.channel_layer.group_send(
f"team-{dup.participation.team.trigram}", f"team-{dup.participation.team.trigram}",
{'tid': self.tournament_id, 'type': 'draw.notify', 'title': 'Tirage au sort du TFJM²', {'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. ' 'body': _("Your dice score is identical to the one of one or multiple teams. "
'Veuillez le relancer.'} "Please relaunch it.")}
) )
# Alert the tournament # Alert the tournament
await self.channel_layer.group_send( 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 # 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. # 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. # 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,)) tds_copy = sorted(tds, key=lambda td: (td.passage_index, -td.pool.letter,))
jokers = [td for td in tds if td.passage_index == 4] jokers = [td for td in tds if td.passage_index == 4]
round2 = await self.tournament.draw.round_set.filter(number=2).aget() 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() await self.tournament.draw.current_round.asave()
# Display dice result in the header of the information alert # Display dice result in the header of the information alert
msg = "Les résultats des dés sont les suivants : " trigrams = ", ".join(f"<strong>{td.participation.team.trigram}</strong> ({td.passage_dice})" for td in tds)
msg += ", ".join(f"<strong>{td.participation.team.trigram}</strong> ({td.passage_dice})" for td in tds) msg = _("The dice results are the following: {trigrams}. "
msg += ". L'ordre de passage et les compositions des différentes poules sont affiché⋅es sur le côté. " "The passage order and the compositions of the different pools are displayed on the side. "
msg += "Les ordres de passage pour le premier tour sont déterminés à partir des scores des dés, " "The passage orders for the first round are determined from the dice scores, in increasing order. "
msg += "dans l'ordre croissant. Pour le deuxième tour, les ordres de passage sont déterminés à partir " "For the second round, the passage orders are determined from the passage orders of the first round.")
msg += "des ordres de passage du premier tour."
self.tournament.draw.last_message = msg self.tournament.draw.last_message = msg
await self.tournament.draw.asave() await self.tournament.draw.asave()
@ -610,8 +611,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
# Notify the team that it can draw a problem # Notify the team that it can draw a problem
await self.channel_layer.group_send(f"team-{tds[0].participation.team.trigram}", await self.channel_layer.group_send(f"team-{tds[0].participation.team.trigram}",
{'tid': self.tournament_id, 'type': 'draw.notify', {'tid': self.tournament_id, 'type': 'draw.notify',
'title': "À votre tour !", 'title': _("Your turn!"),
'body': "C'est à vous de tirer un nouveau problème !"}) 'body': _("It's your turn to draw a problem!")})
async def select_problem(self, **kwargs): async def select_problem(self, **kwargs):
""" """
@ -631,7 +632,7 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
.prefetch_related('team').aget() .prefetch_related('team').aget()
# Ensure that the user can draws a problem at this time # Ensure that the user can draws a problem at this time
if participation.id != td.participation_id: 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: while True:
# Choose a random problem # Choose a random problem
@ -702,19 +703,20 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
.prefetch_related('team').aget() .prefetch_related('team').aget()
# Ensure that the user can accept a problem at this time # Ensure that the user can accept a problem at this time
if participation.id != td.participation_id: 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.accepted = td.purposed
td.purposed = None td.purposed = None
await td.asave() await td.asave()
trigram = td.participation.team.trigram trigram = td.participation.team.trigram
msg = f"L'équipe <strong>{trigram}</strong> a accepté le problème <strong>{td.accepted} : " \ msg = _("The team <strong>{trigram}</strong> accepted the problem <string>{problem}</strong>: "
f"{settings.PROBLEMS[td.accepted - 1]}</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: 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: else:
msg += "Plus personne ne peut l'accepter." msg += _("No team can accept this problem anymore.")
self.tournament.draw.last_message = msg self.tournament.draw.last_message = msg
await self.tournament.draw.asave() await self.tournament.draw.asave()
@ -749,8 +751,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
# Notify the team that it can draw a problem # Notify the team that it can draw a problem
await self.channel_layer.group_send(f"team-{new_trigram}", await self.channel_layer.group_send(f"team-{new_trigram}",
{'tid': self.tournament_id, 'type': 'draw.notify', {'tid': self.tournament_id, 'type': 'draw.notify',
'title': "À votre tour !", 'title': _("Your turn!"),
'body': "C'est à vous de tirer un nouveau problème !"}) 'body': _("It's your turn to draw a problem!")})
else: else:
# Pool is ended # Pool is ended
await self.end_pool(pool) await self.end_pool(pool)
@ -808,8 +810,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
'problems': [td.accepted async for td in pool.team_draws], '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é. " \ msg += "<br><br>" + _("The draw of the pool {pool} is ended. The summary is below.") \
f"Le tableau récapitulatif est en bas." .format(pool=f"{pool.get_letter_display()}{r.number}")
self.tournament.draw.last_message = msg self.tournament.draw.last_message = msg
await self.tournament.draw.asave() await self.tournament.draw.asave()
@ -826,8 +828,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
# Notify the team that it can draw a dice # Notify the team that it can draw a dice
await self.channel_layer.group_send(f"team-{td.participation.team.trigram}", await self.channel_layer.group_send(f"team-{td.participation.team.trigram}",
{'tid': self.tournament_id, 'type': 'draw.notify', {'tid': self.tournament_id, 'type': 'draw.notify',
'title': "À votre tour !", 'title': _("Your turn!"),
'body': "C'est à vous de lancer le dé !"}) 'body': _("It's your turn to launch the dice!")})
await self.channel_layer.group_send(f"tournament-{self.tournament.id}", await self.channel_layer.group_send(f"tournament-{self.tournament.id}",
{'tid': self.tournament_id, 'type': 'draw.dice_visibility', {'tid': self.tournament_id, 'type': 'draw.dice_visibility',
@ -843,11 +845,11 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
""" """
msg = self.tournament.draw.last_message 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
next_round = await self.tournament.draw.round_set.filter(number=r.number + 1).aget() next_round = await self.tournament.draw.round_set.filter(number=r.number + 1).aget()
self.tournament.draw.current_round = next_round 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 self.tournament.draw.last_message = msg
await self.tournament.draw.asave() await self.tournament.draw.asave()
@ -860,8 +862,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
# Notify the team that it can draw a dice # Notify the team that it can draw a dice
await self.channel_layer.group_send(f"team-{participation.team.trigram}", await self.channel_layer.group_send(f"team-{participation.team.trigram}",
{'tid': self.tournament_id, 'type': 'draw.notify', {'tid': self.tournament_id, 'type': 'draw.notify',
'title': "À votre tour !", 'title': _("Your turn!"),
'body': "C'est à vous de lancer le dé !"}) 'body': _("It's your turn to launch the dice!")})
# Reorder dices # Reorder dices
await self.channel_layer.group_send(f"tournament-{self.tournament.id}", 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}", await self.channel_layer.group_send(f"volunteer-{self.tournament.id}",
{'tid': self.tournament_id, 'type': 'draw.dice_visibility', {'tid': self.tournament_id, 'type': 'draw.dice_visibility',
'visible': True}) '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. # 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 self.tournament.draw.last_message = msg
await self.tournament.draw.asave() await self.tournament.draw.asave()
@ -919,7 +921,7 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
.prefetch_related('team').aget() .prefetch_related('team').aget()
# Ensure that the user can reject a problem at this time # Ensure that the user can reject a problem at this time
if participation.id != td.participation_id: 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 # Add the problem to the rejected problems list
problem = td.purposed problem = td.purposed
@ -933,15 +935,16 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
# Update messages # Update messages
trigram = td.participation.team.trigram trigram = td.participation.team.trigram
msg = f"L'équipe <strong>{trigram}</strong> a refusé le problème <strong>{problem} : " \ msg = _("The team <strong>{trigram}</strong> refused the problem <strong>{problem}</strong>: "
f"{settings.PROBLEMS[problem - 1]}</strong>. " "{problem_name}.").format(trigram=trigram, problem=problem,
problem_name=settings.PROBLEMS[problem - 1]) + " "
if remaining >= 0: if remaining >= 0:
msg += f"Il lui reste {remaining} refus sans pénalité." msg += _("It remains {remaining} refusals without penalty.").format(remaining=remaining)
else: else:
if already_refused: if already_refused:
msg += "Cela n'ajoute pas de pénalité." msg += _("This problem was already refused by this team.")
else: 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 self.tournament.draw.last_message = msg
await self.tournament.draw.asave() await self.tournament.draw.asave()
@ -984,8 +987,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
# Notify the team that it can draw a problem # Notify the team that it can draw a problem
await self.channel_layer.group_send(f"team-{new_trigram}", await self.channel_layer.group_send(f"team-{new_trigram}",
{'tid': self.tournament_id, 'type': 'draw.notify', {'tid': self.tournament_id, 'type': 'draw.notify',
'title': "À votre tour !", 'title': _("Your turn!"),
'body': "C'est à vous de tirer un nouveau problème !"}) 'body': _("It's your turn to draw a problem!")})
@ensure_orga @ensure_orga
async def export(self, **kwargs): async def export(self, **kwargs):
@ -1022,17 +1025,17 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
r2 = await self.tournament.draw.round_set.filter(number=2).aget() r2 = await self.tournament.draw.round_set.filter(number=2).aget()
self.tournament.draw.current_round = r2 self.tournament.draw.current_round = r2
msg = "Le tirage au sort pour le tour 2 va commencer. " \ msg = _("The draw of the round 2 is starting. "
"L'ordre de passage est déterminé à partir du classement du premier tour, " \ "The passage order is determined from the ranking of the first round, "
"de sorte à mélanger les équipes entre les deux jours." "in order to mix the teams between the two days.")
self.tournament.draw.last_message = msg self.tournament.draw.last_message = msg
await self.tournament.draw.asave() await self.tournament.draw.asave()
# Send notification to everyone # Send notification to everyone
await self.channel_layer.group_send(f"tournament-{self.tournament.id}", await self.channel_layer.group_send(f"tournament-{self.tournament.id}",
{'tid': self.tournament_id, 'type': 'draw.notify', {'tid': self.tournament_id, 'type': 'draw.notify',
'title': 'Tirage au sort du TFJM²', 'title': _("Draw") + " " + settings.APP_NAME,
'body': "Le tirage au sort pour le second tour de la finale a commencé !"}) 'body': _("The draw of the second round is starting!")})
# Set the first pool of the second round as the active pool # 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() 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 # Notify the team that it can draw a problem
await self.channel_layer.group_send(f"team-{td.participation.team.trigram}", await self.channel_layer.group_send(f"team-{td.participation.team.trigram}",
{'tid': self.tournament_id, 'type': 'draw.notify', {'tid': self.tournament_id, 'type': 'draw.notify',
'title': "À votre tour !", 'title': _("Your turn!"),
'body': "C'est à vous de tirer un nouveau problème !"}) 'body': _("It's your turn to draw a problem!")})
await self.channel_layer.group_send(f"volunteer-{self.tournament.id}", await self.channel_layer.group_send(f"volunteer-{self.tournament.id}",
{'tid': self.tournament_id, 'type': 'draw.dice_visibility', {'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 # Waiting for dices to determine pools and passage order
if self.current_round.number == 1: if self.current_round.number == 1:
# Specific information for the first round # Specific information for the first round
s += """Nous allons commencer le tirage des problèmes.<br> s += _("We are going to start the problem draw.<br>"
Vous pouvez à tout moment poser toute question si quelque chose "You can ask any question if something is not clear or wrong.<br><br>"
n'est pas clair ou ne va pas.<br><br> "We are going to first draw the pools and the passage order for the first round "
Nous allons d'abord tirer les poules et l'ordre de passage "with all the teams, then for each pool, we will draw the draw order and the problems.")
pour le premier tour avec toutes les équipes puis pour chaque poule, s += "<br><br>"
nous tirerons l'ordre de tirage pour le tour et les problèmes.<br><br>""" s += _("The captains, you can now all throw a 100-sided dice, by clicking on the big dice button. "
s += """ "The pools and the passage order during the first round will be the increasing order "
Les capitaines, vous pouvez désormais toustes lancer un 100, "of the dices, ie. the smallest dice will be the first to pass in pool A.")
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."""
case 'DICE_ORDER_POULE': case 'DICE_ORDER_POULE':
# Waiting for dices to determine the choice order # Waiting for dices to determine the choice order
s += f"""Nous passons au tirage des problèmes pour la poule s += _("We are going to start the problem draw for the pool <strong>{pool}</strong>, "
<strong>{self.current_round.current_pool}</strong>, entre les équipes "between the teams <strong>{teams}</strong>. "
<strong>{', '.join(td.participation.team.trigram "The captains can throw a 100-sided dice by clicking on the big dice button "
for td in self.current_round.current_pool.teamdraw_set.all())}</strong>. "to determine the order of draw. The team with the highest score will draw first.") \
Les capitaines peuvent lancer un 100 en cliquant sur le gros bouton .format(pool=self.current_round.current_pool,
pour déterminer l'ordre de tirage. L'équipe réalisant le plus gros score pourra teams=', '.join(td.participation.team.trigram
tirer en premier.""" for td in self.current_round.current_pool.teamdraw_set.all()))
case 'WAITING_DRAW_PROBLEM': case 'WAITING_DRAW_PROBLEM':
# Waiting for a problem draw # Waiting for a problem draw
td = self.current_round.current_pool.current_team td = self.current_round.current_pool.current_team
s += f"""C'est au tour de l'équipe <strong>{td.participation.team.trigram}</strong> s += _("The team <strong>{trigram}</strong> is going to draw a problem. "
de choisir son problème. Cliquez sur l'urne au milieu pour tirer un problème au sort.""" "Click on the urn in the middle to draw a problem.") \
.format(trigram=td.participation.team.trigram)
case 'WAITING_CHOOSE_PROBLEM': case 'WAITING_CHOOSE_PROBLEM':
# Waiting for the team that can accept or reject the problem # Waiting for the team that can accept or reject the problem
td = self.current_round.current_pool.current_team td = self.current_round.current_pool.current_team
s += f"""L'équipe <strong>{td.participation.team.trigram}</strong> a tiré le problème s += _("The team <strong>{trigram}</strong> drew the problem <strong>{problem}: "
<strong>{td.purposed} : {settings.PROBLEMS[td.purposed - 1]}</strong>. """ "{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: if td.purposed in td.rejected:
# The problem was previously 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 s += _("It already refused this problem before, so it can refuse it without penalty and "
tirer un nouveau problème immédiatement, ou bien revenir sur son choix.""" "draw a new problem immediately, or change its mind.")
else: else:
# The problem can be rejected # 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: 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: 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': case 'WAITING_FINAL':
# We are between the two rounds of the final tournament # 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': case 'DRAW_ENDED':
# The draw is 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 += "<br><br>" if s else ""
s += """Pour plus de détails sur le déroulement du tirage au sort, rules_link = "https://tfjm.org/reglement" if settings.TFJM_APP == "TFJM" else "https://eteam.tfjm.org/rules/"
le règlement est accessible sur s += _("For more details on the draw, the rules are available on "
<a class="alert-link" href="https://tfjm.org/reglement">https://tfjm.org/reglement</a>.""" "<a class=\"alert-link\" href=\"{link}\">{link}</a>.").format(link=rules_link)
return s return s
async def ainformation(self) -> str: async def ainformation(self) -> str:

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: TFJM\n" "Project-Id-Version: TFJM\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Emmy D'Anello <emmy.danello@animath.fr>\n" "Last-Translator: Emmy D'Anello <emmy.danello@animath.fr>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 " "Pour une permission qui concerne un tournoi, indique quel est le tournoi "
"concerné." "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/admin.py:136 participation/admin.py:155
#: participation/models.py:1515 participation/models.py:1524 #: participation/models.py:1515 participation/models.py:1524
#: participation/tables.py:84 #: participation/tables.py:84
@ -264,12 +264,12 @@ msgstr "Connexion"
msgid "teams" msgid "teams"
msgstr "équipes" 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 #: participation/models.py:1016
msgid "round" msgid "round"
msgstr "tour" 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" msgid "Draw"
msgstr "Tirage au sort" msgstr "Tirage au sort"
@ -277,67 +277,182 @@ msgstr "Tirage au sort"
msgid "You are not an organizer." msgid "You are not an organizer."
msgstr "Vous n'êtes pas un⋅e organisateur⋅rice." msgstr "Vous n'êtes pas un⋅e organisateur⋅rice."
#: draw/consumers.py:165 #: draw/consumers.py:167
msgid "The draw is already started." msgid "The draw is already started."
msgstr "Le tirage a déjà commencé." msgstr "Le tirage a déjà commencé."
#: draw/consumers.py:171 #: draw/consumers.py:173
msgid "Invalid format" msgid "Invalid format"
msgstr "Format invalide" msgstr "Format invalide"
#: draw/consumers.py:176 #: draw/consumers.py:178
#, python-brace-format #, python-brace-format
msgid "The sum must be equal to the number of teams: expected {len}, got {sum}" msgid "The sum must be equal to the number of teams: expected {len}, got {sum}"
msgstr "" msgstr ""
"La somme doit être égale au nombre d'équipes : attendu {len}, obtenu {sum}" "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." 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." 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!" msgid "Draw started!"
msgstr "Le tirage a commencé !" 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 #, python-brace-format
msgid "The draw for the tournament {tournament} will start." msgid "The draw for the tournament {tournament} will start."
msgstr "Le tirage au sort du tournoi {tournament} va commencer." 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:256 draw/consumers.py:282 draw/consumers.py:691
#: draw/consumers.py:907 draw/consumers.py:996 draw/consumers.py:1018 #: draw/consumers.py:909 draw/consumers.py:999 draw/consumers.py:1021
#: draw/consumers.py:1109 draw/templates/draw/tournament_content.html:5 #: draw/consumers.py:1112 draw/templates/draw/tournament_content.html:5
msgid "The draw has not started yet." msgid "The draw has not started yet."
msgstr "Le tirage au sort n'a pas encore commencé." msgstr "Le tirage au sort n'a pas encore commencé."
#: draw/consumers.py:267 #: draw/consumers.py:269
#, python-brace-format #, python-brace-format
msgid "The draw for the tournament {tournament} is aborted." msgid "The draw for the tournament {tournament} is aborted."
msgstr "Le tirage au sort du tournoi {tournament} est annulé." 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:309 draw/consumers.py:330 draw/consumers.py:625
#: draw/consumers.py:695 draw/consumers.py:912 #: draw/consumers.py:696 draw/consumers.py:914
msgid "This is not the time for this." msgid "This is not the time for this."
msgstr "Ce n'est pas le moment pour cela." 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." msgid "You've already launched the dice."
msgstr "Vous avez déjà lancé le dé." msgstr "Vous avez déjà lancé le dé."
#: draw/consumers.py:326 #: draw/consumers.py:328
msgid "It is not your turn." msgid "It is not your turn."
msgstr "Ce n'est pas votre tour." 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 #, python-brace-format
msgid "Dices from teams {teams} are identical. Please relaunch your dices." msgid "Dices from teams {teams} are identical. Please relaunch your dices."
msgstr "" msgstr ""
"Les dés des équipes {teams} sont identiques. Merci de relancer vos dés." "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." msgid "This is only available for the final tournament."
msgstr "Cela n'est possible que pour la finale." 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 #: draw/models.py:27
msgid "The associated tournament." msgid "The associated tournament."
msgstr "Le tournoi associé." msgstr "Le tournoi associé."
@ -362,154 +477,260 @@ msgstr "Le dernier message qui est affiché sur l'interface de tirage."
msgid "State" msgid "State"
msgstr "État" 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 #, python-brace-format
msgid "Draw of tournament {tournament}" msgid "Draw of tournament {tournament}"
msgstr "Tirage au sort du tournoi {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" msgid "draw"
msgstr "tirage au sort" msgstr "tirage au sort"
#: draw/models.py:178 #: draw/models.py:181
msgid "draws" msgid "draws"
msgstr "tirages au sort" msgstr "tirages au sort"
#: draw/models.py:194 #: draw/models.py:197
msgid "Round 1" msgid "Round 1"
msgstr "Tour 1" msgstr "Tour 1"
#: draw/models.py:195 #: draw/models.py:198
msgid "Round 2" msgid "Round 2"
msgstr "Tour 2" msgstr "Tour 2"
#: draw/models.py:196 #: draw/models.py:199
msgid "Round 3" msgid "Round 3"
msgstr "Tour 3" msgstr "Tour 3"
#: draw/models.py:197 #: draw/models.py:200
msgid "number" msgid "number"
msgstr "numéro" msgstr "numéro"
#: draw/models.py:198 #: draw/models.py:201
msgid "The number of the round, 1 or 2 (or 3 for ETEAM)" 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)" msgstr "Le numéro du tour, 1 ou 2 (ou 3 pour ETEAM)"
#: draw/models.py:208 #: draw/models.py:211
msgid "current pool" msgid "current pool"
msgstr "poule actuelle" msgstr "poule actuelle"
#: draw/models.py:209 #: draw/models.py:212
msgid "The current pool where teams select their problems." msgid "The current pool where teams select their problems."
msgstr "La poule en cours, où les équipes choisissent leurs problèmes" msgstr "La poule en cours, où les équipes choisissent leurs problèmes"
#: draw/models.py:235 #: draw/models.py:238
msgid "rounds" msgid "rounds"
msgstr "tours" msgstr "tours"
#: draw/models.py:257 participation/models.py:1024 #: draw/models.py:260 participation/models.py:1024
msgid "letter" msgid "letter"
msgstr "lettre" msgstr "lettre"
#: draw/models.py:258 #: draw/models.py:261
msgid "The letter of the pool: A, B, C or D." msgid "The letter of the pool: A, B, C or D."
msgstr "La lettre de la poule : A, B, C ou 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 #: participation/templates/participation/tournament_detail.html:15
msgid "size" msgid "size"
msgstr "taille" msgstr "taille"
#: draw/models.py:264 #: draw/models.py:267
msgid "The number of teams in this pool, between 3 and 5." msgid "The number of teams in this pool, between 3 and 5."
msgstr "Le nombre d'équipes dans la poule, entre 3 et 5." msgstr "Le nombre d'équipes dans la poule, entre 3 et 5."
#: draw/models.py:273 #: draw/models.py:276
msgid "current team" msgid "current team"
msgstr "équipe actuelle" msgstr "équipe actuelle"
#: draw/models.py:274 #: draw/models.py:277
msgid "The current team that is selecting its problem." msgid "The current team that is selecting its problem."
msgstr "L'équipe qui est en train de choisir son problème." msgstr "L'équipe qui est en train de choisir son problème."
#: draw/models.py:283 #: draw/models.py:286
msgid "associated pool" msgid "associated pool"
msgstr "poule associée" msgstr "poule associée"
#: draw/models.py:284 #: draw/models.py:287
msgid "The full pool instance." msgid "The full pool instance."
msgstr "L'instance complète de la poule." msgstr "L'instance complète de la poule."
#: draw/models.py:426 #: draw/models.py:429
#, python-brace-format #, python-brace-format
msgid "Pool {letter}{number}" msgid "Pool {letter}{number}"
msgstr "Poule {letter}{number}" msgstr "Poule {letter}{number}"
#: draw/models.py:430 participation/models.py:1516 #: draw/models.py:433 participation/models.py:1516
msgid "pools" msgid "pools"
msgstr "poules" 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 #: participation/models.py:1695 participation/models.py:1737
msgid "participation" msgid "participation"
msgstr "participation" msgstr "participation"
#: draw/models.py:463 #: draw/models.py:466
msgid "passage index" msgid "passage index"
msgstr "numéro de passage" msgstr "numéro de passage"
#: draw/models.py:464 #: draw/models.py:467
msgid "" msgid ""
"The passage order in the pool, between 0 and the size of the pool minus 1." "The passage order in the pool, between 0 and the size of the pool minus 1."
msgstr "" msgstr ""
"L'ordre de passage dans la poule, de 0 à la taille de la poule moins 1." "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" msgid "choose index"
msgstr "numéro de choix" msgstr "numéro de choix"
#: draw/models.py:473 #: draw/models.py:476
msgid "" msgid ""
"The choice order in the pool, between 0 and the size of the pool minus 1." "The choice order in the pool, between 0 and the size of the pool minus 1."
msgstr "" msgstr ""
"L'ordre de choix dans la poule, entre 0 et la taille de la poule moins 1." "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 #: participation/models.py:1702
#, python-brace-format #, python-brace-format
msgid "Problem #{problem}" msgid "Problem #{problem}"
msgstr "Problème n°{problem}" msgstr "Problème n°{problem}"
#: draw/models.py:483 #: draw/models.py:486
msgid "accepted problem" msgid "accepted problem"
msgstr "problème accepté" msgstr "problème accepté"
#: draw/models.py:490 #: draw/models.py:493
msgid "passage dice" msgid "passage dice"
msgstr "dé d'ordre de passage" msgstr "dé d'ordre de passage"
#: draw/models.py:497 #: draw/models.py:500
msgid "choice dice" msgid "choice dice"
msgstr "dé d'ordre de choix" msgstr "dé d'ordre de choix"
#: draw/models.py:506 #: draw/models.py:509
msgid "purposed problem" msgid "purposed problem"
msgstr "problème proposé" msgstr "problème proposé"
#: draw/models.py:511 #: draw/models.py:514
msgid "rejected problems" msgid "rejected problems"
msgstr "problèmes rejetés" msgstr "problèmes rejetés"
#: draw/models.py:540 #: draw/models.py:543
#, python-brace-format #, python-brace-format
msgid "Draw of the team {trigram} for the pool {letter}{number}" msgid "Draw of the team {trigram} for the pool {letter}{number}"
msgstr "Tirage de l'équipe {trigram} pour la poule {letter}{number}" msgstr "Tirage de l'équipe {trigram} pour la poule {letter}{number}"
#: draw/models.py:546 #: draw/models.py:549
msgid "team draw" msgid "team draw"
msgstr "tirage d'équipe" msgstr "tirage d'équipe"
#: draw/models.py:547 #: draw/models.py:550
msgid "team draws" msgid "team draws"
msgstr "tirages d'équipe" msgstr "tirages d'équipe"