mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-29 14:45:24 +00:00
* fix(sso): send the PKCE verifier for GitHub login (#1534) * fix(remote-desktop): clip cursor overflow without disabling zoom (#1535) * test(remote-desktop): preserve sessions beyond one hour (#1536) * fix(hosts): expose controls for overflowing editor tabs (#1537) * fix(hosts): expose controls for overflowing editor tabs * test(hosts): mock resize observation in admin panel tests * fix(status): skip TCP probes while host sessions are active (#1538) * fix(database): batch session activity persistence (#1539) * docs(api): describe cookie and API key authentication (#1540) * fix(snippets): repair missing note column on SQLite upgrades (#1541) * fix(docker): retain stored SSH credential association (#1543) * fix(file-manager): render transfer toasts without plugin hooks (#1546) * feat(hosts): keep compact row actions inline (#1547) * fix(auth): allow retrying unavailable second-factor interfaces (#1549) * fix(auth): reject unresolved legacy identity provisioning (#1550) * fix(desktop): ship the plugin SDK inside Mac App Store builds (#1551) * fix(tmux): pass full session info to the terminal's session picker (#1552) The tmux.sessions service reduced detected sessions to bare names, but the picker reads session.name, so every entry rendered blank and selecting one sent an empty name, which created a new session instead of attaching. * fix(ssh): read force keyboard-interactive as a boolean when resolving hosts (#1553) The column holds the text "true"/"false", and the resolver passed it through as-is. The string "false" is truthy, so the password provider treated every saved host as forced keyboard-interactive and left the password out. Jump hops are built straight from the resolved host, so a password hop whose server doesn't offer keyboard-interactive failed with "All configured authentication methods failed". * fix(database): batch database saves for bulk host writes (#1554) * fix(database): yield to the event loop between database saves Each SQLite save serializes and encrypts the whole database into new buffers, which V8 only releases once the event loop turns. Boot migrations and bulk host import write plugin settings per host and per key in an awaited loop, so hundreds of full copies piled up and the container ran out of memory. * fix(database): save once per bulk host write instead of once per row On SQLite every repository write force-saves the whole database. Boot plugin data migrations, host defaults materialization and the bulk host routes write one row per host per setting, so they serialized and encrypted the full database hundreds of times in a row. DatabaseSaveTrigger.batched wraps a function so force saves made while it runs collapse into a single save when it finishes. Nested scopes fold into the outer one, and work that outlives its scope saves normally. * feat(hosts): add instance-wide predefined tag suggestions (#1548) * feat(hosts): add shared predefined tag suggestions * style(hosts): format tag catalog routes * test(database): advance fake timers past the save yield (#1555) * fix(i18n): complete Simplified Chinese core and plugin translations (#1542) * fix(i18n): complete Chinese onboarding and navigation labels * fix(i18n): translate remaining Chinese core and plugin interfaces * fix(i18n): translate host editor tab overflow controls * fix(i18n): use consistent Chinese fleet terminology * fix(i18n): localize hardcoded controls and plugin views * fix(i18n): translate built-in homepage widget catalog * test(homepage): follow translated timezone placeholder * fix(i18n): translate plugin-provided homepage widgets * fix(i18n): localize feature settings section titles * fix: 2.8 oidc accounts unable to sign in after upgrading (#1381) * fix: plugins losing the saved ssh login when copying a host (#1391) * fix: fleets, proxmox and automations not getting the host sudo password * fix: host imports running a defaults pass and metrics restart per host (#1384) * fix: high cpu from status probes and full database saves on every sample (#1300) * fix: user data export freezing the server (#1393) * fix: op:// secret references rejected as ssh keys on credentials (#1394) * fix: slow file deletes from the trash lookups on every delete (#1390) * fix: add openapi docs and error handling to host tag routes * test: compare download stream buffers directly so it stops timing out * chore: drop em dash from host row comment * chore: update release notes for 2.9.1 * fix: restore space to add host tags and redesign predefined tags editor * fix: host key silently accepted when the host is missing from the database (#1397) * fix: clearer host login failed status label and fix its translations (#1396) * chore: add host key and status label fixes to release notes * fix: sso and ldap provider dialogs overflowing the screen and using mismatched toggles * chore: increment ver * fix(audit): store plugin entries with no acting user as a null user_id (#1556) Plugin audit entries written outside a request used the literal "system" as user_id. That column references users.id, so the insert was refused (Postgres logs it as an FK violation) and the entry was silently dropped. Write null instead and keep "system" / plugin:<id> in username. * chore: add sso/ldap dialog and audit log fixes to release notes * fix: tunnels and host settings missing from shared hosts on desktop * fix: remote desktop logins missing from shared hosts on desktop * fix: simplify host status to online/offline and keep it live without a refresh * chore: sync Crowdin translations for 2.9.1 --------- Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
239 lines
11 KiB
JSON
239 lines
11 KiB
JSON
{
|
||
"nav": {
|
||
"snippets": "Extraits"
|
||
},
|
||
"onboarding": {
|
||
"feature_snippets": "Snippets",
|
||
"feature_snippets_desc": "Enregistrez les commandes que vous exécutez fréquemment et envoyez-les à un terminal en un seul clic."
|
||
},
|
||
"permissions": {
|
||
"view": {
|
||
"title": "Voir des extraits",
|
||
"description": "Consultez vos propres extraits, notes et extraits partagés."
|
||
},
|
||
"create": {
|
||
"title": "Créer des extraits",
|
||
"description": "Créez de nouveaux extraits, notes et dossiers."
|
||
},
|
||
"edit": {
|
||
"title": "Modifier des extraits",
|
||
"description": "Renommer ou modifier les extraits et dossiers existants."
|
||
},
|
||
"delete": {
|
||
"title": "Supprimer des extraits",
|
||
"description": "Supprimer les extraits et les dossiers."
|
||
},
|
||
"share": {
|
||
"title": "Extraits de partage",
|
||
"description": "Partagez des extraits de code et des dossiers avec d'autres utilisateurs ou rôles."
|
||
}
|
||
},
|
||
"settings": {
|
||
"foldersCollapsed": {
|
||
"label": "Réduire les dossiers par défaut",
|
||
"description": "Chaque dossier d'extraits de code doit être réduit au démarrage lorsque vous ouvrez le panneau Extraits de code."
|
||
},
|
||
"showCommands": {
|
||
"label": "Afficher les commandes",
|
||
"description": "Afficher la première ligne de la commande de chaque extrait sous son nom."
|
||
},
|
||
"confirmExecution": {
|
||
"label": "Veuillez confirmer avant d'exécuter",
|
||
"description": "Demandez la permission avant d'exécuter un extrait de commande dans un terminal."
|
||
}
|
||
},
|
||
"cancel": "Annuler",
|
||
"loading": "Chargement...",
|
||
"searchPlaceholder": "Rechercher des snippets",
|
||
"newFolder": "Nouveau dossier",
|
||
"newSnippet": "Nouvel extrait",
|
||
"noFolder": "Aucun dossier",
|
||
"noSnippetsInFolder": "Aucun snippet dans ce dossier",
|
||
"noTerminalTabsOpen": "Aucun onglet de terminal n'est ouvert.",
|
||
"run": "Exécuter",
|
||
"pasteToTerminal": "Coller dans le terminal",
|
||
"copySuccess": "Copié dans le presse-papiers.",
|
||
"importExport": "Importer / Exporter",
|
||
"importFailed": "Échec de l’importation des snippets",
|
||
"nameLabel": "Nom",
|
||
"namePlaceholder": "Nom du snippet",
|
||
"descriptionLabel": "Description",
|
||
"descriptionPlaceholder": "Description facultative",
|
||
"folderLabel": "Dossier",
|
||
"typeLabel": "Type",
|
||
"typeCommand": "Commande",
|
||
"typeNote": "Note",
|
||
"commandLabel": "Commande",
|
||
"commandPlaceholder": "Commande à exécuter, par exemple systemctl status $HOST",
|
||
"noteLabel": "Note",
|
||
"notePlaceholder": "Texte à coller dans le terminal",
|
||
"createSnippetTitle": "Créer un extrait",
|
||
"createSnippetButton": "Créer un extrait",
|
||
"createSuccess": "Extrait créé",
|
||
"createFailed": "Échec de la création du snippet",
|
||
"editSnippetTitle": "Modifier l'extrait",
|
||
"saveSnippetButton": "Enregistrer l'extrait",
|
||
"updateSuccess": "Extrait mis à jour",
|
||
"updateFailed": "Échec de la mise à jour du snippet",
|
||
"deleteFailed": "Échec de la suppression du snippet",
|
||
"createFolderTitle": "Créer un dossier",
|
||
"createFolderButton": "Créer un dossier",
|
||
"folderCreateSuccess": "Dossier créé",
|
||
"folderCreateFailed": "Échec de la création du dossier",
|
||
"editFolderTitle": "Modifier le dossier",
|
||
"saveFolderButton": "Enregistrer le dossier",
|
||
"folderEditSuccess": "Dossier mis à jour",
|
||
"folderEditFailed": "Échec de la mise à jour du dossier",
|
||
"folderNameLabel": "Nom du dossier",
|
||
"folderNamePlaceholder": "Nom du dossier",
|
||
"folderIconLabel": "Icône",
|
||
"folderDeleteSuccess": "Dossier supprimé",
|
||
"folderDeleteFailed": "Échec de la suppression du dossier",
|
||
"confirmRunMessage": "Exécuter « {{name}} » ?",
|
||
"confirmRunButton": "Exécuter",
|
||
"runSuccess": "Exécution de «{{name}}» sur le(s) terminal(s) {{count}}",
|
||
"pasteSuccess": "Collé \"{{name}}\" dans le(s) terminal(s) {{count}}",
|
||
"admin": {
|
||
"tabTitle": "Snippets",
|
||
"count": "{{count}} snippets",
|
||
"add": "Ajouter un snippet",
|
||
"namePlaceholder": "Nom du snippet",
|
||
"contentPlaceholder": "Contenu de la commande",
|
||
"folderPlaceholder": "Dossier (optionnel)",
|
||
"empty": "Cet utilisateur n'a aucun snippet",
|
||
"deleteConfirm": "Supprimer le snippet \"{{name}}\" appartenant à {{username}} ?",
|
||
"deleted": "Snippet supprimé",
|
||
"deleteFailed": "Échec de la suppression du snippet",
|
||
"requiredFields": "Le nom et le contenu du snippet sont requis",
|
||
"saved": "Snippet enregistré",
|
||
"saveFailed": "Échec de l'enregistrement du snippet",
|
||
"saving": "Enregistrement…",
|
||
"save": "Enregistrer"
|
||
},
|
||
"backToSnippets": "Retour aux extraits",
|
||
"settingsTitle": "Paramètres de l'extrait",
|
||
"settingsDisplayTitle": "Afficher",
|
||
"settingsBehaviorTitle": "Comportement",
|
||
"typeCommandHint": "S'exécute dans le terminal actif.",
|
||
"typeNoteHint": "Coller dans le terminal actif sans exécuter de commande.",
|
||
"variablesHint": "Variables : $HOST, $USER, $PORT, $NAME, ${INPUT_1:Label}",
|
||
"doubleClickToRun": "Double-cliquez pour exécuter",
|
||
"sharedBadge": "Partagé",
|
||
"copyToClipboard": "Copier dans le presse-papiers",
|
||
"copyFailed": "Échec de la copie dans le presse-papiers.",
|
||
"moreOptions": "Plus d'options",
|
||
"moreActions": "Plus d'actions",
|
||
"moveToFolder": "Déplacer vers le dossier",
|
||
"deleteSnippet": "Supprimer l'extrait",
|
||
"deleteSnippetConfirm": "Supprimer l'extrait \"{{name}}\"?",
|
||
"deleteSuccess": "Snippet supprimé",
|
||
"delete": "Supprimer",
|
||
"folderActions": "Actions sur le dossier",
|
||
"addSnippetHere": "Nouvel extrait ici",
|
||
"deleteFolder": "Supprimer le dossier",
|
||
"deleteFolderConfirm": "Supprimer le dossier «{{name}}» ? Ses extraits seront déplacés hors du dossier.",
|
||
"createFolderDescription": "Regroupez les extraits similaires.",
|
||
"editFolderDescription": "Modifiez le nom, la couleur ou l'icône de ce dossier.",
|
||
"folderColorLabel": "Couleur",
|
||
"loadFailed": "Échec du chargement des extraits",
|
||
"importSkipExisting": "Importer (ignorer existants)",
|
||
"importOverwrite": "Importer (écraser l'existant)",
|
||
"importInvalidFile": "Ce fichier n'est pas une exportation de fragments valide",
|
||
"importSuccess": "Importé {{imported}}, mis à jour {{updated}}, ignoré {{skipped}}",
|
||
"exportSnippets": "Extraits d'exportation",
|
||
"exportSuccess": "Extraits exportés",
|
||
"exportFailed": "Échec de l’exportation des snippets",
|
||
"expandAll": "Développer tous les dossiers",
|
||
"collapseAll": "Réduire tous les dossiers",
|
||
"docsLink": "Documentation",
|
||
"clearSearch": "Recherche propre",
|
||
"noSearchResults": "Aucun extrait ne correspond à votre recherche",
|
||
"emptyTitle": "Aucun extrait pour l'instant",
|
||
"emptyDescription": "Enregistrez les commandes que vous exécutez fréquemment, puis exécutez-les dans un terminal en un seul clic.",
|
||
"shareSnippet": "Extrait de partage",
|
||
"shareFolder": "Dossier partagé",
|
||
"shareExpiry": "Expiration",
|
||
"shareExpiryOptions": {
|
||
"h0": "Jamais",
|
||
"h1": "Dans 1 heure",
|
||
"h24": "En 1 jour",
|
||
"h168": "Dans 7 jours",
|
||
"h720": "En 30 jours"
|
||
},
|
||
"shareButton": "Partager",
|
||
"shareSuccess": "Partagé avec {{count}}",
|
||
"shareFailed": "Échec du partage",
|
||
"shareLoadFailed": "Impossible de charger les détails de partage",
|
||
"currentAccess": "Accès actuel",
|
||
"notSharedYet": "Pas encore partagé avec qui que ce soit",
|
||
"revokeAccess": "Révoquer",
|
||
"revokeSuccess": "Accès révoqué",
|
||
"revokeFailed": "Échec de la révocation de l’accès",
|
||
"close": "Fermer",
|
||
"targetHostsLabel": "hôtes cibles",
|
||
"targetHostsHint": "Sélectionnez les hôtes sur lesquels exécuter directement cette commande, sans terminal ouvert. Laissez ce champ vide pour l'exécuter dans le terminal actif.",
|
||
"clearTargetHosts": "Effacer",
|
||
"noHostsAvailable": "Aucun hôte disponible",
|
||
"searchHosts": "Rechercher des hôtes",
|
||
"runOnTargets": "Exécuter sur les hôtes cibles",
|
||
"executionResultTitle": "Résultats pour \"{{name}}\"",
|
||
"executionResultDescription": "Sortie de chaque hôte cible.",
|
||
"executionSuccess": "Succès",
|
||
"executionFailed": "Échec",
|
||
"directRunSuccess": "« {{name}} » exécuté sur {{count}} hôte(s)",
|
||
"directRunPartialFail": "\"{{name}}\" a échoué sur certains hôtes",
|
||
"reorderFailed": "Impossible de réorganiser les extraits",
|
||
"dropToRemoveFromFolder": "Déposez ici pour sortir du dossier",
|
||
"shareSnippetTitle": "Partager \"{{name}}\"",
|
||
"shareFolderTitle": "Dossier partagé \"{{name}}\"",
|
||
"shareWith": "Partager avec",
|
||
"usersTab": "Utilisateurs",
|
||
"rolesTab": "Rôles",
|
||
"shareSearchPlaceholder": "Rechercher des utilisateurs ou des rôles",
|
||
"shareNoMatches": "Aucun résultat",
|
||
"shareWithCount": "Partager avec {{count}}",
|
||
"shareFolderHint": "Partage tous les extraits de code contenus dans ce dossier. Les extraits ajoutés ultérieurement ne sont pas partagés automatiquement.",
|
||
"shareFolderSummary": "Extrait(s) partagé(s) {{count}} dans ce dossier",
|
||
"grantedBy": "Accordé par",
|
||
"expired": "Expiré",
|
||
"variablesDialogTitle": "Exécutez \"{{name}}\"",
|
||
"variablesDialogDescription": "Renseignez les valeurs nécessaires à cet extrait de code avant de l'exécuter.",
|
||
"variablesPreviewLabel": "Aperçu",
|
||
"variablesConfirmButton": "Exécuter",
|
||
"keybindings": {
|
||
"runSnippet": "Exécuter l'extrait de code existant",
|
||
"snippetLabel": "Fragment",
|
||
"selectSnippet": "Sélectionnez un extrait",
|
||
"snippetMissing": "extrait introuvable",
|
||
"snippetRequired": "Sélectionnez un extrait"
|
||
},
|
||
"paletteHintRun": "Exécuter dans l'onglet du terminal actif",
|
||
"host": {
|
||
"startupTitle": "Extrait de démarrage",
|
||
"quickActionsTitle": "Actions rapides",
|
||
"quickActionsDescription": "Les actions rapides apparaissent sous forme de boutons dans la barre d'outils Métriques de l'hôte pour une exécution en un clic.",
|
||
"noQuickActions": "Aucune action rapide pour le moment.",
|
||
"buttonLabel": "Étiquette du bouton",
|
||
"selectSnippet": "Sélectionner un snippet...",
|
||
"addQuickAction": "Ajouter une action",
|
||
"tabTitle": "Snippets",
|
||
"startupDescription": "S'exécute dans le terminal à chaque connexion à cet hôte. Les variables telles que $HOST sont renseignées ; la partie du code demandant des entrées est ignorée.",
|
||
"none": "Aucune",
|
||
"removeQuickAction": "Supprimer l'action rapide"
|
||
},
|
||
"quickActions": {
|
||
"running": "Exécution de {{name}}...",
|
||
"succeeded": "{{name}} terminé avec succès",
|
||
"failed": "Échec de {{name}}",
|
||
"error": "Échec de l'exécution de {{name}}"
|
||
},
|
||
"paletteHintPaste": "Collez dans l'onglet du terminal actif",
|
||
"targetTerminals": "Courir",
|
||
"targetTerminalsHint": "facultatif, sinon l'onglet actif",
|
||
"selectAll": "Tout",
|
||
"selectNone": "Aucune",
|
||
"plugin": {
|
||
"name": "Snippets"
|
||
}
|
||
}
|