mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-30 15:15: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
10 KiB
JSON
239 lines
10 KiB
JSON
{
|
|
"nav": {
|
|
"snippets": "Fragmenten"
|
|
},
|
|
"onboarding": {
|
|
"feature_snippets": "Fragmenten",
|
|
"feature_snippets_desc": "Sla de commando's die je vaak gebruikt op en stuur ze met één klik naar een terminal."
|
|
},
|
|
"permissions": {
|
|
"view": {
|
|
"title": "Bekijk fragmenten",
|
|
"description": "Bekijk je eigen fragmenten, notities en gedeelde fragmenten."
|
|
},
|
|
"create": {
|
|
"title": "Maak codefragmenten aan.",
|
|
"description": "Maak nieuwe fragmenten, notities en mappen aan."
|
|
},
|
|
"edit": {
|
|
"title": "Bewerk fragmenten",
|
|
"description": "Hernoem of wijzig bestaande codefragmenten en mappen."
|
|
},
|
|
"delete": {
|
|
"title": "Verwijder fragmenten",
|
|
"description": "Verwijder fragmenten en mappen."
|
|
},
|
|
"share": {
|
|
"title": "Deel fragmenten",
|
|
"description": "Deel fragmenten en mappen met andere gebruikers of rollen."
|
|
}
|
|
},
|
|
"settings": {
|
|
"foldersCollapsed": {
|
|
"label": "Mappen standaard inklappen",
|
|
"description": "Wanneer u het paneel 'Snippets' opent, wordt elke map met codefragmenten standaard ingeklapt weergegeven."
|
|
},
|
|
"showCommands": {
|
|
"label": "Toon commando's",
|
|
"description": "Toon de eerste regel van de opdracht van elk codefragment onder de naam ervan."
|
|
},
|
|
"confirmExecution": {
|
|
"label": "Controleer voordat u begint.",
|
|
"description": "Vraag toestemming voordat een commandofragment in een terminal wordt uitgevoerd."
|
|
}
|
|
},
|
|
"cancel": "Annuleren",
|
|
"loading": "Laden...",
|
|
"searchPlaceholder": "Zoekfragmenten",
|
|
"newFolder": "Nieuwe map",
|
|
"newSnippet": "Nieuw fragment",
|
|
"noFolder": "Geen map",
|
|
"noSnippetsInFolder": "Geen codefragmenten in deze map",
|
|
"noTerminalTabsOpen": "Er is geen terminaltabblad geopend",
|
|
"run": "Loop",
|
|
"pasteToTerminal": "Plak in de terminal",
|
|
"copySuccess": "Gekopieerd naar het klembord",
|
|
"importExport": "Import/Export",
|
|
"importFailed": "Het importeren van codefragmenten is mislukt.",
|
|
"nameLabel": "Naam",
|
|
"namePlaceholder": "Fragmentnaam",
|
|
"descriptionLabel": "Beschrijving",
|
|
"descriptionPlaceholder": "Optionele beschrijving",
|
|
"folderLabel": "Map",
|
|
"typeLabel": "Type",
|
|
"typeCommand": "Commando",
|
|
"typeNote": "Opmerking",
|
|
"commandLabel": "Commando",
|
|
"commandPlaceholder": "Commando om uit te voeren, bijvoorbeeld systemctl status $HOST",
|
|
"noteLabel": "Opmerking",
|
|
"notePlaceholder": "Tekst om in de terminal te plakken",
|
|
"createSnippetTitle": "Maak een codefragment aan",
|
|
"createSnippetButton": "Maak een codefragment aan",
|
|
"createSuccess": "Fragment gemaakt",
|
|
"createFailed": "Het is niet gelukt om een codefragment te maken.",
|
|
"editSnippetTitle": "Bewerk fragment",
|
|
"saveSnippetButton": "Bewaar fragment",
|
|
"updateSuccess": "Fragment bijgewerkt",
|
|
"updateFailed": "Het bijwerken van het codefragment is mislukt.",
|
|
"deleteFailed": "Het verwijderen van het fragment is mislukt.",
|
|
"createFolderTitle": "Map aanmaken",
|
|
"createFolderButton": "Map aanmaken",
|
|
"folderCreateSuccess": "Map aangemaakt",
|
|
"folderCreateFailed": "Map aanmaken mislukt",
|
|
"editFolderTitle": "Map bewerken",
|
|
"saveFolderButton": "Map opslaan",
|
|
"folderEditSuccess": "Map bijgewerkt",
|
|
"folderEditFailed": "Het bijwerken van de map is mislukt.",
|
|
"folderNameLabel": "Mapnaam",
|
|
"folderNamePlaceholder": "Mapnaam",
|
|
"folderIconLabel": "Icon",
|
|
"folderDeleteSuccess": "Map verwijderd",
|
|
"folderDeleteFailed": "Map verwijderen mislukt",
|
|
"confirmRunMessage": "Run \"{{name}}\"?",
|
|
"confirmRunButton": "Loop",
|
|
"runSuccess": "Voerde \"{{name}}\" uit op {{count}} terminal(s)",
|
|
"pasteSuccess": "\"{{name}}\" is geplakt in de terminal(s) {{count}}",
|
|
"admin": {
|
|
"tabTitle": "Fragmenten",
|
|
"count": "{{count}} fragmenten",
|
|
"add": "Voeg codefragment toe",
|
|
"namePlaceholder": "Fragmentnaam",
|
|
"contentPlaceholder": "Opdrachtinhoud",
|
|
"folderPlaceholder": "Map (optioneel)",
|
|
"empty": "Deze gebruiker heeft geen codefragmenten.",
|
|
"deleteConfirm": "Verwijder het fragment \"{{name}}\" dat bij {{username}} hoort.",
|
|
"deleted": "Fragment verwijderd",
|
|
"deleteFailed": "Het verwijderen van het fragment is mislukt.",
|
|
"requiredFields": "De naam en inhoud van het codefragment zijn verplicht.",
|
|
"saved": "Fragment opgeslagen",
|
|
"saveFailed": "Het opslaan van het codefragment is mislukt.",
|
|
"saving": "Besparing...",
|
|
"save": "Redden"
|
|
},
|
|
"backToSnippets": "Terug naar fragmenten",
|
|
"settingsTitle": "Snippet-instellingen",
|
|
"settingsDisplayTitle": "Weergave",
|
|
"settingsBehaviorTitle": "Gedrag",
|
|
"typeCommandHint": "Wordt uitgevoerd in de actieve terminal.",
|
|
"typeNoteHint": "Plakt in de actieve terminal zonder deze uit te voeren.",
|
|
"variablesHint": "Variabelen: $HOST, $USER, $PORT, $NAME, ${INPUT_1:Label}",
|
|
"doubleClickToRun": "Dubbelklik om te starten",
|
|
"sharedBadge": "Gedeeld",
|
|
"copyToClipboard": "Kopiëren naar het klembord",
|
|
"copyFailed": "Kopiëren naar klembord mislukt",
|
|
"moreOptions": "Meer opties",
|
|
"moreActions": "Meer acties",
|
|
"moveToFolder": "Verplaatsen naar map",
|
|
"deleteSnippet": "Verwijder fragment",
|
|
"deleteSnippetConfirm": "Verwijder fragment \"{{name}}\"?",
|
|
"deleteSuccess": "Fragment verwijderd",
|
|
"delete": "Verwijderen",
|
|
"folderActions": "Mapacties",
|
|
"addSnippetHere": "Nieuw fragment hier",
|
|
"deleteFolder": "Map verwijderen",
|
|
"deleteFolderConfirm": "Map \"{{name}}\" verwijderen? De fragmenten ervan worden uit de map verplaatst.",
|
|
"createFolderDescription": "Groepeer verwante fragmenten bij elkaar.",
|
|
"editFolderDescription": "Wijzig de naam, kleur of het pictogram van deze map.",
|
|
"folderColorLabel": "Kleur",
|
|
"loadFailed": "Het laden van codefragmenten is mislukt.",
|
|
"importSkipExisting": "Importeren (bestaande overslaan)",
|
|
"importOverwrite": "Importeren (bestaande overschrijven)",
|
|
"importInvalidFile": "Dat bestand is geen geldige codefragmentexport.",
|
|
"importSuccess": "Geïmporteerd {{imported}}, bijgewerkt {{updated}}, overgeslagen {{skipped}}",
|
|
"exportSnippets": "Exporteer fragmenten",
|
|
"exportSuccess": "Uittreksels geëxporteerd",
|
|
"exportFailed": "Het exporteren van codefragmenten is mislukt.",
|
|
"expandAll": "Vouw alle mappen uit",
|
|
"collapseAll": "Alle mappen inklappen",
|
|
"docsLink": "Documentatie",
|
|
"clearSearch": "Zoekopdracht wissen",
|
|
"noSearchResults": "Er zijn geen resultaten gevonden die overeenkomen met uw zoekopdracht.",
|
|
"emptyTitle": "Nog geen fragmenten beschikbaar",
|
|
"emptyDescription": "Sla de commando's die je vaak gebruikt op, zodat je ze vervolgens met één klik in een terminal kunt uitvoeren.",
|
|
"shareSnippet": "Deel fragment",
|
|
"shareFolder": "Map delen",
|
|
"shareExpiry": "Verloopt",
|
|
"shareExpiryOptions": {
|
|
"h0": "Nooit",
|
|
"h1": "Over 1 uur",
|
|
"h24": "Binnen 1 dag",
|
|
"h168": "Over 7 dagen",
|
|
"h720": "Over 30 dagen"
|
|
},
|
|
"shareButton": "Deel",
|
|
"shareSuccess": "Gedeeld met {{count}}",
|
|
"shareFailed": "Delen mislukt",
|
|
"shareLoadFailed": "Het laden van de deelgegevens is mislukt.",
|
|
"currentAccess": "Huidige toegang",
|
|
"notSharedYet": "Nog met niemand gedeeld",
|
|
"revokeAccess": "Herroepen",
|
|
"revokeSuccess": "Toegang ingetrokken",
|
|
"revokeFailed": "Toegang intrekken is mislukt",
|
|
"close": "Dichtbij",
|
|
"targetHostsLabel": "Doelwithosts",
|
|
"targetHostsHint": "Selecteer de hosts waarop u deze opdracht direct wilt uitvoeren, zonder dat er een terminal open is. Laat dit veld leeg om de opdracht in de actieve terminal uit te voeren.",
|
|
"clearTargetHosts": "Duidelijk",
|
|
"noHostsAvailable": "Geen hosts beschikbaar",
|
|
"searchHosts": "Zoek hosts",
|
|
"runOnTargets": "Uitvoeren op doelhosts",
|
|
"executionResultTitle": "Resultaten voor \"{{name}}\"",
|
|
"executionResultDescription": "Uitvoer van elke doelhost.",
|
|
"executionSuccess": "Succes",
|
|
"executionFailed": "Mislukt",
|
|
"directRunSuccess": "Voerde \"{{name}}\" uit op {{count}} host(s)",
|
|
"directRunPartialFail": "\"{{name}}\" is op sommige hosts mislukt.",
|
|
"reorderFailed": "Het is niet gelukt om de fragmenten opnieuw te ordenen.",
|
|
"dropToRemoveFromFolder": "Sleep hierheen om de map te verlaten.",
|
|
"shareSnippetTitle": "Delen \"{{name}}\"",
|
|
"shareFolderTitle": "Map delen \"{{name}}\"",
|
|
"shareWith": "Delen met",
|
|
"usersTab": "Gebruikers",
|
|
"rolesTab": "Rollen",
|
|
"shareSearchPlaceholder": "Zoek gebruikers of rollen",
|
|
"shareNoMatches": "Geen overeenkomsten",
|
|
"shareWithCount": "Delen met {{count}}",
|
|
"shareFolderHint": "Deelt alle codefragmenten in deze map. Later toegevoegde fragmenten worden niet automatisch gedeeld.",
|
|
"shareFolderSummary": "Gedeelde {{count}} fragment(en) in deze map",
|
|
"grantedBy": "Toegekend door",
|
|
"expired": "Verlopen",
|
|
"variablesDialogTitle": "Uitvoeren \"{{name}}\"",
|
|
"variablesDialogDescription": "Vul de waarden in die dit codefragment nodig heeft voordat je het uitvoert.",
|
|
"variablesPreviewLabel": "Voorbeeld",
|
|
"variablesConfirmButton": "Loop",
|
|
"keybindings": {
|
|
"runSnippet": "Voer het bestaande codefragment uit.",
|
|
"snippetLabel": "Fragment",
|
|
"selectSnippet": "Selecteer een fragment",
|
|
"snippetMissing": "fragment niet gevonden",
|
|
"snippetRequired": "Selecteer een fragment"
|
|
},
|
|
"paletteHintRun": "Voer dit uit in het actieve terminaltabblad.",
|
|
"host": {
|
|
"startupTitle": "Opstartfragment",
|
|
"quickActionsTitle": "Snelle acties",
|
|
"quickActionsDescription": "Snelle acties verschijnen als knoppen in de Host Metrics-werkbalk, zodat u opdrachten met één klik kunt uitvoeren.",
|
|
"noQuickActions": "Nog geen snelle acties ondernomen.",
|
|
"buttonLabel": "Knoplabel",
|
|
"selectSnippet": "Selecteer fragment...",
|
|
"addQuickAction": "Actie toevoegen",
|
|
"tabTitle": "Fragmenten",
|
|
"startupDescription": "Wordt elke keer dat er verbinding wordt gemaakt met deze host in de terminal uitgevoerd. Variabelen zoals $HOST worden ingevuld; een codefragment dat om invoer vraagt, wordt overgeslagen.",
|
|
"none": "Geen",
|
|
"removeQuickAction": "Verwijder de snelle actie"
|
|
},
|
|
"quickActions": {
|
|
"running": "Het uitvoeren van {{name}}...",
|
|
"succeeded": "{{name}} succesvol voltooid",
|
|
"failed": "{{name}} mislukt",
|
|
"error": "Het uitvoeren van {{name}} is mislukt."
|
|
},
|
|
"paletteHintPaste": "Plak dit in het actieve terminaltabblad.",
|
|
"targetTerminals": "Ren binnen",
|
|
"targetTerminalsHint": "optioneel, anders het actieve tabblad",
|
|
"selectAll": "Alle",
|
|
"selectNone": "Geen",
|
|
"plugin": {
|
|
"name": "Snippets"
|
|
}
|
|
}
|