Report the stale keys that are stale, and remove them

The check reported 41 stale keys per catalogue. Ten of them were.

The other 31 were strings held in constants and translated where they render --
t(b.description), t(group), t(c.label) -- so they reach t() as a variable and
there is no literal at the call site to find. The script already chased two of
those shapes, `label:` and objects named *_LABELS, with a comment about crying
wolf 33 times. The shapes kept coming: `description:` and `group:` on the
keyboard bindings, the calendar's view names, the read-receipt refusals, the
palette names.

Chasing them one at a time is the wrong shape of fix. Stale detection now asks
only "is this key still written down anywhere in the source" -- any string
literal counts. That under-reports, and that is the right way round: a missed
stale key costs a line of dead translation, a false one costs the credibility
of the check and every real finding after it. Which is what happened here --
these sat unread long enough to need a commit of their own.

Coverage keeps the strict set. The two questions need different nets, and
widening the one that measures what a catalogue *owes* would count every CSS
class and JMAP method name as an untranslated string -- it read 29% while I had
them sharing a set. `wanted` is the obligation, `seen` is the evidence.

What was actually dead, removed from all nine: "Availability on {date}",
"Import vCard", "PDF", two settings hints replaced by rewordings that are still
live, the Catppuccin palette description, and Tuesday through Friday -- left
behind when the week-start dropdown narrowed to the three days a week actually
starts on, and appearing since only in comments.

Coverage is unchanged at 1269/1285: none of the ten was ever owed.
This commit is contained in:
2026-09-10 16:00:00 -07:00
parent 3c4f6a9f8e
commit 54b316ae36
10 changed files with 41 additions and 99 deletions
-10
View File
@@ -318,7 +318,6 @@ export const catalog: Catalog = {
"Busy": "予定あり",
"Free/busy": "空き時間",
"Show as": "表示方法",
"Availability on {date}": "{date} の空き状況",
"Count all events as busy": "すべての予定を「予定あり」とする",
"Only events I'm attending": "参加する予定のみ",
"Don't include in availability": "空き状況に含めない",
@@ -357,7 +356,6 @@ export const catalog: Catalog = {
"New address book": "新しいアドレス帳",
"No address books yet.": "アドレス帳がまだありません。",
"Choose from address books": "アドレス帳から選択",
"Import vCard": "vCard をインポート",
"Export all contacts": "すべての連絡先をエクスポート",
"Export address book": "このアドレス帳をエクスポート",
"Import contacts…": "連絡先をインポート…",
@@ -432,7 +430,6 @@ export const catalog: Catalog = {
"Make ihasmail yours.": "ihasmail を自分好みに整えましょう。",
"Reading": "閲覧",
"Reading pane": "プレビューウィンドウ",
"Reading, sending and list behaviour. Settings are stored in this browser.": "閲覧・送信・一覧の動作。設定はこのブラウザーに保存されます。",
"Right of the list": "一覧の右",
"Below the list": "一覧の下",
"Hidden (open full width)": "表示しない(全幅で開く)",
@@ -475,10 +472,6 @@ export const catalog: Catalog = {
"Time zone": "タイムゾーン",
"Week starts on": "週の始まり",
"Monday": "月曜日",
"Tuesday": "火曜日",
"Wednesday": "水曜日",
"Thursday": "木曜日",
"Friday": "金曜日",
"Saturday": "土曜日",
"Sunday": "日曜日",
"12-hour clock (6:23 PM)": "12 時間制 (6:23 PM)",
@@ -729,12 +722,10 @@ export const catalog: Catalog = {
"Manage labels": "ラベルを管理",
"Create “{name}”": "「{name}」を作成",
"Type a name to create your first label.": "名前を入力すると、最初のラベルを作成できます。",
"Labels are IMAP keywords stored on your messages, so they sync to other clients. Names and colours are kept in this browser.": "ラベルはメールに保存される IMAP キーワードなので、他のクライアントにも同期されます。名前と色はこのブラウザーに保存されます。",
"New label": "新しいラベル",
"Delete label": "ラベルを削除",
// ── Attachments, dates, search prose ───────────────────────────────
"PDF": "PDF",
"Large attachments may be rejected by some servers": "大きな添付ファイルは、サーバーによっては拒否されることがあります",
"Images are stored in your Files (folder “ihasmail”) and embedded when you send.": "画像は「ファイル」内(フォルダー「ihasmail」)に保存され、送信時にメールへ埋め込まれます。",
"After": "以降",
@@ -809,7 +800,6 @@ export const catalog: Catalog = {
"Copy it into {name} now — it isn't shown again.": "いま {name} にコピーしてください。二度と表示されません。",
"No other users found in the directory, so nobody new can be added. Sharing already in place is listed below and can still be removed.": "ディレクトリに他のユーザーが見つからないため、新しく追加することはできません。すでに設定されている共有は下に表示され、解除はできます。",
"Stalwart does not publish its version number to mail clients, so ihasmail reports the edition where the server gives one. ihasmail requires 0.16 or newer, and sign-in refuses anything older.": "Stalwart はメールクライアントにバージョン番号を公開しないため、ihasmail はサーバーが示すエディションだけを表示します。ihasmail には 0.16 以降が必要で、それより古いサーバーへのサインインは拒否されます。",
"{name} is the palette from {site}, and what a new account starts on. It is a dark theme, so it counts as dark wherever that matters, and the accent colour below still applies on top of it.": "{name} は {site} の配色で、新しいアカウントの初期テーマです。ダークテーマなので、明暗が問われる場面ではダークとして扱われます。下のアクセントカラーはその上に重ねて適用されます。",
"ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about Stalwart; what this build needs from the server is the line above.": "ihasmail 自身のバージョンは、ビルド元となったコミットの日付と、そのコミットの出どころを並べたものです。{example} は 2026 年 8 月 30 日付のコミットから作られ、そのコミットはプルリクエスト 129 を通って届きました。プルリクエストを経ていないコミットは、代わりに短い SHA が付きます — {sha}。バージョンには Stalwart に関する情報をあえて含めていません。このビルドがサーバーに求めるものは、上の行に示されています。",
// ── Constant labels ────────────────────────────────────────────────