[IMP] menu proxmox : une icône à chaque entrée qui n'en portait pas

Ten of the eighteen entries carried no pictogram, and the eye picks one out
of such a list before it reads. Each takes the icon its siblings already use
elsewhere in the tool — 📋 lists, 🧹 cleans, 📊 measures, 🔍 previews, 📥
downloads, 🗂 catalogues, 🖥 tunnels a desktop — so the same picture keeps
meaning the same thing from one menu to the next. A table in the tests holds
the pairing, in both languages, and checks the menu still shows the entries
it freezes.

--- FR ---

Dix des dix-huit entrées ne portaient aucun pictogramme, et l'œil s'y repère
avant de lire. Chacune reçoit l'icône que ses semblables portent déjà
ailleurs dans l'outil — 📋 liste, 🧹 nettoie, 📊 mesure, 🔍 prévisualise, 📥
télécharge, 🗂 catalogue, 🖥 ouvre un bureau —, si bien qu'une même image
garde le même sens d'un menu à l'autre. Un tableau dans les tests fige le
couple, dans les deux langues, et vérifie que le menu affiche encore les
entrées qu'il fige.

Assisted-by: Claude Opus 5
This commit is contained in:
Mathieu Benoit 2026-09-14 14:41:19 -04:00
parent d4ec22ca4a
commit 7e3d0d1f88
2 changed files with 78 additions and 22 deletions

View file

@ -4338,48 +4338,48 @@ TRANSLATIONS = {
"en": "Selection (number): ",
},
"Deploy a VM on the Proxmox host": {
"fr": "Déployer une VM sur l'hôte Proxmox",
"en": "Deploy a VM on the Proxmox host",
"fr": "🚀 Déployer une VM sur l'hôte Proxmox",
"en": "🚀 Deploy a VM on the Proxmox host",
},
"Preview a deployment (dry-run, nothing sent)": {
"fr": "Prévisualiser un déploiement (dry-run, rien n'est envoyé)",
"en": "Preview a deployment (dry-run, nothing sent)",
"fr": "🔍 Prévisualiser un déploiement (dry-run, rien n'est envoyé)",
"en": "🔍 Preview a deployment (dry-run, nothing sent)",
},
"Download a cloud image on the host": {
"fr": "Télécharger une image cloud sur l'hôte",
"en": "Download a cloud image on the host",
"fr": "📥 Télécharger une image cloud sur l'hôte",
"en": "📥 Download a cloud image on the host",
},
"List VMs (qm list)": {
"fr": "Lister les VM (qm list)",
"en": "List VMs (qm list)",
"fr": "📋 Lister les VM (qm list)",
"en": "📋 List VMs (qm list)",
},
"Clean up (orphan disks)": {
"fr": "Nettoyer (disques orphelins)",
"en": "Clean up (orphan disks)",
"fr": "🧹 Nettoyer (disques orphelins)",
"en": "🧹 Clean up (orphan disks)",
},
"Statistics (host and VMs)": {
"fr": "Statistiques (hôte et VM)",
"en": "Statistics (host and VMs)",
"fr": "📊 Statistiques (hôte et VM)",
"en": "📊 Statistics (host and VMs)",
},
"Remote desktop tunnel (VNC/RDP over SSH)": {
"fr": "Tunnel bureau distant (VNC/RDP par SSH)",
"en": "Remote desktop tunnel (VNC/RDP over SSH)",
"fr": "🖥 Tunnel bureau distant (VNC/RDP par SSH)",
"en": "🖥 Remote desktop tunnel (VNC/RDP over SSH)",
},
"List available images and their specs": {
"fr": "Lister les images disponibles et leurs specs",
"en": "List available images and their specs",
"fr": "🗂 Lister les images disponibles et leurs specs",
"en": "🗂 List available images and their specs",
},
"Proxmox - example sequence (dry-run)": {
"fr": "Proxmox - exemple de séquence (dry-run)",
"en": "Proxmox - example sequence (dry-run)",
"fr": "🎬 Proxmox - exemple de séquence (dry-run)",
"en": "🎬 Proxmox - example sequence (dry-run)",
},
"Host": {
"fr": "Hôte",
"en": "Host",
"fr": "🏠 Hôte",
"en": "🏠 Host",
},
"Change the Proxmox host": {
"fr": "Changer d'hôte Proxmox",
"en": "Change the Proxmox host",
"fr": "🔀 Changer d'hôte Proxmox",
"en": "🔀 Change the Proxmox host",
},
"VM name (default: erplibre-<distro>): ": {
"fr": "Nom de la VM (défaut : erplibre-<distro>) : ",

View file

@ -296,6 +296,62 @@ class TestLaParitéProxmox(unittest.TestCase):
self.assertIn("execute_from_configuration", self.src)
class TestLesIconesDuMenuProxmox(unittest.TestCase):
"""L'icône vit DANS la chaîne traduite, et les deux langues la portent.
Une entrée sans icône se perd dans une liste de dix-huit : l'œil s'y
repère par le pictogramme avant de lire. Le même pictogramme dit la même
chose partout dans l'outil — 📋 liste, 🧹 nettoie, 📊 mesure — et ce
tableau est ce qui l'empêche de dériver d'un menu à l'autre.
"""
ICONES = {
"Deploy a VM on the Proxmox host": "🚀",
"Preview a deployment (dry-run, nothing sent)": "🔍",
"Download a cloud image on the host": "📥",
"Reopen install monitoring (last run / history)": "📈",
"List VMs (qm list)": "📋",
"Show a VM IP address": "🌐",
"Open the console on a VM": "🖥",
"Resize a VM disk": "📐",
"Delete VM(s)": "🗑",
"Clean up (orphan disks)": "🧹",
"Test a VM (open Odoo in a CLI browser)": "🧪",
"Statistics (host and VMs)": "📊",
"SSH configuration (~/.ssh/config, ProxyJump)": "🔑",
"Remote desktop tunnel (VNC/RDP over SSH)": "🖥",
"Android emulator (start, tunnel, scrcpy)": "📱",
"List available images and their specs": "🗂",
"Proxmox - example sequence (dry-run)": "🎬",
"Change the Proxmox host": "🔀",
"Host": "🏠",
}
def test_chaque_entree_porte_son_icone(self):
from script.todo import todo_i18n
for cle, icone in self.ICONES.items():
entree = todo_i18n.TRANSLATIONS[cle]
for langue in ("fr", "en"):
self.assertTrue(
entree[langue].startswith(icone),
f"« {cle} » ({langue}) ne commence pas par {icone} :"
f" {entree[langue]}",
)
def test_le_menu_affiche_bien_ces_entrees(self):
"""Le tableau ci-dessus ne vaut que s'il décrit le menu RÉEL : une
entrée renommée le laisserait figer une icône que personne ne voit."""
src = (TODO_DIR / "proxmox_menu.py").read_text(encoding="utf-8")
for cle in self.ICONES:
# La chaîne SEULE : une entrée longue s'écrit « t( » sur une
# ligne et sa chaîne sur la suivante, et chercher l'appel entier
# ne trouverait que les courtes.
self.assertIn(
f'"{cle}"', src, f"« {cle} » n'est plus dans le menu"
)
class TestLArbreDesMenus(unittest.TestCase):
"""L'écran de télémétrie lit le CODE, pas la classe assemblée.