2026-03-07 02:59:07 -05:00
|
|
|
#!/usr/bin/env python3
|
2026-03-11 23:15:07 -04:00
|
|
|
# © 2021-2026 TechnoLibre (http://www.technolibre.ca)
|
2026-03-07 02:59:07 -05:00
|
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import re
|
|
|
|
|
|
2026-03-10 03:45:11 -04:00
|
|
|
ENV_VAR_FILE = "./env_var.sh"
|
2026-03-07 02:59:07 -05:00
|
|
|
|
|
|
|
|
_current_lang = None
|
|
|
|
|
|
|
|
|
|
TRANSLATIONS = {
|
|
|
|
|
# Main menu
|
|
|
|
|
"Importation success!": {
|
|
|
|
|
"fr": "L'importation est un succès!",
|
|
|
|
|
"en": "Importation success!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Opening TODO ...": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Ouverture de TODO en cours ...",
|
|
|
|
|
"en": "Opening TODO ...",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"=> Enter your choice by number and press Enter!": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "=> Entre tes directives par son chiffre et fait Entrée!",
|
|
|
|
|
"en": "=> Enter your choice by number and press Enter!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Command:": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Commande :",
|
|
|
|
|
"en": "Command:",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Execute": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Exécution",
|
|
|
|
|
"en": "Execute",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Install": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Installation",
|
|
|
|
|
"en": "Install",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Question": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Question",
|
|
|
|
|
"en": "Question",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Fork - Open TODO in a new tab": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Fork - Ouvre TODO dans une nouvelle tabulation",
|
|
|
|
|
"en": "Fork - Open TODO in a new tab",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Quit": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Quitter",
|
|
|
|
|
"en": "Quit",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Command not found !": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Commande non trouvée !",
|
|
|
|
|
"en": "Command not found !",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Back": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Retour",
|
|
|
|
|
"en": "Back",
|
|
|
|
|
},
|
|
|
|
|
# Execute submenu
|
2026-03-12 05:31:45 -04:00
|
|
|
"Run - Execute and install an instance": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Run - Exécuter et installer une instance",
|
|
|
|
|
"en": "Run - Execute and install an instance",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Automation - Demonstration of developed features": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Automatisation - Demonstration des fonctions développées",
|
|
|
|
|
"en": "Automation - Demonstration of developed features",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Update - Update all developed staging source code": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Mise à jour - Update all developed staging source code",
|
|
|
|
|
"en": "Update - Update all developed staging source code",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Code - Developer tools": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Code - Outil pour développeur",
|
|
|
|
|
"en": "Code - Developer tools",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Doc - Documentation search": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Doc - Recherche de documentation",
|
|
|
|
|
"en": "Doc - Documentation search",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Database - Database tools": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Database - Outils sur les bases de données",
|
|
|
|
|
"en": "Database - Database tools",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Process - Execution tools": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Process - Outils sur les executions",
|
|
|
|
|
"en": "Process - Execution tools",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Config - Configuration file management": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Config - Traitement du fichier de configuration",
|
|
|
|
|
"en": "Config - Configuration file management",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Network - Network tools": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Réseau - Outil réseautique",
|
|
|
|
|
"en": "Network - Network tools",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Security - Dependency security audit": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Sécurité - Audit de sécurité des dépendances",
|
|
|
|
|
"en": "Security - Dependency security audit",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"RTK - CLI proxy to reduce LLM token consumption": {
|
2026-03-12 02:51:01 -04:00
|
|
|
"fr": "RTK - Proxy CLI pour réduire la consommation de tokens LLM",
|
|
|
|
|
"en": "RTK - CLI proxy to reduce LLM token consumption",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Language - Change language / Changer la langue": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Langue - Changer la langue / Change language",
|
|
|
|
|
"en": "Language - Change language / Changer la langue",
|
|
|
|
|
},
|
2026-03-12 05:40:22 -04:00
|
|
|
# Deploy section
|
|
|
|
|
"Deploy - Deploy ERPLibre locally": {
|
|
|
|
|
"fr": "Déploiement - Déployer ERPLibre localement",
|
|
|
|
|
"en": "Deploy - Deploy ERPLibre locally",
|
|
|
|
|
},
|
|
|
|
|
"Deploy ERPLibre to a local directory!": {
|
|
|
|
|
"fr": "Déployer ERPLibre dans un répertoire local!",
|
|
|
|
|
"en": "Deploy ERPLibre to a local directory!",
|
|
|
|
|
},
|
|
|
|
|
"Clone ERPLibre locally (git clone)": {
|
|
|
|
|
"fr": "Cloner ERPLibre localement (git clone)",
|
|
|
|
|
"en": "Clone ERPLibre locally (git clone)",
|
|
|
|
|
},
|
|
|
|
|
"Target directory path (default: ~/erplibre): ": {
|
|
|
|
|
"fr": "Chemin du répertoire cible (défaut: ~/erplibre) : ",
|
|
|
|
|
"en": "Target directory path (default: ~/erplibre): ",
|
|
|
|
|
},
|
|
|
|
|
"Directory already exists: ": {
|
|
|
|
|
"fr": "Le répertoire existe déjà : ",
|
|
|
|
|
"en": "Directory already exists: ",
|
|
|
|
|
},
|
|
|
|
|
"Cloning ERPLibre...": {
|
|
|
|
|
"fr": "Clonage d'ERPLibre en cours...",
|
|
|
|
|
"en": "Cloning ERPLibre...",
|
|
|
|
|
},
|
|
|
|
|
"ERPLibre cloned successfully to: ": {
|
|
|
|
|
"fr": "ERPLibre cloné avec succès dans : ",
|
|
|
|
|
"en": "ERPLibre cloned successfully to: ",
|
|
|
|
|
},
|
|
|
|
|
"Error cloning ERPLibre: ": {
|
|
|
|
|
"fr": "Erreur lors du clonage d'ERPLibre : ",
|
|
|
|
|
"en": "Error cloning ERPLibre: ",
|
|
|
|
|
},
|
2026-03-22 22:28:24 -04:00
|
|
|
"Configure sshfs": {
|
|
|
|
|
"fr": "Configurer sshfs",
|
|
|
|
|
"en": "Configure sshfs",
|
|
|
|
|
},
|
2026-07-19 03:30:06 -04:00
|
|
|
"Local": {
|
|
|
|
|
"fr": "Local",
|
|
|
|
|
"en": "Local",
|
|
|
|
|
},
|
|
|
|
|
"SSH (remote host)": {
|
|
|
|
|
"fr": "SSH (hôte distant)",
|
|
|
|
|
"en": "SSH (remote host)",
|
|
|
|
|
},
|
2026-07-29 04:14:50 -04:00
|
|
|
"Remote & services": {
|
|
|
|
|
"fr": "Distant & services",
|
|
|
|
|
"en": "Remote & services",
|
|
|
|
|
},
|
|
|
|
|
"SSH (remote host)...": {
|
|
|
|
|
"fr": "SSH (hôte distant)…",
|
|
|
|
|
"en": "SSH (remote host)...",
|
|
|
|
|
},
|
|
|
|
|
"Deploy ERPLibre to a remote host over SSH!": {
|
|
|
|
|
"fr": "Déployer ERPLibre sur un hôte distant via SSH !",
|
|
|
|
|
"en": "Deploy ERPLibre to a remote host over SSH!",
|
|
|
|
|
},
|
2026-07-19 03:30:06 -04:00
|
|
|
"Virtualization & notifications": {
|
|
|
|
|
"fr": "Virtualisation & notifications",
|
|
|
|
|
"en": "Virtualization & notifications",
|
|
|
|
|
},
|
2026-07-19 03:41:00 -04:00
|
|
|
"Development": {
|
|
|
|
|
"fr": "Développement",
|
|
|
|
|
"en": "Development",
|
|
|
|
|
},
|
|
|
|
|
"Data": {
|
|
|
|
|
"fr": "Données",
|
|
|
|
|
"en": "Data",
|
|
|
|
|
},
|
|
|
|
|
"Sources & documentation": {
|
|
|
|
|
"fr": "Sources & documentation",
|
|
|
|
|
"en": "Sources & documentation",
|
|
|
|
|
},
|
|
|
|
|
"AI & automation": {
|
|
|
|
|
"fr": "IA & automatisation",
|
|
|
|
|
"en": "AI & automation",
|
|
|
|
|
},
|
|
|
|
|
"Deployment, network & security": {
|
|
|
|
|
"fr": "Déploiement, réseau & sécurité",
|
|
|
|
|
"en": "Deployment, network & security",
|
|
|
|
|
},
|
|
|
|
|
"Preferences": {
|
|
|
|
|
"fr": "Préférences",
|
|
|
|
|
"en": "Preferences",
|
|
|
|
|
},
|
|
|
|
|
"Deployment": {
|
[IMP] script todo: icônes devant les entrées du menu QEMU/KVM
Ajoute une icône descriptive devant chaque section et entrée du menu QEMU :
🚀 Déploiement / Déployer, 🔍 Prévisualiser, ⬇ Télécharger, 🛠 Gérer,
📋 Lister, 🌐 IP, 🖥 Console, 📐 Redimensionner, 🗑 Effacer, 🧹 Nettoyer,
📚 Catalogue, 🗂 Lister images.
Uniquement les VALEURS i18n (fr+en) changent -> aucune modif de todo.py, les
clés (et donc les appels t(...) + la télémétrie) restent inchangés.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:24:27 -04:00
|
|
|
"fr": "🚀 Déploiement",
|
|
|
|
|
"en": "🚀 Deployment",
|
2026-07-19 03:41:00 -04:00
|
|
|
},
|
|
|
|
|
"Manage": {
|
[IMP] script todo: icônes devant les entrées du menu QEMU/KVM
Ajoute une icône descriptive devant chaque section et entrée du menu QEMU :
🚀 Déploiement / Déployer, 🔍 Prévisualiser, ⬇ Télécharger, 🛠 Gérer,
📋 Lister, 🌐 IP, 🖥 Console, 📐 Redimensionner, 🗑 Effacer, 🧹 Nettoyer,
📚 Catalogue, 🗂 Lister images.
Uniquement les VALEURS i18n (fr+en) changent -> aucune modif de todo.py, les
clés (et donc les appels t(...) + la télémétrie) restent inchangés.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:24:27 -04:00
|
|
|
"fr": "🛠 Gérer",
|
|
|
|
|
"en": "🛠 Manage",
|
2026-07-19 03:41:00 -04:00
|
|
|
},
|
|
|
|
|
"Catalog": {
|
[IMP] script todo: icônes devant les entrées du menu QEMU/KVM
Ajoute une icône descriptive devant chaque section et entrée du menu QEMU :
🚀 Déploiement / Déployer, 🔍 Prévisualiser, ⬇ Télécharger, 🛠 Gérer,
📋 Lister, 🌐 IP, 🖥 Console, 📐 Redimensionner, 🗑 Effacer, 🧹 Nettoyer,
📚 Catalogue, 🗂 Lister images.
Uniquement les VALEURS i18n (fr+en) changent -> aucune modif de todo.py, les
clés (et donc les appels t(...) + la télémétrie) restent inchangés.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:24:27 -04:00
|
|
|
"fr": "📚 Catalogue",
|
|
|
|
|
"en": "📚 Catalog",
|
2026-07-19 03:41:00 -04:00
|
|
|
},
|
|
|
|
|
"Open the console on a VM": {
|
[IMP] script todo: icônes devant les entrées du menu QEMU/KVM
Ajoute une icône descriptive devant chaque section et entrée du menu QEMU :
🚀 Déploiement / Déployer, 🔍 Prévisualiser, ⬇ Télécharger, 🛠 Gérer,
📋 Lister, 🌐 IP, 🖥 Console, 📐 Redimensionner, 🗑 Effacer, 🧹 Nettoyer,
📚 Catalogue, 🗂 Lister images.
Uniquement les VALEURS i18n (fr+en) changent -> aucune modif de todo.py, les
clés (et donc les appels t(...) + la télémétrie) restent inchangés.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:24:27 -04:00
|
|
|
"fr": "🖥 Ouvrir la console d'une VM",
|
|
|
|
|
"en": "🖥 Open the console on a VM",
|
2026-07-19 03:41:00 -04:00
|
|
|
},
|
|
|
|
|
"Backup": {
|
|
|
|
|
"fr": "Sauvegarde",
|
|
|
|
|
"en": "Backup",
|
|
|
|
|
},
|
|
|
|
|
"Restore": {
|
|
|
|
|
"fr": "Restauration",
|
|
|
|
|
"en": "Restore",
|
|
|
|
|
},
|
|
|
|
|
"Danger zone": {
|
|
|
|
|
"fr": "Zone dangereuse",
|
|
|
|
|
"en": "Danger zone",
|
|
|
|
|
},
|
|
|
|
|
"Setup": {
|
|
|
|
|
"fr": "Installation",
|
|
|
|
|
"en": "Setup",
|
|
|
|
|
},
|
|
|
|
|
"Status": {
|
|
|
|
|
"fr": "Statut",
|
|
|
|
|
"en": "Status",
|
|
|
|
|
},
|
|
|
|
|
"Optimize": {
|
|
|
|
|
"fr": "Optimisation",
|
|
|
|
|
"en": "Optimize",
|
|
|
|
|
},
|
|
|
|
|
"Generate": {
|
|
|
|
|
"fr": "Génération",
|
|
|
|
|
"en": "Generate",
|
|
|
|
|
},
|
|
|
|
|
"Advanced": {
|
|
|
|
|
"fr": "Avancé",
|
|
|
|
|
"en": "Advanced",
|
|
|
|
|
},
|
|
|
|
|
"To leave the console, press Ctrl+] (then Enter).": {
|
|
|
|
|
"fr": "Pour quitter la console, appuyez sur Ctrl+] (puis Entrée).",
|
|
|
|
|
"en": "To leave the console, press Ctrl+] (then Enter).",
|
|
|
|
|
},
|
2026-07-19 03:47:33 -04:00
|
|
|
"Default login (if set at deploy): erplibre / erplibre": {
|
|
|
|
|
"fr": "Login par défaut (si défini au déploiement) : "
|
|
|
|
|
"erplibre / erplibre",
|
|
|
|
|
"en": "Default login (if set at deploy): erplibre / erplibre",
|
|
|
|
|
},
|
|
|
|
|
"Console password for 'erplibre' (default: erplibre): ": {
|
|
|
|
|
"fr": "Mot de passe console pour « erplibre » (défaut : erplibre) : ",
|
|
|
|
|
"en": "Console password for 'erplibre' (default: erplibre): ",
|
|
|
|
|
},
|
|
|
|
|
"Console/SSH login:": {
|
|
|
|
|
"fr": "Connexion console/SSH :",
|
|
|
|
|
"en": "Console/SSH login:",
|
|
|
|
|
},
|
|
|
|
|
"Default login:": {
|
|
|
|
|
"fr": "Login par défaut :",
|
|
|
|
|
"en": "Default login:",
|
|
|
|
|
},
|
|
|
|
|
"Add this VM to ~/.ssh/config? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Ajouter cette VM à ~/.ssh/config ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Add this VM to ~/.ssh/config? (y/N, default: no): ",
|
2026-07-19 03:47:33 -04:00
|
|
|
},
|
|
|
|
|
"Add each VM to ~/.ssh/config? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Ajouter chaque VM à ~/.ssh/config ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Add each VM to ~/.ssh/config? (y/N, default: no): ",
|
2026-07-19 03:47:33 -04:00
|
|
|
},
|
|
|
|
|
"Waiting for the VM IP (DHCP lease)...": {
|
|
|
|
|
"fr": "Attente de l'IP de la VM (bail DHCP)...",
|
|
|
|
|
"en": "Waiting for the VM IP (DHCP lease)...",
|
|
|
|
|
},
|
|
|
|
|
"No IP yet; add it later once the VM has booted.": {
|
|
|
|
|
"fr": "Pas encore d'IP ; à ajouter plus tard une fois la VM démarrée.",
|
|
|
|
|
"en": "No IP yet; add it later once the VM has booted.",
|
|
|
|
|
},
|
|
|
|
|
"Added to ~/.ssh/config:": {
|
|
|
|
|
"fr": "Ajouté à ~/.ssh/config :",
|
|
|
|
|
"en": "Added to ~/.ssh/config:",
|
|
|
|
|
},
|
2026-03-22 22:28:24 -04:00
|
|
|
"SSH address input method": {
|
|
|
|
|
"fr": "Méthode de saisie de l'adresse SSH",
|
|
|
|
|
"en": "SSH address input method",
|
|
|
|
|
},
|
|
|
|
|
"Manual entry": {
|
|
|
|
|
"fr": "Saisie manuelle",
|
|
|
|
|
"en": "Manual entry",
|
|
|
|
|
},
|
|
|
|
|
"From ~/.ssh/config": {
|
|
|
|
|
"fr": "Depuis ~/.ssh/config",
|
|
|
|
|
"en": "From ~/.ssh/config",
|
|
|
|
|
},
|
|
|
|
|
"Your choice (1/2): ": {
|
|
|
|
|
"fr": "Votre choix (1/2) : ",
|
|
|
|
|
"en": "Your choice (1/2): ",
|
|
|
|
|
},
|
|
|
|
|
"No SSH hosts found in ~/.ssh/config": {
|
|
|
|
|
"fr": "Aucun hôte SSH trouvé dans ~/.ssh/config",
|
|
|
|
|
"en": "No SSH hosts found in ~/.ssh/config",
|
|
|
|
|
},
|
|
|
|
|
"Select SSH host number: ": {
|
|
|
|
|
"fr": "Numéro de l'hôte SSH à sélectionner : ",
|
|
|
|
|
"en": "Select SSH host number: ",
|
|
|
|
|
},
|
|
|
|
|
"Invalid selection!": {
|
|
|
|
|
"fr": "Sélection invalide!",
|
|
|
|
|
"en": "Invalid selection!",
|
|
|
|
|
},
|
|
|
|
|
"SSH host (e.g.: user@192.168.1.100): ": {
|
|
|
|
|
"fr": "Hôte SSH (ex: user@192.168.1.100) : ",
|
|
|
|
|
"en": "SSH host (e.g.: user@192.168.1.100): ",
|
|
|
|
|
},
|
|
|
|
|
"SSH host is required!": {
|
|
|
|
|
"fr": "L'hôte SSH est requis!",
|
|
|
|
|
"en": "SSH host is required!",
|
|
|
|
|
},
|
|
|
|
|
"Mounting sshfs on: ": {
|
|
|
|
|
"fr": "Montage sshfs sur : ",
|
|
|
|
|
"en": "Mounting sshfs on: ",
|
|
|
|
|
},
|
|
|
|
|
"Mounted on: ": {
|
|
|
|
|
"fr": "Monté sur : ",
|
|
|
|
|
"en": "Mounted on: ",
|
|
|
|
|
},
|
|
|
|
|
"To unmount: ": {
|
|
|
|
|
"fr": "Pour démonter : ",
|
|
|
|
|
"en": "To unmount: ",
|
|
|
|
|
},
|
|
|
|
|
"Error mounting sshfs: ": {
|
|
|
|
|
"fr": "Erreur lors du montage sshfs : ",
|
|
|
|
|
"en": "Error mounting sshfs: ",
|
|
|
|
|
},
|
2026-03-12 02:51:01 -04:00
|
|
|
# RTK (Rust Token Killer)
|
2026-03-12 05:31:45 -04:00
|
|
|
"Manage RTK (Rust Token Killer) for token optimization!": {
|
2026-03-12 02:51:01 -04:00
|
|
|
"fr": "Gérer RTK (Rust Token Killer) pour optimiser les tokens!",
|
|
|
|
|
"en": "Manage RTK (Rust Token Killer) for token optimization!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Install RTK": {
|
2026-03-12 02:51:01 -04:00
|
|
|
"fr": "Installer RTK",
|
|
|
|
|
"en": "Install RTK",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Check RTK version": {
|
2026-03-12 02:51:01 -04:00
|
|
|
"fr": "Vérifier la version de RTK",
|
|
|
|
|
"en": "Check RTK version",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Show cumulative token savings": {
|
2026-03-12 02:51:01 -04:00
|
|
|
"fr": "Afficher les économies de tokens cumulées",
|
|
|
|
|
"en": "Show cumulative token savings",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Discover optimization opportunities": {
|
2026-03-12 02:51:01 -04:00
|
|
|
"fr": "Identifier les opportunités d'optimisation",
|
|
|
|
|
"en": "Discover optimization opportunities",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Initialize global auto-rewrite hook": {
|
2026-03-12 02:51:01 -04:00
|
|
|
"fr": "Initialiser le hook auto-rewrite global",
|
|
|
|
|
"en": "Initialize global auto-rewrite hook",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Check RTK status": {
|
2026-03-12 02:51:01 -04:00
|
|
|
"fr": "Vérifier le statut de RTK",
|
|
|
|
|
"en": "Check RTK status",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"RTK is not installed. Use option 1 to install it.": {
|
2026-03-12 02:51:01 -04:00
|
|
|
"fr": "RTK n'est pas installé. Utilisez l'option 1 pour l'installer.",
|
|
|
|
|
"en": "RTK is not installed. Use option 1 to install it.",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"RTK is installed, version: ": {
|
2026-03-12 02:51:01 -04:00
|
|
|
"fr": "RTK est installé, version : ",
|
|
|
|
|
"en": "RTK is installed, version: ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Global auto-rewrite hook: active": {
|
2026-03-12 02:51:01 -04:00
|
|
|
"fr": "Hook auto-rewrite global : actif",
|
|
|
|
|
"en": "Global auto-rewrite hook: active",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Global auto-rewrite hook: inactive": {
|
2026-03-12 02:51:01 -04:00
|
|
|
"fr": "Hook auto-rewrite global : inactif",
|
|
|
|
|
"en": "Global auto-rewrite hook: inactive",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Installation method:": {
|
2026-03-12 02:51:01 -04:00
|
|
|
"fr": "Méthode d'installation :",
|
|
|
|
|
"en": "Installation method:",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"curl - Automatic install script": {
|
2026-03-12 02:51:01 -04:00
|
|
|
"fr": "curl - Script d'installation automatique",
|
|
|
|
|
"en": "curl - Automatic install script",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"brew - Homebrew (macOS/Linux)": {
|
2026-03-12 02:51:01 -04:00
|
|
|
"fr": "brew - Homebrew (macOS/Linux)",
|
|
|
|
|
"en": "brew - Homebrew (macOS/Linux)",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"cargo - Build from source (Rust required)": {
|
2026-03-12 02:51:01 -04:00
|
|
|
"fr": "cargo - Compilation depuis les sources (Rust requis)",
|
|
|
|
|
"en": "cargo - Build from source (Rust required)",
|
|
|
|
|
},
|
2026-03-07 02:59:07 -05:00
|
|
|
# Prompts and messages
|
2026-03-12 05:31:45 -04:00
|
|
|
"Enter your password: ": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Entrez votre mot de passe : ",
|
|
|
|
|
"en": "Enter your password: ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Write your question ": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Écrit moi ta question ",
|
|
|
|
|
"en": "Write your question ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Do you want a new instance?": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Voulez-vous une nouvelle instance?",
|
|
|
|
|
"en": "Do you want a new instance?",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"SSH port-forwarding": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "SSH port-forwarding",
|
|
|
|
|
"en": "SSH port-forwarding",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Network performance request per second": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Performance réseau en requêtes par seconde",
|
|
|
|
|
"en": "Network performance request per second",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Setup queue job for parallelism": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Configurer la file d'attente pour l'exécution parallèle",
|
|
|
|
|
"en": "Setup queue job for parallelism",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Choose your database": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Choisir sa base de données",
|
|
|
|
|
"en": "Choose your database",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Development update": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Mise à jour du développement",
|
|
|
|
|
"en": "Development update",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"What do you need for development?": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Qu'avez-vous de besoin pour développer?",
|
|
|
|
|
"en": "What do you need for development?",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Looking for documentation?": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Vous cherchez de la documentation?",
|
|
|
|
|
"en": "Looking for documentation?",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Make changes to databases!": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Faites des modifications sur les bases de données!",
|
|
|
|
|
"en": "Make changes to databases!",
|
|
|
|
|
},
|
2026-06-25 02:25:40 -04:00
|
|
|
# Database drop / erase
|
|
|
|
|
"Erase a database": {
|
|
|
|
|
"fr": "Effacer une base de données",
|
|
|
|
|
"en": "Erase a database",
|
|
|
|
|
},
|
|
|
|
|
"Erase a database — irreversible operation!": {
|
|
|
|
|
"fr": "Effacer une base de données — opération irréversible !",
|
|
|
|
|
"en": "Erase a database — irreversible operation!",
|
|
|
|
|
},
|
|
|
|
|
"Erase ALL databases (make db_drop_all)": {
|
|
|
|
|
"fr": "Effacer TOUTES les bases de données (make db_drop_all)",
|
|
|
|
|
"en": "Erase ALL databases (make db_drop_all)",
|
|
|
|
|
},
|
|
|
|
|
"Erase a single database": {
|
|
|
|
|
"fr": "Effacer une seule base de données",
|
|
|
|
|
"en": "Erase a single database",
|
|
|
|
|
},
|
|
|
|
|
"You are about to erase ALL databases. This cannot be undone.": {
|
|
|
|
|
"fr": (
|
|
|
|
|
"Tu es sur le point d'effacer TOUTES les bases de données."
|
|
|
|
|
" C'est irréversible."
|
|
|
|
|
),
|
|
|
|
|
"en": "You are about to erase ALL databases. This cannot be undone.",
|
|
|
|
|
},
|
|
|
|
|
"You are about to erase the database '{database}'. This cannot be undone.": {
|
|
|
|
|
"fr": (
|
|
|
|
|
"Tu es sur le point d'effacer la base de données « {database} »."
|
|
|
|
|
" C'est irréversible."
|
|
|
|
|
),
|
|
|
|
|
"en": (
|
|
|
|
|
"You are about to erase the database '{database}'."
|
|
|
|
|
" This cannot be undone."
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
"Type 'oui' to confirm (default: no): ": {
|
|
|
|
|
"fr": "Tape « oui » pour confirmer (défaut : non) : ",
|
|
|
|
|
"en": "Type 'oui'/'yes' to confirm (default: no): ",
|
|
|
|
|
},
|
|
|
|
|
"Database deletion cancelled.": {
|
|
|
|
|
"fr": "Effacement de la base de données annulé.",
|
|
|
|
|
"en": "Database deletion cancelled.",
|
|
|
|
|
},
|
|
|
|
|
"No database selected.": {
|
|
|
|
|
"fr": "Aucune base de données sélectionnée.",
|
|
|
|
|
"en": "No database selected.",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Manage execution processes!": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Manipuler les processus d'exécution!",
|
|
|
|
|
"en": "Manage execution processes!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Manage ERPLibre and Odoo configuration!": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Manipuler la configuration ERPLibre et Odoo!",
|
|
|
|
|
"en": "Manage ERPLibre and Odoo configuration!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Network tools!": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Outil réseautique!",
|
|
|
|
|
"en": "Network tools!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Dependency security audit!": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Audit de securite des dépendances!",
|
|
|
|
|
"en": "Dependency security audit!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"The Bash script failed with return code": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Le script Bash a échoué avec le code de retour",
|
|
|
|
|
"en": "The Bash script failed with return code",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"No installed environment found. Install an Odoo version first.": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Aucun environnement installe trouve. Installez d'abord une version d'Odoo.",
|
|
|
|
|
"en": "No installed environment found. Install an Odoo version first.",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Choose an environment for the audit:": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Choisir un environnement pour l'audit :",
|
|
|
|
|
"en": "Choose an environment for the audit:",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Select: ": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Sélection : ",
|
|
|
|
|
"en": "Select: ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Error, cannot understand value": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Erreur, impossible de comprendre la valeur",
|
|
|
|
|
"en": "Error, cannot understand value",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Dependencies file not found: ": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Fichier de dépendances introuvable : ",
|
|
|
|
|
"en": "Dependencies file not found: ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Execution: ": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Execution : ",
|
|
|
|
|
"en": "Execution: ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Current": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Actuel",
|
|
|
|
|
"en": "Current",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Default": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Défaut",
|
|
|
|
|
"en": "Default",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Reboot TODO ...": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Reboot TODO ...",
|
|
|
|
|
"en": "Reboot TODO ...",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"pip-audit - Check vulnerabilities on Python environments": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "pip-audit - Verifier les vulnérabilités sur les environnements Python",
|
|
|
|
|
"en": "pip-audit - Check vulnerabilities on Python environments",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Will execute:": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Va exécuter :",
|
|
|
|
|
"en": "Will execute:",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Choose a version:": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Choisir une version :",
|
|
|
|
|
"en": "Choose a version:",
|
|
|
|
|
},
|
2026-03-30 14:46:56 -04:00
|
|
|
"Install type:": {
|
|
|
|
|
"fr": "Type d'installation :",
|
|
|
|
|
"en": "Install type:",
|
|
|
|
|
},
|
|
|
|
|
"Standard install (without extra modules)": {
|
|
|
|
|
"fr": "Installation standard (sans modules extra)",
|
|
|
|
|
"en": "Standard install (without extra modules)",
|
|
|
|
|
},
|
|
|
|
|
"Install with extra modules (CybroOdoo - large, slow)": {
|
|
|
|
|
"fr": "Installation avec modules extra (CybroOdoo - gros, lent)",
|
|
|
|
|
"en": "Install with extra modules (CybroOdoo - large, slow)",
|
|
|
|
|
},
|
2026-03-07 02:59:07 -05:00
|
|
|
# todo.json translatable prompt_descriptions
|
2026-03-12 05:31:45 -04:00
|
|
|
"Test - Minimal base instance": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Test - Instance de base minimale",
|
|
|
|
|
"en": "Test - Minimal base instance",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Open RobotLibre 🤖 minimal": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Ouvrir RobotLibre 🤖 minimal",
|
|
|
|
|
"en": "Open RobotLibre 🤖 minimal",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Open RobotLibre 🤖 with search enabled": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Ouvrir RobotLibre 🤖 en activant la recherche",
|
|
|
|
|
"en": "Open RobotLibre 🤖 with search enabled",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Open ERPLibre with TODO 🤖": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Ouvrir ERPLibre avec TODO 🤖",
|
|
|
|
|
"en": "Open ERPLibre with TODO 🤖",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Update all erplibre_base on database test": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Mise à jour de tous les erplibre_base sur la base de données test",
|
|
|
|
|
"en": "Update all erplibre_base on database test",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Show code status": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Afficher le statut du code",
|
|
|
|
|
"en": "Show code status",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Stash all code": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Remiser tout le code",
|
|
|
|
|
"en": "Stash all code",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Format modified code": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Formater le code modifié",
|
|
|
|
|
"en": "Format modified code",
|
|
|
|
|
},
|
|
|
|
|
# todo.py hardcoded prompt_descriptions
|
2026-03-12 05:31:45 -04:00
|
|
|
"Mobile - Compile and run software": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Mobile - Compiler et exécuter le logiciel",
|
|
|
|
|
"en": "Mobile - Compile and run software",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Upgrade Odoo - Migration Database": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Mise à jour Odoo - Migration de base de données",
|
|
|
|
|
"en": "Upgrade Odoo - Migration Database",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Upgrade Poetry - Dependency of Odoo": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Mise à jour Poetry - Dépendances d'Odoo",
|
|
|
|
|
"en": "Upgrade Poetry - Dependency of Odoo",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Open SHELL": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Ouvrir le SHELL",
|
|
|
|
|
"en": "Open SHELL",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Upgrade Module": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Mise à jour de module",
|
|
|
|
|
"en": "Upgrade Module",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Debug": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Débogage",
|
|
|
|
|
"en": "Debug",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Migration module coverage": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Couverture de migration des modules",
|
|
|
|
|
"en": "Migration module coverage",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"What change between version": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Quels changements entre les versions",
|
|
|
|
|
"en": "What change between version",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"OCA guidelines": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Directives OCA",
|
|
|
|
|
"en": "OCA guidelines",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"OCA migration Odoo 19 milestone": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Migration OCA Odoo 19 - Jalons",
|
|
|
|
|
"en": "OCA migration Odoo 19 milestone",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Download database to create backup (.zip)": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Télécharger une base de données pour créer une sauvegarde (.zip)",
|
|
|
|
|
"en": "Download database to create backup (.zip)",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Restore from backup (.zip)": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Restaurer a partir d'une sauvegarde (.zip)",
|
|
|
|
|
"en": "Restore from backup (.zip)",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Create backup (.zip)": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Créer une sauvegarde (.zip)",
|
|
|
|
|
"en": "Create backup (.zip)",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Kill Odoo process from actual port": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Terminer le processus Odoo du port actuel",
|
|
|
|
|
"en": "Kill Odoo process from actual port",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Kill git daemon server process": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Terminer le processus du serveur git daemon",
|
|
|
|
|
"en": "Kill git daemon server process",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Git daemon process killed.": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Processus git daemon terminé.",
|
|
|
|
|
"en": "Git daemon process killed.",
|
2026-03-07 02:59:07 -05:00
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Generate all configuration": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Générer toute la configuration",
|
|
|
|
|
"en": "Generate all configuration",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Generate from pre-configuration": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Générer a partir de la pre-configuration",
|
|
|
|
|
"en": "Generate from pre-configuration",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Generate from backup file": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Générer a partir d'un fichier de sauvegarde",
|
|
|
|
|
"en": "Generate from backup file",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Generate from database": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Générer a partir de la base de données",
|
|
|
|
|
"en": "Generate from database",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"base": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "base",
|
|
|
|
|
"en": "base",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"base + code_generator": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "base + code_generator",
|
|
|
|
|
"en": "base + code_generator",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"base + image_db": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "base + image_db",
|
|
|
|
|
"en": "base + image_db",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"all": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "tout",
|
|
|
|
|
"en": "all",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Debug todo.py": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Débogage todo.py",
|
|
|
|
|
"en": "Debug todo.py",
|
|
|
|
|
},
|
2026-03-08 15:53:51 -04:00
|
|
|
# Test section
|
2026-03-12 05:31:45 -04:00
|
|
|
"Test - Test an Odoo module": {
|
2026-03-08 15:53:51 -04:00
|
|
|
"fr": "Test - Tester un module Odoo",
|
|
|
|
|
"en": "Test - Test an Odoo module",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Test an Odoo module on a temporary database!": {
|
2026-03-08 15:53:51 -04:00
|
|
|
"fr": "Tester un module Odoo sur une base de données temporaire!",
|
|
|
|
|
"en": "Test an Odoo module on a temporary database!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Test a module": {
|
2026-03-08 15:53:51 -04:00
|
|
|
"fr": "Tester un module",
|
|
|
|
|
"en": "Test a module",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Test a module with code coverage": {
|
2026-03-08 15:53:51 -04:00
|
|
|
"fr": "Tester un module avec couverture de code",
|
|
|
|
|
"en": "Test a module with code coverage",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"ERPLibre unit tests": {
|
2026-03-10 01:44:10 -04:00
|
|
|
"fr": "Tests unitaires ERPLibre",
|
|
|
|
|
"en": "ERPLibre unit tests",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Running unit tests": {
|
2026-03-10 01:44:10 -04:00
|
|
|
"fr": "Exécution des tests unitaires",
|
|
|
|
|
"en": "Running unit tests",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"All unit tests passed": {
|
2026-03-10 01:44:10 -04:00
|
|
|
"fr": "Tous les tests unitaires ont réussi",
|
|
|
|
|
"en": "All unit tests passed",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Some unit tests failed, exit code": {
|
2026-03-10 01:44:10 -04:00
|
|
|
"fr": "Des tests unitaires ont échoué, code de sortie",
|
|
|
|
|
"en": "Some unit tests failed, exit code",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Module name to test: ": {
|
2026-03-08 15:53:51 -04:00
|
|
|
"fr": "Nom du module à tester : ",
|
|
|
|
|
"en": "Module name to test: ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Temporary database name (default: test_todo_tmp): ": {
|
2026-03-08 15:53:51 -04:00
|
|
|
"fr": "Nom de la base de données temporaire (défaut: test_todo_tmp) : ",
|
|
|
|
|
"en": "Temporary database name (default: test_todo_tmp): ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Extra modules to install (comma-separated, empty for none): ": {
|
2026-03-08 15:53:51 -04:00
|
|
|
"fr": "Modules supplémentaires à installer (séparés par des virgules, vide pour aucun) : ",
|
|
|
|
|
"en": "Extra modules to install (comma-separated, empty for none): ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Log level (default: test): ": {
|
2026-03-08 15:53:51 -04:00
|
|
|
"fr": "Niveau de log (défaut: test) : ",
|
|
|
|
|
"en": "Log level (default: test): ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Creating temporary database": {
|
2026-03-08 15:53:51 -04:00
|
|
|
"fr": "Création de la base de données temporaire",
|
|
|
|
|
"en": "Creating temporary database",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Installing modules": {
|
2026-03-08 15:53:51 -04:00
|
|
|
"fr": "Installation des modules",
|
|
|
|
|
"en": "Installing modules",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Running tests": {
|
2026-03-08 15:53:51 -04:00
|
|
|
"fr": "Exécution des tests",
|
|
|
|
|
"en": "Running tests",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Cleaning up temporary database": {
|
2026-03-08 15:53:51 -04:00
|
|
|
"fr": "Suppression de la base de données temporaire",
|
|
|
|
|
"en": "Cleaning up temporary database",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Keep the temporary database? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Conserver la base de données temporaire? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Keep the temporary database? (y/N, default: no): ",
|
2026-03-08 15:53:51 -04:00
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Database kept": {
|
2026-03-08 15:53:51 -04:00
|
|
|
"fr": "Base de données conservée",
|
|
|
|
|
"en": "Database kept",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Tests completed successfully!": {
|
2026-03-08 15:53:51 -04:00
|
|
|
"fr": "Tests terminés avec succès!",
|
|
|
|
|
"en": "Tests completed successfully!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Tests failed with return code": {
|
2026-03-08 15:53:51 -04:00
|
|
|
"fr": "Les tests ont échoué avec le code de retour",
|
|
|
|
|
"en": "Tests failed with return code",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Module name is required!": {
|
2026-03-08 15:53:51 -04:00
|
|
|
"fr": "Le nom du module est requis!",
|
|
|
|
|
"en": "Module name is required!",
|
|
|
|
|
},
|
2026-03-09 16:34:43 -04:00
|
|
|
# Git section
|
2026-03-12 05:31:45 -04:00
|
|
|
"Git - Git tools": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Git - Outils Git",
|
|
|
|
|
"en": "Git - Git tools",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Git management tools!": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Outils de gestion Git!",
|
|
|
|
|
"en": "Git management tools!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Local git server": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Serveur git local",
|
|
|
|
|
"en": "Local git server",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Manage local git repository server!": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Gérer le serveur de dépôts git local!",
|
|
|
|
|
"en": "Manage local git repository server!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Deploy a local git server (~/.git-server)": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Déployer un serveur git local (~/.git-server)",
|
|
|
|
|
"en": "Deploy a local git server (~/.git-server)",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Deploy a production git server (/srv/git, root required)": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Déployer un serveur git production (/srv/git, root requis)",
|
|
|
|
|
"en": "Deploy a production git server (/srv/git, root required)",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Starting git server deployment...": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Démarrage du déploiement du serveur git...",
|
|
|
|
|
"en": "Starting git server deployment...",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Local mode (~/.git-server)": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Mode local (~/.git-server)",
|
|
|
|
|
"en": "Local mode (~/.git-server)",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Production mode (/srv/git, root required)": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Mode production (/srv/git, root requis)",
|
|
|
|
|
"en": "Production mode (/srv/git, root required)",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Run all (init + remote + push + serve)": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Tout exécuter (init + remote + push + serve)",
|
|
|
|
|
"en": "Run all (init + remote + push + serve)",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Init - Create bare repos": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Init - Créer les bare repos",
|
|
|
|
|
"en": "Init - Create bare repos",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Remote - Add local remotes": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Remote - Ajouter les remotes locaux",
|
|
|
|
|
"en": "Remote - Add local remotes",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Push - Push to local server": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Push - Pousser vers le serveur local",
|
|
|
|
|
"en": "Push - Push to local server",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Serve - Start git daemon": {
|
2026-03-09 16:34:43 -04:00
|
|
|
"fr": "Serve - Démarrer le daemon git",
|
|
|
|
|
"en": "Serve - Start git daemon",
|
|
|
|
|
},
|
2026-03-12 04:04:52 -04:00
|
|
|
# Git remote add
|
2026-03-12 05:31:45 -04:00
|
|
|
"Add a remote to a local repository": {
|
2026-03-12 04:04:52 -04:00
|
|
|
"fr": "Ajouter un remote vers un dépôt local",
|
|
|
|
|
"en": "Add a remote to a local repository",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Remote name (default: localhost): ": {
|
2026-03-12 04:04:52 -04:00
|
|
|
"fr": "Nom du remote (défaut: localhost) : ",
|
|
|
|
|
"en": "Remote name (default: localhost): ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Repository address (e.g.: git://192.168.1.100/my-repo.git): ": {
|
2026-03-12 04:04:52 -04:00
|
|
|
"fr": "Adresse du dépôt (ex: git://192.168.1.100/mon-repo.git) : ",
|
|
|
|
|
"en": "Repository address (e.g.: git://192.168.1.100/my-repo.git): ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Repository address is required!": {
|
2026-03-12 04:04:52 -04:00
|
|
|
"fr": "L'adresse du dépôt est requise!",
|
|
|
|
|
"en": "Repository address is required!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Remote added successfully!": {
|
2026-03-12 04:04:52 -04:00
|
|
|
"fr": "Remote ajouté avec succès!",
|
|
|
|
|
"en": "Remote added successfully!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Error adding remote: ": {
|
2026-03-12 04:04:52 -04:00
|
|
|
"fr": "Erreur lors de l'ajout du remote : ",
|
|
|
|
|
"en": "Error adding remote: ",
|
|
|
|
|
},
|
|
|
|
|
# Git config vim
|
2026-03-12 05:31:45 -04:00
|
|
|
"Configure git local editor to vim": {
|
2026-03-12 04:04:52 -04:00
|
|
|
"fr": "Configuration git local par vim",
|
|
|
|
|
"en": "Configure git local editor to vim",
|
|
|
|
|
},
|
2026-03-22 22:21:16 -04:00
|
|
|
"Generate git patch to /tmp": {
|
|
|
|
|
"fr": "Générer une patch git dans /tmp",
|
|
|
|
|
"en": "Generate git patch to /tmp",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Git editor configured to vim successfully!": {
|
2026-03-12 04:04:52 -04:00
|
|
|
"fr": "Éditeur git configuré sur vim avec succès!",
|
|
|
|
|
"en": "Git editor configured to vim successfully!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Error during configuration: ": {
|
2026-03-12 04:04:52 -04:00
|
|
|
"fr": "Erreur lors de la configuration : ",
|
|
|
|
|
"en": "Error during configuration: ",
|
|
|
|
|
},
|
|
|
|
|
# GPT code - Claude automation
|
2026-03-12 05:31:45 -04:00
|
|
|
"Add an automation with Claude in todo.py": {
|
2026-03-12 04:04:52 -04:00
|
|
|
"fr": "Ajouter une automatisation avec Claude dans todo.py",
|
|
|
|
|
"en": "Add an automation with Claude in todo.py",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Description of the command to add: ": {
|
2026-03-12 04:04:52 -04:00
|
|
|
"fr": "Description de la commande à ajouter : ",
|
|
|
|
|
"en": "Description of the command to add: ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Bash command to execute: ": {
|
2026-03-12 04:04:52 -04:00
|
|
|
"fr": "Commande bash à exécuter : ",
|
|
|
|
|
"en": "Bash command to execute: ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Menu section (git/code/config/network/process): ": {
|
2026-03-12 04:04:52 -04:00
|
|
|
"fr": "Section du menu (git/code/config/network/process) : ",
|
|
|
|
|
"en": "Menu section (git/code/config/network/process): ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Automation added successfully in todo.json!": {
|
2026-03-12 04:04:52 -04:00
|
|
|
"fr": "Automatisation ajoutée avec succès dans todo.json!",
|
|
|
|
|
"en": "Automation added successfully in todo.json!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Error adding automation: ": {
|
2026-03-12 04:04:52 -04:00
|
|
|
"fr": "Erreur lors de l'ajout de l'automatisation : ",
|
|
|
|
|
"en": "Error adding automation: ",
|
|
|
|
|
},
|
[ADD] make: add SSH remote deployment targets and todo.py integration
Enable deploying and managing ERPLibre on remote servers via SSH
directly from make and the interactive todo.py CLI, since only
local deployment was previously supported.
- New conf/make.ssh.Makefile with 11 targets: ssh_check, ssh_push,
ssh_install, ssh_run, ssh_stop, ssh_restart, ssh_status, ssh_logs,
ssh_make, ssh_install_systemd, ssh_install_nginx
- Variables: SSH_HOST (required), SSH_USER, SSH_PORT, SSH_KEY,
SSH_PATH, SSH_TARGET, SSH_DOMAIN, SSH_ADMIN_EMAIL
- Execute > Deploy menu extended with 11 SSH options in todo.py
- All strings translated fr/en in todo_i18n.py
Generated by Claude Code 2.1.101 model claude-sonnet-4-6
Co-Authored-By: Mathieu Benoit <mathben@technolibre.ca>
2026-04-10 22:53:07 -04:00
|
|
|
# SSH Deploy section
|
|
|
|
|
"Deploy - Deploy ERPLibre via SSH": {
|
|
|
|
|
"fr": "Déploiement - Déployer ERPLibre via SSH",
|
|
|
|
|
"en": "Deploy - Deploy ERPLibre via SSH",
|
|
|
|
|
},
|
|
|
|
|
"SSH deployment tools!": {
|
|
|
|
|
"fr": "Outils de déploiement SSH!",
|
|
|
|
|
"en": "SSH deployment tools!",
|
|
|
|
|
},
|
|
|
|
|
"SSH - Check connection": {
|
|
|
|
|
"fr": "SSH - Vérifier la connexion",
|
|
|
|
|
"en": "SSH - Check connection",
|
|
|
|
|
},
|
|
|
|
|
"SSH - Sync files (rsync)": {
|
|
|
|
|
"fr": "SSH - Synchroniser les fichiers (rsync)",
|
|
|
|
|
"en": "SSH - Sync files (rsync)",
|
|
|
|
|
},
|
|
|
|
|
"SSH - Install ERPLibre": {
|
|
|
|
|
"fr": "SSH - Installer ERPLibre",
|
|
|
|
|
"en": "SSH - Install ERPLibre",
|
|
|
|
|
},
|
|
|
|
|
"SSH - Start Odoo": {
|
|
|
|
|
"fr": "SSH - Démarrer Odoo",
|
|
|
|
|
"en": "SSH - Start Odoo",
|
|
|
|
|
},
|
|
|
|
|
"SSH - Stop Odoo": {
|
|
|
|
|
"fr": "SSH - Arrêter Odoo",
|
|
|
|
|
"en": "SSH - Stop Odoo",
|
|
|
|
|
},
|
|
|
|
|
"SSH - Restart Odoo": {
|
|
|
|
|
"fr": "SSH - Redémarrer Odoo",
|
|
|
|
|
"en": "SSH - Restart Odoo",
|
|
|
|
|
},
|
|
|
|
|
"SSH - Service status": {
|
|
|
|
|
"fr": "SSH - Statut du service",
|
|
|
|
|
"en": "SSH - Service status",
|
|
|
|
|
},
|
|
|
|
|
"SSH - View logs": {
|
|
|
|
|
"fr": "SSH - Voir les logs",
|
|
|
|
|
"en": "SSH - View logs",
|
|
|
|
|
},
|
|
|
|
|
"SSH - Run make target": {
|
|
|
|
|
"fr": "SSH - Exécuter une cible make",
|
|
|
|
|
"en": "SSH - Run make target",
|
|
|
|
|
},
|
|
|
|
|
"SSH - Install systemd service": {
|
|
|
|
|
"fr": "SSH - Installer le service systemd",
|
|
|
|
|
"en": "SSH - Install systemd service",
|
|
|
|
|
},
|
|
|
|
|
"SSH - Configure nginx + SSL": {
|
|
|
|
|
"fr": "SSH - Configurer nginx + SSL",
|
|
|
|
|
"en": "SSH - Configure nginx + SSL",
|
|
|
|
|
},
|
|
|
|
|
"Remote host (user@hostname or hostname): ": {
|
|
|
|
|
"fr": "Hôte distant (user@hostname ou hostname) : ",
|
|
|
|
|
"en": "Remote host (user@hostname or hostname): ",
|
|
|
|
|
},
|
|
|
|
|
"SSH user (default: erplibre): ": {
|
|
|
|
|
"fr": "Utilisateur SSH (défaut: erplibre) : ",
|
|
|
|
|
"en": "SSH user (default: erplibre): ",
|
|
|
|
|
},
|
|
|
|
|
"SSH port (default: 22): ": {
|
|
|
|
|
"fr": "Port SSH (défaut: 22) : ",
|
|
|
|
|
"en": "SSH port (default: 22): ",
|
|
|
|
|
},
|
|
|
|
|
"SSH key path (default: ~/.ssh/id_rsa, empty for none): ": {
|
|
|
|
|
"fr": "Chemin de la clé SSH (défaut: ~/.ssh/id_rsa, vide pour aucune) : ",
|
|
|
|
|
"en": "SSH key path (default: ~/.ssh/id_rsa, empty for none): ",
|
|
|
|
|
},
|
|
|
|
|
"Remote path (default: ~/erplibre_deploy_2): ": {
|
|
|
|
|
"fr": "Chemin distant (défaut: ~/erplibre_deploy_2) : ",
|
|
|
|
|
"en": "Remote path (default: ~/erplibre_deploy_2): ",
|
|
|
|
|
},
|
|
|
|
|
"Make target to run remotely: ": {
|
|
|
|
|
"fr": "Cible make à exécuter à distance : ",
|
|
|
|
|
"en": "Make target to run remotely: ",
|
|
|
|
|
},
|
|
|
|
|
"Domain name (e.g.: example.com): ": {
|
|
|
|
|
"fr": "Nom de domaine (ex: example.com) : ",
|
|
|
|
|
"en": "Domain name (e.g.: example.com): ",
|
|
|
|
|
},
|
|
|
|
|
"Admin email for SSL certificate: ": {
|
|
|
|
|
"fr": "Email administrateur pour le certificat SSL : ",
|
|
|
|
|
"en": "Admin email for SSL certificate: ",
|
|
|
|
|
},
|
|
|
|
|
"SSH host is required!": {
|
|
|
|
|
"fr": "L'hôte SSH est requis!",
|
|
|
|
|
"en": "SSH host is required!",
|
|
|
|
|
},
|
2026-03-07 02:59:07 -05:00
|
|
|
# Language selection
|
2026-03-12 05:31:45 -04:00
|
|
|
"Choose language / Choisir la langue": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Choisir la langue / Choose language",
|
|
|
|
|
"en": "Choose language / Choisir la langue",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"French": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Francais",
|
|
|
|
|
"en": "French",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"English": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Anglais",
|
|
|
|
|
"en": "English",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Language changed to: English": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Langue changée pour : Francais",
|
|
|
|
|
"en": "Language changed to: English",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"TODO execution time": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Temps d'exécution TODO",
|
|
|
|
|
"en": "TODO execution time",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Keyboard interrupt": {
|
2026-03-07 02:59:07 -05:00
|
|
|
"fr": "Interruption clavier",
|
|
|
|
|
"en": "Keyboard interrupt",
|
|
|
|
|
},
|
2026-03-10 02:05:53 -04:00
|
|
|
# GPT code section
|
2026-03-12 05:31:45 -04:00
|
|
|
"GPT code - AI assistant tools": {
|
2026-03-10 02:05:53 -04:00
|
|
|
"fr": "GPT code - Outils d'assistant IA",
|
|
|
|
|
"en": "GPT code - AI assistant tools",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"AI assistant tools for development!": {
|
2026-03-10 02:05:53 -04:00
|
|
|
"fr": "Outils d'assistant IA pour le développement!",
|
|
|
|
|
"en": "AI assistant tools for development!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Configure Claude Code configurations": {
|
2026-03-12 04:37:19 -04:00
|
|
|
"fr": "Configurer les configurations Claude Code",
|
|
|
|
|
"en": "Configure Claude Code configurations",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Commit - OCA/Odoo commit command": {
|
2026-03-12 04:37:19 -04:00
|
|
|
"fr": "Commit - Commande de commit OCA/Odoo",
|
|
|
|
|
"en": "Commit - OCA/Odoo commit command",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Todo Add Command - Add a command to todo.py menu": {
|
2026-03-12 04:37:19 -04:00
|
|
|
"fr": "Todo Add Command - Ajouter une commande au menu todo.py",
|
|
|
|
|
"en": "Todo Add Command - Add a command to todo.py menu",
|
2026-03-10 02:05:53 -04:00
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Enter your full name: ": {
|
2026-03-10 02:05:53 -04:00
|
|
|
"fr": "Entrez votre nom complet : ",
|
|
|
|
|
"en": "Enter your full name: ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Enter your email: ": {
|
2026-03-10 02:05:53 -04:00
|
|
|
"fr": "Entrez votre courriel : ",
|
|
|
|
|
"en": "Enter your email: ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Deploy Claude Code commands!": {
|
2026-03-12 04:37:19 -04:00
|
|
|
"fr": "Déployer les commandes Claude Code!",
|
|
|
|
|
"en": "Deploy Claude Code commands!",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Show installed custom commands": {
|
2026-03-12 04:37:19 -04:00
|
|
|
"fr": "Afficher les commandes personnalisées installées",
|
|
|
|
|
"en": "Show installed custom commands",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"No custom commands found in ~/.claude/commands/": {
|
2026-03-12 04:37:19 -04:00
|
|
|
"fr": "Aucune commande personnalisée trouvée dans ~/.claude/commands/",
|
|
|
|
|
"en": "No custom commands found in ~/.claude/commands/",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Claude Code custom commands:": {
|
2026-03-12 04:37:19 -04:00
|
|
|
"fr": "Commandes personnalisées Claude Code :",
|
|
|
|
|
"en": "Claude Code custom commands:",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Total:": {
|
2026-03-12 04:37:19 -04:00
|
|
|
"fr": "Total :",
|
|
|
|
|
"en": "Total:",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"File already exists: ": {
|
2026-03-12 04:37:19 -04:00
|
|
|
"fr": "Le fichier existe déjà : ",
|
|
|
|
|
"en": "File already exists: ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Do you want to overwrite the file? (y/Y): ": {
|
2026-03-12 04:37:19 -04:00
|
|
|
"fr": "Voulez-vous écraser le fichier? (y/Y) : ",
|
|
|
|
|
"en": "Do you want to overwrite the file? (y/Y): ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Nothing to do.": {
|
2026-03-12 04:37:19 -04:00
|
|
|
"fr": "Rien à faire.",
|
|
|
|
|
"en": "Nothing to do.",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"File created successfully: ": {
|
2026-03-12 04:37:19 -04:00
|
|
|
"fr": "Fichier créé avec succès : ",
|
|
|
|
|
"en": "File created successfully: ",
|
|
|
|
|
},
|
2026-03-12 05:31:45 -04:00
|
|
|
"Error creating file: ": {
|
2026-03-10 02:05:53 -04:00
|
|
|
"fr": "Erreur lors de la création du fichier : ",
|
|
|
|
|
"en": "Error creating file: ",
|
|
|
|
|
},
|
2026-04-11 00:13:56 -04:00
|
|
|
# NTFY section
|
|
|
|
|
"Deploy - Install NTFY notification server": {
|
|
|
|
|
"fr": "Déployer - Installer le serveur de notifications NTFY",
|
|
|
|
|
"en": "Deploy - Install NTFY notification server",
|
|
|
|
|
},
|
|
|
|
|
"Deploy a local NTFY push notification server (Ubuntu/Arch)": {
|
|
|
|
|
"fr": "Déployer un serveur local de notifications NTFY (Ubuntu/Arch)",
|
|
|
|
|
"en": "Deploy a local NTFY push notification server (Ubuntu/Arch)",
|
|
|
|
|
},
|
|
|
|
|
"NTFY server port (default: 8080): ": {
|
|
|
|
|
"fr": "Port du serveur NTFY (défaut : 8080) : ",
|
|
|
|
|
"en": "NTFY server port (default: 8080): ",
|
|
|
|
|
},
|
|
|
|
|
"NTFY base URL": {
|
|
|
|
|
"fr": "URL de base NTFY",
|
|
|
|
|
"en": "NTFY base URL",
|
|
|
|
|
},
|
|
|
|
|
"Installing NTFY server (requires sudo)...": {
|
|
|
|
|
"fr": "Installation du serveur NTFY (sudo requis)...",
|
|
|
|
|
"en": "Installing NTFY server (requires sudo)...",
|
|
|
|
|
},
|
|
|
|
|
"NTFY server installed and started successfully!": {
|
|
|
|
|
"fr": "Serveur NTFY installé et démarré avec succès!",
|
|
|
|
|
"en": "NTFY server installed and started successfully!",
|
|
|
|
|
},
|
|
|
|
|
"Error installing NTFY server: ": {
|
|
|
|
|
"fr": "Erreur lors de l'installation du serveur NTFY : ",
|
|
|
|
|
"en": "Error installing NTFY server: ",
|
|
|
|
|
},
|
|
|
|
|
"NTFY install script not found: ": {
|
|
|
|
|
"fr": "Script d'installation NTFY introuvable : ",
|
|
|
|
|
"en": "NTFY install script not found: ",
|
|
|
|
|
},
|
2026-07-15 07:48:12 -04:00
|
|
|
# QEMU / KVM (libvirt) VM deployment
|
|
|
|
|
"QEMU/KVM - Deploy an Ubuntu VM (libvirt)": {
|
|
|
|
|
"fr": "QEMU/KVM - Déployer une VM Ubuntu (libvirt)",
|
|
|
|
|
"en": "QEMU/KVM - Deploy an Ubuntu VM (libvirt)",
|
|
|
|
|
},
|
|
|
|
|
"Deploy a QEMU/KVM virtual machine (libvirt)!": {
|
|
|
|
|
"fr": "Déployer une machine virtuelle QEMU/KVM (libvirt) !",
|
|
|
|
|
"en": "Deploy a QEMU/KVM virtual machine (libvirt)!",
|
|
|
|
|
},
|
|
|
|
|
"QEMU deploy script not found: ": {
|
|
|
|
|
"fr": "Script de déploiement QEMU introuvable : ",
|
|
|
|
|
"en": "QEMU deploy script not found: ",
|
|
|
|
|
},
|
[IMP] script qemu: multi-distro (Debian/Fedora), resilient osinfo, 26.04
Generalise the deployer beyond Ubuntu with a distro registry and a new
--distro flag (ubuntu default, debian, fedora). Each distro keeps its
own codenames, osinfo ids and per-version minimum RAM/disk. Image URLs
are built per distro (Ubuntu current/, Debian latest/, Fedora resolved
from the release index since it has no "latest" link).
Add --list-images to print the whole catalogue with specs, exposed in
the todo menu ("List available images and specs"); the deploy/download
flows now prompt for the distro first.
Resilient osinfo: when the local osinfo-db does not know an id (e.g.
ubuntu26.04, fedora43+), fall back to virt-install detect=on,require=off
instead of failing. Ubuntu 26.04 (resolute) is now enabled.
Also: throttle the download progress to integer-percent steps (single
updating line on a TTY, at most 101 lines when captured by the menu),
and skip the spurious "network is already active" error by checking the
libvirt network state before net-start.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 02:38:04 -04:00
|
|
|
"Deploy a new VM": {
|
|
|
|
|
"fr": "Déployer une nouvelle VM",
|
|
|
|
|
"en": "Deploy a new VM",
|
2026-07-15 07:48:12 -04:00
|
|
|
},
|
|
|
|
|
"Preview a deployment (dry-run, no sudo)": {
|
[IMP] script todo: icônes devant les entrées du menu QEMU/KVM
Ajoute une icône descriptive devant chaque section et entrée du menu QEMU :
🚀 Déploiement / Déployer, 🔍 Prévisualiser, ⬇ Télécharger, 🛠 Gérer,
📋 Lister, 🌐 IP, 🖥 Console, 📐 Redimensionner, 🗑 Effacer, 🧹 Nettoyer,
📚 Catalogue, 🗂 Lister images.
Uniquement les VALEURS i18n (fr+en) changent -> aucune modif de todo.py, les
clés (et donc les appels t(...) + la télémétrie) restent inchangés.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:24:27 -04:00
|
|
|
"fr": "🔍 Prévisualiser un déploiement (dry-run, sans sudo)",
|
|
|
|
|
"en": "🔍 Preview a deployment (dry-run, no sudo)",
|
2026-07-15 07:48:12 -04:00
|
|
|
},
|
[IMP] script qemu: multi-distro (Debian/Fedora), resilient osinfo, 26.04
Generalise the deployer beyond Ubuntu with a distro registry and a new
--distro flag (ubuntu default, debian, fedora). Each distro keeps its
own codenames, osinfo ids and per-version minimum RAM/disk. Image URLs
are built per distro (Ubuntu current/, Debian latest/, Fedora resolved
from the release index since it has no "latest" link).
Add --list-images to print the whole catalogue with specs, exposed in
the todo menu ("List available images and specs"); the deploy/download
flows now prompt for the distro first.
Resilient osinfo: when the local osinfo-db does not know an id (e.g.
ubuntu26.04, fedora43+), fall back to virt-install detect=on,require=off
instead of failing. Ubuntu 26.04 (resolute) is now enabled.
Also: throttle the download progress to integer-percent steps (single
updating line on a TTY, at most 101 lines when captured by the menu),
and skip the spurious "network is already active" error by checking the
libvirt network state before net-start.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 02:38:04 -04:00
|
|
|
"Download a cloud image only": {
|
[IMP] script todo: icônes devant les entrées du menu QEMU/KVM
Ajoute une icône descriptive devant chaque section et entrée du menu QEMU :
🚀 Déploiement / Déployer, 🔍 Prévisualiser, ⬇ Télécharger, 🛠 Gérer,
📋 Lister, 🌐 IP, 🖥 Console, 📐 Redimensionner, 🗑 Effacer, 🧹 Nettoyer,
📚 Catalogue, 🗂 Lister images.
Uniquement les VALEURS i18n (fr+en) changent -> aucune modif de todo.py, les
clés (et donc les appels t(...) + la télémétrie) restent inchangés.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:24:27 -04:00
|
|
|
"fr": "⬇ Télécharger seulement une image cloud",
|
|
|
|
|
"en": "⬇ Download a cloud image only",
|
2026-07-15 07:48:12 -04:00
|
|
|
},
|
|
|
|
|
"List VMs (virsh list --all)": {
|
[IMP] script todo: icônes devant les entrées du menu QEMU/KVM
Ajoute une icône descriptive devant chaque section et entrée du menu QEMU :
🚀 Déploiement / Déployer, 🔍 Prévisualiser, ⬇ Télécharger, 🛠 Gérer,
📋 Lister, 🌐 IP, 🖥 Console, 📐 Redimensionner, 🗑 Effacer, 🧹 Nettoyer,
📚 Catalogue, 🗂 Lister images.
Uniquement les VALEURS i18n (fr+en) changent -> aucune modif de todo.py, les
clés (et donc les appels t(...) + la télémétrie) restent inchangés.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:24:27 -04:00
|
|
|
"fr": "📋 Lister les VM (virsh list --all)",
|
|
|
|
|
"en": "📋 List VMs (virsh list --all)",
|
2026-07-15 07:48:12 -04:00
|
|
|
},
|
|
|
|
|
"Show a VM IP address": {
|
[IMP] script todo: icônes devant les entrées du menu QEMU/KVM
Ajoute une icône descriptive devant chaque section et entrée du menu QEMU :
🚀 Déploiement / Déployer, 🔍 Prévisualiser, ⬇ Télécharger, 🛠 Gérer,
📋 Lister, 🌐 IP, 🖥 Console, 📐 Redimensionner, 🗑 Effacer, 🧹 Nettoyer,
📚 Catalogue, 🗂 Lister images.
Uniquement les VALEURS i18n (fr+en) changent -> aucune modif de todo.py, les
clés (et donc les appels t(...) + la télémétrie) restent inchangés.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:24:27 -04:00
|
|
|
"fr": "🌐 Afficher l'adresse IP d'une VM",
|
|
|
|
|
"en": "🌐 Show a VM IP address",
|
2026-07-15 07:48:12 -04:00
|
|
|
},
|
[IMP] script qemu: multi-distro (Debian/Fedora), resilient osinfo, 26.04
Generalise the deployer beyond Ubuntu with a distro registry and a new
--distro flag (ubuntu default, debian, fedora). Each distro keeps its
own codenames, osinfo ids and per-version minimum RAM/disk. Image URLs
are built per distro (Ubuntu current/, Debian latest/, Fedora resolved
from the release index since it has no "latest" link).
Add --list-images to print the whole catalogue with specs, exposed in
the todo menu ("List available images and specs"); the deploy/download
flows now prompt for the distro first.
Resilient osinfo: when the local osinfo-db does not know an id (e.g.
ubuntu26.04, fedora43+), fall back to virt-install detect=on,require=off
instead of failing. Ubuntu 26.04 (resolute) is now enabled.
Also: throttle the download progress to integer-percent steps (single
updating line on a TTY, at most 101 lines when captured by the menu),
and skip the spurious "network is already active" error by checking the
libvirt network state before net-start.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 02:38:04 -04:00
|
|
|
"List available images and specs": {
|
[IMP] script todo: icônes devant les entrées du menu QEMU/KVM
Ajoute une icône descriptive devant chaque section et entrée du menu QEMU :
🚀 Déploiement / Déployer, 🔍 Prévisualiser, ⬇ Télécharger, 🛠 Gérer,
📋 Lister, 🌐 IP, 🖥 Console, 📐 Redimensionner, 🗑 Effacer, 🧹 Nettoyer,
📚 Catalogue, 🗂 Lister images.
Uniquement les VALEURS i18n (fr+en) changent -> aucune modif de todo.py, les
clés (et donc les appels t(...) + la télémétrie) restent inchangés.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:24:27 -04:00
|
|
|
"fr": "🗂 Lister les images disponibles et leurs specs",
|
|
|
|
|
"en": "🗂 List available images and specs",
|
2026-07-15 07:48:12 -04:00
|
|
|
},
|
[IMP] script qemu: multi-distro (Debian/Fedora), resilient osinfo, 26.04
Generalise the deployer beyond Ubuntu with a distro registry and a new
--distro flag (ubuntu default, debian, fedora). Each distro keeps its
own codenames, osinfo ids and per-version minimum RAM/disk. Image URLs
are built per distro (Ubuntu current/, Debian latest/, Fedora resolved
from the release index since it has no "latest" link).
Add --list-images to print the whole catalogue with specs, exposed in
the todo menu ("List available images and specs"); the deploy/download
flows now prompt for the distro first.
Resilient osinfo: when the local osinfo-db does not know an id (e.g.
ubuntu26.04, fedora43+), fall back to virt-install detect=on,require=off
instead of failing. Ubuntu 26.04 (resolute) is now enabled.
Also: throttle the download progress to integer-percent steps (single
updating line on a TTY, at most 101 lines when captured by the menu),
and skip the spurious "network is already active" error by checking the
libvirt network state before net-start.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 02:38:04 -04:00
|
|
|
"Distribution:": {
|
|
|
|
|
"fr": "Distribution :",
|
|
|
|
|
"en": "Distribution:",
|
2026-07-15 07:48:12 -04:00
|
|
|
},
|
[IMP] script qemu: multi-distro (Debian/Fedora), resilient osinfo, 26.04
Generalise the deployer beyond Ubuntu with a distro registry and a new
--distro flag (ubuntu default, debian, fedora). Each distro keeps its
own codenames, osinfo ids and per-version minimum RAM/disk. Image URLs
are built per distro (Ubuntu current/, Debian latest/, Fedora resolved
from the release index since it has no "latest" link).
Add --list-images to print the whole catalogue with specs, exposed in
the todo menu ("List available images and specs"); the deploy/download
flows now prompt for the distro first.
Resilient osinfo: when the local osinfo-db does not know an id (e.g.
ubuntu26.04, fedora43+), fall back to virt-install detect=on,require=off
instead of failing. Ubuntu 26.04 (resolute) is now enabled.
Also: throttle the download progress to integer-percent steps (single
updating line on a TTY, at most 101 lines when captured by the menu),
and skip the spurious "network is already active" error by checking the
libvirt network state before net-start.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 02:38:04 -04:00
|
|
|
"Choice (number or name, default: ubuntu): ": {
|
|
|
|
|
"fr": "Choix (numéro ou nom, défaut : ubuntu) : ",
|
|
|
|
|
"en": "Choice (number or name, default: ubuntu): ",
|
|
|
|
|
},
|
|
|
|
|
"Invalid selection, using ubuntu": {
|
|
|
|
|
"fr": "Sélection invalide, utilisation d'ubuntu",
|
|
|
|
|
"en": "Invalid selection, using ubuntu",
|
|
|
|
|
},
|
|
|
|
|
"Version for": {
|
|
|
|
|
"fr": "Version pour",
|
|
|
|
|
"en": "Version for",
|
|
|
|
|
},
|
[ADD] script qemu: support architecture s390x (IBM Z, Ubuntu)
Ajoute --arch s390x au déploiement QEMU. Réalité constatée (juillet 2026) :
seul Ubuntu publie des images cloud s390x (cloud-images.ubuntu.com : OK) ;
Debian et Fedora n'en publient pas (404), Arch ne cible que x86_64/aarch64.
s390x est donc scopé à Ubuntu et rejeté proprement pour les autres distros.
deploy_qemu.py :
- FOREIGN_ARCHES / S390X_DISTROS : s390x n'est valide que pour Ubuntu.
- virt_install : sur s390x -> --arch s390x, --machine s390-ccw-virtio,
--virt-type qemu (émulation TCG, pas de KVM sur hôte x86), console SCLP
(pas de série ISA), amorçage IPL/zipl (aucun --boot UEFI/BIOS). Les
disques/réseau bus=virtio sont mappés en virtio-ccw par libvirt.
- ensure_s390x_emulator : installe qemu-system-s390x au besoin
(apt: qemu-system-misc, dnf: qemu-system-s390x, pacman:
qemu-emulators-full, zypper: qemu-s390).
- Avertit que s390x est ÉMULÉ (lent) sur un hôte x86.
todo.py : le menu « Déployer une VM » demande l'architecture (s390x proposé
uniquement pour Ubuntu, avec avertissement lenteur) et passe --arch.
install_debian_dependency.sh : wkhtmltopdf n'a pas de build s390x -> skip
best-effort au lieu d'avorter l'install (la branche s390x rust-all existait
déjà pour compiler les wheels).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-28 03:03:19 -04:00
|
|
|
"Architecture:": {
|
|
|
|
|
"fr": "Architecture :",
|
|
|
|
|
"en": "Architecture:",
|
|
|
|
|
},
|
2026-07-28 03:35:25 -04:00
|
|
|
"native": {
|
|
|
|
|
"fr": "native",
|
|
|
|
|
"en": "native",
|
|
|
|
|
},
|
|
|
|
|
"IBM Z — emulated, slow on x86; Ubuntu only": {
|
|
|
|
|
"fr": "IBM Z — émulé, lent sur x86 ; Ubuntu uniquement",
|
|
|
|
|
"en": "IBM Z — emulated, slow on x86; Ubuntu only",
|
|
|
|
|
},
|
[IMP] script qemu: support arm64/aarch64 (+ archi native marquée d'un *)
Ajoute l'architecture arm64 (aarch64) au déploiement, en plus d'amd64
(x86_64) et s390x. Disponibilité réelle vérifiée (juillet 2026) :
- arm64 : Ubuntu, Debian, Fedora (Arch : pas d'image cloud aarch64 -> rejet).
- s390x : Ubuntu seulement (inchangé).
deploy_qemu.py :
- host_arch() : arch native de l'hôte ; toute arch différente est ÉMULÉE
(TCG, --virt-type qemu) — plus de liste FOREIGN_ARCHES figée.
- virt_install : arm64 -> --arch aarch64 --machine virt --boot uefi (firmware
AAVMF résolu par libvirt) ; s390x inchangé ; x86 UEFI/OVMF inchangé.
- ensure_emulator(arch) généralisé : installe qemu-system-aarch64 + firmware
UEFI AAVMF (arm64) ou qemu-system-s390x (s390x), selon le gestionnaire de
paquets, avec vérif de présence (binaire + firmware pour arm64).
- Validation --arch tôt via ARCH_DISTRO_SUPPORT (message clair si la distro
ne publie pas l'arch). Les URLs d'images arm64 marchent déjà via les alias
(fedora/arch aarch64 ; ubuntu/debian arm64).
todo.py : menus d'architecture (VM unique + infra) proposent amd64/arm64/
s390x selon la distro ; l'architecture NATIVE de l'hôte est marquée d'un *
(défaut) ; les autres sont signalées « émulé, lent ». Le catalogue infra est
restreint aux distros publiant l'arch choisie (arm64 -> ubuntu/debian/fedora,
s390x -> ubuntu).
install_debian_dependency.sh : wkhtmltopdf (deb amd64 en dur) ignoré
best-effort sur toute arch non-x86_64 (au lieu d'avorter l'install).
Validé : dry-runs Ubuntu/Debian/Fedora arm64 (bonnes URLs + virt-install
aarch64/virt/uefi/qemu), rejet Arch arm64, non-régression s390x, menus et
filtrage simulés (natif *, arm64 par distro).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-28 03:56:20 -04:00
|
|
|
"IBM Z — emulated, slow; Ubuntu only": {
|
|
|
|
|
"fr": "IBM Z — émulé, lent ; Ubuntu uniquement",
|
|
|
|
|
"en": "IBM Z — emulated, slow; Ubuntu only",
|
|
|
|
|
},
|
|
|
|
|
"ARM 64-bit — emulated, slow": {
|
|
|
|
|
"fr": "ARM 64 bits — émulé, lent",
|
|
|
|
|
"en": "ARM 64-bit — emulated, slow",
|
|
|
|
|
},
|
|
|
|
|
"emulated, slow": {
|
|
|
|
|
"fr": "émulé, lent",
|
|
|
|
|
"en": "emulated, slow",
|
|
|
|
|
},
|
|
|
|
|
"This architecture is emulated (TCG): boot and install are"
|
|
|
|
|
" much slower than the native one.": {
|
|
|
|
|
"fr": "Cette architecture est émulée (TCG) : le boot et l'installation"
|
|
|
|
|
" sont bien plus lents que l'architecture native.",
|
|
|
|
|
"en": "This architecture is emulated (TCG): boot and install are"
|
|
|
|
|
" much slower than the native one.",
|
|
|
|
|
},
|
|
|
|
|
"images for this arch only exist for:": {
|
|
|
|
|
"fr": "images pour cette architecture disponibles seulement pour :",
|
|
|
|
|
"en": "images for this arch only exist for:",
|
|
|
|
|
},
|
2026-07-28 04:51:45 -04:00
|
|
|
"All supported architectures": {
|
|
|
|
|
"fr": "Toutes les architectures supportées",
|
|
|
|
|
"en": "All supported architectures",
|
|
|
|
|
},
|
2026-07-28 04:57:36 -04:00
|
|
|
"installation": {
|
|
|
|
|
"fr": "installation",
|
|
|
|
|
"en": "installation",
|
|
|
|
|
},
|
2026-07-28 05:39:59 -04:00
|
|
|
"Resources per VM (x1 = catalog minimum):": {
|
|
|
|
|
"fr": "Ressources par VM (x1 = minimum catalogue) :",
|
|
|
|
|
"en": "Resources per VM (x1 = catalog minimum):",
|
|
|
|
|
},
|
|
|
|
|
"Host:": {
|
|
|
|
|
"fr": "Hôte :",
|
|
|
|
|
"en": "Host:",
|
|
|
|
|
},
|
|
|
|
|
"free": {
|
|
|
|
|
"fr": "libres",
|
|
|
|
|
"en": "free",
|
|
|
|
|
},
|
|
|
|
|
"free RAM unknown": {
|
|
|
|
|
"fr": "RAM libre inconnue",
|
|
|
|
|
"en": "free RAM unknown",
|
|
|
|
|
},
|
|
|
|
|
"> host free RAM": {
|
|
|
|
|
"fr": "> RAM libre de l'hôte",
|
|
|
|
|
"en": "> host free RAM",
|
|
|
|
|
},
|
|
|
|
|
"total RAM": {
|
|
|
|
|
"fr": "RAM totale",
|
|
|
|
|
"en": "total RAM",
|
|
|
|
|
},
|
|
|
|
|
"Choice (1-4, default 1):": {
|
|
|
|
|
"fr": "Choix (1-4, défaut 1) :",
|
|
|
|
|
"en": "Choice (1-4, default 1):",
|
|
|
|
|
},
|
[IMP] script todo: fusionner « Déployer VM » et « infra » + renommage granulaire
Le menu QEMU avait deux commandes de déploiement redondantes : [1] « Déployer
une VM » (mono, noms/ressources personnalisés) et [4] « Déployer l'infra »
(multi, matrice distro×version×archi). Elles sont FUSIONNÉES en une seule,
[1] « Déployer une ou plusieurs VM » (_qemu_deploy), qui gère aussi bien 1 VM
que N, avec :
- renommage GRANULAIRE des VM à la demande (_qemu_customize_names) : noms
auto par défaut, on en renomme certains par numéros séparés de virgules ;
- multiplicateur de ressources (x1..x4) déjà présent ;
- aperçu dry-run ([2]) qui passe par le même flux et imprime les commandes
deploy_qemu (--dry-run) via le helper partagé _qemu_build_deploy_parts.
Menu simplifié : [1] Déployer une/plusieurs VM, [2] Aperçu (dry-run),
[3] Télécharger une image, puis Gérer/Catalogue renumérotés. Code mort retiré
(_qemu_deploy_vm, _qemu_prompt_arch, _normalize_disk_size,
_qemu_offer_ssh_config).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 04:25:38 -04:00
|
|
|
"Deploy VM(s) (one or many)": {
|
[IMP] script todo: icônes devant les entrées du menu QEMU/KVM
Ajoute une icône descriptive devant chaque section et entrée du menu QEMU :
🚀 Déploiement / Déployer, 🔍 Prévisualiser, ⬇ Télécharger, 🛠 Gérer,
📋 Lister, 🌐 IP, 🖥 Console, 📐 Redimensionner, 🗑 Effacer, 🧹 Nettoyer,
📚 Catalogue, 🗂 Lister images.
Uniquement les VALEURS i18n (fr+en) changent -> aucune modif de todo.py, les
clés (et donc les appels t(...) + la télémétrie) restent inchangés.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:24:27 -04:00
|
|
|
"fr": "🚀 Déployer une ou plusieurs VM",
|
|
|
|
|
"en": "🚀 Deploy VM(s) (one or many)",
|
[IMP] script todo: fusionner « Déployer VM » et « infra » + renommage granulaire
Le menu QEMU avait deux commandes de déploiement redondantes : [1] « Déployer
une VM » (mono, noms/ressources personnalisés) et [4] « Déployer l'infra »
(multi, matrice distro×version×archi). Elles sont FUSIONNÉES en une seule,
[1] « Déployer une ou plusieurs VM » (_qemu_deploy), qui gère aussi bien 1 VM
que N, avec :
- renommage GRANULAIRE des VM à la demande (_qemu_customize_names) : noms
auto par défaut, on en renomme certains par numéros séparés de virgules ;
- multiplicateur de ressources (x1..x4) déjà présent ;
- aperçu dry-run ([2]) qui passe par le même flux et imprime les commandes
deploy_qemu (--dry-run) via le helper partagé _qemu_build_deploy_parts.
Menu simplifié : [1] Déployer une/plusieurs VM, [2] Aperçu (dry-run),
[3] Télécharger une image, puis Gérer/Catalogue renumérotés. Code mort retiré
(_qemu_deploy_vm, _qemu_prompt_arch, _normalize_disk_size,
_qemu_offer_ssh_config).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 04:25:38 -04:00
|
|
|
},
|
|
|
|
|
"Deploy ERPLibre VM(s)!": {
|
|
|
|
|
"fr": "Déployer une ou plusieurs VM ERPLibre !",
|
|
|
|
|
"en": "Deploy ERPLibre VM(s)!",
|
|
|
|
|
},
|
|
|
|
|
"VM names (default = auto):": {
|
|
|
|
|
"fr": "Noms des VM (défaut = auto) :",
|
|
|
|
|
"en": "VM names (default = auto):",
|
|
|
|
|
},
|
|
|
|
|
"Rename which VMs? (numbers, comma-separated; blank = none): ": {
|
|
|
|
|
"fr": "Renommer quelles VM ? (numéros séparés par des virgules ; "
|
|
|
|
|
"vide = aucune) : ",
|
|
|
|
|
"en": "Rename which VMs? (numbers, comma-separated; blank = none): ",
|
|
|
|
|
},
|
|
|
|
|
"->": {
|
|
|
|
|
"fr": "->",
|
|
|
|
|
"en": "->",
|
|
|
|
|
},
|
|
|
|
|
"Duplicate names detected; keeping as entered.": {
|
|
|
|
|
"fr": "Noms en double détectés ; conservés tels quels.",
|
|
|
|
|
"en": "Duplicate names detected; keeping as entered.",
|
|
|
|
|
},
|
|
|
|
|
"Preview (dry-run):": {
|
|
|
|
|
"fr": "Aperçu (dry-run) :",
|
|
|
|
|
"en": "Preview (dry-run):",
|
|
|
|
|
},
|
2026-07-28 04:51:45 -04:00
|
|
|
"(includes emulated architectures — some VMs are slow)": {
|
|
|
|
|
"fr": "(inclut des architectures émulées — certaines VM sont lentes)",
|
|
|
|
|
"en": "(includes emulated architectures — some VMs are slow)",
|
|
|
|
|
},
|
2026-07-29 05:13:56 -04:00
|
|
|
"install monitoring": {
|
|
|
|
|
"fr": "suivi d'installation",
|
|
|
|
|
"en": "install monitoring",
|
|
|
|
|
},
|
2026-07-29 05:35:31 -04:00
|
|
|
"Navigation telemetry (TUI)": {
|
|
|
|
|
"fr": "Télémétrie de navigation (TUI)",
|
|
|
|
|
"en": "Navigation telemetry (TUI)",
|
|
|
|
|
},
|
|
|
|
|
"TODO navigation telemetry": {
|
|
|
|
|
"fr": "TODO — télémétrie de navigation",
|
|
|
|
|
"en": "TODO navigation telemetry",
|
|
|
|
|
},
|
|
|
|
|
"navigations": {
|
|
|
|
|
"fr": "navigations",
|
|
|
|
|
"en": "navigations",
|
|
|
|
|
},
|
|
|
|
|
"menus": {
|
|
|
|
|
"fr": "menus",
|
|
|
|
|
"en": "menus",
|
|
|
|
|
},
|
|
|
|
|
"Telemetry reset.": {
|
|
|
|
|
"fr": "Télémétrie réinitialisée.",
|
|
|
|
|
"en": "Telemetry reset.",
|
|
|
|
|
},
|
2026-07-29 05:49:13 -04:00
|
|
|
"tree from code": {
|
|
|
|
|
"fr": "arbre issu du code",
|
|
|
|
|
"en": "tree from code",
|
|
|
|
|
},
|
|
|
|
|
"visited paths only": {
|
|
|
|
|
"fr": "chemins visités seulement",
|
|
|
|
|
"en": "visited paths only",
|
|
|
|
|
},
|
[IMP] script todo: télémétrie — exécuter une commande + vue Kanban (F3)
Le TUI de télémétrie devient aussi un LANCEUR, avec deux vues :
- Sélectionner une COMMANDE (feuille de l'arbre, ou carte du Kanban) +
Entrée -> le TUI se ferme et la commande est EXÉCUTÉE (getattr(self, méthode)
(**kwargs)). Les kwargs littéraux sont extraits du code (ex. Aperçu ->
_qemu_deploy(dry_run=True)), donc la commande est rejouée à l'identique.
- Vue KANBAN : une colonne par menu contenant des commandes (issu du code),
cartes = commandes exécutables + compteur de visites du menu.
- F3 bascule entre vue Arbre et vue Kanban. Résumé mis à jour (Entrée =
exécuter, F3 = vue).
_dispatch capture désormais (méthode, kwargs) ; les feuilles de l'arbre
portent la méthode en data ; run_tui renvoie (méthode, kwargs) à exécuter.
Validé headless : 11 colonnes Kanban, kwargs (dry_run/production_ready)
capturés, bascule F3, capture de l'action à exécuter.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 05:56:50 -04:00
|
|
|
"Enter = run, F3 = view": {
|
|
|
|
|
"fr": "Entrée = exécuter, F3 = vue",
|
|
|
|
|
"en": "Enter = run, F3 = view",
|
|
|
|
|
},
|
2026-07-29 06:09:06 -04:00
|
|
|
"Enter = run, F3/F4 = views": {
|
|
|
|
|
"fr": "Entrée = exécuter, F3/F4 = vues",
|
|
|
|
|
"en": "Enter = run, F3/F4 = views",
|
|
|
|
|
},
|
|
|
|
|
"view": {
|
|
|
|
|
"fr": "vue",
|
|
|
|
|
"en": "view",
|
|
|
|
|
},
|
2026-07-29 06:46:21 -04:00
|
|
|
"avg": {
|
|
|
|
|
"fr": "moy",
|
|
|
|
|
"en": "avg",
|
|
|
|
|
},
|
|
|
|
|
"Last install:": {
|
|
|
|
|
"fr": "Dernière install :",
|
|
|
|
|
"en": "Last install:",
|
|
|
|
|
},
|
2026-07-29 06:09:06 -04:00
|
|
|
"No command found.": {
|
|
|
|
|
"fr": "Aucune commande trouvée.",
|
|
|
|
|
"en": "No command found.",
|
|
|
|
|
},
|
|
|
|
|
"Back to telemetry (r) or quit (Enter)? ": {
|
|
|
|
|
"fr": "Revenir à la télémétrie (r) ou quitter (Entrée) ? ",
|
|
|
|
|
"en": "Back to telemetry (r) or quit (Enter)? ",
|
|
|
|
|
},
|
[IMP] script todo: télémétrie — vue Système (F2) + case agrandissable (grille)
- F2 : nouvelle vue SYSTÈME (état/uptime + charge, CPU %, mémoire, disque,
réseau ↓/↑, batterie, température). Les I/O sont déportées en thread
(asyncio.to_thread) ; rafraîchissement 2 s (deltas CPU/réseau). Si la
température n'est pas lisible (ni /sys/class/thermal ni lm-sensors), on
propose d'installer lm-sensors avec la touche « i » (commande selon l'OS —
apt/dnf/pacman — affichée puis validée). read_temperature essaie
/sys/class/thermal d'abord (sans dépendance).
- Vue Kanban GRILLE : clic sur le TITRE d'une case -> elle s'AGRANDIT
(row-span, prend toute la hauteur d'une colonne) ; re-clic -> taille
normale (classe kbig).
Validé headless : vue système peuplée (mém/disque/temp), F2/F3 basculent,
clic titre en grille -> kbig on/off.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:22:11 -04:00
|
|
|
"F2 system · F3/F4 views · Enter run": {
|
|
|
|
|
"fr": "F2 système · F3/F4 vues · Entrée exécute",
|
|
|
|
|
"en": "F2 system · F3/F4 views · Enter run",
|
|
|
|
|
},
|
|
|
|
|
"State": {"fr": "État", "en": "State"},
|
|
|
|
|
"uptime": {"fr": "actif depuis", "en": "uptime"},
|
|
|
|
|
"load": {"fr": "charge", "en": "load"},
|
|
|
|
|
"cores": {"fr": "cœurs", "en": "cores"},
|
|
|
|
|
"Memory": {"fr": "Mémoire", "en": "Memory"},
|
|
|
|
|
"Disk": {"fr": "Disque", "en": "Disk"},
|
|
|
|
|
"Network": {"fr": "Réseau", "en": "Network"},
|
|
|
|
|
"Battery": {"fr": "Batterie", "en": "Battery"},
|
|
|
|
|
"Temperature": {"fr": "Température", "en": "Temperature"},
|
|
|
|
|
"max": {"fr": "max", "en": "max"},
|
|
|
|
|
"lm-sensors absent — press i to install": {
|
|
|
|
|
"fr": "lm-sensors absent — appuyez sur i pour installer",
|
|
|
|
|
"en": "lm-sensors absent — press i to install",
|
|
|
|
|
},
|
|
|
|
|
"Sensors already available.": {
|
|
|
|
|
"fr": "Capteurs déjà disponibles.",
|
|
|
|
|
"en": "Sensors already available.",
|
|
|
|
|
},
|
2026-07-29 06:35:24 -04:00
|
|
|
"Sensors now available.": {
|
|
|
|
|
"fr": "Capteurs désormais disponibles.",
|
|
|
|
|
"en": "Sensors now available.",
|
|
|
|
|
},
|
|
|
|
|
"Still no temperature (reboot/modprobe may be needed).": {
|
|
|
|
|
"fr": "Toujours pas de température (redémarrage/modprobe requis ?).",
|
|
|
|
|
"en": "Still no temperature (reboot/modprobe may be needed).",
|
|
|
|
|
},
|
[IMP] script todo: télémétrie — vue Système (F2) + case agrandissable (grille)
- F2 : nouvelle vue SYSTÈME (état/uptime + charge, CPU %, mémoire, disque,
réseau ↓/↑, batterie, température). Les I/O sont déportées en thread
(asyncio.to_thread) ; rafraîchissement 2 s (deltas CPU/réseau). Si la
température n'est pas lisible (ni /sys/class/thermal ni lm-sensors), on
propose d'installer lm-sensors avec la touche « i » (commande selon l'OS —
apt/dnf/pacman — affichée puis validée). read_temperature essaie
/sys/class/thermal d'abord (sans dépendance).
- Vue Kanban GRILLE : clic sur le TITRE d'une case -> elle s'AGRANDIT
(row-span, prend toute la hauteur d'une colonne) ; re-clic -> taille
normale (classe kbig).
Validé headless : vue système peuplée (mém/disque/temp), F2/F3 basculent,
clic titre en grille -> kbig on/off.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:22:11 -04:00
|
|
|
"Unknown package manager for lm-sensors.": {
|
|
|
|
|
"fr": "Gestionnaire de paquets inconnu pour lm-sensors.",
|
|
|
|
|
"en": "Unknown package manager for lm-sensors.",
|
|
|
|
|
},
|
|
|
|
|
"Proposed install command:": {
|
|
|
|
|
"fr": "Commande d'installation proposée :",
|
|
|
|
|
"en": "Proposed install command:",
|
|
|
|
|
},
|
|
|
|
|
"Install lm-sensors now? (y/N): ": {
|
|
|
|
|
"fr": "Installer lm-sensors maintenant ? (o/N) : ",
|
|
|
|
|
"en": "Install lm-sensors now? (y/N): ",
|
|
|
|
|
},
|
[IMP] script todo: télémétrie — exécuter une commande + vue Kanban (F3)
Le TUI de télémétrie devient aussi un LANCEUR, avec deux vues :
- Sélectionner une COMMANDE (feuille de l'arbre, ou carte du Kanban) +
Entrée -> le TUI se ferme et la commande est EXÉCUTÉE (getattr(self, méthode)
(**kwargs)). Les kwargs littéraux sont extraits du code (ex. Aperçu ->
_qemu_deploy(dry_run=True)), donc la commande est rejouée à l'identique.
- Vue KANBAN : une colonne par menu contenant des commandes (issu du code),
cartes = commandes exécutables + compteur de visites du menu.
- F3 bascule entre vue Arbre et vue Kanban. Résumé mis à jour (Entrée =
exécuter, F3 = vue).
_dispatch capture désormais (méthode, kwargs) ; les feuilles de l'arbre
portent la méthode en data ; run_tui renvoie (méthode, kwargs) à exécuter.
Validé headless : 11 colonnes Kanban, kwargs (dry_run/production_ready)
capturés, bascule F3, capture de l'action à exécuter.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 05:56:50 -04:00
|
|
|
"Command failed: ": {
|
|
|
|
|
"fr": "Échec de la commande : ",
|
|
|
|
|
"en": "Command failed: ",
|
|
|
|
|
},
|
2026-07-29 05:35:31 -04:00
|
|
|
"Install textual for the telemetry TUI (pip).": {
|
|
|
|
|
"fr": "Installez textual pour le TUI de télémétrie (pip).",
|
|
|
|
|
"en": "Install textual for the telemetry TUI (pip).",
|
|
|
|
|
},
|
2026-07-29 05:27:20 -04:00
|
|
|
"Resize a VM disk": {
|
[IMP] script todo: icônes devant les entrées du menu QEMU/KVM
Ajoute une icône descriptive devant chaque section et entrée du menu QEMU :
🚀 Déploiement / Déployer, 🔍 Prévisualiser, ⬇ Télécharger, 🛠 Gérer,
📋 Lister, 🌐 IP, 🖥 Console, 📐 Redimensionner, 🗑 Effacer, 🧹 Nettoyer,
📚 Catalogue, 🗂 Lister images.
Uniquement les VALEURS i18n (fr+en) changent -> aucune modif de todo.py, les
clés (et donc les appels t(...) + la télémétrie) restent inchangés.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:24:27 -04:00
|
|
|
"fr": "📐 Redimensionner le disque d'une VM",
|
|
|
|
|
"en": "📐 Resize a VM disk",
|
2026-07-29 05:27:20 -04:00
|
|
|
},
|
|
|
|
|
"VM name to resize: ": {
|
|
|
|
|
"fr": "Nom de la VM à redimensionner : ",
|
|
|
|
|
"en": "VM name to resize: ",
|
|
|
|
|
},
|
|
|
|
|
"VM not found.": {
|
|
|
|
|
"fr": "VM introuvable.",
|
|
|
|
|
"en": "VM not found.",
|
|
|
|
|
},
|
|
|
|
|
"Main disk not found for this VM.": {
|
|
|
|
|
"fr": "Disque principal introuvable pour cette VM.",
|
|
|
|
|
"en": "Main disk not found for this VM.",
|
|
|
|
|
},
|
|
|
|
|
"Current disk:": {
|
|
|
|
|
"fr": "Disque actuel :",
|
|
|
|
|
"en": "Current disk:",
|
|
|
|
|
},
|
|
|
|
|
"Current virtual size:": {
|
|
|
|
|
"fr": "Taille virtuelle actuelle :",
|
|
|
|
|
"en": "Current virtual size:",
|
|
|
|
|
},
|
|
|
|
|
"VM state:": {
|
|
|
|
|
"fr": "État de la VM :",
|
|
|
|
|
"en": "VM state:",
|
|
|
|
|
},
|
|
|
|
|
"Enter +NG to grow, -NG to shrink, or NG for a target size "
|
|
|
|
|
"(e.g. +20G, -10G, 60G).": {
|
|
|
|
|
"fr": "Entrez +NG pour agrandir, -NG pour réduire, ou NG pour une "
|
|
|
|
|
"taille cible (ex. +20G, -10G, 60G).",
|
|
|
|
|
"en": "Enter +NG to grow, -NG to shrink, or NG for a target size "
|
|
|
|
|
"(e.g. +20G, -10G, 60G).",
|
|
|
|
|
},
|
|
|
|
|
"Resize: ": {
|
|
|
|
|
"fr": "Redimensionner : ",
|
|
|
|
|
"en": "Resize: ",
|
|
|
|
|
},
|
|
|
|
|
"Invalid size.": {
|
|
|
|
|
"fr": "Taille invalide.",
|
|
|
|
|
"en": "Invalid size.",
|
|
|
|
|
},
|
|
|
|
|
"No change.": {
|
|
|
|
|
"fr": "Aucun changement.",
|
|
|
|
|
"en": "No change.",
|
|
|
|
|
},
|
|
|
|
|
"New virtual size:": {
|
|
|
|
|
"fr": "Nouvelle taille virtuelle :",
|
|
|
|
|
"en": "New virtual size:",
|
|
|
|
|
},
|
|
|
|
|
"SHRINKING is DANGEROUS: the guest filesystem is NOT shrunk. "
|
|
|
|
|
"Data beyond the new size is LOST. Shrink the guest FS FIRST, "
|
|
|
|
|
"and only then shrink here.": {
|
|
|
|
|
"fr": "RÉDUIRE est DANGEREUX : le système de fichiers invité n'est "
|
|
|
|
|
"PAS réduit. Les données au-delà de la nouvelle taille sont PERDUES. "
|
|
|
|
|
"Réduisez d'ABORD le FS invité, puis seulement ici.",
|
|
|
|
|
"en": "SHRINKING is DANGEROUS: the guest filesystem is NOT shrunk. "
|
|
|
|
|
"Data beyond the new size is LOST. Shrink the guest FS FIRST, "
|
|
|
|
|
"and only then shrink here.",
|
|
|
|
|
},
|
|
|
|
|
"Shut the VM off before shrinking (virsh shutdown).": {
|
|
|
|
|
"fr": "Éteignez la VM avant de réduire (virsh shutdown).",
|
|
|
|
|
"en": "Shut the VM off before shrinking (virsh shutdown).",
|
|
|
|
|
},
|
|
|
|
|
"Type y to confirm you understand the risk (y/N): ": {
|
|
|
|
|
"fr": "Tapez o pour confirmer que vous comprenez le risque "
|
|
|
|
|
"(o/N, défaut : non) : ",
|
|
|
|
|
"en": "Type y to confirm you understand the risk (y/N): ",
|
|
|
|
|
},
|
|
|
|
|
"Resize failed (see error above).": {
|
|
|
|
|
"fr": "Échec du redimensionnement (voir l'erreur ci-dessus).",
|
|
|
|
|
"en": "Resize failed (see error above).",
|
|
|
|
|
},
|
|
|
|
|
"Virtual disk resized.": {
|
|
|
|
|
"fr": "Disque virtuel redimensionné.",
|
|
|
|
|
"en": "Virtual disk resized.",
|
|
|
|
|
},
|
|
|
|
|
"Grow the guest filesystem now (over SSH)? (y/N): ": {
|
|
|
|
|
"fr": "Étendre le système de fichiers invité maintenant (via SSH) ? "
|
|
|
|
|
"(o/N, défaut : non) : ",
|
|
|
|
|
"en": "Grow the guest filesystem now (over SSH)? (y/N): ",
|
|
|
|
|
},
|
|
|
|
|
"No IP; grow the guest FS manually once booted.": {
|
|
|
|
|
"fr": "Pas d'IP ; étendez le FS invité manuellement après le boot.",
|
|
|
|
|
"en": "No IP; grow the guest FS manually once booted.",
|
|
|
|
|
},
|
2026-07-29 05:13:56 -04:00
|
|
|
"completed": {
|
|
|
|
|
"fr": "terminées",
|
|
|
|
|
"en": "completed",
|
|
|
|
|
},
|
2026-07-29 05:30:16 -04:00
|
|
|
"deleted": {
|
|
|
|
|
"fr": "effacée",
|
|
|
|
|
"en": "deleted",
|
|
|
|
|
},
|
|
|
|
|
"paused": {
|
|
|
|
|
"fr": "pause",
|
|
|
|
|
"en": "paused",
|
|
|
|
|
},
|
2026-07-28 04:15:46 -04:00
|
|
|
"Waiting for the VM to start (boot + cloud-init)": {
|
|
|
|
|
"fr": "En attente du démarrage de la VM (boot + cloud-init)",
|
|
|
|
|
"en": "Waiting for the VM to start (boot + cloud-init)",
|
|
|
|
|
},
|
|
|
|
|
"(an emulated architecture can be slow; this is normal)": {
|
|
|
|
|
"fr": "(une architecture émulée peut être lente ; c'est normal)",
|
|
|
|
|
"en": "(an emulated architecture can be slow; this is normal)",
|
|
|
|
|
},
|
|
|
|
|
"VM ready - starting the ERPLibre install": {
|
|
|
|
|
"fr": "VM prête — installation ERPLibre en cours",
|
|
|
|
|
"en": "VM ready - starting the ERPLibre install",
|
|
|
|
|
},
|
2026-07-28 03:35:25 -04:00
|
|
|
"Choice (number or name, blank = native):": {
|
|
|
|
|
"fr": "Choix (numéro ou nom, vide = native) :",
|
|
|
|
|
"en": "Choice (number or name, blank = native):",
|
|
|
|
|
},
|
|
|
|
|
"Pick exact versions (comma-separated list)": {
|
|
|
|
|
"fr": "Choisir des versions précises (liste séparée par des virgules)",
|
|
|
|
|
"en": "Pick exact versions (comma-separated list)",
|
|
|
|
|
},
|
|
|
|
|
"Selection (numbers, 'all', 'principal' or 'granulaire',"
|
|
|
|
|
" default: all): ": {
|
|
|
|
|
"fr": "Sélection (numéros, « all », « principal » ou « granulaire »,"
|
|
|
|
|
" défaut : all) : ",
|
|
|
|
|
"en": "Selection (numbers, 'all', 'principal' or 'granulaire',"
|
|
|
|
|
" default: all): ",
|
|
|
|
|
},
|
|
|
|
|
"All versions:": {
|
|
|
|
|
"fr": "Toutes les versions :",
|
|
|
|
|
"en": "All versions:",
|
|
|
|
|
},
|
|
|
|
|
"Selection (comma-separated numbers): ": {
|
|
|
|
|
"fr": "Sélection (numéros séparés par des virgules) : ",
|
|
|
|
|
"en": "Selection (comma-separated numbers): ",
|
|
|
|
|
},
|
|
|
|
|
"s390x images only exist for:": {
|
|
|
|
|
"fr": "images s390x disponibles seulement pour :",
|
|
|
|
|
"en": "s390x images only exist for:",
|
|
|
|
|
},
|
|
|
|
|
"ignored:": {
|
|
|
|
|
"fr": "ignoré :",
|
|
|
|
|
"en": "ignored:",
|
|
|
|
|
},
|
[ADD] script qemu: support architecture s390x (IBM Z, Ubuntu)
Ajoute --arch s390x au déploiement QEMU. Réalité constatée (juillet 2026) :
seul Ubuntu publie des images cloud s390x (cloud-images.ubuntu.com : OK) ;
Debian et Fedora n'en publient pas (404), Arch ne cible que x86_64/aarch64.
s390x est donc scopé à Ubuntu et rejeté proprement pour les autres distros.
deploy_qemu.py :
- FOREIGN_ARCHES / S390X_DISTROS : s390x n'est valide que pour Ubuntu.
- virt_install : sur s390x -> --arch s390x, --machine s390-ccw-virtio,
--virt-type qemu (émulation TCG, pas de KVM sur hôte x86), console SCLP
(pas de série ISA), amorçage IPL/zipl (aucun --boot UEFI/BIOS). Les
disques/réseau bus=virtio sont mappés en virtio-ccw par libvirt.
- ensure_s390x_emulator : installe qemu-system-s390x au besoin
(apt: qemu-system-misc, dnf: qemu-system-s390x, pacman:
qemu-emulators-full, zypper: qemu-s390).
- Avertit que s390x est ÉMULÉ (lent) sur un hôte x86.
todo.py : le menu « Déployer une VM » demande l'architecture (s390x proposé
uniquement pour Ubuntu, avec avertissement lenteur) et passe --arch.
install_debian_dependency.sh : wkhtmltopdf n'a pas de build s390x -> skip
best-effort au lieu d'avorter l'install (la branche s390x rust-all existait
déjà pour compiler les wheels).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-28 03:03:19 -04:00
|
|
|
"IBM Z — emulated, slow on x86": {
|
|
|
|
|
"fr": "IBM Z — émulé, lent sur x86",
|
|
|
|
|
"en": "IBM Z — emulated, slow on x86",
|
|
|
|
|
},
|
|
|
|
|
"Choice (number or name, blank = amd64):": {
|
|
|
|
|
"fr": "Choix (numéro ou nom, vide = amd64) :",
|
|
|
|
|
"en": "Choice (number or name, blank = amd64):",
|
|
|
|
|
},
|
|
|
|
|
"s390x is emulated (TCG): boot and install are much "
|
|
|
|
|
"slower than x86.": {
|
|
|
|
|
"fr": "s390x est émulé (TCG) : le boot et l'installation sont bien "
|
|
|
|
|
"plus lents que x86.",
|
|
|
|
|
"en": "s390x is emulated (TCG): boot and install are much "
|
|
|
|
|
"slower than x86.",
|
|
|
|
|
},
|
[IMP] script qemu: multi-distro (Debian/Fedora), resilient osinfo, 26.04
Generalise the deployer beyond Ubuntu with a distro registry and a new
--distro flag (ubuntu default, debian, fedora). Each distro keeps its
own codenames, osinfo ids and per-version minimum RAM/disk. Image URLs
are built per distro (Ubuntu current/, Debian latest/, Fedora resolved
from the release index since it has no "latest" link).
Add --list-images to print the whole catalogue with specs, exposed in
the todo menu ("List available images and specs"); the deploy/download
flows now prompt for the distro first.
Resilient osinfo: when the local osinfo-db does not know an id (e.g.
ubuntu26.04, fedora43+), fall back to virt-install detect=on,require=off
instead of failing. Ubuntu 26.04 (resolute) is now enabled.
Also: throttle the download progress to integer-percent steps (single
updating line on a TTY, at most 101 lines when captured by the menu),
and skip the spurious "network is already active" error by checking the
libvirt network state before net-start.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 02:38:04 -04:00
|
|
|
"Choice (number or version, blank = default):": {
|
|
|
|
|
"fr": "Choix (numéro ou version, vide = défaut) :",
|
|
|
|
|
"en": "Choice (number or version, blank = default):",
|
|
|
|
|
},
|
|
|
|
|
"Invalid selection, using": {
|
|
|
|
|
"fr": "Sélection invalide, utilisation de",
|
|
|
|
|
"en": "Invalid selection, using",
|
2026-07-15 07:48:12 -04:00
|
|
|
},
|
2026-07-19 02:52:39 -04:00
|
|
|
"select all": {
|
|
|
|
|
"fr": "tout sélectionner",
|
|
|
|
|
"en": "select all",
|
|
|
|
|
},
|
2026-07-19 03:26:28 -04:00
|
|
|
"Delete VM(s)": {
|
[IMP] script todo: icônes devant les entrées du menu QEMU/KVM
Ajoute une icône descriptive devant chaque section et entrée du menu QEMU :
🚀 Déploiement / Déployer, 🔍 Prévisualiser, ⬇ Télécharger, 🛠 Gérer,
📋 Lister, 🌐 IP, 🖥 Console, 📐 Redimensionner, 🗑 Effacer, 🧹 Nettoyer,
📚 Catalogue, 🗂 Lister images.
Uniquement les VALEURS i18n (fr+en) changent -> aucune modif de todo.py, les
clés (et donc les appels t(...) + la télémétrie) restent inchangés.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:24:27 -04:00
|
|
|
"fr": "🗑 Effacer une ou plusieurs VM",
|
|
|
|
|
"en": "🗑 Delete VM(s)",
|
2026-07-19 03:26:28 -04:00
|
|
|
},
|
|
|
|
|
"No VM found.": {
|
|
|
|
|
"fr": "Aucune VM trouvée.",
|
|
|
|
|
"en": "No VM found.",
|
|
|
|
|
},
|
|
|
|
|
"Select VMs to delete:": {
|
|
|
|
|
"fr": "Sélectionner les VM à effacer :",
|
|
|
|
|
"en": "Select VMs to delete:",
|
|
|
|
|
},
|
|
|
|
|
"Selection (numbers, or 'all'): ": {
|
|
|
|
|
"fr": "Sélection (numéros, ou « all ») : ",
|
|
|
|
|
"en": "Selection (numbers, or 'all'): ",
|
|
|
|
|
},
|
|
|
|
|
"Also delete disk images (qcow2 + seed ISO)? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Effacer aussi les disques (qcow2 + seed ISO) ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Also delete disk images (qcow2 + seed ISO)? (y/N, default: no): ",
|
2026-07-19 03:26:28 -04:00
|
|
|
},
|
|
|
|
|
"Will delete:": {
|
|
|
|
|
"fr": "Sera effacé :",
|
|
|
|
|
"en": "Will delete:",
|
|
|
|
|
},
|
|
|
|
|
"disk images and seed ISOs": {
|
|
|
|
|
"fr": "les disques et les seed ISO",
|
|
|
|
|
"en": "disk images and seed ISOs",
|
|
|
|
|
},
|
|
|
|
|
"disks kept": {
|
|
|
|
|
"fr": "disques conservés",
|
|
|
|
|
"en": "disks kept",
|
|
|
|
|
},
|
|
|
|
|
"Confirm deletion? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Confirmer l'effacement ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Confirm deletion? (y/N, default: no): ",
|
2026-07-19 03:26:28 -04:00
|
|
|
},
|
|
|
|
|
"Deletion done.": {
|
|
|
|
|
"fr": "Effacement terminé.",
|
|
|
|
|
"en": "Deletion done.",
|
|
|
|
|
},
|
2026-07-27 22:31:56 -04:00
|
|
|
"Clean up QEMU (orphan files)": {
|
[IMP] script todo: icônes devant les entrées du menu QEMU/KVM
Ajoute une icône descriptive devant chaque section et entrée du menu QEMU :
🚀 Déploiement / Déployer, 🔍 Prévisualiser, ⬇ Télécharger, 🛠 Gérer,
📋 Lister, 🌐 IP, 🖥 Console, 📐 Redimensionner, 🗑 Effacer, 🧹 Nettoyer,
📚 Catalogue, 🗂 Lister images.
Uniquement les VALEURS i18n (fr+en) changent -> aucune modif de todo.py, les
clés (et donc les appels t(...) + la télémétrie) restent inchangés.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:24:27 -04:00
|
|
|
"fr": "🧹 Nettoyer QEMU (fichiers orphelins)",
|
|
|
|
|
"en": "🧹 Clean up QEMU (orphan files)",
|
2026-07-27 22:31:56 -04:00
|
|
|
},
|
|
|
|
|
"Scanning for orphan QEMU files...": {
|
|
|
|
|
"fr": "Recherche des fichiers QEMU orphelins...",
|
|
|
|
|
"en": "Scanning for orphan QEMU files...",
|
|
|
|
|
},
|
|
|
|
|
"orphan disk": {
|
|
|
|
|
"fr": "disque orphelin",
|
|
|
|
|
"en": "orphan disk",
|
|
|
|
|
},
|
|
|
|
|
"orphan seed": {
|
|
|
|
|
"fr": "seed orphelin",
|
|
|
|
|
"en": "orphan seed",
|
|
|
|
|
},
|
|
|
|
|
"partial download": {
|
|
|
|
|
"fr": "téléchargement interrompu",
|
|
|
|
|
"en": "partial download",
|
|
|
|
|
},
|
|
|
|
|
"orphan UEFI nvram": {
|
|
|
|
|
"fr": "nvram UEFI orpheline",
|
|
|
|
|
"en": "orphan UEFI nvram",
|
|
|
|
|
},
|
|
|
|
|
"No orphan files found.": {
|
|
|
|
|
"fr": "Aucun fichier orphelin trouvé.",
|
|
|
|
|
"en": "No orphan files found.",
|
|
|
|
|
},
|
|
|
|
|
"Orphan files:": {
|
|
|
|
|
"fr": "Fichiers orphelins :",
|
|
|
|
|
"en": "Orphan files:",
|
|
|
|
|
},
|
|
|
|
|
"Total:": {
|
|
|
|
|
"fr": "Total :",
|
|
|
|
|
"en": "Total:",
|
|
|
|
|
},
|
|
|
|
|
"files": {
|
|
|
|
|
"fr": "fichiers",
|
|
|
|
|
"en": "files",
|
|
|
|
|
},
|
|
|
|
|
"Delete these orphan files? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Effacer ces fichiers orphelins ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Delete these orphan files? (y/N, default: no): ",
|
2026-07-27 22:31:56 -04:00
|
|
|
},
|
|
|
|
|
"Cleanup done.": {
|
|
|
|
|
"fr": "Nettoyage terminé.",
|
|
|
|
|
"en": "Cleanup done.",
|
|
|
|
|
},
|
|
|
|
|
"Cached base images (reusable):": {
|
|
|
|
|
"fr": "Images de base en cache (réutilisables) :",
|
|
|
|
|
"en": "Cached base images (reusable):",
|
|
|
|
|
},
|
|
|
|
|
"Also delete the cached base images? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Effacer aussi les images de base en cache ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Also delete the cached base images? (y/N, default: no): ",
|
2026-07-27 22:31:56 -04:00
|
|
|
},
|
2026-07-27 23:12:43 -04:00
|
|
|
"All cached base images (reusable):": {
|
|
|
|
|
"fr": "Toutes les images de base en cache (réutilisables) :",
|
|
|
|
|
"en": "All cached base images (reusable):",
|
|
|
|
|
},
|
|
|
|
|
"Delete ALL cached base images? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Effacer TOUTES les images de base en cache ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Delete ALL cached base images? (y/N, default: no): ",
|
2026-07-27 23:12:43 -04:00
|
|
|
},
|
|
|
|
|
"Ghost domains (defined but disk missing):": {
|
|
|
|
|
"fr": "Domaines fantômes (définis, disque manquant) :",
|
|
|
|
|
"en": "Ghost domains (defined but disk missing):",
|
|
|
|
|
},
|
|
|
|
|
"Undefine these ghost domains? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Supprimer la définition de ces domaines ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Undefine these ghost domains? (y/N, default: no): ",
|
2026-07-27 23:12:43 -04:00
|
|
|
},
|
|
|
|
|
"Stale codename-named Ubuntu images (duplicates):": {
|
|
|
|
|
"fr": "Images Ubuntu nommées par codename (doublons) :",
|
|
|
|
|
"en": "Stale codename-named Ubuntu images (duplicates):",
|
|
|
|
|
},
|
|
|
|
|
"Delete these duplicate images? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Effacer ces images en double ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Delete these duplicate images? (y/N, default: no): ",
|
2026-07-27 23:12:43 -04:00
|
|
|
},
|
|
|
|
|
"Orphan ~/.ssh/config entries:": {
|
|
|
|
|
"fr": "Entrées ~/.ssh/config orphelines :",
|
|
|
|
|
"en": "Orphan ~/.ssh/config entries:",
|
|
|
|
|
},
|
|
|
|
|
"Remove these ~/.ssh/config entries? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Retirer ces entrées de ~/.ssh/config ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Remove these ~/.ssh/config entries? (y/N, default: no): ",
|
2026-07-27 23:12:43 -04:00
|
|
|
},
|
|
|
|
|
"Stale DHCP leases (no matching VM):": {
|
|
|
|
|
"fr": "Baux DHCP périmés (aucune VM correspondante) :",
|
|
|
|
|
"en": "Stale DHCP leases (no matching VM):",
|
|
|
|
|
},
|
|
|
|
|
"Clear these stale leases? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Effacer ces baux périmés ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Clear these stale leases? (y/N, default: no): ",
|
2026-07-27 23:12:43 -04:00
|
|
|
},
|
2026-07-19 02:52:39 -04:00
|
|
|
"Deploy ERPLibre infra (one minimal VM per image)": {
|
|
|
|
|
"fr": "Déployer l'infra ERPLibre (une VM minimale par image)",
|
|
|
|
|
"en": "Deploy ERPLibre infra (one minimal VM per image)",
|
|
|
|
|
},
|
|
|
|
|
"Deploy ERPLibre infra: one minimal VM per image": {
|
|
|
|
|
"fr": "Déployer l'infra ERPLibre : une VM minimale par image",
|
|
|
|
|
"en": "Deploy ERPLibre infra: one minimal VM per image",
|
|
|
|
|
},
|
|
|
|
|
"Cannot load QEMU catalog: ": {
|
|
|
|
|
"fr": "Impossible de charger le catalogue QEMU : ",
|
|
|
|
|
"en": "Cannot load QEMU catalog: ",
|
|
|
|
|
},
|
|
|
|
|
"Distributions:": {
|
|
|
|
|
"fr": "Distributions :",
|
|
|
|
|
"en": "Distributions:",
|
|
|
|
|
},
|
|
|
|
|
"Whole catalog (every version)": {
|
|
|
|
|
"fr": "Tout le catalogue (chaque version)",
|
|
|
|
|
"en": "Whole catalog (every version)",
|
|
|
|
|
},
|
2026-07-28 00:08:38 -04:00
|
|
|
"The main version of each distro (marked *)": {
|
|
|
|
|
"fr": "La version principale de chaque distro (marquée *)",
|
|
|
|
|
"en": "The main version of each distro (marked *)",
|
|
|
|
|
},
|
|
|
|
|
"Selection (numbers, 'all' or 'principal', default: all): ": {
|
|
|
|
|
"fr": "Sélection (numéros, « all » ou « principal », défaut : all) : ",
|
|
|
|
|
"en": "Selection (numbers, 'all' or 'principal', default: all): ",
|
|
|
|
|
},
|
2026-07-19 02:52:39 -04:00
|
|
|
"Selection (numbers, or 'all', default: all): ": {
|
|
|
|
|
"fr": "Sélection (numéros, ou « all », défaut : all) : ",
|
|
|
|
|
"en": "Selection (numbers, or 'all', default: all): ",
|
|
|
|
|
},
|
|
|
|
|
"Nothing selected.": {
|
|
|
|
|
"fr": "Rien de sélectionné.",
|
|
|
|
|
"en": "Nothing selected.",
|
|
|
|
|
},
|
|
|
|
|
"Deployment plan": {
|
|
|
|
|
"fr": "Plan de déploiement",
|
|
|
|
|
"en": "Deployment plan",
|
|
|
|
|
},
|
|
|
|
|
"disk": {
|
|
|
|
|
"fr": "disque",
|
|
|
|
|
"en": "disk",
|
|
|
|
|
},
|
|
|
|
|
"Total RAM (all running):": {
|
|
|
|
|
"fr": "RAM totale (toutes actives) :",
|
|
|
|
|
"en": "Total RAM (all running):",
|
|
|
|
|
},
|
|
|
|
|
"Total virtual disk (thin qcow2):": {
|
|
|
|
|
"fr": "Disque virtuel total (qcow2 thin) :",
|
|
|
|
|
"en": "Total virtual disk (thin qcow2):",
|
|
|
|
|
},
|
|
|
|
|
"Host RAM available:": {
|
|
|
|
|
"fr": "RAM disponible de l'hôte :",
|
|
|
|
|
"en": "Host RAM available:",
|
|
|
|
|
},
|
|
|
|
|
"Total RAM exceeds host free RAM: not all VMs will run at once.": {
|
|
|
|
|
"fr": "La RAM totale dépasse la RAM libre de l'hôte : les VM ne "
|
|
|
|
|
"tourneront pas toutes en même temps.",
|
|
|
|
|
"en": "Total RAM exceeds host free RAM: not all VMs will run at once.",
|
|
|
|
|
},
|
|
|
|
|
"Install ERPLibre into ~/git/erplibre on each VM? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Installer ERPLibre dans ~/git/erplibre sur chaque VM ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Install ERPLibre into ~/git/erplibre on each VM? (y/N, default: no): ",
|
2026-07-19 02:52:39 -04:00
|
|
|
},
|
|
|
|
|
"Deploy these VMs now? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Déployer ces VM maintenant ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Deploy these VMs now? (y/N, default: no): ",
|
2026-07-19 02:52:39 -04:00
|
|
|
},
|
|
|
|
|
"Cancelled.": {
|
|
|
|
|
"fr": "Annulé.",
|
|
|
|
|
"en": "Cancelled.",
|
|
|
|
|
},
|
|
|
|
|
"already exists, skipped.": {
|
|
|
|
|
"fr": "existe déjà, ignorée.",
|
|
|
|
|
"en": "already exists, skipped.",
|
|
|
|
|
},
|
|
|
|
|
"Cloning ERPLibre on each VM": {
|
|
|
|
|
"fr": "Clonage d'ERPLibre sur chaque VM",
|
|
|
|
|
"en": "Cloning ERPLibre on each VM",
|
|
|
|
|
},
|
2026-07-27 23:48:56 -04:00
|
|
|
"Installing ERPLibre on each VM": {
|
|
|
|
|
"fr": "Installation d'ERPLibre sur chaque VM",
|
|
|
|
|
"en": "Installing ERPLibre on each VM",
|
|
|
|
|
},
|
|
|
|
|
"Install ERPLibre into ~/git/erplibre on this VM? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Installer ERPLibre dans ~/git/erplibre sur cette VM ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Install ERPLibre into ~/git/erplibre on this VM? (y/N, default: no): ",
|
2026-07-27 23:48:56 -04:00
|
|
|
},
|
|
|
|
|
"installing ERPLibre": {
|
|
|
|
|
"fr": "installation d'ERPLibre",
|
|
|
|
|
"en": "installing ERPLibre",
|
|
|
|
|
},
|
|
|
|
|
"no IP obtained, ERPLibre install skipped.": {
|
|
|
|
|
"fr": "aucune IP obtenue, installation ERPLibre ignorée.",
|
|
|
|
|
"en": "no IP obtained, ERPLibre install skipped.",
|
|
|
|
|
},
|
2026-07-28 00:10:33 -04:00
|
|
|
"waiting for SSH...": {
|
|
|
|
|
"fr": "attente du SSH...",
|
|
|
|
|
"en": "waiting for SSH...",
|
|
|
|
|
},
|
|
|
|
|
"SSH not reachable, ERPLibre install skipped.": {
|
|
|
|
|
"fr": "SSH injoignable, installation ERPLibre ignorée.",
|
|
|
|
|
"en": "SSH not reachable, ERPLibre install skipped.",
|
|
|
|
|
},
|
2026-07-29 06:42:02 -04:00
|
|
|
"What to install on the VM(s)?": {
|
|
|
|
|
"fr": "Que veut-on installer sur la/les VM ?",
|
|
|
|
|
"en": "What to install on the VM(s)?",
|
|
|
|
|
},
|
|
|
|
|
"Choice (number, blank = Odoo 18): ": {
|
|
|
|
|
"fr": "Choix (numéro, vide = Odoo 18) : ",
|
|
|
|
|
"en": "Choice (number, blank = Odoo 18): ",
|
|
|
|
|
},
|
|
|
|
|
"ERPLibre + all Odoo versions": {
|
|
|
|
|
"fr": "ERPLibre + toutes les versions Odoo",
|
|
|
|
|
"en": "ERPLibre + all Odoo versions",
|
|
|
|
|
},
|
|
|
|
|
"ERPLibre only (no Odoo)": {
|
|
|
|
|
"fr": "ERPLibre seulement (sans Odoo)",
|
|
|
|
|
"en": "ERPLibre only (no Odoo)",
|
|
|
|
|
},
|
|
|
|
|
"ERPLibre mobile (home)": {
|
|
|
|
|
"fr": "ERPLibre mobile (home)",
|
|
|
|
|
"en": "ERPLibre mobile (home)",
|
|
|
|
|
},
|
|
|
|
|
"ERPLibre Deployment (+ QEMU + dev)": {
|
|
|
|
|
"fr": "ERPLibre Déploiement (+ QEMU + dev)",
|
|
|
|
|
"en": "ERPLibre Deployment (+ QEMU + dev)",
|
|
|
|
|
},
|
2026-07-28 00:27:25 -04:00
|
|
|
"Interactive monitoring dashboard? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Suivi interactif (dashboard) ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Interactive monitoring dashboard? (y/N, default: no): ",
|
2026-07-28 00:27:25 -04:00
|
|
|
},
|
|
|
|
|
"resolving IP...": {
|
|
|
|
|
"fr": "résolution de l'IP...",
|
|
|
|
|
"en": "resolving IP...",
|
|
|
|
|
},
|
|
|
|
|
"no IP, skipped.": {
|
|
|
|
|
"fr": "pas d'IP, ignorée.",
|
|
|
|
|
"en": "no IP, skipped.",
|
|
|
|
|
},
|
|
|
|
|
"No VM to install.": {
|
|
|
|
|
"fr": "Aucune VM à installer.",
|
|
|
|
|
"en": "No VM to install.",
|
|
|
|
|
},
|
|
|
|
|
"Opening the interactive monitor...": {
|
|
|
|
|
"fr": "Ouverture du suivi interactif...",
|
|
|
|
|
"en": "Opening the interactive monitor...",
|
|
|
|
|
},
|
|
|
|
|
"Monitor closed. Installs keep running in the background.": {
|
|
|
|
|
"fr": "Suivi fermé. Les installations continuent en arrière-plan.",
|
|
|
|
|
"en": "Monitor closed. Installs keep running in the background.",
|
|
|
|
|
},
|
|
|
|
|
"Logs:": {
|
|
|
|
|
"fr": "Logs :",
|
|
|
|
|
"en": "Logs:",
|
|
|
|
|
},
|
2026-07-28 00:40:18 -04:00
|
|
|
"Read the logs:": {
|
|
|
|
|
"fr": "Lire les logs :",
|
|
|
|
|
"en": "Read the logs:",
|
|
|
|
|
},
|
2026-07-28 00:41:41 -04:00
|
|
|
"Log files:": {
|
|
|
|
|
"fr": "Fichiers de log :",
|
|
|
|
|
"en": "Log files:",
|
|
|
|
|
},
|
2026-07-28 00:27:25 -04:00
|
|
|
"Install textual for the dashboard (pip).": {
|
|
|
|
|
"fr": "Installez textual pour le dashboard (pip).",
|
|
|
|
|
"en": "Install textual for the dashboard (pip).",
|
|
|
|
|
},
|
2026-07-19 04:15:41 -04:00
|
|
|
"Parallel deployments (default:": {
|
|
|
|
|
"fr": "Déploiements en parallèle (défaut :",
|
|
|
|
|
"en": "Parallel deployments (default:",
|
|
|
|
|
},
|
2026-07-29 04:33:50 -04:00
|
|
|
"VMs": {
|
|
|
|
|
"fr": "VM",
|
|
|
|
|
"en": "VMs",
|
|
|
|
|
},
|
2026-07-29 04:46:48 -04:00
|
|
|
"Deploy summary:": {
|
|
|
|
|
"fr": "Bilan déploiement :",
|
|
|
|
|
"en": "Deploy summary:",
|
|
|
|
|
},
|
|
|
|
|
"failed": {
|
|
|
|
|
"fr": "en échec",
|
|
|
|
|
"en": "failed",
|
|
|
|
|
},
|
|
|
|
|
"IPs resolved:": {
|
|
|
|
|
"fr": "IP résolues :",
|
|
|
|
|
"en": "IPs resolved:",
|
|
|
|
|
},
|
2026-07-29 04:54:36 -04:00
|
|
|
"still waiting for": {
|
|
|
|
|
"fr": "encore en attente de",
|
|
|
|
|
"en": "still waiting for",
|
|
|
|
|
},
|
2026-07-29 04:46:48 -04:00
|
|
|
"TOTAL summary": {
|
|
|
|
|
"fr": "Sommaire TOTAL",
|
|
|
|
|
"en": "TOTAL summary",
|
|
|
|
|
},
|
|
|
|
|
"VMs deployed:": {
|
|
|
|
|
"fr": "VM déployées :",
|
|
|
|
|
"en": "VMs deployed:",
|
|
|
|
|
},
|
|
|
|
|
"total incl. existing:": {
|
|
|
|
|
"fr": "total avec existantes :",
|
|
|
|
|
"en": "total incl. existing:",
|
|
|
|
|
},
|
|
|
|
|
"Total time:": {
|
|
|
|
|
"fr": "Temps total :",
|
|
|
|
|
"en": "Total time:",
|
|
|
|
|
},
|
2026-07-19 04:15:41 -04:00
|
|
|
"Deploying": {
|
|
|
|
|
"fr": "Déploiement de",
|
|
|
|
|
"en": "Deploying",
|
|
|
|
|
},
|
|
|
|
|
"parallel jobs:": {
|
|
|
|
|
"fr": "tâches parallèles :",
|
|
|
|
|
"en": "parallel jobs:",
|
|
|
|
|
},
|
2026-07-19 02:52:39 -04:00
|
|
|
"ERPLibre infra deployment done.": {
|
|
|
|
|
"fr": "Déploiement de l'infra ERPLibre terminé.",
|
|
|
|
|
"en": "ERPLibre infra deployment done.",
|
|
|
|
|
},
|
|
|
|
|
"Manage with:": {
|
|
|
|
|
"fr": "Gérer avec :",
|
|
|
|
|
"en": "Manage with:",
|
|
|
|
|
},
|
|
|
|
|
"Fetching ERPLibre branch list...": {
|
|
|
|
|
"fr": "Récupération de la liste des branches ERPLibre...",
|
|
|
|
|
"en": "Fetching ERPLibre branch list...",
|
|
|
|
|
},
|
|
|
|
|
"Branch (default:": {
|
|
|
|
|
"fr": "Branche (défaut :",
|
|
|
|
|
"en": "Branch (default:",
|
|
|
|
|
},
|
|
|
|
|
"Branches:": {
|
|
|
|
|
"fr": "Branches :",
|
|
|
|
|
"en": "Branches:",
|
|
|
|
|
},
|
|
|
|
|
"Choice (number or name, default:": {
|
|
|
|
|
"fr": "Choix (numéro ou nom, défaut :",
|
|
|
|
|
"en": "Choice (number or name, default:",
|
|
|
|
|
},
|
|
|
|
|
"no IP obtained, ERPLibre clone skipped.": {
|
|
|
|
|
"fr": "aucune IP obtenue, clonage ERPLibre ignoré.",
|
|
|
|
|
"en": "no IP obtained, ERPLibre clone skipped.",
|
|
|
|
|
},
|
|
|
|
|
"cloning ERPLibre": {
|
|
|
|
|
"fr": "clonage d'ERPLibre",
|
|
|
|
|
"en": "cloning ERPLibre",
|
|
|
|
|
},
|
2026-07-15 07:48:12 -04:00
|
|
|
"VM name (required): ": {
|
|
|
|
|
"fr": "Nom de la VM (requis) : ",
|
|
|
|
|
"en": "VM name (required): ",
|
|
|
|
|
},
|
|
|
|
|
"VM name is required!": {
|
|
|
|
|
"fr": "Le nom de la VM est requis !",
|
|
|
|
|
"en": "VM name is required!",
|
|
|
|
|
},
|
|
|
|
|
"VM name: ": {
|
|
|
|
|
"fr": "Nom de la VM : ",
|
|
|
|
|
"en": "VM name: ",
|
|
|
|
|
},
|
2026-07-19 02:27:00 -04:00
|
|
|
"VM name or ID: ": {
|
|
|
|
|
"fr": "Nom ou ID de la VM : ",
|
|
|
|
|
"en": "VM name or ID: ",
|
|
|
|
|
},
|
2026-07-19 03:41:00 -04:00
|
|
|
"VM name or ID (or 'all'): ": {
|
|
|
|
|
"fr": "Nom ou ID de la VM (ou « all ») : ",
|
|
|
|
|
"en": "VM name or ID (or 'all'): ",
|
|
|
|
|
},
|
2026-07-19 02:26:43 -04:00
|
|
|
"RAM in MB (blank = version minimum): ": {
|
|
|
|
|
"fr": "RAM en Mo (vide = minimum de la version) : ",
|
|
|
|
|
"en": "RAM in MB (blank = version minimum): ",
|
2026-07-15 07:48:12 -04:00
|
|
|
},
|
2026-07-19 02:26:43 -04:00
|
|
|
"vCPUs (default: 2): ": {
|
|
|
|
|
"fr": "vCPU (défaut : 2) : ",
|
|
|
|
|
"en": "vCPUs (default: 2): ",
|
2026-07-15 07:48:12 -04:00
|
|
|
},
|
2026-07-27 22:26:07 -04:00
|
|
|
"Disk size (blank = version min; e.g. 30G, 1T): ": {
|
|
|
|
|
"fr": "Taille du disque (vide = min. version ; ex. 30G, 1T) : ",
|
|
|
|
|
"en": "Disk size (blank = version min; e.g. 30G, 1T): ",
|
|
|
|
|
},
|
|
|
|
|
"VM name (default: ": {
|
|
|
|
|
"fr": "Nom de la VM (défaut : ",
|
|
|
|
|
"en": "VM name (default: ",
|
|
|
|
|
},
|
|
|
|
|
"Deployment failed (see the error above).": {
|
|
|
|
|
"fr": "Échec du déploiement (voir l'erreur ci-dessus).",
|
|
|
|
|
"en": "Deployment failed (see the error above).",
|
2026-07-15 07:48:12 -04:00
|
|
|
},
|
|
|
|
|
"SSH public key path": {
|
|
|
|
|
"fr": "Chemin de la clé publique SSH",
|
|
|
|
|
"en": "SSH public key path",
|
|
|
|
|
},
|
|
|
|
|
"none": {
|
|
|
|
|
"fr": "aucune",
|
|
|
|
|
"en": "none",
|
|
|
|
|
},
|
|
|
|
|
"No SSH key found. Set a password instead? (Y/n): ": {
|
|
|
|
|
"fr": "Aucune clé SSH trouvée. Définir un mot de passe ? (O/n) : ",
|
|
|
|
|
"en": "No SSH key found. Set a password instead? (Y/n): ",
|
|
|
|
|
},
|
|
|
|
|
"Overwrite existing VM disk if present? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Écraser le disque de la VM s'il existe ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Overwrite existing VM disk if present? (y/N, default: no): ",
|
2026-07-15 07:48:12 -04:00
|
|
|
},
|
|
|
|
|
"Verify SHA256 after download? (y/N): ": {
|
2026-07-29 04:37:18 -04:00
|
|
|
"fr": "Vérifier le SHA256 après téléchargement ? (o/N, défaut : non) : ",
|
|
|
|
|
"en": "Verify SHA256 after download? (y/N, default: no): ",
|
2026-07-15 07:48:12 -04:00
|
|
|
},
|
|
|
|
|
"QEMU - Sample dry-run (demo-vm, Ubuntu 24.04)": {
|
|
|
|
|
"fr": "QEMU - Exemple dry-run (demo-vm, Ubuntu 24.04)",
|
|
|
|
|
"en": "QEMU - Sample dry-run (demo-vm, Ubuntu 24.04)",
|
|
|
|
|
},
|
2026-03-07 02:59:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2026-03-10 04:07:38 -04:00
|
|
|
def get_lang() -> str:
|
2026-03-07 02:59:07 -05:00
|
|
|
global _current_lang
|
|
|
|
|
if _current_lang is not None:
|
|
|
|
|
return _current_lang
|
|
|
|
|
|
|
|
|
|
# 1. Check env_var.sh file
|
2026-03-10 03:45:11 -04:00
|
|
|
if os.path.exists(ENV_VAR_FILE):
|
2026-03-07 02:59:07 -05:00
|
|
|
try:
|
2026-03-10 03:45:11 -04:00
|
|
|
with open(ENV_VAR_FILE) as f:
|
2026-03-07 02:59:07 -05:00
|
|
|
content = f.read()
|
|
|
|
|
match = re.search(
|
|
|
|
|
r'^EL_LANG=["\']?(\w+)["\']?', content, re.MULTILINE
|
|
|
|
|
)
|
|
|
|
|
if match:
|
|
|
|
|
lang = match.group(1)
|
|
|
|
|
if lang in ("fr", "en"):
|
|
|
|
|
_current_lang = lang
|
|
|
|
|
return _current_lang
|
|
|
|
|
except OSError:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
# 2. Check env var
|
|
|
|
|
env_lang = os.environ.get("EL_LANG")
|
|
|
|
|
if env_lang in ("fr", "en"):
|
|
|
|
|
_current_lang = env_lang
|
|
|
|
|
return _current_lang
|
|
|
|
|
|
|
|
|
|
# 3. Default
|
|
|
|
|
_current_lang = "fr"
|
|
|
|
|
return _current_lang
|
|
|
|
|
|
|
|
|
|
|
2026-03-10 04:07:38 -04:00
|
|
|
def set_lang(lang: str) -> None:
|
2026-03-07 02:59:07 -05:00
|
|
|
global _current_lang
|
|
|
|
|
_current_lang = lang
|
|
|
|
|
|
|
|
|
|
# Persist to env_var.sh
|
2026-03-10 03:45:11 -04:00
|
|
|
if os.path.exists(ENV_VAR_FILE):
|
2026-03-07 02:59:07 -05:00
|
|
|
try:
|
2026-03-10 03:45:11 -04:00
|
|
|
with open(ENV_VAR_FILE) as f:
|
2026-03-07 02:59:07 -05:00
|
|
|
content = f.read()
|
|
|
|
|
except OSError:
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
new_line = f'EL_LANG="{lang}"'
|
|
|
|
|
if re.search(r"^EL_LANG=", content, re.MULTILINE):
|
|
|
|
|
content = re.sub(
|
|
|
|
|
r'^EL_LANG=["\']?\w*["\']?',
|
|
|
|
|
new_line,
|
|
|
|
|
content,
|
|
|
|
|
count=1,
|
|
|
|
|
flags=re.MULTILINE,
|
|
|
|
|
)
|
|
|
|
|
else:
|
|
|
|
|
content = content.rstrip("\n") + "\n" + new_line + "\n"
|
|
|
|
|
|
2026-03-10 03:45:11 -04:00
|
|
|
with open(ENV_VAR_FILE, "w") as f:
|
2026-03-07 02:59:07 -05:00
|
|
|
f.write(content)
|
|
|
|
|
|
|
|
|
|
|
2026-03-10 04:07:38 -04:00
|
|
|
def lang_is_configured() -> bool:
|
2026-03-07 02:59:07 -05:00
|
|
|
"""Check if a language has been explicitly set."""
|
2026-03-10 03:45:11 -04:00
|
|
|
if os.path.exists(ENV_VAR_FILE):
|
2026-03-07 02:59:07 -05:00
|
|
|
try:
|
2026-03-10 03:45:11 -04:00
|
|
|
with open(ENV_VAR_FILE) as f:
|
2026-03-07 02:59:07 -05:00
|
|
|
content = f.read()
|
|
|
|
|
return bool(re.search(r"^EL_LANG=", content, re.MULTILINE))
|
|
|
|
|
except OSError:
|
|
|
|
|
pass
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
2026-03-10 04:07:38 -04:00
|
|
|
def t(key: str) -> str:
|
2026-03-07 02:59:07 -05:00
|
|
|
entry = TRANSLATIONS.get(key)
|
|
|
|
|
if entry is None:
|
|
|
|
|
return key
|
|
|
|
|
lang = get_lang()
|
|
|
|
|
return entry.get(lang, entry.get("fr", key))
|