Translate application's messages with english as default and add french translation

This commit is contained in:
Benjamin Renard 2024-09-22 18:39:11 +02:00
parent 28e6e167ee
commit 05a6c19264
Signed by: bn8
GPG key ID: 3E2E1CE1907115BC
12 changed files with 1543 additions and 251 deletions

6
.codespell-exclusions Normal file
View file

@ -0,0 +1,6 @@
.git
./static/lib
./vendor
./locales/*/LC_MESSAGES/*.po
./locales/*.js
./locales/*.pot

View file

@ -2,6 +2,13 @@
# See https://pre-commit.com for more information # See https://pre-commit.com for more information
--- ---
repos: 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 - repo: https://github.com/adrienverge/yamllint
rev: v1.32.0 rev: v1.32.0
hooks: hooks:

View file

@ -20,7 +20,7 @@ else {
if (basename($script) == 'core.php') if (basename($script) == 'core.php')
break; 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).'/../'); $root_dir_path = realpath(dirname($script).'/../');
// Include App's includes and vendor directories to PHP include paths // Include App's includes and vendor directories to PHP include paths

1
locales/fr_FR.UTF8.js Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

View file

@ -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 <brenard@easter-eggs.com>\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 ""
"<p>\n"
" This application allows you to manage lists of things not to "
"forget to pack in your\n"
" suitcase before your departure:\n"
" <ul>\n"
" <li>\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"
" <li>\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"
" <p>\n"
" <strong>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.<br/>\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"
" <p>\n"
" If you have an account, you can log in by clicking the <em>Login</"
"em> button below.\n"
" If not, click the <em>Anonymous usage</em> button to start using "
"the application.\n"
" </p>"
msgstr ""
"<p>\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"
" <ul>\n"
" <li>Pour commencer, créer une valise, ajouter les catégories de choses "
"que vous aurez à y glisser et ajouter y toutes ces choses.</li>\n"
" <li>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"
" </ul>\n"
"</p>\n"
"<p>\n"
" <strong>Note :</strong> 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.<br/>\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"
"</p>\n"
"<p>\n"
" Si vous disposez d'un compte, vous pouvez vous connecter en cliquant sur "
"le bouton <em>Connexion</em> ci-dessous.\n"
" À défaut, cliquer sur le bouton <em>Utilisation annonyme</em> pour "
"commencer à utiliser l'application.\n"
"</p>"
#: templates/index.tpl:327
msgid "Anonymous usage"
msgstr "Utilisation annonyme"

597
locales/messages.pot Normal file
View file

@ -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 ""
"<p>\n"
" This application allows you to manage lists of things not to "
"forget to pack in your\n"
" suitcase before your departure:\n"
" <ul>\n"
" <li>\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"
" <li>\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"
" <p>\n"
" <strong>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.<br/>\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"
" <p>\n"
" If you have an account, you can log in by clicking the <em>Login</"
"em> button below.\n"
" If not, click the <em>Anonymous usage</em> button to start using "
"the application.\n"
" </p>"
msgstr ""
#: templates/index.tpl:327
msgid "Anonymous usage"
msgstr ""

View file

@ -24,11 +24,11 @@ alertify.defaults = {
// language resources // language resources
glossary: { glossary: {
// Dialog title text // Dialog title text
title: "Confirmation", title: _("Confirmation"),
// ok button text // ok button text
ok: "OK", ok: _("OK"),
// cancel button text // cancel button text
cancel: "Annuler", cancel: _("Cancel"),
}, },
theme: { theme: {
// class name attached to prompt dialog input textbox. // class name attached to prompt dialog input textbox.
@ -82,19 +82,23 @@ on_valid_add_scase_modal = function (e) {
e.preventDefault(); e.preventDefault();
var name = $("#add_scase_name")[0].value; var name = $("#add_scase_name")[0].value;
if (name == "") { 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; return;
} }
var nameshake = scases.byName(name); var nameshake = scases.byName(name);
if (nameshake) { if (nameshake) {
if (nameshake.removed) { if (nameshake.removed) {
alertify.notify( alertify.notify(
"Une valise de ce nom existe dans la corbeille !", _("A suitcase exist with this name exist in the trash."),
"error", "error",
5 5
); );
} else { } else {
alertify.notify("Cette valise existe déjà !", "error", 5); alertify.notify(_("This suitcase already exist!"), "error", 5);
} }
return; return;
} }
@ -129,7 +133,7 @@ on_valid_rename_scase_modal = function (e) {
var name = $("#rename_scase_name")[0].value; var name = $("#rename_scase_name")[0].value;
if (name == "") { if (name == "") {
alertify.notify( alertify.notify(
"Vous devez saisir le nouveau nom de la valise !", _("You have to enter the new name of the suitcase!"),
"error", "error",
5 5
); );
@ -140,12 +144,16 @@ on_valid_rename_scase_modal = function (e) {
if (nameshake) { if (nameshake) {
if (nameshake.removed) { if (nameshake.removed) {
alertify.notify( alertify.notify(
"Une valise portant ce nom existe dans la corbeille !", _("A suitcase exist with this name exist in the trash."),
"error", "error",
5 5
); );
} else { } 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; return;
} }
@ -157,7 +165,7 @@ on_valid_rename_scase_modal = function (e) {
auto_sync_local_data(); auto_sync_local_data();
} else { } else {
alertify.notify( alertify.notify(
"Une erreur est survenue en renomant la valise...", _("An error occurred renaming this suitcase."),
"error", "error",
5 5
); );
@ -186,23 +194,23 @@ on_valid_copy_scase_modal = function (e) {
e.preventDefault(); e.preventDefault();
var name = $("#copy_scase_name")[0].value; var name = $("#copy_scase_name")[0].value;
if (name == "") { if (name == "") {
alertify.notify( alertify.notify(_("You have to enter the new suitcase name."), "error", 5);
"Vous devez saisir le nom de la nouvelle valise !",
"error",
5
);
return; return;
} }
var nameshake = scases.byName(name); var nameshake = scases.byName(name);
if (nameshake) { if (nameshake) {
if (nameshake.removed) { if (nameshake.removed) {
alertify.notify( alertify.notify(
"Une valise portant ce nom existe dans la corbeille !", _("A suitcase exist with this name exist in the trash."),
"error", "error",
5 5
); );
} else { } 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; return;
} }
@ -212,11 +220,7 @@ on_valid_copy_scase_modal = function (e) {
show_scase(scase); show_scase(scase);
auto_sync_local_data(); auto_sync_local_data();
} else { } else {
alertify.notify( alertify.notify(_("An error occurred copying the suitcase."), "error", 5);
"Une erreur est survenue en copiant la valise...",
"error",
5
);
} }
$("#copy_scase_modal").modal("hide"); $("#copy_scase_modal").modal("hide");
}; };
@ -237,8 +241,8 @@ on_reset_scase_btn_click = function (event) {
var scase = scases.byName($("#cats").data("scase")); var scase = scases.byName($("#cats").data("scase"));
if (scase) { if (scase) {
alertify.confirm( alertify.confirm(
`Réinitialisation de la valise ${scase.name}`, _("Reset the %s suitcase", scase.name),
`Voulez-vous vraiment réinitialiser la valise ${scase.name} ?`, _("Are-you sure you want to reset the suitcase %s?", scase.name),
function (data) { function (data) {
scases.resetSCase(scase.name); scases.resetSCase(scase.name);
scases.save(); scases.save();
@ -257,8 +261,8 @@ on_delete_scase_btn_click = function (event) {
var scase = scases.byName($("#cats").data("scase")); var scase = scases.byName($("#cats").data("scase"));
if (scase) { if (scase) {
alertify.confirm( alertify.confirm(
`Suppression de la valise ${scase.name}`, _("Delete the %s suitcase", scase.name),
`Voulez-vous vraiment supprimer la valise ${scase.name} ?`, _("Are-you sure you want to delete the suitcase %s?", scase.name),
function (data) { function (data) {
scases.removeSCase(scase.name); scases.removeSCase(scase.name);
scases.save(); scases.save();
@ -275,8 +279,8 @@ on_restore_scase_btn_click = function (event) {
var scase = event.data.scase; var scase = event.data.scase;
if (scase) { if (scase) {
alertify.confirm( alertify.confirm(
`Restauration de la valise ${scase.name}`, _("Restaure the %s suitcase", scase.name),
`Voulez-vous vraiment restaurer la valise ${scase.name} ?`, _("Are-you sure you want to restaure the suitcase %s?", scase.name),
function (data) { function (data) {
scase.restore(); scase.restore();
scases.save(); scases.save();
@ -308,7 +312,7 @@ on_valid_add_cat_modal = function (e) {
e.preventDefault(); e.preventDefault();
var name = $("#add_cat_name")[0].value; var name = $("#add_cat_name")[0].value;
if (name == "") { 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; return;
} }
var scase = scases.byName($("#cats").data("scase")); var scase = scases.byName($("#cats").data("scase"));
@ -317,13 +321,13 @@ on_valid_add_cat_modal = function (e) {
if (nameshake) { if (nameshake) {
if (nameshake.removed) { if (nameshake.removed) {
alertify.notify( alertify.notify(
"Une catégorie portant ce nom existe dans la corbeille !", _("A category with this name already exist in the trash!"),
"error", "error",
5 5
); );
} else { } else {
alertify.notify( alertify.notify(
"Une catégorie portant ce nom existe déjà !", _("A category with this name already exist!"),
"error", "error",
5 5
); );
@ -363,7 +367,7 @@ on_valid_rename_cat_modal = function (e) {
var name = $("#rename_cat_name")[0].value; var name = $("#rename_cat_name")[0].value;
if (name == "") { if (name == "") {
alertify.notify( alertify.notify(
"Vous devez saisir le nouveau nom de la catégorie !", _("You have to enter the new name of the category!"),
"error", "error",
5 5
); );
@ -375,12 +379,12 @@ on_valid_rename_cat_modal = function (e) {
var namesake = scase.cats.byName(name); var namesake = scase.cats.byName(name);
if (namesake.removed) { if (namesake.removed) {
alertify.notify( alertify.notify(
"Une catégorie de se nom existe dans la corbeille !", _("A category with this name already exist in the trash!"),
"error", "error",
5 5
); );
} else { } else {
alertify.notify("Cette catégorie existe déjà !", "error", 5); alertify.notify(_("A category with this name already!"), "error", 5);
} }
return; return;
} }
@ -411,8 +415,8 @@ on_delete_cat_btn_click = function (event) {
if (scase) { if (scase) {
var cat = event.data.cat.name; var cat = event.data.cat.name;
alertify.confirm( alertify.confirm(
`Suppression de la catégorie ${cat}`, _("Delete the category %s", cat),
`Voulez-vous vraiment supprimer la catégorie ${cat} ?`, _("Are-you sure you want to delete the category %s?", cat),
function (data) { function (data) {
scase.cats.removeCat(cat); scase.cats.removeCat(cat);
scases.save(); scases.save();
@ -430,8 +434,8 @@ on_restore_cat_btn_click = function (event) {
if (scase) { if (scase) {
var cat = event.data.cat.name; var cat = event.data.cat.name;
alertify.confirm( alertify.confirm(
`Restauration de la catégorie ${cat}`, _("Restore the category %s", cat),
`Voulez-vous vraiment restaurer la catégorie ${cat} ?`, _("Are-you sure you want to restore the category %s?", cat),
function (data) { function (data) {
scase.cats.restoreCat(cat); scase.cats.restoreCat(cat);
scases.save(); scases.save();
@ -494,7 +498,7 @@ on_valid_add_thing_modal = function (e) {
if (label && label != "") { if (label && label != "") {
if (labels.indexOf(label) > -1) { if (labels.indexOf(label) > -1) {
alertify.notify( alertify.notify(
"Deux élements ne peuvent porter le même nom !", _("Tow elements can't have the same name!"),
"error", "error",
5 5
); );
@ -502,11 +506,7 @@ on_valid_add_thing_modal = function (e) {
return; return;
} }
if (cat.byLabel(label)) { if (cat.byLabel(label)) {
alertify.notify( alertify.notify(_("The element '%s' already exist!"), "error", 5);
"L'élément '" + label + "' existe déjà !",
"error",
5
);
error = true; error = true;
return; return;
} }
@ -529,7 +529,7 @@ on_valid_add_thing_modal = function (e) {
} }
if (things.length == 0) { if (things.length == 0) {
alertify.notify( alertify.notify(
"Vous devez saisir au moins un nom d'élément !", _("You have to enter at least one element name!"),
"error", "error",
5 5
); );
@ -561,10 +561,14 @@ on_add_thing_label_focus = function (event) {
if ($("input.add_thing_label").last()[0] == event.target) { if ($("input.add_thing_label").last()[0] == event.target) {
var new_input_group = $('<div class="form-group add_thing_other"></div>'); var new_input_group = $('<div class="form-group add_thing_other"></div>');
var new_input_label = $( var new_input_label = $(
'<input type="text" class="form-control add_thing_label" placeholder="Encore un ?"/>' `<input type="text" class="form-control add_thing_label" placeholder="${_(
"Another?"
)}"/>`
); );
var new_input_nb = $( var new_input_nb = $(
'<input type="number" class="form-control add_thing_nb" placeholder="Nb"/>' `<input type="number" class="form-control add_thing_nb" placeholder="${_(
"Nb"
)}"/>`
); );
new_input_group.append(new_input_label); new_input_group.append(new_input_label);
new_input_group.append(" "); new_input_group.append(" ");
@ -590,11 +594,7 @@ on_valid_edit_thing_modal = function (e) {
e.preventDefault(); e.preventDefault();
var label = $("#edit_thing_label").val(); var label = $("#edit_thing_label").val();
if (label == "") { if (label == "") {
alertify.notify( alertify.notify(_("You have to enter the new element name!"), "error", 5);
"Vous devez saisir le nouveau nom de l'élément !",
"error",
5
);
return; return;
} }
var nb = parseInt($("#edit_thing_nb").val()); var nb = parseInt($("#edit_thing_nb").val());
@ -610,12 +610,16 @@ on_valid_edit_thing_modal = function (e) {
if (namesake) { if (namesake) {
if (namesake.removed) { if (namesake.removed) {
alertify.notify( alertify.notify(
"Un élément de ce nom existe dans la corbeille !", _("An element with this name already exist in the trash!"),
"error", "error",
5 5
); );
} else { } 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; return;
} }
@ -656,8 +660,8 @@ on_delete_thing_btn_click = function (event) {
if (cat) { if (cat) {
var thing = event.data.thing.label; var thing = event.data.thing.label;
alertify.confirm( alertify.confirm(
`Suppression de l'élément ${thing}`, _("Delete the element %s", thing),
`Voulez-vous vraiment supprimer l'élément ${thing} ?`, _("Are-you sure you want to delete the element %s?", thing),
function (data) { function (data) {
cat.removeThing(thing); cat.removeThing(thing);
scases.save(); scases.save();
@ -678,8 +682,8 @@ on_restore_thing_btn_click = function (event) {
if (cat) { if (cat) {
var thing = event.data.thing.label; var thing = event.data.thing.label;
alertify.confirm( alertify.confirm(
`Restauration de l'élément ${thing}`, _("Restore the element %s", thing),
`Voulez-vous vraiment restaurer l'élément ${thing} ?`, _("Are-you sure you want to restore the element %s?", thing),
function (data) { function (data) {
cat.restoreThing(thing); cat.restoreThing(thing);
scases.save(); scases.save();
@ -698,7 +702,7 @@ on_restore_thing_btn_click = function (event) {
show_cat = function (scase, cat, displayed) { show_cat = function (scase, cat, displayed) {
var panel = $('<div class="panel panel-default"></div>'); var panel = $('<div class="panel panel-default"></div>');
var panel_heading = $('<div class="panel-heading" role="tab"></div>'); var panel_heading = $('<div class="panel-heading" role="tab"></div>');
var panel_title = $('<h4 class="panel-title">' + cat.name + " </h4>"); var panel_title = $(`<h4 class="panel-title">${cat.name}</h4>`);
panel_title.data("scase", scase); panel_title.data("scase", scase);
panel_title.data("cat", cat); panel_title.data("cat", cat);
panel_title.bind("click", on_title_click); panel_title.bind("click", on_title_click);
@ -712,9 +716,7 @@ show_cat = function (scase, cat, displayed) {
) )
); );
} else { } else {
tag.append( tag.append($(`<span class="badge">${stats.done} / ${stats.things}</span>`));
$('<span class="badge">' + stats.done + " / " + stats.things + "</span>")
);
} }
var delete_btn = $( var delete_btn = $(
@ -739,20 +741,17 @@ show_cat = function (scase, cat, displayed) {
if (displayed) { if (displayed) {
panel_collapse.addClass("in"); panel_collapse.addClass("in");
} }
var ul = $('<ul class="list-group" data-cat="' + cat.name + '"></ul>'); var ul = $(`<ul class="list-group" data-cat="${cat.name}"></ul>`);
for (idx in cat.things) { for (idx in cat.things) {
if (cat.things[idx].removed) { if (cat.things[idx].removed) {
continue; continue;
} }
var li = $( var li = $(
'<li class="list-group-item checkable" data-label="' + `<li class="list-group-item checkable" data-label="${cat.things[idx].label}">` +
cat.things[idx].label + `${cat.things[idx].label}</li>`
'">' +
cat.things[idx].label +
"</li>"
); );
if (cat.things[idx].nb > 1) { if (cat.things[idx].nb > 1) {
li.append(" <em>(" + cat.things[idx].nb + ")</em>"); li.append(` <em>(${cat.things[idx].nb})</em>`);
} }
if (cat.things[idx].checked) { if (cat.things[idx].checked) {
li.addClass("checked"); li.addClass("checked");
@ -786,7 +785,9 @@ show_cat = function (scase, cat, displayed) {
ul.append(li); ul.append(li);
} }
var li = $( var li = $(
'<li class="list-group-item"><span class="glyphicon glyphicon-plus-sign"></span> Ajouter un élément</li>' `<li class="list-group-item"><span class="glyphicon glyphicon-plus-sign"></span> ${_(
"Add an element"
)}</li>`
); );
li.bind("click", on_li_add_click); li.bind("click", on_li_add_click);
ul.append(li); ul.append(li);
@ -797,11 +798,8 @@ show_cat = function (scase, cat, displayed) {
show_scase = function (scase, display_cat) { show_scase = function (scase, display_cat) {
clear_page( clear_page(
'<h3><span class="glyphicon glyphicon-briefcase" aria-hidden="true"></span> ' + `<h3><span class="glyphicon glyphicon-briefcase" aria-hidden="true"></span> ${scase.name}</h3>` +
scase.name + `<div class="panel-group" id="cats" role="tablist" aria-multiselectable="true" data-scase="${scase.name}"></div>`
'</h3><div class="panel-group" id="cats" role="tablist" aria-multiselectable="true" data-scase="' +
scase.name +
'"></div>'
); );
scase.cats.each(function (idx, cat) { scase.cats.each(function (idx, cat) {
if (cat.removed) { if (cat.removed) {
@ -824,11 +822,11 @@ on_back_to_scases_btn_click = function (e) {
*******************/ *******************/
show_scase_trash = function (scase, display_cat) { show_scase_trash = function (scase, display_cat) {
clear_page( clear_page(
'<h3><span class="glyphicon glyphicon-trash" aria-hidden="true"></span>' + `<h3><span class="glyphicon glyphicon-trash" aria-hidden="true"></span> ${
scase.name + scase.name
' : Corbeille <button class="btn btn-default btn-xs" id="back_btn"><span class="glyphicon glyphicon-arrow-left"></button></h3><div class="panel-group" id="cats" role="tablist" aria-multiselectable="true" data-scase="' + } - ${_("Trash")}` +
scase.name + ' <button class="btn btn-default btn-xs" id="back_btn"><span class="glyphicon glyphicon-arrow-left"></button>' +
'"></div>' `</h3><div class="panel-group" id="cats" role="tablist" aria-multiselectable="true" data-scase="${scase.name}"></div>`
); );
$("#content h3 #back_btn").bind("click", { scase: scase }, function (event) { $("#content h3 #back_btn").bind("click", { scase: scase }, function (event) {
@ -839,7 +837,7 @@ show_scase_trash = function (scase, display_cat) {
show_cat_trash(scase, cat, cat.name == display_cat); show_cat_trash(scase, cat, cat.name == display_cat);
}); });
if ($("#cats .panel").length == 0) { if ($("#cats .panel").length == 0) {
$("#content").append('<p class="center">La corbeille est vide.</p>'); $("#content").append(`<p class="center">${_("The trash is empty.")}</p>`);
} }
set_location(scase.name, display_cat, "trash"); set_location(scase.name, display_cat, "trash");
show_menu("scase"); show_menu("scase");
@ -848,7 +846,7 @@ show_scase_trash = function (scase, display_cat) {
show_cat_trash = function (scase, cat, displayed) { show_cat_trash = function (scase, cat, displayed) {
var panel = $('<div class="panel panel-default"></div>'); var panel = $('<div class="panel panel-default"></div>');
var panel_heading = $('<div class="panel-heading" role="tab"></div>'); var panel_heading = $('<div class="panel-heading" role="tab"></div>');
var panel_title = $('<h4 class="panel-title">' + cat.name + " </h4>"); var panel_title = $(`<h4 class="panel-title">${cat.name}</h4>`);
panel_title.data("scase", scase); panel_title.data("scase", scase);
panel_title.data("cat", cat); panel_title.data("cat", cat);
panel_title.data("trash", true); panel_title.data("trash", true);
@ -862,7 +860,7 @@ show_cat_trash = function (scase, cat, displayed) {
if (cat.removed) { if (cat.removed) {
var stats = cat.stats(); var stats = cat.stats();
tag.append($('<span class="badge">' + stats.things + "</span>")); tag.append($(`<span class="badge">${stats.things}</span>`));
var restore_btn = $( var restore_btn = $(
'<button class="btn btn-default btn-xs pull-right"><span class="glyphicon glyphicon-ok"></button>' '<button class="btn btn-default btn-xs pull-right"><span class="glyphicon glyphicon-ok"></button>'
@ -880,7 +878,7 @@ show_cat_trash = function (scase, cat, displayed) {
return true; return true;
} }
panel_title.bind("click", on_title_click); panel_title.bind("click", on_title_click);
tag.append($('<span class="badge">' + deleted_things.length + "</span>")); tag.append($(`<span class="badge">${deleted_things.length}</span>`));
var panel_collapse = $( var panel_collapse = $(
'<div class="panel-collapse collapse" role="tabpanel"></div>' '<div class="panel-collapse collapse" role="tabpanel"></div>'
@ -888,14 +886,10 @@ show_cat_trash = function (scase, cat, displayed) {
if (displayed) { if (displayed) {
panel_collapse.addClass("in"); panel_collapse.addClass("in");
} }
var ul = $('<ul class="list-group" data-cat="' + cat.name + '"></ul>'); var ul = $(`<ul class="list-group" data-cat="${cat.name}"></ul>`);
for (idx in deleted_things) { for (idx in deleted_things) {
var li = $( var li = $(
'<li class="list-group-item" data-label="' + `<li class="list-group-item" data-label="${deleted_things[idx].label}">${deleted_things[idx].label}</li>`
deleted_things[idx].label +
'">' +
deleted_things[idx].label +
"</li>"
); );
var li_actions = $('<span class="actions pull-right"></span>'); var li_actions = $('<span class="actions pull-right"></span>');
@ -930,7 +924,9 @@ on_back_to_scase_btn_click = function (e) {
* Show scases * Show scases
*******************/ *******************/
show_scases = function () { show_scases = function () {
clear_page('<h3>Vos valises</h3><ul class="list-group" id="scases"></ul>'); clear_page(
`<h3>${_("Your suitcases")}</h3><ul class="list-group" id="scases"></ul>`
);
scases.each(function (idx, scase) { scases.each(function (idx, scase) {
if (scase.removed) { if (scase.removed) {
return; return;
@ -941,19 +937,14 @@ show_scases = function () {
tag += tag +=
'<span class="label label-success"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span></span>'; '<span class="label label-success"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span></span>';
} else { } else {
tag += tag += `<span class="badge">${stats.done} / ${stats.things}</span>`;
'<span class="badge">' + stats.done + " / " + stats.things + "</span>";
} }
tag += "</span>"; tag += "</span>";
var li = $( var li = $(
'<li class="list-group-item" data-name="' + `<li class="list-group-item" data-name="${scase.name}"><span class="scase-name">` +
scase.name + '<span class="glyphicon glyphicon-briefcase" aria-hidden="true"></span> ' +
'"><span class="scase-name"><span class="glyphicon glyphicon-briefcase" aria-hidden="true"></span> ' + `${scase.name}</span>${tag}</li>`
scase.name +
"</span>" +
tag +
"</li>"
); );
li.bind("click", on_scase_click); li.bind("click", on_scase_click);
$("#scases").append(li); $("#scases").append(li);
@ -973,7 +964,9 @@ on_scase_click = function (event) {
*******************/ *******************/
show_scases_trash = function () { show_scases_trash = function () {
clear_page( clear_page(
'<h3>Corbeille <button class="btn btn-default btn-xs" id="back_btn"><span class="glyphicon glyphicon-arrow-left"></button></h3><ul class="list-group" id="scases"></ul>' `<h3>${_("Trash")} <button class="btn btn-default btn-xs" id="back_btn">` +
'<span class="glyphicon glyphicon-arrow-left"></button></h3>' +
'<ul class="list-group" id="scases"></ul>'
); );
$("#content h3 #back_btn").bind("click", function (event) { $("#content h3 #back_btn").bind("click", function (event) {
show_scases(); show_scases();
@ -985,7 +978,7 @@ show_scases_trash = function () {
} }
var stats = scase.stats(); var stats = scase.stats();
var tags = $('<span class="count-tag pull-right"></span>'); var tags = $('<span class="count-tag pull-right"></span>');
tags.append('<span class="badge">' + stats.things + "</span>"); tags.append(`<span class="badge">${stats.things}</span>`);
var restore_btn = $( var restore_btn = $(
'<button class="btn btn-default btn-xs pull-right"><span class="glyphicon glyphicon-ok"></button>' '<button class="btn btn-default btn-xs pull-right"><span class="glyphicon glyphicon-ok"></button>'
@ -994,18 +987,16 @@ show_scases_trash = function () {
tags.append(restore_btn); tags.append(restore_btn);
var li = $( var li = $(
'<li class="list-group-item" data-name="' + `<li class="list-group-item" data-name="${scase.name}"><span class="scase-name">` +
scase.name + '<span class="glyphicon glyphicon-briefcase" aria-hidden="true"></span> ' +
'"><span class="scase-name"><span class="glyphicon glyphicon-briefcase" aria-hidden="true"></span> ' + `${scase.name}</span></li>`
scase.name +
"</span></li>"
); );
li.append(tags); li.append(tags);
$("#scases").append(li); $("#scases").append(li);
}); });
if ($("#scases li").length == 0) { if ($("#scases li").length == 0) {
$("#content").append( $("#content").append(
'<p class="center">Aucune valise dans la corbeille.</p>' `<p class="center">${_("No suitcase in the trash.")}</p>`
); );
} }
show_menu("scases"); show_menu("scases");
@ -1030,7 +1021,7 @@ clear_page = function (new_content) {
***********************/ ***********************/
show_menu = function (menu) { show_menu = function (menu) {
$(".menu").css("display", "none"); $(".menu").css("display", "none");
$(".menu-" + menu).css("display", "block"); $(`.menu-${menu}`).css("display", "block");
}; };
/******************* /*******************
@ -1060,8 +1051,8 @@ navbar_collapse_hide = function () {
clear_local_data = function () { clear_local_data = function () {
navbar_collapse_hide(); navbar_collapse_hide();
alertify.confirm( alertify.confirm(
"Suppression de toutes les données locales", _("Delete all local data"),
"Etes-vous sûre de vouloir supprimer les données locales (action irréversible) ?", _("Are-you sure you want to delete all local data (irreversible action)?"),
on_confirm_clear_local_data, on_confirm_clear_local_data,
null null
); );
@ -1078,8 +1069,10 @@ on_confirm_clear_local_data = function (data) {
load_example_data = function () { load_example_data = function () {
navbar_collapse_hide(); navbar_collapse_hide();
alertify.confirm( alertify.confirm(
"Chargement des données d'exemple", _("Loading example data"),
"Etes-vous sûre de vouloir charger les données d'exemple à la place de vos propres données (action irréversible) ?", _(
"Are-you sure you want to load example data in place of your own local data (irreversible action)?"
),
function () { function () {
delete localStorage.scases; delete localStorage.scases;
scases = new SCaseList(); scases = new SCaseList();
@ -1098,7 +1091,7 @@ export_local_data = function () {
navbar_collapse_hide(); navbar_collapse_hide();
$("#export_local_data").attr( $("#export_local_data").attr(
"href", "href",
"data:application/json;base64," + btoa(JSON.stringify(scases.export())) `data:application/json;base64,${btoa(JSON.stringify(scases.export()))}`
); );
}; };
@ -1128,33 +1121,41 @@ import_local_data = function () {
data = JSON.parse(json_data); data = JSON.parse(json_data);
} catch (e) { } catch (e) {
pleaseWaitHide(); pleaseWaitHide();
alertify.notify("Impossible de décodé le fichier.", "error", 5); alertify.notify(_("Failed to decode JSON file."), "error", 5);
return; return;
} }
pleaseWaitHide(); pleaseWaitHide();
alertify.confirm( alertify.confirm(
"Importation depuis un fichier", _("Import from file"),
"Etes-vous sûre de vouloir écraser vos données locales par celle issues de ce fichier ?", _(
"Are-you sure you want to overwrite your local data with the data from this file (irreversible action)?"
),
function () { function () {
var backData = scases.export(); var backData = scases.export();
scases = new SCaseList(); scases = new SCaseList();
if (scases.loadFromJsonData(data)) { if (scases.loadFromJsonData(data)) {
alertify.notify("Le fichier a bien été importé.", "success", 3); alertify.notify(
_("The file has been imported successfully."),
"success",
3
);
} else { } else {
alertify.notify( alertify.notify(
"Une erreur est survenue en chargeant ce fichier. Restauration des données précédentes...", _(
"An error occurred loading this file. Restoring previous data..."
),
"error", "error",
5 5
); );
if (scases.loadFromJsonData(backData)) { if (scases.loadFromJsonData(backData)) {
alertify.notify( alertify.notify(
"Les données précédentes ont bien été restaurées.", _("Previous data has been restored successfully."),
"success", "success",
5 5
); );
} else { } else {
alertify.notify( alertify.notify(
"Une erreur est survenue en restaurant les données précédentes.", _("An error occurred restoring previous data."),
"error", "error",
5 5
); );
@ -1200,7 +1201,7 @@ on_valid_login_modal = function (e) {
var password = $("#login_password").val(); var password = $("#login_password").val();
if (!username || !password) { if (!username || !password) {
alertify.notify( alertify.notify(
"Vous devez saisir votre nom d'utilisateur et votre mot de passe !", _("You have to enter your username and password!"),
"error", "error",
5 5
); );
@ -1218,15 +1219,15 @@ on_valid_login_modal = function (e) {
user.save(); user.save();
$("#login_modal").modal("hide"); $("#login_modal").modal("hide");
show_user(); show_user();
alertify.notify("Connecté.", "success", 3); alertify.notify(_("Connected."), "success", 3);
propose_sync_local_data(); propose_sync_local_data();
} else { } else {
alertify.notify("Nom d'utilisateur ou mot de passe.", "error", 5); alertify.notify(_("Invalid username or password."), "error", 5);
} }
}) })
.fail(function () { .fail(function () {
alertify.notify( alertify.notify(
"Une erreur est survenue en vous identifiant. Merci de réessayer ultèrieument.", _("An error occurred logging in. Please try again later."),
"error", "error",
5 5
); );
@ -1234,7 +1235,7 @@ on_valid_login_modal = function (e) {
}; };
on_show_login_modal = function () { on_show_login_modal = function () {
$("#login_username").val(user.username ? user.username : ""); $("#login_username").val(user.username || "");
if (user.username) $("#login_password").focus(); if (user.username) $("#login_password").focus();
else $("#login_username").focus(); else $("#login_username").focus();
}; };
@ -1247,8 +1248,8 @@ on_logout_button_click = function () {
if (!user.connected()) return; if (!user.connected()) return;
navbar_collapse_hide(); navbar_collapse_hide();
alertify.confirm( alertify.confirm(
"Déconnexion", _("Logout"),
"Voulez-vous vraiment vous déconnecter ?", _("Do you really want to log out?"),
function (data) { function (data) {
$.post("logout", { $.post("logout", {
username: user.username, username: user.username,
@ -1259,10 +1260,10 @@ on_logout_button_click = function () {
user.reset(); user.reset();
user.save(); user.save();
show_user(); show_user();
alertify.notify("Déconnecté.", "success", 3); alertify.notify(_("Logged out"), "success", 3);
} else { } else {
alertify.notify( alertify.notify(
"Une erreur est survenue en vous déconnectant. Merci de réessayer ultèrieument.", _("An error occurred logging you out. Please try again later."),
"error", "error",
5 5
); );
@ -1270,7 +1271,7 @@ on_logout_button_click = function () {
}) })
.fail(function () { .fail(function () {
alertify.notify( alertify.notify(
"Une erreur est survenue en vous déconnectant. Merci de réessayer ultèrieument.", _("An error occurred logging you out. Please try again later."),
"error", "error",
5 5
); );
@ -1303,23 +1304,25 @@ sync_local_data = function (callback) {
scases = new SCaseList(); scases = new SCaseList();
if (scases.loadFromJsonData(data)) { if (scases.loadFromJsonData(data)) {
scases.save(); scases.save();
alertify.notify("Données synchronisées.", "success", 3); alertify.notify(_("Data synchronized."), "success", 3);
if (callback) callback(true); if (callback) callback(true);
} else { } else {
alertify.notify( alertify.notify(
"Une erreur est survenue en chargeant les données issues du serveur. Restauration des données précédentes...", _(
"An error occurred loading data from the server. Restoring previous data..."
),
"error", "error",
5 5
); );
if (scases.loadFromJsonData(backData)) { if (scases.loadFromJsonData(backData)) {
alertify.notify( alertify.notify(
"Les données précédentes ont bien été restaurées.", _("Previous data has been restored successfully."),
"success", "success",
5 5
); );
} else { } else {
alertify.notify( alertify.notify(
"Une erreur est survenue en restaurant les données précédentes.", _("An error occurred restoring previous data."),
"error", "error",
5 5
); );
@ -1328,7 +1331,9 @@ sync_local_data = function (callback) {
} }
} else { } else {
alertify.notify( alertify.notify(
"Une erreur est survenue en synchronisant vos données. Merci de réessayer ultèrieument.", _(
"An error occurred synchronizing your data. Please try again later."
),
"error", "error",
5 5
); );
@ -1341,14 +1346,16 @@ sync_local_data = function (callback) {
user.save(); user.save();
show_user(); show_user();
alertify.notify( alertify.notify(
"Votre session semble avoir expirée, merci de vous réauthentifier.", _("Your session appears to have expired, please re-authenticate."),
"error", "error",
8 8
); );
$("#login_modal").modal("show"); $("#login_modal").modal("show");
} else { } else {
alertify.notify( alertify.notify(
"Une erreur est survenue en synchronisant vos données. Merci de réessayer ultèrieument.", _(
"An error occurred synchronizing your data. Please try again later."
),
"error", "error",
5 5
); );
@ -1366,7 +1373,7 @@ on_sync_local_data_btn_click = function () {
navbar_collapse_hide(); navbar_collapse_hide();
if (!is_connected()) { if (!is_connected()) {
alertify.notify( alertify.notify(
"Vous devez vous connecter avant de pouvoir synchroniser vos données.", _("You must sign in before you can sync your data."),
"error", "error",
5 5
); );
@ -1380,8 +1387,8 @@ on_sync_local_data_btn_click = function () {
}; };
propose_sync_local_data = function () { propose_sync_local_data = function () {
alertify.confirm( alertify.confirm(
"Synchronisation de vos valises depuis le serveur", _("Synchronize your suitcases from server"),
"Voulez-vous synchroniser vos valises depuis le serveur ?", _("Are-you sure you want to synchronize your suitcases from server?"),
function () { function () {
pleaseWaitShow(); pleaseWaitShow();
sync_local_data(function (success) { sync_local_data(function (success) {
@ -1444,8 +1451,8 @@ on_welcome_annonymous_click = function () {
propose_example_data = function () { propose_example_data = function () {
alertify.confirm( alertify.confirm(
"Un exemple de valise ?", _("An example of a suitcase?"),
"Souhaitez-vous charger un exemple de valise pour commencer ?", _("Would you like to load a sample suitcase to get started?"),
function () { function () {
scases.importExampleData(); scases.importExampleData();
scases.save(); scases.save();
@ -1461,7 +1468,9 @@ propose_example_data = function () {
$(document).ready(function () { $(document).ready(function () {
if (typeof localStorage === "undefined") { if (typeof localStorage === "undefined") {
alertify.notify( alertify.notify(
"Votre navigateur internet ne support pas le stockage de données locale. Vous ne pouvez donc malheureusment pas utiliser cette application.", _(
"Your internet browser does not support local data storage. Therefore, unfortunately you cannot use this application."
),
"error", "error",
5 5
); );
@ -1549,8 +1558,8 @@ $(document).ready(function () {
case false: case false:
alertify.confirm( alertify.confirm(
"Erreur en chargeant les données locales", _("Error loading local data"),
"Une erreur est survenue en chargeant les données locales. On les purges ?", _("An error occurred while loading local data. Should we purge it?"),
function (data) { function (data) {
delete localStorage.scases; delete localStorage.scases;
location.reload(); location.reload();

View file

@ -7,17 +7,18 @@ function SCaseList() {
Papier: { Papier: {
color: "#f00", color: "#f00",
things: [ things: [
{ label: "Papier blanc", nb: 1 }, { label: _("White paper"), nb: 1 },
{ label: "Stylo", nb: 3 }, { label: _("Pen"), nb: 3 },
{ label: "Carte d'identité", nb: 1 }, { label: _("ID card/passport"), nb: 1 },
], ],
}, },
Multimédia: { Multimédia: {
color: "#0f0", color: "#0f0",
things: [ things: [
{ label: "Montre", nb: 1 }, { label: _("Watch"), nb: 1 },
{ label: "Chargeur montre", nb: 1 }, { label: _("Watch charger"), nb: 1 },
{ label: "PC portable", nb: 1 }, { label: _("Laptop"), nb: 1 },
{ label: _("Laptop charger"), nb: 1 },
], ],
}, },
}, },
@ -281,7 +282,7 @@ function SCase(uuid, name, data) {
}; };
/* /*
* Contructor * Constructor
*/ */
if (jQuery.type(data) == "object") { if (jQuery.type(data) == "object") {
try { try {
@ -289,9 +290,10 @@ function SCase(uuid, name, data) {
} catch (e) { } catch (e) {
console.log(e); console.log(e);
alert( alert(
"Une erreur est survenue en chargeant la valise " + _(
this.name + "An error occurred while loading the %s suitcase from the cache.",
" depuis le cache" this.name
)
); );
} }
} }
@ -404,7 +406,7 @@ function CatList(data) {
}; };
/* /*
* Contructor * Constructor
*/ */
if (jQuery.type(data) == "object") { if (jQuery.type(data) == "object") {
try { try {
@ -412,7 +414,7 @@ function CatList(data) {
} catch (e) { } catch (e) {
console.log(e); console.log(e);
alert( alert(
"Une erreur est survenue en chargeant la liste de catégorie depuis le cache" _("An error occurred while loading the category list from the cache.")
); );
} }
} }
@ -551,7 +553,7 @@ function Cat(uuid, name, color, data) {
}; };
/* /*
* Contructor * Constructor
*/ */
if (jQuery.type(data) == "object") { if (jQuery.type(data) == "object") {
try { try {
@ -559,9 +561,10 @@ function Cat(uuid, name, color, data) {
} catch (e) { } catch (e) {
console.log(e); console.log(e);
alert( alert(
"Une erreur est survenue en chargeant la catégorie catégorie " + _(
this.name + "An error occurred while loading the %s category from the cache.",
" depuis le cache" this.name
)
); );
} }
} }
@ -630,9 +633,7 @@ function User() {
this.name = data.name; this.name = data.name;
this.token = data.token; this.token = data.token;
} catch (e) { } catch (e) {
alert( alert(_("Error loading your login information. Please log in again."));
"Erreur en chargeant vos informations de connexion. Merci de vous reconnecter."
);
} }
}; };

View file

@ -36,39 +36,43 @@
</div> </div>
<div class="collapse navbar-collapse" id="navbar-top-collapse"> <div class="collapse navbar-collapse" id="navbar-top-collapse">
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">
<li class="menu menu-scases"><a href="#add_scase" id="add_scase_btn"><span class="glyphicon glyphicon-plus-sign"></span> Ajouter une valise</a></li> <li class="menu menu-scases"><a href="#add_scase" id="add_scase_btn"><span class="glyphicon glyphicon-plus-sign"></span> {t}Add a suitcase{/t}</a></li>
<li class="menu menu-scases"><a href="#scases_trash" id="scases_trash_btn"><span class="glyphicon glyphicon-trash"></span> Voir la corbeille</a></li> <li class="menu menu-scases"><a href="#scases_trash" id="scases_trash_btn"><span class="glyphicon glyphicon-trash"></span> {t}Show trash{/t}</a></li>
<li class="menu menu-scase"><a href="#scases" id="back_to_scases"><span class="glyphicon glyphicon-briefcase"></span> Liste des valises</a></li> <li class="menu menu-scase"><a href="#scases" id="back_to_scases"><span class="glyphicon glyphicon-briefcase"></span> {t}Suitcases list{/t}</a></li>
<li class="menu menu-scase dropdown"> <li class="menu menu-scase dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class='glyphicon glyphicon-tag'></span> Gérer la valise <b class="caret"></b></a> <a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class='glyphicon glyphicon-tag'></span> {t}Manage the suitcase{/t} <b class="caret"></b></a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="#add_cat" id="add_cat_btn"><span class="glyphicon glyphicon-plus-sign"></span> Ajouter une catégorie</a></li> <li><a href="#add_cat" id="add_cat_btn"><span class="glyphicon glyphicon-plus-sign"></span> {t}Add a category{/t}</a></li>
<li class="divider"></li> <li class="divider"></li>
<li><a href="#rename_scase" id="rename_scase_btn"><span class="glyphicon glyphicon-edit"></span> Renommer la valise</a></li> <li><a href="#rename_scase" id="rename_scase_btn"><span class="glyphicon glyphicon-edit"></span> {t}Rename the suitcase{/t}</a></li>
<li><a href="#copy_scase" id="copy_scase_btn"><span class="glyphicon glyphicon-duplicate"></span> Copier la valise</a></li> <li><a href="#copy_scase" id="copy_scase_btn"><span class="glyphicon glyphicon-duplicate"></span> {t}Copy the suitcase{/t}</a></li>
<li><a href="#reset_scase" id="reset_scase_btn"><span class="glyphicon glyphicon-cog"></span> Réinitialiser la valise</a></li> <li><a href="#reset_scase" id="reset_scase_btn"><span class="glyphicon glyphicon-cog"></span> {t}Reset the suitcase{/t}</a></li>
<li><a href="#delete_scase" id="delete_scase_btn"><span class="glyphicon glyphicon-trash"></span> Supprimer la valise</a></li> <li><a href="#delete_scase" id="delete_scase_btn"><span class="glyphicon glyphicon-trash"></span> {t}Delete the suitcase{/t}</a></li>
<li class="divider"></li> <li class="divider"></li>
<li><a href="#scase_trash" id="scase_trash_btn"><span class="glyphicon glyphicon-trash"></span> Voir la corbeille de la valise</a></li> <li><a href="#scase_trash" id="scase_trash_btn"><span class="glyphicon glyphicon-trash"></span> {t}Show suitcase's trash{/t}</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class='glyphicon glyphicon-hdd'></span> Gérer vos données <b class="caret"></b></a> <a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class='glyphicon glyphicon-hdd'></span> {t}Manage data{/t} <b class="caret"></b></a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a id='export_local_data' href='#' download='mysc_export.json'><span class='glyphicon glyphicon-save'></span> Sauvegarder vos données</a></li> <li><a id='export_local_data' href='#' download='mysc_export.json'><span class='glyphicon glyphicon-save'></span> {t}Backup your data{/t}</a></li>
<li><a id='import_local_data' href='#' download='mysc_export.json'><span class='glyphicon glyphicon-open'></span> Restaurer vos données</a></li> <li><a id='import_local_data' href='#' download='mysc_export.json'><span class='glyphicon glyphicon-open'></span> {t}Restaure your data{/t}</a></li>
<li class="divider"></li> <li class="divider"></li>
<li><a id='sync_local_data'><span class='glyphicon glyphicon-refresh'></span> Synchroniser les données locales</a></li> <li><a id='sync_local_data'><span class='glyphicon glyphicon-refresh'></span> {t}Synchronize local data{/t}</a></li>
<li class="divider"></li> <li class="divider"></li>
<li><a id='clear_local_data'><span class='glyphicon glyphicon-trash'></span> Purger les données locales</a></li> <li><a id='clear_local_data'><span class='glyphicon glyphicon-trash'></span> {t}Purge local data{/t}</a></li>
<li><a id='load_example_data'><span class='glyphicon glyphicon-trash'></span> Charger les données d'exemple</a></li> <li><a id='load_example_data'><span class='glyphicon glyphicon-trash'></span> {t}Load example data{/t}</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class='glyphicon glyphicon-user'></span> <span id="username"></span> <b class="caret"></b></a> <a href="#" class="dropdown-toggle" data-toggle="dropdown">
<span class='glyphicon glyphicon-user'></span>
<span id="username"></span>
<b class="caret"></b>
</a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a id='login' href='#'><span class='glyphicon glyphicon-loging'></span> Connexion</a></li> <li><a id='login' href='#'><span class='glyphicon glyphicon-loging'></span> {t}Login{/t}</a></li>
<li><a id='logout' href='#'><span class='glyphicon glyphicon-logout'></span> Déconnexion</a></li> <li><a id='logout' href='#'><span class='glyphicon glyphicon-logout'></span> {t}Logout{/t}</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@ -84,18 +88,18 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">Ajouter une valise</h4> <h4 class="modal-title">{t}Add a suitcase{/t}</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form class="form-horizontal" role="form"> <form class="form-horizontal" role="form">
<div class="form-group"> <div class="form-group">
<input type='text' id='add_scase_name' class="form-control" placeholder="Nom de la valise"/> <input type='text' id='add_scase_name' class="form-control" placeholder="{t}Suitcase name{/t}"/>
</div> </div>
</form> </form>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Annuler</button> <button type="button" class="btn btn-default" data-dismiss="modal">{t}Cancel{/t}</button>
<button type="button" class="btn btn-primary" id='add_scase_submit'>Ajouter</button> <button type="button" class="btn btn-primary" id='add_scase_submit'>{t}Add{/t}</button>
</div> </div>
</div><!-- /.modal-content --> </div><!-- /.modal-content -->
</div><!-- /.modal-dialog --> </div><!-- /.modal-dialog -->
@ -106,18 +110,18 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">Copier une valise</h4> <h4 class="modal-title">{t}Copy the suitcase{/t}</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form class="form-horizontal" role="form"> <form class="form-horizontal" role="form">
<div class="form-group"> <div class="form-group">
<input type='text' id='copy_scase_name' class="form-control" placeholder="Nom de la nouvelle valise"/> <input type='text' id='copy_scase_name' class="form-control" placeholder="{t}Name of the new suitcase{/t}"/>
</div> </div>
</form> </form>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Annuler</button> <button type="button" class="btn btn-default" data-dismiss="modal">{t}Cancel{/t}</button>
<button type="button" class="btn btn-primary" id='copy_scase_submit'>Copier</button> <button type="button" class="btn btn-primary" id='copy_scase_submit'>{t}Copy{/t}</button>
</div> </div>
</div><!-- /.modal-content --> </div><!-- /.modal-content -->
</div><!-- /.modal-dialog --> </div><!-- /.modal-dialog -->
@ -128,18 +132,18 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">Renomer la valise</h4> <h4 class="modal-title">{t}Rename the suitcase{/t}</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form class="form-horizontal" role="form"> <form class="form-horizontal" role="form">
<div class="form-group"> <div class="form-group">
<input type='text' id='rename_scase_name' class="form-control" placeholder="Nom de la nouvelle valise"/> <input type='text' id='rename_scase_name' class="form-control" placeholder="{t}New suitcase name{/t}"/>
</div> </div>
</form> </form>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Annuler</button> <button type="button" class="btn btn-default" data-dismiss="modal">{t}Cancel{/t}</button>
<button type="button" class="btn btn-primary" id='rename_scase_submit'>Renomer</button> <button type="button" class="btn btn-primary" id='rename_scase_submit'>{t}Rename{/t}</button>
</div> </div>
</div><!-- /.modal-content --> </div><!-- /.modal-content -->
</div><!-- /.modal-dialog --> </div><!-- /.modal-dialog -->
@ -150,18 +154,18 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">Ajouter une catégorie</h4> <h4 class="modal-title">{t}Add a category{/t}</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form class="form-horizontal" role="form"> <form class="form-horizontal" role="form">
<div class="form-group"> <div class="form-group">
<input type='text' id='add_cat_name' class="form-control" placeholder="Nom de la catégorie"/> <input type='text' id='add_cat_name' class="form-control" placeholder="{t}Category name{/t}"/>
</div> </div>
</form> </form>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Annuler</button> <button type="button" class="btn btn-default" data-dismiss="modal">{t}Cancel{/t}</button>
<button type="button" class="btn btn-primary" id='add_cat_submit'>Ajouter</button> <button type="button" class="btn btn-primary" id='add_cat_submit'>{t}Add{/t}</button>
</div> </div>
</div><!-- /.modal-content --> </div><!-- /.modal-content -->
</div><!-- /.modal-dialog --> </div><!-- /.modal-dialog -->
@ -172,18 +176,18 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">Renommer une catégorie</h4> <h4 class="modal-title">{t}Rename the category{/t}</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form class="form-horizontal" role="form"> <form class="form-horizontal" role="form">
<div class="form-group"> <div class="form-group">
<input type='text' id='rename_cat_name' class="form-control" placeholder="Nouveau nom de la catégorie"/> <input type='text' id='rename_cat_name' class="form-control" placeholder="{t}New category's name{/t}"/>
</div> </div>
</form> </form>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Annuler</button> <button type="button" class="btn btn-default" data-dismiss="modal">{t}Cancel{/t}</button>
<button type="button" class="btn btn-primary" id='rename_cat_submit'>Renommer</button> <button type="button" class="btn btn-primary" id='rename_cat_submit'>{t}Rename{/t}</button>
</div> </div>
</div><!-- /.modal-content --> </div><!-- /.modal-content -->
</div><!-- /.modal-dialog --> </div><!-- /.modal-dialog -->
@ -195,23 +199,23 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">Ajouter un élément</h4> <h4 class="modal-title">{t}Add an element{/t}</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form role="form"> <form role="form">
<div class="form-group"> <div class="form-group">
<input type='text' class='form-control add_thing_label' placeholder="Nom de l'élément"/> <input type='text' class='form-control add_thing_label' placeholder="{t}Element name{/t}"/>
<input type='number' class='form-control add_thing_nb' placeholder="Nb"/> <input type='number' class='form-control add_thing_nb' placeholder="{t}Nb{/t}"/>
</div> </div>
<div class="form-group"> <div class="form-group">
<input type='text' class='form-control add_thing_label' placeholder="Un autre ?"/> <input type='text' class='form-control add_thing_label' placeholder="{t}Another?{/t}"/>
<input type='number' class='form-control add_thing_nb' placeholder="Nb"/> <input type='number' class='form-control add_thing_nb' placeholder="{t}Nb{/t}"/>
</div> </div>
</form> </form>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Annuler</button> <button type="button" class="btn btn-default" data-dismiss="modal">{t}Cancel{/t}</button>
<button type="button" class="btn btn-primary" id='add_thing_submit'>Ajouter</button> <button type="button" class="btn btn-primary" id='add_thing_submit'>{t}Add{/t}</button>
</div> </div>
</div><!-- /.modal-content --> </div><!-- /.modal-content -->
</div><!-- /.modal-dialog --> </div><!-- /.modal-dialog -->
@ -222,19 +226,19 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">Modifier un élément</h4> <h4 class="modal-title">{t}Edit the element{/t}</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form class="form-horizontal" role="form"> <form class="form-horizontal" role="form">
<div class="form-group"> <div class="form-group">
<input type='text' id='edit_thing_label' class="form-control" placeholder="Nouveau nom de l'élément"/> <input type='text' id='edit_thing_label' class="form-control" placeholder="{t}Element name{/t}"/>
<input type='number' id='edit_thing_nb' class="form-control" placeholder="Nb"/> <input type='number' id='edit_thing_nb' class="form-control" placeholder="{t}Nb{/t}"/>
</div> </div>
</form> </form>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Annuler</button> <button type="button" class="btn btn-default" data-dismiss="modal">{t}Cancel{/t}</button>
<button type="button" class="btn btn-primary" id='edit_thing_submit'>Modifier</button> <button type="button" class="btn btn-primary" id='edit_thing_submit'>{t}Modify{/t}</button>
</div> </div>
</div><!-- /.modal-content --> </div><!-- /.modal-content -->
</div><!-- /.modal-dialog --> </div><!-- /.modal-dialog -->
@ -245,12 +249,12 @@
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h2 class="modal-title">Chargement...</h2> <h2 class="modal-title">{t}Loading...{/t}</h2>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div class="progress progress-striped active"> <div class="progress progress-striped active">
<div class="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%"> <div class="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%">
<span class="sr-only">Chargement...</span> <span class="sr-only">{t}Loading...{/t}</span>
</div> </div>
</div> </div>
</div> </div>
@ -264,19 +268,19 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">Connexion</h4> <h4 class="modal-title">{t}Connection{/t}</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form class="form-horizontal" role="form" action="login"> <form class="form-horizontal" role="form" action="login">
<div class="form-group"> <div class="form-group">
<input type='text' id='login_username' class="form-control" placeholder="Nom d'utilisateur" required/> <input type='text' id='login_username' class="form-control" placeholder="{t}Username{/t}" required/>
<input type='password' id='login_password' class="form-control" placeholder="Mot de passe" required/> <input type='password' id='login_password' class="form-control" placeholder="{t}Password{/t}" required/>
</div> </div>
</form> </form>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Annuler</button> <button type="button" class="btn btn-default" data-dismiss="modal">{t}Cancel{/t}</button>
<button type="button" class="btn btn-primary" id='login_submit'>Connexion</button> <button type="button" class="btn btn-primary" id='login_submit'>{t}Connect{/t}</button>
</div> </div>
</div><!-- /.modal-content --> </div><!-- /.modal-content -->
</div><!-- /.modal-dialog --> </div><!-- /.modal-dialog -->
@ -288,30 +292,39 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">Bienvenu</h4> <h4 class="modal-title">{t}Welcome{/t}</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p> {t escape=false}<p>
Cette application vous permet de gérer des listes de choses à ne pas oublier de glisser dans votre valise avant votre départ : This application allows you to manage lists of things not to forget to pack in your
suitcase before your departure:
<ul> <ul>
<li>Pour commencer, créer une valise, ajouter les catégories de choses que vous aurez à y glisser et ajouter y toutes ces choses.</li> <li>
<li>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> To get started, create a suitcase, add the categories of things you will need to
pack, and add all these things to it;
</li>
<li>
Before your departure, you can then gradually check off all the things you have
already gathered and ensure you don't forget anything!
</li>
</ul> </ul>
</p> </p>
<p> <p>
<strong>Note :</strong> Cette application a été conçue pour pouvoir fonctionner complètement localement. Les données manipulées (vos valises, ...) sont stockés <strong>Note:</strong> This application has been designed to work completely locally.
uniquement dans votre navigateur internet. Il est par ailleurs possible d'exporter/importer ces informations au format JSON.<br/> The data manipulated (your suitcases, etc.) is stored only in your internet browser.
Cependant, pour faciliter la gestion de vos valises depuis plusieurs appareils, il est possible de synchroniser ces informations sur le serveur. Pour cela, It is also possible to export/import this information in JSON format.<br/>
il vous faut un compte et à ce jour, les inscriptions ne sont pas ouvertes. 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.
</p> </p>
<p> <p>
Si vous disposez d'un compte, vous pouvez vous connecter en cliquant sur le bouton <em>Connexion</em> ci-dessous. If you have an account, you can log in by clicking the <em>Login</em> button below.
À défaut, cliquer sur le bouton <em>Utilisation annonyme</em> pour commencer à utiliser l'application. If not, click the <em>Anonymous usage</em> button to start using the application.
</p> </p>{/t}
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-primary" id='welcome_connect'>Connexion</button> <button type="button" class="btn btn-primary" id='welcome_connect'>{t}Connect{/t}</button>
<button type="button" class="btn btn-default" id='welcome_annonymous'>Utilisation annonyme</button> <button type="button" class="btn btn-default" id='welcome_annonymous'>{t}Anonymous usage{/t}</button>
</div> </div>
</div><!-- /.modal-content --> </div><!-- /.modal-content -->
</div><!-- /.modal-dialog --> </div><!-- /.modal-dialog -->
@ -323,9 +336,10 @@
<script src="{static_url path="lib/alertify/alertify.min.js"}"></script> <script src="{static_url path="lib/alertify/alertify.min.js"}"></script>
<script src="{static_url path="lib/bootstrap/js/bootstrap.js"}"></script> <script src="{static_url path="lib/bootstrap/js/bootstrap.js"}"></script>
<script> <!-- Other libs & JavaScript scripts -->
{foreach $js as $path}
</script> <script language="javascript" src="{$path|escape:"quotes"}"></script>
{/foreach}
<script src="{static_url path="lib/uuid.js"}"></script> <script src="{static_url path="lib/uuid.js"}"></script>
<script src="{static_url path="mysc_objects.js"}"></script> <script src="{static_url path="mysc_objects.js"}"></script>

View file

@ -1,12 +1,12 @@
{extends file='Tpl:empty.tpl'} {extends file='Tpl:empty.tpl'}
{block name="pagetitle"}{/block} {block name="pagetitle"}{/block}
{block name="content"} {block name="content"}
<h1>Page d'aide à l'assistance utilisateurs</h1> <h1>{t}Helpdesk page{/t}</h1>
<p>À leur demande, merci de télécharger et transmettre les informations ci-dessous au service support :</p> <p>{t}Upon request, please download and forward the following information to the support service:{/t}</p>
<div class="text-center mb-2"> <div class="text-center mb-2">
<a href="{$request->current_url}?download" class="btn btn-primary"> <a href="{$request->current_url}?download" class="btn btn-primary">
<i class="fa fa-download" aria-hidden="true"></i> <i class="fa fa-download" aria-hidden="true"></i>
Télécharger {t}Download{/t}
</a> </a>
</div> </div>
<pre class="text-bg-light p-3 copyable">{include file="Tpl:support_info_content.tpl"}</pre> <pre class="text-bg-light p-3 copyable">{include file="Tpl:support_info_content.tpl"}</pre>

View file

@ -1,8 +1,8 @@
URL de l'application : {$public_root_url} {t}Application URL:{/t} {$public_root_url}
URL de la page consultée : {$public_root_url}/{$request->current_url} {t}Current page URL:{/t} {$public_root_url}/{$request->current_url}
Utilisateur connecté : {$auth_user->username} {t}Connected user:{/t} {$auth_user->username}
Informations supplémentaires sur l'utilisateur : {t}Extra user information:{/t}
================================================ ================================================
{var_dump data=$auth_user->info} {var_dump data=$auth_user->info}