Top bar: the Save button names its shortcut instead of "(M4)" (#962) (#1013)

The Save button's tooltip and accessibility name read "Save (M4)", a
leftover milestone tag, while Print and Document properties beside it
name their shortcuts. It now uses command_tip with file.save, so it reads
"Save (Ctrl+S)" on Windows/Linux and "Save (⌘S)" on macOS. The catalog
key becomes "Save ({key})" in the 15 catalogs that had it (ATTRIBUTION.toml
hashes updated). New test commands::the_top_bar_save_button_names_its_shortcut_not_a_milestone.


Claude-Session: https://claude.ai/code/session_01UngnNXzwMCF7ksQ8tNucDe

Co-authored-by: DWAA1660 <DWAA1660@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
This commit is contained in:
DWAA1660
2026-10-11 12:23:55 -04:00
committed by GitHub
co-authored by DWAA1660 Claude Opus 5.5 Brandon Thomas
parent db26eb266d
commit 216d9a314e
18 changed files with 50 additions and 31 deletions
+15 -15
View File
@@ -19,7 +19,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Simplified Chinese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "737e9f61493dc977faf28df4666365c3f6b1764c416d39c40a6b17c021835dcb"
sha256 = "c1f833a5a61b7d3503d831691deee0e95777f6ec7e9fe12ef0eb68cdcdcd5488"
[[asset]]
path = "crates/ui-egui/src/i18n/zh-hant.tsv"
@@ -30,7 +30,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Traditional Chinese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "278c6ba856aba62c5a561c9f1b0cc44b2724c8357d91dcdf2d8a5164789ff7db"
sha256 = "5aecc94622ac849c96a05af59c9d38cff790bf8f69351bfbf0ee5a55963ae3bb"
[[asset]]
path = "crates/ui-egui/src/i18n/cs.tsv"
@@ -52,7 +52,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Brazilian Portuguese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "115ec3d852731d72f38ab578f87c4720d3703aa4476333b7b712550e35e8010d"
sha256 = "21c72b62bd3b0d6a3320e396e13ecc9dc952e76b8c457db5ed4d85f06c94370b"
[[asset]]
path = "crates/ui-egui/src/i18n/es.tsv"
@@ -63,7 +63,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Spanish UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "86c0fe08c6b52b841147a8dffcb3e6c080f649557d979ae0f7a80e1f322ca511"
sha256 = "c6bbe72bf89e3642853a8e608386d8a015e31ab6657f508333d8ff666ab75bef"
[[asset]]
path = "crates/ui-egui/src/i18n/fr.tsv"
@@ -74,7 +74,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "French UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "af81661d3c705efae149d77b5055980d37d5ee01c28bad41b27ef682b521a098"
sha256 = "c70f2295630e78c936da0f533fa4df33572047eb298e9bdc6b00357e428fa54d"
[[asset]]
path = "crates/ui-egui/src/i18n/de.tsv"
@@ -85,7 +85,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "German UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "f5e62db505ba7e974eacc64fa7ac2e0ba4955bfb466b4726cc3ba80ef94b1fb6"
sha256 = "c5674c627fe69f8e2f103de58b09b3808b6de927a0c23d629e2aa5e4a9d0662a"
[[asset]]
path = "crates/ui-egui/src/i18n/te.tsv"
@@ -96,7 +96,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Telugu UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "361eff32e4e7ef312667c7865adb2af3f2f684ce2bbb481124ba78e8a1715f2f"
sha256 = "614ec635e6a18770f5c7c2817dfd26f426239bb1610eab7f24d308882c59f1ba"
[[asset]]
path = "crates/ui-egui/src/i18n/it.tsv"
@@ -107,7 +107,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Italian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "82235760fda93084ce58d3b4da992b584080ccb871f4dc8eb5acbb4dfb2a3df3"
sha256 = "08007ca54168afeb35391b2ee6477bf4a034cb285d79b4807a09218e4956d417"
[[asset]]
path = "crates/ui-egui/src/i18n/pl.tsv"
@@ -118,7 +118,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Polish UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "5aa16fca81c03f0c7e03760c057a1658a7fdbcc58fb9216b8549aab0e428902a"
sha256 = "d4f4821c5dfb4ef900d525b70471af487583e2704c841717f52337e9f69a2ebf"
[[asset]]
path = "crates/ui-egui/src/i18n/ru.tsv"
@@ -129,7 +129,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Russian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "51441023d6960c92b799a80ff9c30acf63128e0061c945995548723802398068"
sha256 = "44f817bf7be5dafbd327c579fe1de7628bc623f060d1b995462b89ec9ced7fa4"
[[asset]]
path = "crates/ui-egui/src/i18n/hu.tsv"
@@ -140,7 +140,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Hungarian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "a4e94a2d0deaf79923bf4165c31bc60ac308be5fd120c0132b10abf7fd5bf7c9"
sha256 = "7c3147a98d190d51d32b97baef3c70ff8e8897ef5daf455ab211fa83e80e89eb"
[[asset]]
path = "crates/ui-egui/src/i18n/bg.tsv"
@@ -151,7 +151,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Bulgarian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "13ff66c5924b9db68279f2f936d83802251ac5fc03ca11b5ce97eacfabffc5ae"
sha256 = "a5e7999bd91ebfce11bee791c8c1764ceceac89fd3d3ae841c97df63c1279394"
[[asset]]
path = "crates/ui-egui/src/i18n/ja.tsv"
@@ -162,7 +162,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Japanese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "41db30fd76339586c5325036249733f159866ed1628410134249edeb4c3a2182"
sha256 = "5b1c282abe4891fbe306187b5ff920ea4a943c68ce5f8dbdd95c75f5f42bdb70"
[[asset]]
path = "crates/ui-egui/src/i18n/uk.tsv"
@@ -173,7 +173,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Ukrainian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "9ce62e7d757116846bbacbb6977650de79c31603d30fe8568cb08c8a85a98e38"
sha256 = "d87966fe1ab113fd9560d0c4aab34185fff5b40821db01def22d41a9ff3c9762"
[[asset]]
path = "crates/ui-egui/src/i18n/ar.tsv"
@@ -184,7 +184,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Arabic UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "cf1d78342ac5a45e03114cf9b7abf65b419a94d977bba94077c3046f0a7d8493"
sha256 = "78047120b89a9bc05863888bc7ec8898e3eac8a56cdae7bfa8a436c3080adacc"
[[asset]]
path = "assets/icons/accessibility.svg"
+2 -1
View File
@@ -321,7 +321,8 @@ pub fn mode_bar(app: &mut PdfCraftApp, ui: &mut egui::Ui) {
if icons::button(ui, "printer", 32.0, false, &tip).clicked() {
app.run_command("print.dialog");
}
if icons::button(ui, "save", 32.0, false, tl!("Save (M4)")).clicked() {
let tip = crate::commands::command_tip(ui.ctx(), tl!("Save ({key})"), "file.save");
if icons::button(ui, "save", 32.0, false, &tip).clicked() {
app.run_command("file.save");
}
let tip = crate::commands::command_tip(ui.ctx(), tl!("Document properties ({key})"), "file.properties");
+1 -1
View File
@@ -116,7 +116,7 @@
Convert تحويل
E-Sign توقيع إلكتروني
Print ({key}) طباعة ({key})
Save (M4) حفظ (M4)
Save ({key}) حفظ ({key})
Document properties ({key}) خصائص المستند ({key})
Find tools and commands البحث عن الأدوات والأوامر
Fit to height ملاءمة الارتفاع
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -1
View File
@@ -1091,7 +1091,7 @@
Dark gray theme Тъмносива тема
Light theme Светла тема
Print ({key}) Печат ({key})
Save (M4) Запиши (M4)
Save ({key}) Запиши ({key})
Document properties ({key}) Свойства на документа ({key})
Action Wizard… Съветник за действия…
Add Bates numbering… Добави номериране на Бейтс…
Can't render this file because it contains an unexpected character in line 8 and column 16.
+1 -1
View File
@@ -88,7 +88,7 @@
Convert Konvertieren
E-Sign E-Signatur
Print ({key}) Drucken ({key})
Save (M4) Speichern (M4)
Save ({key}) Speichern ({key})
Document properties ({key}) Dokumenteigenschaften ({key})
Find tools and commands Tools und Befehle suchen
Fit to height Seitenhöhe
Can't render this file because it contains an unexpected character in line 6 and column 51.
+1 -1
View File
@@ -109,7 +109,7 @@
Convert Convertir
E-Sign Firma electrónica
Print ({key}) Imprimir ({key})
Save (M4) Guardar (M4)
Save ({key}) Guardar ({key})
Document properties ({key}) Propiedades del documento ({key})
Find tools and commands Buscar herramientas y comandos
Fit to height Ajustar al alto
Can't render this file because it contains an unexpected character in line 6 and column 60.
+1 -1
View File
@@ -88,7 +88,7 @@
Convert Convertir
E-Sign Signature électronique
Print ({key}) Imprimer ({key})
Save (M4) Enregistrer (M4)
Save ({key}) Enregistrer ({key})
Document properties ({key}) Propriétés du document ({key})
Find tools and commands Rechercher des outils et des commandes
Fit to height Ajuster à la hauteur
Can't render this file because it contains an unexpected character in line 6 and column 39.
+1 -1
View File
@@ -86,7 +86,7 @@
Convert Konvertálás
E-Sign E-aláírás
Print ({key}) Nyomtatás ({key})
Save (M4) Mentés (M4)
Save ({key}) Mentés ({key})
Document properties ({key}) Dokumentum tulajdonságai ({key})
Find tools and commands Eszközök és parancsok keresése
Fit to height Magassághoz igazítás
Can't render this file because it contains an unexpected character in line 7 and column 44.
+1 -1
View File
@@ -112,7 +112,7 @@
Convert Converti
E-Sign Firma elettronica
Print ({key}) Stampa ({key})
Save (M4) Salva (M4)
Save ({key}) Salva ({key})
Document properties ({key}) Proprietà documento ({key})
Find tools and commands Trova strumenti e comandi
Fit to height Adatta all'altezza
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -1
View File
@@ -115,7 +115,7 @@
Convert 変換
E-Sign 電子署名
Print ({key}) 印刷({key})
Save (M4) 保存(M4)
Save ({key}) 保存({key})
Document properties ({key}) 文書のプロパティ({key})
Find tools and commands ツールとコマンドを検索
Fit to height 高さに合わせる
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -1
View File
@@ -111,7 +111,7 @@
Convert Konwertuj
E-Sign Podpis elektroniczny
Print (⌘P) Drukuj (⌘P)
Save (M4) Zapisz (M4)
Save ({key}) Zapisz ({key})
Document properties (⌘D) Właściwości dokumentu (⌘D)
Find tools and commands Znajdź narzędzia i polecenia
Fit to height Dopasuj do wysokości
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -1
View File
@@ -1033,7 +1033,7 @@
Dark gray theme Tema cinza escuro
Light theme Tema claro
Print ({key}) Imprimir ({key})
Save (M4) Salvar (M4)
Save ({key}) Salvar ({key})
Document properties ({key}) Propriedades do documento ({key})
Action Wizard… Assistente de ações…
Add Bates numbering… Adicionar numeração Bates…
Can't render this file because it contains an unexpected character in line 9 and column 16.
+1 -1
View File
@@ -109,7 +109,7 @@
Convert Конвертация
E-Sign Электронная подпись
Print ({key}) Печать ({key})
Save (M4) Сохранить (M4)
Save ({key}) Сохранить ({key})
Document properties ({key}) Свойства документа ({key})
Find tools and commands Найти инструменты и команды
Fit to height По высоте
Can't render this file because it contains an unexpected character in line 9 and column 16.
+1 -1
View File
@@ -92,7 +92,7 @@ comment menu Edit సవరించు
Convert మార్పిడి
E-Sign ఇ-సంతకం
Print ({key}) ముద్రించు ({key})
Save (M4) సేవ్ చేయి (M4)
Save ({key}) సేవ్ చేయి ({key})
Document properties ({key}) పత్ర లక్షణాలు ({key})
Find tools and commands సాధనాలను, కమాండ్‌లను కనుగొను
Fit to height ఎత్తుకు సరిపోయేలా
Can't render this file because it contains an unexpected character in line 13 and column 16.
+1 -1
View File
@@ -114,7 +114,7 @@
Convert Перетворення
E-Sign Електронний підпис
Print ({key}) Друк ({key})
Save (M4) Зберегти (M4)
Save ({key}) Зберегти ({key})
Document properties ({key}) Властивості документа ({key})
Find tools and commands Знайти інструменти й команди
Fit to height За висотою
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -1
View File
@@ -1098,7 +1098,7 @@
Dark gray theme 深灰色主题
Light theme 浅色主题
Print ({key}) 打印 ({key})
Save (M4) 保存 (M4)
Save ({key}) 保存 ({key})
Document properties ({key}) 文档属性 ({key})
Action Wizard… 操作向导…
Add Bates numbering… 添加贝茨编号…
Can't render this file because it contains an unexpected character in line 9 and column 16.
+1 -1
View File
@@ -1046,7 +1046,7 @@
Dark gray theme 深灰色主題
Light theme 淺色主題
Print ({key}) 列印({key})
Save (M4) 儲存(M4)
Save ({key}) 儲存({key})
Document properties ({key}) 文件內容({key})
Action Wizard… 動作精靈…
Add Bates numbering… 新增 Bates 編號…
Can't render this file because it contains an unexpected character in line 9 and column 16.
+18
View File
@@ -410,6 +410,24 @@ fn view_menu_and_tooltips_write_shortcuts_for_the_platform() {
assert_eq!(h.query_all_by_label_contains("Ctrl+").count(), 0, "no Ctrl+ on macOS");
}
#[test]
fn the_top_bar_save_button_names_its_shortcut_not_a_milestone() {
// #962: on Windows the Save button's tooltip and accessibility name read "Save (M4)",
// an internal milestone tag, while Print and Document properties named their shortcuts.
let mut h = harness();
h.ctx.set_os(OperatingSystem::Windows);
h.run_steps(2);
h.get_by_label("Save (Ctrl+S)");
h.get_by_label("Print (Ctrl+P)");
assert_eq!(h.query_all_by_label_contains("(M4)").count(), 0, "no milestone tag in the top bar");
assert_eq!(h.query_all_by_label_contains("⌘").count(), 0, "no ⌘ outside macOS");
let mut h = harness();
h.ctx.set_os(OperatingSystem::Mac);
h.run_steps(2);
h.get_by_label("Save (⌘S)");
}
#[test]
fn full_screen_toggles_by_shortcut_and_command_and_escape_leaves() {
let mut h = harness();