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)",
|
|
|
|
|
},
|
|
|
|
|
"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": {
|
|
|
|
|
"fr": "Déploiement",
|
|
|
|
|
"en": "Deployment",
|
|
|
|
|
},
|
|
|
|
|
"Manage": {
|
|
|
|
|
"fr": "Gérer",
|
|
|
|
|
"en": "Manage",
|
|
|
|
|
},
|
|
|
|
|
"Catalog": {
|
|
|
|
|
"fr": "Catalogue",
|
|
|
|
|
"en": "Catalog",
|
|
|
|
|
},
|
|
|
|
|
"Open the console on a VM": {
|
|
|
|
|
"fr": "Ouvrir la console d'une VM",
|
|
|
|
|
"en": "Open the console on a VM",
|
|
|
|
|
},
|
|
|
|
|
"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): ": {
|
|
|
|
|
"fr": "Ajouter cette VM à ~/.ssh/config ? (o/N) : ",
|
|
|
|
|
"en": "Add this VM to ~/.ssh/config? (y/N): ",
|
|
|
|
|
},
|
|
|
|
|
"Add each VM to ~/.ssh/config? (y/N): ": {
|
|
|
|
|
"fr": "Ajouter chaque VM à ~/.ssh/config ? (o/N) : ",
|
|
|
|
|
"en": "Add each VM to ~/.ssh/config? (y/N): ",
|
|
|
|
|
},
|
|
|
|
|
"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-03-08 15:53:51 -04:00
|
|
|
"fr": "Conserver la base de données temporaire? (o/N) : ",
|
|
|
|
|
"en": "Keep the temporary database? (y/N): ",
|
|
|
|
|
},
|
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)": {
|
|
|
|
|
"fr": "Prévisualiser un déploiement (dry-run, sans sudo)",
|
|
|
|
|
"en": "Preview a deployment (dry-run, no sudo)",
|
|
|
|
|
},
|
[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": {
|
|
|
|
|
"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)": {
|
|
|
|
|
"fr": "Lister les VM (virsh list --all)",
|
|
|
|
|
"en": "List VMs (virsh list --all)",
|
|
|
|
|
},
|
|
|
|
|
"Show a VM IP address": {
|
|
|
|
|
"fr": "Afficher l'adresse IP d'une VM",
|
|
|
|
|
"en": "Show a VM IP address",
|
|
|
|
|
},
|
[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": {
|
|
|
|
|
"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",
|
|
|
|
|
},
|
|
|
|
|
"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)": {
|
|
|
|
|
"fr": "Effacer une ou plusieurs VM",
|
|
|
|
|
"en": "Delete VM(s)",
|
|
|
|
|
},
|
|
|
|
|
"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): ": {
|
|
|
|
|
"fr": "Effacer aussi les disques (qcow2 + seed ISO) ? (o/N) : ",
|
|
|
|
|
"en": "Also delete disk images (qcow2 + seed ISO)? (y/N): ",
|
|
|
|
|
},
|
|
|
|
|
"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): ": {
|
|
|
|
|
"fr": "Confirmer l'effacement ? (o/N) : ",
|
|
|
|
|
"en": "Confirm deletion? (y/N): ",
|
|
|
|
|
},
|
|
|
|
|
"Deletion done.": {
|
|
|
|
|
"fr": "Effacement terminé.",
|
|
|
|
|
"en": "Deletion done.",
|
|
|
|
|
},
|
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)",
|
|
|
|
|
},
|
|
|
|
|
"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): ": {
|
|
|
|
|
"fr": "Installer ERPLibre dans ~/git/erplibre sur chaque VM ? (o/N) : ",
|
|
|
|
|
"en": "Install ERPLibre into ~/git/erplibre on each VM? (y/N): ",
|
|
|
|
|
},
|
|
|
|
|
"Deploy these VMs now? (y/N): ": {
|
|
|
|
|
"fr": "Déployer ces VM maintenant ? (o/N) : ",
|
|
|
|
|
"en": "Deploy these VMs now? (y/N): ",
|
|
|
|
|
},
|
|
|
|
|
"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-19 04:15:41 -04:00
|
|
|
"Parallel deployments (default:": {
|
|
|
|
|
"fr": "Déploiements en parallèle (défaut :",
|
|
|
|
|
"en": "Parallel deployments (default:",
|
|
|
|
|
},
|
|
|
|
|
"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-19 02:26:43 -04:00
|
|
|
"Disk size (blank = version minimum): ": {
|
|
|
|
|
"fr": "Taille du disque (vide = minimum de la version) : ",
|
|
|
|
|
"en": "Disk size (blank = version minimum): ",
|
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): ": {
|
|
|
|
|
"fr": "Écraser le disque de la VM s'il existe ? (o/N) : ",
|
|
|
|
|
"en": "Overwrite existing VM disk if present? (y/N): ",
|
|
|
|
|
},
|
|
|
|
|
"Verify SHA256 after download? (y/N): ": {
|
|
|
|
|
"fr": "Vérifier le SHA256 après téléchargement ? (o/N) : ",
|
|
|
|
|
"en": "Verify SHA256 after download? (y/N): ",
|
|
|
|
|
},
|
|
|
|
|
"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))
|