diff --git a/src/i18n/index.ts b/src/i18n/index.ts index c5256d5b..70195fef 100644 --- a/src/i18n/index.ts +++ b/src/i18n/index.ts @@ -1,4 +1,5 @@ import English from '@/i18n/languages/english'; +import French from '@/i18n/languages/french'; import Hindi from '@/i18n/languages/hindi'; import Portuguese from '@/i18n/languages/portuguese'; import { ChatError } from '@/utils/chatError'; @@ -9,6 +10,7 @@ export const LanguageMap = { english: English, hindi: Hindi, portuguese: Portuguese, + french: French, }; export type Language = keyof typeof LanguageMap; diff --git a/src/i18n/languages/french.ts b/src/i18n/languages/french.ts new file mode 100644 index 00000000..3e8afd0a --- /dev/null +++ b/src/i18n/languages/french.ts @@ -0,0 +1,156 @@ +/* eslint-disable max-len */ + +import type { AvailableTranslations } from '@/i18n/types'; + +export default { + GRAMMAR: { + AND: 'et', + OR: 'ou', + }, + + ACCESS_DENIED: 'Accès refusé.', + SCREW_YOU: ['Euh non', 'Dégage !', 'Va te faire voir.'], + CANCELLED: 'Cette action a été annulée.', + CMD_NOT_FOUND: 'Commande introuvable.', + CONFIRM: "Êtes-vous sûr ? Tapez 'confirm' pour confirmer.", + NOT_CONFIRMED: 'Confirmation non reçue à temps.', + INVALID_ALIAS: 'Alias invalide pour {{aliasFor}}.', + INVALID_ROOM_ID: 'ID de salon invalide.', + NO_DMS_COMMAND: 'Cette commande ne peut pas être utilisée dans les messages privés.', + NOT_IN_ROOM: "Vous n'êtes pas dans ce salon.", + PM_ONLY_COMMAND: 'Cette commande ne peut être utilisée que dans les messages privés.', + ROOM_ONLY_COMMAND: 'Cette commande ne peut être utilisée que dans un salon de discussion.', + TOO_LATE: 'Trop tard !', + USER_NOT_FOUND: 'Utilisateur introuvable !', + WRONG_ROOM: 'Mauvais salon.', + INVALID_ARGUMENTS: "Nombre d'arguments invalide.", + ENTRY_NOT_FOUND: 'Entrée introuvable.', + + DISABLED: { + DB: 'La base de données est actuellement désactivée.', + }, + + MONS: { + NOT_FOUND: 'Pokémon {{name}} introuvable.', + }, + + GAME: { + ALREADY_JOINED: 'Vous avez déjà rejoint cette partie.', + ALREADY_STARTED: 'La partie a déjà commencé !', + ALREADY_WATCHING: 'Vous regardez déjà cette partie !', + COMMAND_NOT_ENABLED: "Cette commande n'est pas activée pour {{game}}.", + DRAW: "La partie entre {{players}} s'est terminée par une égalité !", + ENDED: 'La partie de {{game}} [{{id}}] a été terminée.', + ENDED_AUTOMATICALLY: "La partie de {{game}} [{{id}}] s'est terminée automatiquement.", + IMPOSTOR_ALERT: [ + 'Minute ! Votre ID ne correspond pas !', + 'Un peu suspect, si vous voulez mon avis...', + "Attendez, vous n'êtes pas le bon joueur pour ça !", + "Vous n'êtes pas l'élu.", + ], + INVALID_INPUT: 'Cette entrée ne semble pas fonctionner...', + INVALID_SIDE: 'Côté invalide choisi ! Les côtés valides sont : {{sides}}', + IN_PROGRESS: 'Cette partie est déjà en cours. Otaku.', + IS_FULL: "Il n'y a plus de place pour de nouveaux joueurs.", + NOT_FOUND: 'Impossible de trouver la partie en question...', + NOT_PLAYING: [ + "Vous n'êtes pas un joueur !", + 'Vous ne jouez pas, otaku.', + 'Vous ne semblez pas être un joueur ?', + 'Joueur introuvable. Ou quelque chose comme ça.', + ], + NOT_STARTED: "La partie n'a pas encore commencé.", + CANNOT_START: 'Impossible de démarrer la partie ! Vérifiez les joueurs.', + NOT_WATCHING: 'Mais vous ne regardez pas cette partie...', + NOW_WATCHING: 'Vous regardez maintenant la partie de {{game}} entre {{players}}.', + NO_LONGER_WATCHING: 'Vous ne regardez plus la partie de {{game}} entre {{players}}.', + RESTORED: 'Partie {{id}} restaurée.', + RESTORING_WRONG_TYPE: 'Vous semblez restaurer un mauvais type de partie...', + STASHED: 'Partie {{id}} mise de côté avec succès.', + SUB: '{{out}} a été remplacé par {{in}} !', + WATCHING_NOTHING: 'Vous ne semblez pas avoir besoin de rejoindre quoi que ce soit...', + WON: '{{winner}} a gagné !', + WON_AGAINST: '{{winner}} a gagné la partie de {{game}} contre {{loser}}{{ctx}} !', + WAITING: 'En attente de votre tour...', + NON_PLAYER_OR_SPEC: 'Utilisateur non présent dans les joueurs/spectateurs', + YOUR_TURN: 'À votre tour !', + UPLOAD_FAILED: "Échec de l'envoi de la partie {{id}}.", + MOD_NOT_FOUND: "Aucun mod nommé '{{mod}}' trouvé.", + CANNOT_MOD: 'Les mods ne peuvent pas être appliqués à cette partie maintenant.', + APPLIED_MOD: '{{mod}} a été appliqué à la partie {{id}}.', + NO_THEME_SUPPORT: '{{game}} ne prend pas en charge les thèmes.', + INVALID_THEME: 'Thème invalide. Les thèmes valides sont : {{themes}}.', + SET_THEME: 'Le thème a été défini sur {{theme}}.', + CANNOT_LEAVE: 'Vous ne pouvez pas abandonner une partie en la fermant ! Essayez plutôt ``{{prefix}}{{game}} forfeit``.', + TIMER: { + PRIVATE: 'Psst c’est à vous de jouer dans {{game}} [{{id}}]', + PUBLIC: '{{user}} n’a pas joué dans {{game}} [{{id}}] depuis {{time}}...', + }, + + LIGHTS_OUT: { + INVALID_SIZE: 'Lights Out doit être entre 3x5 et 9x10.', + }, + MASTERMIND: { + ENDED: 'La partie de Mastermind a été arrêtée pour {{player}}.', + FAILED: '{{player}} n’a pas réussi à deviner {{solution}} en {{cap}} essais.', + }, + SCRABBLE: { + NO_SELECTED: "Vous devez d'abord sélectionner une case pour jouer. Utilisez les boutons !", + TILE_MISMATCH: + 'Ce coup ne semble pas correspondre aux lettres sur le plateau - tentative de placement de {{placed}} sur {{actual}}.', + MISSING_LETTER: "Vous n'avez pas de lettre {{letter}}.", + INSUFFICIENT_LETTERS: 'Vous avez seulement {{actual}} lettres de {{letter}} au lieu des {{required}} nécessaires.', + BAG_SIZE: 'Il reste {{amount}} lettres dans le sac.', + TOO_MUCH_PASSING: "La partie s'est terminée après trop de passes !", + FIRST_MOVE_CENTER: 'Le premier coup doit passer par le centre du plateau !', + FIRST_MOVE_MULTIPLE_TILES: 'Vous ne pouvez pas jouer une seule lettre au premier coup.', + MUST_BE_CONNECTED: 'Tous les coups au Scrabble doivent être connectés aux autres lettres du plateau !', + MUST_PLAY_TILES: 'Votre coup doit jouer au moins une lettre.', + INVALID_WORD: '{{wordList}} n’est pas un mot valide.', + INVALID_WORDS: '{{wordList}} ne sont pas des mots valides.', + VALID_WORD: '{{word}} est un mot valide en {{mod}}.', + HOW_TO_BLANK: + "Bonjour, vous avez tiré une lettre blanche ! Une lettre blanche peut représenter n'importe quelle lettre, mais ne rapporte aucun point. Vous pouvez taper `BL[A]NK` (par exemple) pour utiliser la lettre blanche comme un A. Les autres syntaxes prises en charge sont `BL(A)NK`, ou ajouter une apostrophe après la lettre remplacée (ex : `BLA'NK`).", + }, + }, + + COMMANDS: { + ALTS: 'Alts : {{alts}}', + BOOP: 'BOOP', + UPTIME: 'Le Bot fonctionne depuis {{time}}.', + RANK: 'Votre classement est {{rank}}.', + PONG: 'Pong !', + ROOM_NOT_GIVEN: 'Aucun salon reçu dans la minute', + + EVAL: { + SUCCESS: 'Commande exécutée avec succès.', + ERROR: 'Erreur lors de l’exécution de la commande : {{error}}', + }, + + POINTS: { + ROOM_NO_POINTS: '{{room}} n’a pas les points activés.', + USER_NO_POINTS: '[[]]{{user}} n’a aucun point dans ce salon.', + USER_POINTS: '[[]]{{user}} a {{pointsList}} dans {{roomName}}.', + USER_POINTS_RANKED: '[[]]{{user}} est classé #{{rank}} avec {{pointsList}} dans {{roomName}}.', + HEADERS: { + USER: 'Utilisateur', + }, + }, + + QUOTES: { + NO_QUOTES_FOUND: 'Aucune citation trouvée.', + }, + + TIMER: { + NONE_RUNNING: 'Vous n’avez aucun minuteur en cours !', + ENDS_IN: 'Votre minuteur se termine dans {{timeLeft}}{{comment}}.', + WOULD_HAVE_ENDED_IN: '(Le minuteur se serait terminé dans {{timeLeft}}.)', + CANCELLED: 'Votre minuteur{{comment}} a été annulé avec {{timeLeft}} restants.', + MAX_TIME: 'Les minuteurs peuvent être définis pour un maximum d’une semaine.', + INVALID_TIME: "Veuillez spécifier une durée pour le minuteur ! (N'oubliez pas d'inclure les unités)", + TIMER_END: '{{user}}, votre minuteur est terminé !', + TIMER_END_WITH_COMMENT: '{{user}}, votre minuteur est terminé ! Raison : {{comment}}', + TIMER_SET: 'Votre minuteur a été défini pour {{timeLeft}} à partir de maintenant.', + }, + }, +} satisfies AvailableTranslations;