bouquin 0.5__tar.gz → 0.5.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. {bouquin-0.5 → bouquin-0.5.2}/PKG-INFO +11 -6
  2. {bouquin-0.5 → bouquin-0.5.2}/README.md +9 -5
  3. {bouquin-0.5 → bouquin-0.5.2}/bouquin/code_highlighter.py +8 -6
  4. {bouquin-0.5 → bouquin-0.5.2}/bouquin/db.py +23 -3
  5. bouquin-0.5.2/bouquin/fonts/NotoSans-Regular.ttf +0 -0
  6. bouquin-0.5.2/bouquin/icons/bouquin.svg +53 -0
  7. {bouquin-0.5 → bouquin-0.5.2}/bouquin/locales/en.json +1 -9
  8. bouquin-0.5.2/bouquin/locales/fr.json +290 -0
  9. {bouquin-0.5 → bouquin-0.5.2}/bouquin/locales/it.json +0 -2
  10. {bouquin-0.5 → bouquin-0.5.2}/bouquin/main.py +1 -1
  11. {bouquin-0.5 → bouquin-0.5.2}/bouquin/main_window.py +4 -32
  12. {bouquin-0.5 → bouquin-0.5.2}/bouquin/markdown_editor.py +38 -48
  13. {bouquin-0.5 → bouquin-0.5.2}/bouquin/markdown_highlighter.py +39 -7
  14. {bouquin-0.5 → bouquin-0.5.2}/bouquin/reminders.py +1 -1
  15. {bouquin-0.5 → bouquin-0.5.2}/bouquin/statistics_dialog.py +1 -1
  16. {bouquin-0.5 → bouquin-0.5.2}/bouquin/time_log.py +2 -2
  17. {bouquin-0.5 → bouquin-0.5.2}/bouquin/toolbar.py +13 -21
  18. {bouquin-0.5 → bouquin-0.5.2}/bouquin/version_check.py +14 -14
  19. {bouquin-0.5 → bouquin-0.5.2}/pyproject.toml +3 -2
  20. bouquin-0.5/bouquin/icons/bouquin-light.svg +0 -145
  21. bouquin-0.5/bouquin/icons/bouquin.svg +0 -145
  22. bouquin-0.5/bouquin/locales/fr.json +0 -136
  23. bouquin-0.5/bouquin/table_editor.py +0 -255
  24. {bouquin-0.5 → bouquin-0.5.2}/LICENSE +0 -0
  25. {bouquin-0.5 → bouquin-0.5.2}/bouquin/__init__.py +0 -0
  26. {bouquin-0.5 → bouquin-0.5.2}/bouquin/__main__.py +0 -0
  27. {bouquin-0.5 → bouquin-0.5.2}/bouquin/bug_report_dialog.py +0 -0
  28. {bouquin-0.5 → bouquin-0.5.2}/bouquin/find_bar.py +0 -0
  29. {bouquin-0.5 → bouquin-0.5.2}/bouquin/flow_layout.py +0 -0
  30. {bouquin-0.5 → bouquin-0.5.2}/bouquin/fonts/NotoSansSymbols2-Regular.ttf +0 -0
  31. {bouquin-0.5 → bouquin-0.5.2}/bouquin/fonts/OFL.txt +0 -0
  32. {bouquin-0.5 → bouquin-0.5.2}/bouquin/history_dialog.py +0 -0
  33. {bouquin-0.5 → bouquin-0.5.2}/bouquin/key_prompt.py +0 -0
  34. {bouquin-0.5 → bouquin-0.5.2}/bouquin/keys/mig5.asc +0 -0
  35. {bouquin-0.5 → bouquin-0.5.2}/bouquin/lock_overlay.py +0 -0
  36. {bouquin-0.5 → bouquin-0.5.2}/bouquin/pomodoro_timer.py +0 -0
  37. {bouquin-0.5 → bouquin-0.5.2}/bouquin/save_dialog.py +0 -0
  38. {bouquin-0.5 → bouquin-0.5.2}/bouquin/search.py +0 -0
  39. {bouquin-0.5 → bouquin-0.5.2}/bouquin/settings.py +0 -0
  40. {bouquin-0.5 → bouquin-0.5.2}/bouquin/settings_dialog.py +0 -0
  41. {bouquin-0.5 → bouquin-0.5.2}/bouquin/strings.py +0 -0
  42. {bouquin-0.5 → bouquin-0.5.2}/bouquin/tag_browser.py +0 -0
  43. {bouquin-0.5 → bouquin-0.5.2}/bouquin/tags_widget.py +0 -0
  44. {bouquin-0.5 → bouquin-0.5.2}/bouquin/theme.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bouquin
3
- Version: 0.5
3
+ Version: 0.5.2
4
4
  Summary: Bouquin is a simple, opinionated notebook application written in Python, PyQt and SQLCipher.
5
5
  Home-page: https://git.mig5.net/mig5/bouquin
6
6
  License: GPL-3.0-or-later
@@ -12,6 +12,7 @@ Classifier: Programming Language :: Python :: 3
12
12
  Classifier: Programming Language :: Python :: 3.10
13
13
  Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
+ Requires-Dist: markdown (>=3.10,<4.0)
15
16
  Requires-Dist: pyside6 (>=6.8.1,<7.0.0)
16
17
  Requires-Dist: requests (>=2.32.5,<3.0.0)
17
18
  Requires-Dist: sqlcipher3-wheels (>=0.5.5.post0,<0.6.0)
@@ -26,7 +27,7 @@ Description-Content-Type: text/markdown
26
27
 
27
28
  ## Introduction
28
29
 
29
- Bouquin ("Book-ahn") is a notebook and planner application written in Python, PyQt and SQLCipher.
30
+ Bouquin ("Book-ahn") is a notebook and planner application written in Python, Qt and SQLCipher.
30
31
 
31
32
  It is designed to treat each day as its own 'page', complete with Markdown rendering, tagging,
32
33
  search, reminders and time logging for those of us who need to keep track of not just TODOs, but
@@ -54,9 +55,13 @@ report from within the app, or optionally to check for new versions to upgrade t
54
55
  <a href="https://git.mig5.net/mig5/bouquin/raw/branch/main/screenshots/history_diff.png"><img src="https://git.mig5.net/mig5/bouquin/raw/branch/main/screenshots/history_diff.png" alt="Screenshot of Bouquin History Diff Pane" width="500" style="margin: 0 10px;" /></a>
55
56
  </div>
56
57
 
57
- ### Tags and Time Logging
58
+ ### Tags
58
59
  <div align="center">
59
60
  <a href="https://git.mig5.net/mig5/bouquin/raw/branch/main/screenshots/tags.png"><img src="https://git.mig5.net/mig5/bouquin/raw/branch/main/screenshots/tags.png" alt="Screenshot of Bouquin Tag Manager screen" width="500" style="margin: 0 10px;" /></a>
61
+ </div>
62
+
63
+ ### Time Logging
64
+ <div align="center">
60
65
  <a href="https://git.mig5.net/mig5/bouquin/raw/branch/main/screenshots/time.png"><img src="https://git.mig5.net/mig5/bouquin/raw/branch/main/screenshots/time.png" alt="Screenshot of Bouquin Time Log screens" width="500" style="margin: 0 10px;" /></a>
61
66
  </div>
62
67
 
@@ -71,7 +76,7 @@ report from within the app, or optionally to check for new versions to upgrade t
71
76
 
72
77
  * Data is encrypted at rest
73
78
  * Encryption key is prompted for and never stored, unless user chooses to via Settings
74
- * All changes are version controlled, with ability to view/diff versions and revert
79
+ * All changes are version controlled, with ability to view/diff versions, revert or delete revisions
75
80
  * Automatic rendering of basic Markdown syntax
76
81
  * Tabs are supported - right-click on a date from the calendar to open it in a new tab.
77
82
  * Images are supported
@@ -86,8 +91,8 @@ report from within the app, or optionally to check for new versions to upgrade t
86
91
  * Automatically generate checkboxes when typing 'TODO'
87
92
  * It is possible to automatically move unchecked checkboxes from the last 7 days to the next weekday.
88
93
  * English, French and Italian locales provided
89
- * Ability to set reminder alarms in the app against the current line of text (which will be flashed as the reminder)
90
- * Ability to log time per day for different projects/activities and run timesheet reports
94
+ * Ability to set reminder alarms (which will be flashed as the reminder)
95
+ * Ability to log time per day for different projects/activities, pomodoro-style log timer and timesheet reports
91
96
 
92
97
 
93
98
  ## How to install
@@ -6,7 +6,7 @@
6
6
 
7
7
  ## Introduction
8
8
 
9
- Bouquin ("Book-ahn") is a notebook and planner application written in Python, PyQt and SQLCipher.
9
+ Bouquin ("Book-ahn") is a notebook and planner application written in Python, Qt and SQLCipher.
10
10
 
11
11
  It is designed to treat each day as its own 'page', complete with Markdown rendering, tagging,
12
12
  search, reminders and time logging for those of us who need to keep track of not just TODOs, but
@@ -34,9 +34,13 @@ report from within the app, or optionally to check for new versions to upgrade t
34
34
  <a href="https://git.mig5.net/mig5/bouquin/raw/branch/main/screenshots/history_diff.png"><img src="https://git.mig5.net/mig5/bouquin/raw/branch/main/screenshots/history_diff.png" alt="Screenshot of Bouquin History Diff Pane" width="500" style="margin: 0 10px;" /></a>
35
35
  </div>
36
36
 
37
- ### Tags and Time Logging
37
+ ### Tags
38
38
  <div align="center">
39
39
  <a href="https://git.mig5.net/mig5/bouquin/raw/branch/main/screenshots/tags.png"><img src="https://git.mig5.net/mig5/bouquin/raw/branch/main/screenshots/tags.png" alt="Screenshot of Bouquin Tag Manager screen" width="500" style="margin: 0 10px;" /></a>
40
+ </div>
41
+
42
+ ### Time Logging
43
+ <div align="center">
40
44
  <a href="https://git.mig5.net/mig5/bouquin/raw/branch/main/screenshots/time.png"><img src="https://git.mig5.net/mig5/bouquin/raw/branch/main/screenshots/time.png" alt="Screenshot of Bouquin Time Log screens" width="500" style="margin: 0 10px;" /></a>
41
45
  </div>
42
46
 
@@ -51,7 +55,7 @@ report from within the app, or optionally to check for new versions to upgrade t
51
55
 
52
56
  * Data is encrypted at rest
53
57
  * Encryption key is prompted for and never stored, unless user chooses to via Settings
54
- * All changes are version controlled, with ability to view/diff versions and revert
58
+ * All changes are version controlled, with ability to view/diff versions, revert or delete revisions
55
59
  * Automatic rendering of basic Markdown syntax
56
60
  * Tabs are supported - right-click on a date from the calendar to open it in a new tab.
57
61
  * Images are supported
@@ -66,8 +70,8 @@ report from within the app, or optionally to check for new versions to upgrade t
66
70
  * Automatically generate checkboxes when typing 'TODO'
67
71
  * It is possible to automatically move unchecked checkboxes from the last 7 days to the next weekday.
68
72
  * English, French and Italian locales provided
69
- * Ability to set reminder alarms in the app against the current line of text (which will be flashed as the reminder)
70
- * Ability to log time per day for different projects/activities and run timesheet reports
73
+ * Ability to set reminder alarms (which will be flashed as the reminder)
74
+ * Ability to log time per day for different projects/activities, pomodoro-style log timer and timesheet reports
71
75
 
72
76
 
73
77
  ## How to install
@@ -287,12 +287,6 @@ class CodeHighlighter:
287
287
  # HTML comments
288
288
  patterns.append((r"<!--.*?-->", "comment"))
289
289
 
290
- # Strings (double quotes)
291
- patterns.append((r'"[^"\\]*(\\.[^"\\]*)*"', "string"))
292
-
293
- # Strings (single quotes)
294
- patterns.append((r"'[^'\\]*(\\.[^'\\]*)*'", "string"))
295
-
296
290
  # Numbers
297
291
  patterns.append((r"\b\d+\.?\d*\b", "number"))
298
292
 
@@ -300,6 +294,14 @@ class CodeHighlighter:
300
294
  for keyword in keywords:
301
295
  patterns.append((r"\b" + keyword + r"\b", "keyword"))
302
296
 
297
+ # Do strings last so they override any of the above (e.g reserved keywords in strings)
298
+
299
+ # Strings (double quotes)
300
+ patterns.append((r'"[^"\\]*(\\.[^"\\]*)*"', "string"))
301
+
302
+ # Strings (single quotes)
303
+ patterns.append((r"'[^'\\]*(\\.[^'\\]*)*'", "string"))
304
+
303
305
  return patterns
304
306
 
305
307
  @staticmethod
@@ -5,6 +5,7 @@ import datetime as _dt
5
5
  import hashlib
6
6
  import html
7
7
  import json
8
+ import markdown
8
9
  import re
9
10
 
10
11
  from dataclasses import dataclass
@@ -440,14 +441,33 @@ class DBManager:
440
441
  '<html lang="en">',
441
442
  '<meta charset="utf-8">',
442
443
  f"<title>{html.escape(title)}</title>",
443
- "<style>body{font:16px/1.5 system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif;padding:24px;max-width:900px;margin:auto;}",
444
- "article{padding:16px 0;border-bottom:1px solid #ddd;} time{font-weight:600;color:#333;} section{margin-top:8px;}</style>",
444
+ "<style>"
445
+ "body{font:16px/1.5 system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif;"
446
+ "padding:24px;max-width:900px;margin:auto;}"
447
+ "article{padding:16px 0;border-bottom:1px solid #ddd;}"
448
+ "article header time{font-weight:600;color:#333;}"
449
+ "section{margin-top:8px;}"
450
+ "table{border-collapse:collapse;margin-top:8px;}"
451
+ "th,td{border:1px solid #ddd;padding:4px 8px;text-align:left;}"
452
+ "</style>",
445
453
  "<body>",
446
454
  f"<h1>{html.escape(title)}</h1>",
447
455
  ]
448
456
  for d, c in entries:
457
+ body_html = markdown.markdown(
458
+ c,
459
+ extensions=[
460
+ "extra",
461
+ "nl2br",
462
+ ],
463
+ output_format="html5",
464
+ )
465
+
449
466
  parts.append(
450
- f"<article><header><time>{html.escape(d)}</time></header><section>{c}</section></article>"
467
+ f"<article>"
468
+ f"<header><time>{html.escape(d)}</time></header>"
469
+ f"<section>{body_html}</section>"
470
+ f"</article>"
451
471
  )
452
472
  parts.append("</body></html>")
453
473
 
@@ -0,0 +1,53 @@
1
+ <svg
2
+ width="512"
3
+ height="512"
4
+ viewBox="0 0 512 512"
5
+ xmlns="http://www.w3.org/2000/svg"
6
+ >
7
+ <!-- Book cover -->
8
+ <rect
9
+ x="116"
10
+ y="76"
11
+ width="280"
12
+ height="360"
13
+ rx="48"
14
+ ry="48"
15
+ fill="#FACC15"
16
+ />
17
+
18
+ <!-- Book spine -->
19
+ <rect
20
+ x="116"
21
+ y="76"
22
+ width="64"
23
+ height="360"
24
+ rx="40"
25
+ ry="40"
26
+ fill="#F59E0B"
27
+ />
28
+
29
+ <!-- Folded page corner (top-right triangle) -->
30
+ <path
31
+ d="M396 76 L356 76 L396 116 Z"
32
+ fill="#FEF9C3"
33
+ />
34
+
35
+ <!-- Keyhole: circular top -->
36
+ <circle
37
+ cx="256"
38
+ cy="256"
39
+ r="34"
40
+ fill="#0F172A"
41
+ />
42
+
43
+ <!-- Keyhole: stem -->
44
+ <rect
45
+ x="238"
46
+ y="290"
47
+ width="36"
48
+ height="90"
49
+ rx="12"
50
+ ry="12"
51
+ fill="#0F172A"
52
+ />
53
+ </svg>
@@ -50,7 +50,6 @@
50
50
  "backup_failed": "Backup failed",
51
51
  "quit": "Quit",
52
52
  "cancel": "Cancel",
53
- "ok": "OK",
54
53
  "save": "Save",
55
54
  "help": "Help",
56
55
  "saved": "Saved",
@@ -266,8 +265,6 @@
266
265
  "cut": "Cut",
267
266
  "copy": "Copy",
268
267
  "paste": "Paste",
269
- "edit_table": "Edit table",
270
- "toolbar_insert_table": "Insert table",
271
268
  "start": "Start",
272
269
  "pause": "Pause",
273
270
  "resume": "Resume",
@@ -292,10 +289,5 @@
292
289
  "friday": "Friday",
293
290
  "saturday": "Saturday",
294
291
  "sunday": "Sunday",
295
- "day": "Day",
296
- "add_row": "Add row",
297
- "add_column": "Add column",
298
- "delete_row": "Delete row",
299
- "delete_column": "Delete column",
300
- "column": "Column"
292
+ "day": "Day"
301
293
  }
@@ -0,0 +1,290 @@
1
+ {
2
+ "db_sqlcipher_integrity_check_failed": "Échec de la vérification d'intégrité SQLCipher",
3
+ "db_issues_reported": "problème(s) signalé(s)",
4
+ "db_reopen_failed_after_rekey": "Échec de la réouverture après changement de clé",
5
+ "db_version_id_does_not_belong_to_the_given_date": "version_id ne correspond pas à la date indiquée",
6
+ "db_key_incorrect": "La clé est probablement incorrecte",
7
+ "db_database_error": "Erreur de base de données",
8
+ "database_maintenance": "Maintenance de la base de données",
9
+ "database_compact": "Compacter la base de données",
10
+ "database_compact_explanation": "La compaction exécute VACUUM sur la base de données. Cela peut aider à réduire sa taille.",
11
+ "database_compacted_successfully": "Base de données compactée avec succès !",
12
+ "encryption": "Chiffrement",
13
+ "remember_key": "Se souvenir de la clé",
14
+ "change_encryption_key": "Changer la clé de chiffrement",
15
+ "enter_a_new_encryption_key": "Saisir une nouvelle clé de chiffrement",
16
+ "reenter_the_new_key": "Saisir de nouveau la nouvelle clé",
17
+ "key_mismatch": "Les clés ne correspondent pas",
18
+ "key_mismatch_explanation": "Les deux saisies ne correspondent pas.",
19
+ "empty_key": "La clé est vide",
20
+ "empty_key_explanation": "La clé ne peut pas être vide.",
21
+ "key_changed": "La clé a été modifiée",
22
+ "key_changed_explanation": "Le bouquin a été rechiffré avec la nouvelle clé !",
23
+ "error": "Erreur",
24
+ "success": "Succès",
25
+ "close": "Fermer",
26
+ "find": "Rechercher",
27
+ "file": "Fichier",
28
+ "locale": "Langue",
29
+ "locale_restart": "Veuillez redémarrer l'application pour appliquer la nouvelle langue.",
30
+ "settings": "Paramètres",
31
+ "theme": "Thème",
32
+ "system": "Système",
33
+ "light": "Clair",
34
+ "dark": "Sombre",
35
+ "never": "Jamais",
36
+ "close_tab": "Fermer l'onglet",
37
+ "previous": "Précédent",
38
+ "previous_day": "Jour précédent",
39
+ "next": "Suivant",
40
+ "next_day": "Jour suivant",
41
+ "today": "Aujourd'hui",
42
+ "show": "Afficher",
43
+ "history": "Historique",
44
+ "export_accessible_flag": "E&xporter",
45
+ "export_entries": "Exporter les entrées",
46
+ "export_complete": "Exportation terminée",
47
+ "export_failed": "Échec de l'exportation",
48
+ "backup": "Sauvegarder",
49
+ "backup_complete": "Sauvegarde terminée",
50
+ "backup_failed": "Échec de la sauvegarde",
51
+ "quit": "Quitter",
52
+ "cancel": "Annuler",
53
+ "save": "Enregistrer",
54
+ "help": "Aide",
55
+ "saved": "Enregistré",
56
+ "saved_to": "Enregistré dans",
57
+ "documentation": "Documentation",
58
+ "couldnt_open": "Impossible d'ouvrir",
59
+ "report_a_bug": "Signaler un bug",
60
+ "version": "Version",
61
+ "update": "Mise à jour",
62
+ "check_for_updates": "Rechercher des mises à jour",
63
+ "could_not_check_for_updates": "Impossible de vérifier les mises à jour:\n",
64
+ "update_server_returned_an_empty_version_string": "Le serveur de mise à jour a renvoyé une chaîne de version vide",
65
+ "you_are_running_the_latest_version": "Vous utilisez déjà la dernière version:\n",
66
+ "there_is_a_new_version_available": "Une nouvelle version est disponible:\n",
67
+ "download_the_appimage": "Télécharger l'AppImage ?",
68
+ "downloading": "Téléchargement en cours",
69
+ "download_cancelled": "Téléchargement annulé",
70
+ "failed_to_download_update": "Échec du téléchargement de la mise à jour:\n",
71
+ "could_not_read_bundled_gpg_public_key": "Impossible de lire la clé publique GPG fournie:\n",
72
+ "could_not_find_gpg_executable": "Impossible de trouver l'exécutable 'gpg' pour vérifier le téléchargement.",
73
+ "gpg_signature_verification_failed": "Échec de la vérification de la signature GPG. Les fichiers téléchargés ont été supprimés.\n\n",
74
+ "downloaded_and_verified_new_appimage": "Nouvelle AppImage téléchargée et vérifiée:\n\n",
75
+ "navigate": "Naviguer",
76
+ "current": "actuel",
77
+ "selected": "sélectionné",
78
+ "find_on_page": "Rechercher dans la page",
79
+ "find_next": "Rechercher le suivant",
80
+ "find_previous": "Rechercher le précédent",
81
+ "find_bar_type_to_search": "Tapez pour rechercher",
82
+ "find_bar_match_case": "Respecter la casse",
83
+ "history_dialog_preview": "Aperçu",
84
+ "history_dialog_diff": "Différences",
85
+ "history_dialog_revert_to_selected": "Revenir à la sélection",
86
+ "history_dialog_revert_failed": "Échec de la restauration",
87
+ "history_dialog_delete": "Supprimer la révision",
88
+ "history_dialog_delete_failed": "Impossible de supprimer la révision",
89
+ "key_prompt_enter_key": "Saisir la clé",
90
+ "lock_overlay_locked": "Verrouillé",
91
+ "lock_overlay_unlock": "Déverrouiller",
92
+ "main_window_lock_screen_accessibility": "&Verrouiller l'écran",
93
+ "main_window_ready": "Prêt",
94
+ "main_window_save_a_version": "Enregistrer une version",
95
+ "main_window_settings_accessible_flag": "&Paramètres",
96
+ "set_an_encryption_key": "Définir une clé de chiffrement",
97
+ "set_an_encryption_key_explanation": "Bouquin chiffre vos données.\n\nVeuillez créer une phrase de passe robuste pour chiffrer le bouquin.\n\nVous pourrez toujours la modifier plus tard !",
98
+ "unlock_encrypted_notebook": "Déverrouiller le bouquin chiffré",
99
+ "unlock_encrypted_notebook_explanation": "Saisir votre clé pour déverrouiller le bouquin",
100
+ "open_in_new_tab": "Ouvrir dans un nouvel onglet",
101
+ "autosave": "enregistrement automatique",
102
+ "unchecked_checkbox_items_moved_to_next_day": "Les cases non cochées ont été reportées au jour suivant",
103
+ "move_unchecked_todos_to_today_on_startup": "Déplacer automatiquement les TODO non cochés\ndes 7 derniers jours vers le prochain jour ouvrable",
104
+ "insert_images": "Insérer des images",
105
+ "images": "Images",
106
+ "reopen_failed": "Échec de la réouverture",
107
+ "unlock_failed": "Échec du déverrouillage",
108
+ "could_not_unlock_database_at_new_path": "Impossible de déverrouiller la base de données au nouveau chemin.",
109
+ "unencrypted_export": "Export non chiffré",
110
+ "unencrypted_export_warning": "L'exportation de la base de données ne sera pas chiffrée !\nÊtes-vous sûr de vouloir continuer ?\nSi vous voulez une sauvegarde chiffrée, choisissez Sauvegarde plutôt qu'Export.",
111
+ "unrecognised_extension": "Extension non reconnue !",
112
+ "backup_encrypted_notebook": "Sauvegarder le bouquin chiffré",
113
+ "enter_a_name_for_this_version": "Saisir un nom pour cette version",
114
+ "new_version_i_saved_at": "Nouvelle version que j'ai enregistrée à",
115
+ "appearance": "Apparence",
116
+ "security": "Sécurité",
117
+ "features": "Fonctionnalités",
118
+ "database": "Base de données",
119
+ "save_key_warning": "Si vous ne voulez pas que l'on vous demande votre clé de chiffrement, cochez cette case pour la mémoriser.\nAVERTISSEMENT : la clé est enregistrée sur le disque et pourrait être récupérée si votre disque est compromis.",
120
+ "lock_screen_when_idle": "Verrouiller l'écran en cas d'inactivité",
121
+ "autolock_explanation": "Bouquin verrouillera automatiquement le bouquin après cette durée, après quoi vous devrez ressaisir la clé pour le déverrouiller.\nMettre à 0 (jamais) pour ne jamais verrouiller.",
122
+ "font_size": "Taille de police",
123
+ "font_size_explanation": "La modification de cette valeur change la taille de tout le texte de paragraphe dans tous les onglets. Cela n'affecte pas la taille des titres ni des blocs de code.",
124
+ "search_for_notes_here": "Recherchez des notes ici",
125
+ "toolbar_format": "Format",
126
+ "toolbar_bold": "Gras",
127
+ "toolbar_italic": "Italique",
128
+ "toolbar_strikethrough": "Barré",
129
+ "toolbar_normal_paragraph_text": "Texte de paragraphe normal",
130
+ "toolbar_font_smaller": "Texte plus petit",
131
+ "toolbar_font_larger": "Texte plus grand",
132
+ "toolbar_bulleted_list": "Liste à puces",
133
+ "toolbar_numbered_list": "Liste numérotée",
134
+ "toolbar_code_block": "Bloc de code",
135
+ "toolbar_heading": "Titre",
136
+ "toolbar_toggle_checkboxes": "Cocher/Décocher les cases",
137
+ "tags": "Étiquettes",
138
+ "tag": "Étiquette",
139
+ "manage_tags": "Gérer les étiquettes",
140
+ "add_tag_placeholder": "Ajouter une étiquette puis appuyez sur Entrée",
141
+ "tag_browser_title": "Navigateur d'étiquettes",
142
+ "tag_browser_instructions": "Cliquez sur une étiquette pour l'étendre et voir toutes les pages avec cette étiquette. Cliquez sur une date pour l'ouvrir. Sélectionnez une étiquette pour modifier son nom, changer sa couleur ou la supprimer globalement.",
143
+ "color_hex": "Couleur",
144
+ "date": "Date",
145
+ "add_a_tag": "Ajouter une étiquette",
146
+ "edit_tag_name": "Modifier le nom de l'étiquette",
147
+ "new_tag_name": "Nouveau nom de l'étiquette :",
148
+ "change_color": "Changer la couleur",
149
+ "delete_tag": "Supprimer l'étiquette",
150
+ "delete_tag_confirm": "Êtes-vous sûr de vouloir supprimer l'étiquette '{name}' ? Cela la supprimera de toutes les pages.",
151
+ "tag_already_exists_with_that_name": "Une étiquette portant ce nom existe déjà",
152
+ "statistics": "Statistiques",
153
+ "main_window_statistics_accessible_flag": "Stat&istiques",
154
+ "stats_pages_with_content": "Pages avec contenu (version actuelle)",
155
+ "stats_total_revisions": "Nombre total de révisions",
156
+ "stats_page_most_revisions": "Page avec le plus de révisions",
157
+ "stats_total_words": "Nombre total de mots (versions actuelles)",
158
+ "stats_unique_tags": "Étiquettes uniques",
159
+ "stats_page_most_tags": "Page avec le plus d'étiquettes",
160
+ "stats_activity_heatmap": "Carte de chaleur d'activité",
161
+ "stats_heatmap_metric": "Colorer selon",
162
+ "stats_metric_words": "Mots",
163
+ "stats_metric_revisions": "Révisions",
164
+ "stats_no_data": "Aucune statistique disponible pour le moment.",
165
+ "select_notebook": "Sélectionner un bouquin",
166
+ "bug_report_explanation": "Décrivez ce qui s'est mal passé, ce que vous attendiez et les étapes pour reproduire le problème.\n\nNous ne collectons rien d'autre que le numéro de version de Bouquin.\n\nSi vous souhaitez être contacté, veuillez laisser vos coordonnées.\n\nVotre demande sera envoyée via HTTPS.",
167
+ "bug_report_placeholder": "Saisissez votre rapport de bug ici",
168
+ "bug_report_empty": "Veuillez saisir quelques détails sur le bug avant l'envoi.",
169
+ "bug_report_send_failed": "Impossible d'envoyer le rapport de bug.",
170
+ "bug_report_sent_ok": "Rapport de bug envoyé. Merci !",
171
+ "send": "Envoyer",
172
+ "reminder": "Rappel",
173
+ "set_reminder": "Définir le rappel",
174
+ "reminder_no_text_fallback": "Vous avez programmé un rappel pour maintenant !",
175
+ "invalid_time_title": "Heure invalide",
176
+ "invalid_time_message": "Veuillez saisir une heure au format HH:MM",
177
+ "dismiss": "Ignorer",
178
+ "toolbar_alarm": "Régler l'alarme de rappel",
179
+ "activities": "Activités",
180
+ "activity": "Activité",
181
+ "note": "Note",
182
+ "activity_delete_error_message": "Un problème est survenu lors de la suppression de l'activité",
183
+ "activity_delete_error_title": "Problème lors de la suppression de l'activité",
184
+ "activity_rename_error_message": "Un problème est survenu lors du renommage de l'activité",
185
+ "activity_rename_error_title": "Problème lors du renommage de l'activité",
186
+ "activity_required_message": "Un nom d'activité est requis",
187
+ "activity_required_title": "Nom d'activité requis",
188
+ "add_activity": "Ajouter une activité",
189
+ "add_project": "Ajouter un projet",
190
+ "add_time_entry": "Ajouter une entrée de temps",
191
+ "time_period": "Période",
192
+ "by_day": "par jour",
193
+ "by_month": "par mois",
194
+ "by_week": "par semaine",
195
+ "date_range": "Plage de dates",
196
+ "delete_activity": "Supprimer l'activité",
197
+ "delete_activity_confirm": "Êtes-vous sûr de vouloir supprimer cette activité ?",
198
+ "delete_activity_title": "Supprimer l'activité - êtes-vous sûr ?",
199
+ "delete_project": "Supprimer le projet",
200
+ "delete_project_confirm": "Êtes-vous sûr de vouloir supprimer ce projet ?",
201
+ "delete_project_title": "Supprimer le projet - êtes-vous sûr ?",
202
+ "delete_time_entry": "Supprimer l'entrée de temps",
203
+ "group_by": "Grouper par",
204
+ "hours": "Heures",
205
+ "invalid_activity_message": "L'activité est invalide",
206
+ "invalid_activity_title": "Activité invalide",
207
+ "invalid_project_message": "Le projet est invalide",
208
+ "invalid_project_title": "Projet invalide",
209
+ "manage_activities": "Gérer les activités",
210
+ "manage_projects": "Gérer les projets",
211
+ "manage_projects_activities": "Gérer les activités du projet",
212
+ "open_time_log": "Ouvrir le journal de temps",
213
+ "project": "Projet",
214
+ "project_delete_error_message": "Un problème est survenu lors de la suppression du projet",
215
+ "project_delete_error_title": "Problème lors de la suppression du projet",
216
+ "project_rename_error_message": "Un problème est survenu lors du renommage du projet",
217
+ "project_rename_error_title": "Problème lors du renommage du projet",
218
+ "project_required_message": "Un projet est requis",
219
+ "project_required_title": "Projet requis",
220
+ "projects": "Projets",
221
+ "rename_activity": "Renommer l'activité",
222
+ "rename_project": "Renommer le projet",
223
+ "run_report": "Exécuter le rapport",
224
+ "add_activity_title": "Ajouter une activité",
225
+ "add_activity_label": "Ajouter une activité",
226
+ "rename_activity_label": "Renommer l'activité",
227
+ "add_project_title": "Ajouter un projet",
228
+ "add_project_label": "Ajouter un projet",
229
+ "rename_activity_title": "Renommer cette activité",
230
+ "rename_project_label": "Renommer le projet",
231
+ "rename_project_title": "Renommer ce projet",
232
+ "select_activity_message": "Sélectionner une activité",
233
+ "select_activity_title": "Sélectionner une activité",
234
+ "select_project_message": "Sélectionner un projet",
235
+ "select_project_title": "Sélectionner un projet",
236
+ "time_log": "Journal de temps",
237
+ "time_log_collapsed_hint": "Journal de temps",
238
+ "time_log_date_label": "Date du journal de temps : {date}",
239
+ "time_log_for": "Journal de temps pour {date}",
240
+ "time_log_no_date": "Journal de temps",
241
+ "time_log_no_entries": "Aucune entrée de temps pour l'instant",
242
+ "time_log_report": "Rapport de temps",
243
+ "time_log_report_title": "Journal de temps pour {project}",
244
+ "time_log_report_meta": "Du {start} au {end}, groupé par {granularity}",
245
+ "time_log_total_hours": "Total pour la journée : {hours:.2f}h",
246
+ "time_log_with_total": "Journal de temps ({hours:.2f}h)",
247
+ "update_time_entry": "Mettre à jour l'entrée de temps",
248
+ "time_report_total": "Total : {hours:.2f} heures",
249
+ "no_report_title": "Aucun rapport",
250
+ "no_report_message": "Veuillez exécuter un rapport avant d'exporter.",
251
+ "total": "Total",
252
+ "export_csv": "Exporter en CSV",
253
+ "export_csv_error_title": "Échec de l'exportation",
254
+ "export_csv_error_message": "Impossible d'écrire le fichier CSV:\n{error}",
255
+ "export_pdf": "Exporter en PDF",
256
+ "export_pdf_error_title": "Échec de l'exportation PDF",
257
+ "export_pdf_error_message": "Impossible d'écrire le fichier PDF:\n{error}",
258
+ "enable_tags_feature": "Activer les étiquettes",
259
+ "enable_time_log_feature": "Activer le journal de temps",
260
+ "enable_reminders_feature": "Activer les rappels",
261
+ "pomodoro_time_log_default_text": "Session de concentration",
262
+ "toolbar_pomodoro_timer": "Minuteur de suivi du temps",
263
+ "set_code_language": "Définir le langage du code",
264
+ "cut": "Couper",
265
+ "copy": "Copier",
266
+ "paste": "Coller",
267
+ "start": "Démarrer",
268
+ "pause": "Pause",
269
+ "resume": "Reprendre",
270
+ "stop_and_log": "Arrêter et enregistrer",
271
+ "once": "une fois",
272
+ "daily": "quotidien",
273
+ "weekdays": "jours de semaine",
274
+ "weekly": "hebdomadaire",
275
+ "edit_reminder": "Modifier le rappel",
276
+ "time": "Heure",
277
+ "once_today": "Une fois (aujourd'hui)",
278
+ "every_day": "Tous les jours",
279
+ "every_weekday": "Tous les jours de semaine (lun-ven)",
280
+ "every_week": "Toutes les semaines",
281
+ "repeat": "Répéter",
282
+ "monday": "Lundi",
283
+ "tuesday": "Mardi",
284
+ "wednesday": "Mercredi",
285
+ "thursday": "Jeudi",
286
+ "friday": "Vendredi",
287
+ "saturday": "Samedi",
288
+ "sunday": "Dimanche",
289
+ "day": "Jour"
290
+ }
@@ -40,7 +40,6 @@
40
40
  "today": "Oggi",
41
41
  "show": "Mostra",
42
42
  "history": "Cronologia",
43
- "view_history": "Visualizza cronologia",
44
43
  "export_accessible_flag": "&Esporta",
45
44
  "export_entries": "Esporta voci",
46
45
  "export_complete": "Esportazione completata",
@@ -128,7 +127,6 @@
128
127
  "check_for_updates": "Controlla aggiornamenti",
129
128
  "close": "Chiudi",
130
129
  "send": "Invia",
131
- "yes": "Sì",
132
130
  "time_log": "Registro Attività",
133
131
  "time_log_no_entries": "Nessuna Attività",
134
132
  "close_tab": "Chiudi scheda",
@@ -17,7 +17,7 @@ def main():
17
17
  app.setOrganizationName(APP_ORG)
18
18
  # Icon
19
19
  BASE_DIR = Path(__file__).resolve().parent
20
- ICON_PATH = BASE_DIR / "icons" / "bouquin-light.svg"
20
+ ICON_PATH = BASE_DIR / "icons" / "bouquin.svg"
21
21
  icon = QIcon(str(ICON_PATH))
22
22
  app.setWindowIcon(icon)
23
23
 
@@ -356,6 +356,9 @@ class MainWindow(QMainWindow):
356
356
  self._day_change_timer.timeout.connect(self._on_day_changed)
357
357
  self._schedule_next_day_change()
358
358
 
359
+ # Ensure toolbar is definitely visible
360
+ self.toolBar.setVisible(True)
361
+
359
362
  @property
360
363
  def editor(self) -> MarkdownEditor | None:
361
364
  """Get the currently active editor."""
@@ -1100,7 +1103,6 @@ class MainWindow(QMainWindow):
1100
1103
  self._tb_checkboxes = lambda: self._call_editor("toggle_checkboxes")
1101
1104
  self._tb_alarm = self._on_alarm_requested
1102
1105
  self._tb_timer = self._on_timer_requested
1103
- self._tb_table = self._on_table_requested
1104
1106
  self._tb_font_larger = self._on_font_larger_requested
1105
1107
  self._tb_font_smaller = self._on_font_smaller_requested
1106
1108
 
@@ -1114,7 +1116,6 @@ class MainWindow(QMainWindow):
1114
1116
  tb.checkboxesRequested.connect(self._tb_checkboxes)
1115
1117
  tb.alarmRequested.connect(self._tb_alarm)
1116
1118
  tb.timerRequested.connect(self._tb_timer)
1117
- tb.tableRequested.connect(self._tb_table)
1118
1119
  tb.insertImageRequested.connect(self._on_insert_image)
1119
1120
  tb.historyRequested.connect(self._open_history)
1120
1121
  tb.fontSizeLargerRequested.connect(self._tb_font_larger)
@@ -1230,6 +1231,7 @@ class MainWindow(QMainWindow):
1230
1231
  dlg = QDialog(self)
1231
1232
  dlg.setWindowTitle(strings._("reminder"))
1232
1233
  dlg.setModal(True)
1234
+ dlg.setMinimumWidth(400)
1233
1235
 
1234
1236
  layout = QVBoxLayout(dlg)
1235
1237
  label = QLabel(text)
@@ -1329,36 +1331,6 @@ class MainWindow(QMainWindow):
1329
1331
  timer.start(msecs)
1330
1332
  self._reminder_timers.append(timer)
1331
1333
 
1332
- # ----------- Table handler ------------#
1333
- def _on_table_requested(self):
1334
- """Insert a basic markdown table template."""
1335
- editor = getattr(self, "editor", None)
1336
- if editor is None:
1337
- return
1338
-
1339
- # Basic 3x3 table template
1340
- table_template = """| Column 1 | Column 2 | Column 3 |
1341
- | --- | --- | --- |
1342
- | Cell 1 | Cell 2 | Cell 3 |
1343
- | Cell 4 | Cell 5 | Cell 6 |
1344
- """
1345
-
1346
- cursor = editor.textCursor()
1347
- cursor.insertText(table_template)
1348
-
1349
- # Move cursor to first cell for easy editing
1350
- # Find the start of "Column 1" text
1351
- cursor.movePosition(
1352
- QTextCursor.Left, QTextCursor.MoveAnchor, len(table_template)
1353
- )
1354
- cursor.movePosition(QTextCursor.Right, QTextCursor.MoveAnchor, 2) # After "| "
1355
- cursor.movePosition(
1356
- QTextCursor.Right, QTextCursor.KeepAnchor, 8
1357
- ) # Select "Column 1"
1358
- editor.setTextCursor(cursor)
1359
-
1360
- editor.setFocus()
1361
-
1362
1334
  # ----------- History handler ------------#
1363
1335
  def _open_history(self):
1364
1336
  if hasattr(self.editor, "current_date"):