From 05c6333c5e7b074c2252d89df6f22cb9c6023c0a Mon Sep 17 00:00:00 2001 From: Emmy D'Anello Date: Fri, 5 Jul 2024 10:41:48 +0200 Subject: [PATCH] Translate draw messages Signed-off-by: Emmy D'Anello --- draw/consumers.py | 95 ++++----- draw/models.py | 67 ++++--- locale/fr/LC_MESSAGES/django.po | 331 ++++++++++++++++++++++++++------ 3 files changed, 360 insertions(+), 133 deletions(-) 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}: {problem_name}. " +msgstr "" +"L'équipe {trigram} a accepté le problème {problem} : {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}: {problem_name}." +msgstr "" +"L'équipe {trigram} a refusé le problème {problem} : {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"