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