diff --git a/locales/fr_FR.UTF8.js b/locales/fr_FR.UTF8.js index a10872e..39a3a33 100644 --- a/locales/fr_FR.UTF8.js +++ b/locales/fr_FR.UTF8.js @@ -1 +1 @@ -translations_data = {"messages":{"No template specified.":"Aucun template sp\u00e9cifi\u00e9.","An error occurred while displaying this page.":"Une erreur est survenue en affichant cette page.","Unexpected error occurred. If problem persist, please contact support.":"Une erreur inconnue est survenue. Si le probl\u00e8me persiste, merci de prendre contact avec le support.","Unknown":"Inconnu","Unable to connect to the database.":"Impossible de se connecter \u00e0 la base de donn\u00e9es.","Invalid username or password.":"Nom d'utilisateur ou not de passe invalid.","Sign in":"Connection","Authentication required":"Authentication requise","Access denied":"Acc\u00e8s interdit","You must login to access this page.":"Vous devez vous connecter pour acc\u00e9der \u00e0 cette page.","Configuration error in CAS auth backend.":"Erreur de configuration dans le backend d'authentification CAS.","Bad request":"Mauvaise requ\u00eate","Invalid request.":"Requ\u00eate invalid.","You have to be authenticated to access to this page.":"Vous devez \u00eatre authentifi\u00e9 pour acc\u00e9der \u00e0 cette page.","You do not have access to this application. If you think this is an error, please contact support.":"Vous n'avez pas acc\u00e8s \u00e0 cette application. Si vous pensez qu'il s'agit d'une erreur, merci de prendre contact avec le support.","Whoops ! Page not found":"Oups ! Page introuvable","The requested page can not be found.":"La page demand\u00e9e est introuvable.","Error":"Erreur","An unknown error occurred. If problem persist, please contact support.":"Une erreur inconnue est survenue. Si le probl\u00e8me persiste, merci de prendre contact avec le support.","Unable to determine the requested page. If the problem persists, please contact support.":"Impossible de d\u00e9terminer la page demand\u00e9e. Si le probl\u00e8me persiste, merci de prendre contact avec le support.","Unable to determine the requested page (loop detected). If the problem persists, please contact support.":"Impossible de d\u00e9terminer la page demand\u00e9e (boucle d\u00e9tect\u00e9e). Si le probl\u00e8me persiste, merci de prendre contact avec le support.","This request cannot be processed.":"Cette requ\u00eate ne peut \u00eatre trait\u00e9e.","Authentication required but fail to authenticate you.":"Authentication requise mais impossible pour vous authentifier.","This request could not be processed correctly.":"Cette requ\u00eate n'a put \u00eatre trait\u00e9e correctement.","You do not have access to this application.":"Vous n'avez pas acc\u00e8s \u00e0 cette application.","Details:":"D\u00e9tails :","Create a new project using EesyPHP framework":"Cr\u00e9er un nouveau project utilisant le framework EesyPHP","This command could be used to easily build the structure of a new project using the EesyPHP framework.":"Cette commande peut-\u00eatre utilis\u00e9e pour construire facilement la structure d'un nouveau project utilisant le framework EesyPHP.","Start the PHP built-in HTTP server to serve the application":"D\u00e9marrer le service HTTP int\u00e9gr\u00e9 \u00e0 PHP pour servir l'application","This command could be used to start the PHP built-in HTTP server to serve\nthe application.\n\nAdditional parameters:\n -p\/--public-url Define the public URL (default: based on listen address)\n -P\/--enable-profiler Enable Xdebug profiler\n -O\/--profiler-output [path] Xdebug profiler output directory path":"Cette commande peut-\u00eatre utilis\u00e9e pour d\u00e9marre le serveur HTTP int\u00e9gr\u00e9\n\u00e0 PHP pour servir l'application.\n\nParam\u00e8tres additionnels :\n -p\/--public-url D\u00e9finir l'URL publique (par d\u00e9faut:\n d\u00e9finie \u00e0 partir de l'adresse d'\u00e9coute)\n -P\/--enable-profiler Activer le profilter Xdebug\n -O\/--profiler-output [path] Chemin du dossier de sortie du profiler\n Xdebug","The CLI command '%s' already exists.":"La commande CLI '%s' n'existe pas.","The CLI command '%s' handler is not callable !":"La function impl\u00e9mentant la commande CLI '%s' n'est pas ex\u00e9cutable !","Usage: %s [-h] [-qd] command\n":"Utilisation: %s [-h] [-qd] commande\n"," -h Show this message\n":" -h Affiche ce message\n"," -q \/ -d Quiet\/Debug mode\n":" -q \/ -d Mode silencieux\/debug\n"," --trace Trace mode (the most verbose)\n":" --trace Mode trace (le plus verbeux)\n"," -l \/ --log-file Overwrite log file specified in configuration\n":" -l \/ --log-file Red\u00e9finir le fichier de journalisation \u00e0 utiliser \u00e0 la place de celui d\u00e9fini dans la configuration\n"," -C \/ --console Enable log on console\n":" -C \/ --console Activer la journalisation dans la console\n"," command Command to run\n":" command La commande \u00e0 ex\u00e9cuter\n","Available commands:\n":"Commandes disponibles:\n","Only one command could be executed !":"Une seul commande peut-\u00eatre ex\u00e9cut\u00e9e !","Invalid parameter \"%s\".\nNote: Command's parameter\/argument must be place after the command.":"Param\u00e8tre \"%s\" invalid.\nNote : Les param\u00e8tres\/arguments de la requ\u00eate doivent \u00eatre plac\u00e9s apr\u00e8s celle-ci.","An exception occurred running command %s":"Une exception est survenue en ex\u00e9cutant la commande %s","The PHP XDEBUG extension is missing.":"L'extension PHP XDEBUG ne semble pas install\u00e9e.","Invalid profiler output directory \"%s\": not found":"Dossier de sortie du profiler invalid \"%s\" : introuvable","Invalid profiler output directory \"%s\": not writeable":"Dossier de sortie du profiler invalid \"%s\" : non-accessible en \u00e9criture","Invalid parameter \"%s\"":"Param\u00e8tre \"%s\" invalid","Invalid listen address specify. Must be in format host:port, host or :port.":"Address d'\u00e9coute sp\u00e9cifi\u00e9e invalid. Elle doit \u00eatre au format h\u00f4te:port (ou :port).","Invalid listen host specified. Must be an IPv4 or IPv6 address.":"H\u00f4te d'\u00e9coute sp\u00e9cifi\u00e9 invalid. Il doit s'agir d'une address IPv4 ou IPv6.","Invalid listen port specified. Must be a positive integer between 1 and 65535.":"Port d'\u00e9coute sp\u00e9cifi\u00e9 invalid. Il doit s'agir d'un entier positif entre 1 et 65535.","Please enter password:":"Merci de saisir le not de passe :","d":"j","h":"h","m":"m","s":"s","ms":"ms","ns":"ns","Less than 1%s":"Moins de 1%s","Hello world !":"Bonjour tout le monde !","Hello world!":"Salut tout le monde !","Disconnected":"D\u00e9connect\u00e9","You are now disconnected.":"Vous \u00eates maintenant d\u00e9connect\u00e9.","Extract messages that need to be translated":"Extraire les messages devant \u00eatre traduit","This command could be used to generate\/update locales\/messages.pot file.":"Cette commande peut-\u00eatre utilis\u00e9e pour g\u00e9n\u00e9rer\/mettre \u00e0 jour le fichier locales\/messages.pot.","Update messages in translation PO lang files":"Mettre \u00e0 jour les messages dans les fichiers de traduction PO existants","This command could be used to init\/update PO files in locales\/*\/LC_MESSAGES directories.":"Cette commande peut-\u00eatre utilis\u00e9e pour initialiser\/mettre \u00e0 jour les fichiers PO dans les dossiers locales\/*\/LC_MESSAGES.","Compile messages from existing translation PO lang files to corresponding MO files and JS catalogs":"Compiler les messages depuis les fichiers PO de traduction existants vers les fichiers MO et les catalogues JS correspondent","This command could be used to compile PO files in locales\/*\/LC_MESSAGES directories to MO files and as JS catalogs in locales directory.":"Cette commande peut-\u00eatre utilis\u00e9e pour compiler les fichiers PO dans les dossiers locales\/*\/LC_MESSAGES and les catalogues JS dans le dossier locales.","Initialize a new locale for translation.":"Initialiser un nouvelle locale pour traduction.","This command could be used to initialize a new locale for translation.":"Cette commande peut-\u00eatre utilis\u00e9e pour initialiser une nouvelle locale pour traduction.","You must provide the locale to initialize as unique and first argument.":"Vous devez fournir la locale \u00e0 initialiser comme unique et premier argument.","Invalid locale %s.":"Locale \"%s\" invalid.","Fail to list valid locales.":"Une erreur est survenue en listant les locales valides.","Locale %s directory created (%s).":"Dossier de la locale %s cr\u00e9\u00e9 (%s).","Fail to create locale %s directory (%s).":"Une erreur est survenue en cr\u00e9ant le dossier de la locale %s (%s).","Locale %s directory already exist (%s).":"Le dossier de la locale %s existe d\u00e9j\u00e0 (%s).","Locale %s LC_MESSAGES directory created (%s).":"Dossier LC_MESSAGES de la locale %s cr\u00e9\u00e9 (%s).","Fail to create locale %s LC_MESSAGES directory (%s).":"Une erreur est survenue en cr\u00e9ant le dossier LC_MESSAGE de la locale %s (%s).","Locale %s LC_MESSAGES directory already exist (%s).":"Le dossier LC_MESSAGES de la locale %s existe d\u00e9j\u00e0 (%s).","Locale %s PO file created (%s).":"Fichier PO de la locale %s cr\u00e9\u00e9 (%s).","Locale %s PO file already exist (%s).":"Le fichier PO de la locale %s existe d\u00e9j\u00e0 (%s).","Fail to list EesyPHP PHP files.":"Une erreur est survenue en listant les fichiers PHP d'EesyPHP.","Fail to extract messages from EesyPHP PHP files using xgettext.":"Une erreur est survenue en extrayant les messages depuis les fichiers PHP d'EesyPHP en utilisant xgettext.","Fail to list application PHP files.":"Une erreur est survenue en listant les fichiers PHP de l'application.","Fail to extract messages from PHP files using xgettext.":"Impossible d'extraire les messages depuis les fichiers PHP en utilisant xgettext.","Fail to list JS files in the directory of static files '%s'.":"Une erreur est survenue en listant les fichiers JS dans le dossier des fichiers statiques '%s'.","Fail to extract messages from JS files in the directory of static files '%s' using xgettext.":"Une erreur est survenue en extrayant les messages depuis les fichiers JS du dossier des fichiers statiques '%s' en utilisant xgettext.","Fail to list templates files in directory %s.":"Une erreur est survenue en listant les fichiers dans le dossier %s.","Fail to extract messages from templates directory '%s' using tsmarty2c.php script.":"Impossible d'extraire les messages depuis le dossier de templates '%s' en utilisant le script tsmarty2c.php.","Fail to merge messages using msgcat.":"Impossible de fusionner les messages en utilisant msgcat.","Compendium file %s not found.":"Fichier compendium %s introuvable.","POT file not found (%s). Please run extract_messages first.":"Fichier POT introuvable (%s). Merci de lancer la commande extract_messages pour commencer.","Lang directory '%s' found":"Dossier de langue '%s' trouv\u00e9","LC_MESSAGES directory not found in lang '%s' directory, ignore it.":"Le dossier LC_MESSAGES est introuvable dans le dossier de langue '%s', on l'ignore.","Fail to init messages in %s PO file using msginit (%s).":"Impossible d'initialiser les messages dans le fichier PO %s en utilisant msginit (%s).","Fail to update messages in %s PO file using msgmerge (%s).":"Impossible de mettre \u00e0 jour les messages dans les fichiers PO %s en utilisant msgmerge (%s).","PO file not found in lang '%s' directory, ignore it.":"Le fichier PO est introuvable dans le dossier de langue '%s', on l'ignore.","Fail to open root lang directory (%s).":"Impossible d'ouvrir le dossier racine des langues (%s).","Lang alias symlink found: %s -> %s":"Lien symbolique d'alias de langue trouv\u00e9 : %s -> %s","JS catalog symlink for %s -> %s created (%s)":"Lien symbolique de catalogue JS pour %s -> %s cr\u00e9\u00e9 (%s)","Fail to create JS catalog symlink for %s -> %s (%s)":"Impossible de cr\u00e9er le lien symbolique de catalogue JS pour %s -> %s (%s)","JS catalog symlink for %s -> %s already exist (%s)":"Le lien symbolique du catalogue JS pour %s -> %s existe d\u00e9j\u00e0 (%s)","JS catalog file for %s already exist, but it's not a symlink to %s (%s)":"Le catalogue JS pour %s existe, mais il ne s'agit par d'un lien symbolique vers %s (%s)","Fail to compile messages from %s PO file as MO file using msgfmt (%s).":"Impossible de compiler les messages depuis le fichier PO %s en tant que fichier MO en utilisant msgfmt (%s).","Include core translated messages from %s PO file":"Inclusion des messages traduits (core) depuis le fichier PO %s","Core PO file %s not found: can not include its translated messages in resulting JSON catalog.":"Le fichier PO core %s est introuvable : impossible d'inclure ses messages traduits dans le catalogue JSON r\u00e9sultant.","Fail to open %s JS catalog file in write mode (%s).":"Impossible d'ouvrir le catalogue JS %s en mode \u00e9criture (%s).","Fail to write %s JS catalog in file (%s).":"Impossible d'\u00e9crire le fichier du catalogue JS %s (%s).","%s JS catalog writed (%s).":"Catalogue JS %s cr\u00e9\u00e9 (%s).","<\/hr>

Mail initially intended for %s.<\/small><\/p>":"<\/hr>

Email initialement destin\u00e9 \u00e0 %s.<\/small><\/p>","\n\n\nMail initially intended for %s.":"\n\n\nMail originalement destin\u00e9 \u00e0 %s.","

%s: %s<\/small><\/p>":"

%s: %s<\/small><\/p>","\n%s: %s":"\n%s: %s","Username":"Nom d'utilisateur","Password":"Not de passe","Remember username":"M\u00e9moriser nom d'utilisateur","Submit":"Envoyer","Oops...":"Oups...","A fatal error has occurred and it is preventing this application from working properly. Please try again later or contact support.":"Une erreur fatale est survenue et celle-ci emp\u00eache cette application de fonctionner correctement. Merci de r\u00e9essayer ult\u00e9rieurement ou de prendre contact avec le service support.","Error: %1":"Erreur : %1","Back":"Retour","Details: %1":"D\u00e9tails : %1","Sign out":"D\u00e9connexion","Log in":"Connection","Loading time:":"Temps de chargement :","Page: %1":"Page : %1","Database: %1":"Base de donn\u00e9es : %1","Templating: ":"Mod\u00e8le : ","Total: ":"Total : ","Hello, world!":"Bonjour tout le monde !","This is the default page of a new app using EesyPHP framework. Register your own templates directory and create a homepage.tpl<\/em> file to overwrite it. You could also overwrite the URL handler for the root of the web application.":"Il s'agit de la page par d\u00e9faut d'une nouvelle application utilisant le framework EesyPHP. Configurez votre propre dossier de templates et cr\u00e9er le fichier homepage.tpl<\/em> pour l'\u00e9craser. Vous pouvez \u00e9galement \u00e9craser le gestionnaire de l'URL racine de l'application web.","Can't invoke bash. Can't ask password prompt.":"Impossible d'utiliser bash. Impossible de demander \u00e0 l'utilisateur de saisir un not de passe.","Confirmation":"Confirmation","Do you confirm?":"Confirmez-vous ?","Cancel":"Annuler","Validate":"Valider","OK":"OK","Question":"Question","Please enter your answer below:":"Merci de saisir vos r\u00e9ponses ci-dessous :","Please wait":"Merci de patienter","Please wait while your request is being processed.":"Merci de patienter pendant le traitement de votre requ\u00eate.","Are you sure?":"\u00cates-vous sure ?","This command could be used to start the PHP built-in HTTP server to serve the application.":"Cette commande peut-\u00eatre utilis\u00e9e pour d\u00e9marrer le service HTTP int\u00e9gr\u00e9 \u00e0 PHP pour servir l'application.","This command only accept one argument: the listen address in format \"host:port\" or \":port\" (= 0.0.0.0:port).":"Cette commande n'accepte qu'un seul param\u00e8tre : l'adresse d'\u00e9coute au format \"h\u00f4te:port\" ou \":port\" (= 0.0.0.0:port).","Logout":"D\u00e9connexion","Connection":"Connection","Authentication required but force_authentication function is not defined.":"Authentication requise mais la function force_authentication n'est pas d\u00e9finie."},"locale":"fr_FR.UTF8","domain":"EESYPHP","plural_expr":"(n > 1)"}; \ No newline at end of file +translations_data = {"messages":{"No template specified.":"Aucun template sp\u00e9cifi\u00e9.","An error occurred while displaying this page.":"Une erreur est survenue en affichant cette page.","Unexpected error occurred. If problem persist, please contact support.":"Une erreur inconnue est survenue. Si le probl\u00e8me persiste, merci de prendre contact avec le support.","Unknown":"Inconnu","Unable to connect to the database.":"Impossible de se connecter \u00e0 la base de donn\u00e9es.","Failed to list users from database.":"Une erreur est survenue en listant les utilisateurs dans la base de donn\u00e9es.","No user found.":"Aucun utilisateur.","Username":"Nom d'utilisateur","%d users(s)":"%d utilisateur(s)","Username is missing":"Nom d'utilisateur manquant","Unknown subcommand %s":"Sous-commande %s inconnue","Invalid username or password.":"Nom d'utilisateur ou not de passe invalid.","Sign in":"Connection","Authentication required":"Authentication requise","Access denied":"Acc\u00e8s interdit","You must login to access this page.":"Vous devez vous connecter pour acc\u00e9der \u00e0 cette page.","Configuration error in CAS auth backend.":"Erreur de configuration dans le backend d'authentification CAS.","Bad request":"Mauvaise requ\u00eate","Invalid request.":"Requ\u00eate invalid.","You have to be authenticated to access to this page.":"Vous devez \u00eatre authentifi\u00e9 pour acc\u00e9der \u00e0 cette page.","You do not have access to this application. If you think this is an error, please contact support.":"Vous n'avez pas acc\u00e8s \u00e0 cette application. Si vous pensez qu'il s'agit d'une erreur, merci de prendre contact avec le support.","Whoops ! Page not found":"Oups ! Page introuvable","The requested page can not be found.":"La page demand\u00e9e est introuvable.","Error":"Erreur","An unknown error occurred. If problem persist, please contact support.":"Une erreur inconnue est survenue. Si le probl\u00e8me persiste, merci de prendre contact avec le support.","Unable to determine the requested page. If the problem persists, please contact support.":"Impossible de d\u00e9terminer la page demand\u00e9e. Si le probl\u00e8me persiste, merci de prendre contact avec le support.","Unable to determine the requested page (loop detected). If the problem persists, please contact support.":"Impossible de d\u00e9terminer la page demand\u00e9e (boucle d\u00e9tect\u00e9e). Si le probl\u00e8me persiste, merci de prendre contact avec le support.","This request cannot be processed.":"Cette requ\u00eate ne peut \u00eatre trait\u00e9e.","Authentication required but fail to authenticate you.":"Authentication requise mais impossible pour vous authentifier.","This request could not be processed correctly.":"Cette requ\u00eate n'a put \u00eatre trait\u00e9e correctement.","You do not have access to this application.":"Vous n'avez pas acc\u00e8s \u00e0 cette application.","Details:":"D\u00e9tails :","Create a new project using EesyPHP framework":"Cr\u00e9er un nouveau project utilisant le framework EesyPHP","This command could be used to easily build the structure of a new project using the EesyPHP framework.":"Cette commande peut-\u00eatre utilis\u00e9e pour construire facilement la structure d'un nouveau project utilisant le framework EesyPHP.","Start the PHP built-in HTTP server to serve the application":"D\u00e9marrer le service HTTP int\u00e9gr\u00e9 \u00e0 PHP pour servir l'application","This command could be used to start the PHP built-in HTTP server to serve\nthe application.\n\nAdditional parameters:\n -p\/--public-url Define the public URL (default: based on listen address)\n -P\/--enable-profiler Enable Xdebug profiler\n -O\/--profiler-output [path] Xdebug profiler output directory path":"Cette commande peut-\u00eatre utilis\u00e9e pour d\u00e9marre le serveur HTTP int\u00e9gr\u00e9\n\u00e0 PHP pour servir l'application.\n\nParam\u00e8tres additionnels :\n -p\/--public-url D\u00e9finir l'URL publique (par d\u00e9faut:\n d\u00e9finie \u00e0 partir de l'adresse d'\u00e9coute)\n -P\/--enable-profiler Activer le profilter Xdebug\n -O\/--profiler-output [path] Chemin du dossier de sortie du profiler\n Xdebug","The CLI command '%s' already exists.":"La commande CLI '%s' n'existe pas.","The CLI command '%s' handler is not callable !":"La function impl\u00e9mentant la commande CLI '%s' n'est pas ex\u00e9cutable !","Usage: %s [-h] [-qd] command\n":"Utilisation: %s [-h] [-qd] commande\n"," -h Show this message\n":" -h Affiche ce message\n"," -q \/ -d Quiet\/Debug mode\n":" -q \/ -d Mode silencieux\/debug\n"," --trace Trace mode (the most verbose)\n":" --trace Mode trace (le plus verbeux)\n"," -l \/ --log-file Overwrite log file specified in configuration\n":" -l \/ --log-file Red\u00e9finir le fichier de journalisation \u00e0 utiliser \u00e0 la place de celui d\u00e9fini dans la configuration\n"," -C \/ --console Enable log on console\n":" -C \/ --console Activer la journalisation dans la console\n"," command Command to run\n":" command La commande \u00e0 ex\u00e9cuter\n","Available commands:\n":"Commandes disponibles:\n","Only one command could be executed !":"Une seul commande peut-\u00eatre ex\u00e9cut\u00e9e !","Invalid parameter \"%s\".\nNote: Command's parameter\/argument must be place after the command.":"Param\u00e8tre \"%s\" invalid.\nNote : Les param\u00e8tres\/arguments de la requ\u00eate doivent \u00eatre plac\u00e9s apr\u00e8s celle-ci.","An exception occurred running command %s":"Une exception est survenue en ex\u00e9cutant la commande %s","The PHP XDEBUG extension is missing.":"L'extension PHP XDEBUG ne semble pas install\u00e9e.","Invalid profiler output directory \"%s\": not found":"Dossier de sortie du profiler invalid \"%s\" : introuvable","Invalid profiler output directory \"%s\": not writeable":"Dossier de sortie du profiler invalid \"%s\" : non-accessible en \u00e9criture","Invalid parameter \"%s\"":"Param\u00e8tre \"%s\" invalid","Invalid listen address specify. Must be in format host:port, host or :port.":"Address d'\u00e9coute sp\u00e9cifi\u00e9e invalid. Elle doit \u00eatre au format h\u00f4te:port (ou :port).","Invalid listen host specified. Must be an IPv4 or IPv6 address.":"H\u00f4te d'\u00e9coute sp\u00e9cifi\u00e9 invalid. Il doit s'agir d'une address IPv4 ou IPv6.","Invalid listen port specified. Must be a positive integer between 1 and 65535.":"Port d'\u00e9coute sp\u00e9cifi\u00e9 invalid. Il doit s'agir d'un entier positif entre 1 et 65535.","Please enter password:":"Merci de saisir le not de passe :","d":"j","h":"h","m":"m","s":"s","ms":"ms","ns":"ns","Less than 1%s":"Moins de 1%s","Hello world !":"Bonjour tout le monde !","Hello world!":"Salut tout le monde !","Disconnected":"D\u00e9connect\u00e9","You are now disconnected.":"Vous \u00eates maintenant d\u00e9connect\u00e9.","Extract messages that need to be translated":"Extraire les messages devant \u00eatre traduit","This command could be used to generate\/update locales\/messages.pot file.":"Cette commande peut-\u00eatre utilis\u00e9e pour g\u00e9n\u00e9rer\/mettre \u00e0 jour le fichier locales\/messages.pot.","Update messages in translation PO lang files":"Mettre \u00e0 jour les messages dans les fichiers de traduction PO existants","This command could be used to init\/update PO files in locales\/*\/LC_MESSAGES directories.":"Cette commande peut-\u00eatre utilis\u00e9e pour initialiser\/mettre \u00e0 jour les fichiers PO dans les dossiers locales\/*\/LC_MESSAGES.","Compile messages from existing translation PO lang files to corresponding MO files and JS catalogs":"Compiler les messages depuis les fichiers PO de traduction existants vers les fichiers MO et les catalogues JS correspondent","This command could be used to compile PO files in locales\/*\/LC_MESSAGES directories to MO files and as JS catalogs in locales directory.":"Cette commande peut-\u00eatre utilis\u00e9e pour compiler les fichiers PO dans les dossiers locales\/*\/LC_MESSAGES and les catalogues JS dans le dossier locales.","Initialize a new locale for translation.":"Initialiser un nouvelle locale pour traduction.","This command could be used to initialize a new locale for translation.":"Cette commande peut-\u00eatre utilis\u00e9e pour initialiser une nouvelle locale pour traduction.","You must provide the locale to initialize as unique and first argument.":"Vous devez fournir la locale \u00e0 initialiser comme unique et premier argument.","Invalid locale %s.":"Locale \"%s\" invalid.","Fail to list valid locales.":"Une erreur est survenue en listant les locales valides.","Locale %s directory created (%s).":"Dossier de la locale %s cr\u00e9\u00e9 (%s).","Fail to create locale %s directory (%s).":"Une erreur est survenue en cr\u00e9ant le dossier de la locale %s (%s).","Locale %s directory already exist (%s).":"Le dossier de la locale %s existe d\u00e9j\u00e0 (%s).","Locale %s LC_MESSAGES directory created (%s).":"Dossier LC_MESSAGES de la locale %s cr\u00e9\u00e9 (%s).","Fail to create locale %s LC_MESSAGES directory (%s).":"Une erreur est survenue en cr\u00e9ant le dossier LC_MESSAGE de la locale %s (%s).","Locale %s LC_MESSAGES directory already exist (%s).":"Le dossier LC_MESSAGES de la locale %s existe d\u00e9j\u00e0 (%s).","Locale %s PO file created (%s).":"Fichier PO de la locale %s cr\u00e9\u00e9 (%s).","Locale %s PO file already exist (%s).":"Le fichier PO de la locale %s existe d\u00e9j\u00e0 (%s).","Fail to list EesyPHP PHP files.":"Une erreur est survenue en listant les fichiers PHP d'EesyPHP.","Fail to extract messages from EesyPHP PHP files using xgettext.":"Une erreur est survenue en extrayant les messages depuis les fichiers PHP d'EesyPHP en utilisant xgettext.","Fail to list application PHP files.":"Une erreur est survenue en listant les fichiers PHP de l'application.","Fail to extract messages from PHP files using xgettext.":"Impossible d'extraire les messages depuis les fichiers PHP en utilisant xgettext.","Fail to list JS files in the directory of static files '%s'.":"Une erreur est survenue en listant les fichiers JS dans le dossier des fichiers statiques '%s'.","Fail to extract messages from JS files in the directory of static files '%s' using xgettext.":"Une erreur est survenue en extrayant les messages depuis les fichiers JS du dossier des fichiers statiques '%s' en utilisant xgettext.","Fail to list templates files in directory %s.":"Une erreur est survenue en listant les fichiers dans le dossier %s.","Fail to extract messages from templates directory '%s' using tsmarty2c.php script.":"Impossible d'extraire les messages depuis le dossier de templates '%s' en utilisant le script tsmarty2c.php.","Fail to merge messages using msgcat.":"Impossible de fusionner les messages en utilisant msgcat.","Compendium file %s not found.":"Fichier compendium %s introuvable.","POT file not found (%s). Please run extract_messages first.":"Fichier POT introuvable (%s). Merci de lancer la commande extract_messages pour commencer.","Lang directory '%s' found":"Dossier de langue '%s' trouv\u00e9","LC_MESSAGES directory not found in lang '%s' directory, ignore it.":"Le dossier LC_MESSAGES est introuvable dans le dossier de langue '%s', on l'ignore.","Fail to init messages in %s PO file using msginit (%s).":"Impossible d'initialiser les messages dans le fichier PO %s en utilisant msginit (%s).","Fail to update messages in %s PO file using msgmerge (%s).":"Impossible de mettre \u00e0 jour les messages dans les fichiers PO %s en utilisant msgmerge (%s).","PO file not found in lang '%s' directory, ignore it.":"Le fichier PO est introuvable dans le dossier de langue '%s', on l'ignore.","Fail to open root lang directory (%s).":"Impossible d'ouvrir le dossier racine des langues (%s).","Lang alias symlink found: %s -> %s":"Lien symbolique d'alias de langue trouv\u00e9 : %s -> %s","JS catalog symlink for %s -> %s created (%s)":"Lien symbolique de catalogue JS pour %s -> %s cr\u00e9\u00e9 (%s)","Fail to create JS catalog symlink for %s -> %s (%s)":"Impossible de cr\u00e9er le lien symbolique de catalogue JS pour %s -> %s (%s)","JS catalog symlink for %s -> %s already exist (%s)":"Le lien symbolique du catalogue JS pour %s -> %s existe d\u00e9j\u00e0 (%s)","JS catalog file for %s already exist, but it's not a symlink to %s (%s)":"Le catalogue JS pour %s existe, mais il ne s'agit par d'un lien symbolique vers %s (%s)","Fail to compile messages from %s PO file as MO file using msgfmt (%s).":"Impossible de compiler les messages depuis le fichier PO %s en tant que fichier MO en utilisant msgfmt (%s).","Include core translated messages from %s PO file":"Inclusion des messages traduits (core) depuis le fichier PO %s","Core PO file %s not found: can not include its translated messages in resulting JSON catalog.":"Le fichier PO core %s est introuvable : impossible d'inclure ses messages traduits dans le catalogue JSON r\u00e9sultant.","Fail to open %s JS catalog file in write mode (%s).":"Impossible d'ouvrir le catalogue JS %s en mode \u00e9criture (%s).","Fail to write %s JS catalog in file (%s).":"Impossible d'\u00e9crire le fichier du catalogue JS %s (%s).","%s JS catalog writed (%s).":"Catalogue JS %s cr\u00e9\u00e9 (%s).","<\/hr>

Mail initially intended for %s.<\/small><\/p>":"<\/hr>

Email initialement destin\u00e9 \u00e0 %s.<\/small><\/p>","\n\n\nMail initially intended for %s.":"\n\n\nMail originalement destin\u00e9 \u00e0 %s.","

%s: %s<\/small><\/p>":"

%s: %s<\/small><\/p>","\n%s: %s":"\n%s: %s","Password":"Not de passe","Remember username":"M\u00e9moriser nom d'utilisateur","Submit":"Envoyer","Oops...":"Oups...","A fatal error has occurred and it is preventing this application from working properly. Please try again later or contact support.":"Une erreur fatale est survenue et celle-ci emp\u00eache cette application de fonctionner correctement. Merci de r\u00e9essayer ult\u00e9rieurement ou de prendre contact avec le service support.","Error: %1":"Erreur : %1","Back":"Retour","Details: %1":"D\u00e9tails : %1","Sign out":"D\u00e9connexion","Log in":"Connection","Loading time:":"Temps de chargement :","Page: %1":"Page : %1","Database: %1":"Base de donn\u00e9es : %1","Templating: ":"Mod\u00e8le : ","Total: ":"Total : ","Hello, world!":"Bonjour tout le monde !","This is the default page of a new app using EesyPHP framework. Register your own templates directory and create a homepage.tpl<\/em> file to overwrite it. You could also overwrite the URL handler for the root of the web application.":"Il s'agit de la page par d\u00e9faut d'une nouvelle application utilisant le framework EesyPHP. Configurez votre propre dossier de templates et cr\u00e9er le fichier homepage.tpl<\/em> pour l'\u00e9craser. Vous pouvez \u00e9galement \u00e9craser le gestionnaire de l'URL racine de l'application web.","Can't invoke bash. Can't ask password prompt.":"Impossible d'utiliser bash. Impossible de demander \u00e0 l'utilisateur de saisir un not de passe.","Confirmation":"Confirmation","Do you confirm?":"Confirmez-vous ?","Cancel":"Annuler","Validate":"Valider","OK":"OK","Question":"Question","Please enter your answer below:":"Merci de saisir vos r\u00e9ponses ci-dessous :","Please wait":"Merci de patienter","Please wait while your request is being processed.":"Merci de patienter pendant le traitement de votre requ\u00eate.","Are you sure?":"\u00cates-vous sure ?","This command could be used to start the PHP built-in HTTP server to serve the application.":"Cette commande peut-\u00eatre utilis\u00e9e pour d\u00e9marrer le service HTTP int\u00e9gr\u00e9 \u00e0 PHP pour servir l'application.","This command only accept one argument: the listen address in format \"host:port\" or \":port\" (= 0.0.0.0:port).":"Cette commande n'accepte qu'un seul param\u00e8tre : l'adresse d'\u00e9coute au format \"h\u00f4te:port\" ou \":port\" (= 0.0.0.0:port).","Logout":"D\u00e9connexion","Connection":"Connection","Authentication required but force_authentication function is not defined.":"Authentication requise mais la function force_authentication n'est pas d\u00e9finie."},"locale":"fr_FR.UTF8","domain":"EESYPHP","plural_expr":"(n > 1)"}; \ No newline at end of file diff --git a/locales/fr_FR.UTF8/LC_MESSAGES/EESYPHP.mo b/locales/fr_FR.UTF8/LC_MESSAGES/EESYPHP.mo index d75095a..1ece122 100644 Binary files a/locales/fr_FR.UTF8/LC_MESSAGES/EESYPHP.mo and b/locales/fr_FR.UTF8/LC_MESSAGES/EESYPHP.mo differ diff --git a/locales/fr_FR.UTF8/LC_MESSAGES/EESYPHP.po b/locales/fr_FR.UTF8/LC_MESSAGES/EESYPHP.po index 331d086..eda565c 100644 --- a/locales/fr_FR.UTF8/LC_MESSAGES/EESYPHP.po +++ b/locales/fr_FR.UTF8/LC_MESSAGES/EESYPHP.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"POT-Creation-Date: 2024-02-21 09:12+0000\n" +"POT-Creation-Date: 2024-09-17 07:17+0000\n" "PO-Revision-Date: \n" "Last-Translator: Benjamin Renard \n" "Language-Team: \n" @@ -34,6 +34,33 @@ msgstr "Inconnu" msgid "Unable to connect to the database." msgstr "Impossible de se connecter à la base de données." +#: Auth/Db.php:315 +msgid "Failed to list users from database." +msgstr "" +"Une erreur est survenue en listant les utilisateurs dans la base de données." + +#: Auth/Db.php:318 +msgid "No user found." +msgstr "Aucun utilisateur." + +#: Auth/Db.php:323 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: Auth/Db.php:334 +#, php-format +msgid "%d users(s)" +msgstr "%d utilisateur(s)" + +#: Auth/Db.php:361 Auth/Db.php:392 +msgid "Username is missing" +msgstr "Nom d'utilisateur manquant" + +#: Auth/Db.php:403 +#, php-format +msgid "Unknown subcommand %s" +msgstr "Sous-commande %s inconnue" + #: Auth/Form.php:51 msgid "Invalid username or password." msgstr "Nom d'utilisateur ou not de passe invalid." @@ -54,7 +81,7 @@ msgstr "Accès interdit" msgid "You must login to access this page." msgstr "Vous devez vous connecter pour accéder à cette page." -#: Auth/Casuser.php:88 Auth/Casuser.php:112 +#: Auth/Casuser.php:88 Auth/Casuser.php:121 msgid "Configuration error in CAS auth backend." msgstr "Erreur de configuration dans le backend d'authentification CAS." @@ -96,7 +123,7 @@ msgstr "" "Une erreur inconnue est survenue. Si le problème persiste, merci de prendre " "contact avec le support." -#: Url.php:263 +#: Url.php:271 msgid "" "Unable to determine the requested page. If the problem persists, please " "contact support." @@ -104,7 +131,7 @@ msgstr "" "Impossible de déterminer la page demandée. Si le problème persiste, merci de " "prendre contact avec le support." -#: Url.php:411 +#: Url.php:419 msgid "" "Unable to determine the requested page (loop detected). If the problem " "persists, please contact support." @@ -112,15 +139,15 @@ msgstr "" "Impossible de déterminer la page demandée (boucle détectée). Si le problème " "persiste, merci de prendre contact avec le support." -#: Url.php:440 +#: Url.php:448 msgid "This request cannot be processed." msgstr "Cette requête ne peut être traitée." -#: Url.php:450 +#: Url.php:458 msgid "Authentication required but fail to authenticate you." msgstr "Authentication requise mais impossible pour vous authentifier." -#: Url.php:469 +#: Url.php:479 msgid "This request could not be processed correctly." msgstr "Cette requête n'a put être traitée correctement." @@ -626,10 +653,6 @@ msgstr "" "\n" "%s: %s" -#: templates/login.tpl:19 templates/login.tpl:20 -msgid "Username" -msgstr "Nom d'utilisateur" - #: templates/login.tpl:24 templates/login.tpl:25 msgid "Password" msgstr "Not de passe" diff --git a/locales/messages.pot b/locales/messages.pot index 70aa565..f3d2fb0 100644 --- a/locales/messages.pot +++ b/locales/messages.pot @@ -1,7 +1,7 @@ msgid "" msgstr "" -"POT-Creation-Date: 2024-02-21 09:12+0000\n" -"PO-Revision-Date: 2024-02-21 09:12+0000\n" +"POT-Creation-Date: 2024-09-17 07:17+0000\n" +"PO-Revision-Date: 2024-09-17 07:17+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,6 +26,32 @@ msgstr "" msgid "Unable to connect to the database." msgstr "" +#: Auth/Db.php:315 +msgid "Failed to list users from database." +msgstr "" + +#: Auth/Db.php:318 +msgid "No user found." +msgstr "" + +#: Auth/Db.php:323 +msgid "Username" +msgstr "" + +#: Auth/Db.php:334 +#, php-format +msgid "%d users(s)" +msgstr "" + +#: Auth/Db.php:361 Auth/Db.php:392 +msgid "Username is missing" +msgstr "" + +#: Auth/Db.php:403 +#, php-format +msgid "Unknown subcommand %s" +msgstr "" + #: Auth/Form.php:51 msgid "Invalid username or password." msgstr "" @@ -46,7 +72,7 @@ msgstr "" msgid "You must login to access this page." msgstr "" -#: Auth/Casuser.php:88 Auth/Casuser.php:112 +#: Auth/Casuser.php:88 Auth/Casuser.php:121 msgid "Configuration error in CAS auth backend." msgstr "" @@ -84,27 +110,27 @@ msgstr "" msgid "An unknown error occurred. If problem persist, please contact support." msgstr "" -#: Url.php:263 +#: Url.php:271 msgid "" "Unable to determine the requested page. If the problem persists, please " "contact support." msgstr "" -#: Url.php:411 +#: Url.php:419 msgid "" "Unable to determine the requested page (loop detected). If the problem " "persists, please contact support." msgstr "" -#: Url.php:440 +#: Url.php:448 msgid "This request cannot be processed." msgstr "" -#: Url.php:450 +#: Url.php:458 msgid "Authentication required but fail to authenticate you." msgstr "" -#: Url.php:469 +#: Url.php:479 msgid "This request could not be processed correctly." msgstr "" @@ -543,10 +569,6 @@ msgid "" "%s: %s" msgstr "" -#: templates/login.tpl:19 templates/login.tpl:20 -msgid "Username" -msgstr "" - #: templates/login.tpl:24 templates/login.tpl:25 msgid "Password" msgstr "" diff --git a/src/Auth/Db.php b/src/Auth/Db.php index 840fc9c..a44ce53 100644 --- a/src/Auth/Db.php +++ b/src/Auth/Db.php @@ -4,8 +4,11 @@ namespace EesyPHP\Auth; use EesyPHP\App; use EesyPHP\Cli; +use EesyPHP\Hook; +use EesyPHP\I18n; use EesyPHP\Log; +use Console_Table; use Exception; use function EesyPHP\vardump; @@ -74,15 +77,16 @@ class Db extends Backend { if (App :: get('cli.enabled')) { Cli :: add_command( - 'add_user', - ['\\EesyPHP\\Auth\\Db', 'cli_add_user'], - 'Add user' - ); - Cli :: add_command( - 'edit_user', - ['\\EesyPHP\\Auth\\Db', 'cli_edit_user'], - 'Edit user', - '[username]' + 'user', + ['\\EesyPHP\\Auth\\Db', 'cli_user'], + 'Manage users', + "[list|add|edit|delete]", + [ + " list List existing users", + " add Add a user", + " edit [username] Edit a user", + " delete [username] Delete a user", + ] ); } return true; @@ -178,8 +182,10 @@ class Db extends Backend { if (isset($info[$field]) && $info[$field]) $values[$field] = $info[$field]; + Hook :: trigger("user_adding_in_db", $info); if (self :: $class :: insert(self :: $users_table, $values)) { - Log :: info('add_user(%s): user added', $values['username']); + Log :: info('add_user(%s): user added', $info['username']); + Hook :: trigger("user_added_in_db", $info); return true; } Log :: error('add_user(%s): error adding user', $values['username']); @@ -249,6 +255,10 @@ class Db extends Backend { } Log::debug("update_user(%s): changes=%s", $user->username, vardump($values)); + Hook :: trigger( + "user_updating_in_db", + ["user" => $user, "changes" => $changes, "raw_changes" => $values] + ); if ( self :: $class :: update( self :: $users_table, @@ -257,6 +267,10 @@ class Db extends Backend { ) ) { Log :: info('update_user(%s): user updated', $user->username); + Hook :: trigger( + "user_updated_in_db", + ["user" => $user, "changes" => $changes, "raw_changes" => $values] + ); return true; } Log :: error('update_user(%s): error adding user', $user->username); @@ -264,67 +278,135 @@ class Db extends Backend { } /** - * CLI command to add user - * @param array $command_args Command arguments - * @return bool + * Delete a user in database + * @param \EesyPHP\Auth\User $user The user object + * @return boolean True if user was deleted, false otherwise */ - public static function cli_add_user($command_args) { - $info = ['username' => null, 'password' => null]; - foreach($info as $field => $value) { - while(!$value) { - $value = Cli::ask_user("Please enter user $field: ", $field == 'password'); - if (empty($value)) - print("Invalid value\n"); - } - $info[$field] = $value; + public static function delete_user($user) { + if (!$user->username) { + Log::error("delete_user(): Invalid user provided (no username)"); + return false; } - foreach(self :: $exposed_fields as $field) { - $value = readline("Please enter user $field: "); - if (empty($value)) - continue; - $info[$field] = $value; - } - if (self :: add_user($info)) { - printf("User %s added\n", $info['username']); + Hook :: trigger("user_deleting_in_db", ["user" => $user]); + if ( + self :: $class :: delete( + self :: $users_table, + [self :: $username_field => $user->username] + ) + ) { + Log :: info('delete_user(%s): user updated', $user->username); + Hook :: trigger("user_deleted_in_db", ["user" => $user]); return true; } - Log :: fatal("Error occurred adding user %s", $info['username']); + Log :: error('delete_user(%s): error adding user', $user->username); + return false; } /** - * CLI command to edit an existing user + * CLI command to manage users * @param array $command_args Command arguments * @return bool */ - public static function cli_edit_user($command_args) { - if (count($command_args) != 1) - Cli :: usage(); - $username = $command_args[0]; - $user = self :: get_user($username); - if (!$user) Cli :: usage("Invalid user '$username'"); - $changes = [ - "username" => trim( - Cli::ask_user("Please enter user new username [$username]: ") - ), - "password" => Cli::ask_user("Please enter user new password [empty = unchange]: ", true), - ]; - if (!$changes["username"]) unset($changes["username"]); - if (!$changes["password"]) unset($changes["password"]); + public static function cli_user($command_args) { + if (!$command_args) Cli::usage(); + switch ($command_args[0]) { + case "list": + $users = self :: $class :: get_many( + self :: $users_table, + null, + array_merge([self :: $username_field], self :: $exposed_fields), + self :: $username_field + ); + if ($users === false) + Log :: fatal(I18n::_("Failed to list users from database.")); - foreach(self :: $exposed_fields as $field) { - $value = Cli::ask_user("Please enter user $field [{$user[$field]}]: "); - if (empty($value)) - continue; - $changes[$field] = $value; + if (!$users) { + print(I18n::_("No user found.")); + return true; + } + + $tbl = new Console_Table(); + $headers = [I18n::_("Username")]; + foreach(self :: $exposed_fields as $field) + $headers[] = mb_convert_case(str_replace("_", " ", $field), MB_CASE_TITLE); + $tbl->setHeaders($headers); + foreach($users as $user) { + $row = [$user[self::$username_field]]; + foreach(self :: $exposed_fields as $field) + $row[] = $user[$field]?strval($user[$field]):""; + $tbl->addRow($row); + } + echo $tbl->getTable(); + echo "\n".sprintf(_("%d users(s)"), count($users))."\n"; + return true; + + case "add": + $info = ['username' => null, 'password' => null]; + foreach($info as $field => $value) { + while(!$value) { + $value = Cli::ask_user("Please enter user $field: ", $field == 'password'); + if (empty($value)) + print("Invalid value\n"); + } + $info[$field] = $value; + } + foreach(self :: $exposed_fields as $field) { + $value = readline("Please enter user $field: "); + if (empty($value)) + continue; + $info[$field] = $value; + } + if (self :: add_user($info)) { + printf("User %s added\n", $info['username']); + return true; + } + Log :: fatal("Error occurred adding user %s", $info['username']); + + case "edit": + if (count($command_args) < 2) + Cli :: usage(I18n::_("Username is missing")); + $username = $command_args[1]; + $user = self :: get_user($username); + if (!$user) Cli :: usage("Invalid user '$username'"); + $changes = [ + "username" => trim( + Cli::ask_user("Please enter user new username [$username]: ") + ), + "password" => Cli::ask_user("Please enter user new password [empty = unchange]: ", true), + ]; + if (!$changes["username"]) unset($changes["username"]); + if (!$changes["password"]) unset($changes["password"]); + + foreach(self :: $exposed_fields as $field) { + $value = Cli::ask_user("Please enter user $field [{$user[$field]}]: "); + if (empty($value)) + continue; + $changes[$field] = $value; + } + if (!$changes) { + print("No change.\n"); + return true; + } + if (self :: update_user($user, $changes)) { + printf("User %s updated\n", $username); + return true; + } + Log :: fatal("Error occurred updating user %s", $username); + + case "delete": + if (count($command_args) < 2) + Cli :: usage(I18n::_("Username is missing")); + $username = $command_args[1]; + $user = self :: get_user($username); + if (!$user) Cli :: usage("Invalid user '$username'"); + if (self :: delete_user($user)) { + printf("User %s deleted\n", $username); + return true; + } + Log :: fatal("Error occurred deleting user %s", $username); + + default: + Cli::usage(I18n::_("Unknown subcommand %s"), $command_args[0]); } - if (!$changes) { - print("No change.\n"); - return true; - } - if (self :: update_user($user, $changes)) { - printf("User %s updated\n", $username); - return true; - } - Log :: fatal("Error occurred updating user %s", $username); } }