From 80ba299587edf6801407264ab36d554d53a99966 Mon Sep 17 00:00:00 2001 From: Pierre Ferreira Date: Tue, 12 Dec 2023 11:18:55 +0100 Subject: [PATCH 01/13] changement de l'affichage en cas d'absence de lobby :art: --- .../src/Components/GraphContainer.tsx | 2 +- cryptide_project/src/Pages/Lobbies.tsx | 32 ++++++++----------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/cryptide_project/src/Components/GraphContainer.tsx b/cryptide_project/src/Components/GraphContainer.tsx index 8495501..b37ad41 100644 --- a/cryptide_project/src/Components/GraphContainer.tsx +++ b/cryptide_project/src/Components/GraphContainer.tsx @@ -106,7 +106,7 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS // Démarrez le timer au montage du composant const intervalId = setInterval(() => { setElapsedTime((prevElapsedTime) => prevElapsedTime + 0.5); - settempsData(elapsedTime) + settempsData(testTemps) testTemps += 0.5 cptBug ++ diff --git a/cryptide_project/src/Pages/Lobbies.tsx b/cryptide_project/src/Pages/Lobbies.tsx index f334eff..355bb61 100644 --- a/cryptide_project/src/Pages/Lobbies.tsx +++ b/cryptide_project/src/Pages/Lobbies.tsx @@ -136,25 +136,21 @@ function Lobbies() { - {filteredLobbiesToShow.length === 0 ? ( -
-

Il n'y a aucun lobby disponible

- -
- ) : ( -
- {filteredLobbiesToShow.map((lobby, index) => ( - - ))} -
+ + ) : ( +
+ {filteredLobbiesToShow.map((lobby, index) => ( + + ))} +
)} ); From 5bf10caee7e86c8985597cf6d0242e704123105a Mon Sep 17 00:00:00 2001 From: Pierre Ferreira Date: Tue, 12 Dec 2023 14:53:24 +0100 Subject: [PATCH 02/13] descriptions des modes infos --- cryptide_project/src/Pages/InfoPage.tsx | 47 +++++++++++++++++++------ 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/cryptide_project/src/Pages/InfoPage.tsx b/cryptide_project/src/Pages/InfoPage.tsx index 046cef6..2698c28 100644 --- a/cryptide_project/src/Pages/InfoPage.tsx +++ b/cryptide_project/src/Pages/InfoPage.tsx @@ -25,6 +25,9 @@ import MGlass from "../res/icon/magnifying-glass.png"; import Param from "../res/icon/param.png"; import Info from "../res/icon/infoGreen.png"; //todo changer la couleur de l'icon import { useAuth } from '../Contexts/AuthContext'; +import { Spinner } from 'react-bootstrap'; +import Reset from '../res/icon/reset.png'; +import Ceye from '../res/icon/hidden.png'; //@ts-ignore @@ -75,6 +78,7 @@ function InfoPage({locale, changeLocale}) {
  • +
  • Mode de jeu spéciaux
  • @@ -178,12 +182,24 @@ function InfoPage({locale, changeLocale}) { paramètres

    - Le bouton "Paramètre" permet l'affichage et la gestion de différent paramètres de la partie, comme par exemple le language, l'aide ... . + Le bouton "Paramètre" permet l'affichage et la gestion de différent paramètres de la partie, comme par exemple l'option d'activé ou non le effect sonore. Il est aussi possible de choisir le nombre de noeud du mode de jeu "Enigme" à l'aide de ce bouton.

    - - Attention, cette partie ne peut pas être complétée tant que tout les paramètres n'ont pas été choisis ! - + +
  • +
    + +

    + Le bouton "Reset" permet de réinitialiser l'état du graphe actuel. Si jamais vous avez trop déplacé ce dernier, ou que vous souhaitre que sont affichage soit plus propre, ce bouton est fait pour vous ! +

    +
  • @@ -197,9 +213,6 @@ function InfoPage({locale, changeLocale}) {

    Le bouton "Information" permet de rediriger vers la page de règle du jeu (celle ci). - {/* - //! mais est ce que nous devons rediriger sur les indices possibles ? - */}

  • @@ -215,12 +228,9 @@ function InfoPage({locale, changeLocale}) {

    - Le bouton "Fiche de déduction d'indice" permet l'affichage de tableau dynamic permettant, avec le déroulé de la partie, de déduire quels indices sont les plus probables. + Le bouton "Fiche de déduction d'indice" permet l'affichage de tableau permettant, avec le déroulé de la partie, de déduire quels indices sont les plus probables pour chaque joueur.

    - - Attention, cette partie ne peut pas être complétée tant que la page et l'algorithme dédié ne sont pas fait ! -
  • @@ -238,6 +248,21 @@ function InfoPage({locale, changeLocale}) {

  • +
  • +
    + +

    + Le bouton "Vision des derniers mouvements" permet à l'utilisateur de visualiser les 5 derniers coup effectué. Il agit donc vraiment ocmme un outil visuel. +

    +
    +

  • From ef0325cd93ac4df0854d3896ea2b2423bc66e1f8 Mon Sep 17 00:00:00 2001 From: Thomas CHAZOT Date: Wed, 13 Dec 2023 10:10:25 +0100 Subject: [PATCH 03/13] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'.drone.yml'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .drone.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.drone.yml b/.drone.yml index bb87f6f..16768b7 100644 --- a/.drone.yml +++ b/.drone.yml @@ -33,6 +33,25 @@ steps: sonar_token: from_secret: SECRET_SONAR_LOGIN_CRYPTIDE + - name: deploy-container-mysql + image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-dockerproxy-clientdrone:latest + build: + context: . + environment: + IMAGENAME: sqlite3:latest + CONTAINERNAME: sqlite3 + COMMAND: create + OVERWRITE: true + PRIVATE: true + CODEFIRST_CLIENTDRONE_ENV_MYSQL_ROOT_PASSWORD: + from_secret: MYSQL_ROOT_PASSWORD + CODEFIRST_CLIENTDRONE_ENV_MYSQL_DATABASE: + from_secret: MYSQL_DATABASE + CODEFIRST_CLIENTDRONE_ENV_MYSQL_USER: + from_secret: MYSQL_USER + CODEFIRST_CLIENTDRONE_ENV_MYSQL_PASSWORD: + from_secret: MYSQL_PASSWORD + ADMINS: thomaschazot2,pierreferreira,baptistemarcel - name: container-web image: plugins/docker From 6664096f9be7afd7af3613fb9791ef9dfc33de35 Mon Sep 17 00:00:00 2001 From: Thomas CHAZOT Date: Wed, 13 Dec 2023 10:12:33 +0100 Subject: [PATCH 04/13] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'.drone.yml'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .drone.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index 16768b7..b8cf92b 100644 --- a/.drone.yml +++ b/.drone.yml @@ -38,8 +38,8 @@ steps: build: context: . environment: - IMAGENAME: sqlite3:latest - CONTAINERNAME: sqlite3 + IMAGENAME: mysql:latest + CONTAINERNAME: mysql COMMAND: create OVERWRITE: true PRIVATE: true From b6a41d23078bd78d2892623c82716a1376a98cea Mon Sep 17 00:00:00 2001 From: Thomas CHAZOT Date: Wed, 13 Dec 2023 10:19:07 +0100 Subject: [PATCH 05/13] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'.drone.yml'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .drone.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.drone.yml b/.drone.yml index b8cf92b..3292dd3 100644 --- a/.drone.yml +++ b/.drone.yml @@ -33,6 +33,7 @@ steps: sonar_token: from_secret: SECRET_SONAR_LOGIN_CRYPTIDE +# - name: deploy-container-mysql image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-dockerproxy-clientdrone:latest build: From de143642b25ea6ab8bcd2947d5fec115c7581f45 Mon Sep 17 00:00:00 2001 From: Thomas CHAZOT Date: Wed, 13 Dec 2023 10:36:28 +0100 Subject: [PATCH 06/13] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'.drone.yml'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 3292dd3..37d3bff 100644 --- a/.drone.yml +++ b/.drone.yml @@ -43,7 +43,7 @@ steps: CONTAINERNAME: mysql COMMAND: create OVERWRITE: true - PRIVATE: true + PRIVATE: false CODEFIRST_CLIENTDRONE_ENV_MYSQL_ROOT_PASSWORD: from_secret: MYSQL_ROOT_PASSWORD CODEFIRST_CLIENTDRONE_ENV_MYSQL_DATABASE: From e9226dcfddf1136d29d72ee0d6d439cc640fb62d Mon Sep 17 00:00:00 2001 From: Pierre Ferreira Date: Wed, 13 Dec 2023 11:47:59 +0100 Subject: [PATCH 07/13] page d'information fonctionnelle a 100%, avec toute la traduction fr et en :memo: --- cryptide_project/src/App.tsx | 2 +- .../src/Components/LangDropDown.tsx | 26 +++++++- cryptide_project/src/Components/NavBar.tsx | 23 +++++++- cryptide_project/src/Pages/InfoPage.tsx | 59 ++++++++++++++++--- cryptide_project/src/Translations/en.json | 24 +++++++- cryptide_project/src/Translations/fr.json | 24 +++++++- 6 files changed, 142 insertions(+), 16 deletions(-) diff --git a/cryptide_project/src/App.tsx b/cryptide_project/src/App.tsx index 886c900..17ac33b 100644 --- a/cryptide_project/src/App.tsx +++ b/cryptide_project/src/App.tsx @@ -79,7 +79,7 @@ function App() { - {hasNavbarVisible && } + {hasNavbarVisible && } } /> diff --git a/cryptide_project/src/Components/LangDropDown.tsx b/cryptide_project/src/Components/LangDropDown.tsx index 56465e8..b788f28 100644 --- a/cryptide_project/src/Components/LangDropDown.tsx +++ b/cryptide_project/src/Components/LangDropDown.tsx @@ -3,11 +3,33 @@ import React from 'react'; import { NavDropdown } from 'react-bootstrap'; import LanguageNavItem from './LangNavItem'; import { HiLanguage } from 'react-icons/hi2'; +import ReactCountryFlag from 'react-country-flag'; + +//@ts-ignore +const localToCountryCode = (locale) => { + switch (locale) { + case 'fr': + return 'FR'; + case 'en': + return 'GB'; + default: + return 'FR'; + } +}; + // @ts-ignore -const LangDropdown = ({ changeLocale }) => { +const LangDropdown = ({ changeLocale, locale}) => { + const selectedcountryCode = localToCountryCode(locale); return ( - } id="language-dropdown" align='end' drop='down-centered'> + + } id="language-dropdown" align='end' drop='down-centered'> @@ -93,6 +104,14 @@ function AppNavbar({changeLocale}) { + {/* + {languageOptions.map((option) => ( + setSelectedLanguage(option.value)}> + {option.label} + + ))} + */} + ); diff --git a/cryptide_project/src/Pages/InfoPage.tsx b/cryptide_project/src/Pages/InfoPage.tsx index 2698c28..3d37455 100644 --- a/cryptide_project/src/Pages/InfoPage.tsx +++ b/cryptide_project/src/Pages/InfoPage.tsx @@ -78,7 +78,7 @@ function InfoPage({locale, changeLocale}) {
  • -
  • Mode de jeu spéciaux
  • +
  • Modes de jeu spéciaux
  • @@ -167,9 +167,9 @@ function InfoPage({locale, changeLocale}) {

    - Interface : +

    -
    Pour chacune des parties, vous aurez certains éléments d'interface à disposition :
    +
    • @@ -182,7 +182,7 @@ function InfoPage({locale, changeLocale}) { paramètres

      - Le bouton "Paramètre" permet l'affichage et la gestion de différent paramètres de la partie, comme par exemple l'option d'activé ou non le effect sonore. Il est aussi possible de choisir le nombre de noeud du mode de jeu "Enigme" à l'aide de ce bouton. +

    • @@ -197,7 +197,7 @@ function InfoPage({locale, changeLocale}) { paramètres

      - Le bouton "Reset" permet de réinitialiser l'état du graphe actuel. Si jamais vous avez trop déplacé ce dernier, ou que vous souhaitre que sont affichage soit plus propre, ce bouton est fait pour vous ! +

      @@ -212,7 +212,7 @@ function InfoPage({locale, changeLocale}) { info

      - Le bouton "Information" permet de rediriger vers la page de règle du jeu (celle ci). +

      @@ -228,7 +228,7 @@ function InfoPage({locale, changeLocale}) {

      - Le bouton "Fiche de déduction d'indice" permet l'affichage de tableau permettant, avec le déroulé de la partie, de déduire quels indices sont les plus probables pour chaque joueur. +

      @@ -244,7 +244,7 @@ function InfoPage({locale, changeLocale}) {

      - Le bouton "Indice personnel" est le plus important, en effet il permet d'afficher quel est votre indice secret. Vous seul le connaissais ! Il va falloir ruser pour tromper vos amis et le garder secret le plus longtemps possible ! +

      @@ -259,10 +259,11 @@ function InfoPage({locale, changeLocale}) { check

      - Le bouton "Vision des derniers mouvements" permet à l'utilisateur de visualiser les 5 derniers coup effectué. Il agit donc vraiment ocmme un outil visuel. +

      + {/* ajouter les bouton de telechargement de graph ? */}

    @@ -288,6 +289,46 @@ function InfoPage({locale, changeLocale}) {


    +
    +

    +
    +

    + +

    +

    + +

    +
    +

    + +

    + +

    + +

    +

    + +

    +

    + +

    +

    + +

    +

    + +

    +

    + +

    +

    + +

    +

    + +

    +
    +

    :


    diff --git a/cryptide_project/src/Translations/en.json b/cryptide_project/src/Translations/en.json index b28c33c..75d3e05 100644 --- a/cryptide_project/src/Translations/en.json +++ b/cryptide_project/src/Translations/en.json @@ -129,6 +129,15 @@ "info.objectif.t3":"Counter-manipulation", "info.objectif.t3.text":"If a player places a square token, the questioner must also play his game by placing a square token of his color on a node of the graph. Countermanipulation becomes a formidable weapon to divert the accusation and sow confusion.", + "info.interface": "Game Interface", + "info.interface.text": "For each game, you will have certain interface elements available:", + "info.interface.param": "The 'Settings' button allows the display and management of various game settings, such as enabling or disabling sound effects. It is also possible to choose the number of nodes for the 'Enigma' game mode using this button.", + "info.interface.reset": "The 'Reset' button resets the current state of the graph. If you have moved it too much or want its display to be neater, this button is for you!", + "info.interface.info": "The 'Information' button redirects to the game rule page (this one).", + "info.interface.fiche": "The 'Clue Deduction Sheet' button displays a table that, along with the progress of the game, allows deducing which clues are most likely for each player.", + "info.interface.indice": "The 'Personal Clue' button is the most important; it displays your secret clue. Only you know it! You'll have to be clever to deceive your friends and keep it a secret for as long as possible!", + "info.interface.vision": "The 'Last Moves Vision' button allows the user to visualize the last 5 moves made. It acts as a visual tool.", + "etape":"Step", "info.deroulement.e1":"Ask Strategic Questions", "info.deroulement.e1.text":"Each round begins with a player asking another player a question about a person on the graph. Answers are formulated by placing square or round tokens to indicate certainty or doubt as to the involvement of this person.", @@ -140,5 +149,18 @@ "info.indice-possible.age":"Person's age", "info.indice-possible.hair":"Hair color of a person", "info.indice-possible.sport":"Sport(s) of a person", - "info.indice-possible.voisin":"Character of neighbours" + "info.indice-possible.voisin":"Character of neighbours", + + "info.mdj": "Game Modes", + "info.mdj.text": "There are various other game modes that allow you to add variety and make the game more or less complex.", + "info.mdj.mastermind": "Mastermind", + "info.mdj.mastermind.text": "The 'Mastermind' game mode is a solo mode where you must be able to guess the culprit using the minimum number of guesses. In this mode, you won't have any clues, but you'll need to guess them during the game. Selecting a suspect reveals the state of all clues for that suspect. It becomes possible to guess the clues and then identify the culprit!", + "info.mdj.enigme": "Enigma", + "info.mdj.enigme.text": "This is a solo mode with three difficulty levels:", + "info.mdj.enigme.easy": "Easy Enigma", + "info.mdj.enigme.easy.txt": "In this game mode, you have access to all clues, and you must guess the culprit that matches all these clues. You can practice guessing the culprit in this mode.", + "info.mdj.enigme.medium": "Intermediate Enigma", + "info.mdj.enigme.medium.txt": "In this game mode, you don't have access to clues, but you have just enough information about some suspects to be able to guess the culprit. This information will help you guess the clues, and the culprit is the suspect for whom all the clues match. If you select the wrong suspect, don't worry! You'll have information about that suspect, making it easier for you to find the culprit. The goal is to find the culprit in the minimum number of guesses.", + "info.mdj.enigme.hard": "Hard Enigma", + "info.mdj.enigme.hard.txt": "This final variant is similar to the intermediate enigma; however, you must find the culprit on the first try, or you lose! It's up to you to play! The goal is to find the culprit in the minimum amount of time." } \ No newline at end of file diff --git a/cryptide_project/src/Translations/fr.json b/cryptide_project/src/Translations/fr.json index 6cf0389..3d82f2d 100644 --- a/cryptide_project/src/Translations/fr.json +++ b/cryptide_project/src/Translations/fr.json @@ -128,6 +128,15 @@ "info.objectif.t3":"Contre-manipulation", "info.objectif.t3.text":"Si un joueur place un jeton carré, le questionneur doit également jouer son jeu en posant un jeton carré de sa couleur sur un nœud du graphique. La contre-manipulation devient une arme redoutable pour détourner l'accusation et semer la confusion.", + "info.interface":"Interface du jeu", + "info.interface.text":"Pour chacune des parties, vous aurez certains éléments d'interface à disposition :", + "info.interface.param":"Le bouton 'Paramètre' permet l'affichage et la gestion de différents paramètres de la partie, comme par exemple l'option d'activé ou non l' effect sonore. Il est aussi possible de choisir le nombre de nœud du mode de jeu 'Enigme' à l'aide de ce bouton.", + "info.interface.reset":"Le bouton 'Reset' permet de réinitialiser l'état du graphe actuel. Si jamais vous avez trop déplacé ce dernier, ou que vous souhaite que son affichage soit plus propre, ce bouton est fait pour vous !", + "info.interface.info":"Le bouton 'Information' permet de rediriger vers la page de règle du jeu (celle-ci).", + "info.interface.fiche":"Le bouton 'Fiche de déduction d'indice' permet l'affichage de tableau permettant, avec le déroulé de la partie, de déduire quels indices sont les plus probables pour chaque joueur.", + "info.interface.indice":"Le bouton 'Indice personnel' est le plus important, en effet, il permet d'afficher quel est votre indice secret. Vous seul le connaissez ! Il va falloir ruser pour tromper vos amis et le garder secret le plus longtemps possible !", + "info.interface.vision":"Le bouton 'Vision des derniers mouvements' permet à l'utilisateur de visualiser les 5 derniers coup effectué. Il agit donc vraiment comme un outil visuel.", + "etape":"Étape", "info.deroulement.e1":"Poser des Questions Stratégiques", @@ -140,5 +149,18 @@ "info.indice-possible.age":"Âge d'une personne", "info.indice-possible.hair":"Couleur de cheveux d'une personne", "info.indice-possible.sport":"Sport(s) d'une personne", - "info.indice-possible.voisin":"Caractèristique des voisins" + "info.indice-possible.voisin":"Caractèristique des voisins", + + "info.mdj":"Modes de jeu", + "info.mdj.text":"Il existe différents autres modes de jeu, qui permettent de varier les plaisirs et de rendre le jeu plus ou moins complexe.", + "info.mdj.mastermind":"Mastermind", + "info.mdj.mastermind.text":"Le mode de jeu 'Mastermind' est un mode de jeu solo. Où vous devez être capable de deviner qui est le coupable en utilisant le minimum de coup. Pour cela, vous n'aurez aucun indice, mais vous allez devoir être capable de les deviner au cours de la partie. Sélectionner un suspect révéle l'état de tous les indices pour ce dernier. Il devient donc possible de deviner les indices, pour ensuite deviner le coupable !", + "info.mdj.enigme":"Énigme", + "info.mdj.enigme.text":"Il s'agit d'un mode solo, pour lequel on retrouve 3 modes de difficultés :", + "info.mdj.enigme.easy":"L'énigme facile", + "info.mdj.enigme.easy.txt":"Dans ce mode de jeu, vous avez accès à tous les indices, et vous devez deviner le coupable qui répond à tous ces indices. Vous pouvez donc vous entraîner à deviner le coupable dans ce mode.", + "info.mdj.enigme.medium":"L'énigme intermédiaire", + "info.mdj.enigme.medium.txt":"Dans ce mode de jeu, vous n'avez pas accès au indice, mais vous avez juste assez d'informations sur certains suspects pour pouvoir deviner le coupable. Ces informations vont vous permettre de deviner les indices, et le coupable est le suspect pour lequel tous les indices correspondent. Si jamais vous sélectionnez le mauvais suspect, pas de panique ! Vous aurez les informations relatives à ce dernier, ce qui vous facilitera le travail pour trouver le coupable. L'objectif est donc de trouver le coupable en un minimum de coup.", + "info.mdj.enigme.hard":"L'énigme difficile", + "info.mdj.enigme.hard.txt":"Cette dernière variante est similaire à l'énigme intermédiaire, cependant, il faudra trouver du premier coup sinon, vous aurez perdu ! À vous de jouer ! L'objectif est donc de trouver le coupable en un minimum de temps." } From e5fd8001632532be5d308939f43a2de7411a63a6 Mon Sep 17 00:00:00 2001 From: Pierre Ferreira Date: Wed, 13 Dec 2023 12:37:55 +0100 Subject: [PATCH 08/13] =?UTF-8?q?ajout=20de=20diff=C3=A9rentes=20langues?= =?UTF-8?q?=20pour=20la=20page=20info=20:globe=5Fwith=5Fmeridians:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cryptide_project/src/App.tsx | 7 + .../src/Components/LangDropDown.tsx | 22 ++- cryptide_project/src/Components/NavBar.tsx | 18 -- cryptide_project/src/Pages/InfoPage.tsx | 2 +- cryptide_project/src/Translations/en.json | 3 + cryptide_project/src/Translations/es.json | 157 +++++++++++++++++ cryptide_project/src/Translations/fr.json | 3 + cryptide_project/src/Translations/pt.json | 160 ++++++++++++++++++ cryptide_project/src/Translations/ru.json | 160 ++++++++++++++++++ 9 files changed, 512 insertions(+), 20 deletions(-) create mode 100644 cryptide_project/src/Translations/es.json create mode 100644 cryptide_project/src/Translations/pt.json create mode 100644 cryptide_project/src/Translations/ru.json diff --git a/cryptide_project/src/App.tsx b/cryptide_project/src/App.tsx index 17ac33b..79c0c2f 100644 --- a/cryptide_project/src/App.tsx +++ b/cryptide_project/src/App.tsx @@ -37,6 +37,10 @@ import 'bootstrap/dist/css/bootstrap.min.css'; /* Internationnalisation */ import messagesFr from './Translations/fr.json'; import messagesEn from './Translations/en.json'; +import messagesEs from './Translations/es.json'; +import messagesPt from './Translations/pt.json'; +import messagesRu from './Translations/ru.json'; + /* Gestion d' erreur */ import ErrorBoundary from './Error/ErrorBoundary'; @@ -50,6 +54,9 @@ import Tutorial from './Pages/Tutorial'; const messages = { fr: messagesFr, en: messagesEn, + es: messagesEs, + pt: messagesPt, + ru: messagesRu, }; function App() { diff --git a/cryptide_project/src/Components/LangDropDown.tsx b/cryptide_project/src/Components/LangDropDown.tsx index b788f28..e12ecb7 100644 --- a/cryptide_project/src/Components/LangDropDown.tsx +++ b/cryptide_project/src/Components/LangDropDown.tsx @@ -12,6 +12,12 @@ const localToCountryCode = (locale) => { return 'FR'; case 'en': return 'GB'; + case 'es': + return 'ES'; + case 'pt': + return 'PT'; + case 'ru': + return 'RU'; default: return 'FR'; } @@ -40,7 +46,21 @@ const LangDropdown = ({ changeLocale, locale}) => { languageKey="languageSelector.english" onClick={() => changeLocale('en')} /> - {/* Ajoutez d'autres langues selon vos besoins */} + changeLocale('es')} + /> + changeLocale('pt')} + /> + changeLocale('ru')} + /> ); }; diff --git a/cryptide_project/src/Components/NavBar.tsx b/cryptide_project/src/Components/NavBar.tsx index 698fcd0..1aff0fe 100644 --- a/cryptide_project/src/Components/NavBar.tsx +++ b/cryptide_project/src/Components/NavBar.tsx @@ -48,17 +48,6 @@ function AppNavbar({changeLocale, locale}) { navigate(`${basePath}/`) } - // const [selectedLanguage, setSelectedLanguage] = useState('en'); - - // const languageOptions = [ - // { value: 'fr', label: 'Français' }, - // { value: 'en', label: 'English' }, - // { value: 'es', label: 'Español' }, - // { value: 'pr', label: 'Portugues' }, - // { value: 'ru', label: 'Blyat' } - // ]; - - return ( @@ -104,13 +93,6 @@ function AppNavbar({changeLocale, locale}) { - {/* - {languageOptions.map((option) => ( - setSelectedLanguage(option.value)}> - {option.label} - - ))} - */} diff --git a/cryptide_project/src/Pages/InfoPage.tsx b/cryptide_project/src/Pages/InfoPage.tsx index 3d37455..55cea3e 100644 --- a/cryptide_project/src/Pages/InfoPage.tsx +++ b/cryptide_project/src/Pages/InfoPage.tsx @@ -78,7 +78,7 @@ function InfoPage({locale, changeLocale}) {
  • -
  • Modes de jeu spéciaux
  • +
  • diff --git a/cryptide_project/src/Translations/en.json b/cryptide_project/src/Translations/en.json index 75d3e05..96300b6 100644 --- a/cryptide_project/src/Translations/en.json +++ b/cryptide_project/src/Translations/en.json @@ -1,6 +1,9 @@ { "languageSelector.french": "French", "languageSelector.english": "English", + "languageSelector.espagnol": "Espagnol", + "languageSelector.portuguese": "Portuguese", + "languageSelector.russian": "Russian", "home.histoire.title": "HISTORY", "home.histoire": "Cryptozoology studies the traces of legendary monsters: cryptids. Yetis, Chupacabra, beast of the gevaudan, Dahut, etc. , are very serious topics for you… Cross the clues and be the first to discover them!", diff --git a/cryptide_project/src/Translations/es.json b/cryptide_project/src/Translations/es.json new file mode 100644 index 0000000..f63c4a1 --- /dev/null +++ b/cryptide_project/src/Translations/es.json @@ -0,0 +1,157 @@ +{ + "languageSelector.french": "Francés", + "languageSelector.english": "Inglés", + "languageSelector.espagnol": "Español", + "languageSelector.portuguese": "Portugués", + "languageSelector.russian": "Ruso", + + "home.histoire.title": "HISTORIA", + "home.histoire": "La criptozoología estudia las huellas de monstruos legendarios: criptidos. Yetis, Chupacabra, bestia de Gévaudan, Dahut, etc. son temas muy serios para ti... Cruza las pistas y sé el primero en descubrirlos.", + + "home.jeu.title": "EL JUEGO", + "home.jeu": "Cada jugador tiene una pista en el campo donde se encuentra la criatura. Cruzando tu información, solo puede haber una casilla. Pero el objetivo es ser el primero en encontrarla. Pregunta a tus colegas y, sin embargo, competidores. Solo pueden responderte con un 'no' o un 'quizás', con mucha lógica y un poco de audacia, ¡puedes entrar en la leyenda!", + + "home.plus.title": "FORTALEZAS", + "home.plus.1": "Un mecanismo de deducción asombroso.", + "home.plus.2": "Una inmensa rejugabilidad.", + "home.plus.3": "Un tema sorprendente y fuerte.", + + "game.time": "Tiempo: 45 minutos", + "game.players": "Jugadores: de 3 a 5 jugadores", + "game.age": "Edad: 10 años en adelante", + "game.createdBy": "Creado por:", + "game.illustratedBy": "Ilustrado por:", + + "log_in": "Iniciar sesión", + "sign_up": "Registrarse", + "log_out": "Cerrar sesión", + + "join": "Unirse", + "create_room": "Crear sala", + "play_solo": "Jugador individual", + + "play": "JUGAR", + + "football": "Fútbol", + "basketball": "Baloncesto", + "baseball": "Béisbol", + "tennis": "Tenis", + "bowling": "Bolos", + + "white": "Blanco", + "black": "Negro", + "blond": "Rubio", + "redhead": "Pelirrojo", + "brown": "Marrón", + + "and": "y", + "or": "o", + "or_sport": "o", + + "age_indice_start": "El sospechoso tiene entre", + "age_indice_more_start": "El sospechoso tiene al menos", + "age_indice_end": "años", + + "color_edges_start": "El sospechoso tiene al menos un amigo con cabello", + "color_edges_end": "", + + "color_start": "El sospechoso tiene cabello", + "color_end": "", + + "nb_friends_indice_start": "El sospechoso tiene", + "nb_friends_indice_end": "amigos", + + "nb_sports_indice_start": "El sospechoso juega", + "nb_sports_indice_end": "deporte(s)", + + "sport_start": "El sospechoso juega al menos", + "sport_end": "", + + "informations": "Información", + "info.intro.title": "Introducción al juego:", + "info.intro.text": "¡Bienvenido a nuestro emocionante juego de deducción, donde la intriga y la travesura se combinan en una emocionante aventura! Sumérgete en un mundo de misterio e intriga, donde cada interacción cuenta y cada pista te acerca a la verdad. Imagina un gráfico complejo donde cada vértice representa a una persona, cada eje una relación, y cada detalle cuenta. Te sumerges en un desafiante reto para descubrir quién entre estas personas es el misterioso asesino. Cada jugador tiene una pista crucial y solo el intercambio estratégico de estas pistas te llevará a resolver el misterio. Explora nuestra página de reglas para entender las complejidades del juego, descubre pistas que pueden guiarte y desarrolla estrategias inteligentes para identificar al culpable. ¡Manipula a tus amigos para ser el primero en descubrir quién es el asesino oculto en el gráfico! ¿Estás listo para aceptar el desafío y desenmascarar al asesino oculto en el gráfico? ¡Que comience la investigación!", + + "info.sommaire": "Contenidos", + + "info.title.composant": "Componentes del juego", + "info.title.objectif": "Objetivo del juego", + "info.title.deroulement": "Desarrollo del juego", + "info.title.indice_possible": "Posible pista del juego", + + "info.pions": "Peones", + "info.composant.text": "A cada jugador se le asignará un color específico que distinguirá las acciones representadas por los peones de la siguiente manera:", + + "info.composant.carre.title": "Fichas cuadradas", + "info.composant.carre": "Estas fichas indican una negación. Cuando un jugador coloca una ficha cuadrada, significa que su pista elimina a la persona designada.", + + "info.composant.rond.title": "Fichas redondas", + "info.composant.rond": "Estas fichas representan un 'quizás'. El jugador que deposita esta ficha afirma que la persona es sospechosa, pero esto no garantiza su culpabilidad. ¡Solo hay un sospechoso que lleva una ficha redonda para todos los jugadores en el juego, y ese es el culpable!", + + "info.car_perso": "Características", + "info.composant.textcar": "Además de sus nombres, los personajes están representados con otras características:", + + "info.composant.age.title": "Edades", + "info.composant.age": "Cada persona tiene una edad para autenticarlos, que varía entre 0 y 60 años. La edad es una característica que se confirmará con pistas en forma de ", + "info.composant.age.link": "grupos de edad", + + "info.composant.hair_col.title": "Colores de cabello", + "info.composant.hair_col": "Los personajes también tienen un color de cabello, que puede ser de los siguientes colores:", + + "hair.blanc": "Blanco", + "hair.blond": "Rubio", + "hair.roux": "Pelirrojo", + "hair.chatain": "Marrón", + "hair.noir": "Negro", + + "info.composant.sport.title": "Deportes", + "info.composant.sport": "Los hobbies de los personajes están representados por cinco deportes respectivamente:", + "info.composant.baseball": "Béisbol", + "info.composant.basketball": "Baloncesto", + "info.composant.bowling": "Bowling", + "info.composant.football": "Fútbol", + "info.composant.tennis": "Tenis", + "info.composant.sport.bis": "Entre estos deportes, cada personaje puede tener entre 0 y 3 deportes, lo que facilita su identificación utilizando las pistas que tienes.", + + "info.objectif.intro": "Bienvenido al ingenioso universo de nuestro juego de deducción, donde el engaño y la astucia son las claves del éxito. Tu misión es desentrañar el misterio detrás de cada interacción del complejo gráfico que representa las relaciones entre individuos.", + "info.objectif.t1": "Manipulación Sutil", + "info.objectif.t1.text": "El objetivo final es descubrir quién entre los individuos es el asesino, pero no a través de una colaboración abierta. Por el contrario, utilizarás una manipulación sutil para difuminar las líneas y distraer a tus oponentes. Haz preguntas estratégicas, responde con malicia y siembra pistas engañosas para acercarte al resultado.", + "info.objectif.t2": "Trucos", + "info.objectif.t2.text": "Cada ronda ofrece la oportunidad de sembrar dudas entre tus oponentes. Cuando un jugador te hace preguntas, responde colocando inteligentemente un token cuadrado para indicar que 'según tu pista, esa persona no puede ser el culpable' o un token redondo para sugerir que permanezcan en la lista de sospechosos. Ten cuidado, porque cada gesto puede interpretarse, y la verdad a menudo está oculta detrás de una fachada de pistas engañosas.", + "info.objectif.t3": "Contramanipulación", + "info.objectif.t3.text": "Si un jugador coloca un token cuadrado, el que hace la pregunta también debe jugar su juego colocando un token cuadrado de su color en un nodo del gráfico. La contramanipulación se convierte en un arma formidable para desviar la acusación y sembrar la confusión.", + + "info.interface": "Interfaz de juego", + "info.interface.text": "Para cada juego, tendrás disponibles ciertos elementos de interfaz:", + "info.interface.param": "El botón 'Configuración' permite mostrar y gestionar varias configuraciones del juego, como activar o desactivar efectos de sonido. También es posible elegir el número de nodos para el modo de juego 'Enigma' con este botón.", + "info.interface.reset": "El botón 'Restablecer' restablece el estado actual del gráfico. Si lo has movido demasiado o quieres que su visualización sea más ordenada, ¡este botón es para ti!", + "info.interface.info": "El botón 'Información' redirige a la página de reglas del juego (esta).", + "info.interface.fiche": "El botón 'Hoja de Deducción de Pistas' muestra una tabla que, junto con el progreso del juego, permite deducir qué pistas son más probables para cada jugador.", + "info.interface.indice": "El botón 'Pista Personal' es el más importante; muestra tu pista secreta. ¡Solo tú lo sabes! Tendrás que ser astuto para engañar a tus amigos y mantenerlo en secreto el mayor tiempo posible!", + "info.interface.vision": "El botón 'Visión de los Últimos Movimientos' permite al usuario visualizar los últimos 5 movimientos realizados. Actúa como una herramienta visual.", + + "etape": "Paso", + "info.deroulement.e1": "Hacer preguntas estratégicas", + "info.deroulement.e1.text": "Cada ronda comienza con un jugador haciendo preguntas a otro jugador sobre una persona en el gráfico. Las respuestas se formulan colocando fichas cuadradas o redondas para indicar certeza o duda sobre la participación de esa persona.", + "info.deroulement.e2": "Contramanipulación y Contra-pregunta", + "info.deroulement.e2.text": "Si un jugador coloca una ficha cuadrada, el que hace la pregunta también debe colocar una ficha cuadrada en un nodo del gráfico. Las contra-preguntas son una forma de confundir a los jugadores y desviar la acusación.", + "info.deroulement.e3": "La Adivinanza Final", + "info.deroulement.e3.text": "El juego alcanza su clímax cuando un jugador intenta la 'Adivinanza' final, afirmando que tal persona es el asesino. Otros jugadores", + + "info.indice-possible.age": "Edad de la persona", + "info.indice-possible.hair": "Color de pelo de una persona", + "info.indice-possible.sport": "Deporte(s) de una persona", + "info.indice-possible.voisin": "Personaje de los vecinos", + + "info.mdj": "Modos de juego", + "info.mdj.text": "Existen varios modos de juego que te permiten agregar variedad y hacer el juego más o menos complejo.", + "info.mdj.mastermind": "Mastermind", + "info.mdj.mastermind.text": "El modo de juego 'Mastermind' es un modo para un solo jugador donde debes ser capaz de adivinar al culpable utilizando el menor número de suposiciones. En este modo, no tendrás ninguna pista, pero deberás adivinarlas durante el juego. Seleccionar a un sospechoso revela el estado de todas las pistas para ese sospechoso. ¡Se vuelve posible adivinar las pistas y luego identificar al culpable!", + "info.mdj.enigme": "Enigma", + "info.mdj.enigme.text": "Este es un modo para un solo jugador con tres niveles de dificultad:", + "info.mdj.enigme.easy": "Enigma Fácil", + "info.mdj.enigme.easy.txt": "En este modo de juego, tienes acceso a todas las pistas y debes adivinar al culpable que coincide con todas estas pistas. Puedes practicar adivinando al culpable en este modo.", + "info.mdj.enigme.medium": "Enigma Intermedio", + "info.mdj.enigme.medium.txt": "En este modo de juego, no tienes acceso a pistas, pero tienes información suficiente sobre algunos sospechosos para poder adivinar al culpable. Esta información te ayudará a adivinar las pistas, y el culpable es el sospechoso para el cual todas las pistas coinciden. Si seleccionas al sospechoso equivocado, ¡no te preocupes! Tendrás información sobre ese sospechoso, lo que facilitará encontrar al culpable. El objetivo es encontrar al culpable en el menor número de suposiciones.", + "info.mdj.enigme.hard": "Enigma Difícil", + "info.mdj.enigme.hard.txt": "Esta variante final es similar al enigma intermedio; sin embargo, ¡debes encontrar al culpable en el primer intento, o pierdes! ¡Depende de ti jugar! El objetivo es encontrar al culpable en el menor tiempo posible." +} \ No newline at end of file diff --git a/cryptide_project/src/Translations/fr.json b/cryptide_project/src/Translations/fr.json index 3d82f2d..56f6d00 100644 --- a/cryptide_project/src/Translations/fr.json +++ b/cryptide_project/src/Translations/fr.json @@ -1,6 +1,9 @@ { "languageSelector.french": "Français", "languageSelector.english": "Anglais", + "languageSelector.espagnol": "Espagnol", + "languageSelector.portuguese": "Portugais", + "languageSelector.russian": "Russe", "home.histoire.title": "L'HISTOIRE", "home.histoire": "La cryptozoologie étudie les traces des monstres de légende : les cryptides. Yétis, Chupacabra, bête du gévaudan, Dahut, etc., sont des sujets très sérieux pour vous… Croisez les indices et soyez le premier à les découvrir!", diff --git a/cryptide_project/src/Translations/pt.json b/cryptide_project/src/Translations/pt.json new file mode 100644 index 0000000..a6b93fc --- /dev/null +++ b/cryptide_project/src/Translations/pt.json @@ -0,0 +1,160 @@ +{ + "languageSelector.french": "Francês", + "languageSelector.english": "Inglês", + "languageSelector.espagnol": "Espanhol", + "languageSelector.portuguese": "Português", + "languageSelector.russian": "Russo", + + "home.histoire.title": "HISTÓRIA", + "home.histoire": "A criptozoologia estuda as pegadas de monstros lendários: criptídeos. Yetis, Chupacabra, a besta de Gévaudan, Dahut, etc., são tópicos muito sérios para você... Cruze as pistas e seja o primeiro a descobri-los!", + + "home.jeu.title": "O JOGO", + "home.jeu": "Cada jogador tem uma pista no campo onde a criatura está localizada. Ao cruzar suas informações, só pode haver uma caixa. Mas o objetivo é ser o primeiro a encontrá-la. Pergunte aos seus colegas, e ainda assim aos concorrentes. Eles só podem responder com 'não' ou 'talvez', com muita lógica e um pouco de audácia, você pode entrar na lenda!", + + "home.plus.title": "FORÇA", + "home.plus.1": "Um mecanismo de dedução incrível.", + "home.plus.2": "Uma imensa rejogabilidade.", + "home.plus.3": "Um tema surpreendente e forte.", + + "game.time": "Tempo: 45 minutos", + "game.players": "Jogadores: 3 a 5 jogadores", + "game.age": "Idade: 10 anos ou mais", + "game.createdBy": "Criado por:", + "game.illustratedBy": "Ilustrado por:", + + "log_in":" Entrar ", + "sign_up":" Inscrever-se ", + "log_out":" Sair ", + + "join" : "Participar", + "create_room" : "Criar sala", + "play_solo" : "Jogador único", + + "play" : "JOGAR", + + "football": "Futebol", + "basketball": "Basquete", + "baseball": "Beisebol", + "tennis": "Tênis", + "bowling": "Boliche", + + "white": "Branco", + "black": "Preto", + "blond": "Loiro", + "redhead": "Ruivo", + "brown": "Castanho", + + "and": "e", + "or": "ou", + "or_sport": "ou", + + + "age_indice_start": "O suspeito tem entre", + "age_indice_more_start": "O suspeito tem pelo menos", + "age_indice_end": "anos", + + "color_edges_start": "O suspeito tem pelo menos um amigo com", + "color_edges_end": "cabelo", + + "color_start": "O suspeito tem", + "color_end": "cabelo", + + "nb_friends_indice_start": "O suspeito tem", + "nb_friends_indice_end": "amigos", + + "nb_sports_indice_start": "O suspeito pratica", + "nb_sports_indice_end": "esporte(s)", + + "sport_start": "O suspeito joga pelo menos", + "sport_end": "", + + "informations" : "Informação", + "info.intro.title":"Introdução ao jogo:", + "info.intro.text":"Bem-vindo ao nosso empolgante jogo de dedução, onde intriga e malícia se unem em uma aventura emocionante! Mergulhe em um mundo de mistério e intriga, onde cada interação conta, e cada pista o aproxima da verdade. Imagine um gráfico complexo onde cada vértice representa uma pessoa, cada eixo uma relação, e cada detalhe conta. Você está imerso em um desafio desafiador para descobrir quem, entre esses indivíduos, é o misterioso assassino. Cada jogador tem uma pista crucial, e apenas o compartilhamento estratégico dessas pistas o levará a resolver o mistério. Explore nossa página de regras para entender as complexidades do jogo, descobrir pistas que podem orientá-lo e desenvolver estratégias inteligentes para identificar o culpado. Manipule seus amigos para ser o primeiro a descobrir quem é o assassino escondido no gráfico. Você está pronto para aceitar o desafio e desmascarar o assassino oculto no gráfico? Que a investigação comece!", + + "info.sommaire":"Conteúdo", + + "info.title.composant":"Componentes do Jogo", + "info.title.objectif":"Objetivo do Jogo", + "info.title.deroulement":"Desenvolvimento do Jogo", + "info.title.indice_possible":"Possíveis Pistas do Jogo", + + "info.pions" : "Peões", + "info.composant.text" : "Cada jogador será associado a uma cor específica que distinguirá as ações representadas pelos peões da seguinte forma:", + + "info.composant.carre.title":"Fichas quadradas", + "info.composant.carre":"Essas fichas indicam uma negação. Quando um jogador coloca uma ficha quadrada, significa que sua pista elimina a pessoa designada.", + + "info.composant.rond.title":"Fichas redondas", + "info.composant.rond":"Essas fichas representam um 'talvez'. O jogador que deposita esta ficha afirma que a pessoa é suspeita, mas isso não garante sua culpa. Há apenas um suspeito com uma ficha redonda para todos os jogadores no jogo, e este é o culpado!", + + "info.car_perso":"Características", + "info.composant.textcar":"Além de seus nomes, os personagens são representados com outras características:", + + "info.composant.age.title":"Idades", + "info.composant.age":"Cada pessoa tem uma idade para autenticá-la, variando entre 0 e 60 anos. A idade é uma característica que será confirmada por pistas na forma de ", + "info.composant.age.link":"grupos etários", + + "info.composant.hair_col.title":"Cores de cabelo", + "info.composant.hair_col":"Os personagens também têm uma cor de cabelo, que pode ser encontrada nas seguintes cores:", + + "hair.blanc":"Branco", + "hair.blond":"Loiro", + "hair.roux":"Ruivo", + "hair.chatain":"Castanho", + "hair.noir":"Preto", + + "info.composant.sport.title":"Esportes", + "info.composant.sport":"Os hobbies dos personagens são representados por cinco esportes, respectivamente:", + + "info.composant.baseball":"Beisebol", + "info.composant.basketball":"Basquete", + "info.composant.bowling":"Boliche", + "info.composant.football":"Futebol", + "info.composant.tennis":"Tênis", + "info.composant.sport.bis":"Entre esses esportes, cada personagem pode ter entre 0 e 3 esportes, o que facilita sua identificação usando as pistas que você possui.", + + "info.objectif.intro":"Bem-vindo ao universo inteligente do nosso jogo de dedução, onde a decepção e a astúcia são as chaves para o sucesso. Sua missão é desvendar o mistério por trás de cada interação do gráfico complexo que representa as relações entre os indivíduos.", + "info.objectif.t1":"Manipulação Sutil", + "info.objectif.t1.text":"O objetivo final é descobrir quem, entre os indivíduos, é o assassino, mas não por meio de colaboração aberta. Pelo contrário, você usará manipulação sutil para turvar as linhas e distrair seus oponentes. Faça perguntas estratégicas, responda com malícia e plante pistas enganosas para se aproximar do resultado.", + "info.objectif.t2":"Trapaça", + "info.objectif.t2.text":"Cada rodada oferece a oportunidade de semear dúvidas entre seus oponentes. Quando um jogador faz perguntas a você, responda colocando astutamente uma ficha quadrada para indicar que 'dependendo da sua pista, essa pessoa não pode ser o culpado' ou uma ficha redonda para sugerir que eles permanecem na lista de suspeitos. Cuidado, porque cada gesto pode ser interpretado, e a verdade muitas vezes está escondida por trás de uma fachada de pistas enganosas.", + "info.objectif.t3":"Contra-manipulação", + "info.objectif.t3.text":"Se um jogador colocar uma ficha quadrada, o questionador também deve jogar seu jogo colocando uma ficha quadrada de sua cor em um nó do gráfico. A contra-manipulação se torna uma arma formidável para desviar a acusação e semear confusão.", + + "info.interface": "Interface do Jogo", + "info.interface.text": "Para cada jogo, você terá certos elementos de interface disponíveis:", + "info.interface.param": "O botão 'Configurações' permite exibir e gerenciar várias configurações do jogo, como ativar ou desativar efeitos sonoros. Também é possível escolher o número de nós para o modo de jogo 'Enigma' usando este botão.", + "info.interface.reset": "O botão 'Redefinir' redefine o estado atual do gráfico. Se você o moveu demais ou deseja que sua exibição fique mais organizada, este botão é para você!", + "info.interface.info": "O botão 'Informações' redireciona para a página de regras do jogo (esta aqui).", + "info.interface.fiche": "O botão 'Folha de Dedução de Pistas' exibe uma tabela que, junto com o progresso do jogo, permite deduzir quais pistas são mais prováveis para cada jogador.", + "info.interface.indice": "O botão 'Pista Pessoal' é o mais importante; ele exibe sua pista secreta. Só você a conhece! Você terá que ser esperto para enganar seus amigos e mantê-la em segredo o máximo possível!", + "info.interface.vision": "O botão 'Últimas Jogadas' permite ao usuário visualizar as últimas 5 jogadas feitas. Ele age como uma ferramenta visual.", + + "etape":"Etapa", + "info.deroulement.e1":"Faça Perguntas Estratégicas", + "info.deroulement.e1.text":"Cada rodada começa com um jogador fazendo perguntas a outro jogador sobre uma pessoa no gráfico. As respostas são formuladas colocando fichas quadradas ou redondas para indicar certeza ou dúvida quanto ao envolvimento dessa pessoa.", + "info.deroulement.e2":"Contra-manipulação e Contra-perguntas", + "info.deroulement.e2.text":"Se um jogador colocar uma ficha quadrada, o questionador também deve colocar uma ficha quadrada em um nó no gráfico. Contra-perguntas são uma maneira de confundir os jogadores e desviar a acusação.", + "info.deroulement.e3":"O Palpite Final", + "info.deroulement.e3.text":"O jogo atinge seu clímax quando um jogador tenta o 'Palpite' final, alegando que tal pessoa é o assassino. Outros jogadores podem contradizer essa declaração colocando suas próprias fichas quadradas. Se nenhuma refutação for feita, o jogador que fez o 'Palpite' vence o jogo, demonstrando sua maestria na arte da manipulação.", + + "info.indice-possible.age":"Idade da Pessoa", + "info.indice-possible.hair":"Cor do cabelo de uma pessoa", + "info.indice-possible.sport":"Esporte(s) de uma pessoa", + "info.indice-possible.voisin":"Personagem dos vizinhos", + + "info.mdj": "Modos de Jogo", + "info.mdj.text": "Existem vários outros modos de jogo que permitem adicionar variedade e tornar o jogo mais ou menos complexo.", + "info.mdj.mastermind": "Mestre das Pistas", + "info.mdj.mastermind.text": "O modo de jogo 'Mestre das Pistas' é um modo solo onde você deve ser capaz de adivinhar o culpado usando o número mínimo de palpites. Neste modo, você não terá pistas, mas precisará adivinhá-las durante o jogo. Selecionar um suspeito revela o estado de todas as pistas para esse suspeito. Torna-se possível adivinhar as pistas e depois identificar o culpado!", + "info.mdj.enigme": "Enigma", + "info.mdj.enigme.text": "Este é um modo solo com três níveis de dificuldade:", + "info.mdj.enigme.easy": "Enigma Fácil", + "info.mdj.enigme.easy.txt": "Neste modo de jogo, você tem acesso a todas as pistas e deve adivinhar o culpado que corresponde a todas essas pistas. Você pode praticar adivinhando o culpado neste modo.", + "info.mdj.enigme.medium": "Enigma Intermediário", + "info.mdj.enigme.medium.txt": "Neste modo de jogo, você não tem acesso a pistas, mas tem informações suficientes sobre alguns suspeitos para poder adivinhar o culpado. Essas informações o ajudarão a adivinhar as pistas, e o culpado é o suspeito para quem todas as pistas correspondem. Se você selecionar o suspeito errado, não se preocupe! Você terá informações sobre aquele suspeito, o que facilitará encontrar o culpado. O objetivo é encontrar o culpado no mínimo de palpites.", + "info.mdj.enigme.hard": "Enigma Difícil", + "info.mdj.enigme.hard.txt": "Esta variante final é semelhante ao enigma intermediário; no entanto, você deve encontrar o culpado na primeira tentativa, ou você perde! Depende de você jogar! O objetivo é encontrar o culpado no mínimo de tempo." + +} \ No newline at end of file diff --git a/cryptide_project/src/Translations/ru.json b/cryptide_project/src/Translations/ru.json new file mode 100644 index 0000000..6bdce8c --- /dev/null +++ b/cryptide_project/src/Translations/ru.json @@ -0,0 +1,160 @@ +{ + "languageSelector.french": "Французский", + "languageSelector.english": "Английский", + "languageSelector.espagnol": "Испанский", + "languageSelector.portuguese": "Португальский", + "languageSelector.russian": "Русский", + + "home.histoire.title": "ИСТОРИЯ", + "home.histoire": "Криптозоология изучает следы легендарных монстров: криптидов. Иети, Чупакабра, зверь из Жеводана, Дахут и т. д., это очень серьезные темы для вас... Пересеките улики и первым откройте их!", + + "home.jeu.title": "ИГРА", + "home.jeu": "У каждого игрока есть улика на поле, где находится существо. Путем кросс-референцирования вашей информации может быть только одна клетка. Но цель - быть первым, кто ее найдет. Спрашивайте своих коллег, а также конкурентов. Они могут отвечать только «нет» или «возможно». С логикой и дерзостью вы можете войти в легенду!", + + "home.plus.title": "СИЛА", + "home.plus.1": "Умопомрачительный механизм дедукции.", + "home.plus.2": "Огромная возможность переигрывания.", + "home.plus.3": "Удивительная и крепкая тема.", + + "game.time": "Время: 45 минут", + "game.players": "Игроки: от 3 до 5 человек", + "game.age": "Возраст: от 10 лет", + "game.createdBy": "Создано:", + "game.illustratedBy": "Иллюстрировано:", + + "log_in":" Войти ", + "sign_up":" Зарегистрироваться ", + "log_out":" Выйти ", + + "join" : "Присоединиться", + "create_room" : "Создать комнату", + "play_solo" : "Один игрок", + + "play" : "ИГРАТЬ", + + "football": "Футбол", + "basketball": "Баскетбол", + "baseball": "Бейсбол", + "tennis": "Теннис", + "bowling": "Боулинг", + + "white": "Белый", + "black": "Черный", + "blond": "Блондин", + "redhead": "Рыжий", + "brown": "Каштановый", + + "and": "и", + "or": "или", + "or_sport": "или", + + + "age_indice_start": "Подозреваемый находится в возрасте от", + "age_indice_more_start": "Подозреваемый по крайней мере", + "age_indice_end": "лет", + + "color_edges_start": "У подозреваемого есть хотя бы один друг с", + "color_edges_end": "волосами", + + "color_start": "У подозреваемого есть", + "color_end": "волосы", + + "nb_friends_indice_start": "У подозреваемого есть", + "nb_friends_indice_end": "друзей", + + "nb_sports_indice_start": "Подозреваемый играет в", + "nb_sports_indice_end": "вида(ов) спорта", + + "sport_start": "Подозреваемый играет по меньшей мере в", + "sport_end": "", + + + "informations" : "Информация", + "info.intro.title":"Введение в игру :", + "info.intro.text":"Добро пожаловать в нашу захватывающую игру-дедукцию, где интрига и хитрость соединяются в захватывающем приключении! Погрузитесь в мир тайны и интриги, где каждое взаимодействие имеет значение, и каждая улика приближает вас к правде. Представьте себе сложный граф, где каждая вершина представляет собой человека, каждая ось - отношение, и каждая деталь имеет значение. Вы бросаетесь в сложное испытание, чтобы открыть тайну, кто из этих людей - загадочный убийца. У каждого игрока есть важная улика, и только стратегический обмен этими уликами приведет вас к разгадке тайны. Изучите нашу страницу с правилами, чтобы понять тонкости игры, обнаружьте улики, которые могут вас направить, и разрабатывайте умные стратегии для выявления виновного. Манипулируйте своими друзьями, чтобы быть первым, кто узнает, кто убийца! Готовы ли вы принять вызов и разоблачить убийцу, скрытого в графе? Пусть начнется расследование!", + + "info.sommaire":"Содержание", + + "info.title.composant":"Игровые компоненты", + "info.title.objectif":"Цель игры", + "info.title.deroulement":"Ход игры", + "info.title.indice_possible":"Возможное игровое подсказка", + + "info.pions" : "Фишки", + "info.composant.text" : "Каждому игроку будет присвоен определенный цвет, который будет отличать действия, представленные фишками, следующим образом :", + + "info.composant.carre.title":"квадратные фишки", + "info.composant.carre":"Эти фишки указывают на отрицание. Когда игрок ставит квадратную фишку, это означает, что его улика исключает указанного человека.", + + "info.composant.rond.title":"круглые фишки", + "info.composant.rond":"Эти фишки представляют собой 'возможно'. Игрок, укладывающий эту фишку, утверждает, что человек является подозреваемым, но это не гарантирует его вину. Есть только один подозреваемый с круглой фишкой для всех игроков в игре, и это убийца!", + + "info.car_perso":"Характеристики", + "info.composant.textcar":"Помимо их имен, персонажи представлены другими характеристиками :", + + "info.composant.age.title":"Возраст", + "info.composant.age":"У каждого человека есть возраст для его идентификации, варьирующийся от 0 до 60 лет. Возраст - это характеристика, которая будет подтверждена уликами в виде ", + "info.composant.age.link":"возрастных групп", + + "info.composant.hair_col.title":"Цвет волос", + "info.composant.hair_col":"У персонажей также есть цвет волос, который может быть следующими цветами :", + + "hair.blanc":"Белый", + "hair.blond":"Блондин", + "hair.roux":"Рыжий", + "hair.chatain":"Каштановый", + "hair.noir":"Черный", + + "info.composant.sport.title":"Спорт", + "info.composant.sport":"Увлечения персонажей представлены пятью видами спорта :", + "info.composant.baseball":"Бейсбол", + "info.composant.basketball":"Баскетбол", + "info.composant.bowling":"Боулинг", + "info.composant.football":"Футбол", + "info.composant.tennis":"Теннис", + "info.composant.sport.bis":"Среди этих видов спорта каждый персонаж может заниматься от 0 до 3 видов спорта, что облегчит их идентификацию с использованием имеющихся у вас улик.", + + + "info.objectif.intro":"Добро пожаловать в умный мир нашей игры-дедукции, где обман и хитрость - ключи к успеху. Ваша миссия - раскрывать тайну за каждым взаимодействием сложного графа, представляющего отношения между людьми.", + "info.objectif.t1":"Тонкая манипуляция", + "info.objectif.t1.text":"Основная цель - узнать, кто из людей является убийцей, но не через открытое сотрудничество. Напротив, вы будете использовать тонкую манипуляцию, чтобы размыть границы и отвлечь своих оппонентов. Задавайте стратегические вопросы, отвечайте злонамеренно и сеивайте вводные улики, чтобы приблизиться к результату.", + "info.objectif.t2":"Хитрость", + "info.objectif.t2.text":"Каждый раунд предоставляет возможность сеять сомнения среди ваших оппонентов. Когда вас допрашивают, отвечайте, умно ставя квадратную фишку, чтобы указать, что 'в зависимости от вашей улики этот человек не может быть убийцей' или круглую фишку, чтобы предположить, что они остаются в списке подозреваемых. Будьте осторожны, потому что каждый жест может быть истолкован, и правда часто скрыта за фасадом вводных улик.", + "info.objectif.t3":"Контрманипуляция", + "info.objectif.t3.text":"Если игрок ставит квадратную фишку, допрашивающий также должен играть свою игру, ставя квадратную фишку своего цвета на узле графа. Контрманипуляция становится мощным оружием для отвода обвинения и посева смуты.", + + "info.interface": "Игровой интерфейс", + "info.interface.text": "Для каждой игры у вас будут доступны определенные элементы интерфейса:", + "info.interface.param": "Кнопка 'Настройки' позволяет отображать и управлять различными настройками игры, такими как включение или выключение звуковых эффектов. С ее помощью также можно выбирать количество узлов для режима игры 'Загадка'.", + "info.interface.reset": "Кнопка 'Сброс' сбрасывает текущее состояние графа. Если вы передвинули его слишком сильно или хотите, чтобы его отображение было аккуратнее, эта кнопка для вас!", + "info.interface.info": "Кнопка 'Информация' перенаправляет на страницу правил игры (эту).", + "info.interface.fiche": "Кнопка 'Таблица вывода улик' отображает таблицу, которая, вместе с ходом игры, позволяет делать выводы о том, какие улики наиболее вероятны для каждого игрока.", + "info.interface.indice": "Кнопка 'Личная улика' самая важная; она отображает вашу секретную улику. Только вы знаете ее! Вам придется быть умным, чтобы обмануть своих друзей и держать ее в секрете как можно дольше!", + "info.interface.vision": "Кнопка 'Последние движения' позволяет пользователю визуализировать последние 5 сделанных ходов. Она действует как визуальный инструмент.", + + "etape": "Шаг", + "info.deroulement.e1": "Задавайте стратегические вопросы", + "info.deroulement.e1.text": "Каждый раунд начинается с того, что один игрок задает другому игроку вопрос о человеке на графике. Ответы формулируются путем установки квадратных или круглых фишек, чтобы указать уверенность или сомнение в причастности этого человека.", + "info.deroulement.e2": "Контролирование и контропросы", + "info.deroulement.e2.text": "Если игрок устанавливает квадратную фишку, задающий вопрос также должен установить квадратную фишку на узле графика. Контропросы - это способ сбить с толку игроков и отклонить обвинение.", + "info.deroulement.e3": "Окончательное предположение", + "info.deroulement.e3.text": "Игра достигает своего пика, когда игрок пытается сделать окончательное 'Предположение', утверждая, что такой-то человек - убийца. Другие игроки могут затем противоречить этому заявлению, устанавливая свои собственные квадратные фишки. Если не последует опровержение, игрок, сделавший 'Предположение', выигрывает игру, продемонстрировав свое мастерство в искусстве манипуляции.", + + "info.indice-possible.age": "Возраст человека", + "info.indice-possible.hair": "Цвет волос человека", + "info.indice-possible.sport": "Спорт(ы) человека", + "info.indice-possible.voisin": "Характер соседей", + + "info.mdj": "Режимы игры", + "info.mdj.text": "Существует различные режимы игры, которые позволяют вам добавить разнообразие и сделать игру более или менее сложной.", + "info.mdj.mastermind": "Мастер-майнд", + "info.mdj.mastermind.text": "Режим игры 'Мастер-майнд' - это сольный режим, в котором вы должны угадать убийцу, используя минимальное количество догадок. В этом режиме у вас не будет никаких улик, но вам нужно будет угадать их в ходе игры. Выбор подозреваемого позволяет узнать состояние всех улик для этого подозреваемого. Становится возможным угадать улики, а затем определить убийцу!", + "info.mdj.enigme": "Загадка", + "info.mdj.enigme.text": "Это сольный режим с тремя уровнями сложности:", + "info.mdj.enigme.easy": "Легкая загадка", + "info.mdj.enigme.easy.txt": "В этом режиме у вас есть доступ ко всем уликам, и вы должны угадать убийцу, соответствующего всем этим уликам. Вы можете практиковаться в угадывании убийцы в этом режиме.", + "info.mdj.enigme.medium": "Средняя загадка", + "info.mdj.enigme.medium.txt": "В этом режиме у вас нет доступа к уликам, но у вас есть достаточно информации о некоторых подозреваемых, чтобы угадать убийцу. Эта информация поможет вам угадать улики, и убийца - подозреваемый, для которого все улики совпадают. Если вы выберете неправильного подозреваемого, не волнуйтесь! У вас будет информация о том подозреваемом, что облегчит вам поиск убийцы. Цель - найти убийцу минимальным количеством догадок.", + "info.mdj.enigme.hard": "Трудная загадка", + "info.mdj.enigme.hard.txt": "Этот последний вариант аналогичен средней загадке; однако вы должны найти убийцу с первой попытки, иначе вы проиграли! Решайте сами! Цель - найти убийцу минимальным количеством времени." +} \ No newline at end of file From c5aa5ea930e9e0ee5a2454913dad469b8ae9756a Mon Sep 17 00:00:00 2001 From: Thomas Chazot Date: Wed, 13 Dec 2023 15:17:50 +0100 Subject: [PATCH 09/13] choix du nombre de noeuds pour les modes solos --- .../src/Components/GraphContainer.tsx | 48 +++++++++++--- cryptide_project/src/Pages/InGame.tsx | 62 ++++++++++++++++--- .../src/model/EnigmeDuJourCreator.ts | 5 +- 3 files changed, 93 insertions(+), 22 deletions(-) diff --git a/cryptide_project/src/Components/GraphContainer.tsx b/cryptide_project/src/Components/GraphContainer.tsx index a664541..f5789b9 100644 --- a/cryptide_project/src/Components/GraphContainer.tsx +++ b/cryptide_project/src/Components/GraphContainer.tsx @@ -21,6 +21,9 @@ import { json } from "body-parser"; import html2canvas from 'html2canvas'; import jsPDF from 'jspdf'; import {basePath} from "../AdressSetup" +import GameCreator from "../model/GameCreator"; +import Stub from "../model/Stub"; +import EnigmeDuJourCreator from "../model/EnigmeDuJourCreator"; interface MyGraphComponentProps { onNodeClick: (shouldShowChoiceBar: boolean) => void; @@ -50,6 +53,10 @@ interface MyGraphComponentProps { putGreyBackground : () => void putCorrectBackground : () => void putImposssibleGrey : () => void + setChangeGraph : (func: (nbNodes: number) => void) => void + + nbNodes: number + handleTurn :() => void } @@ -80,16 +87,17 @@ let cptUseEffect = 0 let testPlayers: Player[] = [] let testTemps = 0 let testFirst = false +let testFirst2 = true -const MyGraphComponent: React.FC = ({onNodeClick, handleShowTurnBar, handleTurnBarTextChange, playerTouched, setPlayerTouched, changecptTour, solo, isDaily, isEasy, addToHistory, showLast, setNetwork, setNetworkEnigme, setPlayerIndex, askedWrong, setAskedWrong, importToPdf, setImportToPdf, importToJSON, setImportToJSON, setPutCorrectBackground, setPutGreyBackground, setPutImposssibleGrey, putCorrectBackground, putGreyBackground, putImposssibleGrey, handleTurn}) => { - let cptTour: number = 0 +const MyGraphComponent: React.FC = ({onNodeClick, handleShowTurnBar, handleTurnBarTextChange, playerTouched, setPlayerTouched, changecptTour, solo, isDaily, isEasy, addToHistory, showLast, setNetwork, setNetworkEnigme, setPlayerIndex, askedWrong, setAskedWrong, importToPdf, setImportToPdf, importToJSON, setImportToJSON, setPutCorrectBackground, setPutGreyBackground, setPutImposssibleGrey, putCorrectBackground, putGreyBackground, putImposssibleGrey, handleTurn, nbNodes, setChangeGraph}) => { + let cptTour: number = 1 //* Gestion du temps : let initMtn = 0 const {isLoggedIn, user, manager} = useAuth(); - const { indices, indice, person, personNetwork, setNodeIdData, players, setPlayersData, askedPersons, setActualPlayerIndexData, room, actualPlayerIndex, turnPlayerIndex, setTurnPlayerIndexData, setWinnerData, dailyEnigme, setNbCoupData, settempsData, setNetworkDataData, setSeedData, nodesC, temps} = useGame(); + const { indices, indice, person, personNetwork, setNodeIdData, players, setPlayersData, askedPersons, setActualPlayerIndexData, room, actualPlayerIndex, turnPlayerIndex, setIndicesData, setWinnerData, dailyEnigme, setNbCoupData, settempsData, setNetworkDataData, setSeedData, nodesC, temps, setPersonData, setPersonNetworkData, setDailyEnigmeData} = useGame(); const params = new URLSearchParams(window.location.search); const navigate = useNavigate(); @@ -109,10 +117,12 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS settempsData(testTemps) testTemps += 0.5 - cptBug ++ - if (cptBug > 10){ - cptBug = 0 - socket.emit("who plays", room) + if (!solo){ + cptBug ++ + if (cptBug > 10){ + cptBug = 0 + socket.emit("who plays", room) + } } @@ -364,10 +374,29 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS } }, [importToJSON]) + const changeGraph = (nbNodes: number) => { + //todo différencier les deux + const [networkPerson, choosenPerson, choosenIndices] = GameCreator.CreateGame(3, nbNodes) + setPersonData(choosenPerson) + setPersonNetworkData(networkPerson) + setIndicesData(choosenIndices) + const map = EnigmeDuJourCreator.createEnigme(networkPerson, choosenIndices, choosenPerson, Stub.GenerateIndice()) + setDailyEnigmeData(map) + addToHistory("<----- [Tour " + 1 +"/"+networkPerson.getPersons().length + "] ----->"); + changecptTour(1) + testTemps=0 + + + } + useEffect(() => { if (personNetwork == null){ return } + + if (solo){ + setChangeGraph(() => changeGraph) + } const graph = GraphCreator.CreateGraph(personNetwork) let n = graph.nodesPerson; @@ -1087,8 +1116,7 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS else{ addToHistory(personTest.getName() + " n'est pas le coupable !"); //TODO préciser le nombre d'indice qu'il a de juste cptTour ++; // On Incrémente le nombre de tour du joueur - const tour = cptTour+1; - addToHistory("<----- [Tour " + tour +"/"+networkData.nodes.length + "] ----->"); + addToHistory("<----- [Tour " + cptTour +"/"+networkData.nodes.length + "] ----->"); changecptTour(cptTour); // On le transmet a la page précédente avec la fonction } } @@ -1101,7 +1129,7 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS setPlayerTouched(-1) } }); - }, []); // Le tableau vide signifie que cela ne s'exécutera qu'une fois après le premier rendu + }, [personNetwork]); // Le tableau vide signifie que cela ne s'exécutera qu'une fois après le premier rendu return ( <> diff --git a/cryptide_project/src/Pages/InGame.tsx b/cryptide_project/src/Pages/InGame.tsx index 4a0d8d2..bab5aab 100644 --- a/cryptide_project/src/Pages/InGame.tsx +++ b/cryptide_project/src/Pages/InGame.tsx @@ -107,6 +107,8 @@ const InGame = ({locale, changeLocale}) => { const [putCorrectBackground, setPutCorrectBackground] = useState<() => void>(() => {}); const [putGreyBackgroud, setPutGreyBackground] = useState<() => void>(() => {}); const [putImposssibleGrey, setPutImposssibleGrey] = useState<() => void>(() => {}); + const [changeGraph, setChangeGraph] = useState<(nbNodes: number) => void>(() => {}); + const setPutCorrectBackgroundData = (func: () => void) => { @@ -121,6 +123,10 @@ const InGame = ({locale, changeLocale}) => { setPutImposssibleGrey(func) } + const setChangeGraphData = (func: (nbNodes: number) => void) => { + setChangeGraph(func) + } + const setImportToJSONData = (imp: boolean) => { setImportToJSON(imp) } @@ -255,7 +261,7 @@ const InGame = ({locale, changeLocale}) => { const handleCloseS = () => setShowS(false); const handleShowS = () => setShowS(true); - const [cptTour, setcptTour] = useState(0); + const [cptTour, setcptTour] = useState(1); const [LastVisible, setLastVisible] = useState(false); @@ -317,6 +323,14 @@ const InGame = ({locale, changeLocale}) => { const [playTurnSound, setPlayTurnSound] = useState(false); const [soundPreference, setSoundPreference] = useState(true); // utilisateur + const [enteredNumber, setEnteredNumber] = useState(25); + + //@ts-ignore + const handleNumberChange = (event) => { + const newNumber = Math.max(20, Math.min(60, parseInt(event.target.value, 10))); + setEnteredNumber(newNumber); + }; + const handleSoundPreferenceChange = () => { setSoundPreference(!soundPreference); console.log("changement des options du son : "+ soundPreference) @@ -365,7 +379,9 @@ const InGame = ({locale, changeLocale}) => { putCorrectBackground={putCorrectBackground} putGreyBackground={putGreyBackgroud} putImposssibleGrey={putImposssibleGrey} - handleTurn={handleTurn}/> + handleTurn={handleTurn} + setChangeGraph={setChangeGraphData} + nbNodes={enteredNumber}/> {playTurnSound &&