Use separate fields for the two dices

Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
Emmy D'Anello 2023-03-28 21:56:18 +02:00
parent 7f7d921c53
commit cf8892ee1a
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
4 changed files with 311 additions and 53 deletions

View File

@ -163,11 +163,11 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
if state == 'DICE_ORDER_POULE': if state == 'DICE_ORDER_POULE':
participation = await Participation.objects\ participation = await Participation.objects\
.filter(teamdraw__pool=self.tournament.draw.current_round.current_pool, .filter(teamdraw__pool=self.tournament.draw.current_round.current_pool,
teamdraw__last_dice__isnull=True).prefetch_related('team').afirst() teamdraw__choice_dice__isnull=True).prefetch_related('team').afirst()
else: else:
participation = await Participation.objects\ participation = await Participation.objects\
.filter(teamdraw__round=self.tournament.draw.current_round, .filter(teamdraw__round=self.tournament.draw.current_round,
teamdraw__last_dice__isnull=True).prefetch_related('team').afirst() teamdraw__passage_dice__isnull=True).prefetch_related('team').afirst()
trigram = participation.team.trigram trigram = participation.team.trigram
else: else:
participation = await Participation.objects.filter(team__participants=self.registration)\ participation = await Participation.objects.filter(team__participants=self.registration)\
@ -179,10 +179,10 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
match state: match state:
case 'DICE_SELECT_POULES': case 'DICE_SELECT_POULES':
if team_draw.last_dice is not None: if team_draw.passage_dice is not None:
return await self.alert(_("You've already launched the dice."), 'danger') return await self.alert(_("You've already launched the dice."), 'danger')
case 'DICE_ORDER_POULE': case 'DICE_ORDER_POULE':
if team_draw.last_dice is not None: if team_draw.choice_dice is not None:
return await self.alert(_("You've already launched the dice."), 'danger') return await self.alert(_("You've already launched the dice."), 'danger')
if not await self.tournament.draw.current_round.current_pool.teamdraw_set\ if not await self.tournament.draw.current_round.current_pool.teamdraw_set\
.filter(participation=participation).aexists(): .filter(participation=participation).aexists():
@ -191,7 +191,10 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
return await self.alert(_("This is not the time for this."), 'danger') return await self.alert(_("This is not the time for this."), 'danger')
res = randint(1, 100) res = randint(1, 100)
team_draw.last_dice = res if state == 'DICE_SELECT_POULES':
team_draw.passage_dice = res
else:
team_draw.choice_dice = res
await sync_to_async(team_draw.save)() await sync_to_async(team_draw.save)()
await self.channel_layer.group_send( await self.channel_layer.group_send(
@ -199,21 +202,21 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
if state == 'DICE_SELECT_POULES' and \ if state == 'DICE_SELECT_POULES' and \
not await TeamDraw.objects.filter(round_id=self.tournament.draw.current_round_id, not await TeamDraw.objects.filter(round_id=self.tournament.draw.current_round_id,
last_dice__isnull=True).aexists(): passage_dice__isnull=True).aexists():
tds = [] tds = []
async for td in TeamDraw.objects.filter(round_id=self.tournament.draw.current_round_id)\ async for td in TeamDraw.objects.filter(round_id=self.tournament.draw.current_round_id)\
.prefetch_related('participation__team'): .prefetch_related('participation__team'):
tds.append(td) tds.append(td)
dices = {td: td.last_dice for td in tds} dices = {td: td.passage_dice for td in tds}
values = list(dices.values()) values = list(dices.values())
error = False error = False
for v in set(values): for v in set(values):
if values.count(v) > 1: if values.count(v) > 1:
dups = [td for td in tds if td.last_dice == v] dups = [td for td in tds if td.passage_dice == v]
for dup in dups: for dup in dups:
dup.last_dice = None dup.passage_dice = None
await sync_to_async(dup.save)() await sync_to_async(dup.save)()
await self.channel_layer.group_send( await self.channel_layer.group_send(
f"tournament-{self.tournament.id}", f"tournament-{self.tournament.id}",
@ -229,7 +232,7 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
if error: if error:
return return
tds.sort(key=lambda td: td.last_dice) tds.sort(key=lambda td: td.passage_dice)
tds_copy = tds.copy() tds_copy = tds.copy()
async for p in Pool.objects.filter(round_id=self.tournament.draw.current_round_id).order_by('letter').all(): async for p in Pool.objects.filter(round_id=self.tournament.draw.current_round_id).order_by('letter').all():
@ -247,7 +250,7 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
if await sync_to_async(lambda: set(td['id'] for td in p1.teamdraw_set.values('id')))() \ if await sync_to_async(lambda: set(td['id'] for td in p1.teamdraw_set.values('id')))() \
== await sync_to_async(lambda:set(td['id'] for td in p2.teamdraw_set.values('id')))(): == await sync_to_async(lambda:set(td['id'] for td in p2.teamdraw_set.values('id')))():
await TeamDraw.objects.filter(round=self.tournament.draw.current_round)\ await TeamDraw.objects.filter(round=self.tournament.draw.current_round)\
.aupdate(last_dice=None, pool=None, passage_index=None) .aupdate(passage_dice=None, pool=None, passage_index=None)
for td in tds: for td in tds:
await self.channel_layer.group_send( await self.channel_layer.group_send(
f"tournament-{self.tournament.id}", f"tournament-{self.tournament.id}",
@ -265,13 +268,12 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
msg = "Les résultats des dés sont les suivants : " msg = "Les résultats des dés sont les suivants : "
msg += await sync_to_async(lambda: ", ".join( msg += await sync_to_async(lambda: ", ".join(
f"<strong>{td.participation.team.trigram}</strong> ({td.last_dice})" f"<strong>{td.participation.team.trigram}</strong> ({td.passage_dice})"
for td in self.tournament.draw.current_round.team_draws))() for td in self.tournament.draw.current_round.team_draws))()
msg += ". L'ordre de passage et les compositions des différentes poules sont affiché⋅es sur le côté." msg += ". L'ordre de passage et les compositions des différentes poules sont affiché⋅es sur le côté."
self.tournament.draw.last_message = msg self.tournament.draw.last_message = msg
await sync_to_async(self.tournament.draw.save)() await sync_to_async(self.tournament.draw.save)()
await TeamDraw.objects.filter(round=self.tournament.draw.current_round).aupdate(last_dice=None)
for td in tds: for td in tds:
await self.channel_layer.group_send( await self.channel_layer.group_send(
f"tournament-{self.tournament.id}", f"tournament-{self.tournament.id}",
@ -296,7 +298,7 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
{'type': 'draw.set_active', 'draw': self.tournament.draw}) {'type': 'draw.set_active', 'draw': self.tournament.draw})
elif state == 'DICE_ORDER_POULE' and \ elif state == 'DICE_ORDER_POULE' and \
not await TeamDraw.objects.filter(pool=self.tournament.draw.current_round.current_pool, not await TeamDraw.objects.filter(pool=self.tournament.draw.current_round.current_pool,
last_dice__isnull=True).aexists(): choice_dice__isnull=True).aexists():
pool = self.tournament.draw.current_round.current_pool pool = self.tournament.draw.current_round.current_pool
tds = [] tds = []
@ -304,15 +306,15 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
.prefetch_related('participation__team'): .prefetch_related('participation__team'):
tds.append(td) tds.append(td)
dices = {td: td.last_dice for td in tds} dices = {td: td.choice_dice for td in tds}
values = list(dices.values()) values = list(dices.values())
error = False error = False
for v in set(values): for v in set(values):
if values.count(v) > 1: if values.count(v) > 1:
dups = [td for td in tds if td.last_dice == v] dups = [td for td in tds if td.choice_dice == v]
for dup in dups: for dup in dups:
dup.last_dice = None dup.choice_dice = None
await sync_to_async(dup.save)() await sync_to_async(dup.save)()
await self.channel_layer.group_send( await self.channel_layer.group_send(
f"tournament-{self.tournament.id}", f"tournament-{self.tournament.id}",
@ -328,7 +330,7 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
if error: if error:
return return
tds.sort(key=lambda x: -x.last_dice) tds.sort(key=lambda x: -x.choice_dice)
for i, td in enumerate(tds): for i, td in enumerate(tds):
td.choose_index = i td.choose_index = i
await sync_to_async(td.save)() await sync_to_async(td.save)()

View File

@ -0,0 +1,238 @@
# Generated by Django 4.1.7 on 2023-03-28 19:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("draw", "0006_pool_associated_pool"),
]
operations = [
migrations.RemoveField(
model_name="teamdraw",
name="last_dice",
),
migrations.AddField(
model_name="teamdraw",
name="choice_dice",
field=models.PositiveSmallIntegerField(
choices=[
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9),
(10, 10),
(11, 11),
(12, 12),
(13, 13),
(14, 14),
(15, 15),
(16, 16),
(17, 17),
(18, 18),
(19, 19),
(20, 20),
(21, 21),
(22, 22),
(23, 23),
(24, 24),
(25, 25),
(26, 26),
(27, 27),
(28, 28),
(29, 29),
(30, 30),
(31, 31),
(32, 32),
(33, 33),
(34, 34),
(35, 35),
(36, 36),
(37, 37),
(38, 38),
(39, 39),
(40, 40),
(41, 41),
(42, 42),
(43, 43),
(44, 44),
(45, 45),
(46, 46),
(47, 47),
(48, 48),
(49, 49),
(50, 50),
(51, 51),
(52, 52),
(53, 53),
(54, 54),
(55, 55),
(56, 56),
(57, 57),
(58, 58),
(59, 59),
(60, 60),
(61, 61),
(62, 62),
(63, 63),
(64, 64),
(65, 65),
(66, 66),
(67, 67),
(68, 68),
(69, 69),
(70, 70),
(71, 71),
(72, 72),
(73, 73),
(74, 74),
(75, 75),
(76, 76),
(77, 77),
(78, 78),
(79, 79),
(80, 80),
(81, 81),
(82, 82),
(83, 83),
(84, 84),
(85, 85),
(86, 86),
(87, 87),
(88, 88),
(89, 89),
(90, 90),
(91, 91),
(92, 92),
(93, 93),
(94, 94),
(95, 95),
(96, 96),
(97, 97),
(98, 98),
(99, 99),
(100, 100),
],
default=None,
null=True,
verbose_name="choice dice",
),
),
migrations.AddField(
model_name="teamdraw",
name="passage_dice",
field=models.PositiveSmallIntegerField(
choices=[
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9),
(10, 10),
(11, 11),
(12, 12),
(13, 13),
(14, 14),
(15, 15),
(16, 16),
(17, 17),
(18, 18),
(19, 19),
(20, 20),
(21, 21),
(22, 22),
(23, 23),
(24, 24),
(25, 25),
(26, 26),
(27, 27),
(28, 28),
(29, 29),
(30, 30),
(31, 31),
(32, 32),
(33, 33),
(34, 34),
(35, 35),
(36, 36),
(37, 37),
(38, 38),
(39, 39),
(40, 40),
(41, 41),
(42, 42),
(43, 43),
(44, 44),
(45, 45),
(46, 46),
(47, 47),
(48, 48),
(49, 49),
(50, 50),
(51, 51),
(52, 52),
(53, 53),
(54, 54),
(55, 55),
(56, 56),
(57, 57),
(58, 58),
(59, 59),
(60, 60),
(61, 61),
(62, 62),
(63, 63),
(64, 64),
(65, 65),
(66, 66),
(67, 67),
(68, 68),
(69, 69),
(70, 70),
(71, 71),
(72, 72),
(73, 73),
(74, 74),
(75, 75),
(76, 76),
(77, 77),
(78, 78),
(79, 79),
(80, 80),
(81, 81),
(82, 82),
(83, 83),
(84, 84),
(85, 85),
(86, 86),
(87, 87),
(88, 88),
(89, 89),
(90, 90),
(91, 91),
(92, 92),
(93, 93),
(94, 94),
(95, 95),
(96, 96),
(97, 97),
(98, 98),
(99, 99),
(100, 100),
],
default=None,
null=True,
verbose_name="passage dice",
),
),
]

View File

@ -314,11 +314,18 @@ class TeamDraw(models.Model):
verbose_name=_("accepted problem"), verbose_name=_("accepted problem"),
) )
last_dice = models.PositiveSmallIntegerField( passage_dice = models.PositiveSmallIntegerField(
choices=zip(range(1, 101), range(1, 101)), choices=zip(range(1, 101), range(1, 101)),
null=True, null=True,
default=None, default=None,
verbose_name=_("last dice"), verbose_name=_("passage dice"),
)
choice_dice = models.PositiveSmallIntegerField(
choices=zip(range(1, 101), range(1, 101)),
null=True,
default=None,
verbose_name=_("choice dice"),
) )
purposed = models.PositiveSmallIntegerField( purposed = models.PositiveSmallIntegerField(
@ -335,6 +342,10 @@ class TeamDraw(models.Model):
verbose_name=_('rejected problems'), verbose_name=_('rejected problems'),
) )
@property
def last_dice(self):
return self.passage_dice if self.round.draw.get_state() == 'DICE_SELECT_POULES' else self.choice_dice
@property @property
def penalty_int(self): def penalty_int(self):
return max(0, len(self.rejected) - (settings.PROBLEM_COUNT - 5)) return max(0, len(self.rejected) - (settings.PROBLEM_COUNT - 5))

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: TFJM\n" "Project-Id-Version: TFJM\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-26 11:05+0200\n" "POT-Creation-Date: 2023-03-28 21:55+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Emmy D'Anello <emmy.danello@animath.fr>\n" "Last-Translator: Emmy D'Anello <emmy.danello@animath.fr>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -21,7 +21,7 @@ msgstr ""
msgid "API" msgid "API"
msgstr "API" msgstr "API"
#: draw/apps.py:10 #: draw/apps.py:10 tfjm/templates/base.html:97
msgid "Draw" msgid "Draw"
msgstr "Tirage au sort" msgstr "Tirage au sort"
@ -61,22 +61,22 @@ msgstr "Vous avez déjà lancé le dé."
msgid "It is not your turn." msgid "It is not your turn."
msgstr "Ce n'est pas votre tour." msgstr "Ce n'est pas votre tour."
#: draw/consumers.py:191 draw/consumers.py:360 draw/consumers.py:399 #: draw/consumers.py:191 draw/consumers.py:362 draw/consumers.py:406
#: draw/consumers.py:526 #: draw/consumers.py:535
msgid "This is not the time for this." msgid "This is not the time for this."
msgstr "Ce n'est pas le moment pour cela." msgstr "Ce n'est pas le moment pour cela."
#: draw/consumers.py:224 draw/consumers.py:323 #: draw/consumers.py:227 draw/consumers.py:325
#, python-brace-format #, python-brace-format
msgid "Dices from teams {teams} are identical. Please relaunch your dices." msgid "Dices from teams {teams} are identical. Please relaunch your dices."
msgstr "" msgstr ""
"Les dés des équipes {teams} sont identiques. Merci de relancer vos dés." "Les dés des équipes {teams} sont identiques. Merci de relancer vos dés."
#: draw/consumers.py:258 #: draw/consumers.py:261
msgid "Two pools are identical. Please relaunch your dices." msgid "Two pools are identical. Please relaunch your dices."
msgstr "Deux poules sont identiques. Merci de relancer vos dés." msgstr "Deux poules sont identiques. Merci de relancer vos dés."
#: draw/consumers.py:598 #: draw/consumers.py:607
msgid "This is only available for the final tournament." msgid "This is only available for the final tournament."
msgstr "Cela n'est possible que pour la finale." msgstr "Cela n'est possible que pour la finale."
@ -166,29 +166,33 @@ msgstr "numéro de passage"
msgid "choose index" msgid "choose index"
msgstr "numéro de choix" msgstr "numéro de choix"
#: draw/models.py:310 draw/models.py:326 participation/models.py:422 #: draw/models.py:310 draw/models.py:333 participation/models.py:422
#: participation/models.py:576 #: participation/models.py:576
#, python-brace-format #, python-brace-format
msgid "Problem #{problem}" msgid "Problem #{problem}"
msgstr "Problème n°{problem}" msgstr "Problème n°{problem}"
#: draw/models.py:314 draw/models.py:330 #: draw/models.py:314 draw/models.py:337
msgid "accepted problem" msgid "accepted problem"
msgstr "problème accepté" msgstr "problème accepté"
#: draw/models.py:321 #: draw/models.py:321
msgid "last dice" msgid "passage dice"
msgstr "dernier dé" msgstr "dé d'ordre passage"
#: draw/models.py:335 #: draw/models.py:328
msgid "choice dice"
msgstr "dé d'ordre de choix"
#: draw/models.py:342
msgid "rejected problems" msgid "rejected problems"
msgstr "problèmes rejetés" msgstr "problèmes rejetés"
#: draw/models.py:347 #: draw/models.py:358
msgid "team draw" msgid "team draw"
msgstr "tirage d'équipe" msgstr "tirage d'équipe"
#: draw/models.py:348 #: draw/models.py:359
msgid "team draws" msgid "team draws"
msgstr "tirages d'équipe" msgstr "tirages d'équipe"
@ -765,12 +769,12 @@ msgstr ""
#: participation/templates/participation/create_team.html:11 #: participation/templates/participation/create_team.html:11
#: participation/templates/participation/tournament_form.html:14 #: participation/templates/participation/tournament_form.html:14
#: tfjm/templates/base.html:241 #: tfjm/templates/base.html:248
msgid "Create" msgid "Create"
msgstr "Créer" msgstr "Créer"
#: participation/templates/participation/join_team.html:11 #: participation/templates/participation/join_team.html:11
#: tfjm/templates/base.html:236 #: tfjm/templates/base.html:243
msgid "Join" msgid "Join"
msgstr "Rejoindre" msgstr "Rejoindre"
@ -1154,7 +1158,7 @@ msgid "Are you sure that you want to leave this team?"
msgstr "Êtes-vous sûr·e de vouloir quitter cette équipe ?" msgstr "Êtes-vous sûr·e de vouloir quitter cette équipe ?"
#: participation/templates/participation/team_list.html:6 #: participation/templates/participation/team_list.html:6
#: tfjm/templates/base.html:229 #: tfjm/templates/base.html:236
msgid "All teams" msgid "All teams"
msgstr "Toutes les équipes" msgstr "Toutes les équipes"
@ -1237,7 +1241,7 @@ msgid "Add pool"
msgstr "Ajouter une poule" msgstr "Ajouter une poule"
#: participation/templates/participation/tournament_list.html:6 #: participation/templates/participation/tournament_list.html:6
#: tfjm/templates/base.html:225 #: tfjm/templates/base.html:232
msgid "All tournaments" msgid "All tournaments"
msgstr "Tous les tournois" msgstr "Tous les tournois"
@ -1254,7 +1258,7 @@ msgid "Templates:"
msgstr "Modèles :" msgstr "Modèles :"
#: participation/views.py:44 tfjm/templates/base.html:73 #: participation/views.py:44 tfjm/templates/base.html:73
#: tfjm/templates/base.html:240 #: tfjm/templates/base.html:247
msgid "Create team" msgid "Create team"
msgstr "Créer une équipe" msgstr "Créer une équipe"
@ -1267,7 +1271,7 @@ msgid "You are already in a team."
msgstr "Vous êtes déjà dans une équipe." msgstr "Vous êtes déjà dans une équipe."
#: participation/views.py:89 tfjm/templates/base.html:78 #: participation/views.py:89 tfjm/templates/base.html:78
#: tfjm/templates/base.html:235 #: tfjm/templates/base.html:242
msgid "Join team" msgid "Join team"
msgstr "Rejoindre une équipe" msgstr "Rejoindre une équipe"
@ -1724,8 +1728,8 @@ msgid "Your password has been set. You may go ahead and log in now."
msgstr "Votre mot de passe a été changé. Vous pouvez désormais vous connecter." msgstr "Votre mot de passe a été changé. Vous pouvez désormais vous connecter."
#: registration/templates/registration/password_reset_complete.html:10 #: registration/templates/registration/password_reset_complete.html:10
#: tfjm/templates/base.html:126 tfjm/templates/base.html:245 #: tfjm/templates/base.html:133 tfjm/templates/base.html:252
#: tfjm/templates/base.html:246 tfjm/templates/registration/login.html:7 #: tfjm/templates/base.html:253 tfjm/templates/registration/login.html:7
#: tfjm/templates/registration/login.html:8 #: tfjm/templates/registration/login.html:8
#: tfjm/templates/registration/login.html:25 #: tfjm/templates/registration/login.html:25
msgid "Log in" msgid "Log in"
@ -2140,35 +2144,35 @@ msgstr "Mon équipe"
msgid "My participation" msgid "My participation"
msgstr "Ma participation" msgstr "Ma participation"
#: tfjm/templates/base.html:96 #: tfjm/templates/base.html:103
msgid "Chat" msgid "Chat"
msgstr "Chat" msgstr "Chat"
#: tfjm/templates/base.html:100 #: tfjm/templates/base.html:107
msgid "Administration" msgid "Administration"
msgstr "Administration" msgstr "Administration"
#: tfjm/templates/base.html:108 #: tfjm/templates/base.html:115
msgid "Search…" msgid "Search…"
msgstr "Chercher…" msgstr "Chercher…"
#: tfjm/templates/base.html:117 #: tfjm/templates/base.html:124
msgid "Return to admin view" msgid "Return to admin view"
msgstr "Retourner à l'interface administrateur⋅rice" msgstr "Retourner à l'interface administrateur⋅rice"
#: tfjm/templates/base.html:122 #: tfjm/templates/base.html:129
msgid "Register" msgid "Register"
msgstr "S'inscrire" msgstr "S'inscrire"
#: tfjm/templates/base.html:138 #: tfjm/templates/base.html:145
msgid "My account" msgid "My account"
msgstr "Mon compte" msgstr "Mon compte"
#: tfjm/templates/base.html:143 #: tfjm/templates/base.html:150
msgid "Log out" msgid "Log out"
msgstr "Déconnexion" msgstr "Déconnexion"
#: tfjm/templates/base.html:161 #: tfjm/templates/base.html:168
#, python-format #, python-format
msgid "" msgid ""
"Your email address is not validated. Please click on the link you received " "Your email address is not validated. Please click on the link you received "
@ -2179,15 +2183,15 @@ msgstr ""
"avez reçu par mail. Vous pouvez renvoyer un mail en cliquant sur <a " "avez reçu par mail. Vous pouvez renvoyer un mail en cliquant sur <a "
"href=\"%(send_email_url)s\">ce lien</a>." "href=\"%(send_email_url)s\">ce lien</a>."
#: tfjm/templates/base.html:183 #: tfjm/templates/base.html:190
msgid "Contact us" msgid "Contact us"
msgstr "Nous contacter" msgstr "Nous contacter"
#: tfjm/templates/base.html:210 #: tfjm/templates/base.html:217
msgid "About" msgid "About"
msgstr "À propos" msgstr "À propos"
#: tfjm/templates/base.html:232 #: tfjm/templates/base.html:239
msgid "Search results" msgid "Search results"
msgstr "Résultats de la recherche" msgstr "Résultats de la recherche"
@ -2228,6 +2232,9 @@ msgstr "Résultats"
msgid "No results found." msgid "No results found."
msgstr "Aucun résultat." msgstr "Aucun résultat."
#~ msgid "last dice"
#~ msgstr "dernier dé"
#~ msgid "Problem" #~ msgid "Problem"
#~ msgstr "Problème" #~ msgstr "Problème"