[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:
parent
d4ec22ca4a
commit
7e3d0d1f88
2 changed files with 78 additions and 22 deletions
|
|
@ -4338,48 +4338,48 @@ TRANSLATIONS = {
|
||||||
"en": "Selection (number): ",
|
"en": "Selection (number): ",
|
||||||
},
|
},
|
||||||
"Deploy a VM on the Proxmox host": {
|
"Deploy a VM on the Proxmox host": {
|
||||||
"fr": "Déployer une VM sur l'hôte Proxmox",
|
"fr": "🚀 Déployer une VM sur l'hôte Proxmox",
|
||||||
"en": "Deploy a VM on the Proxmox host",
|
"en": "🚀 Deploy a VM on the Proxmox host",
|
||||||
},
|
},
|
||||||
"Preview a deployment (dry-run, nothing sent)": {
|
"Preview a deployment (dry-run, nothing sent)": {
|
||||||
"fr": "Prévisualiser un déploiement (dry-run, rien n'est envoyé)",
|
"fr": "🔍 Prévisualiser un déploiement (dry-run, rien n'est envoyé)",
|
||||||
"en": "Preview a deployment (dry-run, nothing sent)",
|
"en": "🔍 Preview a deployment (dry-run, nothing sent)",
|
||||||
},
|
},
|
||||||
"Download a cloud image on the host": {
|
"Download a cloud image on the host": {
|
||||||
"fr": "Télécharger une image cloud sur l'hôte",
|
"fr": "📥 Télécharger une image cloud sur l'hôte",
|
||||||
"en": "Download a cloud image on the host",
|
"en": "📥 Download a cloud image on the host",
|
||||||
},
|
},
|
||||||
"List VMs (qm list)": {
|
"List VMs (qm list)": {
|
||||||
"fr": "Lister les VM (qm list)",
|
"fr": "📋 Lister les VM (qm list)",
|
||||||
"en": "List VMs (qm list)",
|
"en": "📋 List VMs (qm list)",
|
||||||
},
|
},
|
||||||
"Clean up (orphan disks)": {
|
"Clean up (orphan disks)": {
|
||||||
"fr": "Nettoyer (disques orphelins)",
|
"fr": "🧹 Nettoyer (disques orphelins)",
|
||||||
"en": "Clean up (orphan disks)",
|
"en": "🧹 Clean up (orphan disks)",
|
||||||
},
|
},
|
||||||
"Statistics (host and VMs)": {
|
"Statistics (host and VMs)": {
|
||||||
"fr": "Statistiques (hôte et VM)",
|
"fr": "📊 Statistiques (hôte et VM)",
|
||||||
"en": "Statistics (host and VMs)",
|
"en": "📊 Statistics (host and VMs)",
|
||||||
},
|
},
|
||||||
"Remote desktop tunnel (VNC/RDP over SSH)": {
|
"Remote desktop tunnel (VNC/RDP over SSH)": {
|
||||||
"fr": "Tunnel bureau distant (VNC/RDP par SSH)",
|
"fr": "🖥 Tunnel bureau distant (VNC/RDP par SSH)",
|
||||||
"en": "Remote desktop tunnel (VNC/RDP over SSH)",
|
"en": "🖥 Remote desktop tunnel (VNC/RDP over SSH)",
|
||||||
},
|
},
|
||||||
"List available images and their specs": {
|
"List available images and their specs": {
|
||||||
"fr": "Lister les images disponibles et leurs specs",
|
"fr": "🗂 Lister les images disponibles et leurs specs",
|
||||||
"en": "List available images and their specs",
|
"en": "🗂 List available images and their specs",
|
||||||
},
|
},
|
||||||
"Proxmox - example sequence (dry-run)": {
|
"Proxmox - example sequence (dry-run)": {
|
||||||
"fr": "Proxmox - exemple de séquence (dry-run)",
|
"fr": "🎬 Proxmox - exemple de séquence (dry-run)",
|
||||||
"en": "Proxmox - example sequence (dry-run)",
|
"en": "🎬 Proxmox - example sequence (dry-run)",
|
||||||
},
|
},
|
||||||
"Host": {
|
"Host": {
|
||||||
"fr": "Hôte",
|
"fr": "🏠 Hôte",
|
||||||
"en": "Host",
|
"en": "🏠 Host",
|
||||||
},
|
},
|
||||||
"Change the Proxmox host": {
|
"Change the Proxmox host": {
|
||||||
"fr": "Changer d'hôte Proxmox",
|
"fr": "🔀 Changer d'hôte Proxmox",
|
||||||
"en": "Change the Proxmox host",
|
"en": "🔀 Change the Proxmox host",
|
||||||
},
|
},
|
||||||
"VM name (default: erplibre-<distro>): ": {
|
"VM name (default: erplibre-<distro>): ": {
|
||||||
"fr": "Nom de la VM (défaut : erplibre-<distro>) : ",
|
"fr": "Nom de la VM (défaut : erplibre-<distro>) : ",
|
||||||
|
|
|
||||||
|
|
@ -296,6 +296,62 @@ class TestLaParitéProxmox(unittest.TestCase):
|
||||||
self.assertIn("execute_from_configuration", self.src)
|
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):
|
class TestLArbreDesMenus(unittest.TestCase):
|
||||||
"""L'écran de télémétrie lit le CODE, pas la classe assemblée.
|
"""L'écran de télémétrie lit le CODE, pas la classe assemblée.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue