diff --git a/draw/consumers.py b/draw/consumers.py
index 828fd36..4633f6b 100644
--- a/draw/consumers.py
+++ b/draw/consumers.py
@@ -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"{td.participation.team.trigram} ({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"{td.participation.team.trigram} ({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 {trigram} a accepté le problème {td.accepted} : " \
- f"{settings.PROBLEMS[td.accepted - 1]}. "
+ msg = _("The team {trigram} accepted the problem {problem}: "
+ "{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"
Le tirage de la poule {pool.get_letter_display()}{r.number} est terminé. " \
- f"Le tableau récapitulatif est en bas."
+ msg += "
" + _("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"
Le tirage au sort du tour {r.number} est terminé."
+ msg += "
" + _("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 += "
Le tirage au sort du tour 1 est terminé."
+ msg += "
" + _("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 {trigram} a refusé le problème {problem} : " \
- f"{settings.PROBLEMS[problem - 1]}. "
+ msg = _("The team {trigram} refused the problem {problem}: "
+ "{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',
diff --git a/draw/models.py b/draw/models.py
index 0e9ec0e..694465a 100644
--- a/draw/models.py
+++ b/draw/models.py
@@ -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.
- Vous pouvez à tout moment poser toute question si quelque chose
- n'est pas clair ou ne va pas.
- 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.
"""
- 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.
"
+ "You can ask any question if something is not clear or wrong.
"
+ "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 += "
"
+ 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
- {self.current_round.current_pool}, entre les équipes
- {', '.join(td.participation.team.trigram
- for td in self.current_round.current_pool.teamdraw_set.all())}.
- 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 {pool}, "
+ "between the teams {teams}. "
+ "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 {td.participation.team.trigram}
- de choisir son problème. Cliquez sur l'urne au milieu pour tirer un problème au sort."""
+ s += _("The team {trigram} 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 {td.participation.team.trigram} a tiré le problème
- {td.purposed} : {settings.PROBLEMS[td.purposed - 1]}. """
+ s += _("The team {trigram} drew the problem {problem}: "
+ "{problem_name}.") \
+ .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 += "
" if s else ""
- s += """Pour plus de détails sur le déroulement du tirage au sort,
- le règlement est accessible sur
- https://tfjm.org/reglement."""
+ 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 "
+ "{link}.").format(link=rules_link)
return s
async def ainformation(self) -> str:
diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po
index c55d813..b2af866 100644
--- a/locale/fr/LC_MESSAGES/django.po
+++ b/locale/fr/LC_MESSAGES/django.po
@@ -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 \n"
"Language-Team: LANGUAGE \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 {trigram} accepted the problem {problem}"
+"strong>: {problem_name}. "
+msgstr ""
+"L'équipe {trigram} a accepté le problème {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 {trigram} refused the problem {problem}"
+"strong>: {problem_name}."
+msgstr ""
+"L'équipe {trigram} a refusé le problème {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.
You can ask any question if "
+"something is not clear or wrong.
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.
Vous pouvez poser des "
+"questions si quelque chose n'est pas clair ou faux.
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 {pool}, "
+"between the teams {teams}. 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 {pool}"
+", entre les équipes {teams}. 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 {trigram} is going to draw a problem. Click on the "
+"urn in the middle to draw a problem."
+msgstr ""
+"L'équipe {trigram} 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 {trigram} drew the problem {problem}: "
+"{problem_name}."
+msgstr ""
+"L'équipe {trigram} a tiré le problème {problem} : "
+"{problem_name}."
+
+#: 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 {link}."
+msgstr ""
+"Pour plus de détails sur le tirage, les règles sont disponibles sur {link}."
+
+#: 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"