erplibre/script/todo/todo_i18n.py
Mathieu Benoit 855acd8e61 [FIX] proxmox : pmxcfs sans adresse routable, et le stockage vide
Rapporté sur un Proxmox imbriqué. « pvesm » ne parle qu'à travers /etc/pve,
monté par pmxcfs ; pmxcfs à terre, la commande répond « Connection refused »,
la liste est vide, et l'écran s'arrête sur « aucun stockage » — trois étages
au-dessus du défaut.

pmxcfs ne démarrait pas parce que le nom d'hôte ne résolvait que vers
127.0.1.1, et il cherche une adresse ROUTABLE. L'installation corrige bien
/etc/hosts, mais l'image cloud règle « manage_etc_hosts: True » : cloud-init
le réécrit à CHAQUE démarrage. C'est le redémarrage désormais automatique qui
l'a révélé — l'installation corrigeait, le reboot amorçait le bon noyau, et
cloud-init défaisait la correction dans le même mouvement. Un fichier de
surcharge le gèle.

Deuxième geste manquant : systemd marque pve-cluster « failed » après cinq
essais rapprochés et n'y revient JAMAIS seul. Corriger /etc/hosts ne suffisait
donc pas ; l'installation relance l'unité et CONSTATE le montage plutôt que de
le supposer.

Et l'écran nomme maintenant la cause quand il n'a pas de stockage, plutôt que
de laisser chercher.

Un détail qui aurait fait un faux diagnostic : la sonde de montage
n'interroge pas storage.cfg. Ce fichier N'EXISTE PAS sur une installation
neuve — Proxmox se contente alors de ses stockages par défaut, et « local »
répond parfaitement. Vérifié sur l'hôte : /etc/pve monté, storage.cfg absent,
« pvesm status » rendant local avec 25 Go libres. C'est « .version », fichier
virtuel de pmxcfs, qui fait foi.

--- EN ---

Reported on a nested Proxmox. "pvesm" only speaks through /etc/pve, mounted by
pmxcfs; with pmxcfs down the command answers "Connection refused", the list is
empty, and the screen stops at "no storage" — three floors above the defect.

pmxcfs would not start because the hostname resolved only to 127.0.1.1, and it
needs a ROUTABLE address. The installer does fix /etc/hosts, but the cloud
image sets "manage_etc_hosts: True": cloud-init rewrites it at EVERY boot. The
now-automatic reboot is what revealed it — the install fixed it, the reboot
booted the right kernel, and cloud-init undid the fix in the same motion. An
override file freezes it.

Second missing step: systemd marks pve-cluster "failed" after five rapid
attempts and never returns to it on its own. Fixing /etc/hosts was therefore
not enough; the installer restarts the unit and VERIFIES the mount rather than
assuming it.

And the screen now names the cause when it has no storage, instead of leaving
you to hunt.

One detail that would have made a false diagnosis: the mount probe does not
ask for storage.cfg. That file DOES NOT EXIST on a fresh install — Proxmox
then uses its default storages, and "local" answers perfectly. Verified on the
host: /etc/pve mounted, storage.cfg absent, "pvesm status" returning local with
25 GB free. It is ".version", a pmxcfs virtual file, that tells the truth.

Assisted-by: Claude Opus 5
(cherry picked from commit 6212853048ba8154f2833744e45076d70bd33c72)
2026-08-29 01:53:02 -04:00

9927 lines
360 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# © 2021-2026 TechnoLibre (http://www.technolibre.ca)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
import os
import re
ENV_VAR_FILE = "./env_var.sh"
_current_lang = None
TRANSLATIONS = {
# Main menu
"Importation success!": {
"fr": "L'importation est un succès!",
"en": "Importation success!",
},
"Opening TODO ...": {
"fr": "Ouverture de TODO en cours ...",
"en": "Opening TODO ...",
},
"=> Enter your choice by number and press Enter!": {
"fr": "=> Entre tes directives par son chiffre et fait Entrée!",
"en": "=> Enter your choice by number and press Enter!",
},
"Command:": {
"fr": "Commande :",
"en": "Command:",
},
"Execute": {
"fr": "🧰 Exécution",
"en": "🧰 Execute",
},
"Install": {
"fr": "📦 Installation",
"en": "📦 Install",
},
"Assistant": {
"fr": "🤖 Assistant",
"en": "🤖 Assistant",
},
"Fork - Open TODO in a new tab": {
"fr": "🔀 Fork - Ouvre TODO dans une nouvelle tabulation",
"en": "🔀 Fork - Open TODO in a new tab",
},
"Quit": {
"fr": "Quitter",
"en": "Quit",
},
"Command not found !": {
"fr": "Commande non trouvée !",
"en": "Command not found !",
},
"Back": {
"fr": "🔙 Retour",
"en": "🔙 Back",
},
# Execute submenu
"Run - Execute and install an instance": {
"fr": "🏃 Run - Exécuter et installer une instance",
"en": "🏃 Run - Execute and install an instance",
},
"Automation - Demonstration of developed features": {
"fr": "🦾 Automatisation - Demonstration des fonctions développées",
"en": "🦾 Automation - Demonstration of developed features",
},
"Update - Update all developed staging source code": {
"fr": "🔃 Mise à jour - Update all developed staging source code",
"en": "🔃 Update - Update all developed staging source code",
},
"Code - Developer tools": {
"fr": "💻 Code - Outil pour développeur",
"en": "💻 Code - Developer tools",
},
"Doc - Documentation search": {
"fr": "📖 Doc - Recherche de documentation",
"en": "📖 Doc - Documentation search",
},
"Database - Database tools": {
"fr": "💾 Database - Outils sur les bases de données",
"en": "💾 Database - Database tools",
},
"Process - Execution tools": {
"fr": "📟 Process - Outils sur les executions",
"en": "📟 Process - Execution tools",
},
"Config - Configuration file management": {
"fr": "🔧 Config - Traitement du fichier de configuration",
"en": "🔧 Config - Configuration file management",
},
"Network - Network tools": {
"fr": "📡 Réseau - Outil réseautique",
"en": "📡 Network - Network tools",
},
"Security - Dependency security audit": {
"fr": "🔒 Sécurité - Audit de sécurité des dépendances",
"en": "🔒 Security - Dependency security audit",
},
"RTK - CLI proxy to reduce LLM token consumption": {
"fr": "RTK - Proxy CLI pour réduire la consommation de tokens LLM",
"en": "RTK - CLI proxy to reduce LLM token consumption",
},
"Language - Change language / Changer la langue": {
"fr": "🌍 Langue - Changer la langue / Change language",
"en": "🌍 Language - Change language / Changer la langue",
},
# 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: ",
},
"Configure sshfs": {
"fr": "📁 Configurer sshfs",
"en": "📁 Configure sshfs",
},
"Local": {
"fr": "💻 Local",
"en": "💻 Local",
},
"SSH (remote host)": {
"fr": "SSH (hôte distant)",
"en": "SSH (remote host)",
},
"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!",
},
"Virtualization & notifications": {
"fr": "Virtualisation & notifications",
"en": "Virtualization & notifications",
},
"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).",
},
"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, défaut : non) : ",
"en": "Add this VM to ~/.ssh/config? (y/N, default: no): ",
},
"Add each VM to ~/.ssh/config? (Y/n): ": {
"fr": "Ajouter chaque VM à ~/.ssh/config ? (O/n, défaut : oui) : ",
"en": "Add each VM to ~/.ssh/config? (Y/n, default: yes): ",
},
"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:",
},
"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): ",
},
"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: ",
},
# RTK (Rust Token Killer)
"Manage RTK (Rust Token Killer) for token optimization!": {
"fr": "Gérer RTK (Rust Token Killer) pour optimiser les tokens!",
"en": "Manage RTK (Rust Token Killer) for token optimization!",
},
"Install RTK": {
"fr": "Installer RTK",
"en": "Install RTK",
},
"Check RTK version": {
"fr": "Vérifier la version de RTK",
"en": "Check RTK version",
},
"Show cumulative token savings": {
"fr": "Afficher les économies de tokens cumulées",
"en": "Show cumulative token savings",
},
"Discover optimization opportunities": {
"fr": "Identifier les opportunités d'optimisation",
"en": "Discover optimization opportunities",
},
"Initialize global auto-rewrite hook": {
"fr": "Initialiser le hook auto-rewrite global",
"en": "Initialize global auto-rewrite hook",
},
"Check RTK status": {
"fr": "Vérifier le statut de RTK",
"en": "Check RTK status",
},
"RTK is not installed. Use option 1 to install it.": {
"fr": "RTK n'est pas installé. Utilisez l'option 1 pour l'installer.",
"en": "RTK is not installed. Use option 1 to install it.",
},
"RTK is installed, version: ": {
"fr": "RTK est installé, version : ",
"en": "RTK is installed, version: ",
},
"Global auto-rewrite hook: active": {
"fr": "Hook auto-rewrite global : actif",
"en": "Global auto-rewrite hook: active",
},
"Global auto-rewrite hook: inactive": {
"fr": "Hook auto-rewrite global : inactif",
"en": "Global auto-rewrite hook: inactive",
},
"Installation method:": {
"fr": "Méthode d'installation :",
"en": "Installation method:",
},
"curl - Automatic install script": {
"fr": "curl - Script d'installation automatique",
"en": "curl - Automatic install script",
},
"brew - Homebrew (macOS/Linux)": {
"fr": "brew - Homebrew (macOS/Linux)",
"en": "brew - Homebrew (macOS/Linux)",
},
"cargo - Build from source (Rust required)": {
"fr": "cargo - Compilation depuis les sources (Rust requis)",
"en": "cargo - Build from source (Rust required)",
},
# Prompts and messages
"Enter your password: ": {
"fr": "Entrez votre mot de passe : ",
"en": "Enter your password: ",
},
"Write your question ": {
"fr": "Écrit moi ta question ",
"en": "Write your question ",
},
"Do you want a new instance?": {
"fr": "Voulez-vous une nouvelle instance?",
"en": "Do you want a new instance?",
},
"SSH port-forwarding": {
"fr": "SSH port-forwarding",
"en": "SSH port-forwarding",
},
"Network performance request per second": {
"fr": "Performance réseau en requêtes par seconde",
"en": "Network performance request per second",
},
"Setup queue job for parallelism": {
"fr": "Configurer la file d'attente pour l'exécution parallèle",
"en": "Setup queue job for parallelism",
},
"Choose your database": {
"fr": "Choisir sa base de données",
"en": "Choose your database",
},
"Development update": {
"fr": "Mise à jour du développement",
"en": "Development update",
},
"What do you need for development?": {
"fr": "Qu'avez-vous de besoin pour développer?",
"en": "What do you need for development?",
},
"Looking for documentation?": {
"fr": "Vous cherchez de la documentation?",
"en": "Looking for documentation?",
},
"Make changes to databases!": {
"fr": "Faites des modifications sur les bases de données!",
"en": "Make changes to databases!",
},
# 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.",
},
"Cannot list the databases (exit code): ": {
"fr": "Impossible de lister les bases (code de retour) : ",
"en": "Cannot list the databases (exit code): ",
},
"Is PostgreSQL running?": {
"fr": "PostgreSQL est-il démarré ?",
"en": "Is PostgreSQL running?",
},
"No database on this PostgreSQL server.": {
"fr": "Aucune base sur ce serveur PostgreSQL.",
"en": "No database on this PostgreSQL server.",
},
"Manage execution processes!": {
"fr": "Manipuler les processus d'exécution!",
"en": "Manage execution processes!",
},
"Manage ERPLibre and Odoo configuration!": {
"fr": "Manipuler la configuration ERPLibre et Odoo!",
"en": "Manage ERPLibre and Odoo configuration!",
},
"Network tools!": {
"fr": "Outil réseautique!",
"en": "Network tools!",
},
"Dependency security audit!": {
"fr": "Audit de securite des dépendances!",
"en": "Dependency security audit!",
},
"The Bash script failed with return code": {
"fr": "Le script Bash a échoué avec le code de retour",
"en": "The Bash script failed with return code",
},
"No installed environment found. Install an Odoo version first.": {
"fr": "Aucun environnement installe trouve. Installez d'abord une version d'Odoo.",
"en": "No installed environment found. Install an Odoo version first.",
},
"Choose an environment for the audit:": {
"fr": "Choisir un environnement pour l'audit :",
"en": "Choose an environment for the audit:",
},
"Select: ": {
"fr": "Sélection : ",
"en": "Select: ",
},
"Error, cannot understand value": {
"fr": "Erreur, impossible de comprendre la valeur",
"en": "Error, cannot understand value",
},
"Dependencies file not found: ": {
"fr": "Fichier de dépendances introuvable : ",
"en": "Dependencies file not found: ",
},
"Execution: ": {
"fr": "Execution : ",
"en": "Execution: ",
},
"Current": {
"fr": "Actuel",
"en": "Current",
},
"Default": {
"fr": "Défaut",
"en": "Default",
},
"Reboot TODO ...": {
"fr": "Reboot TODO ...",
"en": "Reboot TODO ...",
},
"pip-audit - Check vulnerabilities on Python environments": {
"fr": "pip-audit - Verifier les vulnérabilités sur les environnements Python",
"en": "pip-audit - Check vulnerabilities on Python environments",
},
"Will execute:": {
"fr": "Va exécuter :",
"en": "Will execute:",
},
"Choose a version:": {
"fr": "Choisir une version :",
"en": "Choose a version:",
},
"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)",
},
# todo.json translatable prompt_descriptions
"Test - Minimal base instance": {
"fr": "Test - Instance de base minimale",
"en": "Test - Minimal base instance",
},
"Open RobotLibre 🤖 minimal": {
"fr": "Ouvrir RobotLibre 🤖 minimal",
"en": "Open RobotLibre 🤖 minimal",
},
"Open RobotLibre 🤖 with search enabled": {
"fr": "Ouvrir RobotLibre 🤖 en activant la recherche",
"en": "Open RobotLibre 🤖 with search enabled",
},
"Open ERPLibre with TODO 🤖": {
"fr": "Ouvrir ERPLibre avec TODO 🤖",
"en": "Open ERPLibre with TODO 🤖",
},
"Update all erplibre_base on database test": {
"fr": "🔄 Mise à jour de tous les erplibre_base sur la base de données test",
"en": "🔄 Update all erplibre_base on database test",
},
"Show code status": {
"fr": "🔍 Afficher le statut du code",
"en": "🔍 Show code status",
},
"Stash all code": {
"fr": "📦 Remiser tout le code",
"en": "📦 Stash all code",
},
"Format modified code": {
"fr": "🎨 Formater le code modifié",
"en": "🎨 Format modified code",
},
# todo.py hardcoded prompt_descriptions
"Mobile - Compile and run software": {
"fr": "Mobile - Compiler et exécuter le logiciel",
"en": "Mobile - Compile and run software",
},
"Upgrade Odoo - Migration Database": {
"fr": "🚚 Mise à jour Odoo - Migration de base de données",
"en": "🚚 Upgrade Odoo - Migration Database",
},
"Upgrade Poetry - Dependency of Odoo": {
"fr": "📦 Mise à jour Poetry - Dépendances d'Odoo",
"en": "📦 Upgrade Poetry - Dependency of Odoo",
},
"Open SHELL": {
"fr": "🐚 Ouvrir le SHELL",
"en": "🐚 Open SHELL",
},
"Upgrade Module": {
"fr": "🧩 Mise à jour de module",
"en": "🧩 Upgrade Module",
},
"Debug": {
"fr": "🐛 Débogage",
"en": "🐛 Debug",
},
"Migration module coverage": {
"fr": "Couverture de migration des modules",
"en": "Migration module coverage",
},
"What change between version": {
"fr": "Quels changements entre les versions",
"en": "What change between version",
},
"OCA guidelines": {
"fr": "Directives OCA",
"en": "OCA guidelines",
},
"OCA migration Odoo 19 milestone": {
"fr": "Migration OCA Odoo 19 - Jalons",
"en": "OCA migration Odoo 19 milestone",
},
"Download database to create backup (.zip)": {
"fr": "Télécharger une base de données pour créer une sauvegarde (.zip)",
"en": "Download database to create backup (.zip)",
},
"Restore from backup (.zip)": {
"fr": "Restaurer a partir d'une sauvegarde (.zip)",
"en": "Restore from backup (.zip)",
},
"Create backup (.zip)": {
"fr": "Créer une sauvegarde (.zip)",
"en": "Create backup (.zip)",
},
"Kill Odoo process from actual port": {
"fr": "Terminer le processus Odoo du port actuel",
"en": "Kill Odoo process from actual port",
},
"Kill git daemon server process": {
"fr": "Terminer le processus du serveur git daemon",
"en": "Kill git daemon server process",
},
"Git daemon process killed.": {
"fr": "Processus git daemon terminé.",
"en": "Git daemon process killed.",
},
"Generate all configuration": {
"fr": "Générer toute la configuration",
"en": "Generate all configuration",
},
"Generate from pre-configuration": {
"fr": "Générer a partir de la pre-configuration",
"en": "Generate from pre-configuration",
},
"Generate from backup file": {
"fr": "Générer a partir d'un fichier de sauvegarde",
"en": "Generate from backup file",
},
"Generate from database": {
"fr": "Générer a partir de la base de données",
"en": "Generate from database",
},
"base": {
"fr": "base",
"en": "base",
},
"base + code_generator": {
"fr": "base + code_generator",
"en": "base + code_generator",
},
"base + image_db": {
"fr": "base + image_db",
"en": "base + image_db",
},
"all": {
"fr": "tout",
"en": "all",
},
"Debug todo.py": {
"fr": "Débogage todo.py",
"en": "Debug todo.py",
},
# Test section
"Test - Test an Odoo module": {
"fr": "🧪 Test - Tester un module Odoo",
"en": "🧪 Test - Test an Odoo module",
},
"Test an Odoo module on a temporary database!": {
"fr": "Tester un module Odoo sur une base de données temporaire!",
"en": "Test an Odoo module on a temporary database!",
},
"Test a module": {
"fr": "Tester un module",
"en": "Test a module",
},
"Test a module with code coverage": {
"fr": "Tester un module avec couverture de code",
"en": "Test a module with code coverage",
},
"ERPLibre unit tests": {
"fr": "Tests unitaires ERPLibre",
"en": "ERPLibre unit tests",
},
"Mail unit tests": {
"fr": "Tests unitaires courriel",
"en": "Mail unit tests",
},
"Analyse unit tests": {
"fr": "Tests unitaires analyse",
"en": "Analyse unit tests",
},
"Running unit tests": {
"fr": "Exécution des tests unitaires",
"en": "Running unit tests",
},
"All unit tests passed": {
"fr": "Tous les tests unitaires ont réussi",
"en": "All unit tests passed",
},
"Some unit tests failed, exit code": {
"fr": "Des tests unitaires ont échoué, code de sortie",
"en": "Some unit tests failed, exit code",
},
"Module name to test: ": {
"fr": "Nom du module à tester : ",
"en": "Module name to test: ",
},
"Temporary database name (default: test_todo_tmp): ": {
"fr": "Nom de la base de données temporaire (défaut: test_todo_tmp) : ",
"en": "Temporary database name (default: test_todo_tmp): ",
},
"Extra modules to install (comma-separated, empty for none): ": {
"fr": "Modules supplémentaires à installer (séparés par des virgules, vide pour aucun) : ",
"en": "Extra modules to install (comma-separated, empty for none): ",
},
"Log level (default: test): ": {
"fr": "Niveau de log (défaut: test) : ",
"en": "Log level (default: test): ",
},
"Creating temporary database": {
"fr": "Création de la base de données temporaire",
"en": "Creating temporary database",
},
"Installing modules": {
"fr": "Installation des modules",
"en": "Installing modules",
},
"Running tests": {
"fr": "Exécution des tests",
"en": "Running tests",
},
"Cleaning up temporary database": {
"fr": "Suppression de la base de données temporaire",
"en": "Cleaning up temporary database",
},
"Keep the temporary database? (y/N): ": {
"fr": "Conserver la base de données temporaire? (o/N, défaut : non) : ",
"en": "Keep the temporary database? (y/N, default: no): ",
},
"Database kept": {
"fr": "Base de données conservée",
"en": "Database kept",
},
"Tests completed successfully!": {
"fr": "Tests terminés avec succès!",
"en": "Tests completed successfully!",
},
"Tests failed with return code": {
"fr": "Les tests ont échoué avec le code de retour",
"en": "Tests failed with return code",
},
"Module name is required!": {
"fr": "Le nom du module est requis!",
"en": "Module name is required!",
},
# Git section
"Git - Git tools": {
"fr": "🌿 Git - Outils Git",
"en": "🌿 Git - Git tools",
},
"Git management tools!": {
"fr": "Outils de gestion Git!",
"en": "Git management tools!",
},
"Local git server": {
"fr": "Serveur git local",
"en": "Local git server",
},
"Manage local git repository server!": {
"fr": "Gérer le serveur de dépôts git local!",
"en": "Manage local git repository server!",
},
"Deploy a local git server (~/.git-server)": {
"fr": "Déployer un serveur git local (~/.git-server)",
"en": "Deploy a local git server (~/.git-server)",
},
"Deploy a production git server (/srv/git, root required)": {
"fr": "Déployer un serveur git production (/srv/git, root requis)",
"en": "Deploy a production git server (/srv/git, root required)",
},
"Starting git server deployment...": {
"fr": "Démarrage du déploiement du serveur git...",
"en": "Starting git server deployment...",
},
"Local mode (~/.git-server)": {
"fr": "Mode local (~/.git-server)",
"en": "Local mode (~/.git-server)",
},
"Production mode (/srv/git, root required)": {
"fr": "Mode production (/srv/git, root requis)",
"en": "Production mode (/srv/git, root required)",
},
"Run all (init + remote + push + serve)": {
"fr": "Tout exécuter (init + remote + push + serve)",
"en": "Run all (init + remote + push + serve)",
},
"Init - Create bare repos": {
"fr": "Init - Créer les bare repos",
"en": "Init - Create bare repos",
},
"Remote - Add local remotes": {
"fr": "Remote - Ajouter les remotes locaux",
"en": "Remote - Add local remotes",
},
"Push - Push to local server": {
"fr": "Push - Pousser vers le serveur local",
"en": "Push - Push to local server",
},
"Serve - Start git daemon": {
"fr": "Serve - Démarrer le daemon git",
"en": "Serve - Start git daemon",
},
# Git remote add
"Add a remote to a local repository": {
"fr": "Ajouter un remote vers un dépôt local",
"en": "Add a remote to a local repository",
},
"Remote name (default: localhost): ": {
"fr": "Nom du remote (défaut: localhost) : ",
"en": "Remote name (default: localhost): ",
},
"Repository address (e.g.: git://192.168.1.100/my-repo.git): ": {
"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): ",
},
"Repository address is required!": {
"fr": "L'adresse du dépôt est requise!",
"en": "Repository address is required!",
},
"Remote added successfully!": {
"fr": "Remote ajouté avec succès!",
"en": "Remote added successfully!",
},
"Error adding remote: ": {
"fr": "Erreur lors de l'ajout du remote : ",
"en": "Error adding remote: ",
},
# Git config vim
"Configure git local editor to vim": {
"fr": "Configuration git local par vim",
"en": "Configure git local editor to vim",
},
"Generate git patch to /tmp": {
"fr": "Générer une patch git dans /tmp",
"en": "Generate git patch to /tmp",
},
"Git editor configured to vim successfully!": {
"fr": "Éditeur git configuré sur vim avec succès!",
"en": "Git editor configured to vim successfully!",
},
"Error during configuration: ": {
"fr": "Erreur lors de la configuration : ",
"en": "Error during configuration: ",
},
# GPT code - Claude automation
"Add an automation with Claude in todo.py": {
"fr": "Ajouter une automatisation avec Claude dans todo.py",
"en": "Add an automation with Claude in todo.py",
},
"Description of the command to add: ": {
"fr": "Description de la commande à ajouter : ",
"en": "Description of the command to add: ",
},
"Bash command to execute: ": {
"fr": "Commande bash à exécuter : ",
"en": "Bash command to execute: ",
},
"Menu section (git/code/config/network/process): ": {
"fr": "Section du menu (git/code/config/network/process) : ",
"en": "Menu section (git/code/config/network/process): ",
},
"Automation added successfully in todo.json!": {
"fr": "Automatisation ajoutée avec succès dans todo.json!",
"en": "Automation added successfully in todo.json!",
},
"Error adding automation: ": {
"fr": "Erreur lors de l'ajout de l'automatisation : ",
"en": "Error adding automation: ",
},
# 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!",
},
# Language selection
"Choose language / Choisir la langue": {
"fr": "Choisir la langue / Choose language",
"en": "Choose language / Choisir la langue",
},
"French": {
"fr": "Francais",
"en": "French",
},
"English": {
"fr": "Anglais",
"en": "English",
},
"Language changed to: English": {
"fr": "Langue changée pour : Francais",
"en": "Language changed to: English",
},
"TODO execution time": {
"fr": "Temps d'exécution TODO",
"en": "TODO execution time",
},
"Keyboard interrupt": {
"fr": "Interruption clavier",
"en": "Keyboard interrupt",
},
# GPT code section
"GPT code - AI assistant tools": {
"fr": "🤖 GPT code - Outils d'assistant IA",
"en": "🤖 GPT code - AI assistant tools",
},
"AI assistant tools for development!": {
"fr": "Outils d'assistant IA pour le développement!",
"en": "AI assistant tools for development!",
},
"Configure Claude Code configurations": {
"fr": "Configurer les configurations Claude Code",
"en": "Configure Claude Code configurations",
},
"Commit - OCA/Odoo commit command": {
"fr": "Commit - Commande de commit OCA/Odoo",
"en": "Commit - OCA/Odoo commit command",
},
"Todo Add Command - Add a command to todo.py menu": {
"fr": "Todo Add Command - Ajouter une commande au menu todo.py",
"en": "Todo Add Command - Add a command to todo.py menu",
},
"Enter your full name: ": {
"fr": "Entrez votre nom complet : ",
"en": "Enter your full name: ",
},
"Enter your email: ": {
"fr": "Entrez votre courriel : ",
"en": "Enter your email: ",
},
"Deploy Claude Code commands!": {
"fr": "Déployer les commandes Claude Code!",
"en": "Deploy Claude Code commands!",
},
"Show installed custom commands": {
"fr": "Afficher les commandes personnalisées installées",
"en": "Show installed custom commands",
},
"No custom commands found in ~/.claude/commands/": {
"fr": "Aucune commande personnalisée trouvée dans ~/.claude/commands/",
"en": "No custom commands found in ~/.claude/commands/",
},
"Claude Code custom commands:": {
"fr": "Commandes personnalisées Claude Code :",
"en": "Claude Code custom commands:",
},
"File already exists: ": {
"fr": "Le fichier existe déjà : ",
"en": "File already exists: ",
},
"Do you want to overwrite the file? (y/Y): ": {
"fr": "Voulez-vous écraser le fichier? (y/Y) : ",
"en": "Do you want to overwrite the file? (y/Y): ",
},
"Nothing to do.": {
"fr": "Rien à faire.",
"en": "Nothing to do.",
},
"File created successfully: ": {
"fr": "Fichier créé avec succès : ",
"en": "File created successfully: ",
},
"Error creating file: ": {
"fr": "Erreur lors de la création du fichier : ",
"en": "Error creating file: ",
},
# 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: ",
},
# 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: ",
},
"Deploy a new VM": {
"fr": "Déployer une nouvelle VM",
"en": "Deploy a new VM",
},
"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)",
},
"Download a cloud image only": {
"fr": "⬇ Télécharger seulement une image cloud",
"en": "⬇ Download a cloud image only",
},
"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",
},
"List available images and specs": {
"fr": "🗂 Lister les images disponibles et leurs specs",
"en": "🗂 List available images and specs",
},
"Distribution:": {
"fr": "Distribution :",
"en": "Distribution:",
},
"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 des",
"en": "Version for",
},
"Versions for": {
"fr": "Versions des",
"en": "Versions of",
},
"Architecture:": {
"fr": "Architecture :",
"en": "Architecture:",
},
"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",
},
"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:",
},
"All supported architectures": {
"fr": "Toutes les architectures supportées",
"en": "All supported architectures",
},
"installation": {
"fr": "installation",
"en": "installation",
},
"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",
},
"> host free disk": {
"fr": "> disque libre de l'hôte",
"en": "> host free disk",
},
"free of": {
"fr": "libres sur",
"en": "free of",
},
"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):",
},
"Choice (1-5, default 1):": {
"fr": "Choix (1-5, défaut 1) :",
"en": "Choice (1-5, default 1):",
},
"Custom - set vCPU, RAM and disk": {
"fr": "Personnalisé — choisir vCPU, RAM et disque",
"en": "Custom — set vCPU, RAM and disk",
},
"custom": {
"fr": "personnalisé",
"en": "custom",
},
"varies": {
"fr": "varié",
"en": "varies",
},
"vCPU per VM, blank = keep": {
"fr": "vCPU par VM, vide = garder",
"en": "vCPU per VM, blank = keep",
},
"New vCPU count, blank = keep": {
"fr": "Nouveau nombre de vCPU, vide = garder",
"en": "New vCPU count, blank = keep",
},
"Invalid vCPU count.": {
"fr": "Nombre de vCPU invalide.",
"en": "Invalid vCPU count.",
},
"More vCPU than host cores": {
"fr": "Plus de vCPU que de cœurs sur l'hôte",
"en": "More vCPU than host cores",
},
"> host cores": {
"fr": "> cœurs de l'hôte",
"en": "> host cores",
},
"Total vCPU (all running):": {
"fr": "vCPU total (toutes démarrées) :",
"en": "Total vCPU (all running):",
},
"Deploy VM(s) (one or many)": {
"fr": "🚀 Déployer une ou plusieurs VM",
"en": "🚀 Deploy VM(s) (one or many)",
},
"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": "->",
},
"VMs (default = no change):": {
"fr": "VM (défaut = aucune modification) :",
"en": "VMs (default = no change):",
},
"Modify which VMs? (numbers, comma-separated; blank = none): ": {
"fr": "Modifier quelles VM ? (numéros séparés par des virgules ; "
"vide = aucune) : ",
"en": "Modify which VMs? (numbers, comma-separated; blank = none): ",
},
"new name (blank = keep):": {
"fr": "nouveau nom (vide = garder) :",
"en": "new name (blank = keep):",
},
"New disk size in G, blank = keep": {
"fr": "Nouvelle taille disque en G, vide = garder",
"en": "New disk size in G, blank = keep",
},
"New RAM in MB, blank = keep": {
"fr": "Nouvelle RAM en Mo, vide = garder",
"en": "New RAM in MB, blank = keep",
},
"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):",
},
"(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)",
},
"install monitoring": {
"fr": "suivi d'installation",
"en": "install monitoring",
},
"Navigation telemetry (TUI)": {
"fr": "📊 Télémétrie de navigation (TUI)",
"en": "📊 Navigation telemetry (TUI)",
},
"Configuration": {
"fr": "⚙ Configuration",
"en": "⚙ Configuration",
},
"Interface": {
"fr": "Interface",
"en": "Interface",
},
"Maintenance": {
"fr": "Maintenance",
"en": "Maintenance",
},
"Language / Langue": {
"fr": "🌐 Langue / Language",
"en": "🌐 Language / Langue",
},
"QEMU deployment interface": {
"fr": "🖥 Interface de déploiement QEMU",
"en": "🖥 QEMU deployment interface",
},
"Display while deploying": {
"fr": "📜 Affichage pendant le déploiement",
"en": "📜 Display while deploying",
},
"Ask every time": {
"fr": "Demander à chaque fois",
"en": "Ask every time",
},
"TUI form": {
"fr": "Formulaire TUI",
"en": "TUI form",
},
"Classic questions (line by line)": {
"fr": "Questions classiques (ligne par ligne)",
"en": "Classic questions (line by line)",
},
"CLI output (easy to copy)": {
"fr": "Sortie CLI (facile à copier)",
"en": "CLI output (easy to copy)",
},
"TUI, collapsible blocks per VM": {
"fr": "TUI, blocs repliables par VM",
"en": "TUI, collapsible blocks per VM",
},
"Choice (number, blank = keep):": {
"fr": "Choix (numéro, vide = garder) :",
"en": "Choice (number, blank = keep):",
},
"SSH port forwarding (open Odoo in the browser)": {
"fr": "🔌 Redirection de port SSH (ouvrir Odoo dans le navigateur)",
"en": "🔌 SSH port forwarding (open Odoo in the browser)",
},
"SSH port forwarding": {
"fr": "Redirection de port SSH",
"en": "SSH port forwarding",
},
"Host (number or name):": {
"fr": "Hôte (numéro ou nom) :",
"en": "Host (number or name):",
},
"Remote port (default:": {
"fr": "Port distant (défaut :",
"en": "Remote port (default:",
},
"Local port (default:": {
"fr": "Port local (défaut :",
"en": "Local port (default:",
},
"virsh is missing: libvirt is not installed here.": {
"fr": "virsh est absent : libvirt n'est pas installé ici.",
"en": "virsh is missing: libvirt is not installed here.",
},
"Every VM command will fail until it is.": {
"fr": "Toutes les commandes VM échoueront tant que ce sera le cas.",
"en": "Every VM command will fail until it is.",
},
"Install the QEMU/libvirt tools now? (Y/n): ": {
"fr": "Installer les outils QEMU/libvirt maintenant ? "
"(O/n, défaut : oui) : ",
"en": "Install the QEMU/libvirt tools now? (Y/n, default: yes): ",
},
"libvirt is available.": {
"fr": "libvirt est disponible.",
"en": "libvirt is available.",
},
"virsh still missing; a reboot may be required.": {
"fr": "virsh toujours absent ; un redémarrage est peut-être requis.",
"en": "virsh still missing; a reboot may be required.",
},
"No SSH public key found in ~/.ssh.": {
"fr": "Aucune clé publique SSH trouvée dans ~/.ssh.",
"en": "No SSH public key found in ~/.ssh.",
},
"Without one the VMs start with no SSH access.": {
"fr": "Sans elle, les VM démarrent sans accès SSH.",
"en": "Without one the VMs start with no SSH access.",
},
"Generate one now? (Y/n): ": {
"fr": "En générer une maintenant ? (O/n, défaut : oui) : ",
"en": "Generate one now? (Y/n, default: yes): ",
},
"Checking the remote port...": {
"fr": "Vérification du port distant...",
"en": "Checking the remote port...",
},
"Nothing is listening on port": {
"fr": "Rien n'écoute sur le port",
"en": "Nothing is listening on port",
},
"of": {
"fr": "de",
"en": "of",
},
"Start the service there, or continue anyway.": {
"fr": "Démarrer le service là-bas, ou continuer quand même.",
"en": "Start the service there, or continue anyway.",
},
"Continue anyway? (y/N): ": {
"fr": "Continuer quand même ? (o/N, défaut : non) : ",
"en": "Continue anyway? (y/N, default: no): ",
},
"Could not probe the remote port; going on.": {
"fr": "Impossible de sonder le port distant ; on continue.",
"en": "Could not probe the remote port; going on.",
},
"Local port already in use:": {
"fr": "Port local déjà occupé :",
"en": "Local port already in use:",
},
"Try anyway? (y/N): ": {
"fr": "Essayer quand même ? (o/N, défaut : non) : ",
"en": "Try anyway? (y/N, default: no): ",
},
"Local port differs from the remote one.": {
"fr": "Le port local diffère du port distant.",
"en": "Local port differs from the remote one.",
},
"Odoo redirects using web.base.url; check it": {
"fr": "Odoo redirige d'après web.base.url ; vérifier qu'il",
"en": "Odoo redirects using web.base.url; check it",
},
"matches http://localhost:": {
"fr": "vaut bien http://localhost:",
"en": "matches http://localhost:",
},
"Ctrl+C closes the tunnel.": {
"fr": "Ctrl+C referme le tunnel.",
"en": "Ctrl+C closes the tunnel.",
},
"Tunnel closed.": {
"fr": "Tunnel refermé.",
"en": "Tunnel closed.",
},
"SSH configuration (~/.ssh/config, ProxyJump)": {
"fr": "🔑 Configuration SSH (~/.ssh/config, ProxyJump)",
"en": "🔑 SSH configuration (~/.ssh/config, ProxyJump)",
},
"SSH configuration for QEMU VMs": {
"fr": "Configuration SSH des VM QEMU",
"en": "SSH configuration for QEMU VMs",
},
"Where should the machines come from?": {
"fr": "D'où viennent les machines à configurer ?",
"en": "Where should the machines come from?",
},
"Local QEMU VMs (virsh)": {
"fr": "VM QEMU locales (virsh)",
"en": "Local QEMU VMs (virsh)",
},
"Hosts from ~/.ssh/config": {
"fr": "Hôtes de ~/.ssh/config",
"en": "Hosts from ~/.ssh/config",
},
"Type a host or an IP": {
"fr": "Saisir un hôte ou une IP",
"en": "Type a host or an IP",
},
"~/.ssh/config holds no host.": {
"fr": "~/.ssh/config ne contient aucun hôte.",
"en": "~/.ssh/config holds no host.",
},
"Which hosts? (numbers, comma-separated; blank = all): ": {
"fr": "Quels hôtes ? (numéros séparés par des virgules ; "
"vide = tous) : ",
"en": "Which hosts? (numbers, comma-separated; blank = all): ",
},
"Host or IP:": {
"fr": "Hôte ou IP :",
"en": "Host or IP:",
},
"User": {
"fr": "Utilisateur",
"en": "User",
},
"Name for ~/.ssh/config": {
"fr": "Nom pour ~/.ssh/config",
"en": "Name for ~/.ssh/config",
},
"Depth (1 = these machines only, default:": {
"fr": "Profondeur (1 = ces machines seulement, défaut :",
"en": "Depth (1 = these machines only, default:",
},
"Which VMs? (numbers, comma-separated; blank = all): ": {
"fr": "Quelles VM ? (numéros séparés par des virgules ; "
"vide = toutes) : ",
"en": "Which VMs? (numbers, comma-separated; blank = all): ",
},
"Depth (default:": {
"fr": "Profondeur (défaut :",
"en": "Depth (default:",
},
"entry": {
"fr": "entrée",
"en": "entry",
},
"written": {
"fr": "écrite(s)",
"en": "written",
},
"skipped": {
"fr": "ignorée(s)",
"en": "skipped",
},
"Level": {
"fr": "Niveau",
"en": "Level",
},
"machines to probe": {
"fr": "machines à sonder",
"en": "machines to probe",
},
"SSH refused the identity.": {
"fr": "SSH a refusé l'identité.",
"en": "SSH refused the identity.",
},
"Existing key:": {
"fr": "Clé existante :",
"en": "Existing key:",
},
"Deploy it on this host (ssh-copy-id)? (Y/n): ": {
"fr": "La déployer sur cet hôte (ssh-copy-id) ? "
"(O/n, défaut : oui) : ",
"en": "Deploy it on this host (ssh-copy-id)? (Y/n, default: yes): ",
},
"No SSH key in ~/.ssh.": {
"fr": "Aucune clé SSH dans ~/.ssh.",
"en": "No SSH key in ~/.ssh.",
},
"Create one and deploy it? (Y/n): ": {
"fr": "En créer une et la déployer ? (O/n, défaut : oui) : ",
"en": "Create one and deploy it? (Y/n, default: yes): ",
},
"access refused": {
"fr": "accès refusé",
"en": "access refused",
},
"timed out": {
"fr": "délai dépassé",
"en": "timed out",
},
"unreachable": {
"fr": "injoignable",
"en": "unreachable",
},
"no QEMU/libvirt here": {
"fr": "pas de QEMU/libvirt ici",
"en": "no QEMU/libvirt here",
},
"virsh present but not accessible": {
"fr": "virsh présent mais inaccessible (droits)",
"en": "virsh present but not accessible (permissions)",
},
"Add the user to the libvirt group there:": {
"fr": "Ajoutez l'utilisateur au groupe libvirt là-bas :",
"en": "Add the user to the libvirt group there:",
},
"QEMU present, no VM": {
"fr": "QEMU présent, aucune VM",
"en": "QEMU present, no VM",
},
"Create the SSH key if missing and deploy it? (Y/n): ": {
"fr": "Créer la clé SSH si absente et la déployer ? "
"(O/n, défaut : oui) : ",
"en": "Create the SSH key if missing and deploy it? "
"(Y/n, default: yes): ",
},
"Generating an ed25519 SSH key": {
"fr": "Génération d'une clé SSH ed25519",
"en": "Generating an ed25519 SSH key",
},
"Cannot generate the key": {
"fr": "Impossible de générer la clé",
"en": "Cannot generate the key",
},
"Deploying the key on": {
"fr": "Déploiement de la clé sur",
"en": "Deploying the key on",
},
"host": {
"fr": "hôte",
"en": "host",
},
"key already accepted": {
"fr": "clé déjà acceptée",
"en": "key already accepted",
},
"deployed": {
"fr": "déployée(s)",
"en": "deployed",
},
"already there": {
"fr": "déjà en place",
"en": "already there",
},
"virt-manager detected": {
"fr": "virt-manager détecté",
"en": "virt-manager detected",
},
"virt-manager: every connection already there": {
"fr": "virt-manager : toutes les connexions sont déjà là",
"en": "virt-manager: every connection already there",
},
"Add the missing connections to virt-manager? (Y/n): ": {
"fr": "Ajouter les connexions manquantes à virt-manager ? "
"(O/n, défaut : oui) : ",
"en": "Add the missing connections to virt-manager? "
"(Y/n, default: yes): ",
},
"Restart virt-manager to see the new connections": {
"fr": "Redémarrer virt-manager pour voir les nouvelles connexions",
"en": "Restart virt-manager to see the new connections",
},
"the names apply live": {
"fr": "les noms s'appliquent à chaud",
"en": "the names apply live",
},
"SSH hosts written": {
"fr": "Hôtes SSH écrits",
"en": "SSH hosts written",
},
"via": {
"fr": "via",
"en": "via",
},
"Odoo migration interface": {
"fr": "🚚 Interface de la migration Odoo",
"en": "🚚 Odoo migration interface",
},
"modules of the list have no code in the active Odoo:": {
"fr": "modules de la liste n'ont plus de code dans l'Odoo actif :",
"en": "modules of the list have no code in the active Odoo:",
},
"Odoo cannot uninstall a module whose code is gone;": {
"fr": "Odoo ne peut pas désinstaller un module dont le code a"
" disparu ;",
"en": "Odoo cannot uninstall a module whose code is gone;",
},
"one of them fails the whole uninstall command.": {
"fr": "un seul d'entre eux fait échouer toute la désinstallation.",
"en": "one of them fails the whole uninstall command.",
},
"are present and can be uninstalled:": {
"fr": "sont présents et peuvent être désinstallés :",
"en": "are present and can be uninstalled:",
},
"No module of the list is present.": {
"fr": "Aucun module de la liste n'est présent.",
"en": "No module of the list is present.",
},
"Uninstall the present ones, skip the missing": {
"fr": "Désinstaller les présents, ignorer les manquants",
"en": "Uninstall the present ones, skip the missing",
},
"Try the whole list anyway (it will fail)": {
"fr": "Tout tenter quand même (ça échouera)",
"en": "Try the whole list anyway (it will fail)",
},
"Uninstall nothing, continue": {
"fr": "Ne rien désinstaller, continuer",
"en": "Uninstall nothing, continue",
},
"Nothing uninstalled.": {
"fr": "Rien de désinstallé.",
"en": "Nothing uninstalled.",
},
"Retrying alone:": {
"fr": "Reprise seul :",
"en": "Retrying alone:",
},
"The uninstall did not take:": {
"fr": "La désinstallation n'a pas pris :",
"en": "The uninstall did not take:",
},
"Odoo exits 0 even when it removes nothing.": {
"fr": "Odoo sort en 0 même quand il ne retire rien.",
"en": "Odoo exits 0 even when it removes nothing.",
},
"Could not verify the uninstall.": {
"fr": "Impossible de vérifier la désinstallation.",
"en": "Could not verify the uninstall.",
},
"Check the COW views that drifted": {
"fr": "Vérifier les vues COW en retard sur leur vue module",
"en": "Check the COW views that drifted",
},
"Tool not found": {
"fr": "Outil introuvable",
"en": "Tool not found",
},
"To reset one of them onto its module view:": {
"fr": "Pour réinitialiser l'une d'elles sur sa vue module :",
"en": "To reset one of them onto its module view:",
},
"Read the diff first: a copy can hold a customisation.": {
"fr": "Lire le diff d'abord : une copie peut porter une"
" personnalisation.",
"en": "Read the diff first: a copy can hold a customisation.",
},
"Migration statistics (read-only)": {
"fr": "📊 Statistiques de la migration (lecture seule)",
"en": "📊 Migration statistics (read-only)",
},
"Choice (0-3, default 1): ": {
"fr": "Choix (0-3, défaut 1) : ",
"en": "Choice (0-3, default 1): ",
},
"Migration statistics": {
"fr": "Statistiques de la migration",
"en": "Migration statistics",
},
"elapsed": {
"fr": "écoulé",
"en": "elapsed",
},
"Level reached": {
"fr": "Niveau atteint",
"en": "Level reached",
},
"Modules": {
"fr": "Modules",
"en": "Modules",
},
"modules": {
"fr": "modules",
"en": "modules",
},
"At the start": {
"fr": "Au départ",
"en": "At the start",
},
"Removed in total": {
"fr": "Supprimés au total",
"en": "Removed in total",
},
"Reported missing": {
"fr": "Signalés manquants",
"en": "Reported missing",
},
"Duplicated": {
"fr": "En double",
"en": "Duplicated",
},
"Migration fixes": {
"fr": "Correctifs de migration",
"en": "Migration fixes",
},
"COW views": {
"fr": "Vues COW",
"en": "COW views",
},
"views": {
"fr": "vues",
"en": "views",
},
"no snapshot": {
"fr": "aucun instantané",
"en": "no snapshot",
},
"Journal": {
"fr": "Journal",
"en": "Journal",
},
"commands": {
"fr": "commandes",
"en": "commands",
},
"recorded decisions": {
"fr": "décisions annotées",
"en": "recorded decisions",
},
"Removed modules, with their reason": {
"fr": "Modules supprimés, avec leur justification",
"en": "Removed modules, with their reason",
},
"Removed modules, comma-separated (copy)": {
"fr": "Modules supprimés, séparés par des virgules (à copier)",
"en": "Removed modules, comma-separated (copy)",
},
"COW views: snapshots and differences": {
"fr": "Vues COW : instantanés et différences",
"en": "COW views: snapshots and differences",
},
"Recorded decisions (journal)": {
"fr": "Décisions annotées (journal)",
"en": "Recorded decisions (journal)",
},
"Executed commands (last 30)": {
"fr": "Commandes exécutées (30 dernières)",
"en": "Executed commands (last 30)",
},
"nothing recorded": {
"fr": "rien d'annoté",
"en": "nothing recorded",
},
"Need two snapshots to diff.": {
"fr": "Il faut deux instantanés pour comparer.",
"en": "Need two snapshots to diff.",
},
"Diff which two? (e.g. 1,2 — blank to skip)": {
"fr": "Comparer lesquels ? (ex. 1,2 — vide pour passer)",
"en": "Diff which two? (e.g. 1,2 — blank to skip)",
},
"No migration in progress to resume.": {
"fr": "Aucune migration en cours à reprendre.",
"en": "No migration in progress to resume.",
},
"Quit without doing anything": {
"fr": "Quitter sans rien faire",
"en": "Quit without doing anything",
},
"Version bumps": {
"fr": "Montées de version",
"en": "Version bumps",
},
"Step": {
"fr": "Étape",
"en": "Step",
},
"Detail": {
"fr": "Détail",
"en": "Detail",
},
"Enter on a step or a version = replay from there": {
"fr": "Entrée sur une étape ou une version = rejouer depuis là",
"en": "Enter on a step or a version = replay from there",
},
"New migration": {
"fr": "Nouvelle migration",
"en": "New migration",
},
"Keep the zip only": {
"fr": "Garder seulement le zip",
"en": "Keep the zip only",
},
"Reset all preferences": {
"fr": "🧹 Réinitialiser toutes les préférences",
"en": "🧹 Reset all preferences",
},
"Preferences reset": {
"fr": "Préférences réinitialisées",
"en": "Preferences reset",
},
"Interface:": {
"fr": "Interface :",
"en": "Interface:",
},
"(change the default in TODO > Configuration)": {
"fr": "(changer le défaut dans TODO > Configuration)",
"en": "(change the default in TODO > Configuration)",
},
"Loading (VM list, branches)...": {
"fr": "Chargement (liste des VM, branches)...",
"en": "Loading (VM list, branches)...",
},
"Architecture": {
"fr": "Architecture",
"en": "Architecture",
},
"Resources per VM": {
"fr": "Ressources par VM",
"en": "Resources per VM",
},
"Install ERPLibre": {
"fr": "Installer ERPLibre",
"en": "Install ERPLibre",
},
"Production (/opt, confined)": {
"fr": "Production (/opt, confiné)",
"en": "Production (/opt, confined)",
},
"Monitoring dashboard": {
"fr": "Tableau de bord de suivi",
"en": "Monitoring dashboard",
},
"Add each VM to ~/.ssh/config": {
"fr": "Ajouter chaque VM à ~/.ssh/config",
"en": "Add each VM to ~/.ssh/config",
},
"Parallelism": {
"fr": "Parallélisme",
"en": "Parallelism",
},
"Name": {
"fr": "Nom",
"en": "Name",
},
"Distro": {
"fr": "Distro",
"en": "Distro",
},
"Version": {
"fr": "Version",
"en": "Version",
},
"Arch": {
"fr": "Archi",
"en": "Arch",
},
"vCPU": {
"fr": "vCPU",
"en": "vCPU",
},
"RAM (MB)": {
"fr": "RAM (Mo)",
"en": "RAM (MB)",
},
"cloud-init still running after 20 min - install starts anyway"
" (it waits for cloud-init first)": {
"fr": "cloud-init tourne encore apres 20 min - l'installation demarre"
" quand meme (elle attend d'abord cloud-init)",
"en": "cloud-init still running after 20 min - install starts anyway"
" (it waits for cloud-init first)",
},
"Waiting for cloud-init to finish (up to 15 min)": {
"fr": "Attente de la fin de cloud-init (jusqu'a 15 min)",
"en": "Waiting for cloud-init to finish (up to 15 min)",
},
"cloud-init:": {
"fr": "cloud-init :",
"en": "cloud-init:",
},
"WARNING libvirt unreachable: the IP will not be refreshed"
" (libvirt group? re-login required)": {
"fr": "ATTENTION libvirt injoignable : l'IP ne sera pas rafraichie"
" (groupe libvirt ? reconnexion necessaire)",
"en": "WARNING libvirt unreachable: the IP will not be refreshed"
" (libvirt group? re-login required)",
},
"DHCP lease moved:": {
"fr": "bail DHCP deplace :",
"en": "DHCP lease moved:",
},
"An install is still running:": {
"fr": "Une installation est encore en cours :",
"en": "An install is still running:",
},
"VM(s) in progress": {
"fr": "VM en cours",
"en": "VM(s) in progress",
},
"Last activity:": {
"fr": "Dernière activité il y a :",
"en": "Last activity:",
},
"Reopen that monitoring": {
"fr": "Rouvrir ce suivi",
"en": "Reopen that monitoring",
},
"Deploy anyway (new run)": {
"fr": "Déployer quand même (nouveau run)",
"en": "Deploy anyway (new run)",
},
"Choice (number, blank = reopen): ": {
"fr": "Choix (numéro, vide = rouvrir) : ",
"en": "Choice (number, blank = reopen): ",
},
"Python interpreter:": {
"fr": "Interpreteur Python :",
"en": "Python interpreter:",
},
"mise (precompiled, faster)": {
"fr": "mise (precompile, plus rapide)",
"en": "mise (precompiled, faster)",
},
"pyenv (compiles from source)": {
"fr": "pyenv (compile depuis les sources)",
"en": "pyenv (compiles from source)",
},
"Choice (number, blank = mise): ": {
"fr": "Choix (numero, vide = mise) : ",
"en": "Choice (number, blank = mise): ",
},
"mise has no binary for:": {
"fr": "mise ne publie pas de binaire pour :",
"en": "mise has no binary for:",
},
"those VMs use pyenv": {
"fr": "ces VM utiliseront pyenv",
"en": "those VMs use pyenv",
},
"Installing mise (precompiled Python)": {
"fr": "Installation de mise (Python precompile)",
"en": "Installing mise (precompiled Python)",
},
"VM type:": {
"fr": "Type de VM :",
"en": "VM type:",
},
"Server (no graphical interface)": {
"fr": "Serveur (sans interface graphique)",
"en": "Server (no graphical interface)",
},
"Graphical (server + GNOME desktop)": {
"fr": "Graphique (serveur + bureau GNOME)",
"en": "Graphical (server + GNOME desktop)",
},
"server": {
"fr": "serveur",
"en": "server",
},
"Graphical (server + desktop):": {
"fr": "Graphique (serveur + bureau) :",
"en": "Graphical (server + desktop):",
},
"Installing the desktop (long):": {
"fr": "Installation du bureau (long) :",
"en": "Installing the desktop (long):",
},
"Choice (number, blank = server): ": {
"fr": "Choix (numero, vide = serveur) : ",
"en": "Choice (number, blank = server): ",
},
"Installing the GNOME desktop (long)": {
"fr": "Installation du bureau GNOME (long)",
"en": "Installing the GNOME desktop (long)",
},
"openSUSE mirror:": {
"fr": "miroir openSUSE :",
"en": "openSUSE mirror:",
},
"Remote desktop:": {
"fr": "Bureau distant :",
"en": "Remote desktop:",
},
"One run per install": {
"fr": "une execution par installation",
"en": "One run per install",
},
"limit to host cores": {
"fr": "limiter au nombre de coeurs de l'hote",
"en": "limit to host cores",
},
"free value…": {
"fr": "valeur libre…",
"en": "free value…",
},
"Disk (e.g. 250G, 1.5T)": {
"fr": "Disque (ex. 250G, 1,5T)",
"en": "Disk (e.g. 250G, 1.5T)",
},
"all archs": {
"fr": "toutes",
"en": "all",
},
"Tick what to deploy": {
"fr": "Cocher ce qu'on veut déployer",
"en": "Tick what to deploy",
},
"F7 main versions · F6 all": {
"fr": "F7 versions principales · F6 tout",
"en": "F7 main versions · F6 all",
},
"exists - skipped": {
"fr": "existe — ignorée",
"en": "exists - skipped",
},
"orphan disk - will FAIL": {
"fr": "disque orphelin — ÉCHOUERA",
"en": "orphan disk - will FAIL",
},
"press F5 again to confirm": {
"fr": "F5 à nouveau pour confirmer",
"en": "press F5 again to confirm",
},
"Deploy": {
"fr": "Déployer",
"en": "Deploy",
},
"Edit VM": {
"fr": "Éditer la VM",
"en": "Edit VM",
},
"Server": {
"fr": "Serveur",
"en": "Server",
},
"VM type (default):": {
"fr": "Type de VM (défaut) :",
"en": "VM type (default):",
},
"These values are the default for every VM;": {
"fr": "Ces valeurs sont le défaut de chaque VM ;",
"en": "These values are the default for every VM;",
},
"adjust any of them per VM on the right.": {
"fr": "ajustez-les VM par VM dans la vue de droite.",
"en": "adjust any of them per VM on the right.",
},
"Application store:": {
"fr": "Magasin d'applications :",
"en": "Application store:",
},
"Application store (graphical Ubuntu VMs):": {
"fr": "Magasin d'applications (VM Ubuntu graphiques) :",
"en": "Application store (graphical Ubuntu VMs):",
},
"deb only (epiphany-browser)": {
"fr": "deb uniquement (epiphany-browser)",
"en": "deb only (epiphany-browser)",
},
"Flatpak tooling, no Flathub": {
"fr": "outillage Flatpak, sans Flathub",
"en": "Flatpak tooling, no Flathub",
},
"snap (Ubuntu default, Firefox)": {
"fr": "snap (défaut Ubuntu, Firefox)",
"en": "snap (Ubuntu default, Firefox)",
},
"snap needs the store; slow under emulation.": {
"fr": "snap exige le store ; lent sous émulation.",
"en": "snap needs the store; slow under emulation.",
},
"No graphical VM on a snap-based distro.": {
"fr": "Aucune VM graphique sur une distribution à snap.",
"en": "No graphical VM on a snap-based distro.",
},
"Resources — applied to ALL VMs": {
"fr": "Ressources — appliquées à TOUTES les VM",
"en": "Resources — applied to ALL VMs",
},
"The profile and these fields change EVERY VM.": {
"fr": "Le profil et ces champs changent TOUTES les VM.",
"en": "The profile and these fields change EVERY VM.",
},
"A VM edited on the right (marked) keeps its own.": {
"fr": "Une VM modifiée à droite (marquée ✎) garde les siennes.",
"en": "A VM edited on the right (marked) keeps its own.",
},
"Rename the VM": {
"fr": "Renommer la VM",
"en": "Rename the VM",
},
"Rename": {
"fr": "Renommer",
"en": "Rename",
},
"Empty = back to the automatic name:": {
"fr": "Vide = revenir au nom automatique :",
"en": "Empty = back to the automatic name:",
},
"Invalid name: letters, digits, hyphens.": {
"fr": "Nom invalide : lettres, chiffres et traits d'union.",
"en": "Invalid name: letters, digits, hyphens.",
},
"default; a VM may differ, see its line": {
"fr": "défaut ; une VM peut s'en écarter, voir sa ligne",
"en": "default; a VM may differ, see its line",
},
"varies, see each line": {
"fr": "varie, voir chaque ligne",
"en": "varies, see each line",
},
"From your workstation:": {
"fr": "Depuis votre poste :",
"en": "From your workstation:",
},
"then point your client at": {
"fr": "puis pointez votre client sur",
"en": "then point your client at",
},
"Remote desktop tunnel (VNC/RDP through SSH)": {
"fr": "🖥 Tunnel bureau distant (VNC/RDP par SSH)",
"en": "🖥 Remote desktop tunnel (VNC/RDP through SSH)",
},
"Remote desktop tunnel": {
"fr": "Tunnel vers le bureau distant",
"en": "Remote desktop tunnel",
},
"Which VM?": {"fr": "Quelle VM ?", "en": "Which VM?"},
"No IP for this VM; is it running?": {
"fr": "Pas d'IP pour cette VM ; tourne-t-elle ?",
"en": "No IP for this VM; is it running?",
},
"Run this on YOUR workstation:": {
"fr": "À lancer sur VOTRE poste :",
"en": "Run this on YOUR workstation:",
},
"Graphical console (virt-viewer, built-in tunnel)": {
"fr": "Console graphique (virt-viewer, tunnel intégré)",
"en": "Graphical console (virt-viewer, built-in tunnel)",
},
"virt-viewer is missing here; installing it.": {
"fr": "virt-viewer manque ici ; installation.",
"en": "virt-viewer is missing here; installing it.",
},
"no known package manager here.": {
"fr": "aucun gestionnaire de paquets connu ici.",
"en": "no known package manager here.",
},
"virt-viewer still missing after the install.": {
"fr": "virt-viewer manque toujours après l'installation.",
"en": "virt-viewer still missing after the install.",
},
"Opening": {"fr": "Ouverture", "en": "Opening"},
"Window opening on your display": {
"fr": "Fenêtre en ouverture sur votre affichage",
"en": "Window opening on your display",
},
"Log:": {"fr": "Journal :", "en": "Log:"},
"No display here; run this on YOUR workstation:": {
"fr": "Aucun affichage ici ; à lancer sur VOTRE poste :",
"en": "No display here; run this on YOUR workstation:",
},
"~/.ssh/config written anyway (install)": {
"fr": "entrée ~/.ssh/config écrite quand même : l'installation passe par le rebond",
"en": "~/.ssh/config written anyway: the install needs the jump",
},
"Still on the distribution kernel:": {
"fr": "Encore sur le noyau de la distribution :",
"en": "Still on the distribution kernel:",
},
"Reboot the host: no bridge, no NAT until then.": {
"fr": "Redémarrer l'hôte : ni pont ni NAT avant cela.",
"en": "Reboot the host: no bridge, no NAT until then.",
},
"A ~/.ssh/config alias works there too.": {
"fr": "Un alias de ~/.ssh/config y fonctionne aussi.",
"en": "A ~/.ssh/config alias works there too.",
},
"It builds its own tunnel; no ssh -L to keep open.": {
"fr": "Il monte son propre tunnel ; aucun ssh -L à tenir ouvert.",
"en": "It builds its own tunnel; no ssh -L to keep open.",
},
"Missing? Install virt-viewer:": {
"fr": "Absent ? Installez virt-viewer :",
"en": "Missing? Install virt-viewer:",
},
"repo transfer into the app": {
"fr": "transfert des dépôts dans l'application",
"en": "repo transfer into the app",
},
"graphical session started": {
"fr": "session graphique démarrée",
"en": "graphical session started",
},
"graphical session not started; reboot the VM": {
"fr": "session graphique non démarrée ; redémarrer la VM",
"en": "graphical session not started; reboot the VM",
},
"Hypervisor console (QEMU screen, no guest server)": {
"fr": "Console de l'hyperviseur (écran QEMU, rien dans l'invitée)",
"en": "Hypervisor console (QEMU screen, no guest server)",
},
"then point your VNC client at": {
"fr": "puis pointez votre client VNC sur",
"en": "then point your VNC client at",
},
"Target is the hypervisor": {
"fr": "La cible est l'hyperviseur",
"en": "Target is the hypervisor",
},
"not the VM: the socket is QEMU-side.": {
"fr": "et non la VM : le socket est du côté de QEMU.",
"en": "not the VM: the socket is QEMU-side.",
},
"This hypervisor is Proxmox VE: it has no libvirt.": {
"fr": "Cet hyperviseur est un Proxmox VE : il n'a pas de libvirt.",
"en": "This hypervisor is Proxmox VE: it has no libvirt.",
},
"Its screen is served by a ticket, not by a VNC port.": {
"fr": "Son écran est servi par un ticket, pas par un port VNC.",
"en": "Its screen is served by a ticket, not by a VNC port.",
},
"Two ways in:": {
"fr": "Deux chemins :",
"en": "Two ways in:",
},
"the serial console, VMID from the Proxmox menu:": {
"fr": "la console série, le VMID venant du menu Proxmox :",
"en": "the serial console, VMID from the Proxmox menu:",
},
"the web interface, through a tunnel:": {
"fr": "l'interface web, par un tunnel :",
"en": "the web interface, through a tunnel:",
},
"TODO > Execute > Deploy > Proxmox VE does the first.": {
"fr": "TODO > Execute > Deploy > Proxmox VE fait le premier.",
"en": "TODO > Execute > Deploy > Proxmox VE does the first.",
},
"This VM exposes no VNC port.": {
"fr": "Cette VM n'expose aucun port VNC.",
"en": "This VM exposes no VNC port.",
},
"Its display is likely spice with listen=none:": {
"fr": "Son affichage est probablement spice avec listen=none :",
"en": "Its display is likely spice with listen=none:",
},
"To open it on the loopback (VM restart required):": {
"fr": "Pour l'ouvrir sur la boucle locale (redémarrage de la VM"
" requis) :",
"en": "To open it on the loopback (VM restart required):",
},
"New VMs get this by default; see deploy_qemu.": {
"fr": "Les VM neuves l'ont par défaut ; voir deploy_qemu.",
"en": "New VMs get this by default; see deploy_qemu.",
},
"No ProxyJump for this host in ~/.ssh/config.": {
"fr": "Aucun ProxyJump pour cet hôte dans ~/.ssh/config.",
"en": "No ProxyJump for this host in ~/.ssh/config.",
},
"Cannot tell which machine runs its QEMU.": {
"fr": "Impossible de savoir quelle machine fait tourner son QEMU.",
"en": "Cannot tell which machine runs its QEMU.",
},
"(through the ProxyJump already in ~/.ssh/config)": {
"fr": "(par le ProxyJump déjà dans ~/.ssh/config)",
"en": "(through the ProxyJump already in ~/.ssh/config)",
},
"(the hypervisor only relays; -J puts the VM last)": {
"fr": "(l'hyperviseur ne fait que relayer ; -J met la VM en dernier)",
"en": "(the hypervisor only relays; -J puts the VM last)",
},
"Choice": {"fr": "Choix", "en": "Choice"},
"failed steps": {"fr": "étapes en échec", "en": "failed steps"},
"Failed steps": {"fr": "Étapes en échec", "en": "Failed steps"},
"Hard signals": {"fr": "Signaux durs", "en": "Hard signals"},
"Grouped by shape": {"fr": "Regroupé par forme", "en": "Grouped by shape"},
"line": {"fr": "ligne", "en": "line"},
"free space": {"fr": "libre", "en": "free"},
"silent": {"fr": "silence", "en": "silent"},
"needs the ERPLibre install, skipped:": {
"fr": "exige l'installation ERPLibre, écarté :",
"en": "needs the ERPLibre install, skipped:",
},
"Forgejo (git forge)": {
"fr": "Forgejo (forge git)",
"en": "Forgejo (git forge)",
},
"self-hosted git forge on :3000, SQLite": {
"fr": "forge git auto-hébergée sur :3000, SQLite",
"en": "self-hosted git forge on :3000, SQLite",
},
"no project yet, second try on the warm caches": {
"fr": "pas de projet encore ; seconde tentative sur les caches chauds",
"en": "no project yet, second try on the warm caches",
},
"already there, download skipped": {
"fr": "déjà présent, téléchargement évité",
"en": "already there, download skipped",
},
"inotify watches raised for the IDE": {
"fr": "watches inotify relevées pour l'IDE",
"en": "inotify watches raised for the IDE",
},
"closing what survived the first open:": {
"fr": "fermeture de ce qui a survécu à la première ouverture :",
"en": "closing what survived the first open:",
},
"Gradle daemon killed: out of memory": {
"fr": "démon Gradle tué : mémoire épuisée",
"en": "Gradle daemon killed: out of memory",
},
"out of memory": {"fr": "mémoire épuisée", "en": "out of memory"},
"Gradle heap too small": {
"fr": "tas Gradle trop petit",
"en": "Gradle heap too small",
},
"too many asset files for one APK (ZIP limit: 65535 entries)": {
"fr": "trop de fichiers d'assets pour un APK (limite ZIP : 65535"
" entrées)",
"en": "too many asset files for one APK (ZIP limit: 65535 entries)",
},
"4 GB of swap added for the build": {
"fr": "4 Go de swap ajoutés pour la compilation",
"en": "4 GB of swap added for the build",
},
"no swap could be added; build may run short": {
"fr": "swap impossible à ajouter ; la compilation peut manquer de mémoire",
"en": "no swap could be added; build may run short",
},
"memory:": {"fr": "mémoire :", "en": "memory:"},
"manifest repos not bundled (ZIP entry limit)": {
"fr": "dépôts du manifeste non empaquetés (limite d'entrées ZIP)",
"en": "manifest repos not bundled (ZIP entry limit)",
},
"MB RAM,": {"fr": "Mo de RAM,", "en": "MB RAM,"},
"MB swap, kernel OOM kills:": {
"fr": "Mo de swap, tués par le noyau (OOM) :",
"en": "MB swap, kernel OOM kills:",
},
"Tick the Android emulator tool when deploying.": {
"fr": "Cochez l'outil Émulateur Android au déploiement.",
"en": "Tick the Android emulator tool when deploying.",
},
"Cannot reach this VM.": {
"fr": "VM injoignable.",
"en": "Cannot reach this VM.",
},
"No Android SDK in this VM: no emulator binary.": {
"fr": "Pas de SDK Android dans cette VM : aucun binaire emulator.",
"en": "No Android SDK in this VM: no emulator binary.",
},
"No AVD named erplibre in this VM.": {
"fr": "Aucun AVD nommé erplibre dans cette VM.",
"en": "No AVD named erplibre in this VM.",
},
"It did not start; the VM log says:": {
"fr": "Il n'a pas démarré ; le journal de la VM dit :",
"en": "It did not start; the VM log says:",
},
"No ~/.ssh/config entry; see SSH configuration.": {
"fr": "Aucune entrée ~/.ssh/config ; voir Configuration SSH.",
"en": "No ~/.ssh/config entry; see SSH configuration.",
},
"Not in an SSH session: check the host address.": {
"fr": "Hors session SSH : vérifiez l'adresse de l'hôte.",
"en": "Not in an SSH session: check the host address.",
},
"The tunnel stays open as long as that ssh runs.": {
"fr": "Le tunnel reste ouvert tant que ce ssh tourne.",
"en": "The tunnel stays open as long as that ssh runs.",
},
"No VM defined.": {"fr": "Aucune VM définie.", "en": "No VM defined."},
"No host in ~/.ssh/config and no local VM.": {
"fr": "Aucun hôte dans ~/.ssh/config et aucune VM locale.",
"en": "No host in ~/.ssh/config and no local VM.",
},
"local VM": {"fr": "VM locale", "en": "local VM"},
"Remote desktop kind:": {
"fr": "Type de bureau distant :",
"en": "Remote desktop kind:",
},
"already defined, not counted": {
"fr": "déjà définie(s), non comptée(s)",
"en": "already defined, not counted",
},
"RAM: 2048 or 8G": {"fr": "RAM : 2048 ou 8G", "en": "RAM: 2048 or 8G"},
"Diagnostic dump": {"fr": "Diagnostic", "en": "Diagnostic dump"},
"State written to": {"fr": "État écrit dans", "en": "State written to"},
"Reset VM": {
"fr": "Réinit. VM",
"en": "Reset VM",
},
"Preview": {
"fr": "Aperçu",
"en": "Preview",
},
"All": {
"fr": "Tout",
"en": "All",
},
"Main versions": {
"fr": "Versions principales",
"en": "Main versions",
},
"None": {
"fr": "Rien",
"en": "None",
},
"Cancel": {
"fr": "Annuler",
"en": "Cancel",
},
"Apply": {
"fr": "Appliquer",
"en": "Apply",
},
"Close": {
"fr": "Fermer",
"en": "Close",
},
"Copy log": {
"fr": "Copier le log",
"en": "Copy log",
},
"Copy all logs": {
"fr": "Copier tous les logs",
"en": "Copy all logs",
},
"all logs": {
"fr": "tous les logs",
"en": "all logs",
},
"c copy log · C copy all · q quit": {
"fr": "c copier le log · C copier tout · q quitter",
"en": "c copy log · C copy all · q quit",
},
"Clipboard": {
"fr": "Presse-papiers",
"en": "Clipboard",
},
"chars": {
"fr": "car.",
"en": "chars",
},
"tail only, log was truncated": {
"fr": "fin seulement, log tronqué",
"en": "tail only, log was truncated",
},
"Needs an OSC 52 capable terminal.": {
"fr": "Nécessite un terminal compatible OSC 52.",
"en": "Needs an OSC 52 capable terminal.",
},
"Nothing to copy.": {
"fr": "Rien à copier.",
"en": "Nothing to copy.",
},
"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.",
},
"tree from code": {
"fr": "arbre issu du code",
"en": "tree from code",
},
"visited paths only": {
"fr": "chemins visités seulement",
"en": "visited paths only",
},
"Enter = run, F3 = view": {
"fr": "Entrée = exécuter, F3 = vue",
"en": "Enter = run, F3 = view",
},
"Enter = run, F3/F4 = views": {
"fr": "Entrée = exécuter, F3/F4 = vues",
"en": "Enter = run, F3/F4 = views",
},
"view": {
"fr": "vue",
"en": "view",
},
"avg": {
"fr": "moy",
"en": "avg",
},
"Last install:": {
"fr": "Dernière install :",
"en": "Last install:",
},
"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)? ",
},
"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"},
"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.",
},
"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).",
},
"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): ",
},
"Command failed: ": {
"fr": "Échec de la commande : ",
"en": "Command failed: ",
},
"Textual is required for this screen.": {
"fr": "Textual est nécessaire pour cet écran.",
"en": "Textual is required for this screen.",
},
"Install it now? (Y/n): ": {
"fr": "L'installer maintenant ? (O/n, défaut : oui) : ",
"en": "Install it now? (Y/n, default: yes): ",
},
"Textual is installed.": {
"fr": "Textual est installé.",
"en": "Textual is installed.",
},
"Installation finished but textual is still missing.": {
"fr": "Installation terminée mais textual reste introuvable.",
"en": "Installation finished but textual is still missing.",
},
"pip exited with": {
"fr": "pip a retourné",
"en": "pip exited with",
},
"Your distribution may package it as python3-textual.": {
"fr": "Votre distribution le fournit peut-être en python3-textual.",
"en": "Your distribution may package it as python3-textual.",
},
"Resize a VM disk": {
"fr": "📐 Redimensionner le disque d'une VM",
"en": "📐 Resize a VM disk",
},
"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:",
},
"Could not read current disk size; aborting.": {
"fr": "Impossible de lire la taille actuelle du disque ; abandon.",
"en": "Could not read current disk size; aborting.",
},
"Host free space:": {
"fr": "Espace libre hôte :",
"en": "Host free space:",
},
"max sustainable total (before host full):": {
"fr": "max soutenable au total (avant hôte plein) :",
"en": "max sustainable total (before host full):",
},
"Beyond host capacity by ~%.1f G — overcommit.": {
"fr": "Dépasse la capacité de l'hôte de ~%.1f G — surallocation.",
"en": "Beyond host capacity by ~%.1f G — overcommit.",
},
"The qcow2 is thin: fine until the VM fills it, then the "
"host disk runs out. Max sustainable: ~%.1f G.": {
"fr": "Le qcow2 est creux : OK tant que la VM ne remplit pas, sinon "
"l'hôte tombe à court. Max soutenable : ~%.1f G.",
"en": "The qcow2 is thin: fine until the VM fills it, then the "
"host disk runs out. Max sustainable: ~%.1f G.",
},
"Safe shrink needs libguestfs (virt-resize).": {
"fr": "La réduction sûre nécessite libguestfs (virt-resize).",
"en": "Safe shrink needs libguestfs (virt-resize).",
},
"Install libguestfs-tools now? (y/N): ": {
"fr": "Installer libguestfs-tools maintenant ? (o/N) : ",
"en": "Install libguestfs-tools now? (y/N): ",
},
"Shrink aborted; disk left intact.": {
"fr": "Réduction annulée ; disque laissé intact.",
"en": "Shrink aborted; disk left intact.",
},
"Could not detect the partition to shrink; aborting.": {
"fr": "Partition à réduire introuvable ; abandon.",
"en": "Could not detect the partition to shrink; aborting.",
},
"Missing tools for safe shrink:": {
"fr": "Outils manquants pour la réduction sûre :",
"en": "Missing tools for safe shrink:",
},
"Backing up the disk before shrinking…": {
"fr": "Sauvegarde du disque avant réduction…",
"en": "Backing up the disk before shrinking…",
},
"Back up the disk before shrinking? (Y/n): ": {
"fr": "Sauvegarder le disque avant réduction ? (O/n, défaut : oui) : ",
"en": "Back up the disk before shrinking? (Y/n, default: yes): ",
},
"No backup: a failure could leave the disk broken.": {
"fr": "Sans sauvegarde : un échec pourrait rendre le disque inutilisable.",
"en": "No backup: a failure could leave the disk broken.",
},
"Disk safely shrunk.": {
"fr": "Disque réduit en toute sécurité.",
"en": "Disk safely shrunk.",
},
"No backup to restore; run fsck on the disk before use.": {
"fr": "Pas de sauvegarde à restaurer ; lancez fsck avant utilisation.",
"en": "No backup to restore; run fsck on the disk before use.",
},
"A disk backup was kept:": {
"fr": "Une sauvegarde du disque a été conservée :",
"en": "A disk backup was kept:",
},
"Delete this backup now? (y/N): ": {
"fr": "Effacer cette sauvegarde maintenant ? (o/N) : ",
"en": "Delete this backup now? (y/N): ",
},
"Backup deleted.": {
"fr": "Sauvegarde effacée.",
"en": "Backup deleted.",
},
"Backup kept (delete later via Clean up QEMU).": {
"fr": "Sauvegarde conservée (à effacer plus tard via Nettoyer QEMU).",
"en": "Backup kept (delete later via Clean up QEMU).",
},
"disk backup (resize)": {
"fr": "sauvegarde de disque (redim.)",
"en": "disk backup (resize)",
},
"Backup failed; aborting.": {
"fr": "Échec de la sauvegarde ; abandon.",
"en": "Backup failed; aborting.",
},
"Could not attach the disk (nbd); aborting.": {
"fr": "Impossible d'attacher le disque (nbd) ; abandon.",
"en": "Could not attach the disk (nbd); aborting.",
},
"Only ext2/3/4 can be shrunk safely; aborting.": {
"fr": "Seul ext2/3/4 peut être réduit en sécurité ; abandon.",
"en": "Only ext2/3/4 can be shrunk safely; aborting.",
},
"Target size too small for this layout; aborting.": {
"fr": "Taille cible trop petite pour cette disposition ; abandon.",
"en": "Target size too small for this layout; aborting.",
},
"Not enough used-space margin to shrink; aborting.": {
"fr": "Espace utilisé trop proche de la cible ; abandon.",
"en": "Not enough used-space margin to shrink; aborting.",
},
"Shrinking guest ext filesystem": {
"fr": "Réduction du système de fichiers ext invité",
"en": "Shrinking guest ext filesystem",
},
"resize2fs failed; reverting.": {
"fr": "resize2fs a échoué ; restauration.",
"en": "resize2fs failed; reverting.",
},
"Internal size check failed; reverting.": {
"fr": "Contrôle de taille interne échoué ; restauration.",
"en": "Internal size check failed; reverting.",
},
"Shrinking the partition…": {
"fr": "Réduction de la partition…",
"en": "Shrinking the partition…",
},
"Partition rewrite failed; reverting.": {
"fr": "Réécriture de la partition échouée ; restauration.",
"en": "Partition rewrite failed; reverting.",
},
"Shrinking the qcow2 container…": {
"fr": "Réduction du conteneur qcow2…",
"en": "Shrinking the qcow2 container…",
},
"Container shrink failed; reverting.": {
"fr": "Réduction du conteneur échouée ; restauration.",
"en": "Container shrink failed; reverting.",
},
"Restoring the original disk from backup…": {
"fr": "Restauration du disque d'origine depuis la sauvegarde…",
"en": "Restoring the original disk from backup…",
},
"Shrinking guest FS + partition via virt-resize": {
"fr": "Réduction du FS invité + partition via virt-resize",
"en": "Shrinking guest FS + partition via virt-resize",
},
"virt-resize failed; original disk left intact.": {
"fr": "virt-resize a échoué ; disque d'origine laissé intact.",
"en": "virt-resize failed; original disk left intact.",
},
"Disk safely shrunk. Backup kept at:": {
"fr": "Disque réduit en toute sécurité. Sauvegarde conservée :",
"en": "Disk safely shrunk. Backup kept at:",
},
"click to expand": {
"fr": "cliquer pour déplier",
"en": "click to expand",
},
"No error detected.": {
"fr": "Aucune erreur détectée.",
"en": "No error detected.",
},
"Test a VM (open Odoo in a CLI browser)": {
"fr": "🧪 Tester une VM (ouvrir Odoo dans un navigateur CLI)",
"en": "🧪 Test a VM (open Odoo in a CLI browser)",
},
"Reopen install monitoring (last run / history)": {
"fr": "📈 Rouvrir le suivi d'installation (dernier run / historique)",
"en": "📈 Reopen install monitoring (last run / history)",
},
"No install run found in history.": {
"fr": "Aucun run d'installation dans l'historique.",
"en": "No install run found in history.",
},
"Install runs (most recent first):": {
"fr": "Runs d'installation (du plus récent) :",
"en": "Install runs (most recent first):",
},
"Choice (number, blank = last): ": {
"fr": "Choix (numéro, vide = le dernier) : ",
"en": "Choice (number, blank = last): ",
},
"Invalid selection.": {
"fr": "Sélection invalide.",
"en": "Invalid selection.",
},
"Resolving VM IP...": {
"fr": "Résolution de l'IP de la VM…",
"en": "Resolving VM IP...",
},
"No IP found for this VM.": {
"fr": "Aucune IP trouvée pour cette VM.",
"en": "No IP found for this VM.",
},
"No CLI browser installed. Which to install?": {
"fr": "Aucun navigateur CLI installé. Lequel installer ?",
"en": "No CLI browser installed. Which to install?",
},
"Which browser to install?": {
"fr": "Quel navigateur installer ?",
"en": "Which browser to install?",
},
"Install another browser": {
"fr": "Installer un autre navigateur",
"en": "Install another browser",
},
"Choice (number, blank = w3m): ": {
"fr": "Choix (numéro, vide = w3m) : ",
"en": "Choice (number, blank = w3m): ",
},
"Unknown package manager; install it manually.": {
"fr": "Gestionnaire de paquets inconnu ; installez-le manuellement.",
"en": "Unknown package manager; install it manually.",
},
"Install now? (y/N): ": {
"fr": "Installer maintenant ? (o/N) : ",
"en": "Install now? (y/N): ",
},
"Which browser to view the page?": {
"fr": "Quel navigateur pour voir la page ?",
"en": "Which browser to view the page?",
},
"Choice (number, blank = first): ": {
"fr": "Choix (numéro, vide = le premier) : ",
"en": "Choice (number, blank = first): ",
},
"Page may not have loaded: Odoo not started on :8069, "
"or network/firewall.": {
"fr": "La page ne s'est peut-être pas affichée : Odoo n'est pas "
"démarré sur :8069, ou réseau/pare-feu.",
"en": "Page may not have loaded: Odoo not started on :8069, "
"or network/firewall.",
},
"errors": {
"fr": "erreurs",
"en": "errors",
},
"warnings": {
"fr": "avertissements",
"en": "warnings",
},
"Esc to close": {
"fr": "Échap pour fermer",
"en": "Esc to close",
},
"No running VM to pause.": {
"fr": "Aucune VM en cours à mettre en pause.",
"en": "No running VM to pause.",
},
"No paused VM to resume.": {
"fr": "Aucune VM en pause à reprendre.",
"en": "No paused VM to resume.",
},
"resumed": {
"fr": "reprise(s)",
"en": "resumed",
},
"SSH grow failed; trying the guest agent.": {
"fr": "Échec SSH ; tentative via l'agent invité.",
"en": "SSH grow failed; trying the guest agent.",
},
"No IP; trying the guest agent (no network).": {
"fr": "Pas d'IP ; tentative via l'agent invité (sans réseau).",
"en": "No IP; trying the guest agent (no network).",
},
"Guest filesystem grown via guest agent.": {
"fr": "FS invité étendu via l'agent invité.",
"en": "Guest filesystem grown via guest agent.",
},
"Guest agent grow failed; falling back to console.": {
"fr": "Échec de l'agent invité ; repli sur la console.",
"en": "Guest agent grow failed; falling back to console.",
},
"Guest agent unavailable; falling back to serial console.": {
"fr": "Agent invité indisponible ; repli sur la console série.",
"en": "Guest agent unavailable; falling back to serial console.",
},
"Running via guest agent (no network)…": {
"fr": "Exécution via l'agent invité (sans réseau)…",
"en": "Running via guest agent (no network)…",
},
"SSH grow failed; falling back to serial console.": {
"fr": "Échec de l'extension via SSH ; repli sur la console série.",
"en": "SSH grow failed; falling back to serial console.",
},
"No IP; falling back to serial console.": {
"fr": "Pas d'IP ; repli sur la console série.",
"en": "No IP; falling back to serial console.",
},
"Serial console fallback. Log in, then paste:": {
"fr": "Repli console série. Connectez-vous, puis collez :",
"en": "Serial console fallback. Log in, then paste:",
},
"Open the serial console now? (y/N): ": {
"fr": "Ouvrir la console série maintenant ? (o/N) : ",
"en": "Open the serial console now? (y/N): ",
},
"The VM must be off. Shut it down and retry? (y/N): ": {
"fr": "La VM doit être éteinte. L'éteindre et réessayer ? (o/N) : ",
"en": "The VM must be off. Shut it down and retry? (y/N): ",
},
"VM is still not off; aborting.": {
"fr": "La VM n'est toujours pas éteinte ; abandon.",
"en": "VM is still not off; aborting.",
},
"Waiting for the VM to shut down...": {
"fr": "Attente de l'arrêt de la VM…",
"en": "Waiting for the VM to shut down...",
},
"timeout": {
"fr": "délai max",
"en": "timeout",
},
"shutting down": {
"fr": "arrêt en cours",
"en": "shutting down",
},
"remaining": {
"fr": "restantes",
"en": "remaining",
},
"VM is off.": {
"fr": "VM éteinte.",
"en": "VM is off.",
},
"The VM was shut down for the resize.": {
"fr": "La VM a été éteinte pour le redimensionnement.",
"en": "The VM was shut down for the resize.",
},
"Start the VM now? (y/N): ": {
"fr": "Démarrer la VM maintenant ? (o/N) : ",
"en": "Start the VM now? (y/N): ",
},
"Graceful shutdown timed out. Force off (destroy)? (y/N): ": {
"fr": "Arrêt gracieux trop long. Forcer l'arrêt (destroy) ? (o/N) : ",
"en": "Graceful shutdown timed out. Force off (destroy)? (y/N): ",
},
"Show advanced info (vCPU, RAM, disk)? (y/N): ": {
"fr": "Afficher les infos avancées (vCPU, RAM, disque) ? (o/N) : ",
"en": "Show advanced info (vCPU, RAM, disk)? (y/N): ",
},
"What do you want to do?": {
"fr": "Que voulez-vous faire ?",
"en": "What do you want to do?",
},
"Advanced info (vCPU, RAM, disk)": {
"fr": "Infos avancées (vCPU, RAM, disque)",
"en": "Advanced info (vCPU, RAM, disk)",
},
"Change the state of one or more VMs": {
"fr": "Changer l'état d'une ou plusieurs VM",
"en": "Change the state of one or more VMs",
},
"Enter": {
"fr": "Entrée",
"en": "Enter",
},
"Nothing": {
"fr": "Rien",
"en": "Nothing",
},
"Choice: ": {
"fr": "Choix : ",
"en": "Choice: ",
},
"Available VMs:": {
"fr": "VM disponibles :",
"en": "Available VMs:",
},
"VMs to change (comma-separated): ": {
"fr": "VM à modifier (séparées par des virgules) : ",
"en": "VMs to change (comma-separated): ",
},
"Adjust hardware only (vCPU, RAM, 3D)": {
"fr": "Régler le matériel seulement (vCPU, RAM, 3D)",
"en": "Adjust hardware only (vCPU, RAM, 3D)",
},
"Adjust hardware before starting? (y/N): ": {
"fr": "Régler le matériel avant de démarrer ? (o/N) : ",
"en": "Adjust hardware before starting? (y/N): ",
},
"Not shut off, hardware left untouched:": {
"fr": "Pas éteintes, matériel inchangé :",
"en": "Not shut off, hardware left untouched:",
},
"Host GPU:": {
"fr": "GPU de l'hôte :",
"en": "Host GPU:",
},
"none (software rendering)": {
"fr": "aucun (rendu logiciel)",
"en": "none (software rendering)",
},
"software rendering": {
"fr": "rendu logiciel",
"en": "software rendering",
},
"Unreadable VM definition.": {
"fr": "Définition de VM illisible.",
"en": "Unreadable VM definition.",
},
"Nothing to change.": {
"fr": "Rien à changer.",
"en": "Nothing to change.",
},
"Changes:": {
"fr": "Changements :",
"en": "Changes:",
},
"Apply these changes? (y/N): ": {
"fr": "Appliquer ces changements ? (o/N) : ",
"en": "Apply these changes? (y/N): ",
},
"Autostart": {
"fr": "Démarrage automatique",
"en": "Autostart",
},
"VM hardware": {
"fr": "Matériel des VM",
"en": "VM hardware",
},
"3D": {
"fr": "3D",
"en": "3D",
},
"3D acceleration (host GPU)": {
"fr": "Accélération 3D (GPU de l'hôte)",
"en": "3D acceleration (host GPU)",
},
"Render node": {
"fr": "Nœud de rendu",
"en": "Render node",
},
"VM ready - taking its measurements": {
"fr": "VM prête — relevé en cours",
"en": "VM ready - taking its measurements",
},
"VM start-up": {
"fr": "Mise en route de la VM",
"en": "VM start-up",
},
"system:": {
"fr": "système :",
"en": "system:",
},
"kernel:": {
"fr": "noyau :",
"en": "kernel: ",
},
"address:": {
"fr": "adresse :",
"en": "address:",
},
"disk:": {
"fr": "disque :",
"en": "disk: ",
},
"uptime:": {
"fr": "actif :",
"en": "uptime: ",
},
"Watch the VMs start (no install)": {
"fr": "Suivre le démarrage des VM (sans installation)",
"en": "Watch the VMs start (no install)",
},
"Proxmox VE - Deploy a VM on a remote host": {
# 🗄 et non 💻 : l'entrée d'à côté déploie sur CETTE machine, celle-ci
# sur une baie ailleurs. L'icône est ce qui distingue les deux d'un
# coup d'œil dans le menu.
"fr": "🗄 Proxmox VE - Déployer une VM sur un hôte distant",
"en": "🗄 Proxmox VE - Deploy a VM on a remote host",
},
"Deploy a virtual machine on Proxmox VE!": {
"fr": "Déployer une machine virtuelle sur Proxmox VE !",
"en": "Deploy a virtual machine on Proxmox VE!",
},
"Which Proxmox host?": {
"fr": "Quel hôte Proxmox ?",
"en": "Which Proxmox host?",
},
"From the local QEMU VMs": {
"fr": "Depuis les VM QEMU locales",
"en": "From the local QEMU VMs",
},
"Type an address": {
"fr": "Saisir une adresse",
"en": "Type an address",
},
"Keep": {
"fr": "Garder",
"en": "Keep",
},
"Address (user@host, default user root): ": {
"fr": "Adresse (utilisateur@hôte, utilisateur root par défaut) : ",
"en": "Address (user@host, default user root): ",
},
"SSH jump host (blank = none): ": {
"fr": "Rebond SSH (vide = aucun) : ",
"en": "SSH jump host (blank = none): ",
},
"Local VMs:": {
"fr": "VM locales :",
"en": "Local VMs:",
},
"No IP for this VM: is it running?": {
"fr": "Pas d'IP pour cette VM : est-elle démarrée ?",
"en": "No IP for this VM: is it running?",
},
"Checking": {
"fr": "Vérification de",
"en": "Checking",
},
"Not a Proxmox host (or unreachable):": {
"fr": "Ce n'est pas un hôte Proxmox (ou il est injoignable) :",
"en": "Not a Proxmox host (or unreachable):",
},
"Reachable, but Proxmox VE is not there:": {
"fr": "Machine joignable, mais Proxmox VE n'y est pas :",
"en": "Reachable, but Proxmox VE is not there:",
},
"SSH does not get through:": {
"fr": "SSH ne passe pas :",
"en": "SSH does not get through:",
},
"Install it:": {
"fr": "Pour l'installer :",
"en": "Install it:",
},
"Or redeploy the VM with the hypervisor profile.": {
"fr": "Ou redéployer la VM avec le profil hyperviseur.",
"en": "Or redeploy the VM with the hypervisor profile.",
},
"Check the address, the SSH access and pveversion.": {
"fr": "Vérifier l'adresse, l'accès SSH et pveversion.",
"en": "Check the address, the SSH access and pveversion.",
},
"Proxmox host:": {
"fr": "Hôte Proxmox :",
"en": "Proxmox host:",
},
"through": {
"fr": "par",
"en": "through",
},
"exit code": {
"fr": "code de retour",
"en": "exit code",
},
"No VM on this Proxmox host.": {
"fr": "Aucune VM sur cet hôte Proxmox.",
"en": "No VM on this Proxmox host.",
},
"No running VM on this Proxmox host.": {
"fr": "Aucune VM démarrée sur cet hôte Proxmox.",
"en": "No running VM on this Proxmox host.",
},
"VMs on this host:": {
"fr": "VM de cet hôte :",
"en": "VMs on this host:",
},
"Selection (number): ": {
"fr": "Sélection (numéro) : ",
"en": "Selection (number): ",
},
"Deploy a VM on the Proxmox host": {
"fr": "Déployer une VM sur l'hôte Proxmox",
"en": "Deploy a VM on the Proxmox host",
},
"Preview a deployment (dry-run, nothing sent)": {
"fr": "Prévisualiser un déploiement (dry-run, rien n'est envoyé)",
"en": "Preview a deployment (dry-run, nothing sent)",
},
"Download a cloud image on the host": {
"fr": "Télécharger une image cloud sur l'hôte",
"en": "Download a cloud image on the host",
},
"List VMs (qm list)": {
"fr": "Lister les VM (qm list)",
"en": "List VMs (qm list)",
},
"Clean up (orphan disks)": {
"fr": "Nettoyer (disques orphelins)",
"en": "Clean up (orphan disks)",
},
"Statistics (host and VMs)": {
"fr": "Statistiques (hôte et VM)",
"en": "Statistics (host and VMs)",
},
"Remote desktop tunnel (VNC/RDP over SSH)": {
"fr": "Tunnel bureau distant (VNC/RDP par SSH)",
"en": "Remote desktop tunnel (VNC/RDP over SSH)",
},
"List available images and their specs": {
"fr": "Lister les images disponibles et leurs specs",
"en": "List available images and their specs",
},
"Proxmox - example sequence (dry-run)": {
"fr": "Proxmox - exemple de séquence (dry-run)",
"en": "Proxmox - example sequence (dry-run)",
},
"Host": {
"fr": "Hôte",
"en": "Host",
},
"Change the Proxmox host": {
"fr": "Changer d'hôte Proxmox",
"en": "Change the Proxmox host",
},
"VM name (default: erplibre-<distro>): ": {
"fr": "Nom de la VM (défaut : erplibre-<distro>) : ",
"en": "VM name (default: erplibre-<distro>): ",
},
"RAM in MB, blank = 4096": {
"fr": "RAM en Mo, vide = 4096",
"en": "RAM in MB, blank = 4096",
},
"vCPU, blank = 2": {
"fr": "vCPU, vide = 2",
"en": "vCPU, blank = 2",
},
"Disk size (default 32G): ": {
"fr": "Taille du disque (défaut 32G) : ",
"en": "Disk size (default 32G): ",
},
"Size (+10G to add, 40G for a target): ": {
"fr": "Taille (+10G pour ajouter, 40G pour une cible) : ",
"en": "Size (+10G to add, 40G for a target): ",
},
"pve-cluster is down: /etc/pve is not mounted.": {
"fr": "pve-cluster est à terre : /etc/pve n'est pas monté.",
"en": "pve-cluster is down: /etc/pve is not mounted.",
},
"Without it pvesm answers nothing, hence no storage.": {
"fr": "Sans lui, pvesm ne répond rien — d'où l'absence de stockage.",
"en": "Without it pvesm answers nothing, hence no storage.",
},
"The hostname only resolves to": {
"fr": "Le nom d'hôte ne résout que vers",
"en": "The hostname only resolves to",
},
"pmxcfs needs a routable address.": {
"fr": "pmxcfs exige une adresse routable.",
"en": "pmxcfs needs a routable address.",
},
"cloud-init rewrites /etc/hosts at every boot.": {
"fr": "cloud-init réécrit /etc/hosts à chaque démarrage.",
"en": "cloud-init rewrites /etc/hosts at every boot.",
},
"replay install_proxmox.sh on the host: it fixes /etc/hosts and stops cloud-init undoing it.": {
"fr": "rejouer install_proxmox.sh sur l'hôte : il corrige /etc/hosts et empêche cloud-init de le défaire.",
"en": "replay install_proxmox.sh on the host: it fixes /etc/hosts and stops cloud-init undoing it.",
},
"No storage able to hold a VM disk.": {
"fr": "Aucun stockage capable d'héberger un disque de VM.",
"en": "No storage able to hold a VM disk.",
},
"No NAT table on this host: the bridge would lead nowhere.": {
"fr": "Pas de table NAT sur cet hôte : le pont ne mènerait nulle part.",
"en": "No NAT table on this host: the bridge would lead nowhere.",
},
"reboot it to boot the Proxmox kernel:": {
"fr": "à redémarrer pour amorcer le noyau Proxmox :",
"en": "reboot it to boot the Proxmox kernel:",
},
"Rebooting to boot the new kernel": {
"fr": "Redémarrage pour amorcer le nouveau noyau",
"en": "Rebooting to boot the new kernel",
},
"waiting for the machine to come back": {
"fr": "attente du retour de la machine",
"en": "waiting for the machine to come back",
},
"kernel booted:": {
"fr": "noyau amorcé :",
"en": "kernel booted:",
},
"the machine did not come back on the expected kernel:": {
"fr": "la machine n'est pas revenue sur le noyau attendu :",
"en": "the machine did not come back on the expected kernel:",
},
"Running kernel:": {
"fr": "Noyau en cours :",
"en": "Running kernel:",
},
"The distribution kernel carries no netfilter module.": {
"fr": "Le noyau de la distribution ne porte aucun module netfilter.",
"en": "The distribution kernel carries no netfilter module.",
},
"Proxmox kernel installed:": {
"fr": "Noyau Proxmox installé :",
"en": "Proxmox kernel installed:",
},
"taken at next boot": {
"fr": "pris au prochain démarrage",
"en": "taken at next boot",
},
"then come back here.": {
"fr": "puis revenir ici.",
"en": "then come back here.",
},
"No Proxmox kernel installed: finish the install first.": {
"fr": "Aucun noyau Proxmox installé : terminer l'installation d'abord.",
"en": "No Proxmox kernel installed: finish the install first.",
},
"No free subnet left for an internal bridge.": {
"fr": "Plus aucun réseau libre pour un pont interne.",
"en": "No free subnet left for an internal bridge.",
},
"No network bridge on this host.": {
"fr": "Aucun pont réseau sur cet hôte.",
"en": "No network bridge on this host.",
},
# --- Écran de déploiement Proxmox VE (formulaire TUI) ---
"Deploy one or more ERPLibre VMs on Proxmox VE!": {
"fr": "Déployer une ou plusieurs VM ERPLibre sur Proxmox VE !",
"en": "Deploy one or more ERPLibre VMs on Proxmox VE!",
},
"Proxmox host": {
"fr": "Hôte Proxmox",
"en": "Proxmox host",
},
"node": {
"fr": "nœud",
"en": "node",
},
"Proxmox VE": {
"fr": "Proxmox VE",
"en": "Proxmox VE",
},
"Bridge": {
"fr": "Pont",
"en": "Bridge",
},
"First VMID": {
"fr": "Premier VMID",
"en": "First VMID",
},
"Access": {
"fr": "Accès",
"en": "Access",
},
"SSH public key": {
"fr": "Clé publique SSH",
"en": "SSH public key",
},
"Start the VM after creating it": {
"fr": "Démarrer la VM après sa création",
"en": "Start the VM after creating it",
},
"Add an entry to ~/.ssh/config": {
"fr": "Ajouter une entrée à ~/.ssh/config",
"en": "Add an entry to ~/.ssh/config",
},
"Follow the installation (dashboard)": {
"fr": "Suivre l'installation (tableau de bord)",
"en": "Follow the installation (dashboard)",
},
"Text prompts": {
"fr": "Questions texte",
"en": "Text prompts",
},
"Nothing to deploy.": {
"fr": "Rien à déployer.",
"en": "Nothing to deploy.",
},
"No bridge on the host.": {
"fr": "Aucun pont sur l'hôte.",
"en": "No bridge on the host.",
},
"more disk than the storage has free": {
"fr": "plus de disque que le stockage n'en a de libre",
"en": "more disk than the storage has free",
},
"more RAM than the host has free": {
"fr": "plus de RAM que l'hôte n'en a de libre",
"en": "more RAM than the host has free",
},
"Loading (host, storage, bridges, VMs)...": {
"fr": "Chargement (hôte, stockage, ponts, VM)…",
"en": "Loading (host, storage, bridges, VMs)...",
},
"TUI unavailable": {
"fr": "Interface graphique indisponible",
"en": "TUI unavailable",
},
"VM": {
"fr": "VM",
"en": "VM",
},
"VMID": {
"fr": "VMID",
"en": "VMID",
},
"address": {
"fr": "adresse",
"en": "address",
},
"storage": {
"fr": "stockage",
"en": "storage",
},
"other…": {
"fr": "autre…",
"en": "other…",
},
"offered": {
"fr": "proposés",
"en": "offered",
},
"Would run on": {
"fr": "Serait exécuté sur",
"en": "Would run on",
},
"SSH key ->": {
"fr": "clé SSH ->",
"en": "SSH key ->",
},
"Deploy this VM now? (Y/n): ": {
"fr": "Déployer cette VM maintenant ? (O/n) : ",
"en": "Deploy this VM now? (Y/n): ",
},
"SSH key unreadable:": {
"fr": "Clé SSH illisible :",
"en": "SSH key unreadable:",
},
"SSH key not pushed: password login only.": {
"fr": "Clé SSH non transmise : connexion par mot de passe seulement.",
"en": "SSH key not pushed: password login only.",
},
"Step failed, stopping here.": {
"fr": "Étape en échec, on s'arrête ici.",
"en": "Step failed, stopping here.",
},
"Waiting for the VM address…": {
"fr": "Attente de l'adresse de la VM…",
"en": "Waiting for the VM address…",
},
"No address yet. Try [6] later.": {
"fr": "Pas encore d'adresse. Réessayer avec [6] plus tard.",
"en": "No address yet. Try [6] later.",
},
"Install ERPLibre on it? (Y/n): ": {
"fr": "Y installer ERPLibre ? (O/n) : ",
"en": "Install ERPLibre on it? (Y/n): ",
},
"No address from the guest agent.": {
"fr": "Aucune adresse rendue par l'agent invité.",
"en": "No address from the guest agent.",
},
"Is qemu-guest-agent installed and the VM started?": {
"fr": "qemu-guest-agent est-il installé et la VM démarrée ?",
"en": "Is qemu-guest-agent installed and the VM started?",
},
"Ctrl+O to quit the serial console.": {
"fr": "Ctrl+O pour quitter la console série.",
"en": "Ctrl+O to quit the serial console.",
},
"Proxmox can only GROW a disk, never shrink it.": {
"fr": "Proxmox ne sait qu'AGRANDIR un disque, jamais le rétrécir.",
"en": "Proxmox can only GROW a disk, never shrink it.",
},
"This also destroys their disks and backups.": {
"fr": "Cela détruit aussi leurs disques et leurs sauvegardes.",
"en": "This also destroys their disks and backups.",
},
"Nothing orphaned.": {
"fr": "Rien d'orphelin.",
"en": "Nothing orphaned.",
},
"Orphan disks:": {
"fr": "Disques orphelins :",
"en": "Orphan disks:",
},
"Free them?": {
"fr": "Les libérer ?",
"en": "Free them?",
},
"no address, skipped": {
"fr": "pas d'adresse, ignorée",
"en": "no address, skipped",
},
"unreachable from here.": {
"fr": "injoignable d'ici.",
"en": "unreachable from here.",
},
"Use [13] to add a ProxyJump entry, then a tunnel.": {
"fr": "Utiliser [13] pour l'entrée ProxyJump, puis un tunnel.",
"en": "Use [13] to add a ProxyJump entry, then a tunnel.",
},
"Example: demo-vm, Debian 13, on a Proxmox host": {
"fr": "Exemple : demo-vm, Debian 13, sur un hôte Proxmox",
"en": "Example: demo-vm, Debian 13, on a Proxmox host",
},
"storages": {
"fr": "stockages",
"en": "storages",
},
"memory": {
"fr": "mémoire",
"en": "memory",
},
"No address for this VM.": {
"fr": "Aucune adresse pour cette VM.",
"en": "No address for this VM.",
},
"A static address is visible right after creation.": {
"fr": "Une adresse fixe est connue dès la création.",
"en": "A static address is visible right after creation.",
},
"address given at creation:": {
"fr": "adresse donnée à la création :",
"en": "address given at creation:",
},
"qm create needs one. Two ways:": {
"fr": "« qm create » en exige un. Deux voies :",
"en": "qm create needs one. Two ways:",
},
"create an internal": {
"fr": "créer un pont interne",
"en": "create an internal",
},
"touches no physical NIC": {
"fr": "ne touche à aucune interface physique",
"en": "touches no physical NIC",
},
"do it myself (bridge-ports <nic>, needs console)": {
"fr": "le faire moi-même (bridge-ports <nic>, console requise)",
"en": "do it myself (bridge-ports <nic>, needs console)",
},
"To bridge the LAN, on the host:": {
"fr": "Pour ponter le LAN, sur l'hôte :",
"en": "To bridge the LAN, on the host:",
},
"This moves the host address: do it from a console.": {
"fr": "Cela déplace l'adresse de l'hôte : à faire depuis une console.",
"en": "This moves the host address: do it from a console.",
},
"uplink for NAT": {"fr": "sortie pour le NAT", "en": "uplink for NAT"},
"none": {"fr": "aucune", "en": "none"},
"The bridge did not come up.": {
"fr": "Le pont n'est pas monté.",
"en": "The bridge did not come up.",
},
"SSH does not know this host key yet.": {
"fr": "ssh ne connaît pas encore la clé de cet hôte.",
"en": "SSH does not know this host key yet.",
},
"Would record:": {
"fr": "Enregistrerait :",
"en": "Would record:",
},
"Record it?": {
"fr": "L'enregistrer ?",
"en": "Record it?",
},
"No host key obtained.": {
"fr": "Aucune clé d'hôte obtenue.",
"en": "No host key obtained.",
},
"key(s) recorded in ~/.ssh/known_hosts": {
"fr": "clé(s) enregistrée(s) dans ~/.ssh/known_hosts",
"en": "key(s) recorded in ~/.ssh/known_hosts",
},
"qm needs root: no root, and sudo asks for a password.": {
"fr": "qm exige root : ni root, ni sudo sans mot de passe.",
"en": "qm needs root: no root, and sudo asks for a password.",
},
"Connect as root@, or allow NOPASSWD sudo.": {
"fr": "Se connecter en root@, ou autoriser sudo sans mot de passe.",
"en": "Connect as root@, or allow NOPASSWD sudo.",
},
"Proxmox VE hypervisor (no Odoo)": {
"fr": "Hyperviseur Proxmox VE (sans Odoo)",
"en": "Proxmox VE hypervisor (no Odoo)",
},
"Proxmox will NOT be installed: plain Debian VM.": {
"fr": "Proxmox ne sera PAS installé : la VM restera une Debian nue.",
"en": "Proxmox will NOT be installed: plain Debian VM.",
},
"Later, in the VM:": {
"fr": "Plus tard, dans la VM :",
"en": "Later, in the VM:",
},
"sshfs mount failed.": {
"fr": "Le montage sshfs a échoué.",
"en": "sshfs mount failed.",
},
"Checking SSH access…": {
"fr": "Vérification de l'accès SSH…",
"en": "Checking SSH access…",
},
"SSH reaches this host: ~/.ssh/config is fine.": {
"fr": "SSH joint cet hôte : ~/.ssh/config est bon.",
"en": "SSH reaches this host: ~/.ssh/config is fine.",
},
"sshfs reads the « + » as host chaining.": {
"fr": "sshfs lit le « + » comme un chaînage d'hôtes.",
"en": "sshfs reads the « + » as host chaining.",
},
"Run this instead:": {
"fr": "À lancer plutôt :",
"en": "Run this instead:",
},
"ssh -G resolved nothing: check ~/.ssh/config.": {
"fr": "« ssh -G » n'a rien résolu : vérifier ~/.ssh/config.",
"en": "ssh -G resolved nothing: check ~/.ssh/config.",
},
"Is sshfs (and fuse) installed here?": {
"fr": "sshfs (et fuse) sont-ils installés ici ?",
"en": "Is sshfs (and fuse) installed here?",
},
"SSH fails too:": {
"fr": "SSH échoue aussi :",
"en": "SSH fails too:",
},
"Update ~/.ssh/config, or check the server is up.": {
"fr": "Mettre à jour ~/.ssh/config, ou vérifier que le serveur répond.",
"en": "Update ~/.ssh/config, or check the server is up.",
},
"Check the SSH host and that the server is up.": {
"fr": "Vérifier l'hôte SSH saisi et que le serveur répond.",
"en": "Check the SSH host and that the server is up.",
},
"unknown host name: check HostName": {
"fr": "nom d'hôte inconnu : vérifier HostName",
"en": "unknown host name: check HostName",
},
"no answer: is the server up and reachable?": {
"fr": "aucune réponse : le serveur est-il allumé et joignable ?",
"en": "no answer: is the server up and reachable?",
},
"no route: check the network or the ProxyJump": {
"fr": "pas de route : vérifier le réseau ou le ProxyJump",
"en": "no route: check the network or the ProxyJump",
},
"nothing listening on the SSH port": {
"fr": "rien n'écoute sur le port SSH",
"en": "nothing listening on the SSH port",
},
"authentication refused: check User and key": {
"fr": "authentification refusée : vérifier User et la clé",
"en": "authentication refused: check User and key",
},
"host key changed for this address": {
"fr": "la clé d'hôte a changé pour cette adresse",
"en": "host key changed for this address",
},
"no statistics yet": {
"fr": "pas encore de statistiques",
"en": "no statistics yet",
},
"10s average": {
"fr": "moyenne 10 s",
"en": "10s average",
},
"total written": {
"fr": "cumul écrit",
"en": "total written",
},
"Screens": {
"fr": "Écrans",
"en": "Screens",
},
"bridge": {
"fr": "pont",
"en": "bridge",
},
"this VM has no interface": {
"fr": "cette VM n'a pas d'interface réseau",
"en": "this VM has no interface",
},
"CPU mode": {
"fr": "Mode CPU",
"en": "CPU mode",
},
"no render node on the host": {
"fr": "aucun nœud de rendu sur l'hôte",
"en": "no render node on the host",
},
"this VM has no virtual screen": {
"fr": "cette VM n'a pas d'écran virtuel",
"en": "this VM has no virtual screen",
},
"Unknown VM(s):": {
"fr": "VM inconnue(s) :",
"en": "Unknown VM(s):",
},
"Target state:": {
"fr": "État cible :",
"en": "Target state:",
},
"Target environment?": {
"fr": "Environnement cible ?",
"en": "Target environment?",
},
"Development (~/git/erplibre, SELinux relaxed)": {
"fr": "Développement (~/git/erplibre, SELinux relâché)",
"en": "Development (~/git/erplibre, SELinux relaxed)",
},
"Production (/opt/erplibre, SELinux enforced)": {
"fr": "Production (/opt/erplibre, SELinux confiné)",
"en": "Production (/opt/erplibre, SELinux enforced)",
},
"Choice (1-2, default 1): ": {
"fr": "Choix (1-2, défaut 1) : ",
"en": "Choice (1-2, default 1): ",
},
"Open (start)": {
"fr": "Ouvrir (démarrer)",
"en": "Open (start)",
},
"Close (shut down)": {
"fr": "Fermer (éteindre)",
"en": "Close (shut down)",
},
"start": {
"fr": "démarrer",
"en": "start",
},
"shut down": {
"fr": "éteindre",
"en": "shut down",
},
"Apply:": {
"fr": "Appliquer :",
"en": "Apply:",
},
"Confirm for real? (y/N): ": {
"fr": "Confirmer pour de vrai ? (o/N) : ",
"en": "Confirm for real? (y/N): ",
},
"Storage": {
"fr": "Stockage",
"en": "Storage",
},
"total": {
"fr": "au total",
"en": "total",
},
"used": {
"fr": "utilisés",
"en": "used",
},
"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.",
},
"completed": {
"fr": "terminées",
"en": "completed",
},
"deleted": {
"fr": "effacée",
"en": "deleted",
},
"paused": {
"fr": "pause",
"en": "paused",
},
"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",
},
"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:",
},
"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.",
},
"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",
},
"select all": {
"fr": "tout sélectionner",
"en": "select all",
},
"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, défaut : non) : ",
"en": "Also delete disk images (qcow2 + seed ISO)? (y/N, default: no): ",
},
"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, défaut : non) : ",
"en": "Confirm deletion? (y/N, default: no): ",
},
"Deletion done.": {
"fr": "Effacement terminé.",
"en": "Deletion done.",
},
"Clean up QEMU (orphan files)": {
"fr": "🧹 Nettoyer QEMU (fichiers orphelins)",
"en": "🧹 Clean up QEMU (orphan files)",
},
"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:",
},
"connection guide written": {
"fr": "guide de connexion écrit (/etc/motd)",
"en": "connection guide written (/etc/motd)",
},
"guide not written": {
"fr": "guide non écrit",
"en": "guide not written",
},
"Quit (q) to start the ERPLibre install": {
"fr": "Quitter (q) pour lancer l'installation d'ERPLibre",
"en": "Quit (q) to start the ERPLibre install",
},
"Quit (q) to follow the VM starting up": {
"fr": "Quitter (q) pour suivre la mise en route de la VM",
"en": "Quit (q) to follow the VM starting up",
},
"This name is already taken by": {
"fr": "Ce nom est déjà pris par",
"en": "This name is already taken by",
},
"a local VM": {
"fr": "une VM locale",
"en": "a local VM",
},
"A local VM already bears this name:": {
"fr": "Une VM locale porte déjà ce nom :",
"en": "A local VM already bears this name:",
},
"the alias goes to": {
"fr": "l'alias devient",
"en": "the alias goes to",
},
"s ssh · c copy log · C copy all · q quit": {
"fr": "s ssh · c copier le log · C copier tout · q quitter",
"en": "s ssh · c copy log · C copy all · q quit",
},
"No VM created yet.": {
"fr": "Aucune VM créée pour l'instant.",
"en": "No VM created yet.",
},
# « models » manquait alors que ses trois voisines de la même ligne
# étaient traduites : le rapport de qualité de migration sortait
# « 42 modules · 812 models · 1 204 vues ».
"models": {
"fr": "modèles",
"en": "models",
},
"shutdown (clean)": {
"fr": "éteindre (proprement)",
"en": "shutdown (clean)",
},
"stop (pulls the plug)": {
"fr": "arrêter (coupe le courant)",
"en": "stop (pulls the plug)",
},
"Choice (blank = back): ": {
"fr": "Choix (vide = retour) : ",
"en": "Choice (blank = back): ",
},
"Confirm? (y/N): ": {
"fr": "Confirmer ? (o/N) : ",
"en": "Confirm? (y/N): ",
},
"Creating the bridge on the host…": {
"fr": "Création du pont sur l'hôte…",
"en": "Creating the bridge on the host…",
},
"no disk file found for this VM": {
"fr": "aucun fichier de disque trouvé pour cette VM",
"en": "no disk file found for this VM",
},
"a running process": {
"fr": "un processus en cours",
"en": "a running process",
},
"Kept (still attached to a VM):": {
"fr": "Conservés (encore attachés à une VM) :",
"en": "Kept (still attached to a VM):",
},
"Total:": {
"fr": "Total :",
"en": "Total:",
},
"files": {
"fr": "fichiers",
"en": "files",
},
"Delete these orphan files? (y/N): ": {
"fr": "Effacer ces fichiers orphelins ? (o/N, défaut : non) : ",
"en": "Delete these orphan files? (y/N, default: no): ",
},
"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): ": {
"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): ",
},
"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): ": {
"fr": "Effacer TOUTES les images de base en cache ? (o/N, défaut : non) : ",
"en": "Delete ALL cached base images? (y/N, default: no): ",
},
"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): ": {
"fr": "Supprimer la définition de ces domaines ? (o/N, défaut : non) : ",
"en": "Undefine these ghost domains? (y/N, default: no): ",
},
"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): ": {
"fr": "Effacer ces images en double ? (o/N, défaut : non) : ",
"en": "Delete these duplicate images? (y/N, default: no): ",
},
"its jump host is gone:": {
"fr": "son rebond n'existe plus :",
"en": "its jump host is gone:",
},
"Orphan ~/.ssh/config entries:": {
"fr": "Entrées ~/.ssh/config orphelines :",
"en": "Orphan ~/.ssh/config entries:",
},
"Kept (still leads somewhere):": {
"fr": "Conservées (mènent encore quelque part) :",
"en": "Kept (still leads somewhere):",
},
"reached through a jump host": {
"fr": "joignable par un rebond",
"en": "reached through a jump host",
},
"a VM of the Proxmox host": {
"fr": "une VM de l'hôte Proxmox",
"en": "a VM of the Proxmox host",
},
"Remove these ~/.ssh/config entries? (y/N): ": {
"fr": "Retirer ces entrées de ~/.ssh/config ? (o/N, défaut : non) : ",
"en": "Remove these ~/.ssh/config entries? (y/N, default: no): ",
},
"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): ": {
"fr": "Effacer ces baux périmés ? (o/N, défaut : non) : ",
"en": "Clear these stale leases? (y/N, default: no): ",
},
"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)",
},
"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): ",
},
"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, défaut : oui) : ",
"en": "Install ERPLibre into ~/git/erplibre on each VM? "
"(Y/n, default: yes): ",
},
"Deploy these VMs now? (Y/n): ": {
"fr": "Déployer ces VM maintenant ? (O/n, défaut : oui) : ",
"en": "Deploy these VMs now? (Y/n, default: yes): ",
},
"Discard everything and start over? (y/N): ": {
"fr": "Tout abandonner et recommencer ? (o/N, défaut : non) : ",
"en": "Discard everything and start over? (y/N, default: no): ",
},
"Final review before deployment": {
"fr": "Récapitulatif final avant déploiement",
"en": "Final review before deployment",
},
"VMs to create:": {
"fr": "VM à créer :",
"en": "VMs to create:",
},
"Existing, left untouched:": {
"fr": "Existantes, laissées intactes :",
"en": "Existing, left untouched:",
},
# Renommée : la case commande TOUTE installation — ERPLibre, Odoo, mais
# aussi l'hyperviseur Proxmox VE, qui n'installe ni l'un ni l'autre.
"Install:": {
"fr": "Installation :",
"en": "Install:",
},
"Install software in the VM": {
"fr": "Installer un logiciel dans la VM",
"en": "Install software in the VM",
},
"Installation": {
"fr": "Installation",
"en": "Installation",
},
"Monitoring and parallelism": {
"fr": "Suivi et parallélisme",
"en": "Monitoring and parallelism",
},
"profile": {
"fr": "profil",
"en": "profile",
},
"branch": {
"fr": "branche",
"en": "branch",
},
"production (/opt, confined)": {
"fr": "production (/opt, confiné)",
"en": "production (/opt, confined)",
},
"development (~/git)": {
"fr": "développement (~/git)",
"en": "development (~/git)",
},
"no": {
"fr": "non",
"en": "no",
},
"SSH key:": {
"fr": "Clé SSH :",
"en": "SSH key:",
},
"~/.ssh/config:": {
"fr": "~/.ssh/config :",
"en": "~/.ssh/config:",
},
"one entry per VM": {
"fr": "une entrée par VM",
"en": "one entry per VM",
},
"untouched": {
"fr": "inchangé",
"en": "untouched",
},
"Parallelism:": {
"fr": "Parallélisme :",
"en": "Parallelism:",
},
"at a time": {
"fr": "à la fois",
"en": "at a time",
},
"Nothing to create - every VM already exists.": {
"fr": "Rien à créer — toutes les VM existent déjà.",
"en": "Nothing to create — every VM already exists.",
},
"Name collisions detected": {
"fr": "Collisions de noms détectées",
"en": "Name collisions detected",
},
"VM already defined - SKIPPED, nothing overwritten": {
"fr": "VM déjà définie — IGNORÉE, rien ne sera écrasé",
"en": "VM already defined — SKIPPED, nothing overwritten",
},
"disk present without VM - deployment will FAIL": {
"fr": "disque présent sans VM — le déploiement ÉCHOUERA",
"en": "disk present without VM - deployment will FAIL",
},
"Remove it by hand, or rename the VM.": {
"fr": "L'effacer à la main, ou renommer la VM.",
"en": "Remove it by hand, or rename the VM.",
},
"Continue despite these collisions? (y/N): ": {
"fr": "Continuer malgré ces collisions ? (o/N, défaut : non) : ",
"en": "Continue despite these collisions? (y/N, default: no): ",
},
"Resolving VM IPs (parallel, emulated boot is slow)...": {
"fr": "Résolution des IP des VM (en parallèle, le démarrage émulé "
"est lent)...",
"en": "Resolving VM IPs (parallel, emulated boot is slow)...",
},
"no IP": {
"fr": "pas d'IP",
"en": "no IP",
},
"Cloning ERPLibre on each VM": {
"fr": "Clonage d'ERPLibre sur chaque VM",
"en": "Cloning ERPLibre on each VM",
},
"per VM": {
"fr": "par VM",
"en": "per VM",
},
"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): ": {
"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): ",
},
"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.",
},
"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.",
},
"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)",
},
"Interactive monitoring dashboard? (y/N): ": {
"fr": "Suivi interactif (dashboard) ? (O/n, défaut : oui) : ",
"en": "Interactive monitoring dashboard? (Y/n, default: yes): ",
},
"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:",
},
"Read the logs:": {
"fr": "Lire les logs :",
"en": "Read the logs:",
},
"Log files:": {
"fr": "Fichiers de log :",
"en": "Log files:",
},
"Parallel deployments (default:": {
"fr": "Déploiements en parallèle (défaut :",
"en": "Parallel deployments (default:",
},
"VMs": {
"fr": "VM",
"en": "VMs",
},
"Deploy summary:": {
"fr": "Bilan déploiement :",
"en": "Deploy summary:",
},
"IPs resolved:": {
"fr": "IP résolues :",
"en": "IPs resolved:",
},
"still waiting for": {
"fr": "encore en attente de",
"en": "still waiting for",
},
"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:",
},
"Deploying": {
"fr": "Déploiement de",
"en": "Deploying",
},
"parallel jobs:": {
"fr": "tâches parallèles :",
"en": "parallel jobs:",
},
"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",
},
"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: ",
},
"VM name or ID: ": {
"fr": "Nom ou ID de la VM : ",
"en": "VM name or ID: ",
},
"VM name or ID (or 'all'): ": {
"fr": "Nom ou ID de la VM (ou « all ») : ",
"en": "VM name or ID (or 'all'): ",
},
"RAM in MB (blank = version minimum): ": {
"fr": "RAM en Mo (vide = minimum de la version) : ",
"en": "RAM in MB (blank = version minimum): ",
},
"vCPUs (default: 2): ": {
"fr": "vCPU (défaut : 2) : ",
"en": "vCPUs (default: 2): ",
},
"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).",
},
"SSH public key path": {
"fr": "Chemin de la clé publique SSH",
"en": "SSH public key path",
},
"timezone not set": {
"fr": "fuseau non posé",
"en": "timezone not set",
},
"Timezone": {
"fr": "Fuseau horaire",
"en": "Timezone",
},
"virsh cannot reach qemu:///system without sudo.": {
"fr": "virsh ne peut pas joindre qemu:///system sans sudo.",
"en": "virsh cannot reach qemu:///system without sudo.",
},
"The install monitor runs detached and cannot type a": {
"fr": "Le suivi d'installation tourne détaché et ne peut pas saisir",
"en": "The install monitor runs detached and cannot type a",
},
"password: it would lose the VM when its lease moves.": {
"fr": "de mot de passe : il perdrait la VM au changement de bail.",
"en": "password: it would lose the VM when its lease moves.",
},
"You are in the libvirt group, but this session": {
"fr": "Vous êtes dans le groupe libvirt, mais cette session est",
"en": "You are in the libvirt group, but this session",
},
"predates it. Log out and back in, or run:": {
"fr": "antérieure. Reconnectez-vous, ou lancez :",
"en": "predates it. Log out and back in, or run:",
},
"Group is active, so the cause is elsewhere:": {
"fr": "Le groupe est actif : la cause est donc ailleurs.",
"en": "Group is active, so the cause is elsewhere:",
},
"Add your user to the libvirt group?": {
"fr": "Ajouter votre utilisateur au groupe libvirt ?",
"en": "Add your user to the libvirt group?",
},
"Run it now? (Y/n): ": {
"fr": "L'exécuter maintenant ? (O/n) : ",
"en": "Run it now? (Y/n): ",
},
"Command failed.": {
"fr": "La commande a échoué.",
"en": "Command failed.",
},
"Added. Log out and back in for it to take effect,": {
"fr": "Ajouté. Reconnectez-vous pour que ça prenne effet,",
"en": "Added. Log out and back in for it to take effect,",
},
"or start a new shell with: newgrp libvirt": {
"fr": "ou ouvrez un shell neuf avec : newgrp libvirt",
"en": "or start a new shell with: newgrp libvirt",
},
"Timezone for the VMs": {
"fr": "Fuseau horaire des VM",
"en": "Timezone for the VMs",
},
"Locale for the VMs": {
"fr": "Locale des VM",
"en": "Locale for the VMs",
},
"KVM is unavailable: the VMs will be EMULATED.": {
"fr": "KVM indisponible : les VM seront ÉMULÉES.",
"en": "KVM is unavailable: the VMs will be EMULATED.",
},
"A boot then takes 10-15 min, not under a minute.": {
"fr": "Un démarrage prend alors 10 à 15 min, pas moins d'une minute.",
"en": "A boot then takes 10-15 min, not under a minute.",
},
"Cause: /dev/kvm is missing. This host is itself a VM": {
"fr": "Cause : /dev/kvm est absent. Cet hôte est lui-même une VM",
"en": "Cause: /dev/kvm is missing. This host is itself a VM",
},
"whose hypervisor does not expose nested virtualization.": {
"fr": "dont l'hyperviseur n'expose pas la virtualisation imbriquée.",
"en": "whose hypervisor does not expose nested virtualization.",
},
"To fix it ON THE PARENT HYPERVISOR, not here:": {
"fr": "Pour corriger, SUR L'HYPERVISEUR PARENT, pas ici :",
"en": "To fix it ON THE PARENT HYPERVISOR, not here:",
},
"then set this VM to the host-passthrough CPU mode and": {
"fr": "puis donner à cette VM le mode CPU « host-passthrough », et",
"en": "then set this VM to the host-passthrough CPU mode and",
},
"stop it and start it again - a reboot is not enough.": {
"fr": "l'arrêter puis la redémarrer — un reboot ne suffit pas.",
"en": "stop it and start it again - a reboot is not enough.",
},
"Without access to that hypervisor, nothing to do here.": {
"fr": "Sans accès à cet hyperviseur, il n'y a rien à régler ici.",
"en": "Without access to that hypervisor, nothing to do here.",
},
"Usual cause: this host is itself a VM without nested": {
"fr": "Cause habituelle : cet hôte est lui-même une VM sans",
"en": "Usual cause: this host is itself a VM without nested",
},
"virtualization. Check: systemd-detect-virt": {
"fr": "virtualisation imbriquée. Vérifier : systemd-detect-virt",
"en": "virtualization. Check: systemd-detect-virt",
},
"Unknown timezone, keeping": {
"fr": "Fuseau inconnu, on garde",
"en": "Unknown timezone, keeping",
},
"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, défaut : non) : ",
"en": "Overwrite existing VM disk if present? (y/N, default: no): ",
},
"Verify SHA256 after download? (y/N): ": {
"fr": "Vérifier le SHA256 après téléchargement ? (o/N, défaut : non) : ",
"en": "Verify SHA256 after download? (y/N, default: no): ",
},
"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)",
},
# QEMU - statistics screen
"Statistics (installs, durations, VMs)": {
"fr": "📊 Statistiques (installations, durées, VM)",
"en": "📊 Statistics (installs, durations, VMs)",
},
"QEMU statistics": {"fr": "Statistiques QEMU", "en": "QEMU statistics"},
"No installation recorded yet.": {
"fr": "Aucune installation enregistrée pour l'instant.",
"en": "No installation recorded yet.",
},
"Installations": {"fr": "Installations", "en": "Installations"},
"Total": {"fr": "Total", "en": "Total"},
"succeeded": {"fr": "réussies", "en": "succeeded"},
"failed": {"fr": "échouées", "en": "failed"},
"Period": {"fr": "Période", "en": "Period"},
"days": {"fr": "jours", "en": "days"},
"Median duration": {"fr": "Durée médiane", "en": "Median duration"},
"min": {"fr": "min", "en": "min"},
"max": {"fr": "max", "en": "max"},
"Cumulated time": {"fr": "Temps cumulé", "en": "Cumulated time"},
"By distribution": {"fr": "Par distribution", "en": "By distribution"},
"By version": {"fr": "Par version", "en": "By version"},
"By architecture": {"fr": "Par architecture", "en": "By architecture"},
"Virtual machines": {
"fr": "Machines virtuelles",
"en": "Virtual machines",
},
"Defined": {"fr": "Définies", "en": "Defined"},
"running": {"fr": "en cours", "en": "running"},
"stopped": {"fr": "arrêtées", "en": "stopped"},
"Disk used": {"fr": "Disque utilisé", "en": "Disk used"},
"image": {"fr": "image", "en": "image"},
"failure": {"fr": "échec", "en": "failure"},
"Reset the statistics": {
"fr": "Réinitialiser les statistiques",
"en": "Reset the statistics",
},
"Nothing to reset.": {"fr": "Rien à effacer.", "en": "Nothing to reset."},
"Erase": {"fr": "Effacer", "en": "Erase"},
"recorded runs": {"fr": "runs enregistrés", "en": "recorded runs"},
"runs erased": {"fr": "runs effacés", "en": "runs erased"},
"Cancelled.": {"fr": "Annulé.", "en": "Cancelled."},
# Database migration - resume menu
"Migration in progress": {
"fr": "Migration en cours",
"en": "Migration in progress",
},
"File": {"fr": "Fichier", "en": "File"},
"Database": {"fr": "Base", "en": "Database"},
"Target": {"fr": "Cible", "en": "Target"},
"Started": {"fr": "Démarrée", "en": "Started"},
"Steps": {"fr": "Étapes", "en": "Steps"},
"Prepare the environment": {
"fr": "Préparer l'environnement",
"en": "Prepare the environment",
},
"Restore and neutralize the database": {
"fr": "Restaurer et neutraliser la base",
"en": "Restore and neutralize the database",
},
"Update all addons": {
"fr": "Mettre à jour tous les modules",
"en": "Update all addons",
},
"Clean up before data migration": {
"fr": "Nettoyer avant la migration des données",
"en": "Clean up before data migration",
},
"Upgrade version by version (OpenUpgrade)": {
"fr": "Monter de version en version (OpenUpgrade)",
"en": "Upgrade version by version (OpenUpgrade)",
},
"not started": {"fr": "non démarrée", "en": "not started"},
"done": {"fr": "terminée", "en": "done"},
"partially done": {"fr": "partielle", "en": "partially done"},
"version bumps migrated": {
"fr": "montées de version faites",
"en": "version bumps migrated",
},
"Continue where it stopped": {
"fr": "Continuer là où ça s'est arrêté",
"en": "Continue where it stopped",
},
"Replay from that step": {
"fr": "Reprendre à partir de cette étape",
"en": "Replay from that step",
},
"erases the progression of that step and the next ones": {
"fr": "efface la progression de cette étape et des suivantes",
"en": "erases the progression of that step and the next ones",
},
"New migration, erase everything": {
"fr": "Nouvelle migration, tout effacer",
"en": "New migration, erase everything",
},
"Keep the zip only, ask every question again": {
"fr": "Garder seulement le zip, reposer toutes les questions",
"en": "Keep the zip only, ask every question again",
},
"Your choice": {"fr": "Votre choix", "en": "Your choice"},
"Unknown choice, continuing where it stopped": {
"fr": "Choix inconnu, on continue là où ça s'est arrêté",
"en": "Unknown choice, continuing where it stopped",
},
"Replaying from step": {
"fr": "Reprise à partir de l'étape",
"en": "Replaying from step",
},
"Replay the upgrade from version N": {
"fr": "Reprendre la montée à partir de la version N",
"en": "Replay the upgrade from version N",
},
"rebuilds the intermediate database": {
"fr": "recrée la base intermédiaire",
"en": "rebuilds the intermediate database",
},
"Unknown version": {"fr": "Version inconnue", "en": "Unknown version"},
"The progression file is invalid, ignoring it": {
"fr": "Le fichier de progression est invalide, on l'ignore",
"en": "The progression file is invalid, ignoring it",
},
# --- Menu Execute › Analyse ---
# L'émoji vit dans la valeur, jamais dans la clé. Deux clés distinctes,
# comme « Data » / « Database » : l'entrée de menu porte l'émoji,
# l'étiquette du fil d'Ariane est nue — _todo_telemetry_tui traduit le
# dernier segment du chemin, et un émoji y détonnerait.
"Analyse - Odoo database analysis": {
"fr": "🔬 Analyse - Analyse de base de données Odoo",
"en": "🔬 Analyse - Odoo database analysis",
},
"Analyse": {"fr": "Analyse", "en": "Analysis"},
"Analyse a database. Reading never writes.": {
"fr": "Analyser une base ; la lecture n'écrit jamais.",
"en": "Analyse a database. Reading never writes.",
},
"About to install into": {
"fr": "Sur le point d'installer dans",
"en": "About to install into",
},
"Cannot install from here.": {
"fr": "Installation impossible d'ici.",
"en": "Cannot install from here.",
},
"Enter = cancel": {
"fr": "Entrée = annuler",
"en": "Enter = cancel",
},
"Go ahead?": {
"fr": "On y va ?",
"en": "Go ahead?",
},
"Ignored, not in the list:": {
"fr": "Ignorés, absents de la liste :",
"en": "Ignored, not in the list:",
},
"Install some of the": {
"fr": "Installer une partie des",
"en": "Install some of the",
},
"Numbers, space separated:": {
"fr": "Numéros, séparés par des espaces :",
"en": "Numbers, space separated:",
},
"every one of them": {
"fr": "tous",
"en": "every one of them",
},
"need repair first": {
"fr": "à réparer d'abord",
"en": "need repair first",
},
"suggested module(s) waiting in this database?": {
"fr": "module(s) suggéré(s) qui attendent dans cette base ?",
"en": "suggested module(s) waiting in this database?",
},
"Analyse a database, without ever writing to it!": {
"fr": "Analyser une base, sans jamais y écrire !",
"en": "Analyse a database, without ever writing to it!",
},
# Les icônes du sous-menu Analyse. Elles sont réservées d'avance pour la
# famille entière — 🧱 index, 🎈 ballonnement, 📎 pièces jointes,
# 🔗 ir_model_data — pour qu'ajouter un outil ne demande pas d'en
# rechercher une libre, et que deux outils voisins ne se ressemblent pas.
"Structure": {"fr": "🗄 Structure", "en": "🗄 Structure"},
"Tables and database size": {
"fr": "📏 Tables et poids de la base",
"en": "📏 Tables and database size",
},
"Customisation": {"fr": "🎭 Personnalisation", "en": "🎭 Customisation"},
"Customised views, website copies included": {
"fr": "🖼 Vues personnalisées, copies de site web comprises",
"en": "🖼 Customised views, website copies included",
},
"Analysis failed: ": {
"fr": "L'analyse a échoué : ",
"en": "Analysis failed: ",
},
"Full list and JSON output:": {
"fr": "Liste complète et sortie JSON :",
"en": "Full list and JSON output:",
},
"A backup holds no registry, so nothing was compared with the module"
" source. The classification above needs none; only the differences do."
" Restore it, or run this on the database.": {
"fr": "Une sauvegarde n'a pas de registre, donc rien n'a été comparé"
" avec la source du module. Le classement ci-dessus n'en a pas besoin"
" ; seuls les écarts en ont. Restaurez-la, ou lancez ceci sur la base.",
"en": "A backup holds no registry, so nothing was compared with the"
" module source. The classification above needs none; only the"
" differences do. Restore it, or run this on the database.",
},
"Could not archive the previous log": {
"fr": "Impossible d'archiver le journal précédent",
"en": "Could not archive the previous log",
},
"Previous migration log kept in": {
"fr": "Journal de la migration précédente conservé dans",
"en": "Previous migration log kept in",
},
"done early, before the neutralization": {
"fr": "faite plus tôt, avant la neutralisation",
"en": "done early, before the neutralization",
},
"compare each website copy with the module view it shadows": {
"fr": "comparer chaque copie de site web à la vue de module qu'elle"
" masque",
"en": "compare each website copy with the module view it shadows",
},
"Compare the website copies with the view they shadow": {
"fr": "🪞 Comparer les copies de site web à la vue qu'elles masquent",
"en": "🪞 Compare the website copies with the view they shadow",
},
"website copies compared with their module view,": {
"fr": "copies de site web comparées à leur vue de module,",
"en": "website copies compared with their module view,",
},
"differ.": {"fr": "diffèrent.", "en": "differ."},
"What do you want to do with these COW copies?": {
"fr": "Que voulez-vous faire de ces copies COW ?",
"en": "What do you want to do with these COW copies?",
},
"Enter = decide at the version bump": {
"fr": "Entrée = décider au palier de version",
"en": "Enter = decide at the version bump",
},
"what each copy holds": {
"fr": "ce que chaque copie porte",
"en": "what each copy holds",
},
"why it breaks": {
"fr": "pourquoi ça casse",
"en": "why it breaks",
},
"full screen": {
"fr": "plein écran",
"en": "full screen",
},
"neutralize now, reversible": {
"fr": "neutraliser maintenant, réversible",
"en": "neutralize now, reversible",
},
"Undo with": {
"fr": "Annuler avec",
"en": "Undo with",
},
"Nothing decided": {
"fr": "Rien de décidé",
"en": "Nothing decided",
},
"the migration will ask again at the version bump.": {
"fr": "la migration reposera la question au palier de version.",
"en": "the migration will ask again at the version bump.",
},
"Target version directory not found": {
"fr": "Répertoire de la version cible introuvable",
"en": "Target version directory not found",
},
"No website COW view changes shape in": {
"fr": "Aucune vue COW de site ne change de forme dans",
"en": "No website COW view changes shape in",
},
"website COW view(s) will break when moving to": {
"fr": "vue(s) COW de site casseront au passage à",
"en": "website COW view(s) will break when moving to",
},
"the copy keeps an arch whose shape no longer matches what": {
"fr": "la copie garde une arch dont la forme ne correspond plus à ce que",
"en": "the copy keeps an arch whose shape no longer matches what",
},
"the target module view expects.": {
"fr": "la vue module cible attend.",
"en": "the target module view expects.",
},
"The migration offers to neutralize them, and shows what": {
"fr": "La migration propose de les neutraliser, et montre ce que",
"en": "The migration offers to neutralize them, and shows what",
},
"each copy holds before you answer. To look now:": {
"fr": "chaque copie porte avant que vous répondiez. Pour regarder maintenant :",
"en": "each copy holds before you answer. To look now:",
},
"reversible with --restore": {
"fr": "réversible avec --restore",
"en": "reversible with --restore",
},
"Or by hand. To neutralize a copy, rename its key": {
"fr": "Ou à la main. Pour neutraliser une copie, renommer sa clé",
"en": "Or by hand. To neutralize a copy, rename its key",
},
"an unmatched key is never paired with the": {
"fr": "une clé sans correspondance n'est jamais appariée à la",
"en": "an unmatched key is never paired with the",
},
"module view, so the copy never receives the new": {
"fr": "vue module, la copie ne reçoit donc jamais le nouveau",
"en": "module view, so the copy never receives the new",
},
"Setting active=false alone is NOT enough:": {
"fr": "Mettre active=false seul ne suffit PAS :",
"en": "Setting active=false alone is NOT enough:",
},
"an inactive copy keeping the same key still shadows it.": {
"fr": "une copie inactive gardant la même clé la masque toujours.",
"en": "an inactive copy keeping the same key still shadows it.",
},
"COW view(s) belong to a module absent from": {
"fr": "vue(s) COW appartiennent à un module absent de",
"en": "COW view(s) belong to a module absent from",
},
"COW view(s) are pages or records made in the website": {
"fr": "vue(s) COW sont des pages ou des enregistrements faits dans",
"en": "COW view(s) are pages or records made in the website",
},
"editor (no module view of that name): not at risk.": {
"fr": "l'éditeur de site (aucune vue module de ce nom) : hors de danger.",
"en": "editor (no module view of that name): not at risk.",
},
"Use -v to list them.": {
"fr": "Utiliser -v pour les lister.",
"en": "Use -v to list them.",
},
"No view with this prefix on": {
"fr": "Aucune vue avec ce préfixe sur",
"en": "No view with this prefix on",
},
"archived COW view(s) on": {
"fr": "vue(s) COW archivées sur",
"en": "archived COW view(s) on",
},
"Their arch is intact. Restore them all with --restore,": {
"fr": "Leur arch est intacte. Toutes les restaurer avec --restore,",
"en": "Their arch is intact. Restore them all with --restore,",
},
"once the module view they shadow has the right shape.": {
"fr": "une fois que la vue module qu'elles masquent a la bonne forme.",
"en": "once the module view they shadow has the right shape.",
},
"COW view(s) restored on": {
"fr": "vue(s) COW restaurées sur",
"en": "COW view(s) restored on",
},
"No website COW view to neutralize.": {
"fr": "Aucune vue COW de site à neutraliser.",
"en": "No website COW view to neutralize.",
},
"website COW view(s) would break the bump": {
"fr": "vue(s) COW de site casseraient le palier",
"en": "website COW view(s) would break the bump",
},
"to": {
"fr": "vers",
"en": "to",
},
"Dry-run. Add --apply to rename their key to": {
"fr": "Simulation. Ajouter --apply pour renommer leur clé en",
"en": "Dry-run. Add --apply to rename their key to",
},
"and deactivate them. Reversible": {
"fr": "et les désactiver. Réversible",
"en": "and deactivate them. Reversible",
},
"with --restore; the arch stays in database.": {
"fr": "avec --restore ; l'arch reste en base.",
"en": "with --restore; the arch stays in database.",
},
"COW view(s) neutralized (key prefixed with": {
"fr": "vue(s) COW neutralisées (clé préfixée par",
"en": "COW view(s) neutralized (key prefixed with",
},
"deactivated). The arch is kept as an": {
"fr": "désactivées). L'arch est conservée comme",
"en": "deactivated). The arch is kept as an",
},
"archive; use --restore to undo.": {
"fr": "archive ; utiliser --restore pour annuler.",
"en": "archive; use --restore to undo.",
},
"target inherits, copy holds a standalone template": {
"fr": "la cible hérite, la copie porte un modèle autonome",
"en": "target inherits, copy holds a standalone template",
},
"target is a root view, copy holds inheritance specs": {
"fr": "la cible est une vue racine, la copie porte des specs d'héritage",
"en": "target is a root view, copy holds inheritance specs",
},
"No module view carries this key, so there is nothing to": {
"fr": "Aucune vue module ne porte cette clé, il n'y a donc rien à",
"en": "No module view carries this key, so there is nothing to",
},
"compare: this copy is a page made in the website editor.": {
"fr": "comparer : cette copie est une page faite dans l'éditeur de site.",
"en": "compare: this copy is a page made in the website editor.",
},
"The copy is identical to the module view.": {
"fr": "La copie est identique à la vue module.",
"en": "The copy is identical to the module view.",
},
"line(s) added": {
"fr": "ligne(s) ajoutée(s)",
"en": "line(s) added",
},
"removed": {
"fr": "retirée(s)",
"en": "removed",
},
"this is what neutralizing gives up.": {
"fr": "c'est ce que la neutralisation abandonne.",
"en": "this is what neutralizing gives up.",
},
"the module no longer declares this template": {
"fr": "le module ne déclare plus ce modèle",
"en": "the module no longer declares this template",
},
"inheritance specs (needs inherit_id)": {
"fr": "des specs d'héritage (exige inherit_id)",
"en": "inheritance specs (needs inherit_id)",
},
"a standalone template": {
"fr": "un modèle autonome",
"en": "a standalone template",
},
"Odoo changing the shape of its own template is NOT the": {
"fr": "Qu'Odoo change la forme de son propre modèle n'est PAS le",
"en": "Odoo changing the shape of its own template is NOT the",
},
"problem: on a database without a copy, the module upgrade": {
"fr": "problème : sur une base sans copie, la mise à jour du module",
"en": "problem: on a database without a copy, the module upgrade",
},
"rewrites the view and nothing breaks. It breaks here because": {
"fr": "réécrit la vue et rien ne casse. Ça casse ici parce qu'une",
"en": "rewrites the view and nothing breaks. It breaks here because",
},
"a COPY exists and froze the old shape — the copy follows the": {
"fr": "COPIE existe et a figé l'ancienne forme — la copie suit le",
"en": "a COPY exists and froze the old shape — the copy follows the",
},
"module and becomes an extension, while still holding a": {
"fr": "module et devient une extension, tout en portant encore un",
"en": "module and becomes an extension, while still holding a",
},
"standalone template. Odoo then applies that template as an": {
"fr": "modèle autonome. Odoo applique alors ce modèle comme une",
"en": "standalone template. Odoo then applies that template as an",
},
"inheritance spec and stops on « cannot be located in parent": {
"fr": "spec d'héritage et s'arrête sur « cannot be located in parent",
"en": "inheritance spec and stops on « cannot be located in parent",
},
"view ».": {
"fr": "view ».",
"en": "view ».",
},
"This copy has no module view of that name: it is a page": {
"fr": "Cette copie n'a aucune vue module de ce nom : c'est une page",
"en": "This copy has no module view of that name: it is a page",
},
"made in the website editor, and nothing holds its content.": {
"fr": "faite dans l'éditeur de site, et rien d'autre ne porte son contenu.",
"en": "made in the website editor, and nothing holds its content.",
},
"This copy is IDENTICAL to the module view it shadows: it": {
"fr": "Cette copie est IDENTIQUE à la vue module qu'elle masque : elle",
"en": "This copy is IDENTICAL to the module view it shadows: it",
},
"holds no customization, so neutralizing it loses nothing.": {
"fr": "ne porte aucune personnalisation, la neutraliser ne perd rien.",
"en": "holds no customization, so neutralizing it loses nothing.",
},
"This copy differs from the module view by": {
"fr": "Cette copie diffère de la vue module de",
"en": "This copy differs from the module view by",
},
"line(s):": {
"fr": "ligne(s) :",
"en": "line(s):",
},
"that is the customization, and all neutralizing gives up.": {
"fr": "c'est la personnalisation, et tout ce que la neutralisation abandonne.",
"en": "that is the customization, and all neutralizing gives up.",
},
"Run without --shape to read it.": {
"fr": "Lancer sans --shape pour la lire.",
"en": "Run without --shape to read it.",
},
"No website COW view is at risk.": {
"fr": "Aucune vue COW de site n'est en danger.",
"en": "No website COW view is at risk.",
},
"No COW copy has drifted from its module view.": {
"fr": "Aucune copie COW n'a dérivé de sa vue module.",
"en": "No COW copy has drifted from its module view.",
},
"COW copy(ies) drifted from their module": {
"fr": "copie(s) COW ont dérivé de leur vue",
"en": "COW copy(ies) drifted from their module",
},
"view in": {
"fr": "module dans",
"en": "view in",
},
"Odoo surfaces this when the module view is rewritten (a": {
"fr": "Odoo le fait apparaître quand la vue module est réécrite (un",
"en": "Odoo surfaces this when the module view is rewritten (a",
},
"version bump) or when the page is rendered.": {
"fr": "palier de version) ou quand la page est rendue.",
"en": "version bump) or when the page is rendered.",
},
"NO module view with this key": {
"fr": "AUCUNE vue module avec cette clé",
"en": "NO module view with this key",
},
"child": {
"fr": "enfant",
"en": "child",
},
"cannot apply": {
"fr": "ne peut s'appliquer",
"en": "cannot apply",
},
"Nothing changed. Re-run with --reset <key> --apply to": {
"fr": "Rien n'a changé. Relancer avec --reset <clé> --apply pour",
"en": "Nothing changed. Re-run with --reset <key> --apply to",
},
"reset a copy onto its module view.": {
"fr": "réinitialiser une copie sur sa vue module.",
"en": "reset a copy onto its module view.",
},
"no module view to reset onto, skipped.": {
"fr": "aucune vue module sur laquelle réinitialiser, ignorée.",
"en": "no module view to reset onto, skipped.",
},
"dry-run": {
"fr": "simulation",
"en": "dry-run",
},
"would reset": {
"fr": "réinitialiserait",
"en": "would reset",
},
"onto": {
"fr": "sur",
"en": "onto",
},
"reset": {
"fr": "réinitialisé",
"en": "reset",
},
"previous arch saved to": {
"fr": "arch précédente sauvegardée dans",
"en": "previous arch saved to",
},
"copy(ies) reset. Re-apply any real customisation": {
"fr": "copie(s) réinitialisée(s). Réappliquer toute vraie personnalisation",
"en": "copy(ies) reset. Re-apply any real customisation",
},
"as an INHERITING view, not a copy, so it cannot go stale": {
"fr": "comme une vue HÉRITANTE, pas une copie, pour qu'elle ne périme plus",
"en": "as an INHERITING view, not a copy, so it cannot go stale",
},
"again.": {
"fr": "à l'avenir.",
"en": "again.",
},
"lxml is required to resolve the xpath expressions.": {
"fr": "lxml est requis pour résoudre les expressions xpath.",
"en": "lxml is required to resolve the xpath expressions.",
},
"COW view(s) recorded in": {
"fr": "vue(s) COW enregistrées dans",
"en": "COW view(s) recorded in",
},
"COW view(s) disappeared": {
"fr": "vue(s) COW ont disparu",
"en": "COW view(s) disappeared",
},
"COW view(s) appeared": {
"fr": "vue(s) COW sont apparues",
"en": "COW view(s) appeared",
},
"arch rewritten": {
"fr": "arch réécrite",
"en": "arch rewritten",
},
"COW view(s) changed": {
"fr": "vue(s) COW ont changé",
"en": "COW view(s) changed",
},
"No change on the website COW views.": {
"fr": "Aucun changement sur les vues COW de site.",
"en": "No change on the website COW views.",
},
"Welcome to the Odoo database upgrade with ERPLibre": {
"fr": "Bienvenue dans la mise à niveau de base de données Odoo avec ERPLibre",
"en": "Welcome to the Odoo database upgrade with ERPLibre",
},
"Select the zip file of your database backup.": {
"fr": "Sélectionnez le fichier zip de votre sauvegarde de base de données.",
"en": "Select the zip file of your database backup.",
},
"Give the path of the file, or empty to use a file": {
"fr": "Donnez le chemin du fichier, ou rien pour utiliser un",
"en": "Give the path of the file, or empty to use a file",
},
"browser, or type": {
"fr": "navigateur de fichiers, ou tapez",
"en": "browser, or type",
},
"to download from production": {
"fr": "pour télécharger depuis la production",
"en": "to download from production",
},
"Cannot retrieve the database from remote, please retry the migration.": {
"fr": "Impossible de récupérer la base distante, veuillez relancer la migration.",
"en": "Cannot retrieve the database from remote, please retry the migration.",
},
"Open file": {
"fr": "Ouverture du fichier",
"en": "Open file",
},
"Detected Odoo CE version": {
"fr": "Version Odoo CE détectée",
"en": "Detected Odoo CE version",
},
"Which version do you want to upgrade to?": {
"fr": "Vers quelle version voulez-vous migrer ?",
"en": "Which version do you want to upgrade to?",
},
"Search the Odoo version": {
"fr": "Recherche de la version Odoo",
"en": "Search the Odoo version",
},
"Find the right environment, read the .zip file": {
"fr": "Recherche du bon environnement, lecture du fichier .zip",
"en": "Find the right environment, read the .zip file",
},
"Would you like to install": {
"fr": "Voulez-vous installer",
"en": "Would you like to install",
},
"You need an installed system before": {
"fr": "Il faut un système installé avant de",
"en": "You need an installed system before",
},
"continuing, check your Odoo installation.": {
"fr": "continuer, vérifiez votre installation Odoo.",
"en": "continuing, check your Odoo installation.",
},
"Install the environment if missing": {
"fr": "Installation de l'environnement s'il manque",
"en": "Install the environment if missing",
},
"Search missing modules": {
"fr": "Recherche des modules manquants",
"en": "Search missing modules",
},
"Install the missing modules, search for them or": {
"fr": "Installer les modules manquants, les chercher ou",
"en": "Install the missing modules, search for them or",
},
"ask to uninstall them (can break data)": {
"fr": "demander à les désinstaller (peut casser des données)",
"en": "ask to uninstall them (can break data)",
},
"Cannot set up the environment to begin.": {
"fr": "Impossible de préparer l'environnement pour commencer.",
"en": "Cannot set up the environment to begin.",
},
"Missing module": {
"fr": "Module manquant",
"en": "Missing module",
},
"Duplicate module": {
"fr": "Module en double",
"en": "Duplicate module",
},
"Missing or duplicate module detected at init,": {
"fr": "Module manquant ou en double détecté à l'init,",
"en": "Missing or duplicate module detected at init,",
},
"do you want to continue?": {
"fr": "voulez-vous continuer ?",
"en": "do you want to continue?",
},
"Missing or duplicate module detected at init, do": {
"fr": "Module manquant ou en double détecté à l'init,",
"en": "Missing or duplicate module detected at init, do",
},
"you want to continue?": {
"fr": "voulez-vous continuer ?",
"en": "you want to continue?",
},
"Which database name do you want to work with?": {
"fr": "Avec quel nom de base voulez-vous travailler ?",
"en": "Which database name do you want to work with?",
},
"Ignore the database neutralization": {
"fr": "Ignorer la neutralisation de la base",
"en": "Ignore the database neutralization",
},
"Working with database": {
"fr": "Travail sur la base",
"en": "Working with database",
},
"will copy": {
"fr": "va copier",
"en": "will copy",
},
"a file already exists, do you want to": {
"fr": "un fichier existe déjà, voulez-vous",
"en": "a file already exists, do you want to",
},
"continue?": {
"fr": "continuer ?",
"en": "continue?",
},
"Restore the database": {
"fr": "Restauration de la base",
"en": "Restore the database",
},
"Update all addons before neutralizing (already": {
"fr": "Mettre à jour tous les modules avant la neutralisation (déjà",
"en": "Update all addons before neutralizing (already",
},
"neutralized by Odoo if supported)": {
"fr": "neutralisée par Odoo si pris en charge)",
"en": "neutralized by Odoo if supported)",
},
"Do you need to upgrade before neutralizing the": {
"fr": "Faut-il mettre à jour avant de neutraliser la",
"en": "Do you need to upgrade before neutralizing the",
},
"database? Press enter to ignore": {
"fr": "base ? Entrée pour ignorer",
"en": "database? Press enter to ignore",
},
"Update the database before neutralizing, by module": {
"fr": "Mise à jour de la base avant neutralisation, par module",
"en": "Update the database before neutralizing, by module",
},
"Neutralize the database": {
"fr": "Neutralisation de la base",
"en": "Neutralize the database",
},
"Modules to uninstall before the migration": {
"fr": "Modules à désinstaller avant la migration",
"en": "Modules to uninstall before the migration",
},
"Uninstall modules": {
"fr": "Désinstallation des modules",
"en": "Uninstall modules",
},
"Install modules": {
"fr": "Installation des modules",
"en": "Install modules",
},
"Go to Settings / Technical / Cleanup... / Purge and": {
"fr": "Aller dans Configuration / Technique / Nettoyage... / Purger et",
"en": "Go to Settings / Technical / Cleanup... / Purge and",
},
"purge the obsolete modules": {
"fr": "purger les modules obsolètes",
"en": "purge the obsolete modules",
},
"Press enter to continue step 3": {
"fr": "Entrée pour continuer l'étape 3",
"en": "Press enter to continue step 3",
},
"Inspect zip": {
"fr": "Inspection du zip",
"en": "Inspect zip",
},
"Import database from zip": {
"fr": "Import de la base depuis le zip",
"en": "Import database from zip",
},
"Succeed update all addons": {
"fr": "Mise à jour de tous les modules",
"en": "Succeed update all addons",
},
"Clean up database before data migration": {
"fr": "Nettoyage de la base avant la migration des données",
"en": "Clean up database before data migration",
},
"Upgrade version with OpenUpgrade": {
"fr": "Montée de version avec OpenUpgrade",
"en": "Upgrade version with OpenUpgrade",
},
"Cleaning up database after upgrade": {
"fr": "Nettoyage de la base après la montée de version",
"en": "Cleaning up database after upgrade",
},
"Migration finished": {
"fr": "Migration terminée",
"en": "Migration finished",
},
"Clone to Odoo": {
"fr": "Clonage vers Odoo",
"en": "Clone to Odoo",
},
"FAILED (status": {
"fr": "ÉCHEC (statut",
"en": "FAILED (status",
},
"Stopping:": {
"fr": "Arrêt :",
"en": "Stopping:",
},
"is not usable.": {
"fr": "n'est pas utilisable.",
"en": "is not usable.",
},
"Clone Odoo": {
"fr": "Clonage Odoo",
"en": "Clone Odoo",
},
"nothing": {
"fr": "rien",
"en": "nothing",
},
"Switch Odoo": {
"fr": "Bascule Odoo",
"en": "Switch Odoo",
},
"done with update": {
"fr": "terminée avec mise à jour",
"en": "done with update",
},
"Module upgrade Odoo": {
"fr": "Mise à jour des modules Odoo",
"en": "Module upgrade Odoo",
},
"Database upgrade Odoo": {
"fr": "Migration de la base Odoo",
"en": "Database upgrade Odoo",
},
"Modules to uninstall before Odoo": {
"fr": "Modules à désinstaller avant Odoo",
"en": "Modules to uninstall before Odoo",
},
"to redo the command": {
"fr": "pour refaire la commande",
"en": "to redo the command",
},
"Error detected, press enter to continue or": {
"fr": "Erreur détectée, Entrée pour continuer ou",
"en": "Error detected, press enter to continue or",
},
"to stop": {
"fr": "pour arrêter",
"en": "to stop",
},
"Clone done for Odoo": {
"fr": "Clonage terminé pour Odoo",
"en": "Clone done for Odoo",
},
"Clone already done for Odoo": {
"fr": "Clonage déjà fait pour Odoo",
"en": "Clone already done for Odoo",
},
"Switch already done for Odoo": {
"fr": "Bascule déjà faite pour Odoo",
"en": "Switch already done for Odoo",
},
"Switch done with update for Odoo": {
"fr": "Bascule terminée avec mise à jour pour Odoo",
"en": "Switch done with update for Odoo",
},
"Module upgrade done for Odoo": {
"fr": "Mise à jour des modules terminée pour Odoo",
"en": "Module upgrade done for Odoo",
},
"Module upgrade already done for Odoo": {
"fr": "Mise à jour des modules déjà faite pour Odoo",
"en": "Module upgrade already done for Odoo",
},
"Database upgrade done for Odoo": {
"fr": "Migration de la base terminée pour Odoo",
"en": "Database upgrade done for Odoo",
},
"Database upgrade already done for Odoo": {
"fr": "Migration de la base déjà faite pour Odoo",
"en": "Database upgrade already done for Odoo",
},
"Cloning to Odoo": {
"fr": "Clonage vers Odoo",
"en": "Cloning to Odoo",
},
"from": {
"fr": "depuis",
"en": "from",
},
"Duplicate module in Odoo": {
"fr": "Module en double dans Odoo",
"en": "Duplicate module in Odoo",
},
"Duplicate module error detected, handle it": {
"fr": "Erreur de module en double détectée, la traiter",
"en": "Duplicate module error detected, handle it",
},
"manually then press enter to continue.": {
"fr": "manuellement puis Entrée pour continuer.",
"en": "manually then press enter to continue.",
},
"Missing module error detected, missing in": {
"fr": "Erreur de module manquant détectée, manquant dans",
"en": "Missing module error detected, missing in",
},
"All of the list above": {
"fr": "Toute la liste ci-dessus",
"en": "All of the list above",
},
"Add an extra custom one": {
"fr": "Ajouter un module personnalisé",
"en": "Add an extra custom one",
},
"List the missing modules to delete,": {
"fr": "Énumérer les modules manquants à supprimer,",
"en": "List the missing modules to delete,",
},
"separated by commas. The others will be": {
"fr": "séparés par des virgules. Les autres seront",
"en": "separated by commas. The others will be",
},
"migrated": {
"fr": "migrés",
"en": "migrated",
},
"Migration fix for Odoo": {
"fr": "Correctif de migration pour Odoo",
"en": "Migration fix for Odoo",
},
"Migration fix done for Odoo": {
"fr": "Correctif de migration terminé pour Odoo",
"en": "Migration fix done for Odoo",
},
"No migration fix to run for Odoo": {
"fr": "Aucun correctif de migration à exécuter pour Odoo",
"en": "No migration fix to run for Odoo",
},
"Migration fix already done for Odoo": {
"fr": "Correctif de migration déjà fait pour Odoo",
"en": "Migration fix already done for Odoo",
},
"List the module names to delete,": {
"fr": "Énumérer les noms de modules à supprimer,",
"en": "List the module names to delete,",
},
"separated by commas": {
"fr": "séparés par des virgules",
"en": "separated by commas",
},
"Missing module error": {
"fr": "Erreur de module manquant",
"en": "Missing module error",
},
"Duplicate module error": {
"fr": "Erreur de module en double",
"en": "Duplicate module error",
},
"Module error": {
"fr": "Erreur de module",
"en": "Module error",
},
"Please validate the commits after the code": {
"fr": "Veuillez valider les commits après la migration",
"en": "Please validate the commits after the code",
},
"migration.": {
"fr": "du code.",
"en": "migration.",
},
"To show the repo status": {
"fr": "Pour afficher l'état des dépôts",
"en": "To show the repo status",
},
"Please validate this path in config.conf": {
"fr": "Veuillez valider ce chemin dans config.conf",
"en": "Please validate this path in config.conf",
},
"Database migration to Odoo": {
"fr": "Migration de la base vers Odoo",
"en": "Database migration to Odoo",
},
"is now half migrated: replaying the command on": {
"fr": "est maintenant à moitié migrée : rejouer la commande dessus",
"en": "is now half migrated: replaying the command on",
},
"it would never recover, so it is NOT offered.": {
"fr": "ne s'en remettrait jamais, ce n'est donc PAS proposé.",
"en": "it would never recover, so it is NOT offered.",
},
"The clone step has been reset. Fix the": {
"fr": "L'étape de clonage a été réinitialisée. Corrigez la",
"en": "The clone step has been reset. Fix the",
},
"cause, then relaunch the migration and answer": {
"fr": "cause, puis relancez la migration et répondez",
"en": "cause, then relaunch the migration and answer",
},
"continue": {
"fr": "continuer",
"en": "continue",
},
"will be dropped and rebuilt from the previous": {
"fr": "sera supprimée et reconstruite depuis la version",
"en": "will be dropped and rebuilt from the previous",
},
"version before retrying.": {
"fr": "précédente avant de réessayer.",
"en": "version before retrying.",
},
"Do you want to upgrade all": {
"fr": "Voulez-vous tout mettre à jour",
"en": "Do you want to upgrade all",
},
"Press y/Y to upgrade all addons of the": {
"fr": "y/Y pour mettre à jour tous les modules de la",
"en": "Press y/Y to upgrade all addons of the",
},
"Open the server with Selenium": {
"fr": "Ouvrir le serveur avec Selenium",
"en": "Open the server with Selenium",
},
"Do you want to test this upgrade? Choose": {
"fr": "Voulez-vous tester cette migration ? Choisissez",
"en": "Do you want to test this upgrade? Choose",
},
"or press enter to ignore it": {
"fr": "ou Entrée pour ignorer",
"en": "or press enter to ignore it",
},
"Press enter to continue": {
"fr": "Entrée pour continuer",
"en": "Press enter to continue",
},
"Re-update i18n, purge the data and the tables": {
"fr": "Remise à jour de l'i18n, purge des données et des tables",
"en": "Re-update i18n, purge the data and the tables",
},
"except mail_test and mail_test_full": {
"fr": "sauf mail_test et mail_test_full",
"en": "except mail_test and mail_test_full",
},
"A backup can be created": {
"fr": "Une sauvegarde peut être créée",
"en": "A backup can be created",
},
"Press y/Y or type filename.zip to export, or": {
"fr": "y/Y ou un nom fichier.zip pour exporter, ou",
"en": "Press y/Y or type filename.zip to export, or",
},
"enter to continue": {
"fr": "Entrée pour continuer",
"en": "enter to continue",
},
"Test the migration, press y/Y": {
"fr": "Tester la migration, y/Y",
"en": "Test the migration, press y/Y",
},
"Documentation for this version": {
"fr": "Documentation de cette version",
"en": "Documentation for this version",
},
"Command not found": {
"fr": "Commande non trouvée",
"en": "Command not found",
},
"Execute command": {
"fr": "Exécution de la commande",
"en": "Execute command",
},
"Textual is missing from this interpreter:": {
"fr": "Textual manque à cet interpréteur :",
"en": "Textual is missing from this interpreter:",
},
"Run it with": {
"fr": "Le lancer avec",
"en": "Run it with",
},
"No leftover for theme": {
"fr": "Aucun reste pour le thème",
"en": "No leftover for theme",
},
"attachment(s) still under": {
"fr": "pièce(s) jointe(s) encore sous",
"en": "attachment(s) still under",
},
"view(s) whose key still names it": {
"fr": "vue(s) dont la clé le nomme encore",
"en": "view(s) whose key still names it",
},
"Nothing was deleted: their content may be the only trace": {
"fr": "Rien n'a été supprimé : leur contenu peut être la seule trace",
"en": "Nothing was deleted: their content may be the only trace",
},
"of a customization. Read before removing.": {
"fr": "d'une personnalisation. Lire avant de retirer.",
"en": "of a customization. Read before removing.",
},
"Installed theme(s) on": {
"fr": "Thème(s) installé(s) sur",
"en": "Installed theme(s) on",
},
"A theme carries view copies and SCSS through every": {
"fr": "Un thème traîne des copies de vues et des SCSS à travers chaque",
"en": "A theme carries view copies and SCSS through every",
},
"version bump, and a bump can rename what they rely on.": {
"fr": "palier de version, et un palier peut renommer ce dont ils dépendent.",
"en": "version bump, and a bump can rename what they rely on.",
},
"Uninstall them properly before migrating?": {
"fr": "Les désinstaller proprement avant de migrer ?",
"en": "Uninstall them properly before migrating?",
},
"Kept. Nothing was uninstalled.": {
"fr": "Conservés. Rien n'a été désinstallé.",
"en": "Kept. Nothing was uninstalled.",
},
"No customized SCSS is at risk in": {
"fr": "Aucun SCSS personnalisé n'est en danger dans",
"en": "No customized SCSS is at risk in",
},
"customized SCSS use(s) a variable that": {
"fr": "SCSS personnalisé(s) utilisent une variable que",
"en": "customized SCSS use(s) a variable that",
},
"no longer defines: the bundle will not compile.": {
"fr": "ne définit plus : le bundle ne compilera pas.",
"en": "no longer defines: the bundle will not compile.",
},
"Each one is a copy frozen on an older version. Dropping it": {
"fr": "Chacun est une copie figée sur une version antérieure. L'abandonner",
"en": "Each one is a copy frozen on an older version. Dropping it",
},
"restores the module file:": {
"fr": "rend le fichier du module :",
"en": "restores the module file:",
},
"Read it first: what it holds beyond the stale variable is": {
"fr": "Le lire d'abord : ce qu'il porte au-delà de la variable périmée est",
"en": "Read it first: what it holds beyond the stale variable is",
},
"a real customization, to re-apply as a small file.": {
"fr": "une vraie personnalisation, à réappliquer en petit fichier.",
"en": "a real customization, to re-apply as a small file.",
},
"Read the customizations above before continuing.": {
"fr": "Lire les personnalisations ci-dessus avant de continuer.",
"en": "Read the customizations above before continuing.",
},
"Missing:": {
"fr": "Manquantes :",
"en": "Missing:",
},
"No module file of that name in": {
"fr": "Aucun fichier de module de ce nom dans",
"en": "No module file of that name in",
},
"the target no longer ships it, so there is nothing to": {
"fr": "la cible ne le livre plus, il n'y a donc rien sur quoi",
"en": "the target no longer ships it, so there is nothing to",
},
"fall back on. Read the copy before dropping it.": {
"fr": "retomber. Lire la copie avant de l'abandonner.",
"en": "fall back on. Read the copy before dropping it.",
},
"The copy is identical to the module file.": {
"fr": "La copie est identique au fichier du module.",
"en": "The copy is identical to the module file.",
},
"line(s): that is what resetting gives up.": {
"fr": "ligne(s) : c'est ce que la réinitialisation abandonne.",
"en": "line(s): that is what resetting gives up.",
},
"What do you want to do with these customizations?": {
"fr": "Que voulez-vous faire de ces personnalisations ?",
"en": "What do you want to do with these customizations?",
},
"Enter = nothing": {
"fr": "Entrée = rien",
"en": "Enter = nothing",
},
"what the copy changed": {
"fr": "ce que la copie a changé",
"en": "what the copy changed",
},
"reset them onto the module file": {
"fr": "les réinitialiser sur le fichier du module",
"en": "reset them onto the module file",
},
"Full screen view unavailable.": {
"fr": "Vue plein écran indisponible.",
"en": "Full screen view unavailable.",
},
"Saved before resetting": {
"fr": "Sauvegardé avant réinitialisation",
"en": "Saved before resetting",
},
"Reset failed, nothing was changed.": {
"fr": "La réinitialisation a échoué, rien n'a été modifié.",
"en": "Reset failed, nothing was changed.",
},
"Reset done.": {
"fr": "Réinitialisation faite.",
"en": "Reset done.",
},
"This copy uses variables that": {
"fr": "Cette copie utilise des variables que",
"en": "This copy uses variables that",
},
"no longer defines": {
"fr": "ne définit plus",
"en": "no longer defines",
},
"The copy was written against an older version and frozen": {
"fr": "La copie a été écrite contre une version antérieure et figée",
"en": "The copy was written against an older version and frozen",
},
"there. The module has since renamed what it relies on.": {
"fr": "là. Le module a depuis renommé ce dont elle dépend.",
"en": "there. The module has since renamed what it relies on.",
},
"Resetting restores": {
"fr": "La réinitialisation rend",
"en": "Resetting restores",
},
"(nothing: the target no longer ships this file)": {
"fr": "(rien : la cible ne livre plus ce fichier)",
"en": "(nothing: the target no longer ships this file)",
},
"Reset command copied.": {
"fr": "Commande de réinitialisation copiée.",
"en": "Reset command copied.",
},
"Resetting needs Odoo 13.0 or later; this checkout is on": {
"fr": "La réinitialisation exige Odoo 13.0 ou plus ; ce checkout est sur",
"en": "Resetting needs Odoo 13.0 or later; this checkout is on",
},
"The prediction stands, the fix does not: run it again once": {
"fr": "La prédiction tient, pas la correction : relancer une fois",
"en": "The prediction stands, the fix does not: run it again once",
},
"the bump is done, on the upgraded database.": {
"fr": "le palier passé, sur la base montée de version.",
"en": "the bump is done, on the upgraded database.",
},
"Applying it from here fails with": {
"fr": "L'appliquer d'ici échoue sur",
"en": "Applying it from here fails with",
},
"and changes nothing.": {
"fr": "et ne change rien.",
"en": "and changes nothing.",
},
"Reset one of them onto its module view": {
"fr": "Réinitialiser l'une d'elles sur sa vue module",
"en": "Reset one of them onto its module view",
},
"Drifted COW copies": {
"fr": "Copies COW ayant dérivé",
"en": "Drifted COW copies",
},
"Which one(s) to reset onto the module view?": {
"fr": "Laquelle ou lesquelles réinitialiser sur la vue module ?",
"en": "Which one(s) to reset onto the module view?",
},
"numbers separated by commas, a = all, empty =": {
"fr": "numéros séparés par des virgules, a = toutes, vide =",
"en": "numbers separated by commas, a = all, empty =",
},
"Kept. Nothing was reset.": {
"fr": "Conservées. Rien n'a été réinitialisé.",
"en": "Kept. Nothing was reset.",
},
"Unknown choice, nothing was reset.": {
"fr": "Choix inconnu, rien n'a été réinitialisé.",
"en": "Unknown choice, nothing was reset.",
},
"Delete these leftovers, or keep them?": {
"fr": "Effacer ces restes, ou les garder ?",
"en": "Delete these leftovers, or keep them?",
},
"Enter = keep": {
"fr": "Entrée = garder",
"en": "Enter = keep",
},
"delete, after saving them": {
"fr": "effacer, après les avoir sauvegardés",
"en": "delete, after saving them",
},
"Kept. Nothing was deleted.": {
"fr": "Conservés. Rien n'a été effacé.",
"en": "Kept. Nothing was deleted.",
},
"Saved before deleting": {
"fr": "Sauvegardé avant effacement",
"en": "Saved before deleting",
},
"Deletion failed, nothing was removed.": {
"fr": "L'effacement a échoué, rien n'a été retiré.",
"en": "Deletion failed, nothing was removed.",
},
"attachment(s) deleted.": {
"fr": "pièce(s) jointe(s) effacée(s).",
"en": "attachment(s) deleted.",
},
"Request every public URL of this database now?": {
"fr": "Interroger maintenant toutes les URL publiques de cette base ?",
"en": "Request every public URL of this database now?",
},
"The sitemap listed no URL: nothing was tested.": {
"fr": "Le sitemap n'a listé aucune URL : rien n'a été testé.",
"en": "The sitemap listed no URL: nothing was tested.",
},
"public URL(s) answered without error.": {
"fr": "URL publique(s) ont répondu sans erreur.",
"en": "public URL(s) answered without error.",
},
"public URL(s) failed": {
"fr": "URL publique(s) ont échoué",
"en": "public URL(s) failed",
},
"no answer": {
"fr": "aucune réponse",
"en": "no answer",
},
"A page listed for search engines that does not answer is": {
"fr": "Une page listée pour les moteurs de recherche qui ne répond pas est",
"en": "A page listed for search engines that does not answer is",
},
"a page your visitors do not reach either.": {
"fr": "une page que vos visiteurs n'atteignent pas non plus.",
"en": "a page your visitors do not reach either.",
},
"The server never answered on": {
"fr": "Le serveur n'a jamais répondu sur",
"en": "The server never answered on",
},
"Could not read": {
"fr": "Impossible de lire",
"en": "Could not read",
},
"Starting Odoo on": {
"fr": "Démarrage d'Odoo sur",
"en": "Starting Odoo on",
},
"port": {
"fr": "port",
"en": "port",
},
"parent view(s) in cause": {
"fr": "vue(s) parente(s) en cause",
"en": "parent view(s) in cause",
},
"Those parents are copies frozen on an older version;": {
"fr": "Ces parents sont des copies figées sur une version antérieure ;",
"en": "Those parents are copies frozen on an older version;",
},
"resetting them onto the module view is the fix": {
"fr": "les réinitialiser sur la vue module est le correctif",
"en": "resetting them onto the module view is the fix",
},
"No parent view named: nothing to offer.": {
"fr": "Aucune vue parente nommée : rien à proposer.",
"en": "No parent view named: nothing to offer.",
},
"Copies to reset onto their module view": {
"fr": "Copies à réinitialiser sur leur vue module",
"en": "Copies to reset onto their module view",
},
"Which one(s) to reset?": {
"fr": "Laquelle ou lesquelles réinitialiser ?",
"en": "Which one(s) to reset?",
},
"Re-checked the": {
"fr": "Revérification des",
"en": "Re-checked the",
},
"failing URL(s) after the reset": {
"fr": "URL en échec après la réinitialisation",
"en": "failing URL(s) after the reset",
},
"Something already listens on port": {
"fr": "Quelque chose écoute déjà sur le port",
"en": "Something already listens on port",
},
"it would be tested instead of this database.": {
"fr": "il serait testé à la place de cette base.",
"en": "it would be tested instead of this database.",
},
"Enter =": {
"fr": "Entrée =",
"en": "Enter =",
},
"No COW copy carries this key": {
"fr": "Aucune copie COW ne porte cette clé",
"en": "No COW copy carries this key",
},
"already identical to the module view.": {
"fr": "déjà identique à la vue module.",
"en": "already identical to the module view.",
},
"Odoo surfaces this when the module view is rewritten": {
"fr": "Odoo le fait apparaître quand la vue module est réécrite",
"en": "Odoo surfaces this when the module view is rewritten",
},
"(a version bump) or when the page is rendered.": {
"fr": "(un palier de version) ou quand la page est rendue.",
"en": "(a version bump) or when the page is rendered.",
},
"Before starting: what already answers, and what": {
"fr": "Avant de commencer : ce qui répond déjà, et ce qui",
"en": "Before starting: what already answers, and what",
},
"does not. A page broken now will still be broken": {
"fr": "ne répond pas. Une page cassée maintenant le sera encore",
"en": "does not. A page broken now will still be broken",
},
"after — and that is not the migration.": {
"fr": "après — et ce ne sera pas la migration.",
"en": "after — and that is not the migration.",
},
"No child fails on this copy: it drifted without": {
"fr": "Aucun enfant n'échoue sur cette copie : elle a dérivé sans",
"en": "No child fails on this copy: it drifted without",
},
"breaking anything yet.": {
"fr": "encore rien casser.",
"en": "breaking anything yet.",
},
"These children no longer find their anchor in the copy": {
"fr": "Ces enfants ne trouvent plus leur point d'ancrage dans la copie",
"en": "These children no longer find their anchor in the copy",
},
"The anchor exists in the module view": {
"fr": "L'ancrage existe dans la vue module",
"en": "The anchor exists in the module view",
},
"but not in this copy, frozen on an older version.": {
"fr": "mais pas dans cette copie, figée sur une version antérieure.",
"en": "but not in this copy, frozen on an older version.",
},
"Resetting restores the module arch; the customization the": {
"fr": "Réinitialiser rend l'arch du module ; la personnalisation que",
"en": "Resetting restores the module arch; the customization the",
},
"copy carried is saved first, and is yours to re-apply as an": {
"fr": "la copie portait est sauvegardée d'abord, à vous de la réappliquer en",
"en": "copy carried is saved first, and is yours to re-apply as an",
},
"INHERITING view with its own key.": {
"fr": "vue HÉRITANTE avec sa propre clé.",
"en": "INHERITING view with its own key.",
},
"No module view carries this key: nothing to reset": {
"fr": "Aucune vue module ne porte cette clé : rien sur quoi",
"en": "No module view carries this key: nothing to reset",
},
"onto.": {
"fr": "réinitialiser.",
"en": "onto.",
},
"Browse the differences full screen": {
"fr": "Parcourir les différences en plein écran",
"en": "Browse the differences full screen",
},
"The checkout is on Odoo": {
"fr": "Le checkout est sur Odoo",
"en": "The checkout is on Odoo",
},
"and the database on": {
"fr": "et la base sur",
"en": "and the database on",
},
"Opening it with the wrong version writes to it before": {
"fr": "L'ouvrir avec la mauvaise version y écrit avant",
"en": "Opening it with the wrong version writes to it before",
},
"failing. Switch the checkout first.": {
"fr": "d'échouer. Basculer le checkout d'abord.",
"en": "failing. Switch the checkout first.",
},
"Database cleanup on": {
"fr": "Nettoyage de la base",
"en": "Database cleanup on",
},
"Cleaning": {
"fr": "Nettoyage de",
"en": "Cleaning",
},
"pass": {
"fr": "passe",
"en": "pass",
},
"purged": {
"fr": "purgés",
"en": "purged",
},
"purged;": {
"fr": "purgés ;",
"en": "purged;",
},
"could not be, and are left as they are": {
"fr": "n'ont pas pu l'être, et restent en l'état",
"en": "could not be, and are left as they are",
},
"entries purged, nothing left.": {
"fr": "entrées purgées, rien ne reste.",
"en": "entries purged, nothing left.",
},
"no such wizard in this version, skipped.": {
"fr": "pas d'assistant pour cela dans cette version, ignoré.",
"en": "no such wizard in this version, skipped.",
},
"A database can carry leftovers nothing can remove.": {
"fr": "Une base peut porter des restes que rien ne peut retirer.",
"en": "A database can carry leftovers nothing can remove.",
},
"This is a warning, not a failure.": {
"fr": "C'est un avertissement, pas un échec.",
"en": "This is a warning, not a failure.",
},
"The cleanup produced no report.": {
"fr": "Le nettoyage n'a produit aucun rapport.",
"en": "The cleanup produced no report.",
},
"Unreadable report": {
"fr": "Rapport illisible",
"en": "Unreadable report",
},
"obsolete models": {
"fr": "modèles obsolètes",
"en": "obsolete models",
},
"obsolete modules": {
"fr": "modules obsolètes",
"en": "obsolete modules",
},
"obsolete columns": {
"fr": "colonnes obsolètes",
"en": "obsolete columns",
},
"obsolete tables": {
"fr": "tables obsolètes",
"en": "obsolete tables",
},
"obsolete data entries": {
"fr": "entrées de données obsolètes",
"en": "obsolete data entries",
},
"obsolete menu entries": {
"fr": "entrées de menu obsolètes",
"en": "obsolete menu entries",
},
"missing indexes": {
"fr": "index manquants",
"en": "missing indexes",
},
"obsolete properties": {
"fr": "propriétés obsolètes",
"en": "obsolete properties",
},
"entries would be purged": {
"fr": "entrées seraient purgées",
"en": "entries would be purged",
},
"nothing was changed": {
"fr": "rien n'a été modifié",
"en": "nothing was changed",
},
"Enter = 1": {
"fr": "Entrée = 1",
"en": "Enter = 1",
},
"Enter = all, n = none": {
"fr": "Entrée = tous, n = aucun",
"en": "Enter = all, n = none",
},
"Enter = delete, after saving them": {
"fr": "Entrée = effacer, après les avoir sauvegardés",
"en": "Enter = delete, after saving them",
},
"Enter = neutralize now, reversible": {
"fr": "Entrée = neutraliser maintenant, réversible",
"en": "Enter = neutralize now, reversible",
},
"Enter = reset them onto the module file": {
"fr": "Entrée = les réinitialiser sur le fichier du module",
"en": "Enter = reset them onto the module file",
},
"Enter upgrades all addons of the": {
"fr": "Entrée met à jour tous les modules de la",
"en": "Enter upgrades all addons of the",
},
"Open it at EVERY version bump, stop asking": {
"fr": "L'ouvrir à CHAQUE palier de version, ne plus demander",
"en": "Open it at EVERY version bump, stop asking",
},
"Testing every bump, as chosen earlier.": {
"fr": "Test à chaque palier, comme choisi plus tôt.",
"en": "Testing every bump, as chosen earlier.",
},
"numbers separated by commas, Enter = all, n =": {
"fr": "numéros séparés par des virgules, Entrée = toutes, n =",
"en": "numbers separated by commas, Enter = all, n =",
},
"decide at the version bump": {
"fr": "décider au palier de version",
"en": "decide at the version bump",
},
"keep": {
"fr": "garder",
"en": "keep",
},
"The server did not serve the login page.": {
"fr": "Le serveur n'a pas servi la page de connexion.",
"en": "The server did not serve the login page.",
},
"Wrong login or password for user": {
"fr": "Identifiant ou mot de passe refusé pour l'utilisateur",
"en": "Wrong login or password for user",
},
"Could not read the menus": {
"fr": "Impossible de lire les menus",
"en": "Could not read the menus",
},
"Apps opened as the test user": {
"fr": "Applications ouvertes avec l'utilisateur test",
"en": "Apps opened as the test user",
},
"not openable this way (client or server": {
"fr": "non ouvrables ainsi (action client ou",
"en": "not openable this way (client or server",
},
"action): nothing to render.": {
"fr": "serveur) : rien à rendre.",
"en": "action): nothing to render.",
},
"opened with an empty domain: theirs": {
"fr": "ouvertes avec un domaine vide : le leur",
"en": "opened with an empty domain: theirs",
},
"needs the browser to evaluate it.": {
"fr": "demande le navigateur pour être évalué.",
"en": "needs the browser to evaluate it.",
},
"Every app opened its first page.": {
"fr": "Chaque application a ouvert sa première page.",
"en": "Every app opened its first page.",
},
"Apps that failed to open": {
"fr": "Applications qui n'ont pas pu s'ouvrir",
"en": "Apps that failed to open",
},
"reading the action": {
"fr": "lecture de l'action",
"en": "reading the action",
},
"rendering the views": {
"fr": "rendu des vues",
"en": "rendering the views",
},
"loading the first records": {
"fr": "chargement des premiers enregistrements",
"en": "loading the first records",
},
"These are back-office failures: the public smoke test": {
"fr": "Ce sont des échecs du back-office : le test de fumée public",
"en": "These are back-office failures: the public smoke test",
},
"cannot see them.": {
"fr": "ne peut pas les voir.",
"en": "cannot see them.",
},
"Could not log in as": {
"fr": "Connexion impossible en tant que",
"en": "Could not log in as",
},
"No": {
"fr": "Aucun",
"en": "No",
},
"user in": {
"fr": "utilisateur dans",
"en": "user in",
},
"the database was not neutralized, nothing to browse.": {
"fr": "la base n'a pas été neutralisée, rien à parcourir.",
"en": "the database was not neutralized, nothing to browse.",
},
"Back office not browsed": {
"fr": "Back-office non parcouru",
"en": "Back office not browsed",
},
"no test user: the database was not neutralized": {
"fr": "pas d'utilisateur test : la base n'a pas été neutralisée",
"en": "no test user: the database was not neutralized",
},
"Could not tell whether the": {
"fr": "Impossible de savoir si l'utilisateur",
"en": "Could not tell whether the",
},
"user exists in": {
"fr": "existe dans",
"en": "user exists in",
},
"could not tell whether the test user exists": {
"fr": "impossible de savoir si l'utilisateur test existe",
"en": "could not tell whether the test user exists",
},
"listing the model fields": {
"fr": "inventaire des champs du modèle",
"en": "listing the model fields",
},
"model absent from the running registry": {
"fr": "modèle absent du registre en cours",
"en": "model absent from the running registry",
},
"installed in the database, but its module code": {
"fr": "installé dans la base, mais le code de son module",
"en": "installed in the database, but its module code",
},
"is not in this addons path.": {
"fr": "n'est pas dans cet addons path.",
"en": "is not in this addons path.",
},
"Views naming a field the model no longer has": {
"fr": "Vues nommant un champ que le modèle n'a plus",
"en": "Views naming a field the model no longer has",
},
"Public pages, then the back office as the test user": {
"fr": "Les pages publiques, puis le back-office avec l'utilisateur test",
"en": "Public pages, then the back office as the test user",
},
"if the database was neutralized.": {
"fr": "si la base a été neutralisée.",
"en": "if the database was neutralized.",
},
"Portal": {
"fr": "Portail",
"en": "Portal",
},
"Portal pages opened as the test user": {
"fr": "Pages du portail ouvertes avec l'utilisateur test",
"en": "Portal pages opened as the test user",
},
"not signed in": {
"fr": "pas connecté",
"en": "not signed in",
},
"the page served was the login form": {
"fr": "la page servie était le formulaire de connexion",
"en": "the page served was the login form",
},
"server log": {
"fr": "journal du serveur",
"en": "server log",
},
"Purging modules reloads the whole registry: on a big": {
"fr": "Purger les modules recharge tout le registre : sur un grand",
"en": "Purging modules reloads the whole registry: on a big",
},
"addons path this takes minutes, not seconds.": {
"fr": "addons path cela prend des minutes, pas des secondes.",
"en": "addons path this takes minutes, not seconds.",
},
"Took": {
"fr": "Durée :",
"en": "Took",
},
"seconds.": {
"fr": "secondes.",
"en": "seconds.",
},
"pass": {
"fr": "passe",
"en": "pass",
},
"The cleanup was still running after": {
"fr": "Le nettoyage tournait encore après",
"en": "The cleanup was still running after",
},
"seconds and was stopped.": {
"fr": "secondes et a été arrêté.",
"en": "seconds and was stopped.",
},
"the whole batch": {
"fr": "le lot entier",
"en": "the whole batch",
},
"Still failing after": {
"fr": "Échoue toujours après",
"en": "Still failing after",
},
"attempts: this one needs a developer.": {
"fr": "tentatives : celle-ci demande un développeur.",
"en": "attempts: this one needs a developer.",
},
"Error detected. Choose, or ctrl+c to": {
"fr": "Erreur détectée. Choisissez, ou ctrl+c pour",
"en": "Error detected. Choose, or ctrl+c to",
},
"stop": {
"fr": "arrêter",
"en": "stop",
},
"Too many turns on this prompt: moving on.": {
"fr": "Trop de tours sur cette invite : on passe.",
"en": "Too many turns on this prompt: moving on.",
},
"Please validate git commit on repos, press to": {
"fr": "Veuillez valider les commits sur les dépôts, appuyez pour",
"en": "Please validate git commit on repos, press to",
},
"Check the migrated code, press to continue": {
"fr": "Vérifiez le code migré, appuyez pour continuer",
"en": "Check the migrated code, press to continue",
},
"Please validate the repo is ready to run": {
"fr": "Veuillez valider que le dépôt est prêt pour",
"en": "Please validate the repo is ready to run",
},
"press to continue": {
"fr": "appuyez pour continuer",
"en": "press to continue",
},
"smoke_internal_ui.py is missing": {
"fr": "smoke_internal_ui.py est absent",
"en": "smoke_internal_ui.py is missing",
},
"the test user is gone from a neutralized database: the back office was NOT checked": {
"fr": "l'utilisateur test a disparu d'une base neutralisée : le back-office n'a PAS été vérifié",
"en": "the test user is gone from a neutralized database: the back office was NOT checked",
},
"Back office NOT browsed": {
"fr": "Back-office NON parcouru",
"en": "Back office NOT browsed",
},
"Public pages, then the back office and /my as the": {
"fr": "Les pages publiques, puis le back-office et /my avec",
"en": "Public pages, then the back office and /my as the",
},
"test user (neutralized database).": {
"fr": "l'utilisateur test (base neutralisée).",
"en": "test user (neutralized database).",
},
"Public pages only:": {
"fr": "Pages publiques seulement :",
"en": "Public pages only:",
},
"was not neutralized, so there is no test user to": {
"fr": "n'a pas été neutralisée, il n'y a donc pas d'utilisateur test pour",
"en": "was not neutralized, so there is no test user to",
},
"sign in with.": {
"fr": "s'y connecter.",
"en": "sign in with.",
},
"Migration state": {
"fr": "État de la migration",
"en": "Migration state",
},
"started": {
"fr": "démarrée",
"en": "started",
},
"last written": {
"fr": "dernière écriture",
"en": "last written",
},
"current step": {
"fr": "étape courante",
"en": "current step",
},
"Test results": {
"fr": "Résultat des tests",
"en": "Test results",
},
"No tool has run yet.": {
"fr": "Aucun outil n'a encore tourné.",
"en": "No tool has run yet.",
},
"Commands that failed": {
"fr": "Commandes en échec",
"en": "Commands that failed",
},
"What was done, step by step": {
"fr": "Ce qui a été fait, étape par étape",
"en": "What was done, step by step",
},
"runs": {
"fr": "passages",
"en": "runs",
},
"nothing to report": {
"fr": "rien à signaler",
"en": "nothing to report",
},
"findings to look at": {
"fr": "des trouvailles à regarder",
"en": "findings to look at",
},
"the tool itself failed": {
"fr": "l'outil lui-même a échoué",
"en": "the tool itself failed",
},
"unknown result": {
"fr": "résultat inconnu",
"en": "unknown result",
},
"before the first step": {
"fr": "avant la première étape",
"en": "before the first step",
},
"No migration in progress.": {
"fr": "Aucune migration en cours.",
"en": "No migration in progress.",
},
"show the migration state": {
"fr": "afficher l'état de la migration",
"en": "show the migration state",
},
"Nothing to show yet.": {
"fr": "Rien à montrer pour l'instant.",
"en": "Nothing to show yet.",
},
"(b = go back a step, t = show the migration state)": {
"fr": "(b = revenir à une étape précédente,"
" t = afficher l'état de la migration)",
"en": "(b = go back a step, t = show the migration state)",
},
"Migration state (full screen)": {
"fr": "État de la migration (plein écran)",
"en": "Migration state (full screen)",
},
"Export a backup?": {
"fr": "Exporter une sauvegarde ?",
"en": "Export a backup?",
},
"or type filename.zip": {
"fr": "ou tapez nomfichier.zip",
"en": "or type filename.zip",
},
"The login page itself failed": {
"fr": "La page de connexion elle-même a échoué",
"en": "The login page itself failed",
},
"No CSRF token on the login page": {
"fr": "Aucun jeton CSRF sur la page de connexion",
"en": "No CSRF token on the login page",
},
"after the reset": {
"fr": "après la réinitialisation",
"en": "after the reset",
},
"The differential detection found nothing; resetting": {
"fr": "La détection différentielle n'a rien trouvé ; réinitialisation",
"en": "The differential detection found nothing; resetting",
},
"the requested key(s) anyway.": {
"fr": "de la ou des clés demandées malgré tout.",
"en": "the requested key(s) anyway.",
},
"lines": {
"fr": "lignes",
"en": "lines",
},
"press l to show": {
"fr": "l pour afficher",
"en": "press l to show",
},
"last": {
"fr": "dernières",
"en": "last",
},
"Refresh": {
"fr": "Rafraîchir",
"en": "Refresh",
},
"Logs": {
"fr": "Journaux",
"en": "Logs",
},
"Panel": {
"fr": "Panneau",
"en": "Panel",
},
"Wider": {
"fr": "Élargir",
"en": "Wider",
},
"Narrower": {
"fr": "Rétrécir",
"en": "Narrower",
},
"finished": {
"fr": "terminée",
"en": "finished",
},
"duration": {
"fr": "durée",
"en": "duration",
},
"Panels": {
"fr": "Panneaux",
"en": "Panels",
},
"summary + list + detail": {
"fr": "résumé + liste + détail",
"en": "summary + list + detail",
},
"list + detail": {
"fr": "liste + détail",
"en": "list + detail",
},
"detail only": {
"fr": "détail seul",
"en": "detail only",
},
"errors in the log": {
"fr": "erreurs dans le journal",
"en": "errors in the log",
},
"Migration quality, step by step": {
"fr": "Qualité de la migration, palier par palier",
"en": "Migration quality, step by step",
},
"database not found": {
"fr": "base introuvable",
"en": "database not found",
},
"attachment files missing from the filestore": {
"fr": "fichiers de pièces jointes absents du filestore",
"en": "attachment files missing from the filestore",
},
"From start to finish": {
"fr": "Du départ à l'arrivée",
"en": "From start to finish",
},
"not comparable: a database is missing": {
"fr": "non comparable : une base manque",
"en": "not comparable: a database is missing",
},
"probable table rename(s)": {
"fr": "renommage(s) de table probable(s)",
"en": "probable table rename(s)",
},
"table(s) lost rows": {
"fr": "table(s) ont perdu des lignes",
"en": "table(s) lost rows",
},
"attachments": {
"fr": "pièces jointes",
"en": "attachments",
},
"probably renamed to": {
"fr": "probablement renommée en",
"en": "probably renamed to",
},
"steps": {
"fr": "paliers",
"en": "steps",
},
"Migration": {
"fr": "🚚 Migration",
"en": "🚚 Migration",
},
"Quality of a migration, step by step": {
"fr": "📐 Qualité d'une migration, palier par palier",
"en": "📐 Quality of a migration, step by step",
},
"Quality": {
"fr": "Qualité",
"en": "Quality",
},
"Already inside a running screen: open it in its own": {
"fr": "Déjà dans un écran en cours : l'ouvrir dans son propre",
"en": "Already inside a running screen: open it in its own",
},
"process instead.": {
"fr": "processus.",
"en": "process instead.",
},
"Missing files": {
"fr": "Fichiers absents",
"en": "Missing files",
},
"every attachment file is present": {
"fr": "tous les fichiers de pièces jointes sont présents",
"en": "every attachment file is present",
},
"Could not read their metadata.": {
"fr": "Impossible de lire leurs métadonnées.",
"en": "Could not read their metadata.",
},
"by model and field": {
"fr": "par modèle et par champ",
"en": "by model and field",
},
"one by one": {
"fr": "un par un",
"en": "one by one",
},
"press m to list them": {
"fr": "m pour en voir la liste",
"en": "press m to list them",
},
"Pick a step to see its missing files.": {
"fr": "Choisissez un palier pour voir ses fichiers absents.",
"en": "Pick a step to see its missing files.",
},
"table(s) lost rows, unexplained": {
"fr": "table(s) ont perdu des lignes, sans explication",
"en": "table(s) lost rows, unexplained",
},
"table(s) explained by an Odoo change": {
"fr": "table(s) expliquées par un changement d'Odoo",
"en": "table(s) explained by an Odoo change",
},
"Cannot read the database: ": {
"fr": "Lecture impossible de la base : ",
"en": "Cannot read the database: ",
},
"Cannot read the package file: ": {
"fr": "Lecture impossible du fichier de packages : ",
"en": "Cannot read the package file: ",
},
"Modules missing from the default package": {
"fr": "📦 Modules absents du package par défaut",
"en": "📦 Modules missing from the default package",
},
"Dependencies between modules": {
"fr": "🔗 Dépendances entre les modules",
"en": "🔗 Dependencies between modules",
},
"Website copies that can no longer render": {
"fr": "Copies de site qui ne savent plus se rendre",
"en": "Website copies that can no longer render",
},
"Every website copy still renders.": {
"fr": "Chaque copie de site sait encore se rendre.",
"en": "Every website copy still renders.",
},
"No duplicate index.": {
"fr": "Aucun index en double.",
"en": "No duplicate index.",
},
"attachments of fields and records already gone": {
"fr": "pièces jointes de champs et d'enregistrements déjà disparus",
"en": "attachments of fields and records already gone",
},
"their field was already gone before this step": {
"fr": "leur champ porteur avait déjà disparu avant ce palier",
"en": "their field was already gone before this step",
},
"their field was removed at this step": {
"fr": "leur champ porteur a été retiré à ce palier",
"en": "their field was removed at this step",
},
"their model left the database": {
"fr": "leur modèle a quitté la base",
"en": "their model left the database",
},
"the field is STILL there — look at these": {
"fr": "le champ est TOUJOURS là — à regarder",
"en": "the field is STILL there — look at these",
},
"out of": {
"fr": "sur",
"en": "out of",
},
"Every witness is an administrator: a model only": {
"fr": "Tous les témoins sont administrateurs : un modèle que seuls les",
"en": "Every witness is an administrator: a model only",
},
"admins can read passes this test.": {
"fr": "administrateurs peuvent lire passe ce test.",
"en": "admins can read passes this test.",
},
"Reads ir_rule only — masking coded in Python escapes it.": {
"fr": "Ne lit qu'ir_rule — un masquage codé en Python lui échappe.",
"en": "Reads ir_rule only — masking coded in Python escapes it.",
},
"held no data of their own — nothing to lose": {
"fr": "sans donnée propre — rien à perdre",
"en": "held no data of their own — nothing to lose",
},
"Configuration records a migration never recreates": {
"fr": "Réglages qu'une migration ne recrée jamais",
"en": "Configuration records a migration never recreates",
},
"Every default configuration record is there.": {
"fr": "Chaque réglage par défaut est en place.",
"en": "Every default configuration record is there.",
},
"No pricelist, and the pricelist feature is on.": {
"fr": "Aucune liste de prix, alors que la fonctionnalité est active.",
"en": "No pricelist, and the pricelist feature is on.",
},
"Every quotation opens without one: raw price, no rule.": {
"fr": "Tout devis s'ouvre sans liste : prix brut, aucune règle.",
"en": "Every quotation opens without one: raw price, no rule.",
},
"No bank reconciliation model, for": {
"fr": "Aucun modèle de rapprochement bancaire, pour",
"en": "No bank reconciliation model, for",
},
"cash/bank journal(s).": {
"fr": "journal(aux) de trésorerie.",
"en": "cash/bank journal(s).",
},
"Every statement line is matched by hand.": {
"fr": "Chaque ligne de relevé se lettre à la main.",
"en": "Every statement line is matched by hand.",
},
"Use --apply to let Odoo recreate them.": {
"fr": "Utiliser --apply pour laisser Odoo les recréer.",
"en": "Use --apply to let Odoo recreate them.",
},
"pricelists:": {
"fr": "listes de prix :",
"en": "pricelists:",
},
"reconcile models:": {
"fr": "modèles de rapprochement :",
"en": "reconcile models:",
},
"Odoo recreated them.": {
"fr": "Odoo les a recréés.",
"en": "Odoo recreated them.",
},
"Still missing after the repair.": {
"fr": "Il en manque encore après la réparation :",
"en": "Still missing after the repair.",
},
"duplicate index pair(s)": {
"fr": "paire(s) d'index en double",
"en": "duplicate index pair(s)",
},
"safe to drop": {
"fr": "sans risque à supprimer",
"en": "safe to drop",
},
"drop": {
"fr": "supprimer",
"en": "drop",
},
"backed by a constraint — left alone": {
"fr": "adossée(s) à une contrainte — laissée(s) en place",
"en": "backed by a constraint — left alone",
},
"neither name follows the convention — your call": {
"fr": "sans convention reconnaissable — à vous de juger",
"en": "neither name follows the convention — your call",
},
"Use --apply to drop them.": {
"fr": "Utiliser --apply pour les supprimer.",
"en": "Use --apply to drop them.",
},
"Duplicate indexes dropped.": {
"fr": "Index en double supprimés.",
"en": "Duplicate indexes dropped.",
},
"Some duplicates are still there.": {
"fr": "Des doublons subsistent.",
"en": "Some duplicates are still there.",
},
"website COW view(s) will survive the bump and then fail": {
"fr": "vue(s) COW de site passeront le palier puis échoueront",
"en": "website COW view(s) will survive the bump and then fail",
},
"to render:": {
"fr": "à se rendre :",
"en": "to render:",
},
"Repair rather than neutralize — the copy holds a page": {
"fr": "Réparer plutôt que neutraliser — la copie porte une page",
"en": "Repair rather than neutralize — the copy holds a page",
},
"someone wrote:": {
"fr": "écrite par quelqu'un :",
"en": "someone wrote:",
},
"Every website copy renders again.": {
"fr": "Chaque copie de site sait de nouveau se rendre.",
"en": "Every website copy renders again.",
},
"Some copies still cannot render.": {
"fr": "Des copies ne savent toujours pas se rendre.",
"en": "Some copies still cannot render.",
},
"anchor missing for view": {
"fr": "ancrage absent pour la vue",
"en": "anchor missing for view",
},
"calls a template that is gone:": {
"fr": "appelle un gabarit disparu :",
"en": "calls a template that is gone:",
},
"repair(s) available with --apply": {
"fr": "réparation(s) possible(s) avec --apply",
"en": "repair(s) available with --apply",
},
"cannot be repaired automatically": {
"fr": "ne se réparent pas toutes seules",
"en": "cannot be repaired automatically",
},
"Removing a call removes its block from the page.": {
"fr": "Retirer un appel retire son bloc de la page.",
"en": "Removing a call removes its block from the page.",
},
"modules installed": {
"fr": "modules installés",
"en": "modules installed",
},
"of them installed": {
"fr": "installé(s)",
"en": "of them installed",
},
"nothing installed depends on it": {
"fr": "rien d'installé n'en dépend",
"en": "nothing installed depends on it",
},
"Reading the modules and their dependencies…": {
"fr": "Lecture des modules et de leurs dépendances…",
"en": "Reading the modules and their dependencies…",
},
"Modules and their dependencies": {
"fr": "Modules et leurs dépendances",
"en": "Modules and their dependencies",
},
"unknown to this database": {
"fr": "inconnu de cette base",
"en": "unknown to this database",
},
"state": {
"fr": "état",
"en": "state",
},
"author": {
"fr": "auteur",
"en": "author",
},
"application": {
"fr": "application",
"en": "application",
},
"yes": {
"fr": "oui",
"en": "yes",
},
"depends on": {
"fr": "dépend de",
"en": "depends on",
},
"needed by": {
"fr": "requis par",
"en": "needed by",
},
"absent": {
"fr": "absent",
"en": "absent",
},
"press d to walk the dependencies": {
"fr": "appuyez sur d pour parcourir les dépendances",
"en": "press d to walk the dependencies",
},
"installed on missing dependencies": {
"fr": "installé sur des dépendances absentes",
"en": "installed on missing dependencies",
},
"broken dependency(ies)": {
"fr": "dépendance(s) cassée(s)",
"en": "broken dependency(ies)",
},
"What it needs, directly": {
"fr": "Ce dont il a besoin, directement",
"en": "What it needs, directly",
},
"What needs it, directly": {
"fr": "Ce qui en a besoin, directement",
"en": "What needs it, directly",
},
"Everything it pulls in": {
"fr": "Tout ce qu'il entraîne",
"en": "Everything it pulls in",
},
"Everything that falls with it": {
"fr": "Tout ce qui tombe avec lui",
"en": "Everything that falls with it",
},
"all modules": {
"fr": "tous les modules",
"en": "all modules",
},
"installed only": {
"fr": "installés seulement",
"en": "installed only",
},
"not installed": {
"fr": "non installés",
"en": "not installed",
},
"broken dependencies": {
"fr": "dépendances cassées",
"en": "broken dependencies",
},
"in progress": {
"fr": "en cours",
"en": "in progress",
},
"apps only": {
"fr": "applications seulement",
"en": "apps only",
},
"left in a transient state": {
"fr": "laissés dans un état de passage",
"en": "left in a transient state",
},
"Installed": {
"fr": "Installés",
"en": "Installed",
},
"In progress": {
"fr": "En cours",
"en": "In progress",
},
"Apps": {
"fr": "Applications",
"en": "Apps",
},
"Dependencies": {
"fr": "Dépendances",
"en": "Dependencies",
},
"Filter": {
"fr": "Filtre",
"en": "Filter",
},
"Search": {
"fr": "Chercher",
"en": "Search",
},
"module": {
"fr": "module",
"en": "module",
},
"module name…": {
"fr": "nom de module…",
"en": "module name…",
},
"Show every entry": {
"fr": "📜 Tout afficher",
"en": "📜 Show every entry",
},
"List the known packages": {
"fr": "📚 Lister les packages connus",
"en": "📚 List the known packages",
},
"Already repaired: the group exists.": {
"fr": "Déjà réparé : le groupe existe.",
"en": "Already repaired: the group exists.",
},
"DMS access groups:": {
"fr": "Groupes d'accès DMS :",
"en": "DMS access groups:",
},
"DMS documents in the database": {
"fr": "Documents DMS dans la base",
"en": "DMS documents in the database",
},
"No DMS user to test visibility with.": {
"fr": "Aucun utilisateur DMS pour éprouver la visibilité.",
"en": "No DMS user to test visibility with.",
},
"Nothing written. Re-run with --apply.": {
"fr": "Rien d'écrit. Relancer avec --apply.",
"en": "Nothing written. Re-run with --apply.",
},
"Now visible to": {
"fr": "Désormais visibles pour",
"en": "Now visible to",
},
"Visible to": {
"fr": "Visibles pour",
"en": "Visible to",
},
"Would create one access group over": {
"fr": "Créerait un groupe d'accès sur",
"en": "Would create one access group over",
},
"file(s)": {
"fr": "fichier(s)",
"en": "file(s)",
},
"folder(s)": {
"fr": "dossier(s)",
"en": "folder(s)",
},
"root folder(s)": {
"fr": "dossier(s) racine",
"en": "root folder(s)",
},
"No DMS in this database, nothing to repair.": {
"fr": "Pas de DMS dans cette base, rien à réparer.",
"en": "No DMS in this database, nothing to repair.",
},
"Every one of them is visible to someone.": {
"fr": "Chacun est visible par quelqu'un.",
"en": "Every one of them is visible to someone.",
},
"No internal user to test visibility with.": {
"fr": "Aucun utilisateur interne pour éprouver la visibilité.",
"en": "No internal user to test visibility with.",
},
"The data is there; a global rule hides all of it.": {
"fr": "Les données sont là ; une règle globale les masque entièrement.",
"en": "The data is there; a global rule hides all of it.",
},
"checked against": {
"fr": "éprouvés avec",
"en": "checked against",
},
"internal user(s)": {
"fr": "utilisateur(s) interne(s)",
"en": "internal user(s)",
},
"model(s) nobody can see a single row of": {
"fr": "modèle(s) dont personne ne voit une seule ligne",
"en": "model(s) nobody can see a single row of",
},
"model(s) with a global rule and some data,": {
"fr": "modèle(s) avec une règle globale et des données,",
"en": "model(s) with a global rule and some data,",
},
"row(s)": {
"fr": "ligne(s)",
"en": "row(s)",
},
"Against OpenUpgrade": {
"fr": "Face à OpenUpgrade",
"en": "Against OpenUpgrade",
},
"NOT declared by OpenUpgrade": {
"fr": "NON déclarés par OpenUpgrade",
"en": "NOT declared by OpenUpgrade",
},
"No OpenUpgrade analysis for this step.": {
"fr": "Pas d'analyse OpenUpgrade pour ce palier.",
"en": "No OpenUpgrade analysis for this step.",
},
"became a per-company jsonb column": {
"fr": "passés en colonne jsonb par société",
"en": "became a per-company jsonb column",
},
"computed now — the field remains, the column does not": {
"fr": "devenus calculés — le champ demeure, la colonne non",
"en": "computed now — the field remains, the column does not",
},
"core module(s) analysed": {
"fr": "module(s) cœur analysé(s)",
"en": "core module(s) analysed",
},
"declared obsolete": {
"fr": "déclarés obsolètes",
"en": "declared obsolete",
},
"declared removed": {
"fr": "déclarés supprimés",
"en": "declared removed",
},
"field(s) lost": {
"fr": "champ(s) perdu(s)",
"en": "field(s) lost",
},
"model(s) lost": {
"fr": "modèle(s) perdu(s)",
"en": "model(s) lost",
},
"moved to another module": {
"fr": "déplacés vers un autre module",
"en": "moved to another module",
},
"renamed by Odoo": {
"fr": "renommés par Odoo",
"en": "renamed by Odoo",
},
"their model went away too": {
"fr": "leur modèle a disparu aussi",
"en": "their model went away too",
},
"in a module OpenUpgrade does not analyse": {
"fr": "dans un module qu'OpenUpgrade n'analyse pas",
"en": "in a module OpenUpgrade does not analyse",
},
"model(s)": {
"fr": "modèle(s)",
"en": "model(s)",
},
"other field name(s)": {
"fr": "autre(s) nom(s) de champ",
"en": "other field name(s)",
},
"Filestore of": {
"fr": "Filestore de",
"en": "Filestore of",
},
"file(s) missing": {
"fr": "fichier(s) absent(s)",
"en": "file(s) missing",
},
"file(s) on disk": {
"fr": "fichier(s) sur disque",
"en": "file(s) on disk",
},
"file(s) sit in nested filestores Odoo never reads.": {
"fr": "fichier(s) échoué(s) dans des filestores imbriqués qu'Odoo ne lit jamais.",
"en": "file(s) sit in nested filestores Odoo never reads.",
},
"intact in another database's filestore": {
"fr": "intacts dans le filestore d'une autre base",
"en": "intact in another database's filestore",
},
"its field no longer exists — nothing reads it": {
"fr": "leur champ n'existe plus — rien ne les lit",
"en": "its field no longer exists — nothing reads it",
},
"nowhere to be found — truly lost": {
"fr": "introuvables — réellement perdus",
"en": "nowhere to be found — truly lost",
},
"still in a backup zip": {
"fr": "encore dans une sauvegarde zip",
"en": "still in a backup zip",
},
"stored attachment(s)": {
"fr": "pièce(s) jointe(s) stockée(s)",
"en": "stored attachment(s)",
},
"stranded in a nested filestore Odoo never reads": {
"fr": "échoués dans un filestore imbriqué qu'Odoo ne lit pas",
"en": "stranded in a nested filestore Odoo never reads",
},
"Files": {
"fr": "Fichiers",
"en": "Files",
},
"Attachment files missing from the filestore": {
"fr": "🗄 Fichiers de pièces jointes absents du filestore",
"en": "🗄 Attachment files missing from the filestore",
},
"Scanning filestores and backups…": {
"fr": "Examen des filestores et des sauvegardes…",
"en": "Scanning filestores and backups…",
},
"Filestore restored:": {
"fr": "Filestore restauré :",
"en": "Filestore restored:",
},
"file(s) in place": {
"fr": "fichier(s) en place",
"en": "file(s) in place",
},
"Filestore restore looks wrong for": {
"fr": "Restauration du filestore suspecte pour",
"en": "Filestore restore looks wrong for",
},
"landed in a nested filestore Odoo never reads": {
"fr": "atterris dans un filestore imbriqué qu'Odoo ne lit jamais",
"en": "landed in a nested filestore Odoo never reads",
},
"To fix:": {
"fr": "Pour corriger :",
"en": "To fix:",
},
"never landed at all": {
"fr": "ne sont arrivés nulle part",
"en": "never landed at all",
},
"record still exists": {
"fr": "l'enregistrement existe encore",
"en": "record still exists",
},
"record is gone — nothing will miss it": {
"fr": "l'enregistrement a disparu — personne ne la cherchera",
"en": "record is gone — nothing will miss it",
},
"Delete these": {
"fr": "Supprimer ces",
"en": "Delete these",
},
"Directory:": {
"fr": "Dossier :",
"en": "Directory:",
},
"No nested filestore to tidy.": {
"fr": "Pas de filestore imbriqué à ranger.",
"en": "No nested filestore to tidy.",
},
"Nothing to purge.": {
"fr": "Rien à purger.",
"en": "Nothing to purge.",
},
"Nothing was deleted.": {
"fr": "Rien n'a été supprimé.",
"en": "Nothing was deleted.",
},
"Nothing was moved.": {
"fr": "Rien n'a été déplacé.",
"en": "Nothing was moved.",
},
"The purge failed.": {
"fr": "La purge a échoué.",
"en": "The purge failed.",
},
"attachment row(s) deleted.": {
"fr": "ligne(s) de pièce jointe supprimée(s).",
"en": "attachment row(s) deleted.",
},
"attachment row(s) for good?": {
"fr": "ligne(s) de pièce jointe, définitivement ?",
"en": "attachment row(s) for good?",
},
"duplicate(s) removed": {
"fr": "doublon(s) supprimé(s)",
"en": "duplicate(s) removed",
},
"file(s) to move up": {
"fr": "fichier(s) à remonter",
"en": "file(s) to move up",
},
"moved up": {
"fr": "remonté(s)",
"en": "moved up",
},
"pure duplicate(s) to delete": {
"fr": "doublon(s) pur(s) à supprimer",
"en": "pure duplicate(s) to delete",
},
"🧹 Purge attachments whose field no longer exists": {
"fr": "🧹 Purger les pièces jointes dont le champ n'existe plus",
"en": "🧹 Purge attachments whose field no longer exists",
},
"🧹 Tidy the nested filestore Odoo never reads": {
"fr": "🧹 Ranger le filestore imbriqué qu'Odoo ne lit pas",
"en": "🧹 Tidy the nested filestore Odoo never reads",
},
"The purge ran but said nothing.": {
"fr": "La purge a tourné sans rien annoncer.",
"en": "The purge ran but said nothing.",
},
"row(s) whose field is gone still hold their file": {
"fr": "ligne(s) à champ disparu retiennent encore leur fichier",
"en": "row(s) whose field is gone still hold their file",
},
"file(s) sit in a nested filestore Odoo never reads.": {
"fr": "fichier(s) échoué(s) dans un filestore imbriqué qu'Odoo ne lit jamais.",
"en": "file(s) sit in a nested filestore Odoo never reads.",
},
"such file(s) sit in OTHER databases filestores.": {
"fr": "fichier(s) de ce genre dorment dans les filestores d'AUTRES bases.",
"en": "such file(s) sit in OTHER databases filestores.",
},
"Could not inspect the attachments: ": {
"fr": "Inspection des pièces jointes impossible : ",
"en": "Could not inspect the attachments: ",
},
"Delete them?": {
"fr": "Les supprimer ?",
"en": "Delete them?",
},
"No attachment points at a field that is gone.": {
"fr": "Aucune pièce jointe ne pointe vers un champ disparu.",
"en": "No attachment points at a field that is gone.",
},
"attachment(s) point at a field that no longer exists": {
"fr": "pièce(s) jointe(s) pointent vers un champ qui n'existe plus",
"en": "attachment(s) point at a field that no longer exists",
},
"Corrected.": {
"fr": "Corrigé.",
"en": "Corrected.",
},
"No module update will fix this: the type is set once,": {
"fr": "Aucune mise à jour de module ne corrigera cela : le type est posé une fois,",
"en": "No module update will fix this: the type is set once,",
},
"The correction failed.": {
"fr": "La correction a échoué.",
"en": "The correction failed.",
},
"at creation. Re-run with --apply.": {
"fr": "à la création. Relancer avec --apply.",
"en": "at creation. Re-run with --apply.",
},
"their inheritance": {
"fr": "leur héritage",
"en": "their inheritance",
},
"view(s) whose stored type contradicts": {
"fr": "vue(s) dont le type stocké contredit",
"en": "view(s) whose stored type contradicts",
},
"Fix views whose type contradicts their": {
"fr": "Corriger les vues dont le type contredit leur",
"en": "Fix views whose type contradicts their",
},
"inheritance": {
"fr": "héritage",
"en": "inheritance",
},
"Correct them?": {
"fr": "Les corriger ?",
"en": "Correct them?",
},
"Uninstall the theme(s) the error names": {
"fr": "Désinstaller le(s) thème(s) que l'erreur nomme",
"en": "Uninstall the theme(s) the error names",
},
"Every view agrees with what Odoo expects.": {
"fr": "Toutes les vues s'accordent avec ce qu'Odoo attend.",
"en": "Every view agrees with what Odoo expects.",
},
"custom — nothing will ever rewrite it": {
"fr": "faite main — rien ne la réécrira jamais",
"en": "custom — nothing will ever rewrite it",
},
"from a module — a module update also fixes it": {
"fr": "d'un module — une mise à jour la répare aussi",
"en": "from a module — a module update also fixes it",
},
"renamed to <list>": {
"fr": "a renommée en <list>",
"en": "renamed to <list>",
},
"view(s) still carry a <tree> tag Odoo 18": {
"fr": "vue(s) portent encore une balise <tree> qu'Odoo 18",
"en": "view(s) still carry a <tree> tag Odoo 18",
},
"failed at": {
"fr": "a échoué sur",
"en": "failed at",
},
"Census": {
"fr": "Recensement",
"en": "Census",
},
"Compared against nothing — census only.": {
"fr": "Comparé à rien — recensement seul.",
"en": "Compared against nothing — census only.",
},
"Default package:": {
"fr": "Package par défaut :",
"en": "Default package:",
},
"Every suggested module is installed.": {
"fr": "Tous les modules suggérés sont installés.",
"en": "Every suggested module is installed.",
},
"Installed modules by author": {
"fr": "Modules installés, par auteur",
"en": "Installed modules by author",
},
"Modules of": {
"fr": "Modules de",
"en": "Modules of",
},
"No default package known for this version": {
"fr": "Aucun package par défaut connu pour cette version",
"en": "No default package known for this version",
},
"Odoo": {
"fr": "Odoo",
"en": "Odoo",
},
"absent from the addons path — sync the repo first": {
"fr": "hors du chemin des addons — synchroniser le dépôt d'abord",
"en": "absent from the addons path — sync the repo first",
},
"also needs": {
"fr": "réclame aussi",
"en": "also needs",
},
"half-way — finish the pending update": {
"fr": "à mi-chemin — finir la mise à jour en attente",
"en": "half-way — finish the pending update",
},
"installed": {
"fr": "déjà en place",
"en": "installed",
},
"known": {
"fr": "connus",
"en": "known",
},
"known to the database — install it": {
"fr": "dans la base — à installer",
"en": "known to the database — install it",
},
"present but broken — fix the dependency": {
"fr": "en panne de dépendance — à réparer",
"en": "present but broken — fix the dependency",
},
"suggested module(s)": {
"fr": "module(s) suggéré(s)",
"en": "suggested module(s)",
},
"suggested module(s) not installed": {
"fr": "module(s) suggéré(s) non installé(s)",
"en": "suggested module(s) not installed",
},
"unknown author": {
"fr": "auteur inconnu",
"en": "unknown author",
},
"rows dropped, the table remains": {
"fr": "lignes supprimées, la table demeure",
"en": "rows dropped, the table remains",
},
"retired from the database": {
"fr": "retirée de la base",
"en": "retired from the database",
},
"but it gained nothing": {
"fr": "mais elle n'a rien reçu",
"en": "but it gained nothing",
},
"there": {
"fr": "là-bas",
"en": "there",
},
"lost": {
"fr": "perdus",
"en": "lost",
},
"gained": {
"fr": "gagnés",
"en": "gained",
},
"fields": {
"fr": "champs",
"en": "fields",
},
"cow": {
"fr": "copies COW",
"en": "cow",
},
"tables": {
"fr": "tables",
"en": "tables",
},
"Details": {
"fr": "Détails",
"en": "Details",
},
"summary": {
"fr": "résumé",
"en": "summary",
},
"Clean the database before testing the pages?": {
"fr": "Nettoyer la base avant de tester les pages ?",
"en": "Clean the database before testing the pages?",
},
"Auto-run: take the default answer after": {
"fr": "Auto-exécution : prendre la réponse par défaut après",
"en": "Auto-run: take the default answer after",
},
"seconds?": {
"fr": "secondes ?",
"en": "seconds?",
},
"Auto-run on: each prompt waits": {
"fr": "Auto-exécution activée : chaque invite attend",
"en": "Auto-run on: each prompt waits",
},
"seconds, then takes its default.": {
"fr": "secondes, puis prend son défaut.",
"en": "seconds, then takes its default.",
},
"(default)": {
"fr": "(défaut)",
"en": "(default)",
},
"database_cleanup is not installed on this base;": {
"fr": "database_cleanup n'est pas installé sur cette base ;",
"en": "database_cleanup is not installed on this base;",
},
"installing it first.": {
"fr": "installation préalable.",
"en": "installing it first.",
},
"Could not install database_cleanup.": {
"fr": "Impossible d'installer database_cleanup.",
"en": "Could not install database_cleanup.",
},
"Nothing to decide yet": {
"fr": "Rien à décider pour l'instant",
"en": "Nothing to decide yet",
},
"the migration will offer to neutralize these copies": {
"fr": "la migration proposera de neutraliser ces copies",
"en": "the migration will offer to neutralize these copies",
},
"at the version bump itself, showing what each one holds.": {
"fr": "au moment du palier lui-même, en montrant ce que chacune"
" contient.",
"en": "at the version bump itself, showing what each one holds.",
},
"Press to continue": {
"fr": "Appuyez pour continuer",
"en": "Press to continue",
},
"(b = go back to a previous step)": {
"fr": "(b = revenir à une étape précédente)",
"en": "(b = go back to a previous step)",
},
"Neutralize database, press to continue": {
"fr": "Neutraliser la base, appuyez pour continuer",
"en": "Neutralize database, press to continue",
},
"Replay from which step? (empty to cancel)": {
"fr": "Rejouer à partir de quelle étape ? (vide pour annuler)",
"en": "Replay from which step? (empty to cancel)",
},
"Rewound.": {"fr": "Rembobiné.", "en": "Rewound."},
"Relaunch the migration to resume from there.": {
"fr": "Relancez la migration pour reprendre à partir de là.",
"en": "Relaunch the migration to resume from there.",
},
"Go back to a step": {
"fr": "Revenir à une étape",
"en": "Go back to a step",
},
"Choose a step, Enter replays from there.": {
"fr": "Choisissez une étape, Entrée rejoue à partir de là.",
"en": "Choose a step, Enter replays from there.",
},
# --- script/analyse : vues personnalisées ---
"Customised views": {
"fr": "Vues personnalisées",
"en": "Customised views",
},
"Views": {"fr": "Vues", "en": "Views"},
"why": {"fr": "pourquoi", "en": "why"},
"more": {"fr": "de plus", "en": "more"},
"From an installed theme": {
"fr": "Posée par un thème installé",
"en": "From an installed theme",
},
"Website copy (COW)": {
"fr": "Copie de site web (COW)",
"en": "Website copy (COW)",
},
"Made with Studio": {"fr": "Faite avec Studio", "en": "Made with Studio"},
"Imported or exported": {
"fr": "Importée ou exportée",
"en": "Imported or exported",
},
"Created from the interface": {
"fr": "Créée depuis l'interface",
"en": "Created from the interface",
},
"From a module, flagged as touched": {
"fr": "D'un module, signalée comme retouchée",
"en": "From a module, flagged as touched",
},
"Straight from a module": {
"fr": "Telle quelle depuis un module",
"en": "Straight from a module",
},
"Every view comes straight from a module.": {
"fr": "Toutes les vues viennent telles quelles d'un module.",
"en": "Every view comes straight from a module.",
},
"Views that did not come straight from a module": {
"fr": "Vues qui ne viennent pas telles quelles d'un module",
"en": "Views that did not come straight from a module",
},
"Website copies are user data: Odoo copies a view instead of editing it."
" Whether they will survive the next version is another question, and"
" these tools answer it:": {
"fr": "Les copies de site web sont des données utilisateur : Odoo"
" copie une vue au lieu de la modifier. Savoir si elles survivront à"
" la prochaine version est une autre question, et ces outils y"
" répondent :",
"en": "Website copies are user data: Odoo copies a view instead of"
" editing it. Whether they will survive the next version is another"
" question, and these tools answer it:",
},
"Flags say a view was touched, not how. They are incomplete both ways: a"
" direct SQL write does not set arch_updated, and reset_arch clears it."
" Comparing with the module source is what settles it.": {
"fr": "Les drapeaux disent qu'une vue a été touchée, pas comment. Ils"
" sont incomplets dans les deux sens : un write SQL direct n'arme pas"
" arch_updated, et reset_arch l'efface. Seule la comparaison avec la"
" source du module tranche.",
"en": "Flags say a view was touched, not how. They are incomplete"
" both ways: a direct SQL write does not set arch_updated, and"
" reset_arch clears it. Comparing with the module source is what"
" settles it.",
},
"List the views of an Odoo database that did not come straight from a"
" module, website copies included (read-only).": {
"fr": "Lister les vues d'une base Odoo qui ne viennent pas telles"
" quelles d'un module, copies de site web comprises (lecture seule).",
"en": "List the views of an Odoo database that did not come straight"
" from a module, website copies included (read-only).",
},
"only show this category": {
"fr": "n'afficher que cette catégorie",
"en": "only show this category",
},
"how many views to show (default: 20)": {
"fr": "nombre de vues à afficher (défaut : 20)",
"en": "how many views to show (default: 20)",
},
"list every view": {
"fr": "afficher toutes les vues",
"en": "list every view",
},
"which views to compare (default: flagged)": {
"fr": "quelles vues comparer (défaut : celles qui sont signalées)",
"en": "which views to compare (default: flagged)",
},
"From a module, silently drifted": {
"fr": "D'un module, dérivée en silence",
"en": "From a module, silently drifted",
},
"In --scope all, a difference is a lead, not a verdict:"
" read_arch_from_file returns the raw file, while the database holds the"
" arch AFTER load-time processing. Measured on a freshly installed 18.0"
" database, 160 of its 974 views already differ this way.": {
"fr": "En --scope all, un écart est une piste, pas un verdict :"
" read_arch_from_file rend le fichier brut, alors que la base porte"
" l'arch APRÈS traitement au chargement. Mesuré sur une base 18.0"
" fraîchement installée, 160 de ses 974 vues diffèrent déjà ainsi.",
"en": "In --scope all, a difference is a lead, not a verdict:"
" read_arch_from_file returns the raw file, while the database holds"
" the arch AFTER load-time processing. Measured on a freshly installed"
" 18.0 database, 160 of its 974 views already differ this way.",
},
"Compare with the module source? (Y/n): ": {
"fr": "Comparer avec la source du module ? (O/n) : ",
"en": "Compare with the module source? (Y/n): ",
},
# --- Menu Analyse : les actions « aller plus loin ». Ce qui était
# conseillé en options de ligne de commande est devenu des entrées :
# dire « utilisez -v » à quelqu'un qui est dans un menu, c'est lui
# demander d'en sortir pour obtenir ce que le menu pouvait offrir.
"Browse the differences (TUI)": {
"fr": "🖥 Naviguer dans les écarts (plein écran)",
"en": "🖥 Browse the differences (TUI)",
},
"Compare every view (slower, noisier)": {
"fr": "🔬 Comparer toutes les vues (plus long, plus bruyant)",
"en": "🔬 Compare every view (slower, noisier)",
},
"Compare first, then browse.": {
"fr": "Comparez d'abord, vous naviguerez ensuite.",
"en": "Compare first, then browse.",
},
"Compare the flagged views with the module source": {
"fr": "🔍 Comparer les vues signalées avec la source du module",
"en": "🔍 Compare the flagged views with the module source",
},
"Count rows exactly (full scan)": {
"fr": "🔢 Compter les lignes exactement (balayage complet)",
"en": "🔢 Count rows exactly (full scan)",
},
"Counting rows exactly, one scan per table…": {
"fr": "Comptage exact des lignes, un balayage par table…",
"en": "Counting rows exactly, one scan per table…",
},
"Export as JSON": {"fr": "💾 Exporter en JSON", "en": "💾 Export as JSON"},
"Go further": {"fr": "🔎 Aller plus loin", "en": "🔎 Go further"},
"Loading the Odoo registry, this takes a moment…": {
"fr": "Chargement du registre Odoo, cela prend un moment…",
"en": "Loading the Odoo registry, this takes a moment…",
},
"No view differs from its module source.": {
"fr": "Aucune vue ne diffère de la source de son module.",
"en": "No view differs from its module source.",
},
"Show every table": {
"fr": "📜 Afficher toutes les tables",
"en": "📜 Show every table",
},
"Show every view": {
"fr": "📜 Afficher toutes les vues",
"en": "📜 Show every view",
},
"Written to: ": {"fr": "Écrit dans : ", "en": "Written to: "},
"Flags say a view was touched, not how: only comparing with the module"
" source settles it.": {
"fr": "Les drapeaux disent qu'une vue a été touchée, pas comment :"
" seule la comparaison avec la source du module tranche.",
"en": "Flags say a view was touched, not how: only comparing with the"
" module source settles it.",
},
"blocking": {"fr": "bloquants", "en": "blocking"},
"Studio and hand-made x_ fields": {
"fr": "🧩 Champs x_ (Studio et faits à la main)",
"en": "🧩 Studio and hand-made x_ fields",
},
"Show every field": {
"fr": "📜 Afficher tous les champs",
"en": "📜 Show every field",
},
"A database": {"fr": "💾 Une base de données", "en": "💾 A database"},
"A backup .zip, without restoring it": {
"fr": "🗜 Une sauvegarde .zip, sans la restaurer",
"en": "🗜 A backup .zip, without restoring it",
},
"Path to the backup .zip (empty to cancel): ": {
"fr": "Chemin de la sauvegarde .zip (vide pour annuler) : ",
"en": "Path to the backup .zip (empty to cancel): ",
},
"No such file: ": {"fr": "Fichier introuvable : ", "en": "No such file: "},
"from a backup": {"fr": "depuis une sauvegarde", "en": "from a backup"},
"Odoo backup .zip to inspect, without restoring it": {
"fr": "sauvegarde Odoo .zip à examiner, sans la restaurer",
"en": "Odoo backup .zip to inspect, without restoring it",
},
"Not an Odoo backup (no manifest.json): ": {
"fr": "Pas une sauvegarde Odoo (aucun manifest.json) : ",
"en": "Not an Odoo backup (no manifest.json): ",
},
"Cannot read the backup: ": {
"fr": "Lecture impossible de la sauvegarde : ",
"en": "Cannot read the backup: ",
},
"This backup holds no dump.sql: ": {
"fr": "Cette sauvegarde ne contient aucun dump.sql : ",
"en": "This backup holds no dump.sql: ",
},
# --- script/analyse : champs et modèles hors module ---
"Nothing declares these in a file, so no module will "
"recreate them. What a version upgrade keeps is what "
"someone carried over.": {
"fr": "Rien ne les déclare dans un fichier, donc aucun module "
"ne les recréera. Ce qu'une montée de version conserve "
"est ce que quelqu'un a reporté.",
"en": "Nothing declares these in a file, so no module will "
"recreate them. What a version upgrade keeps is what "
"someone carried over.",
},
"A stored field without its column stops the registry "
"from loading, so the upgrade will not even start. Settle "
"these before anything else.": {
"fr": "Un champ stocké sans sa colonne empêche le registre de "
"charger, donc la montée de version ne démarrera même "
"pas. Réglez cela avant tout le reste.",
"en": "A stored field without its column stops the registry "
"from loading, so the upgrade will not even start. Settle "
"these before anything else.",
},
"Use -v to list them all, --json for the raw data.": {
"fr": "Utilisez -v pour tout afficher, --json pour la donnée "
"brute.",
"en": "Use -v to list them all, --json for the raw data.",
},
"List the fields and models added outside a module — "
"Studio or by hand (read-only).": {
"fr": "Lister les champs et modèles ajoutés hors module — "
"Studio ou faits à la main (lecture seule).",
"en": "List the fields and models added outside a module — "
"Studio or by hand (read-only).",
},
"how many to show (default: 30)": {
"fr": "nombre à afficher (défaut : 30)",
"en": "how many to show (default: 30)",
},
"list every one": {"fr": "tout afficher", "en": "list every one"},
"Studio": {"fr": "Studio", "en": "Studio"},
"Made by hand": {"fr": "Fait à la main", "en": "Made by hand"},
"Declared by a module": {
"fr": "Déclaré par un module",
"en": "Declared by a module",
},
"stored, but its column is missing": {
"fr": "stocké, mais sa colonne manque",
"en": "stored, but its column is missing",
},
"points at a model that no longer exists": {
"fr": "pointe vers un modèle qui n'existe plus",
"en": "points at a model that no longer exists",
},
"its model no longer exists": {
"fr": "son modèle n'existe plus",
"en": "its model no longer exists",
},
"its table could not be resolved": {
"fr": "sa table n'a pas pu être résolue",
"en": "its table could not be resolved",
},
"origin": {"fr": "provenance", "en": "origin"},
"Fields added outside a module": {
"fr": "Champs ajoutés hors module",
"en": "Fields added outside a module",
},
"Custom fields": {"fr": "Champs personnalisés", "en": "Custom fields"},
"Custom models": {"fr": "Modèles personnalisés", "en": "Custom models"},
"No field or model was added outside a module.": {
"fr": "Aucun champ ni modèle n'a été ajouté hors module.",
"en": "No field or model was added outside a module.",
},
"Blocking": {"fr": "Bloquant", "en": "Blocking"},
"To carry over by hand": {
"fr": "À reporter à la main",
"en": "To carry over by hand",
},
# --- script/analyse : comparaison et navigation des écarts ---
"Differences only": {
"fr": "Écarts seuls",
"en": "Differences only",
},
"Ignore indentation": {
"fr": "Ignorer l'indentation",
"en": "Ignore indentation",
},
"Copy": {
"fr": "Copier",
"en": "Copy",
},
"Reset command": {
"fr": "Commande de réinitialisation",
"en": "Reset command",
},
"module (file)": {
"fr": "module (fichier)",
"en": "module (file)",
},
"database": {
"fr": "base",
"en": "database",
},
"Difference copied.": {
"fr": "Écart copié.",
"en": "Difference copied.",
},
"No Odoo configuration file found.": {
"fr": "Aucun fichier de configuration Odoo trouvé.",
"en": "No Odoo configuration file found.",
},
"odoo_bin.sh not found.": {
"fr": "odoo_bin.sh est introuvable.",
"en": "odoo_bin.sh not found.",
},
"The Odoo shell returned no result: ": {
"fr": "Le shell Odoo n'a rien renvoyé : ",
"en": "The Odoo shell returned no result: ",
},
"The Odoo shell exceeded the timeout (s): ": {
"fr": "Le shell Odoo a dépassé le délai imparti (s) : ",
"en": "The Odoo shell exceeded the timeout (s): ",
},
"Unreadable JSON from the Odoo shell: ": {
"fr": "JSON illisible en sortie du shell Odoo : ",
"en": "Unreadable JSON from the Odoo shell: ",
},
"To restore a view to what its module declares — this "
"WRITES to the database, so read the difference first:": {
"fr": "Pour rendre à une vue ce que déclare son module — ceci "
"ÉCRIT dans la base, lisez donc l'écart d'abord :",
"en": "To restore a view to what its module declares — this "
"WRITES to the database, so read the difference first:",
},
"compare with the module source (opens an Odoo shell)": {
"fr": "comparer avec la source du module (ouvre un shell Odoo)",
"en": "compare with the module source (opens an Odoo shell)",
},
"fail if the comparison could not be made": {
"fr": "échouer si la comparaison n'a pas pu être faite",
"en": "fail if the comparison could not be made",
},
"browse the differences in a full-screen view": {
"fr": "naviguer dans les écarts en plein écran",
"en": "browse the differences in a full-screen view",
},
"Flags say a view was touched, not how. They are incomplete "
"both ways: a direct SQL write does not set arch_updated, "
"and reset_arch clears it. Comparing with the module source "
"is what settles it — add --diff.": {
"fr": "Les drapeaux disent qu'une vue a été touchée, pas comment. "
"Ils sont incomplets dans les deux sens : un write SQL "
"direct n'arme pas arch_updated, et reset_arch l'efface. "
"Seule la comparaison avec la source du module tranche — "
"ajoutez --diff.",
"en": "Flags say a view was touched, not how. They are incomplete "
"both ways: a direct SQL write does not set arch_updated, "
"and reset_arch clears it. Comparing with the module source "
"is what settles it — add --diff.",
},
"Database is Odoo": {
"fr": "La base est en Odoo",
"en": "Database is Odoo",
},
"checkout is": {
"fr": "le checkout est en",
"en": "checkout is",
},
"views were flagged but hold exactly what their module "
"declares: only the comparison could tell.": {
"fr": "vues étaient signalées mais portent exactement ce que "
"déclare leur module : seule la comparaison pouvait le "
"dire.",
"en": "views were flagged but hold exactly what their module "
"declares: only the comparison could tell.",
},
"No reference arch, so nothing was compared: ": {
"fr": "Aucune arch de référence, donc rien n'a été comparé : ",
"en": "No reference arch, so nothing was compared: ",
},
"Not a terminal: showing the text report instead.": {
"fr": "Pas un terminal : affichage du rapport texte à la place.",
"en": "Not a terminal: showing the text report instead.",
},
"To restore this view to what its module declares:": {
"fr": "Pour rendre à cette vue ce que déclare son module :",
"en": "To restore this view to what its module declares:",
},
# --- script/analyse : erreurs du socle ---
"Invalid database name: ": {
"fr": "Nom de base invalide : ",
"en": "Invalid database name: ",
},
"Cannot read from the database: ": {
"fr": "Lecture impossible dans la base : ",
"en": "Cannot read from the database: ",
},
"is not an Odoo database.": {
"fr": "n'est pas une base Odoo.",
"en": "is not an Odoo database.",
},
"psql is not installed or not in PATH.": {
"fr": "psql n'est pas installé, ou absent du PATH.",
"en": "psql is not installed or not in PATH.",
},
"Query exceeded the timeout (s): ": {
"fr": "La requête a dépassé le délai imparti (s) : ",
"en": "Query exceeded the timeout (s): ",
},
"Unreadable JSON from psql: ": {
"fr": "JSON illisible en sortie de psql : ",
"en": "Unreadable JSON from psql: ",
},
"shared library, nothing to run here.": {
"fr": "bibliothèque partagée, rien à lancer ici.",
"en": "shared library, nothing to run here.",
},
"Runnable tools in this directory:": {
"fr": "Outils exécutables de ce répertoire :",
"en": "Runnable tools in this directory:",
},
"No analysis tool here yet.": {
"fr": "Aucun outil d'analyse ici pour l'instant.",
"en": "No analysis tool here yet.",
},
"From the menu:": {"fr": "Depuis le menu :", "en": "From the menu:"},
"in the dump": {"fr": "dans le dump", "en": "in the dump"},
"Weight in the dump": {
"fr": "Poids dans le dump",
"en": "Weight in the dump",
},
# --- script/analyse : poids du schéma ---
"Schema analysis": {
"fr": "Analyse du schéma",
"en": "Schema analysis",
},
"Database size": {
"fr": "Poids de la base",
"en": "Database size",
},
"Tables": {"fr": "Tables", "en": "Tables"},
"Models": {"fr": "Modèles", "en": "Models"},
"rows": {"fr": "lignes", "en": "rows"},
"Models without table": {
"fr": "Modèles sans table",
"en": "Models without table",
},
"abstract models have none, by design": {
"fr": "les modèles abstraits n'en ont pas, par construction",
"en": "abstract models have none, by design",
},
"ir_model_relation is absent, so m2m tables cannot be told apart from"
" orphans: the list below is unreliable.": {
"fr": "ir_model_relation est absente : impossible de distinguer une"
" table m2m d'une orpheline, la liste ci-dessous n'est pas fiable.",
"en": "ir_model_relation is absent, so m2m tables cannot be told apart"
" from orphans: the list below is unreliable.",
},
"Heaviest tables": {
"fr": "Tables les plus lourdes",
"en": "Heaviest tables",
},
"All tables, heaviest first": {
"fr": "Toutes les tables, de la plus lourde à la plus légère",
"en": "All tables, heaviest first",
},
"use -v to list them all": {
"fr": "utilisez -v pour toutes les afficher",
"en": "use -v to list them all",
},
"Every table belongs to an installed model.": {
"fr": "Chaque table appartient à un modèle installé.",
"en": "Every table belongs to an installed model.",
},
"Orphan tables": {
"fr": "Tables orphelines",
"en": "Orphan tables",
},
"No installed model claims these tables. They are usually left over from"
" modules uninstalled without DROP TABLE, and every version upgrade"
" carries them along.": {
"fr": "Aucun modèle installé ne réclame ces tables. Ce sont le plus"
" souvent des reliquats de modules désinstallés sans DROP TABLE, que"
" chaque montée de version transporte avec elle.",
"en": "No installed model claims these tables. They are usually left"
" over from modules uninstalled without DROP TABLE, and every version"
" upgrade carries them along.",
},
"Check what they hold before dropping anything.": {
"fr": "Regardez ce qu'elles contiennent avant de supprimer quoi que ce"
" soit.",
"en": "Check what they hold before dropping anything.",
},
"Row counts are estimates from the last ANALYZE. Use --exact for real"
" counts, at the cost of one full scan per table.": {
"fr": "Les nombres de lignes sont estimés d'après le dernier ANALYZE."
" Utilisez --exact pour un comptage réel, au prix d'un balayage"
" complet par table.",
"en": "Row counts are estimates from the last ANALYZE. Use --exact for"
" real counts, at the cost of one full scan per table.",
},
"Report the size of an Odoo database and the tables no installed model"
" claims (read-only).": {
"fr": "Rapporter le poids d'une base Odoo et les tables qu'aucun"
" modèle installé ne réclame (lecture seule).",
"en": "Report the size of an Odoo database and the tables no installed"
" model claims (read-only).",
},
"database to inspect": {
"fr": "base à examiner",
"en": "database to inspect",
},
"count rows exactly: one full scan per table": {
"fr": "compter les lignes exactement : un balayage complet par table",
"en": "count rows exactly: one full scan per table",
},
"how many tables to show (default: 20)": {
"fr": "nombre de tables à afficher (défaut : 20)",
"en": "how many tables to show (default: 20)",
},
"list every table": {
"fr": "afficher toutes les tables",
"en": "list every table",
},
"output JSON": {"fr": "sortie JSON", "en": "output JSON"},
"path to an Odoo config file": {
"fr": "chemin d'un fichier de configuration Odoo",
"en": "path to an Odoo config file",
},
# Courriel
"mail_menu": {
"fr": "Courriel - Lire et envoyer du courriel",
"en": "Mail - Read and send email",
},
"mail_ai_question": {
"fr": "Question IA - Poser une question à un modèle",
"en": "AI question - Ask a model a question",
},
"mail_open_tui": {
"fr": "Ouvrir le client courriel (TUI)",
"en": "Open the mail client (TUI)",
},
"mail_accounts_menu": {"fr": "Comptes", "en": "Accounts"},
"mail_sync_now": {
"fr": "Synchroniser maintenant",
"en": "Synchronise now",
},
"mail_cache_menu": {"fr": "Cache", "en": "Cache"},
"mail_account_list": {"fr": "Lister les comptes", "en": "List accounts"},
"mail_account_add": {"fr": "Ajouter un compte", "en": "Add an account"},
"mail_account_delete": {
"fr": "Supprimer un compte",
"en": "Delete an account",
},
"mail_account_template": {
"fr": "Générer un modèle accounts.json",
"en": "Generate an accounts.json template",
},
"mail_account_test": {
"fr": "Tester la connexion d'un compte",
"en": "Test an account connection",
},
"mail_cache_default_mode": {
"fr": "Mode de cache par défaut",
"en": "Default cache mode",
},
"mail_cache_account_mode": {
"fr": "Mode de cache d'un compte",
"en": "Cache mode of one account",
},
"mail_cache_size_purge": {
"fr": "Taille du cache et purge",
"en": "Cache size and purge",
},
"mail_no_account": {
"fr": "Aucun compte configuré. Ajoutez-en un d'abord.",
"en": "No account configured. Add one first.",
},
"mail_ask_name": {
"fr": "Nom court du compte : ",
"en": "Short account name: ",
},
"mail_ask_email": {"fr": "Adresse courriel : ", "en": "Email address: "},
"mail_ask_display_name": {
"fr": "Nom affiché (facultatif) : ",
"en": "Display name (optional): ",
},
"mail_ask_preset": {"fr": "Fournisseur : ", "en": "Provider: "},
"mail_ask_password": {"fr": "Mot de passe : ", "en": "Password: "},
"mail_ask_imap_host": {"fr": "Serveur IMAP : ", "en": "IMAP server: "},
"mail_ask_smtp_host": {"fr": "Serveur SMTP : ", "en": "SMTP server: "},
"mail_ask_account": {"fr": "Quel compte ? ", "en": "Which account? "},
"mail_ask_mode": {
"fr": "Mode (clear / encrypted / ephemeral) : ",
"en": "Mode (clear / encrypted / ephemeral): ",
},
"mail_app_password_note": {
"fr": "Ce fournisseur exige un mot de passe d'application.",
"en": "This provider requires an app password.",
},
"mail_account_saved": {"fr": "Compte enregistré.", "en": "Account saved."},
"mail_account_save": {"fr": "Enregistrer", "en": "Save"},
"mail_account_missing_fields": {
"fr": "Nom, adresse et mot de passe sont requis.",
"en": "Name, address and password are required.",
},
"mail_account_add_unavailable": {
"fr": "Ajout de compte indisponible dans ce contexte.",
"en": "Adding an account is unavailable in this context.",
},
"mail_account_deleted": {
"fr": "Compte supprimé.",
"en": "Account deleted.",
},
"mail_connection_ok": {
"fr": "Connexion réussie.",
"en": "Connection succeeded.",
},
"mail_connection_failed": {
"fr": "Connexion échouée :",
"en": "Connection failed:",
},
"mail_template_written": {
"fr": "Modèle écrit dans",
"en": "Template written to",
},
"mail_purge_confirm": {
"fr": "Effacer tout le cache de ce compte ? (o/N) ",
"en": "Erase this account's whole cache? (y/N) ",
},
"mail_purged": {"fr": "Cache effacé.", "en": "Cache erased."},
"mail_no_vault": {
"fr": "Aucun coffre disponible : installez pykeepass ou déverrouillez un trousseau système.",
"en": "No vault available: install pykeepass or unlock a system keyring.",
},
# Coffre KeePass, côté infrastructure partagée (`kdbx_manager`) : ces
# messages servent à TOUT le CLI, pas seulement au courriel.
"kdbx_vault_is": {
"fr": "Coffre KeePass :",
"en": "KeePass vault:",
},
"kdbx_ask_password": {
"fr": "Mot de passe du coffre (vide pour abandonner) : ",
"en": "Vault password (empty to give up): ",
},
"kdbx_wrong_password": {
"fr": "Mot de passe incorrect pour ce coffre KeePass.",
"en": "Wrong password for this KeePass vault.",
},
"kdbx_give_up": {
"fr": "Coffre non ouvert : on abandonne.",
"en": "Vault not opened: giving up.",
},
"mail_kdbx_none_configured": {
"fr": "Aucun fichier kdbx n'est configuré.",
"en": "No kdbx file is configured.",
},
"mail_kdbx_menu_create": {
"fr": "Créer un nouveau fichier .kdbx",
"en": "Create a new .kdbx file",
},
"mail_kdbx_menu_choose": {
"fr": "Choisir un fichier existant",
"en": "Choose an existing file",
},
"mail_kdbx_menu_cancel": {"fr": "Annuler", "en": "Cancel"},
"mail_kdbx_ask_choice": {"fr": "Votre choix : ", "en": "Your choice: "},
"mail_kdbx_ask_path_new": {
"fr": "Chemin du nouveau fichier kdbx",
"en": "Path for the new kdbx file",
},
"mail_kdbx_ask_path_existing": {
"fr": "Chemin du fichier kdbx existant : ",
"en": "Path to the existing kdbx file: ",
},
"mail_kdbx_ask_password": {
"fr": "Mot de passe du coffre : ",
"en": "Vault password: ",
},
"mail_kdbx_ask_password_confirm": {
"fr": "Confirmez le mot de passe : ",
"en": "Confirm the password: ",
},
"mail_kdbx_password_mismatch": {
"fr": "Les mots de passe ne correspondent pas.",
"en": "Passwords do not match.",
},
"mail_kdbx_path_not_found": {
"fr": "Ce fichier n'existe pas :",
"en": "This file does not exist:",
},
"mail_kdbx_created": {
"fr": "Fichier kdbx créé :",
"en": "Kdbx file created:",
},
"mail_kdbx_path_recorded": {
"fr": "Fichier kdbx configuré :",
"en": "Kdbx file configured:",
},
"mail_no_password_stored": {
"fr": "Aucun mot de passe enregistré pour ce compte.",
"en": "No password stored for this account.",
},
"mail_install_textual": {
"fr": "Installez textual pour le client courriel (pip).",
"en": "Install textual for the mail client (pip).",
},
"mail_accounts": {"fr": "Comptes", "en": "Accounts"},
"mail_search": {"fr": "Rechercher…", "en": "Search…"},
"mail_search_clear": {
"fr": "Effacer la recherche",
"en": "Clear search",
},
"mail_from": {"fr": "De :", "en": "From:"},
"mail_to": {"fr": "À :", "en": "To:"},
"mail_cc": {"fr": "Cc :", "en": "Cc:"},
"mail_subject": {"fr": "Objet :", "en": "Subject:"},
"mail_date": {"fr": "Date", "en": "Date"},
"mail_send": {"fr": "Envoyer", "en": "Send"},
"mail_attachments": {"fr": "Pièces jointes :", "en": "Attachments:"},
"mail_attachments_paths": {
"fr": "Pièces jointes (chemins séparés par des points-virgules)",
"en": "Attachments (semicolon-separated paths)",
},
"mail_browse": {"fr": "Parcourir…", "en": "Browse…"},
"mail_browse_failed": {
"fr": "Sélecteur de fichiers impossible :",
"en": "File browser unavailable:",
},
"mail_no_subject": {"fr": "(sans objet)", "en": "(no subject)"},
"mail_body_needs_network": {
"fr": "Corps non téléchargé — connexion requise.",
"en": "Body not downloaded — connection required.",
},
"mail_body_error": {
"fr": "Lecture du corps impossible :",
"en": "Cannot read the body:",
},
"mail_flag_error": {
"fr": "Drapeau non transmis au serveur :",
"en": "Flag not sent to the server:",
},
"mail_syncing": {"fr": "Synchronisation de", "en": "Synchronising"},
"mail_new_messages": {"fr": "nouveaux messages", "en": "new messages"},
"mail_errors": {"fr": "erreurs", "en": "errors"},
"mail_folders_resynced": {
"fr": "dossiers resynchronisés (UIDVALIDITY changé) :",
"en": "folders resynchronised (UIDVALIDITY changed):",
},
"mail_offline_cannot_send": {
"fr": "Compte hors ligne : envoi impossible.",
"en": "Account offline: cannot send.",
},
"mail_sent_to": {"fr": "Envoyé à", "en": "Sent to"},
"mail_sent_not_filed": {
"fr": "envoyé, mais pas classé dans Envoyés",
"en": "sent, but not filed in Sent",
},
"mail_nothing_to_reply_to": {
"fr": "Aucun message sélectionné.",
"en": "No message selected.",
},
"mail_nothing_to_forward": {
"fr": "Aucun message à transférer.",
"en": "No message to forward.",
},
"mail_attachment_not_found": {
"fr": "Pièce jointe introuvable.",
"en": "Attachment not found.",
},
"mail_no_attachment": {
"fr": "Ce message n'a pas de pièce jointe.",
"en": "This message has no attachment.",
},
"mail_save_failed": {
"fr": "Enregistrement impossible :",
"en": "Cannot save:",
},
"mail_saved_to": {"fr": "Enregistré dans", "en": "Saved to"},
"mail_log_binding": {"fr": "Journal", "en": "Log"},
"mail_log_close": {"fr": "Fermer", "en": "Close"},
"mail_log_tail_heading": {
"fr": "Journal (fin) :",
"en": "Log (tail):",
},
"mail_log_errors_heading": {
"fr": "Erreurs de synchronisation (session en cours) :",
"en": "Sync errors (current session):",
},
"mail_log_missing": {
"fr": "journal introuvable",
"en": "log not found",
},
"mail_log_empty": {"fr": "journal vide", "en": "log empty"},
"mail_log_unreadable": {
"fr": "journal illisible",
"en": "log unreadable",
},
"mail_log_no_errors": {
"fr": "Aucune erreur de synchronisation dans cette session.",
"en": "No sync errors in this session.",
},
"mail_layout_binding": {"fr": "Vue", "en": "View"},
"mail_layout_switched": {"fr": "Disposition :", "en": "Layout:"},
"mail_layout_columns": {"fr": "Colonnes", "en": "Columns"},
"mail_layout_split": {"fr": "Partagée", "en": "Split"},
"mail_layout_stacked": {"fr": "Empilée", "en": "Stacked"},
"mail_pane_grow_binding": {"fr": "Agrandir volet", "en": "Grow pane"},
"mail_pane_shrink_binding": {
"fr": "Rétrécir volet",
"en": "Shrink pane",
},
"mail_pane_reset_binding": {
"fr": "Tailles par défaut",
"en": "Reset sizes",
},
"mail_pane_reset_done": {
"fr": "Tailles des volets réinitialisées.",
"en": "Pane sizes reset.",
},
"mail_pane_splitter_tooltip": {
"fr": "Glisser pour redimensionner",
"en": "Drag to resize",
},
"mail_fullscreen_binding": {"fr": "Plein écran", "en": "Full screen"},
# -- Libellés des raccourcis de MailApp (suffixe _binding) -------------
# Ce sont les descriptions des `Binding` de `MailApp` : elles s'affichent
# au pied d'écran ET, depuis la tâche 26, dans la fenêtre d'aide (`h`),
# qui les lit directement dans `MailApp.BINDINGS`. Le français est repris
# MOT POUR MOT de ce qui était écrit en dur avant cette tâche — le pied
# d'écran d'un utilisateur francophone ne change pas.
"mail_quit_binding": {"fr": "Quitter", "en": "Quit"},
"mail_sync_current_binding": {"fr": "Sync", "en": "Sync"},
"mail_sync_all_binding": {"fr": "Sync tout", "en": "Sync all"},
"mail_back_binding": {"fr": "Retour", "en": "Back"},
"mail_search_binding": {"fr": "Rechercher", "en": "Search"},
"mail_mark_seen_binding": {"fr": "Lu", "en": "Read"},
"mail_mark_unseen_binding": {"fr": "Non lu", "en": "Unread"},
"mail_save_attachment_binding": {
"fr": "Enregistrer PJ",
"en": "Save attachment",
},
"mail_compose_binding": {"fr": "Écrire", "en": "Compose"},
"mail_reply_binding": {"fr": "Répondre", "en": "Reply"},
"mail_reply_all_binding": {"fr": "Répondre à tous", "en": "Reply all"},
"mail_forward_binding": {"fr": "Transférer", "en": "Forward"},
"mail_add_account_binding": {
"fr": "Nouveau compte",
"en": "New account",
},
# -- Fenêtre d'aide (touche h) -----------------------------------------
# La liste des touches n'est PAS ici : elle est engendrée depuis
# `MailApp.BINDINGS` (voir `HelpScreen`), avec les libellés ci-dessus.
# Seul ce qu'une liste de touches ne peut pas dire est rédigé ici.
"mail_help_binding": {"fr": "Aide", "en": "Help"},
"mail_help_close": {"fr": "Fermer", "en": "Close"},
"mail_help_title": {
"fr": "Aide — client courriel",
"en": "Help — mail client",
},
"mail_help_keys_heading": {
"fr": "Raccourcis clavier :",
"en": "Keyboard shortcuts:",
},
"mail_help_notes_heading": {"fr": "Bon à savoir :", "en": "Good to know:"},
"mail_help_mouse": {
"fr": (
"Souris : glisser une barre entre deux volets les redimensionne."
" Au clavier, + et - font de même sur le volet qui a le focus, et"
" 0 remet les tailles par défaut. Les tailles sont retenues par"
" disposition."
),
"en": (
"Mouse: drag a bar between two panes to resize them. From the"
" keyboard, + and - do the same to the focused pane, and 0 resets"
" the sizes. Sizes are remembered per layout."
),
},
"mail_help_layouts": {
"fr": (
"Dispositions : v passe de colonnes à partagée, puis empilée, puis"
" revient à colonnes."
),
"en": (
"Layouts: v cycles columns, split, stacked, then back to columns."
),
},
"mail_help_sync": {
"fr": (
"Synchronisation : r synchronise le compte du dossier sélectionné"
" (tous ses dossiers), R synchronise tous les comptes. La"
" synchronisation automatique ne tourne QUE tant que le client est"
" ouvert, à l'intervalle mail_refresh_sec (300 s par défaut ; 0 la"
" désactive)."
),
"en": (
"Sync: r syncs the account of the selected folder (all its"
" folders), R syncs every account. The automatic refresh runs ONLY"
" while the client is open, at the mail_refresh_sec interval (300 s"
" by default; 0 disables it)."
),
},
"mail_help_files": {
"fr": (
"Fichiers : le journal est dans ~/.erplibre/mail.log (la touche l"
" en montre la fin), les comptes dans"
" ~/.erplibre/mail/accounts.json. Les mots de passe n'y sont JAMAIS"
" écrits : ils vivent dans le coffre kdbx ou le trousseau du"
" système."
),
"en": (
"Files: the log lives in ~/.erplibre/mail.log (the l key shows its"
" tail), the accounts in ~/.erplibre/mail/accounts.json. Passwords"
" are NEVER written there: they live in the kdbx vault or in the"
" system keyring."
),
},
"mail_help_close_hint": {
"fr": "Échap ferme cette fenêtre.",
"en": "Esc closes this window.",
},
# -- Exceptions internes au paquet courriel (préfixe mail_err_) --------
# Label traduit, données dynamiques (chemins, texte serveur, valeurs de
# config) concaténées crues : jamais de traduction d'un message serveur
# ou d'un chemin de fichier.
#
# Quelques messages ont la donnée dynamique AU MILIEU de la phrase : ils
# sont donc assemblés à partir de deux clés (voire trois), dans un ordre
# FIXE codé au site d'appel plutôt que par une seule clé avec un
# emplacement — mail_err_unknown_security + mail_err_expected,
# mail_err_key_wrong_length + mail_err_octets_unit,
# mail_err_mode_prefix + mail_err_mode_requires_key(_no_vault),
# mail_err_imap_connection_prefix / mail_err_smtp_connection_prefix +
# mail_err_connection_refused_suffix, et mail_err_keyring_plaintext +
# mail_err_keyring_plaintext_hint. L'ordre des mots vit donc dans le
# code, pas dans les chaînes traduisibles : une langue à l'ordre des
# mots différent devra remplacer ces paires par une convention à
# emplacement (ex. `.format()`), pas par une simple concaténation.
"mail_err_envelope_too_short": {
"fr": "enveloppe trop courte",
"en": "envelope too short",
},
"mail_err_sealed_in_clear_mode": {
"fr": "donnée chiffrée lue en mode clair : la clé du compte manque",
"en": "encrypted data read in clear mode: the account key is missing",
},
"mail_err_unknown_envelope": {
"fr": "enveloppe inconnue :",
"en": "unknown envelope:",
},
"mail_err_key_wrong_length": {
"fr": "la clé doit faire",
"en": "the key must be",
},
"mail_err_octets_unit": {"fr": "octets", "en": "bytes"},
"mail_err_cryptography_not_installed": {
"fr": "le paquet cryptography n'est pas installé",
"en": "the cryptography package is not installed",
},
"mail_err_decrypt_refused": {
"fr": "déchiffrement refusé : clé fausse ou donnée altérée",
"en": "decryption refused: wrong key or corrupted data",
},
"mail_err_envelope_unreadable": {
"fr": "enveloppe illisible :",
"en": "unreadable envelope:",
},
"mail_err_mode_prefix": {"fr": "le mode", "en": "mode"},
"mail_err_mode_requires_key": {
"fr": "exige une clé",
"en": "requires a key",
},
"mail_err_unknown_cache_mode": {
"fr": "mode de cache inconnu :",
"en": "unknown cache mode:",
},
"mail_err_file_already_exists": {
"fr": "le fichier existe déjà :",
"en": "the file already exists:",
},
"mail_err_invalid_secret_ref": {
"fr": "référence de secret invalide :",
"en": "invalid secret reference:",
},
# Notes par fournisseur. Affichées à l'ajout d'un compte ET juste avant
# de redemander un mot de passe après un refus : elles doivent donner
# l'adresse EXACTE, pas un chemin de menu — Google et Apple déplacent
# régulièrement ces pages, et Google cache la sienne.
"mail_preset_note_gmail": {
"fr": (
"Générez-le sur https://myaccount.google.com/apppasswords"
" (16 caractères, les espaces sont acceptés). La validation en"
" deux étapes doit être active, sinon la page est vide."
),
"en": (
"Generate one at https://myaccount.google.com/apppasswords"
" (16 characters, spaces are accepted). Two-step verification"
" must be on, otherwise the page is empty."
),
},
"mail_preset_note_outlook": {
"fr": (
"Générez-le sur https://account.microsoft.com/security."
" Microsoft ferme l'authentification simple sur les comptes"
" grand public : sans mot de passe d'application, il faudra"
" OAuth (phase 2, non implémentée)."
),
"en": (
"Generate one at https://account.microsoft.com/security."
" Microsoft is closing basic authentication on consumer"
" accounts: without an app password this needs OAuth (phase 2,"
" not implemented)."
),
},
"mail_preset_note_icloud": {
"fr": (
"Générez-le sur https://account.apple.com, section « Connexion"
" et sécurité ». L'authentification à deux facteurs doit être"
" active."
),
"en": (
'Generate one at https://account.apple.com, under "Sign-In and'
' Security". Two-factor authentication must be on.'
),
},
"mail_preset_note_generic": {
"fr": "Saisissez les serveurs de votre fournisseur.",
"en": "Enter your provider's servers.",
},
"mail_ask_app_password": {
"fr": "Mot de passe d'application : ",
"en": "App password: ",
},
"mail_err_password_not_ascii": {
"fr": (
"le mot de passe contient un caractère non ASCII, que ce client"
" IMAP ne sait pas transmettre — il n'a pas été envoyé au"
" serveur"
),
"en": (
"the password contains a non-ASCII character this IMAP client"
" cannot transmit — it was never sent to the server"
),
},
"mail_err_no_kdbx_configured": {
"fr": "aucun fichier kdbx configuré",
"en": "no kdbx file configured",
},
"mail_err_kdbx_unreadable": {
"fr": "le fichier kdbx n'a pas pu être ouvert",
"en": "the kdbx file could not be opened",
},
"mail_err_no_vault_available": {
"fr": "aucun coffre disponible : ni kdbx, ni trousseau système",
"en": "no vault available: neither kdbx nor system keyring",
},
"mail_err_keyring_plaintext": {
"fr": (
"le trousseau du système écrirait le mot de passe en clair"
" (backend"
),
"en": (
"the system keyring would store the password in plaintext"
" (backend"
),
},
"mail_err_keyring_plaintext_hint": {
"fr": "Utilisez un fichier kdbx, ou déverrouillez un vrai trousseau.",
"en": "Use a kdbx file, or unlock a real keyring.",
},
"mail_err_unknown_security": {
"fr": "sécurité inconnue :",
"en": "unknown security:",
},
"mail_err_expected": {"fr": "(attendu", "en": "(expected"},
"mail_err_account_needs_name": {
"fr": "un compte doit avoir un nom",
"en": "an account must have a name",
},
"mail_err_invalid_account_name": {
"fr": "nom de compte invalide :",
"en": "invalid account name:",
},
"mail_err_account_name_reason": {
"fr": "(il sert de nom de dossier et de référence de coffre)",
"en": "(it is used as a folder name and vault reference)",
},
"mail_err_account_unreadable": {
"fr": "compte illisible :",
"en": "unreadable account:",
},
"mail_err_unknown_preset": {
"fr": "préréglage inconnu :",
"en": "unknown preset:",
},
"mail_err_not_valid_json": {
"fr": "n'est pas du JSON valide :",
"en": "is not valid JSON:",
},
"mail_err_should_contain_json_object": {
"fr": "devrait contenir un objet JSON",
"en": "should contain a JSON object",
},
"mail_err_duplicate_account_names": {
"fr": "noms de compte en double :",
"en": "duplicate account names:",
},
"mail_err_already_exists_relaunch": {
"fr": "existe déjà — relancez avec l'option de remplacement",
"en": "already exists — rerun with the overwrite option",
},
"mail_err_symlink_refused": {
"fr": "est un lien symbolique : cache refusé",
"en": "is a symlink: cache refused",
},
"mail_err_owned_by_other_user": {
"fr": "appartient à un autre utilisateur : cache refusé",
"en": "belongs to another user: cache refused",
},
"mail_err_cache_unreadable": {
"fr": "cache illisible, purgez-le et resynchronisez :",
"en": "unreadable cache, purge it and resynchronise:",
},
"mail_err_mode_requires_key_no_vault": {
"fr": "exige une clé : aucun coffre fourni",
"en": "requires a key: no vault provided",
},
"mail_err_cache_not_open": {
"fr": "cache non ouvert : appelez open() d'abord",
"en": "cache not open: call open() first",
},
"mail_err_unknown_folder_fields": {
"fr": "champs de dossier inconnus :",
"en": "unknown folder fields:",
},
"mail_err_unterminated_ampersand": {
"fr": "séquence & non terminée",
"en": "unterminated & sequence",
},
"mail_err_server_replied": {
"fr": ": le serveur a répondu",
"en": ": the server replied",
},
"mail_err_no_body_for_uid": {
"fr": "aucun corps rendu pour l'UID",
"en": "no body returned for UID",
},
"mail_err_imap_connection_prefix": {
"fr": "connexion IMAP à",
"en": "IMAP connection to",
},
"mail_err_smtp_connection_prefix": {
"fr": "connexion SMTP à",
"en": "SMTP connection to",
},
"mail_err_connection_refused_suffix": {
"fr": "refusée :",
"en": "refused:",
},
"mail_err_message_needs_recipient": {
"fr": "un message doit avoir au moins un destinataire",
"en": "a message must have at least one recipient",
},
"mail_err_attachment_missing": {
"fr": "pièce jointe introuvable :",
"en": "attachment not found:",
},
"mail_err_no_recipient_nothing_sent": {
"fr": "aucun destinataire : rien n'a été envoyé",
"en": "no recipient: nothing was sent",
},
"mail_err_send_refused": {"fr": "envoi refusé :", "en": "send refused:"},
# QEMU — outils de développement des VM graphiques
"Python IDE, ERPLibre project pre-configured": {
"fr": "IDE Python, projet ERPLibre pré-configuré",
"en": "Python IDE, ERPLibre project pre-configured",
},
"ERPLibre mobile development (x86_64 only)": {
"fr": "développement mobile ERPLibre (x86_64 seulement)",
"en": "ERPLibre mobile development (x86_64 only)",
},
"GNOME extensions": {
"fr": "Extensions GNOME",
"en": "GNOME extensions",
},
"suggested extensions + extension manager": {
"fr": "extensions suggérées + gestionnaire d'extensions",
"en": "suggested extensions + extension manager",
},
"Development tools for the graphical VMs:": {
"fr": "Outils de développement des VM graphiques :",
"en": "Development tools for the graphical VMs:",
},
"Development tools (graphical VMs):": {
"fr": "Outils de développement (VM graphiques) :",
"en": "Development tools (graphical VMs):",
},
"Development tools:": {
"fr": "Outils de développement :",
"en": "Development tools:",
},
"Disk needed:": {"fr": "Disque nécessaire :", "en": "Disk needed:"},
"Numbers separated by spaces, [all], blank = none:": {
"fr": "Numéros séparés par des espaces, [tous], vide = aucun :",
"en": "Numbers separated by spaces, [all], blank = none:",
},
"No graphical VM: these tools are not installed.": {
"fr": "Aucune VM graphique : ces outils ne seront pas installés.",
"en": "No graphical VM: these tools are not installed.",
},
"Partly skipped (arch or desktop):": {
"fr": "En partie écartés (architecture ou bureau) :",
"en": "Partly skipped (arch or desktop):",
},
"Installing PyCharm (long)": {
"fr": "Installation de PyCharm (long)",
"en": "Installing PyCharm (long)",
},
"no JetBrains build for": {
"fr": "aucune archive JetBrains pour",
"en": "no JetBrains build for",
},
"PyCharm: project config skipped": {
"fr": "PyCharm : configuration du projet non écrite",
"en": "PyCharm: project config skipped",
},
"PyCharm installed:": {
"fr": "PyCharm installé :",
"en": "PyCharm installed:",
},
"PyCharm not installed (see above)": {
"fr": "PyCharm non installé (voir ci-dessus)",
"en": "PyCharm not installed (see above)",
},
"Installing Android Studio (long)": {
"fr": "Installation d'Android Studio (long)",
"en": "Installing Android Studio (long)",
},
"Android Studio: Google publishes x86_64 only": {
"fr": "Android Studio : Google ne publie que du x86_64",
"en": "Android Studio: Google publishes x86_64 only",
},
"SDK shared through ANDROID_HOME:": {
"fr": "SDK partagé via ANDROID_HOME :",
"en": "SDK shared through ANDROID_HOME:",
},
"Android Studio installed:": {
"fr": "Android Studio installé :",
"en": "Android Studio installed:",
},
"Android Studio not installed (see above)": {
"fr": "Android Studio non installé (voir ci-dessus)",
"en": "Android Studio not installed (see above)",
},
"no nested KVM: the emulator will not run": {
"fr": "pas de KVM imbriqué : l'émulateur ne démarrera pas",
"en": "no nested KVM: the emulator will not run",
},
"Suggested GNOME extensions": {
"fr": "Extensions GNOME suggérées",
"en": "Suggested GNOME extensions",
},
"not in the repos, skipped:": {
"fr": "absent des dépôts, ignoré :",
"en": "not in the repos, skipped:",
},
"Enable them from Extension Manager, or:": {
"fr": "À activer depuis le gestionnaire d'extensions, ou :",
"en": "Enable them from Extension Manager, or:",
},
"GNOME Shell not found, site extensions skipped": {
"fr": "GNOME Shell introuvable, extensions du site ignorées",
"en": "GNOME Shell not found, site extensions skipped",
},
"installed and enabled:": {
"fr": "installée et activée :",
"en": "installed and enabled:",
},
"not available for this GNOME, skipped:": {
"fr": "indisponible pour ce GNOME, ignorée :",
"en": "not available for this GNOME, skipped:",
},
"log out and back in to load them": {
"fr": "se déconnecter puis se reconnecter pour les charger",
"en": "log out and back in to load them",
},
"open the project once and close PyCharm; the .idea it writes is what the install configures": {
"fr": "ouvrir le projet une fois puis fermer PyCharm : le .idea qu'il écrit est ce que l'installation configure",
"en": "open the project once and close PyCharm; the .idea it writes is what the install configures",
},
"command": {"fr": "commande", "en": "command"},
"release feed unreachable: unified build, it will ask for a JetBrains account": {
"fr": "flux des versions injoignable : build unifié, il demandera un compte JetBrains",
"en": "release feed unreachable: unified build, it will ask for a JetBrains account",
},
"Creating the PyCharm project (first open)": {
"fr": "Création du projet PyCharm (première ouverture)",
"en": "Creating the PyCharm project (first open)",
},
"PyCharm missing, step skipped": {
"fr": "PyCharm absent, étape sautée",
"en": "PyCharm missing, step skipped",
},
"no Xvfb here, open PyCharm by hand": {
"fr": "pas de Xvfb ici : ouvrir PyCharm à la main",
"en": "no Xvfb here, open PyCharm by hand",
},
"ERPLibre mobile (build)": {
"fr": "ERPLibre mobile (compilation)",
"en": "ERPLibre mobile (build)",
},
"APK debug + Vitest, validates the VM": {
"fr": "APK debug + Vitest, valide la VM",
"en": "APK debug + Vitest, validates the VM",
},
"Building ERPLibre mobile (long)": {
"fr": "Compilation d'ERPLibre mobile (long)",
"en": "Building ERPLibre mobile (long)",
},
"detailed log in the VM:": {
"fr": "journal détaillé dans la VM :",
"en": "detailed log in the VM:",
},
"FAILED:": {"fr": "ÉCHEC :", "en": "FAILED:"},
"probable cause:": {"fr": "cause probable :", "en": "probable cause:"},
"no known pattern, last lines:": {
"fr": "aucun motif connu, dernières lignes :",
"en": "no known pattern, last lines:",
},
"a failed mobile build marks the VM as failed": {
"fr": "une compilation mobile en échec marque la VM en échec",
"en": "a failed mobile build marks the VM as failed",
},
"ERPLibre venv (everything below needs it)": {
"fr": "venv ERPLibre (tout ce qui suit en dépend)",
"en": "ERPLibre venv (everything below needs it)",
},
"mobile repository (additive manifest)": {
"fr": "dépôt mobile (manifeste additif)",
"en": "mobile repository (additive manifest)",
},
"prerequisites of the upstream installer": {
"fr": "prérequis de l'installateur amont",
"en": "prerequisites of the upstream installer",
},
"Android SDK, licences, NDK": {
"fr": "SDK Android, licences, NDK",
"en": "Android SDK, licences, NDK",
},
"SDK platform required by the project": {
"fr": "plateforme SDK réclamée par le projet",
"en": "SDK platform required by the project",
},
"npm dependencies": {
"fr": "dépendances npm",
"en": "npm dependencies",
},
"web bundle (vite build)": {
"fr": "bundle web (vite build)",
"en": "web bundle (vite build)",
},
"native sync (capacitor)": {
"fr": "synchronisation native (capacitor)",
"en": "native sync (capacitor)",
},
"debug APK (gradle)": {
"fr": "APK debug (gradle)",
"en": "debug APK (gradle)",
},
"Vitest tests": {"fr": "tests Vitest", "en": "Vitest tests"},
"APK built:": {"fr": "APK construit :", "en": "APK built:"},
"browser debugging (no Android):": {
"fr": "déverminage au navigateur (sans Android) :",
"en": "browser debugging (no Android):",
},
"no APK produced": {
"fr": "aucun APK produit",
"en": "no APK produced",
},
"disk full": {"fr": "disque plein", "en": "disk full"},
"SDK platform missing": {
"fr": "plateforme SDK absente",
"en": "SDK platform missing",
},
"SDK not found (ANDROID_HOME)": {
"fr": "SDK introuvable (ANDROID_HOME)",
"en": "SDK not found (ANDROID_HOME)",
},
"SDK licences not accepted": {
"fr": "licences SDK non acceptées",
"en": "SDK licences not accepted",
},
"NDK missing": {"fr": "NDK absent", "en": "NDK missing"},
"JDK required by the project missing": {
"fr": "JDK réclamé par le projet absent",
"en": "JDK required by the project missing",
},
"Gradle running on too old a JDK": {
"fr": "Gradle tourne sur un JDK trop ancien",
"en": "Gradle running on too old a JDK",
},
"SDK already there (upstream installer replays)": {
"fr": "SDK déjà là (l'installateur amont se rejoue)",
"en": "SDK already there (upstream installer replays)",
},
"cross-compiled protoc run on the host": {
"fr": "protoc compilé pour la cible, exécuté sur l'hôte",
"en": "cross-compiled protoc run on the host",
},
"JDK/Gradle mismatch": {
"fr": "JDK et Gradle incompatibles",
"en": "JDK/Gradle mismatch",
},
"Gradle dependency unreachable (network?)": {
"fr": "dépendance Gradle injoignable (réseau ?)",
"en": "Gradle dependency unreachable (network?)",
},
"Vitest tests failed": {
"fr": "tests Vitest en échec",
"en": "Vitest tests failed",
},
"ERPLibre venv incomplete (no pip: python3-venv)": {
"fr": "venv ERPLibre incomplet (pas de pip : python3-venv)",
"en": "ERPLibre venv incomplete (no pip: python3-venv)",
},
"mobile repository missing": {
"fr": "dépôt mobile absent",
"en": "mobile repository missing",
},
"ERPLibre venv missing (incomplete install)": {
"fr": "venv ERPLibre absent (installation incomplète)",
"en": "ERPLibre venv missing (incomplete install)",
},
"smoother, without X11:": {
"fr": "plus fluide, sans X11 :",
"en": "smoother, without X11:",
},
"Android emulator": {"fr": "Émulateur Android", "en": "Android emulator"},
"Android emulator (start, tunnel, scrcpy)": {
"fr": "Émulateur Android (démarrer, tunnel, scrcpy)",
"en": "Android emulator (start, tunnel, scrcpy)",
},
"An emulator is already running on this VM.": {
"fr": "Un émulateur tourne déjà sur cette VM.",
"en": "An emulator is already running on this VM.",
},
"Only one per AVD; close it first:": {
"fr": "Un seul par AVD ; le fermer d'abord :",
"en": "Only one per AVD; close it first:",
},
"Close it now? (y/N): ": {
"fr": "Le fermer maintenant ? (o/N) : ",
"en": "Close it now? (y/N): ",
},
"Closed.": {"fr": "Fermé.", "en": "Closed."},
"Show a window?": {
"fr": "Afficher une fenêtre ?",
"en": "Show a window?",
},
"No window - stream with scrcpy (smoother)": {
"fr": "Sans fenêtre — flux par scrcpy (plus fluide)",
"en": "No window - stream with scrcpy (smoother)",
},
"Window over ssh -X (raw pixels, slower)": {
"fr": "Fenêtre par ssh -X (pixels bruts, plus lent)",
"en": "Window over ssh -X (raw pixels, slower)",
},
"X11 compression is on (-XC); the screen is 540x1140.": {
"fr": "La compression X11 est active (-XC) ; l'écran fait 540x1140.",
"en": "X11 compression is on (-XC); the screen is 540x1140.",
},
"Starting the emulator without a window...": {
"fr": "Démarrage de l'émulateur sans fenêtre…",
"en": "Starting the emulator without a window...",
},
"Could not start it:": {
"fr": "Démarrage impossible :",
"en": "Could not start it:",
},
"Started. Boot takes about a minute; log in the VM:": {
"fr": "Démarré. L'amorçage prend environ une minute ; journal dans la VM :",
"en": "Started. Boot takes about a minute; log in the VM:",
},
"1. Emulator started, without a window.": {
"fr": "1. Émulateur démarré, sans fenêtre.",
"en": "1. Emulator started, without a window.",
},
"If scrcpy will run on THIS machine, I can open it.": {
"fr": "Si scrcpy tournera sur CETTE machine, je peux l'ouvrir.",
"en": "If scrcpy will run on THIS machine, I can open it.",
},
"Open the tunnel now? (y/N): ": {
"fr": "Ouvrir le tunnel maintenant ? (o/N) : ",
"en": "Open the tunnel now? (y/N): ",
},
"Port already in use here:": {
"fr": "Port déjà occupé ici :",
"en": "Port already in use here:",
},
"Close the other tunnel first:": {
"fr": "Fermer l'autre tunnel d'abord :",
"en": "Close the other tunnel first:",
},
"Tunnel failed:": {"fr": "Tunnel en échec :", "en": "Tunnel failed:"},
"Tunnel open on localhost:": {
"fr": "Tunnel ouvert sur localhost:",
"en": "Tunnel open on localhost:",
},
"Then:": {"fr": "Puis :", "en": "Then:"},
"To close it:": {"fr": "Pour le fermer :", "en": "To close it:"},
"Android emulator (adb 5555, then scrcpy)": {
"fr": "Émulateur Android (adb 5555, puis scrcpy)",
"en": "Android emulator (adb 5555, then scrcpy)",
},
"Android emulator over adb + scrcpy": {
"fr": "Émulateur Android par adb + scrcpy",
"en": "Android emulator over adb + scrcpy",
},
"1. In the VM, start the emulator WITHOUT a window:": {
"fr": "1. Dans la VM, démarrer l'émulateur SANS fenêtre :",
"en": "1. In the VM, start the emulator WITHOUT a window:",
},
"2. Open the tunnel from YOUR workstation:": {
"fr": "2. Ouvrir le tunnel depuis VOTRE poste :",
"en": "2. Open the tunnel from YOUR workstation:",
},
"3. Then, still on your workstation:": {
"fr": "3. Puis, toujours sur votre poste :",
"en": "3. Then, still on your workstation:",
},
"scrcpy on Debian/Ubuntu:": {
"fr": "scrcpy sur Debian/Ubuntu :",
"en": "scrcpy on Debian/Ubuntu:",
},
"Android emulator (Pixel)": {
"fr": "Émulateur Android (Pixel)",
"en": "Android emulator (Pixel)",
},
"AVD viewable over ssh -X": {
"fr": "AVD visible par ssh -X",
"en": "AVD viewable over ssh -X",
},
"Android emulator (AVD)": {
"fr": "Émulateur Android (AVD)",
"en": "Android emulator (AVD)",
},
"no /dev/kvm: nested virtualisation is off on the host": {
"fr": "pas de /dev/kvm : virtualisation imbriquée coupée sur l'hôte",
"en": "no /dev/kvm: nested virtualisation is off on the host",
},
"user added to the kvm group (effective at next login)": {
"fr": "utilisateur ajouté au groupe kvm (effectif à la prochaine session)",
"en": "user added to the kvm group (effective at next login)",
},
"emulator and system image": {
"fr": "émulateur et image système",
"en": "emulator and system image",
},
"Pixel profile, smallest screen": {
"fr": "profil Pixel, plus petit écran",
"en": "Pixel profile, smallest screen",
},
"create the AVD": {"fr": "création de l'AVD", "en": "create the AVD"},
"AVD ready:": {"fr": "AVD prêt :", "en": "AVD ready:"},
"open it from your workstation:": {
"fr": "à ouvrir depuis votre poste :",
"en": "open it from your workstation:",
},
"then install the APK:": {
"fr": "puis installer l'APK :",
"en": "then install the APK:",
},
"ERPLibre mobile, Android SDK (long)": {
"fr": "ERPLibre mobile, SDK Android (long)",
"en": "ERPLibre mobile, Android SDK (long)",
},
"Gradle task failed": {
"fr": "tâche Gradle en échec",
"en": "Gradle task failed",
},
"project created, the install will configure it": {
"fr": "projet créé, l'installation va le configurer",
"en": "project created, the install will configure it",
},
"no .idea: open PyCharm once, then": {
"fr": "pas de .idea : ouvrir PyCharm une fois, puis",
"en": "no .idea: open PyCharm once, then",
},
"project": {"fr": "projet", "en": "project"},
"Instance": {
"fr": "🛰 Instance",
"en": "🛰 Instance",
},
"Monitoring - a backup, a remote copy or a live instance": {
"fr": "🛰 Monitoring - une sauvegarde, une copie distante ou une instance vivante",
"en": "🛰 Monitoring - a backup, a remote copy or a live instance",
},
"Inspect an instance.": {
"fr": "Ausculter une instance.",
"en": "Inspect an instance.",
},
"A local backup .zip": {
"fr": "Une sauvegarde .zip locale",
"en": "A local backup .zip",
},
"A remote backup (https + master password)": {
"fr": "Une sauvegarde distante (https + mot de passe maître)",
"en": "A remote backup (https + master password)",
},
"A live remote instance": {
"fr": "Une instance vivante distante",
"en": "A live remote instance",
},
"An API key": {
"fr": "Une clé d'API",
"en": "An API key",
},
"A password": {
"fr": "Un mot de passe",
"en": "A password",
},
"API key: ": {
"fr": "Clé d'API : ",
"en": "API key: ",
},
"Password: ": {
"fr": "Mot de passe : ",
"en": "Password: ",
},
"User login: ": {
"fr": "Identifiant : ",
"en": "User login: ",
},
"Instance URL (ex. https://example.com): ": {
"fr": "URL de l'instance (ex. https://exemple.com) : ",
"en": "Instance URL (ex. https://example.com): ",
},
"Database name on that instance: ": {
"fr": "Nom de la base sur cette instance : ",
"en": "Database name on that instance: ",
},
"Cannot connect: ": {
"fr": "Connexion impossible : ",
"en": "Cannot connect: ",
},
"Connected as uid": {
"fr": "Connecté sous l'uid",
"en": "Connected as uid",
},
"The instance refused these credentials.": {
"fr": "L'instance a refusé ces identifiants.",
"en": "The instance refused these credentials.",
},
"Monitoring only reads; refused method:": {
"fr": "Le monitoring ne fait que lire ; méthode refusée :",
"en": "Monitoring only reads; refused method:",
},
"Database:": {
"fr": "Base :",
"en": "Database:",
},
"Live instance:": {
"fr": "Instance vivante :",
"en": "Live instance:",
},
"Database name (default=": {
"fr": "Nom de la base (défaut=",
"en": "Database name (default=",
},
"Neutralize the database (Y/n)? ": {
"fr": "Neutraliser la base (O/n) ? ",
"en": "Neutralize the database (Y/n)? ",
},
"The restore failed.": {
"fr": "La restauration a échoué.",
"en": "The restore failed.",
},
"The download did not produce a usable file.": {
"fr": "Le téléchargement n'a pas produit de fichier utilisable.",
"en": "The download did not produce a usable file.",
},
"db_restore only reads image_db/. Link it there": {
"fr": "db_restore ne lit que image_db/. Y poser un lien",
"en": "db_restore only reads image_db/. Link it there",
},
"Using the file already in image_db: ": {
"fr": "On prend le fichier déjà dans image_db : ",
"en": "Using the file already in image_db: ",
},
"Cannot link into image_db: ": {
"fr": "Impossible de poser le lien dans image_db : ",
"en": "Cannot link into image_db: ",
},
"You can log in with test / test.": {
"fr": "Vous pouvez vous connecter avec test / test.",
"en": "You can log in with test / test.",
},
"update_prod_to_dev did not finish: do not": {
"fr": "update_prod_to_dev n'a pas fini : ne comptez pas",
"en": "update_prod_to_dev did not finish: do not",
},
"count on the test/test account.": {
"fr": "sur le compte test/test.",
"en": "count on the test/test account.",
},
"database.is_neutralized is set.": {
"fr": "database.is_neutralized est posé.",
"en": "database.is_neutralized is set.",
},
"database.is_neutralized is NOT set — Odoo does not": {
"fr": "database.is_neutralized n'est PAS posé — Odoo ne considère pas",
"en": "database.is_neutralized is NOT set — Odoo does not",
},
"consider this database neutralised.": {
"fr": "cette base comme neutralisée.",
"en": "consider this database neutralised.",
},
"scheduled actions are still active.": {
"fr": "actions planifiées sont encore actives.",
"en": "scheduled actions are still active.",
},
"No scheduled action is active.": {
"fr": "Aucune action planifiée n'est active.",
"en": "No scheduled action is active.",
},
"No mail server at all: Odoo falls back to smtp_server": {
"fr": "Aucun serveur de courriel : Odoo retombe sur le smtp_server",
"en": "No mail server at all: Odoo falls back to smtp_server",
},
"from the config file. A blocking one is safer than none.": {
"fr": "du fichier de configuration. Un serveur bouchon vaut mieux que rien.",
"en": "from the config file. A blocking one is safer than none.",
},
"payment provider(s) are neither disabled nor": {
"fr": "fournisseur(s) de paiement ne sont ni désactivés ni",
"en": "payment provider(s) are neither disabled nor",
},
"in test mode.": {
"fr": "en mode test.",
"en": "in test mode.",
},
"Run": {
"fr": "Lancer",
"en": "Run",
},
"Enter to run it.": {
"fr": "Entrée pour le lancer.",
"en": "Enter to run it.",
},
"Not available for this source.": {
"fr": "Indisponible pour cette provenance.",
"en": "Not available for this source.",
},
"Migration leftovers": {
"fr": "🚚 Restant de migration",
"en": "🚚 Migration leftovers",
},
"What a migration left behind, judged without needing the step-by-step databases.": {
"fr": "Ce qu'une migration a laissé derrière elle, jugé sans avoir besoin des bases de palier.",
"en": "What a migration left behind, judged without needing the step-by-step databases.",
},
"It reads pg_catalog — indexes and real tables — which no RPC session exposes.": {
"fr": "Il lit pg_catalog — les index et les vraies tables — qu'aucune session RPC n'expose.",
"en": "It reads pg_catalog — indexes and real tables — which no RPC session exposes.",
},
"Every view someone changed, and every website copy that shadows a module view.": {
"fr": "Chaque vue que quelqu'un a modifiée, et chaque copie de site web qui masque une vue de module.",
"en": "Every view someone changed, and every website copy that shadows a module view.",
},
"Comparing a copy with the module view it hides is a join on arch_db, done in SQL.": {
"fr": "Comparer une copie à la vue de module qu'elle masque est une jointure sur arch_db, faite en SQL.",
"en": "Comparing a copy with the module view it hides is a join on arch_db, done in SQL.",
},
"Fields and models added outside any module, and which of them have no column behind them.": {
"fr": "Champs et modèles ajoutés hors de tout module, et lesquels n'ont aucune colonne derrière eux.",
"en": "Fields and models added outside any module, and which of them have no column behind them.",
},
"Telling a declared field from a real column means reading pg_attribute.": {
"fr": "Distinguer un champ déclaré d'une vraie colonne demande de lire pg_attribute.",
"en": "Telling a declared field from a real column means reading pg_attribute.",
},
"What a migration left behind, read in one database.": {
"fr": "Ce qu'une migration a laissé derrière elle, lu dans une seule base.",
"en": "What a migration left behind, read in one database.",
},
"Migration residue in": {
"fr": "Restant de migration dans",
"en": "Migration residue in",
},
"base module version:": {
"fr": "version du module base :",
"en": "base module version:",
},
"None of the checks found anything.": {
"fr": "Aucun contrôle n'a rien trouvé.",
"en": "None of the checks found anything.",
},
"This reads one database on its own — it cannot see": {
"fr": "Ceci ne lit qu'une base isolée — il ne peut pas voir",
"en": "This reads one database on its own — it cannot see",
},
"what an earlier step silently dropped.": {
"fr": "ce qu'un palier antérieur a laissé tomber en silence.",
"en": "what an earlier step silently dropped.",
},
"could not read": {
"fr": "lecture impossible",
"en": "could not read",
},
"no repair tool yet": {
"fr": "pas encore d'outil de réparation",
"en": "no repair tool yet",
},
"Modules stuck between two states": {
"fr": "Modules figés entre deux états",
"en": "Modules stuck between two states",
},
"A migration that stopped mid-flight leaves them there; Odoo will retry the transition at every start.": {
"fr": "Une migration arrêtée en vol les laisse ainsi ; Odoo retentera la transition à chaque démarrage.",
"en": "A migration that stopped mid-flight leaves them there; Odoo will retry the transition at every start.",
},
"Languages whose active flag is NULL": {
"fr": "Langues dont le drapeau actif est NULL",
"en": "Languages whose active flag is NULL",
},
"A boolean that is neither true nor false: the language is listed nowhere and cannot be re-enabled from the interface.": {
"fr": "Un booléen qui n'est ni vrai ni faux : la langue n'est listée nulle part et ne peut plus être réactivée depuis l'interface.",
"en": "A boolean that is neither true nor false: the language is listed nowhere and cannot be re-enabled from the interface.",
},
"Indexes duplicated by the Odoo 17 renaming": {
"fr": "Index doublés par le renommage d'Odoo 17",
"en": "Indexes duplicated by the Odoo 17 renaming",
},
"Odoo 17 changed the naming convention without dropping the old index: both are maintained on every write. This count is a cheap signal — the repair tool compares columns and uniqueness, and is the one to trust.": {
"fr": "Odoo 17 a changé la convention de nommage sans supprimer l'ancien index : les deux sont entretenus à chaque écriture. Ce compte est un indicateur bon marché — l'outil de réparation compare les colonnes et l'unicité, c'est lui qui fait foi.",
"en": "Odoo 17 changed the naming convention without dropping the old index: both are maintained on every write. This count is a cheap signal — the repair tool compares columns and uniqueness, and is the one to trust.",
},
"Default pricelist missing while product is installed": {
"fr": "Liste de prix par défaut absente alors que product est installé",
"en": "Default pricelist missing while product is installed",
},
"product.list0 was declared up to Odoo 16 only; nothing recreates it, and a quotation has no price list to pick.": {
"fr": "product.list0 n'a été déclaré que jusqu'à Odoo 16 ; rien ne le recrée, et un devis n'a aucune liste de prix à choisir.",
"en": "product.list0 was declared up to Odoo 16 only; nothing recreates it, and a quotation has no price list to pick.",
},
"Views bound to a model that no longer exists": {
"fr": "Vues liées à un modèle qui n'existe plus",
"en": "Views bound to a model that no longer exists",
},
"Opening one raises; the menu that leads to it is a dead end.": {
"fr": "En ouvrir une lève une erreur ; le menu qui y mène est un cul-de-sac.",
"en": "Opening one raises; the menu that leads to it is a dead end.",
},
"Views inheriting a view that is gone": {
"fr": "Vues héritant d'une vue disparue",
"en": "Views inheriting a view that is gone",
},
"The whole inheritance chain below them stops rendering.": {
"fr": "Toute la chaîne d'héritage en dessous cesse de s'afficher.",
"en": "The whole inheritance chain below them stops rendering.",
},
"External ids pointing at a model that is gone": {
"fr": "Identifiants externes pointant un modèle disparu",
"en": "External ids pointing at a model that is gone",
},
"Every module update that resolves one of them fails.": {
"fr": "Chaque mise à jour de module qui en résout un échoue.",
"en": "Every module update that resolves one of them fails.",
},
"Attachments whose carrying field is gone": {
"fr": "Pièces jointes dont le champ porteur a disparu",
"en": "Attachments whose carrying field is gone",
},
"Odoo raises a KeyError merely checking them, and nothing will ever read them again.": {
"fr": "Odoo lève un KeyError rien qu'en les contrôlant, et plus rien ne les lira jamais.",
"en": "Odoo raises a KeyError merely checking them, and nothing will ever read them again.",
},
"A local database": {
"fr": "Une base de données locale",
"en": "A local database",
},
"State of the instance": {
"fr": "🩺 État de l'instance",
"en": "🩺 State of the instance",
},
"Neutralisation, scheduler, backups, queues and who is an administrator — read for the use you intend.": {
"fr": "Neutralisation, cadenceur, sauvegardes, files et qui est administrateur — lu pour l'usage que vous en faites.",
"en": "Neutralisation, scheduler, backups, queues and who is an administrator — read for the use you intend.",
},
"Several checks read tables no RPC session exposes, and the lateness of a job is computed in SQL.": {
"fr": "Plusieurs contrôles lisent des tables qu'aucune session RPC n'expose, et le retard d'une tâche se calcule en SQL.",
"en": "Several checks read tables no RPC session exposes, and the lateness of a job is computed in SQL.",
},
"A development copy (restored, neutralised)": {
"fr": "Une copie de développement (restaurée, neutralisée)",
"en": "A development copy (restored, neutralised)",
},
"An instance in service": {
"fr": "Une instance en service",
"en": "An instance in service",
},
"Anonymise a copy": {
"fr": "🎭 Anonymiser une copie",
"en": "🎭 Anonymise a copy",
},
"Replace names, texts and numbers with meaningless ones so the copy can be shared. No AI: words from a list, numbers drawn at random, written by SQL.": {
"fr": "Remplacer noms, textes et nombres par des valeurs sans intérêt, pour pouvoir partager la copie. Sans IA : des mots pris dans une liste, des nombres tirés au hasard, écrits en SQL.",
"en": "Replace names, texts and numbers with meaningless ones so the copy can be shared. No AI: words from a list, numbers drawn at random, written by SQL.",
},
"This one WRITES. It is offered only for a database you restored here — never for an instance in service.": {
"fr": "Celle-ci ÉCRIT. Elle n'est offerte que pour une base restaurée ici — jamais pour une instance en service.",
"en": "This one WRITES. It is offered only for a database you restored here — never for an instance in service.",
},
"This DESTROYS the data of": {
"fr": "Ceci DÉTRUIT les données de",
"en": "This DESTROYS the data of",
},
"there is no undo.": {
"fr": "il n'y a pas de retour en arrière.",
"en": "there is no undo.",
},
"Type the database name to confirm (empty to cancel): ": {
"fr": "Retapez le nom de la base pour confirmer (vide pour annuler) : ",
"en": "Type the database name to confirm (empty to cancel): ",
},
"Cancelled: nothing was written.": {
"fr": "Annulé : rien n'a été écrit.",
"en": "Cancelled: nothing was written.",
},
"Hybrid: the default personal-data models, adjusted": {
"fr": "Hybride : les modèles à données personnelles par défaut, ajustés",
"en": "Hybrid: the default personal-data models, adjusted",
},
"Whitelist: only the models I name": {
"fr": "Liste blanche : seulement les modèles que je nomme",
"en": "Whitelist: only the models I name",
},
"Blacklist: every model except those I name": {
"fr": "Liste noire : tous les modèles sauf ceux que je nomme",
"en": "Blacklist: every model except those I name",
},
"Models to ADD, comma separated (empty for none): ": {
"fr": "Modèles à AJOUTER, séparés par des virgules (vide pour aucun) : ",
"en": "Models to ADD, comma separated (empty for none): ",
},
"Models to EXCLUDE, comma separated: ": {
"fr": "Modèles à EXCLURE, séparés par des virgules : ",
"en": "Models to EXCLUDE, comma separated: ",
},
"A whitelist with no model would do nothing.": {
"fr": "Une liste blanche sans modèle ne ferait rien.",
"en": "A whitelist with no model would do nothing.",
},
"Python file declaring MOTS (empty for the built-in): ": {
"fr": "Fichier Python déclarant MOTS (vide pour la liste intégrée) : ",
"en": "Python file declaring MOTS (empty for the built-in): ",
},
"Nothing to anonymise with these lists.": {
"fr": "Rien à anonymiser avec ces listes.",
"en": "Nothing to anonymise with these lists.",
},
"column(s)": {
"fr": "colonne(s)",
"en": "column(s)",
},
"dry run, nothing written": {
"fr": "marche à blanc, rien n'est écrit",
"en": "dry run, nothing written",
},
"text": {
"fr": "texte",
"en": "text",
},
"numeric": {
"fr": "nombre",
"en": "numeric",
},
"translated (jsonb)": {
"fr": "traduit (jsonb)",
"en": "translated (jsonb)",
},
"unique": {
"fr": "unique",
"en": "unique",
},
"Use --apply --confirm <database> to write.": {
"fr": "Utiliser --apply --confirm <base> pour écrire.",
"en": "Use --apply --confirm <database> to write.",
},
"Replace the data of a COPY with meaningless data.": {
"fr": "Remplacer les données d'une COPIE par des données sans intérêt.",
"en": "Replace the data of a COPY with meaningless data.",
},
"comma separated, adds to the mode": {
"fr": "séparés par des virgules, s'ajoutent au mode",
"en": "comma separated, adds to the mode",
},
"comma separated, removed from it": {
"fr": "séparés par des virgules, retirés du mode",
"en": "comma separated, removed from it",
},
"python file declaring MOTS": {
"fr": "fichier python déclarant MOTS",
"en": "python file declaring MOTS",
},
"repeat the database name; --apply refuses without it": {
"fr": "répéter le nom de la base ; --apply refuse sans lui",
"en": "repeat the database name; --apply refuses without it",
},
"Refusing to write: --confirm must repeat": {
"fr": "Écriture refusée : --confirm doit répéter",
"en": "Refusing to write: --confirm must repeat",
},
"Nothing was written:": {
"fr": "Rien n'a été écrit :",
"en": "Nothing was written:",
},
"This file declares no MOTS:": {
"fr": "Ce fichier ne déclare aucun MOTS :",
"en": "This file declares no MOTS:",
},
"Unknown mode:": {
"fr": "Mode inconnu :",
"en": "Unknown mode:",
},
}
def get_lang() -> str:
global _current_lang
if _current_lang is not None:
return _current_lang
# 1. Check env_var.sh file
if os.path.exists(ENV_VAR_FILE):
try:
with open(ENV_VAR_FILE) as f:
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
def set_lang(lang: str) -> None:
global _current_lang
_current_lang = lang
# Persist to env_var.sh
if os.path.exists(ENV_VAR_FILE):
try:
with open(ENV_VAR_FILE) as f:
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"
with open(ENV_VAR_FILE, "w") as f:
f.write(content)
def lang_is_configured() -> bool:
"""Check if a language has been explicitly set."""
if os.path.exists(ENV_VAR_FILE):
try:
with open(ENV_VAR_FILE) as f:
content = f.read()
return bool(re.search(r"^EL_LANG=", content, re.MULTILINE))
except OSError:
pass
return False
def t(key: str) -> str:
entry = TRANSLATIONS.get(key)
if entry is None:
return key
lang = get_lang()
return entry.get(lang, entry.get("fr", key))