aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-09-14 12:30:04 +0200
committerDanilo M. <danix@danix.xyz>2026-09-14 12:30:04 +0200
commitfff182819f8a543d3a52f80baf7a6e03e82ae2b3 (patch)
treef89594adb0c7bd5300d1d2c8bcb55ddcbff4b000
parent5f51d30e76fa20f8bd1212684ae0b2e1e773a7f3 (diff)
downloadqtmaildir-fff182819f8a543d3a52f80baf7a6e03e82ae2b3.tar.gz
qtmaildir-fff182819f8a543d3a52f80baf7a6e03e82ae2b3.zip
docs(i18n): translate the spam strings
-rw-r--r--AGENTS.md18
-rw-r--r--CHANGELOG.md53
-rw-r--r--README.md14
-rw-r--r--translations/qtmaildir_it_IT.ts28
4 files changed, 103 insertions, 10 deletions
diff --git a/AGENTS.md b/AGENTS.md
index a642840..3978232 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -328,13 +328,17 @@ user's real mail. Treat any code that composes a folder name as reaching the
server, because it does.
**A message records where it came from in a tag, because nothing else can.**
-`deleted-from:<folder>` is written when Delete moves the file, and read back by
-Restore. The file has moved, so neither the path nor anything in notmuch still
-knows the original folder. A notmuch tag MAY contain a space, so tags crossing
-the thread boundary are joined by a TAB rather than a space; joining on a space
-truncated every folder name containing one. A message trashed by another client
-carries no such tag at all, which is why the trash view is path-based and why
-Restore falls back to the account's inbox rather than refusing.
+`moved-from:<folder>` is written by any move, Delete into the trash and Mark
+spam into the spam folder alike, and read back by Restore. The file has moved,
+so neither the path nor anything in notmuch still knows the original folder. A
+message carries exactly ONE origin: a later move strips the tag it finds and
+writes the folder it is leaving now, so a message that travelled inbox -> spam
+-> trash names the spam folder and nothing older. A notmuch tag MAY contain a
+space, so tags crossing the thread boundary are joined by a TAB rather than a
+space; joining on a space truncated every folder name containing one. A message
+trashed by another client carries no such tag at all, which is why the trash
+view is path-based and why Restore falls back to the account's inbox rather
+than refusing.
**Restore reads the DATABASE, never the model.** The model's tags come from the
query, so a row whose delete has not been re-queried still carries its pre-delete
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 32c1a34..bb7eb49 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -29,6 +29,28 @@ point at which they are stable.
outcome from a line in the log. Set `status` under `[sync]` to move the file;
the default matches what the script writes and no config change is needed.
+- **A Spam view, and Mark spam now moves the file.** Every account may name a
+ `spam` folder beside its `trash`, and a built-in Spam filter lists that folder
+ as a threaded view the way the trash filter does. Mark spam moves the message
+ into that folder and records the one it came from in a `moved-from:` tag, so
+ Restore and Undo put it back where it was. Before this the action only added
+ the tag and left the file in place, so a message marked spam on one machine
+ did not appear in the folder on another.
+
+- **Empty Spam.** Moves every message in the account's spam folder to its trash
+ in one act, scoped to the account selector like Empty trash, and asks nothing
+ first: it is a move with an undo behind it, and a mutation that can be undone
+ gets undo rather than a dialog.
+
+- **Find stranded spam.** Mail carrying the `spam` tag while sitting in no spam
+ folder, usually because another client or an older version tagged it and left
+ the file where it was, is listed by a menu entry so it can be selected and
+ moved. It is the spam counterpart to Find stranded deleted mail.
+
+- **A spam button on the message pane's bar**, beside Star and Archive. It is
+ drawn with a bug rather than the theme's junk glyph, and falls back to
+ `mail-mark-junk` on a theme that ships no bug.
+
### Changed
- **Delete and Archive moved from the main toolbar to the message pane's
@@ -48,6 +70,11 @@ point at which they are stable.
narrower view cannot leave a change stranded. The status line now names what
a run covers instead of saying only "Syncing...", so a narrowed run is
visible as one.
+- **The origin tag is `moved-from:` rather than `deleted-from:`.** The tag
+ records where a message was moved from, and now that Mark spam moves a file
+ too, "deleted" was no longer true of every message carrying one. A message
+ holds exactly one origin, overwritten on each move, so a message that
+ travelled inbox to spam to trash names the spam folder and nothing older.
### Fixed
@@ -94,6 +121,32 @@ point at which they are stable.
because another sync already holds the lock, it carried nothing, and the
pending count stays where it was.
+### Upgrading
+
+**Every account needs a `spam` key beside `trash`.** Mark spam now moves the
+file into the account's `spam` folder, named relative to `maildir`, and an
+account without one cannot be marked spam at all. The config loader reports it
+at startup and the action names the cause rather than writing a file that has
+nowhere to go. Add the key under every `[account.*]` section, e.g. `spam =
+Spam`.
+
+**The origin tag is renamed, and the code does not rewrite the old one.** Mail
+moved by an earlier version carries `deleted-from:<folder>`; this version reads
+and writes `moved-from:<folder>` and nothing else. Until the old tags are
+renamed, Restore cannot find them, so such a message falls back to the
+account's inbox rather than the folder it came from, and Undo of an old delete
+no longer knows the origin. Rename it once, per distinct folder, before you
+rely on either:
+
+```bash
+notmuch tag +moved-from:'<folder>' -deleted-from:'<folder>' \
+ -- tag:'deleted-from:<folder>'
+```
+
+There is no compatibility branch on purpose: a reader accepting both prefixes
+would answer "first match wins" on a message holding one of each, which is the
+silent mis-restore the single tag exists to prevent.
+
## [0.28.0] - 2026-08-29
A row in the thread list is now either a conversation or a message, and it
diff --git a/README.md b/README.md
index affff11..2be629d 100644
--- a/README.md
+++ b/README.md
@@ -150,7 +150,8 @@ identity.
; message_zoom = 1.0
; Optional. Which query to open at startup, by name. Defaults to Unread.
; Matches your own saved queries first, then the built-in filters (Unread,
-; Inbox, Important, Sent), so either can be named here. Falls back to the
+; Inbox, Important, Sent, Drafts, Trash, Spam), so either can be named here.
+; Falls back to the
; Unread filter if no query by this name exists, and warns if you named one
; explicitly.
; startup_query = Unread
@@ -242,6 +243,9 @@ maildir = work-mail ; relative to notmuch's mail root
trash = Trash ; Delete moves the file here. Not optional in
; practice: without it the application reports a
; config problem and Delete does not work.
+spam = Spam ; Mark spam moves the file here. The same warning
+ ; applies: without it the application reports a
+ ; config problem and Mark spam does not work.
drafts = Drafts ; optional; enables the Drafts button, and where
; the composer autosaves
sent = Sent ; optional; enables the Sent button, and where a
@@ -263,6 +267,7 @@ name = Your Name
address = you@example.net
maildir = personal
trash = Trash
+spam = Spam
drafts = Drafts
; Optional, and global rather than per-account. Every key below shows its
@@ -755,7 +760,7 @@ Defaults, all rebindable through `[keys]`:
| `Return` | `open_thread` | Focus the thread list |
| `Ctrl+E` | `archive` | Remove `inbox` from every selected thread |
| `Ctrl+D` | `delete` | Add `deleted` |
-| `Ctrl+Shift+S` | `spam` | Add `spam`, remove `inbox` |
+| `Ctrl+Shift+S` | `spam` | Move the file to the spam folder and record where it came from |
| `Ctrl+U` | `toggle_unread` | Toggle `unread` |
| `Ctrl+Shift+U` | `mark_all_read` | Remove `unread` from every thread in the view |
| `Ctrl+I` | `flag` | Mark important (adds `flagged`) |
@@ -770,7 +775,10 @@ Defaults, all rebindable through `[keys]`:
| `Ctrl+G` | `sync` | Run the configured sync command |
| `Ctrl+Q` | `quit` | Quit |
-Every action now carries a default binding, and every one appears in a menu.
+Every action in this table carries a default binding, and every one appears in
+a menu. Some actions carry no default, because a chord for them would be
+arbitrary (Empty trash, Empty spam, Delete permanently); they are reachable
+from the menus and the shortcut reference prints them as unbound.
**Help > Keyboard shortcuts** lists the current bindings, generated from the
actions themselves, so it shows your overrides rather than these defaults.
diff --git a/translations/qtmaildir_it_IT.ts b/translations/qtmaildir_it_IT.ts
index cb9b34e..0a251e4 100644
--- a/translations/qtmaildir_it_IT.ts
+++ b/translations/qtmaildir_it_IT.ts
@@ -611,6 +611,10 @@ Il messaggio È stato inviato. Non inviarlo di nuovo.</translation>
<translation>Non connesso all&apos;indice della posta</translation>
</message>
<message>
+ <source>No spam folder is configured</source>
+ <translation>Nessuna cartella spam configurata</translation>
+ </message>
+ <message>
<source>Nothing selected to delete</source>
<translation>Nessun messaggio selezionato da eliminare</translation>
</message>
@@ -653,6 +657,10 @@ Il messaggio È stato inviato. Non inviarlo di nuovo.</translation>
<translation>Posta etichettata come eliminata ma non in un cestino. Seleziona cosa deve essere rimosso e premi Elimina.</translation>
</message>
<message>
+ <source>Mail tagged spam but not in a spam folder. Select what should go and press Mark spam.</source>
+ <translation>Posta etichettata come spam ma non in una cartella spam. Seleziona cosa deve essere rimosso e premi Segna come spam.</translation>
+ </message>
+ <message>
<source>Undelete</source>
<translation>Ripristina</translation>
</message>
@@ -758,6 +766,10 @@ Il messaggio È stato inviato. Non inviarlo di nuovo.</translation>
</translation>
</message>
<message>
+ <source>Empty spam</source>
+ <translation>Svuota spam</translation>
+ </message>
+ <message>
<source>Undelete thread</source>
<translation>Ripristina conversazione</translation>
</message>
@@ -884,6 +896,14 @@ Il messaggio È stato inviato. Non inviarlo di nuovo.</translation>
<translation>&amp;Regole di etichettatura...</translation>
</message>
<message>
+ <source>&amp;Check for stranded spam</source>
+ <translation>&amp;Cerca spam non spostato</translation>
+ </message>
+ <message>
+ <source>Show mail tagged spam that is not in a spam folder</source>
+ <translation>Mostra la posta etichettata come spam che non si trova in una cartella spam</translation>
+ </message>
+ <message>
<source>Delete per&amp;manently...</source>
<translation>Elimina definitiva&amp;mente...</translation>
</message>
@@ -892,6 +912,14 @@ Il messaggio È stato inviato. Non inviarlo di nuovo.</translation>
<translation>Elimina definitivamente i messaggi selezionati</translation>
</message>
<message>
+ <source>Empty spam f&amp;older...</source>
+ <translation>S&amp;vuota cartella spam...</translation>
+ </message>
+ <message>
+ <source>Move every message in the spam folder to the trash</source>
+ <translation>Sposta nel cestino ogni messaggio della cartella spam</translation>
+ </message>
+ <message>
<source>Move the selected messages to the spam folder</source>
<translation>Sposta nella cartella spam i messaggi selezionati</translation>
</message>