diff --git a/locale/cs/LC_MESSAGES/timetracker.mo b/locale/cs/LC_MESSAGES/timetracker.mo index 5f0b5af..91d33f1 100644 Binary files a/locale/cs/LC_MESSAGES/timetracker.mo and b/locale/cs/LC_MESSAGES/timetracker.mo differ diff --git a/locale/cs/LC_MESSAGES/timetracker.po b/locale/cs/LC_MESSAGES/timetracker.po index 5504da9..cf1331a 100644 --- a/locale/cs/LC_MESSAGES/timetracker.po +++ b/locale/cs/LC_MESSAGES/timetracker.po @@ -16,7 +16,7 @@ msgstr "Project-Id-Version: TimeControl\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" msgid "Edit current task" -msgstr "" +msgstr "Upravit aktuální úkol" msgid "Warning: Could not read {file}. Error: {error}" msgstr "Varování: Nelze přečíst soubor {file}. Chyba: {error}" @@ -80,7 +80,7 @@ msgid "Task '{name}' moved successfully." msgstr "Úkol '{name}' byl úspěšně přesunut." msgid "No project selected. Please start again." -msgstr "" +msgstr "Nebyl vybrán žádný projekt. Začněte prosím znovu." msgid "A project named '{name}' already exists." msgstr "Projekt s názvem '{name}' již existuje." @@ -114,7 +114,7 @@ msgstr "" "{parent_name}'." msgid "No open projects found." -msgstr "" +msgstr "Nebyly nalezeny žádné otevřené projekty." msgid "# Daily Time Report: {date}\n" msgstr "# Denní zpráva o čase: {date}\n" @@ -776,9 +776,6 @@ msgstr "Rozpis úkolů" msgid "{num_sessions} sessions" msgstr "{num_sessions} relací" -msgid "6. Detailed Daily Report" -msgstr "6. Podrobná denní zpráva" - msgid "\n--- Detailed Daily Report ---" msgstr "\n--- Podrobná denní zpráva ---" @@ -863,6 +860,21 @@ msgstr "Podrobná zpráva o úkolu" msgid "Detailed Project Report" msgstr "Podrobná zpráva o projektu" +msgid "Detailed Daily Report" +msgstr "Podrobná denní zpráva" + +msgid "Main Project Management" +msgstr "Hlavní správa projektů" + +msgid "Start work on task" +msgstr "Začít práci na úkolu" + +msgid "Show current work" +msgstr "Zobrazit aktuální práci" + +msgid "Stop current work" +msgstr "Zastavit aktuální práci" + msgid "Select Project" msgstr "Vybrat projekt" diff --git a/locale/de/LC_MESSAGES/timetracker.mo b/locale/de/LC_MESSAGES/timetracker.mo index be00872..c2912b3 100644 Binary files a/locale/de/LC_MESSAGES/timetracker.mo and b/locale/de/LC_MESSAGES/timetracker.mo differ diff --git a/locale/de/LC_MESSAGES/timetracker.po b/locale/de/LC_MESSAGES/timetracker.po index 4774f3e..37bddcc 100644 --- a/locale/de/LC_MESSAGES/timetracker.po +++ b/locale/de/LC_MESSAGES/timetracker.po @@ -1112,9 +1112,6 @@ msgstr "Aufschlüsselung nach Aufgaben" msgid "{num_sessions} sessions" msgstr "{num_sessions} Sitzungen" -msgid "6. Detailed Daily Report" -msgstr "6. Detaillierter Tagesbericht" - msgid "\n--- Detailed Daily Report ---" msgstr "\n--- Detaillierter Tagesbericht ---" @@ -1163,6 +1160,15 @@ msgstr "Detaillierter Projekt-Bericht" msgid "Detailed Daily Report" msgstr "Detaillierter Tagesbericht" +msgid "Exit" +msgstr "Beenden" + +msgid "Current Active Work" +msgstr "Aktuell laufende Arbeit" + +msgid "Demote Project to Task" +msgstr "Projekt zu Aufgabe herabstufen" + msgid "Change Language" msgstr "Sprache ändern" diff --git a/locale/es/LC_MESSAGES/timetracker.mo b/locale/es/LC_MESSAGES/timetracker.mo index 8f24d52..c793721 100644 Binary files a/locale/es/LC_MESSAGES/timetracker.mo and b/locale/es/LC_MESSAGES/timetracker.mo differ diff --git a/locale/es/LC_MESSAGES/timetracker.po b/locale/es/LC_MESSAGES/timetracker.po index f68ccdc..a2654d9 100644 --- a/locale/es/LC_MESSAGES/timetracker.po +++ b/locale/es/LC_MESSAGES/timetracker.po @@ -1428,14 +1428,14 @@ msgstr "Informe Detallado de Proyecto" msgid "Detailed Daily Report" msgstr "Informe Diario Detallado" -msgid "Change Language" -msgstr "Cambiar Idioma" +msgid "Main Project Management" +msgstr "Gestión de Proyectos Principales" -msgid "Restore Previous Version" -msgstr "Restaurar Versión Anterior" +msgid "Start work on task" +msgstr "Iniciar trabajo en tarea" -msgid "Change Data Storage Location" -msgstr "Cambiar Ubicación de Almacenamiento de Datos" +msgid "Handle projects and tasks" +msgstr "Gestionar proyectos y tareas" msgid "Select Action" msgstr "Seleccionar Acción" diff --git a/locale/fr/LC_MESSAGES/timetracker.po b/locale/fr/LC_MESSAGES/timetracker.po index 654e1da..97e912d 100644 --- a/locale/fr/LC_MESSAGES/timetracker.po +++ b/locale/fr/LC_MESSAGES/timetracker.po @@ -220,18 +220,27 @@ msgstr "Port mis à jour vers {port}. Veuillez redémarrer Streamlit pour que le msgid "Work started on '{task_name}' in project '{main_name}'." msgstr "Travail commencé sur '{task_name}' dans le projet '{main_name}'." +msgid "daily" +msgstr "quotidien" + msgid "1. Main Project Management" msgstr "1. Gestion des projets principaux" msgid "2. Task Management" msgstr "2. Gestion des tâches" +msgid "on all business days" +msgstr "tous les jours ouvrables" + msgid "1. Add Main Project" msgstr "1. Ajouter un projet principal" msgid "6. Demote Main-Project to Task" msgstr "6. Rétrograder un projet principal en tâche" +msgid "weekly" +msgstr "hebdomadaire" + #: TimeTracker.py:651 msgid "- {name}: {hours} hour" msgid_plural "- {name}: {hours} hours" @@ -239,6 +248,9 @@ msgstr[0] "- {name} : {hours} heure" msgstr[1] "- {name} : {hours} heures" #: TimeTracker.py:657 +msgid "monthly" +msgstr "mensuel" + msgid "## {name} ({hours} hour)\n" msgid_plural "## {name} ({hours} hours)\n" msgstr[0] "## {name} ({hours} heure)\n" @@ -248,6 +260,9 @@ msgstr[1] "## {name} ({hours} heures)\n" msgid "# Daily Time Report: {date}\n" msgstr "# Rapport de temps journalier : {date}\n" +msgid "userdefined" +msgstr "# Rapport de temps journalier : {date}\n" + #: TimeTracker.py:666 msgid "\n**Total Daily Time: {hours} hour**" msgid_plural "\n**Total Daily Time: {hours} hours**" @@ -258,6 +273,9 @@ msgstr[1] "\n**Temps total journalier : {hours} heures**" msgid "No time tracked for {date}." msgstr "Aucun temps suivi pour le {date}." +msgid "Days" +msgstr "Aucun temps suivi pour le {date}." + #: TimeTracker.py:708 msgid "# Time Report: {start_date} to {end_date}\n" msgstr "# Rapport de temps : du {start_date} au {end_date}\n" @@ -274,48 +292,72 @@ msgstr "" msgid "No time tracked between {start_date} and {end_date}." msgstr "Aucun temps suivi entre le {start_date} et le {end_date}." +msgid "Notes (Markdown)" +msgstr "Aucun temps suivi entre le {start_date} et le {end_date}." + msgid "now" msgstr "maintenant" msgid "# Detailed Daily Report: {date}" msgstr "# Rapport journalier détaillé : {date}" +msgid "No notes provided." +msgstr "Aucune note fournie." + msgid "\nNo time tracked for {date}." msgstr "\nAucun temps suivi pour le {date}." msgid "Active (working on '{task_name}')" msgstr "Actif (travail sur '{task_name}')" +msgid "Add New Project" +msgstr "Ajouter un nouveau projet" + msgid "# Detailed Report for Task: {name}" msgstr "# Rapport détaillé pour la tâche : {name}" msgid "Part of Main Project: {name}" msgstr "Fait partie du projet principal : {name}" +msgid "Name of the new task" +msgstr "Nom de la nouvelle tâche" + msgid "Active (currently running)" msgstr "Actif (en cours)" msgid "Last activity" msgstr "Dernière activité" +msgid "Today" +msgstr "Aujourd'hui" + msgid "Inactive" msgstr "Inactif" msgid "Status" msgstr "Statut" +msgid "Recurring" +msgstr "Récurrent" + msgid "First entry" msgstr "Première entrée" msgid "Total recorded time" msgstr "Temps total enregistré" +msgid "Frequency" +msgstr "Fréquence" + msgid "Total work sessions" msgstr "Nombre total de sessions de travail" msgid "Average session duration" msgstr "Durée moyenne des sessions" +msgid "Edit" +msgstr "Modifier" + msgid "Weekday Distribution" msgstr "Répartition par jour de la semaine" @@ -340,30 +382,45 @@ msgstr "Samedi" msgid "Sunday" msgstr "Dimanche" +msgid "Preview" +msgstr "Aperçu" + msgid "Daily Breakdown" msgstr "Répartition journalière" msgid "Duration" msgstr "Durée" +msgid "Add Task" +msgstr "Ajouter une tâche" + msgid "# Detailed Report for Main Project: {name}" msgstr "# Rapport détaillé pour le projet principal : {name}" msgid "Number of sub-projects" msgstr "Nombre de tâches" +msgid "A task with this name already exists in this project." +msgstr "Une tâche avec ce nom existe déjà dans ce projet." + msgid "Task Breakdown" msgstr "Répartition par tâche" msgid "{num_sessions} sessions" msgstr "{num_sessions} sessions" +msgid "Step 1: Select Project" +msgstr "Étape 1 : Sélectionner le projet" + msgid "6. Detailed Daily Report" msgstr "6. Rapport journalier détaillé" msgid "\n--- Detailed Daily Report ---" msgstr "\n--- Rapport journalier détaillé ---" +msgid "No open projects found." +msgstr "Aucun projet ouvert trouvé." + msgid "Enter the date (YYYY-MM-DD) or press Enter for today: " msgstr "Entrez la date (AAAA-MM-JJ) ou appuyez sur Entrée pour aujourd'hui : " @@ -371,6 +428,9 @@ msgstr "Entrez la date (AAAA-MM-JJ) ou appuyez sur Entrée pour aujourd'hui : " msgid "\n--- Project Management ---" msgstr "\n--- Gestion des projets ---" +msgid "Next" +msgstr "Suivant" + #: TimeTrackerCLI.py:22 msgid "1. Add Project" msgstr "1. Ajouter un projet" @@ -379,6 +439,9 @@ msgstr "1. Ajouter un projet" msgid "2. List Projects" msgstr "2. Lister les projets" +msgid "Step 2: Select Task from" +msgstr "Étape 2 : Sélectionner la tâche de" + #: TimeTrackerCLI.py:24 msgid "3. Rename Project" msgstr "3. Renommer le projet" @@ -391,6 +454,9 @@ msgstr "4. Supprimer le projet" msgid "5. List Inactive Projects" msgstr "5. Lister les projets inactifs" +msgid "No open tasks found." +msgstr "Aucune tâche ouverte trouvée." + #: TimeTrackerCLI.py:27 msgid "6. Demote Project to Task" msgstr "6. Rétrograder un projet en tâche" @@ -403,6 +469,9 @@ msgstr "7. Ajouter une tâche" msgid "8. List Tasks" msgstr "8. Lister les tâches" +msgid "Task not found." +msgstr "Tâche non trouvée." + #: TimeTrackerCLI.py:31 TimeTrackerCLI.py:32 msgid "9. Rename Task" msgstr "9. Renommer la tâche" @@ -422,6 +491,9 @@ msgstr "13. Déplacer la tâche" msgid "14. List Inactive Tasks" msgstr "14. Lister les tâches inactives" +msgid "Done" +msgstr "Terminé" + msgid "15. List All Closed Tasks" msgstr "15. Lister toutes les tâches fermées" @@ -431,6 +503,9 @@ msgstr "16. Supprimer toutes les tâches fermées" msgid "17. Promote Task to Project" msgstr "17. Promouvoir une tâche en projet" +msgid "Save Changes" +msgstr "Enregistrer les modifications" + #: TimeTrackerCLI.py:37 TimeTrackerCLI.py:403 TimeTrackerCLI.py:461 TimeTrackerCLI.py:539 msgid "0. Back to Main Menu" msgstr "0. Retour au menu principal" @@ -443,6 +518,9 @@ msgstr "Choix : " msgid "\n--- Add New Project ---" msgstr "\n--- Ajouter un nouveau projet ---" +msgid "Error: Could not update task." +msgstr "Erreur : Impossible de mettre à jour la tâche." + #: TimeTrackerCLI.py:45 msgid "Name of the project: " msgstr "Nom du projet : " @@ -455,6 +533,9 @@ msgstr "Projet '{name}' ajouté." msgid "\n--- List Projects ---" msgstr "\n--- Lister les projets ---" +msgid "No open projects found. Please add one first." +msgstr "Aucun projet ouvert trouvé. Veuillez d'abord en ajouter un." + #: TimeTrackerCLI.py:55 TimeTrackerCLI.py:166 TimeTrackerCLI.py:288 TimeTrackerCLI.py:411 TimeTrackerCLI.py:434 TimeTrackerCLI.py:479 msgid "No projects found." msgstr "Aucun projet trouvé." @@ -467,6 +548,9 @@ msgstr "\n--- Renommer le projet ---" msgid "No projects to rename." msgstr "Aucun projet à renommer." +msgid "Start Work" +msgstr "Démarrer le travail" + #: TimeTrackerCLI.py:64 msgid "Select a project to rename:" msgstr "Sélectionnez un projet à renommer :" @@ -479,6 +563,9 @@ msgstr "Entrez le numéro du projet : " msgid "Enter the new name for '{name}': " msgstr "Entrez le nouveau nom pour '{name}' : " +msgid "Error starting work." +msgstr "Erreur lors du démarrage du travail." + #: TimeTrackerCLI.py:74 msgid "Project '{old_name}' successfully renamed to '{new_name}'." msgstr "Le projet '{old_name}' a été renommé en '{new_name}' avec succès." @@ -491,6 +578,9 @@ msgstr "Erreur : Impossible de renommer. Le nouveau nom '{new_name}' existe peut msgid "Invalid input. Please enter a valid number." msgstr "Entrée invalide. Veuillez entrer un numéro valide." +msgid "Current Active Work" +msgstr "Travail actif en cours" + #: TimeTrackerCLI.py:81 msgid "\n--- Delete Project ---" msgstr "\n--- Supprimer le projet ---" @@ -503,6 +593,9 @@ msgstr "Aucun projet à supprimer." msgid "Select a project to delete:" msgstr "Sélectionnez un projet à supprimer :" +msgid "Project" +msgstr "Projet" + #: TimeTrackerCLI.py:93 msgid "Project '{name}' deleted." msgstr "Projet '{name}' supprimé." @@ -515,6 +608,9 @@ msgstr "Erreur : Projet '{name}' non trouvé." msgid "\n--- List Inactive Projects ---" msgstr "\n--- Lister les projets inactifs ---" +msgid "Task" +msgstr "Tâche" + #: TimeTrackerCLI.py:103 msgid "Enter the number of weeks without activity (e.g., 8): " msgstr "Entrez le nombre de semaines sans activité (ex: 8) : " @@ -527,6 +623,9 @@ msgstr "Veuillez entrer un nombre positif." msgid "\nInactive Main-Projects (>{weeks} weeks):" msgstr "\nProjets principaux inactifs (>{weeks} semaines) :" +msgid "Started at" +msgstr "Démarré à" + #: TimeTrackerCLI.py:112 msgid " - Main Project: {name}" msgstr " - Projet principal : {name}" @@ -545,6 +644,9 @@ msgstr[1] "Aucun projet principal inactif depuis plus de {weeks} semaines n'a é msgid "Invalid input. Please enter a valid number for weeks." msgstr "Entrée invalide. Veuillez entrer un nombre valide pour les semaines." +msgid "Streamlit Port Settings" +msgstr "Paramètres du port Streamlit" + #: TimeTrackerCLI.py:122 msgid "\n--- Add New Sub-Project ---" msgstr "\n--- Ajouter un nouveau sous-projet ---" @@ -557,6 +659,9 @@ msgstr "Aucun projet principal trouvé. Veuillez d'abord en ajouter un." msgid "Select a main project to add a sub-project to:" msgstr "Sélectionnez un projet principal auquel ajouter un sous-projet :" +msgid "New Port" +msgstr "Nouveau port" + #: TimeTrackerCLI.py:135 msgid "Name of the new sub-project: " msgstr "Nom du nouveau sous-projet : " @@ -569,6 +674,9 @@ msgstr "Sous-projet '{sub_name}' ajouté à '{main_name}'." msgid "\n--- List Sub-Projects ---" msgstr "\n--- Lister les sous-projets ---" +msgid "Save" +msgstr "Enregistrer" + #: TimeTrackerCLI.py:145 msgid "No main projects found. Cannot list sub-projects." msgstr "Aucun projet principal trouvé. Impossible de lister les sous-projets." @@ -581,6 +689,9 @@ msgstr "Sélectionnez le projet principal dont vous voulez lister les sous-proje msgid "Sub-projects for '{name}':" msgstr "Sous-projets pour '{name}' :" +msgid "Port updated to {port}. Please restart Streamlit." +msgstr "Port mis à jour vers {port}. Veuillez redémarrer Streamlit." + #: TimeTrackerCLI.py:159 TimeTrackerCLI.py:262 TimeTrackerCLI.py:489 msgid "No sub-projects found for '{name}'." msgstr "Aucun sous-projet trouvé pour '{name}'." @@ -593,6 +704,9 @@ msgstr "\n--- Renommer le sous-projet ---" msgid "Select the main project:" msgstr "Sélectionnez le projet principal :" +msgid "Change Data Storage Location" +msgstr "Changer l'emplacement de stockage des données" + #: TimeTrackerCLI.py:177 msgid "No sub-projects to rename for '{name}'." msgstr "Aucun sous-projet à renommer pour '{name}'." @@ -605,6 +719,9 @@ msgstr "Sélectionnez un sous-projet de '{name}' à renommer :" msgid "Enter the number of the sub-project: " msgstr "Entrez le numéro du sous-projet : " +msgid "Current data file" +msgstr "Fichier de données actuel" + #: TimeTrackerCLI.py:190 msgid "Sub-project '{old_name}' renamed to '{new_name}'." msgstr "Le sous-projet '{old_name}' a été renommé en '{new_name}'." @@ -615,6 +732,9 @@ msgid "" "was not found." msgstr "Erreur : Impossible de renommer. Le nouveau nom existe peut-être déjà ou le projet n'a pas été trouvé." +msgid "New Path for data file" +msgstr "Nouveau chemin pour le fichier de données" + #: TimeTrackerCLI.py:195 msgid "\n--- Delete Sub-Project ---" msgstr "\n--- Supprimer le sous-projet ---" @@ -627,6 +747,9 @@ msgstr "Aucun sous-projet à supprimer pour '{name}'." msgid "Select a sub-project from '{name}' to delete:" msgstr "Sélectionnez un sous-projet de '{name}' à supprimer :" +msgid "Move existing data to the new location" +msgstr "Déplacer les données existantes vers le nouvel emplacement" + #: TimeTrackerCLI.py:217 msgid "Sub-project '{sub_name}' deleted from '{main_name}'." msgstr "Sous-projet '{sub_name}' supprimé de '{main_name}'." @@ -634,6 +757,13 @@ msgstr "Sous-projet '{sub_name}' supprimé de '{main_name}'." msgid "\n--- List All Closed Sub-Projects ---" msgstr "\n--- Lister tous les sous-projets fermés ---" +msgid "" +"If unchecked, the old data file will remain, and a new empty one might be " +"created at the new location on restart." +msgstr "" +"Si décoché, l'ancien fichier de données restera, et un nouveau fichier vide " +"pourrait être créé au nouvel emplacement au redémarrage." + msgid "No closed sub-projects found." msgstr "Aucun sous-projet fermé trouvé." @@ -643,6 +773,9 @@ msgstr "\n--- Supprimer tous les sous-projets fermés ---" msgid "Are you sure you want to delete ALL closed sub-projects? (y/n): " msgstr "Êtes-vous sûr de vouloir supprimer TOUS les sous-projets fermés ? (o/n) : " +msgid "Error: For security, the data file must be located within the application directory." +msgstr "Erreur : Pour des raisons de sécurité, le fichier de données doit être situé dans le répertoire de l'application." + msgid "{count} closed sub-projects were deleted." msgstr "{count} sous-projets fermés ont été supprimés." @@ -650,6 +783,9 @@ msgid "Operation cancelled." msgstr "Opération annulée." #: TimeTrackerCLI.py:219 TimeTrackerCLI.py:281 +msgid "Error: The directory '{dir}' does not exist." +msgstr "Erreur : Le répertoire '{dir}' n'existe pas." + msgid "Error: Main project or sub-project not found." msgstr "Erreur : Projet principal ou sous-projet non trouvé." @@ -657,6 +793,9 @@ msgstr "Erreur : Projet principal ou sous-projet non trouvé." msgid "\n--- List Inactive Sub-Projects ---" msgstr "\n--- Lister les sous-projets inactifs ---" +msgid "Storage location updated. Please restart the application for the changes to take effect." +msgstr "Emplacement de stockage mis à jour. Veuillez redémarrer l'application pour que les changements prennent effet." + #: TimeTrackerCLI.py:228 msgid "Enter the number of weeks without activity (e.g., 4): " msgstr "Entrez le nombre de semaines sans activité (ex: 4) : " @@ -669,6 +808,9 @@ msgstr "\nSous-projets inactifs (>{weeks} semaines) :" msgid " Sub-Project: {name}" msgstr " Sous-projet : {name}" +msgid "Error moving data: {error}" +msgstr "Erreur lors du déplacement des données : {error}" + #: TimeTrackerCLI.py:241 msgid "No sub-projects found inactive for more than {weeks} week." msgid_plural "No sub-projects found inactive for more than {weeks} weeks." @@ -679,6 +821,9 @@ msgstr[1] "Aucun sous-projet inactif depuis plus de {weeks} semaines n'a été t msgid "\n--- Move Sub-Project ---" msgstr "\n--- Déplacer le sous-projet ---" +msgid "Change CSS Style" +msgstr "Changer le style CSS" + #: TimeTrackerCLI.py:250 msgid "You need at least two main projects to move a sub-project." msgstr "Vous avez besoin d'au moins deux projets principaux pour déplacer un sous-projet." @@ -691,6 +836,9 @@ msgstr "Sélectionnez le projet principal source :" msgid "Enter the number of the source main project: " msgstr "Entrez le numéro du projet principal source : " +msgid "Current CSS file" +msgstr "Fichier CSS actuel" + #: TimeTrackerCLI.py:265 msgid "\nSelect a sub-project from '{name}' to move:" msgstr "\nSélectionnez un sous-projet de '{name}' à déplacer :" @@ -703,6 +851,9 @@ msgstr "\nSélectionnez le projet principal de destination :" msgid "Enter the number of the destination main project: " msgstr "Entrez le numéro du projet principal de destination : " +msgid "Select CSS File" +msgstr "Sélectionner le fichier CSS" + #: TimeTrackerCLI.py:279 msgid "Successfully moved '{sub_name}' from '{source_name}' to '{dest_name}'." msgstr "Déplacement réussi de '{sub_name}' de '{source_name}' vers '{dest_name}'." @@ -710,6 +861,9 @@ msgstr "Déplacement réussi de '{sub_name}' de '{source_name}' vers '{dest_name msgid "Error: {message}" msgstr "Erreur : {message}" +msgid "CSS style updated. Please restart the application for the changes to take effect." +msgstr "Style CSS mis à jour. Veuillez redémarrer l'application pour que les changements prennent effet." + #: TimeTrackerCLI.py:286 msgid "\n--- Promote Sub-Project to Main-Project ---" msgstr "\n--- Promouvoir un sous-projet en projet principal ---" @@ -722,6 +876,9 @@ msgstr "Sélectionnez le projet principal contenant le sous-projet à promouvoir msgid "No sub-projects to promote in '{name}'." msgstr "Aucun sous-projet à promouvoir dans '{name}'." +msgid "Change View Mode" +msgstr "Changer le mode d'affichage" + #: TimeTrackerCLI.py:304 msgid "\nSelect a sub-project from '{name}' to promote:" msgstr "\nSélectionnez un sous-projet de '{name}' à promouvoir :" @@ -734,6 +891,9 @@ msgstr "\n--- Rétrograder un projet principal en sous-projet ---" msgid "You need at least two main projects for this operation." msgstr "Vous avez besoin d'au moins deux projets principaux pour cette opération." +msgid "App Window (Webview)" +msgstr "Fenêtre d'application (Webview)" + msgid "Select the main project to demote:" msgstr "Sélectionnez le projet principal à rétrograder :" @@ -745,6 +905,9 @@ msgstr "Entrez le numéro du projet à rétrograder : " msgid "\nSelect the new parent main project:" msgstr "\nSélectionnez le nouveau projet principal parent :" +msgid "System Browser" +msgstr "Navigateur système" + #: TimeTrackerCLI.py:333 msgid "Enter the number of the new parent project: " msgstr "Entrez le numéro du nouveau projet parent : " @@ -756,6 +919,9 @@ msgstr "Choix invalide. Veuillez entrer un nombre de 0 à 17." msgid "\n--- Reporting ---" msgstr "\n--- Rapports ---" +msgid "Select View Mode" +msgstr "Sélectionner le mode d'affichage" + #: TimeTrackerCLI.py:349 msgid "1. Daily Report (Today)" msgstr "1. Rapport journalier (Aujourd'hui)" @@ -768,6 +934,9 @@ msgstr "2. Rapport journalier (Jour spécifique)" msgid "3. Date Range Report" msgstr "3. Rapport par plage de dates" +msgid "View mode updated. Please restart the application for the changes to take effect." +msgstr "Mode d'affichage mis à jour. Veuillez redémarrer l'application pour que les changements prennent effet." + #: TimeTrackerCLI.py:352 msgid "4. Detailed Task Report" msgstr "4. Rapport détaillé de tâche" @@ -780,6 +949,9 @@ msgstr "5. Rapport détaillé de projet" msgid "\n--- Generate Daily Report (Today) ---" msgstr "\n--- Générer le rapport journalier (Aujourd'hui) ---" +msgid "Restore Previous Version" +msgstr "Restaurer la version précédente" + #: TimeTrackerCLI.py:363 msgid "\n--- Generate Daily Report for a specific Day ---" msgstr "\n--- Générer le rapport journalier pour un jour spécifique ---" @@ -792,6 +964,9 @@ msgstr "Entrez la date (AAAA-MM-JJ) : " msgid "Invalid date format. Please use YYYY-MM-DD." msgstr "Format de date invalide. Veuillez utiliser AAAA-MM-JJ." +msgid "No previous version backup '{filename}' found." +msgstr "Aucune sauvegarde de la version précédente '{filename}' trouvée." + #: TimeTrackerCLI.py:371 TimeTrackerCLI.py:373 msgid "\n--- Generate Report for a Date Range ---" msgstr "\n--- Générer un rapport pour une plage de dates ---" @@ -803,6 +978,9 @@ msgstr "Entrez la date de début (AAAA-MM-JJ) : " msgid "Enter the end date (YYYY-MM-DD): " msgstr "Entrez la date de fin (AAAA-MM-JJ) : " +msgid "This will restore the application to the previously backed-up version. The application will then restart. You may need to manually refresh your browser if it does not reconnect automatically." +msgstr "Ceci restaurera l'application à la version sauvegardée précédemment. L'application redémarrera ensuite. Vous devrez peut-être actualiser manuellement votre navigateur s'il ne se reconnecte pas automatiquement." + #: TimeTrackerCLI.py:377 msgid "Error: The start date cannot be after the end date." msgstr "Erreur : La date de début ne peut pas être postérieure à la date de fin." @@ -815,6 +993,9 @@ msgstr "\n--- Rapport détaillé de tâche ---" msgid "\nSelect the sub-project for the report:" msgstr "\nSélectionnez le sous-projet pour le rapport :" +msgid "Restore and Restart" +msgstr "Restaurer et redémarrer" + #: TimeTrackerCLI.py:405 msgid "\n--- Detailed Project Report ---" msgstr "\n--- Rapport détaillé de projet ---" @@ -827,6 +1008,9 @@ msgstr "Sélectionnez le projet pour le rapport :" msgid "Invalid choice. Please enter a number from 0 to 5." msgstr "Choix invalide. Veuillez entrer un nombre de 0 à 5." +msgid "Restoring and restarting..." +msgstr "Restauration et redémarrage..." + #: TimeTrackerCLI.py:428 TimeTrackerCLI.py:469 msgid "\n--- Settings ---" msgstr "\n--- Paramètres ---" @@ -835,6 +1019,9 @@ msgstr "\n--- Paramètres ---" msgid "1. Change Language" msgstr "1. Changer de langue" +msgid "Change Language" +msgstr "1. Changer de langue" + msgid "3. Change Data Storage Location" msgstr "3. Changer l'emplacement de stockage des données" @@ -842,6 +1029,9 @@ msgstr "3. Changer l'emplacement de stockage des données" msgid "2. Restore Previous Version" msgstr "2. Restaurer la version précédente" +msgid "Select Language" +msgstr "Sélectionner la langue" + msgid "Invalid choice. Please enter a number from 0 to 3." msgstr "Choix invalide. Veuillez entrer un nombre de 0 à 3." @@ -853,6 +1043,9 @@ msgstr "\n--- Paramètres de langue ---" msgid "No additional languages found." msgstr "Aucune langue supplémentaire trouvée." +msgid "Language changed. Please restart the application for the changes to take effect." +msgstr "Langue changée. Veuillez redémarrer l'application pour que les changements prennent effet." + #: TimeTrackerCLI.py:458 TimeTrackerCLI.py:587 msgid "Language changed to '{lang}'. Please restart the application." msgstr "Langue changée en '{lang}'. Veuillez redémarrer l'application." @@ -880,8 +1073,8 @@ msgstr "Laisser vide pour annuler." msgid "New Path: " msgstr "Nouveau chemin : " -msgid "Error: The directory '{dir}' does not exist." -msgstr "Erreur : Le répertoire '{dir}' n'existe pas." +msgid "IMAP Server" +msgstr "Serveur IMAP" msgid "Storage location updated." msgstr "Emplacement de stockage mis à jour." @@ -892,8 +1085,8 @@ msgstr "Voulez-vous déplacer les données existantes vers le nouvel emplacement msgid "Data moved successfully." msgstr "Données déplacées avec succès." -msgid "Error moving data: {error}" -msgstr "Erreur lors du déplacement des données : {error}" +msgid "Port" +msgstr "Port" msgid "Error updating configuration: {error}" msgstr "Erreur lors de la mise à jour de la configuration : {error}" @@ -945,6 +1138,9 @@ msgstr "--- Menu principal ---" msgid "1. Start work on task" msgstr "1. Démarrer le travail sur une tâche" +msgid "Daily Report (Specific Day)" +msgstr "Rapport journalier (Jour spécifique)" + #: TimeTrackerCLI.py:528 msgid "2. Show current work" msgstr "2. Afficher le travail en cours" @@ -957,6 +1153,9 @@ msgstr "3. Arrêter le travail en cours" msgid "4. Handle projects and tasks" msgstr "4. Gérer les projets et les tâches" +msgid "Select Date" +msgstr "Sélectionner la date" + #: TimeTrackerCLI.py:532 msgid "5. Reporting" msgstr "5. Rapports" @@ -969,6 +1168,9 @@ msgstr "6. Paramètres" msgid "0. Exit" msgstr "0. Quitter" +msgid "Generate Report" +msgstr "Générer le rapport" + #: TimeTrackerCLI.py:541 msgid "\n--- Start Work on a Task ---" msgstr "\n--- Démarrer le travail sur une tâche ---" @@ -977,17 +1179,20 @@ msgstr "\n--- Démarrer le travail sur une tâche ---" msgid "Select a task from '{name}':" msgstr "Sélectionnez une tâche de '{name}' :" +msgid "Date Range Report" +msgstr "Rapport par plage de dates" + #: TimeTrackerCLI.py:507 msgid "Work started on '{sub_name}' in project '{main_name}'." msgstr "Travail démarré sur '{sub_name}' dans le projet '{main_name}'." -msgid "Error starting work." -msgstr "Erreur lors du démarrage du travail." - #: TimeTrackerCLI.py:514 msgid "\n--- Current Active Work ---" msgstr "\n--- Travail actif en cours ---" +msgid "Start Date" +msgstr "Date de début" + #: TimeTrackerCLI.py:523 msgid "You are currently working on:" msgstr "Vous travaillez actuellement sur :" @@ -996,6 +1201,9 @@ msgstr "Vous travaillez actuellement sur :" msgid " Project: {name}" msgstr " Projet : {name}" +msgid "End Date" +msgstr "Date de fin" + #: TimeTrackerCLI.py:525 msgid " Task: {name}" msgstr " Tâche : {name}" @@ -1020,6 +1228,9 @@ msgstr "\n--- Arrêter le travail ---" msgid "Work session stopped successfully." msgstr "Session de travail arrêtée avec succès." +msgid "Detailed Task Report" +msgstr "Rapport détaillé de tâche" + #: TimeTrackerCLI.py:536 msgid "No active work session to stop." msgstr "Aucune session de travail active à arrêter." @@ -1032,6 +1243,9 @@ msgstr "\nRecherche de mises à jour..." msgid "Exiting application. Goodbye!" msgstr "Fermeture de l'application. Au revoir !" +msgid "Detailed Project Report" +msgstr "Rapport détaillé de projet" + #: TimeTrackerCLI.py:605 msgid "Invalid choice. Please enter a number from 0 to 6." msgstr "Choix invalide. Veuillez entrer un nombre de 0 à 6." @@ -1045,6 +1259,9 @@ msgstr "" "trouvé dans config.json ou fichier invalide." #: update.py:38 +msgid "Detailed Daily Report" +msgstr "Rapport journalier détaillé" + msgid "A new version ({version}) is available." msgstr "Une nouvelle version ({version}) est disponible." @@ -1062,6 +1279,9 @@ msgstr "" "Une erreur inattendue s'est produite lors de la recherche de mises à jour : " "{error}" +"Une erreur inattendue s'est produite lors de la recherche de mises à jour : " +"{error}" + #: update.py:61 msgid "Downloading update..." msgstr "Téléchargement de la mise à jour..." @@ -1074,6 +1294,9 @@ msgstr "Téléchargement terminé. La mise à jour sera installée au prochain d msgid "Error downloading the update: {error}" msgstr "Erreur lors du téléchargement de la mise à jour : {error}" +msgid "Report Result" +msgstr "Résultat du rapport" + #: update.py:112 msgid "Creating backup of current version before update..." msgstr "Création d'une sauvegarde de la version actuelle avant la mise à jour..." @@ -1086,6 +1309,9 @@ msgstr "Sauvegarde créée avec succès sous le nom {filename}." msgid "Warning: Could not create backup. Error: {error}" msgstr "Avertissement : Impossible de créer la sauvegarde. Erreur : {error}" +msgid "This feature is available in the CLI. GUI implementation coming soon." +msgstr "Cette fonctionnalité est disponible en CLI. L'implémentation GUI arrive bientôt." + #: update.py:125 msgid "Installing update..." msgstr "Installation de la mise à jour..." @@ -1098,6 +1324,9 @@ msgstr "Fichier protégé ignoré : {filename}. Il ne sera pas écrasé." msgid "Update installed successfully." msgstr "Mise à jour installée avec succès." +msgid "Time Control" +msgstr "Contrôle du temps" + #: update.py:154 msgid "Error during update installation: {error}" msgstr "Erreur lors de l'installation de la mise à jour : {error}" diff --git a/sl/SL_Menu.py b/sl/SL_Menu.py index 487b8e7..43b976e 100644 --- a/sl/SL_Menu.py +++ b/sl/SL_Menu.py @@ -122,14 +122,6 @@ def render_header(title, subtitle=None): elif f['type'] == 'error': st.error(f['message']) st.session_state.feedback = None # Clear after showing -def t_label(key): - """Translates the key and removes leading numbering.""" - match = re.match(r'^(\d+\.?\s*)(.*)', key) - if match: - _numbering, text = match.groups() - return _(text) - return _(key) - # --- Views --- def view_main(): @@ -188,7 +180,7 @@ def view_main(): st.info(_("No active work session.")) with col_done: - if st.button("✔", help=_("Done"), disabled=not current_work or is_done): + if st.button("✔", help=_("Done"), disabled=not current_work or is_done, key="main_done_button"): st.session_state.tracker.update_task( current_work['main_project_name'], current_work['task_name'], @@ -196,7 +188,7 @@ def view_main(): recurring=task_details.get('recurring'), frequency=task_details.get('frequency'), userdefined_days=task_details.get('userdefined_days'), - task_id=task_details.get('id') + task_id=task_details.get('id'), ) st.rerun() @@ -207,38 +199,38 @@ def view_main(): st.session_state.context['return_to'] = 'main' navigate_to('edit_task_form') - if st.button(t_label("1. Start work on task"), use_container_width=True): + if st.button(_("Start work on task"), use_container_width=True): navigate_to('start_work') - if st.button(t_label("2. Show current work"), use_container_width=True): + if st.button(_("Show current work"), use_container_width=True): navigate_to('show_current_work') - if st.button(t_label("3. Stop current work"), use_container_width=True): + if st.button(_("Stop current work"), use_container_width=True): if st.session_state.tracker.stop_work(): set_feedback(_("Work session stopped successfully.")) else: set_feedback(_("No active work session to stop."), 'info') st.rerun() - if st.button(_("Task Planning"), use_container_width=True): + if st.button(_("Task Planning"), use_container_width=True, key="main_task_planning_btn"): navigate_to('task_planning') - if st.button(_("Today View"), use_container_width=True): + if st.button(_("Today View"), use_container_width=True, key="main_today_view_btn"): navigate_to('today_view') - if st.button(_("E-Mail Task Assignment"), use_container_width=True): + if st.button(_("E-Mail Task Assignment"), use_container_width=True, key="main_email_assignment_btn"): navigate_to('email_assignment') st.divider() - if st.button(t_label("4. Handle projects and tasks"), use_container_width=True): + if st.button(_("Handle projects and tasks"), use_container_width=True): navigate_to('project_management') - if st.button(t_label("5. Reporting"), use_container_width=True): + if st.button(_("Reporting"), use_container_width=True): navigate_to('reporting') - if st.button(t_label("6. Settings"), use_container_width=True): + if st.button(_("Settings"), use_container_width=True): navigate_to('settings') st.divider() - if st.button(t_label("0. Exit"), use_container_width=True): + if st.button(_("Exit"), use_container_width=True): os._exit(0) def view_task_planning(): @@ -547,14 +539,14 @@ def view_project_management(): """ render_header(_("Project Management")) - if st.button(t_label("1. Project Management"), use_container_width=True): + if st.button(_("Main Project Management"), use_container_width=True): navigate_to('main_project_mgmt') - if st.button(t_label("2. Task Management"), use_container_width=True): + if st.button(_("Task Management"), use_container_width=True): navigate_to('task_mgmt') st.divider() - if st.button(t_label("0. Back to Main Menu"), use_container_width=True): + if st.button(_("Back to Main Menu"), use_container_width=True): navigate_to('main') def view_main_project_mgmt(): @@ -563,19 +555,19 @@ def view_main_project_mgmt(): """ render_header(_("Project Management")) - if st.button(t_label("1. Add Project"), use_container_width=True): navigate_to('add_main_project') - if st.button(t_label("2. List Projects"), use_container_width=True): navigate_to('list_main_projects') - if st.button(t_label("3. Rename Project"), use_container_width=True): navigate_to('rename_main_project') - if st.button(t_label("4. Close Project"), use_container_width=True): navigate_to('close_main_project') - if st.button(t_label("5. Re-open Project"), use_container_width=True): navigate_to('reopen_main_project') - if st.button(t_label("6. Delete Project"), use_container_width=True): navigate_to('delete_main_project') - if st.button(t_label("7. List Inactive Projects"), use_container_width=True): navigate_to('list_inactive_main') - if st.button(t_label("8. Demote Project to Task"), use_container_width=True): navigate_to('demote_main_project') - if st.button(t_label("9. List Completed Projects"), use_container_width=True): navigate_to('list_completed_main') + if st.button(_("Add Project"), use_container_width=True, key="mgmt_add_proj"): navigate_to('add_main_project') + if st.button(_("List Projects"), use_container_width=True, key="mgmt_list_proj"): navigate_to('list_main_projects') + if st.button(_("Rename Project"), use_container_width=True, key="mgmt_rename_proj"): navigate_to('rename_main_project') + if st.button(_("Close Project"), use_container_width=True, key="mgmt_close_proj"): navigate_to('close_main_project') + if st.button(_("Re-open Project"), use_container_width=True, key="mgmt_reopen_proj"): navigate_to('reopen_main_project') + if st.button(_("Delete Project"), use_container_width=True, key="mgmt_del_proj"): navigate_to('delete_main_project') + if st.button(_("List Inactive Projects"), use_container_width=True, key="mgmt_list_inact_proj"): navigate_to('list_inactive_main') + if st.button(_("Demote Project to Task"), use_container_width=True, key="mgmt_demote_proj"): navigate_to('demote_main_project') + if st.button(_("List Completed Projects"), use_container_width=True, key="mgmt_list_comp_proj"): navigate_to('list_completed_main') st.divider() - if st.button(t_label("0. Back"), use_container_width=True): + if st.button(_("Back"), use_container_width=True, key="mgmt_back_proj"): navigate_to('project_management') def view_task_mgmt(): @@ -584,22 +576,22 @@ def view_task_mgmt(): """ render_header(_("Task Management")) - if st.button(t_label("1. Add Task"), use_container_width=True): navigate_to('add_task') - if st.button(t_label("2. List Tasks"), use_container_width=True): navigate_to('list_tasks') - if st.button(t_label("3. Rename Task"), use_container_width=True): navigate_to('rename_task') - if st.button(t_label("4. Close Task"), use_container_width=True): navigate_to('close_task') - if st.button(t_label("5. Re-open Task"), use_container_width=True): navigate_to('reopen_task') - if st.button(t_label("6. Delete Task"), use_container_width=True): navigate_to('delete_task') - if st.button(t_label("7. Move Task"), use_container_width=True): navigate_to('move_task') - if st.button(t_label("8. List Inactive Tasks"), use_container_width=True): navigate_to('list_inactive_tasks') - if st.button(t_label("9. List All Closed Tasks"), use_container_width=True): navigate_to('list_closed_tasks') - if st.button(_("Edit Task"), use_container_width=True): navigate_to('edit_task') - if st.button(t_label("10. Delete All Closed Tasks"), use_container_width=True): navigate_to('delete_all_closed_tasks') - if st.button(t_label("11. Promote Task to Project"), use_container_width=True): navigate_to('promote_task_to_project') + if st.button(_("Add Task"), use_container_width=True, key="t_mgmt_add"): navigate_to('add_task') + if st.button(_("List Tasks"), use_container_width=True, key="t_mgmt_list"): navigate_to('list_tasks') + if st.button(_("Rename Task"), use_container_width=True, key="t_mgmt_rename"): navigate_to('rename_task') + if st.button(_("Close Task"), use_container_width=True, key="t_mgmt_close"): navigate_to('close_task') + if st.button(_("Re-open Task"), use_container_width=True, key="t_mgmt_reopen"): navigate_to('reopen_task') + if st.button(_("Delete Task"), use_container_width=True, key="t_mgmt_del"): navigate_to('delete_task') + if st.button(_("Move Task"), use_container_width=True, key="t_mgmt_move"): navigate_to('move_task') + if st.button(_("List Inactive Tasks"), use_container_width=True, key="t_mgmt_list_inact"): navigate_to('list_inactive_tasks') + if st.button(_("List All Closed Tasks"), use_container_width=True, key="t_mgmt_list_closed"): navigate_to('list_closed_tasks') + if st.button(_("Edit Task"), use_container_width=True, key="task_mgmt_edit_task"): navigate_to('edit_task') + if st.button(_("Delete All Closed Tasks"), use_container_width=True, key="t_mgmt_del_all"): navigate_to('delete_all_closed_tasks') + if st.button(_("Promote Task to Project"), use_container_width=True, key="t_mgmt_promote"): navigate_to('promote_task_to_project') st.divider() - if st.button(t_label("0. Back"), use_container_width=True): + if st.button(_("Back"), use_container_width=True, key="t_mgmt_back"): navigate_to('project_management') def view_reporting(): @@ -609,20 +601,20 @@ def view_reporting(): render_header(_("Reporting")) tt = st.session_state.tracker - if st.button(t_label("1. Daily Report (Today)"), use_container_width=True): + if st.button(_("Daily Report (Today)"), use_container_width=True): report = tt.generate_daily_report() st.session_state.context['report'] = report navigate_to('view_report') st.rerun() - if st.button(t_label("2. Daily Report (Specific Day)"), use_container_width=True): navigate_to('report_specific_day') - if st.button(t_label("3. Date Range Report"), use_container_width=True): navigate_to('report_date_range') - if st.button(t_label("4. Detailed Task Report"), use_container_width=True): navigate_to('report_detailed_task') - if st.button(t_label("5. Detailed Project Report"), use_container_width=True): navigate_to('report_detailed_main') - if st.button(t_label("6. Detailed Daily Report"), use_container_width=True): navigate_to('report_detailed_daily') + if st.button(_("Daily Report (Specific Day)"), use_container_width=True): navigate_to('report_specific_day') + if st.button(_("Date Range Report"), use_container_width=True): navigate_to('report_date_range') + if st.button(_("Detailed Task Report"), use_container_width=True): navigate_to('report_detailed_task') + if st.button(_("Detailed Project Report"), use_container_width=True): navigate_to('report_detailed_main') + if st.button(_("Detailed Daily Report"), use_container_width=True): navigate_to('report_detailed_daily') st.divider() - if st.button(t_label("0. Back to Main Menu"), use_container_width=True): + if st.button(_("Back to Main Menu"), use_container_width=True): navigate_to('main') def view_settings(): @@ -631,17 +623,17 @@ def view_settings(): """ render_header(_("Settings")) - if st.button(t_label("1. Change Language"), use_container_width=True): navigate_to('settings_language') - if st.button(t_label("2. Restore Previous Version"), use_container_width=True): navigate_to('settings_restore') - if st.button(t_label("3. Change Data Storage Location"), use_container_width=True): navigate_to('settings_storage') - if st.button(t_label("4. Change Streamlit Port"), use_container_width=True): navigate_to('settings_port') - if st.button(_("Email Settings"), use_container_width=True): navigate_to('settings_email') - if st.button(_("Change CSS Style"), use_container_width=True): navigate_to('settings_css') - if st.button(_("Change View Mode"), use_container_width=True): navigate_to('settings_view_mode') + if st.button(_("1. Change Language"), use_container_width=True): navigate_to('settings_language') + if st.button(_("2. Restore Previous Version"), use_container_width=True): navigate_to('settings_restore') + if st.button(_("3. Change Data Storage Location"), use_container_width=True): navigate_to('settings_storage') + if st.button(_("4. Change Streamlit Port"), use_container_width=True): navigate_to('settings_port') + if st.button(_("Email Settings"), use_container_width=True, key="settings_email"): navigate_to('settings_email') + if st.button(_("Change CSS Style"), use_container_width=True, key="settings_css"): navigate_to('settings_css') + if st.button(_("Change View Mode"), use_container_width=True, key="settings_view_mode"): navigate_to('settings_view_mode') st.divider() - if st.button(t_label("0. Back to Main Menu"), use_container_width=True): + if st.button(_("0. Back to Main Menu"), use_container_width=True): navigate_to('main') # --- Action Views (Forms) ---