diff --git a/.codespell-exclusions b/.codespell-exclusions
new file mode 100644
index 0000000..fb7a64a
--- /dev/null
+++ b/.codespell-exclusions
@@ -0,0 +1,6 @@
+.git
+./static/lib
+./vendor
+./locales/*/LC_MESSAGES/*.po
+./locales/*.js
+./locales/*.pot
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index e3728d2..c33f6ee 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -2,6 +2,13 @@
# See https://pre-commit.com for more information
---
repos:
+ - repo: https://github.com/codespell-project/codespell
+ rev: v2.2.2
+ hooks:
+ - id: codespell
+ exclude: static/lib/|locales/.*\.js$|\.pot$
+ #args: ["--write-changes"]
+ exclude_types: [csv, json, pofile]
- repo: https://github.com/adrienverge/yamllint
rev: v1.32.0
hooks:
diff --git a/includes/core.php b/includes/core.php
index 6a53590..b8ebfef 100644
--- a/includes/core.php
+++ b/includes/core.php
@@ -20,7 +20,7 @@ else {
if (basename($script) == 'core.php')
break;
}
-if (!$script) die('Fail to detect root directory path');
+if (!$script) die('Failed to detect root directory path');
$root_dir_path = realpath(dirname($script).'/../');
// Include App's includes and vendor directories to PHP include paths
diff --git a/locales/fr_FR.UTF8.js b/locales/fr_FR.UTF8.js
new file mode 100644
index 0000000..663a5a8
--- /dev/null
+++ b/locales/fr_FR.UTF8.js
@@ -0,0 +1 @@
+translations_data = {"messages":{"Invalid username or password.":"Nom d'utilisateur ou not de passe invalid.","Invalid authentication token.":"Jeton d'authentification invalide.","Authentication token expired.":"Jeton d'authentification expir\u00e9.","Your account appears to have been deleted.":"Votre compte semble avoir \u00e9t\u00e9 supprim\u00e9.","Confirmation":"Confirmation","OK":"OK","Cancel":"Annuler","You have to enter the name of the suitcase!":"Vous devez saisir le nom de la valise !","A suitcase exist with this name exist in the trash.":"Une valise portant ce nom existe d\u00e9j\u00e0 dans la corbeille.","This suitcase already exist!":"Cette valise existe d\u00e9j\u00e0 !","You have to enter the new name of the suitcase!":"Vous devez saisir le nouveau nom de la valise !","A suitcase with this name already exist!":"Une valise portant ce nom existe d\u00e9j\u00e0 !","An error occurred renaming this suitcase.":"Une erreur est survenue en renommant cette valise.","You have to enter the new suitcase name.":"Vous devez saisir le nom de la nouvelle valise.","An error occurred copying the suitcase.":"Une erreur est survenue en copiant cette valise.","Reset the %s suitcase":"R\u00e9initialiser la valise %s","Are-you sure you want to reset the suitcase %s?":"\u00cates-vous s\u00fbre de vouloir r\u00e9initialiser la valise %s ?","Delete the %s suitcase":"Supprimer la valise %s","Are-you sure you want to delete the suitcase %s?":"\u00cates-vous s\u00fbre de vouloir supprimer la valise %s ?","Restaure the %s suitcase":"Restaurer la valise %s","Are-you sure you want to restaure the suitcase %s?":"\u00cates-vous s\u00fbre de vouloir restaurer la valise %s ?","You have to enter the category name!":"Vous devez saisir le nom de la cat\u00e9gorie !","A category with this name already exist in the trash!":"Une cat\u00e9gorie portant ce nom existe d\u00e9j\u00e0 dans la corbeille !","A category with this name already exist!":"Une cat\u00e9gorie portant ce nom existe d\u00e9j\u00e0 !","You have to enter the new name of the category!":"Vous devez saisir le nouveau nom de la cat\u00e9gorie !","A category with this name already!":"Une cat\u00e9gorie portant ce nom existe d\u00e9j\u00e0 !","Delete the category %s":"Supprimer la cat\u00e9gorie %s","Are-you sure you want to delete the category %s?":"\u00cates-vous s\u00fbre de vouloir supprimer la cat\u00e9gorie %s ?","Restore the category %s":"Restaurer la cat\u00e9gorie %s","Are-you sure you want to restore the category %s?":"\u00cates-vous s\u00fbre de vouloir restaurer la cat\u00e9gorie %s ?","Tow elements can't have the same name!":"Deux \u00e9l\u00e9ments ne peuvent pas porter le m\u00eame nom !","The element '%s' already exist!":"Un \u00e9l\u00e9ment portant le nom '%s' existe d\u00e9j\u00e0 !","You have to enter at least one element name!":"Vous devez saisir au moins un nom d'\u00e9l\u00e9ment !","Another?":"Un autre ?","Nb":"Nb","You have to enter the new element name!":"Vous devez saisir le nom du nouvel \u00e9l\u00e9ment !","An element with this name already exist in the trash!":"Un \u00e9l\u00e9ment portant ce nom existe d\u00e9j\u00e0 dans la corbeille !","An element with this name already exist!":"Un \u00e9l\u00e9ment portant ce nom existe d\u00e9j\u00e0 !","Delete the element %s":"Supprimer l'\u00e9l\u00e9ment %s","Are-you sure you want to delete the element %s?":"\u00cates-vous s\u00fbre de vouloir supprimer l'\u00e9l\u00e9ment %s ?","Restore the element %s":"Restaurer l'\u00e9l\u00e9ment %s","Are-you sure you want to restore the element %s?":"\u00cates-vous s\u00fbre de vouloir restaurer l'\u00e9l\u00e9ment %s ?","Add an element":"Ajouter un \u00e9l\u00e9ment","Trash":"Corbeille","The trash is empty.":"La corbeille est vide.","Your suitcases":"Vos valises","No suitcase in the trash.":"Aucune valise dans la corbeille.","Delete all local data":"Purger les donn\u00e9es locales","Are-you sure you want to delete all local data (irreversible action)?":"\u00cates-vous s\u00fbre de vouloir supprimer toutes les donn\u00e9es locales (action irr\u00e9versible) ?","Loading example data":"Charger les donn\u00e9es d'exemple","Are-you sure you want to load example data in place of your own local data (irreversible action)?":"\u00cates-vous s\u00fbre de vouloir charger les donn\u00e9es d'exemple \u00e0 la place de vos donn\u00e9es locales (action irr\u00e9versible) ?","Failed to decode JSON file.":"Impossible de d\u00e9coder le fichier JSON.","Import from file":"Import depuis un fichier","Are-you sure you want to overwrite your local data with the data from this file (irreversible action)?":"\u00cates-vous s\u00fbre de vouloir \u00e9craser vos donn\u00e9es locales par celles issues de ce fichier (action irr\u00e9versible) ?","The file has been imported successfully.":"Le fichier as bien \u00e9t\u00e9 import\u00e9.","An error occurred loading this file. Restoring previous data...":"Une erreur est survenue en chargeant ce fichier. Restauration des donn\u00e9es pr\u00e9c\u00e9dentes...","Previous data has been restored successfully.":"Les donn\u00e9es pr\u00e9c\u00e9dentes ont bien \u00e9t\u00e9 restaur\u00e9es.","An error occurred restoring previous data.":"Une erreur est survenue en restaurant les donn\u00e9es pr\u00e9c\u00e9dentes.","You have to enter your username and password!":"Vous devez saisir votre nom d'utilisateur et votre mot de passe !","Connected.":"Connect\u00e9.","An error occurred logging in. Please try again later.":"Une erreur est survenue durant la connexion. Merci de r\u00e9essayer ult\u00e9rieurement.","Logout":"D\u00e9connexion","Do you really want to log out?":"Voulez-vous vraiment vous d\u00e9connecter ?","Logged out":"D\u00e9connect\u00e9","An error occurred logging you out. Please try again later.":"Une erreur est survenue durant la d\u00e9connexion. Merci de r\u00e9essayer ult\u00e9rieurement.","Data synchronized.":"Donn\u00e9es synchronis\u00e9es.","An error occurred loading data from the server. Restoring previous data...":"Une erreur est survenue en chargeant les donn\u00e9es depuis le serveur. Restauration des donn\u00e9es pr\u00e9c\u00e9dentes...","An error occurred synchronizing your data. Please try again later.":"Une erreur est survenue durant la synchronisation de vos donn\u00e9es. Merci de r\u00e9essayer ult\u00e9rieurement.","Your session appears to have expired, please re-authenticate.":"Votre session semble avoir expir\u00e9e, merci de vous r\u00e9identifier.","You must sign in before you can sync your data.":"Vous devez vous connecter avant de synchroniser vos donn\u00e9es.","Synchronize your suitcases from server":"Synchronisation de vos valises avec les serveurs","Are-you sure you want to synchronize your suitcases from server?":"\u00cates-vous s\u00fbre de vouloir synchroniser vos valises avec le serveur ?","An example of a suitcase?":"Un exemple de valise ?","Would you like to load a sample suitcase to get started?":"Voulez-vous chargeant un exemple de valise pour commencer ?","Your internet browser does not support local data storage. Therefore, unfortunately you cannot use this application.":"Votre navigateur internet ne semble pas supporter le stockage de donn\u00e9es locales. Malheureusement, vous ne pouvez donc pas utiliser cette application.","Error loading local data":"Une erreur est survenue en chargeant les donn\u00e9es locales","An error occurred while loading local data. Should we purge it?":"Une erreur est survenue en chargeant vos donn\u00e9es locales. Devons-nous les purger ?","White paper":"Papier blanc","Pen":"Stylo","ID card\/passport":"Carte d'identit\u00e9 \/ passeport","Watch":"Montre","Watch charger":"Chargeur montre","Laptop":"PC portable","Laptop charger":"Chargeur PC portable","An error occurred while loading the %s suitcase from the cache.":"Une erreur est survenue en chargeant la valise %s depuis le cache.","An error occurred while loading the category list from the cache.":"Une erreur est survenue en chargeant la liste de cat\u00e9gories depuis le cache.","An error occurred while loading the %s category from the cache.":"Une erreur est survenue en chargeant la cat\u00e9gorie %s depuis le cache.","Error loading your login information. Please log in again.":"Erreur en chargeant vos donn\u00e9es d'authentification. Merci de vous r\u00e9identifier.","Helpdesk page":"Page d'assistance aux utilisateurs","Upon request, please download and forward the following information to the support service:":"\u00c0 leur demande, merci de t\u00e9l\u00e9charger et transmettre les informations ci-dessous au service support :","Download":"T\u00e9l\u00e9charger","Application URL:":"URL de l'application :","Current page URL:":"URL de la page courante :","Connected user:":"Utilisateur connect\u00e9 :","Extra user information:":"Informations suppl\u00e9mentaires de l'utilisateur :","Add a suitcase":"Ajouter une valise","Show trash":"Voir la corbeille","Suitcases list":"Liste des valises","Manage the suitcase":"G\u00e9rer les valises","Add a category":"Ajouter une cat\u00e9gorie","Rename the suitcase":"Renommer la valise","Copy the suitcase":"Copier la valise","Reset the suitcase":"R\u00e9initialiser la valise","Delete the suitcase":"Supprimer la valise","Show suitcase's trash":"Voir la corbeille de la valise","Manage data":"G\u00e9rer les donn\u00e9es","Backup your data":"Sauvegarder vos donn\u00e9es","Restaure your data":"Restaurer vos donn\u00e9es","Synchronize local data":"Synchroniser les donn\u00e9es locales","Purge local data":"Purger les donn\u00e9es locales","Load example data":"Charger les donn\u00e9es d'exemple","Login":"Connexion","Suitcase name":"Nom de la valise","Add":"Ajouter","Name of the new suitcase":"Nom de la nouvelle valise","Copy":"Copier","New suitcase name":"Nouveau nom de la valise","Rename":"Renommer","Category name":"Nom de la cat\u00e9gorie","Rename the category":"Renommer la cat\u00e9gorie","New category's name":"Nouveau nom de la cat\u00e9gorie","Element name":"Nom de l'\u00e9l\u00e9ment","Edit the element":"Modifier l'\u00e9l\u00e9ment","Modify":"Modifier","Loading...":"Chargement...","Connection":"Connection","Username":"Nom d'utilisateur","Password":"Not de passe","Connect":"Connexion","Welcome":"Bienvenu","
\n This application allows you to manage lists of things not to forget to pack in your\n suitcase before your departure:\n
\n
\n To get started, create a suitcase, add the categories of things you will need to\n pack, and add all these things to it;\n <\/li>\n
\n Before your departure, you can then gradually check off all the things you have\n already gathered and ensure you don't forget anything!\n <\/li>\n <\/ul>\n <\/p>\n
\n Note:<\/strong> This application has been designed to work completely locally.\n The data manipulated (your suitcases, etc.) is stored only in your internet browser.\n It is also possible to export\/import this information in JSON format. \n However, to facilitate the management of your suitcases from multiple devices, it's\n possible to synchronize this information on the server. For this, you need an account,\n and at this time, registrations are not open.\n <\/p>\n
\n If you have an account, you can log in by clicking the Login<\/em> button below.\n If not, click the Anonymous usage<\/em> button to start using the application.\n <\/p>":"
\n Cette application vous permet de g\u00e9rer des listes de choses \u00e0 ne pas oublier de glisser dans votre valise avant votre d\u00e9part :\n
\n
Pour commencer, cr\u00e9er une valise, ajouter les cat\u00e9gories de choses que vous aurez \u00e0 y glisser et ajouter y toutes ces choses.<\/li>\n
Avant votre d\u00e9part, vous pourrez alors cocher petit \u00e0 petit toutes les choses que vous aurez d\u00e9j\u00e0 r\u00e9unies et vous asurez de ne rien oublier !<\/li>\n <\/ul>\n<\/p>\n
\n Note :<\/strong> Cette application a \u00e9t\u00e9 con\u00e7ue pour pouvoir fonctionner compl\u00e8tement localement. Les donn\u00e9es manipul\u00e9es (vos valises, ...) sont stock\u00e9s\n uniquement dans votre navigateur internet. Il est par ailleurs possible d'exporter\/importer ces informations au format JSON. \n Cependant, pour faciliter la gestion de vos valises depuis plusieurs appareils, il est possible de synchroniser ces informations sur le serveur. Pour cela,\n il vous faut un compte et \u00e0 ce jour, les inscriptions ne sont pas ouvertes.\n<\/p>\n
\n Si vous disposez d'un compte, vous pouvez vous connecter en cliquant sur le bouton Connexion<\/em> ci-dessous.\n \u00c0 d\u00e9faut, cliquer sur le bouton Utilisation annonyme<\/em> pour commencer \u00e0 utiliser l'application.\n<\/p>","Anonymous usage":"Utilisation annonyme","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.","%d users(s)":"%d utilisateur(s)","Username is missing":"Nom d'utilisateur manquant","Unknown subcommand %s":"Sous-commande %s inconnue","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>
%s: %s<\/small><\/p>","\n%s: %s":"\n%s: %s","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.","Do you confirm?":"Confirmez-vous ?","Validate":"Valider","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).","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":"DEFAULT","plural_expr":"(n > 1)"};
\ No newline at end of file
diff --git a/locales/fr_FR.UTF8/LC_MESSAGES/DEFAULT.mo b/locales/fr_FR.UTF8/LC_MESSAGES/DEFAULT.mo
new file mode 100644
index 0000000..e6badc9
Binary files /dev/null and b/locales/fr_FR.UTF8/LC_MESSAGES/DEFAULT.mo differ
diff --git a/locales/fr_FR.UTF8/LC_MESSAGES/DEFAULT.po b/locales/fr_FR.UTF8/LC_MESSAGES/DEFAULT.po
new file mode 100644
index 0000000..c705167
--- /dev/null
+++ b/locales/fr_FR.UTF8/LC_MESSAGES/DEFAULT.po
@@ -0,0 +1,657 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2024-09-22 16:25+0000\n"
+"PO-Revision-Date: 2024-09-22 18:26+0200\n"
+"Last-Translator: Benjamin Renard \n"
+"Language-Team: \n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: src/Auth/API.php:49
+msgid "Invalid username or password."
+msgstr "Nom d'utilisateur ou mot de passe invalide."
+
+#: src/Auth/API.php:56
+msgid "Invalid authentication token."
+msgstr "Jeton d'authentification invalide."
+
+#: src/Auth/API.php:58
+msgid "Authentication token expired."
+msgstr "Jeton d'authentification expiré."
+
+#: src/Auth/API.php:65
+msgid "Your account appears to have been deleted."
+msgstr "Votre compte semble avoir été supprimé."
+
+#: static/main.js:27
+msgid "Confirmation"
+msgstr "Confirmation"
+
+#: static/main.js:29
+msgid "OK"
+msgstr "OK"
+
+#: static/main.js:31
+msgid "Cancel"
+msgstr "Annuler"
+
+#: static/main.js:86
+msgid "You have to enter the name of the suitcase!"
+msgstr "Vous devez saisir le nom de la valise !"
+
+#: static/main.js:96 static/main.js:143 static/main.js:200
+msgid "A suitcase exist with this name exist in the trash."
+msgstr "Une valise portant ce nom existe déjà dans la corbeille."
+
+#: static/main.js:101
+msgid "This suitcase already exist!"
+msgstr "Cette valise existe déjà !"
+
+#: static/main.js:135
+msgid "You have to enter the new name of the suitcase!"
+msgstr "Vous devez saisir le nouveau nom de la valise !"
+
+#: static/main.js:149 static/main.js:206
+msgid "A suitcase with this name already exist!"
+msgstr "Une valise portant ce nom existe déjà !"
+
+#: static/main.js:164
+msgid "An error occurred renaming this suitcase."
+msgstr "Une erreur est survenue en renommant cette valise."
+
+#: static/main.js:193
+msgid "You have to enter the new suitcase name."
+msgstr "Vous devez saisir le nom de la nouvelle valise."
+
+#: static/main.js:219
+msgid "An error occurred copying the suitcase."
+msgstr "Une erreur est survenue en copiant cette valise."
+
+#: static/main.js:240
+#, javascript-format
+msgid "Reset the %s suitcase"
+msgstr "Réinitialiser la valise %s"
+
+#: static/main.js:241
+#, javascript-format
+msgid "Are-you sure you want to reset the suitcase %s?"
+msgstr "Êtes-vous sûre de vouloir réinitialiser la valise %s ?"
+
+#: static/main.js:260
+#, javascript-format
+msgid "Delete the %s suitcase"
+msgstr "Supprimer la valise %s"
+
+#: static/main.js:261
+#, javascript-format
+msgid "Are-you sure you want to delete the suitcase %s?"
+msgstr "Êtes-vous sûre de vouloir supprimer la valise %s ?"
+
+#: static/main.js:278
+#, javascript-format
+msgid "Restaure the %s suitcase"
+msgstr "Restaurer la valise %s"
+
+#: static/main.js:279
+#, javascript-format
+msgid "Are-you sure you want to restaure the suitcase %s?"
+msgstr "Êtes-vous sûre de vouloir restaurer la valise %s ?"
+
+#: static/main.js:311
+msgid "You have to enter the category name!"
+msgstr "Vous devez saisir le nom de la catégorie !"
+
+#: static/main.js:320 static/main.js:378
+msgid "A category with this name already exist in the trash!"
+msgstr "Une catégorie portant ce nom existe déjà dans la corbeille !"
+
+#: static/main.js:326
+msgid "A category with this name already exist!"
+msgstr "Une catégorie portant ce nom existe déjà !"
+
+#: static/main.js:366
+msgid "You have to enter the new name of the category!"
+msgstr "Vous devez saisir le nouveau nom de la catégorie !"
+
+#: static/main.js:383
+msgid "A category with this name already!"
+msgstr "Une catégorie portant ce nom existe déjà !"
+
+#: static/main.js:414
+#, javascript-format
+msgid "Delete the category %s"
+msgstr "Supprimer la catégorie %s"
+
+#: static/main.js:415
+#, javascript-format
+msgid "Are-you sure you want to delete the category %s?"
+msgstr "Êtes-vous sûre de vouloir supprimer la catégorie %s ?"
+
+#: static/main.js:433
+#, javascript-format
+msgid "Restore the category %s"
+msgstr "Restaurer la catégorie %s"
+
+#: static/main.js:434
+#, javascript-format
+msgid "Are-you sure you want to restore the category %s?"
+msgstr "Êtes-vous sûre de vouloir restaurer la catégorie %s ?"
+
+#: static/main.js:497
+msgid "Tow elements can't have the same name!"
+msgstr "Deux éléments ne peuvent pas porter le même nom !"
+
+#: static/main.js:505
+#, javascript-format
+msgid "The element '%s' already exist!"
+msgstr "Un élément portant le nom '%s' existe déjà !"
+
+#: static/main.js:528
+msgid "You have to enter at least one element name!"
+msgstr "Vous devez saisir au moins un nom d'élément !"
+
+#: static/main.js:561
+msgid "Another?"
+msgstr "Un autre ?"
+
+#: static/main.js:566
+msgid "Nb"
+msgstr "Nb"
+
+#: static/main.js:593
+msgid "You have to enter the new element name!"
+msgstr "Vous devez saisir le nom du nouvel élément !"
+
+#: static/main.js:609
+msgid "An element with this name already exist in the trash!"
+msgstr "Un élément portant ce nom existe déjà dans la corbeille !"
+
+#: static/main.js:615
+msgid "An element with this name already exist!"
+msgstr "Un élément portant ce nom existe déjà !"
+
+#: static/main.js:659
+#, javascript-format
+msgid "Delete the element %s"
+msgstr "Supprimer l'élément %s"
+
+#: static/main.js:660
+#, javascript-format
+msgid "Are-you sure you want to delete the element %s?"
+msgstr "Êtes-vous sûre de vouloir supprimer l'élément %s ?"
+
+#: static/main.js:681
+#, javascript-format
+msgid "Restore the element %s"
+msgstr "Restaurer l'élément %s"
+
+#: static/main.js:682
+#, javascript-format
+msgid "Are-you sure you want to restore the element %s?"
+msgstr "Êtes-vous sûre de vouloir restaurer l'élément %s ?"
+
+#: static/main.js:785
+msgid "Add an element"
+msgstr "Ajouter un élément"
+
+#: static/main.js:823 static/main.js:963
+msgid "Trash"
+msgstr "Corbeille"
+
+#: static/main.js:836
+msgid "The trash is empty."
+msgstr "La corbeille est vide."
+
+#: static/main.js:924
+msgid "Your suitcases"
+msgstr "Vos valises"
+
+#: static/main.js:995
+msgid "No suitcase in the trash."
+msgstr "Aucune valise dans la corbeille."
+
+#: static/main.js:1050
+msgid "Delete all local data"
+msgstr "Purger les données locales"
+
+#: static/main.js:1051
+msgid "Are-you sure you want to delete all local data (irreversible action)?"
+msgstr ""
+"Êtes-vous sûre de vouloir supprimer toutes les données locales (action "
+"irréversible) ?"
+
+#: static/main.js:1068
+msgid "Loading example data"
+msgstr "Charger les données d'exemple"
+
+#: static/main.js:1070
+msgid ""
+"Are-you sure you want to load example data in place of your own local data "
+"(irreversible action)?"
+msgstr ""
+"Êtes-vous sûre de vouloir charger les données d'exemple à la place de vos "
+"données locales (action irréversible) ?"
+
+#: static/main.js:1120
+msgid "Failed to decode JSON file."
+msgstr "Impossible de décoder le fichier JSON."
+
+#: static/main.js:1125
+msgid "Import from file"
+msgstr "Import depuis un fichier"
+
+#: static/main.js:1127
+msgid ""
+"Are-you sure you want to overwrite your local data with the data from this "
+"file (irreversible action)?"
+msgstr ""
+"Êtes-vous sûre de vouloir écraser vos données locales par celles issues de "
+"ce fichier (action irréversible) ?"
+
+#: static/main.js:1134
+msgid "The file has been imported successfully."
+msgstr "Le fichier as bien été importé."
+
+#: static/main.js:1141
+msgid "An error occurred loading this file. Restoring previous data..."
+msgstr ""
+"Une erreur est survenue en chargeant ce fichier. Restauration des données "
+"précédentes..."
+
+#: static/main.js:1148 static/main.js:1315
+msgid "Previous data has been restored successfully."
+msgstr "Les données précédentes ont bien été restaurées."
+
+#: static/main.js:1154 static/main.js:1321
+msgid "An error occurred restoring previous data."
+msgstr "Une erreur est survenue en restaurant les données précédentes."
+
+#: static/main.js:1200
+msgid "You have to enter your username and password!"
+msgstr "Vous devez saisir votre nom d'utilisateur et votre mot de passe !"
+
+#: static/main.js:1218
+msgid "Connected."
+msgstr "Connecté."
+
+#: static/main.js:1226
+msgid "An error occurred logging in. Please try again later."
+msgstr ""
+"Une erreur est survenue durant la connexion. Merci de réessayer "
+"ultérieurement."
+
+#: static/main.js:1247
+msgid "Logout"
+msgstr "Déconnexion"
+
+#: static/main.js:1248
+msgid "Do you really want to log out?"
+msgstr "Voulez-vous vraiment vous déconnecter ?"
+
+#: static/main.js:1259
+msgid "Logged out"
+msgstr "Déconnecté"
+
+#: static/main.js:1262 static/main.js:1270
+msgid "An error occurred logging you out. Please try again later."
+msgstr ""
+"Une erreur est survenue durant la déconnexion. Merci de réessayer "
+"ultérieurement."
+
+#: static/main.js:1303
+msgid "Data synchronized."
+msgstr "Données synchronisées."
+
+#: static/main.js:1308
+msgid ""
+"An error occurred loading data from the server. Restoring previous data..."
+msgstr ""
+"Une erreur est survenue en chargeant les données depuis le serveur. "
+"Restauration des données précédentes..."
+
+#: static/main.js:1331 static/main.js:1353
+msgid "An error occurred synchronizing your data. Please try again later."
+msgstr ""
+"Une erreur est survenue durant la synchronisation de vos données. Merci de "
+"réessayer ultérieurement."
+
+#: static/main.js:1345
+msgid "Your session appears to have expired, please re-authenticate."
+msgstr "Votre session semble avoir expirée, merci de vous réidentifier."
+
+#: static/main.js:1372
+msgid "You must sign in before you can sync your data."
+msgstr "Vous devez vous connecter avant de synchroniser vos données."
+
+#: static/main.js:1386
+msgid "Synchronize your suitcases from server"
+msgstr "Synchronisation de vos valises avec les serveurs"
+
+#: static/main.js:1387
+msgid "Are-you sure you want to synchronize your suitcases from server?"
+msgstr "Êtes-vous sûre de vouloir synchroniser vos valises avec le serveur ?"
+
+#: static/main.js:1450
+msgid "An example of a suitcase?"
+msgstr "Un exemple de valise ?"
+
+#: static/main.js:1451
+msgid "Would you like to load a sample suitcase to get started?"
+msgstr "Voulez-vous chargeant un exemple de valise pour commencer ?"
+
+#: static/main.js:1468
+msgid ""
+"Your internet browser does not support local data storage. Therefore, "
+"unfortunately you cannot use this application."
+msgstr ""
+"Votre navigateur internet ne semble pas supporter le stockage de données "
+"locales. Malheureusement, vous ne pouvez donc pas utiliser cette application."
+
+#: static/main.js:1557
+msgid "Error loading local data"
+msgstr "Une erreur est survenue en chargeant les données locales"
+
+#: static/main.js:1558
+msgid "An error occurred while loading local data. Should we purge it?"
+msgstr ""
+"Une erreur est survenue en chargeant vos données locales. Devons-nous les "
+"purger ?"
+
+#: static/mysc_objects.js:10
+msgid "White paper"
+msgstr "Papier blanc"
+
+#: static/mysc_objects.js:11
+msgid "Pen"
+msgstr "Stylo"
+
+#: static/mysc_objects.js:12
+msgid "ID card/passport"
+msgstr "Carte d'identité / passeport"
+
+#: static/mysc_objects.js:18
+msgid "Watch"
+msgstr "Montre"
+
+#: static/mysc_objects.js:19
+msgid "Watch charger"
+msgstr "Chargeur montre"
+
+#: static/mysc_objects.js:20
+msgid "Laptop"
+msgstr "PC portable"
+
+#: static/mysc_objects.js:21
+msgid "Laptop charger"
+msgstr "Chargeur PC portable"
+
+#: static/mysc_objects.js:294
+#, javascript-format
+msgid "An error occurred while loading the %s suitcase from the cache."
+msgstr "Une erreur est survenue en chargeant la valise %s depuis le cache."
+
+#: static/mysc_objects.js:417
+msgid "An error occurred while loading the category list from the cache."
+msgstr ""
+"Une erreur est survenue en chargeant la liste de catégories depuis le cache."
+
+#: static/mysc_objects.js:565
+#, javascript-format
+msgid "An error occurred while loading the %s category from the cache."
+msgstr "Une erreur est survenue en chargeant la catégorie %s depuis le cache."
+
+#: static/mysc_objects.js:636
+msgid "Error loading your login information. Please log in again."
+msgstr ""
+"Erreur en chargeant vos données d'authentification. Merci de vous "
+"réidentifier."
+
+#: templates/support_info.tpl:4
+msgid "Helpdesk page"
+msgstr "Page d'assistance aux utilisateurs"
+
+#: templates/support_info.tpl:5
+msgid ""
+"Upon request, please download and forward the following information to the "
+"support service:"
+msgstr ""
+"À leur demande, merci de télécharger et transmettre les informations ci-"
+"dessous au service support :"
+
+#: templates/support_info.tpl:9
+msgid "Download"
+msgstr "Télécharger"
+
+#: templates/support_info_content.tpl:1
+msgid "Application URL:"
+msgstr "URL de l'application :"
+
+#: templates/support_info_content.tpl:2
+msgid "Current page URL:"
+msgstr "URL de la page courante :"
+
+#: templates/support_info_content.tpl:4
+msgid "Connected user:"
+msgstr "Utilisateur connecté :"
+
+#: templates/support_info_content.tpl:6
+msgid "Extra user information:"
+msgstr "Informations supplémentaires de l'utilisateur :"
+
+#: templates/index.tpl:39 templates/index.tpl:91
+msgid "Add a suitcase"
+msgstr "Ajouter une valise"
+
+#: templates/index.tpl:40
+msgid "Show trash"
+msgstr "Voir la corbeille"
+
+#: templates/index.tpl:41
+msgid "Suitcases list"
+msgstr "Liste des valises"
+
+#: templates/index.tpl:43
+msgid "Manage the suitcase"
+msgstr "Gérer les valises"
+
+#: templates/index.tpl:45 templates/index.tpl:157
+msgid "Add a category"
+msgstr "Ajouter une catégorie"
+
+#: templates/index.tpl:47 templates/index.tpl:135
+msgid "Rename the suitcase"
+msgstr "Renommer la valise"
+
+#: templates/index.tpl:48 templates/index.tpl:113
+msgid "Copy the suitcase"
+msgstr "Copier la valise"
+
+#: templates/index.tpl:49
+msgid "Reset the suitcase"
+msgstr "Réinitialiser la valise"
+
+#: templates/index.tpl:50
+msgid "Delete the suitcase"
+msgstr "Supprimer la valise"
+
+#: templates/index.tpl:52
+msgid "Show suitcase's trash"
+msgstr "Voir la corbeille de la valise"
+
+#: templates/index.tpl:56
+msgid "Manage data"
+msgstr "Gérer les données"
+
+#: templates/index.tpl:58
+msgid "Backup your data"
+msgstr "Sauvegarder vos données"
+
+#: templates/index.tpl:59
+msgid "Restaure your data"
+msgstr "Restaurer vos données"
+
+#: templates/index.tpl:61
+msgid "Synchronize local data"
+msgstr "Synchroniser les données locales"
+
+#: templates/index.tpl:63
+msgid "Purge local data"
+msgstr "Purger les données locales"
+
+#: templates/index.tpl:64
+msgid "Load example data"
+msgstr "Charger les données d'exemple"
+
+#: templates/index.tpl:74
+msgid "Login"
+msgstr "Connexion"
+
+#: templates/index.tpl:96
+msgid "Suitcase name"
+msgstr "Nom de la valise"
+
+#: templates/index.tpl:102 templates/index.tpl:168 templates/index.tpl:218
+msgid "Add"
+msgstr "Ajouter"
+
+#: templates/index.tpl:118
+msgid "Name of the new suitcase"
+msgstr "Nom de la nouvelle valise"
+
+#: templates/index.tpl:124
+msgid "Copy"
+msgstr "Copier"
+
+#: templates/index.tpl:140
+msgid "New suitcase name"
+msgstr "Nouveau nom de la valise"
+
+#: templates/index.tpl:146 templates/index.tpl:190
+msgid "Rename"
+msgstr "Renommer"
+
+#: templates/index.tpl:162
+msgid "Category name"
+msgstr "Nom de la catégorie"
+
+#: templates/index.tpl:179
+msgid "Rename the category"
+msgstr "Renommer la catégorie"
+
+#: templates/index.tpl:184
+msgid "New category's name"
+msgstr "Nouveau nom de la catégorie"
+
+#: templates/index.tpl:207 templates/index.tpl:234
+msgid "Element name"
+msgstr "Nom de l'élément"
+
+#: templates/index.tpl:229
+msgid "Edit the element"
+msgstr "Modifier l'élément"
+
+#: templates/index.tpl:241
+msgid "Modify"
+msgstr "Modifier"
+
+#: templates/index.tpl:252 templates/index.tpl:257
+msgid "Loading..."
+msgstr "Chargement..."
+
+#: templates/index.tpl:271
+msgid "Connection"
+msgstr "Connexion"
+
+#: templates/index.tpl:276
+msgid "Username"
+msgstr "Nom d'utilisateur"
+
+#: templates/index.tpl:277
+msgid "Password"
+msgstr "Mot de passe"
+
+#: templates/index.tpl:283 templates/index.tpl:326
+msgid "Connect"
+msgstr "Connexion"
+
+#: templates/index.tpl:295
+msgid "Welcome"
+msgstr "Bienvenu"
+
+#: templates/index.tpl:298
+msgid ""
+"
\n"
+" This application allows you to manage lists of things not to "
+"forget to pack in your\n"
+" suitcase before your departure:\n"
+"
\n"
+"
\n"
+" To get started, create a suitcase, add the categories of "
+"things you will need to\n"
+" pack, and add all these things to it;\n"
+"
\n"
+"
\n"
+" Before your departure, you can then gradually check off all "
+"the things you have\n"
+" already gathered and ensure you don't forget anything!\n"
+"
\n"
+"
\n"
+"
\n"
+"
\n"
+" Note: This application has been designed to work "
+"completely locally.\n"
+" The data manipulated (your suitcases, etc.) is stored only in your "
+"internet browser.\n"
+" It is also possible to export/import this information in JSON "
+"format. \n"
+" However, to facilitate the management of your suitcases from "
+"multiple devices, it's\n"
+" possible to synchronize this information on the server. For this, "
+"you need an account,\n"
+" and at this time, registrations are not open.\n"
+"
\n"
+"
\n"
+" If you have an account, you can log in by clicking the Login"
+"em> button below.\n"
+" If not, click the Anonymous usage button to start using "
+"the application.\n"
+"
"
+msgstr ""
+"
\n"
+" Cette application vous permet de gérer des listes de choses à ne pas "
+"oublier de glisser dans votre valise avant votre départ :\n"
+"
\n"
+"
Pour commencer, créer une valise, ajouter les catégories de choses "
+"que vous aurez à y glisser et ajouter y toutes ces choses.
\n"
+"
Avant votre départ, vous pourrez alors cocher petit à petit toutes "
+"les choses que vous aurez déjà réunies et vous asurez de ne rien oublier !"
+"li>\n"
+"
\n"
+"
\n"
+"
\n"
+" Note : Cette application a été conçue pour pouvoir "
+"fonctionner complètement localement. Les données manipulées (vos "
+"valises, ...) sont stockés\n"
+" uniquement dans votre navigateur internet. Il est par ailleurs possible "
+"d'exporter/importer ces informations au format JSON. \n"
+" Cependant, pour faciliter la gestion de vos valises depuis plusieurs "
+"appareils, il est possible de synchroniser ces informations sur le serveur. "
+"Pour cela,\n"
+" il vous faut un compte et à ce jour, les inscriptions ne sont pas "
+"ouvertes.\n"
+"
\n"
+"
\n"
+" Si vous disposez d'un compte, vous pouvez vous connecter en cliquant sur "
+"le bouton Connexion ci-dessous.\n"
+" À défaut, cliquer sur le bouton Utilisation annonyme pour "
+"commencer à utiliser l'application.\n"
+"
"
+
+#: templates/index.tpl:327
+msgid "Anonymous usage"
+msgstr "Utilisation annonyme"
diff --git a/locales/messages.pot b/locales/messages.pot
new file mode 100644
index 0000000..a4642d1
--- /dev/null
+++ b/locales/messages.pot
@@ -0,0 +1,597 @@
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2024-09-22 16:25+0000\n"
+"PO-Revision-Date: 2024-09-22 16:25+0000\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/Auth/API.php:49
+msgid "Invalid username or password."
+msgstr ""
+
+#: src/Auth/API.php:56
+msgid "Invalid authentication token."
+msgstr ""
+
+#: src/Auth/API.php:58
+msgid "Authentication token expired."
+msgstr ""
+
+#: src/Auth/API.php:65
+msgid "Your account appears to have been deleted."
+msgstr ""
+
+#: static/main.js:27
+msgid "Confirmation"
+msgstr ""
+
+#: static/main.js:29
+msgid "OK"
+msgstr ""
+
+#: static/main.js:31
+msgid "Cancel"
+msgstr ""
+
+#: static/main.js:86
+msgid "You have to enter the name of the suitcase!"
+msgstr ""
+
+#: static/main.js:96 static/main.js:143 static/main.js:200
+msgid "A suitcase exist with this name exist in the trash."
+msgstr ""
+
+#: static/main.js:101
+msgid "This suitcase already exist!"
+msgstr ""
+
+#: static/main.js:135
+msgid "You have to enter the new name of the suitcase!"
+msgstr ""
+
+#: static/main.js:149 static/main.js:206
+msgid "A suitcase with this name already exist!"
+msgstr ""
+
+#: static/main.js:164
+msgid "An error occurred renaming this suitcase."
+msgstr ""
+
+#: static/main.js:193
+msgid "You have to enter the new suitcase name."
+msgstr ""
+
+#: static/main.js:219
+msgid "An error occurred copying the suitcase."
+msgstr ""
+
+#: static/main.js:240
+#, javascript-format
+msgid "Reset the %s suitcase"
+msgstr ""
+
+#: static/main.js:241
+#, javascript-format
+msgid "Are-you sure you want to reset the suitcase %s?"
+msgstr ""
+
+#: static/main.js:260
+#, javascript-format
+msgid "Delete the %s suitcase"
+msgstr ""
+
+#: static/main.js:261
+#, javascript-format
+msgid "Are-you sure you want to delete the suitcase %s?"
+msgstr ""
+
+#: static/main.js:278
+#, javascript-format
+msgid "Restaure the %s suitcase"
+msgstr ""
+
+#: static/main.js:279
+#, javascript-format
+msgid "Are-you sure you want to restaure the suitcase %s?"
+msgstr ""
+
+#: static/main.js:311
+msgid "You have to enter the category name!"
+msgstr ""
+
+#: static/main.js:320 static/main.js:378
+msgid "A category with this name already exist in the trash!"
+msgstr ""
+
+#: static/main.js:326
+msgid "A category with this name already exist!"
+msgstr ""
+
+#: static/main.js:366
+msgid "You have to enter the new name of the category!"
+msgstr ""
+
+#: static/main.js:383
+msgid "A category with this name already!"
+msgstr ""
+
+#: static/main.js:414
+#, javascript-format
+msgid "Delete the category %s"
+msgstr ""
+
+#: static/main.js:415
+#, javascript-format
+msgid "Are-you sure you want to delete the category %s?"
+msgstr ""
+
+#: static/main.js:433
+#, javascript-format
+msgid "Restore the category %s"
+msgstr ""
+
+#: static/main.js:434
+#, javascript-format
+msgid "Are-you sure you want to restore the category %s?"
+msgstr ""
+
+#: static/main.js:497
+msgid "Tow elements can't have the same name!"
+msgstr ""
+
+#: static/main.js:505
+#, javascript-format
+msgid "The element '%s' already exist!"
+msgstr ""
+
+#: static/main.js:528
+msgid "You have to enter at least one element name!"
+msgstr ""
+
+#: static/main.js:561
+msgid "Another?"
+msgstr ""
+
+#: static/main.js:566
+msgid "Nb"
+msgstr ""
+
+#: static/main.js:593
+msgid "You have to enter the new element name!"
+msgstr ""
+
+#: static/main.js:609
+msgid "An element with this name already exist in the trash!"
+msgstr ""
+
+#: static/main.js:615
+msgid "An element with this name already exist!"
+msgstr ""
+
+#: static/main.js:659
+#, javascript-format
+msgid "Delete the element %s"
+msgstr ""
+
+#: static/main.js:660
+#, javascript-format
+msgid "Are-you sure you want to delete the element %s?"
+msgstr ""
+
+#: static/main.js:681
+#, javascript-format
+msgid "Restore the element %s"
+msgstr ""
+
+#: static/main.js:682
+#, javascript-format
+msgid "Are-you sure you want to restore the element %s?"
+msgstr ""
+
+#: static/main.js:785
+msgid "Add an element"
+msgstr ""
+
+#: static/main.js:823 static/main.js:963
+msgid "Trash"
+msgstr ""
+
+#: static/main.js:836
+msgid "The trash is empty."
+msgstr ""
+
+#: static/main.js:924
+msgid "Your suitcases"
+msgstr ""
+
+#: static/main.js:995
+msgid "No suitcase in the trash."
+msgstr ""
+
+#: static/main.js:1050
+msgid "Delete all local data"
+msgstr ""
+
+#: static/main.js:1051
+msgid "Are-you sure you want to delete all local data (irreversible action)?"
+msgstr ""
+
+#: static/main.js:1068
+msgid "Loading example data"
+msgstr ""
+
+#: static/main.js:1070
+msgid ""
+"Are-you sure you want to load example data in place of your own local data "
+"(irreversible action)?"
+msgstr ""
+
+#: static/main.js:1120
+msgid "Failed to decode JSON file."
+msgstr ""
+
+#: static/main.js:1125
+msgid "Import from file"
+msgstr ""
+
+#: static/main.js:1127
+msgid ""
+"Are-you sure you want to overwrite your local data with the data from this "
+"file (irreversible action)?"
+msgstr ""
+
+#: static/main.js:1134
+msgid "The file has been imported successfully."
+msgstr ""
+
+#: static/main.js:1141
+msgid "An error occurred loading this file. Restoring previous data..."
+msgstr ""
+
+#: static/main.js:1148 static/main.js:1315
+msgid "Previous data has been restored successfully."
+msgstr ""
+
+#: static/main.js:1154 static/main.js:1321
+msgid "An error occurred restoring previous data."
+msgstr ""
+
+#: static/main.js:1200
+msgid "You have to enter your username and password!"
+msgstr ""
+
+#: static/main.js:1218
+msgid "Connected."
+msgstr ""
+
+#: static/main.js:1226
+msgid "An error occurred logging in. Please try again later."
+msgstr ""
+
+#: static/main.js:1247
+msgid "Logout"
+msgstr ""
+
+#: static/main.js:1248
+msgid "Do you really want to log out?"
+msgstr ""
+
+#: static/main.js:1259
+msgid "Logged out"
+msgstr ""
+
+#: static/main.js:1262 static/main.js:1270
+msgid "An error occurred logging you out. Please try again later."
+msgstr ""
+
+#: static/main.js:1303
+msgid "Data synchronized."
+msgstr ""
+
+#: static/main.js:1308
+msgid ""
+"An error occurred loading data from the server. Restoring previous data..."
+msgstr ""
+
+#: static/main.js:1331 static/main.js:1353
+msgid "An error occurred synchronizing your data. Please try again later."
+msgstr ""
+
+#: static/main.js:1345
+msgid "Your session appears to have expired, please re-authenticate."
+msgstr ""
+
+#: static/main.js:1372
+msgid "You must sign in before you can sync your data."
+msgstr ""
+
+#: static/main.js:1386
+msgid "Synchronize your suitcases from server"
+msgstr ""
+
+#: static/main.js:1387
+msgid "Are-you sure you want to synchronize your suitcases from server?"
+msgstr ""
+
+#: static/main.js:1450
+msgid "An example of a suitcase?"
+msgstr ""
+
+#: static/main.js:1451
+msgid "Would you like to load a sample suitcase to get started?"
+msgstr ""
+
+#: static/main.js:1468
+msgid ""
+"Your internet browser does not support local data storage. Therefore, "
+"unfortunately you cannot use this application."
+msgstr ""
+
+#: static/main.js:1557
+msgid "Error loading local data"
+msgstr ""
+
+#: static/main.js:1558
+msgid "An error occurred while loading local data. Should we purge it?"
+msgstr ""
+
+#: static/mysc_objects.js:10
+msgid "White paper"
+msgstr ""
+
+#: static/mysc_objects.js:11
+msgid "Pen"
+msgstr ""
+
+#: static/mysc_objects.js:12
+msgid "ID card/passport"
+msgstr ""
+
+#: static/mysc_objects.js:18
+msgid "Watch"
+msgstr ""
+
+#: static/mysc_objects.js:19
+msgid "Watch charger"
+msgstr ""
+
+#: static/mysc_objects.js:20
+msgid "Laptop"
+msgstr ""
+
+#: static/mysc_objects.js:21
+msgid "Laptop charger"
+msgstr ""
+
+#: static/mysc_objects.js:294
+#, javascript-format
+msgid "An error occurred while loading the %s suitcase from the cache."
+msgstr ""
+
+#: static/mysc_objects.js:417
+msgid "An error occurred while loading the category list from the cache."
+msgstr ""
+
+#: static/mysc_objects.js:565
+#, javascript-format
+msgid "An error occurred while loading the %s category from the cache."
+msgstr ""
+
+#: static/mysc_objects.js:636
+msgid "Error loading your login information. Please log in again."
+msgstr ""
+
+#: templates/support_info.tpl:4
+msgid "Helpdesk page"
+msgstr ""
+
+#: templates/support_info.tpl:5
+msgid ""
+"Upon request, please download and forward the following information to the "
+"support service:"
+msgstr ""
+
+#: templates/support_info.tpl:9
+msgid "Download"
+msgstr ""
+
+#: templates/support_info_content.tpl:1
+msgid "Application URL:"
+msgstr ""
+
+#: templates/support_info_content.tpl:2
+msgid "Current page URL:"
+msgstr ""
+
+#: templates/support_info_content.tpl:4
+msgid "Connected user:"
+msgstr ""
+
+#: templates/support_info_content.tpl:6
+msgid "Extra user information:"
+msgstr ""
+
+#: templates/index.tpl:39 templates/index.tpl:91
+msgid "Add a suitcase"
+msgstr ""
+
+#: templates/index.tpl:40
+msgid "Show trash"
+msgstr ""
+
+#: templates/index.tpl:41
+msgid "Suitcases list"
+msgstr ""
+
+#: templates/index.tpl:43
+msgid "Manage the suitcase"
+msgstr ""
+
+#: templates/index.tpl:45 templates/index.tpl:157
+msgid "Add a category"
+msgstr ""
+
+#: templates/index.tpl:47 templates/index.tpl:135
+msgid "Rename the suitcase"
+msgstr ""
+
+#: templates/index.tpl:48 templates/index.tpl:113
+msgid "Copy the suitcase"
+msgstr ""
+
+#: templates/index.tpl:49
+msgid "Reset the suitcase"
+msgstr ""
+
+#: templates/index.tpl:50
+msgid "Delete the suitcase"
+msgstr ""
+
+#: templates/index.tpl:52
+msgid "Show suitcase's trash"
+msgstr ""
+
+#: templates/index.tpl:56
+msgid "Manage data"
+msgstr ""
+
+#: templates/index.tpl:58
+msgid "Backup your data"
+msgstr ""
+
+#: templates/index.tpl:59
+msgid "Restaure your data"
+msgstr ""
+
+#: templates/index.tpl:61
+msgid "Synchronize local data"
+msgstr ""
+
+#: templates/index.tpl:63
+msgid "Purge local data"
+msgstr ""
+
+#: templates/index.tpl:64
+msgid "Load example data"
+msgstr ""
+
+#: templates/index.tpl:74
+msgid "Login"
+msgstr ""
+
+#: templates/index.tpl:96
+msgid "Suitcase name"
+msgstr ""
+
+#: templates/index.tpl:102 templates/index.tpl:168 templates/index.tpl:218
+msgid "Add"
+msgstr ""
+
+#: templates/index.tpl:118
+msgid "Name of the new suitcase"
+msgstr ""
+
+#: templates/index.tpl:124
+msgid "Copy"
+msgstr ""
+
+#: templates/index.tpl:140
+msgid "New suitcase name"
+msgstr ""
+
+#: templates/index.tpl:146 templates/index.tpl:190
+msgid "Rename"
+msgstr ""
+
+#: templates/index.tpl:162
+msgid "Category name"
+msgstr ""
+
+#: templates/index.tpl:179
+msgid "Rename the category"
+msgstr ""
+
+#: templates/index.tpl:184
+msgid "New category's name"
+msgstr ""
+
+#: templates/index.tpl:207 templates/index.tpl:234
+msgid "Element name"
+msgstr ""
+
+#: templates/index.tpl:229
+msgid "Edit the element"
+msgstr ""
+
+#: templates/index.tpl:241
+msgid "Modify"
+msgstr ""
+
+#: templates/index.tpl:252 templates/index.tpl:257
+msgid "Loading..."
+msgstr ""
+
+#: templates/index.tpl:271
+msgid "Connection"
+msgstr ""
+
+#: templates/index.tpl:276
+msgid "Username"
+msgstr ""
+
+#: templates/index.tpl:277
+msgid "Password"
+msgstr ""
+
+#: templates/index.tpl:283 templates/index.tpl:326
+msgid "Connect"
+msgstr ""
+
+#: templates/index.tpl:295
+msgid "Welcome"
+msgstr ""
+
+#: templates/index.tpl:298
+msgid ""
+"
\n"
+" This application allows you to manage lists of things not to "
+"forget to pack in your\n"
+" suitcase before your departure:\n"
+"
\n"
+"
\n"
+" To get started, create a suitcase, add the categories of "
+"things you will need to\n"
+" pack, and add all these things to it;\n"
+"
\n"
+"
\n"
+" Before your departure, you can then gradually check off all "
+"the things you have\n"
+" already gathered and ensure you don't forget anything!\n"
+"
\n"
+"
\n"
+"
\n"
+"
\n"
+" Note: This application has been designed to work "
+"completely locally.\n"
+" The data manipulated (your suitcases, etc.) is stored only in your "
+"internet browser.\n"
+" It is also possible to export/import this information in JSON "
+"format. \n"
+" However, to facilitate the management of your suitcases from "
+"multiple devices, it's\n"
+" possible to synchronize this information on the server. For this, "
+"you need an account,\n"
+" and at this time, registrations are not open.\n"
+"
\n"
+"
\n"
+" If you have an account, you can log in by clicking the Login"
+"em> button below.\n"
+" If not, click the Anonymous usage button to start using "
+"the application.\n"
+"
"
+msgstr ""
+
+#: templates/index.tpl:327
+msgid "Anonymous usage"
+msgstr ""
diff --git a/static/main.js b/static/main.js
index a0839db..1a3d889 100644
--- a/static/main.js
+++ b/static/main.js
@@ -24,11 +24,11 @@ alertify.defaults = {
// language resources
glossary: {
// Dialog title text
- title: "Confirmation",
+ title: _("Confirmation"),
// ok button text
- ok: "OK",
+ ok: _("OK"),
// cancel button text
- cancel: "Annuler",
+ cancel: _("Cancel"),
},
theme: {
// class name attached to prompt dialog input textbox.
@@ -82,19 +82,23 @@ on_valid_add_scase_modal = function (e) {
e.preventDefault();
var name = $("#add_scase_name")[0].value;
if (name == "") {
- alertify.notify("Vous devez saisir le nom de la valise !", "error", 5);
+ alertify.notify(
+ _("You have to enter the name of the suitcase!"),
+ "error",
+ 5
+ );
return;
}
var nameshake = scases.byName(name);
if (nameshake) {
if (nameshake.removed) {
alertify.notify(
- "Une valise de ce nom existe dans la corbeille !",
+ _("A suitcase exist with this name exist in the trash."),
"error",
5
);
} else {
- alertify.notify("Cette valise existe déjà !", "error", 5);
+ alertify.notify(_("This suitcase already exist!"), "error", 5);
}
return;
}
@@ -129,7 +133,7 @@ on_valid_rename_scase_modal = function (e) {
var name = $("#rename_scase_name")[0].value;
if (name == "") {
alertify.notify(
- "Vous devez saisir le nouveau nom de la valise !",
+ _("You have to enter the new name of the suitcase!"),
"error",
5
);
@@ -140,12 +144,16 @@ on_valid_rename_scase_modal = function (e) {
if (nameshake) {
if (nameshake.removed) {
alertify.notify(
- "Une valise portant ce nom existe dans la corbeille !",
+ _("A suitcase exist with this name exist in the trash."),
"error",
5
);
} else {
- alertify.notify("Une valise portant ce nom existe déjà !", "error", 5);
+ alertify.notify(
+ _("A suitcase with this name already exist!"),
+ "error",
+ 5
+ );
}
return;
}
@@ -157,7 +165,7 @@ on_valid_rename_scase_modal = function (e) {
auto_sync_local_data();
} else {
alertify.notify(
- "Une erreur est survenue en renomant la valise...",
+ _("An error occurred renaming this suitcase."),
"error",
5
);
@@ -186,23 +194,23 @@ on_valid_copy_scase_modal = function (e) {
e.preventDefault();
var name = $("#copy_scase_name")[0].value;
if (name == "") {
- alertify.notify(
- "Vous devez saisir le nom de la nouvelle valise !",
- "error",
- 5
- );
+ alertify.notify(_("You have to enter the new suitcase name."), "error", 5);
return;
}
var nameshake = scases.byName(name);
if (nameshake) {
if (nameshake.removed) {
alertify.notify(
- "Une valise portant ce nom existe dans la corbeille !",
+ _("A suitcase exist with this name exist in the trash."),
"error",
5
);
} else {
- alertify.notify("Une valise portant ce nom existe déjà !", "error", 5);
+ alertify.notify(
+ _("A suitcase with this name already exist!"),
+ "error",
+ 5
+ );
}
return;
}
@@ -212,11 +220,7 @@ on_valid_copy_scase_modal = function (e) {
show_scase(scase);
auto_sync_local_data();
} else {
- alertify.notify(
- "Une erreur est survenue en copiant la valise...",
- "error",
- 5
- );
+ alertify.notify(_("An error occurred copying the suitcase."), "error", 5);
}
$("#copy_scase_modal").modal("hide");
};
@@ -237,8 +241,8 @@ on_reset_scase_btn_click = function (event) {
var scase = scases.byName($("#cats").data("scase"));
if (scase) {
alertify.confirm(
- `Réinitialisation de la valise ${scase.name}`,
- `Voulez-vous vraiment réinitialiser la valise ${scase.name} ?`,
+ _("Reset the %s suitcase", scase.name),
+ _("Are-you sure you want to reset the suitcase %s?", scase.name),
function (data) {
scases.resetSCase(scase.name);
scases.save();
@@ -257,8 +261,8 @@ on_delete_scase_btn_click = function (event) {
var scase = scases.byName($("#cats").data("scase"));
if (scase) {
alertify.confirm(
- `Suppression de la valise ${scase.name}`,
- `Voulez-vous vraiment supprimer la valise ${scase.name} ?`,
+ _("Delete the %s suitcase", scase.name),
+ _("Are-you sure you want to delete the suitcase %s?", scase.name),
function (data) {
scases.removeSCase(scase.name);
scases.save();
@@ -275,8 +279,8 @@ on_restore_scase_btn_click = function (event) {
var scase = event.data.scase;
if (scase) {
alertify.confirm(
- `Restauration de la valise ${scase.name}`,
- `Voulez-vous vraiment restaurer la valise ${scase.name} ?`,
+ _("Restaure the %s suitcase", scase.name),
+ _("Are-you sure you want to restaure the suitcase %s?", scase.name),
function (data) {
scase.restore();
scases.save();
@@ -308,7 +312,7 @@ on_valid_add_cat_modal = function (e) {
e.preventDefault();
var name = $("#add_cat_name")[0].value;
if (name == "") {
- alertify.notify("Vous devez saisir le nom de la catégorie !", "error", 5);
+ alertify.notify(_("You have to enter the category name!"), "error", 5);
return;
}
var scase = scases.byName($("#cats").data("scase"));
@@ -317,13 +321,13 @@ on_valid_add_cat_modal = function (e) {
if (nameshake) {
if (nameshake.removed) {
alertify.notify(
- "Une catégorie portant ce nom existe dans la corbeille !",
+ _("A category with this name already exist in the trash!"),
"error",
5
);
} else {
alertify.notify(
- "Une catégorie portant ce nom existe déjà !",
+ _("A category with this name already exist!"),
"error",
5
);
@@ -363,7 +367,7 @@ on_valid_rename_cat_modal = function (e) {
var name = $("#rename_cat_name")[0].value;
if (name == "") {
alertify.notify(
- "Vous devez saisir le nouveau nom de la catégorie !",
+ _("You have to enter the new name of the category!"),
"error",
5
);
@@ -375,12 +379,12 @@ on_valid_rename_cat_modal = function (e) {
var namesake = scase.cats.byName(name);
if (namesake.removed) {
alertify.notify(
- "Une catégorie de se nom existe dans la corbeille !",
+ _("A category with this name already exist in the trash!"),
"error",
5
);
} else {
- alertify.notify("Cette catégorie existe déjà !", "error", 5);
+ alertify.notify(_("A category with this name already!"), "error", 5);
}
return;
}
@@ -411,8 +415,8 @@ on_delete_cat_btn_click = function (event) {
if (scase) {
var cat = event.data.cat.name;
alertify.confirm(
- `Suppression de la catégorie ${cat}`,
- `Voulez-vous vraiment supprimer la catégorie ${cat} ?`,
+ _("Delete the category %s", cat),
+ _("Are-you sure you want to delete the category %s?", cat),
function (data) {
scase.cats.removeCat(cat);
scases.save();
@@ -430,8 +434,8 @@ on_restore_cat_btn_click = function (event) {
if (scase) {
var cat = event.data.cat.name;
alertify.confirm(
- `Restauration de la catégorie ${cat}`,
- `Voulez-vous vraiment restaurer la catégorie ${cat} ?`,
+ _("Restore the category %s", cat),
+ _("Are-you sure you want to restore the category %s?", cat),
function (data) {
scase.cats.restoreCat(cat);
scases.save();
@@ -494,7 +498,7 @@ on_valid_add_thing_modal = function (e) {
if (label && label != "") {
if (labels.indexOf(label) > -1) {
alertify.notify(
- "Deux élements ne peuvent porter le même nom !",
+ _("Tow elements can't have the same name!"),
"error",
5
);
@@ -502,11 +506,7 @@ on_valid_add_thing_modal = function (e) {
return;
}
if (cat.byLabel(label)) {
- alertify.notify(
- "L'élément '" + label + "' existe déjà !",
- "error",
- 5
- );
+ alertify.notify(_("The element '%s' already exist!"), "error", 5);
error = true;
return;
}
@@ -529,7 +529,7 @@ on_valid_add_thing_modal = function (e) {
}
if (things.length == 0) {
alertify.notify(
- "Vous devez saisir au moins un nom d'élément !",
+ _("You have to enter at least one element name!"),
"error",
5
);
@@ -561,10 +561,14 @@ on_add_thing_label_focus = function (event) {
if ($("input.add_thing_label").last()[0] == event.target) {
var new_input_group = $('');
var new_input_label = $(
- ''
+ ``
);
var new_input_nb = $(
- ''
+ ``
);
new_input_group.append(new_input_label);
new_input_group.append(" ");
@@ -590,11 +594,7 @@ on_valid_edit_thing_modal = function (e) {
e.preventDefault();
var label = $("#edit_thing_label").val();
if (label == "") {
- alertify.notify(
- "Vous devez saisir le nouveau nom de l'élément !",
- "error",
- 5
- );
+ alertify.notify(_("You have to enter the new element name!"), "error", 5);
return;
}
var nb = parseInt($("#edit_thing_nb").val());
@@ -610,12 +610,16 @@ on_valid_edit_thing_modal = function (e) {
if (namesake) {
if (namesake.removed) {
alertify.notify(
- "Un élément de ce nom existe dans la corbeille !",
+ _("An element with this name already exist in the trash!"),
"error",
5
);
} else {
- alertify.notify("Un élément de ce nom existe déjà !", "error", 5);
+ alertify.notify(
+ _("An element with this name already exist!"),
+ "error",
+ 5
+ );
}
return;
}
@@ -656,8 +660,8 @@ on_delete_thing_btn_click = function (event) {
if (cat) {
var thing = event.data.thing.label;
alertify.confirm(
- `Suppression de l'élément ${thing}`,
- `Voulez-vous vraiment supprimer l'élément ${thing} ?`,
+ _("Delete the element %s", thing),
+ _("Are-you sure you want to delete the element %s?", thing),
function (data) {
cat.removeThing(thing);
scases.save();
@@ -678,8 +682,8 @@ on_restore_thing_btn_click = function (event) {
if (cat) {
var thing = event.data.thing.label;
alertify.confirm(
- `Restauration de l'élément ${thing}`,
- `Voulez-vous vraiment restaurer l'élément ${thing} ?`,
+ _("Restore the element %s", thing),
+ _("Are-you sure you want to restore the element %s?", thing),
function (data) {
cat.restoreThing(thing);
scases.save();
@@ -698,7 +702,7 @@ on_restore_thing_btn_click = function (event) {
show_cat = function (scase, cat, displayed) {
var panel = $('');
var panel_heading = $('');
- var panel_title = $('
- Cette application vous permet de gérer des listes de choses à ne pas oublier de glisser dans votre valise avant votre départ :
+ {t escape=false}
+ This application allows you to manage lists of things not to forget to pack in your
+ suitcase before your departure:
-
Pour commencer, créer une valise, ajouter les catégories de choses que vous aurez à y glisser et ajouter y toutes ces choses.
-
Avant votre départ, vous pourrez alors cocher petit à petit toutes les choses que vous aurez déjà réunies et vous asurez de ne rien oublier !
+
+ To get started, create a suitcase, add the categories of things you will need to
+ pack, and add all these things to it;
+
+
+ Before your departure, you can then gradually check off all the things you have
+ already gathered and ensure you don't forget anything!
+
- Note : Cette application a été conçue pour pouvoir fonctionner complètement localement. Les données manipulées (vos valises, ...) sont stockés
- uniquement dans votre navigateur internet. Il est par ailleurs possible d'exporter/importer ces informations au format JSON.
- Cependant, pour faciliter la gestion de vos valises depuis plusieurs appareils, il est possible de synchroniser ces informations sur le serveur. Pour cela,
- il vous faut un compte et à ce jour, les inscriptions ne sont pas ouvertes.
+ Note: This application has been designed to work completely locally.
+ The data manipulated (your suitcases, etc.) is stored only in your internet browser.
+ It is also possible to export/import this information in JSON format.
+ However, to facilitate the management of your suitcases from multiple devices, it's
+ possible to synchronize this information on the server. For this, you need an account,
+ and at this time, registrations are not open.
- Si vous disposez d'un compte, vous pouvez vous connecter en cliquant sur le bouton Connexion ci-dessous.
- À défaut, cliquer sur le bouton Utilisation annonyme pour commencer à utiliser l'application.
-
+ If you have an account, you can log in by clicking the Login button below.
+ If not, click the Anonymous usage button to start using the application.
+ {/t}