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.
- {bouquin-0.5 → bouquin-0.5.2}/PKG-INFO +11 -6
- {bouquin-0.5 → bouquin-0.5.2}/README.md +9 -5
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/code_highlighter.py +8 -6
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/db.py +23 -3
- bouquin-0.5.2/bouquin/fonts/NotoSans-Regular.ttf +0 -0
- bouquin-0.5.2/bouquin/icons/bouquin.svg +53 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/locales/en.json +1 -9
- bouquin-0.5.2/bouquin/locales/fr.json +290 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/locales/it.json +0 -2
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/main.py +1 -1
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/main_window.py +4 -32
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/markdown_editor.py +38 -48
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/markdown_highlighter.py +39 -7
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/reminders.py +1 -1
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/statistics_dialog.py +1 -1
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/time_log.py +2 -2
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/toolbar.py +13 -21
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/version_check.py +14 -14
- {bouquin-0.5 → bouquin-0.5.2}/pyproject.toml +3 -2
- bouquin-0.5/bouquin/icons/bouquin-light.svg +0 -145
- bouquin-0.5/bouquin/icons/bouquin.svg +0 -145
- bouquin-0.5/bouquin/locales/fr.json +0 -136
- bouquin-0.5/bouquin/table_editor.py +0 -255
- {bouquin-0.5 → bouquin-0.5.2}/LICENSE +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/__init__.py +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/__main__.py +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/bug_report_dialog.py +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/find_bar.py +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/flow_layout.py +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/fonts/NotoSansSymbols2-Regular.ttf +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/fonts/OFL.txt +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/history_dialog.py +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/key_prompt.py +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/keys/mig5.asc +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/lock_overlay.py +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/pomodoro_timer.py +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/save_dialog.py +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/search.py +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/settings.py +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/settings_dialog.py +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/strings.py +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/tag_browser.py +0 -0
- {bouquin-0.5 → bouquin-0.5.2}/bouquin/tags_widget.py +0 -0
- {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,
|
|
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
|
|
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
|
|
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
|
|
90
|
-
* Ability to log time per day for different projects/activities and
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
70
|
-
* Ability to log time per day for different projects/activities and
|
|
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>
|
|
444
|
-
"
|
|
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
|
|
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
|
|
|
Binary file
|
|
@@ -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
|
|
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"):
|