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
10 KiB
JSON
239 lines
10 KiB
JSON
{
|
|
"nav": {
|
|
"snippets": "Snippety"
|
|
},
|
|
"onboarding": {
|
|
"feature_snippets": "Snippety",
|
|
"feature_snippets_desc": "Zapisuj często uruchamiane polecenia i wysyłaj je do terminala jednym kliknięciem."
|
|
},
|
|
"permissions": {
|
|
"view": {
|
|
"title": "Wyświetl fragmenty",
|
|
"description": "Zobacz własne fragmenty, notatki i udostępnione fragmenty."
|
|
},
|
|
"create": {
|
|
"title": "Utwórz fragmenty kodu",
|
|
"description": "Utwórz nowe fragmenty kodu, notatki i foldery."
|
|
},
|
|
"edit": {
|
|
"title": "Edytuj fragmenty",
|
|
"description": "Zmień nazwę lub zmodyfikuj istniejące fragmenty kodu i foldery."
|
|
},
|
|
"delete": {
|
|
"title": "Usuń fragmenty",
|
|
"description": "Usuń fragmenty kodu i foldery."
|
|
},
|
|
"share": {
|
|
"title": "Udostępnij fragmenty",
|
|
"description": "Udostępniaj fragmenty kodu i foldery innym użytkownikom lub rolom."
|
|
}
|
|
},
|
|
"settings": {
|
|
"foldersCollapsed": {
|
|
"label": "Domyślnie zwiń foldery",
|
|
"description": "Każdy folder fragmentów kodu powinien być zwinięty po otwarciu panelu Fragmenty kodu."
|
|
},
|
|
"showCommands": {
|
|
"label": "Pokaż polecenia",
|
|
"description": "Wyświetl pierwszy wiersz polecenia każdego fragmentu kodu pod jego nazwą."
|
|
},
|
|
"confirmExecution": {
|
|
"label": "Potwierdź przed uruchomieniem",
|
|
"description": "Zapytaj przed uruchomieniem fragmentu polecenia w terminalu."
|
|
}
|
|
},
|
|
"cancel": "Anuluj",
|
|
"loading": "Ładowanie...",
|
|
"searchPlaceholder": "Wyszukaj snippety",
|
|
"newFolder": "Nowy folder",
|
|
"newSnippet": "Nowy fragment kodu",
|
|
"noFolder": "Brak folderu",
|
|
"noSnippetsInFolder": "Brak snippetów w tym folderze",
|
|
"noTerminalTabsOpen": "Żadna zakładka terminala nie jest otwarta",
|
|
"run": "Uruchom",
|
|
"pasteToTerminal": "Wklej do terminala",
|
|
"copySuccess": "Skopiowano do schowka",
|
|
"importExport": "Import/Eksport",
|
|
"importFailed": "Nie udało się zaimportować snippetów",
|
|
"nameLabel": "Nazwa",
|
|
"namePlaceholder": "Nazwa snippetu",
|
|
"descriptionLabel": "Opis",
|
|
"descriptionPlaceholder": "Opis opcjonalny",
|
|
"folderLabel": "Folder",
|
|
"typeLabel": "Typ",
|
|
"typeCommand": "Polecenie",
|
|
"typeNote": "Notatka",
|
|
"commandLabel": "Polecenie",
|
|
"commandPlaceholder": "Polecenie do uruchomienia, np. systemctl status $HOST",
|
|
"noteLabel": "Notatka",
|
|
"notePlaceholder": "Tekst do wklejenia do terminala",
|
|
"createSnippetTitle": "Utwórz fragment kodu",
|
|
"createSnippetButton": "Utwórz fragment kodu",
|
|
"createSuccess": "Utworzono fragment kodu",
|
|
"createFailed": "Nie udało się utworzyć snippetu",
|
|
"editSnippetTitle": "Edytuj fragment",
|
|
"saveSnippetButton": "Zapisz fragment kodu",
|
|
"updateSuccess": "Zaktualizowano fragment kodu",
|
|
"updateFailed": "Nie udało się zaktualizować snippetu",
|
|
"deleteFailed": "Nie udało się usunąć snippetu",
|
|
"createFolderTitle": "Utwórz folder",
|
|
"createFolderButton": "Utwórz folder",
|
|
"folderCreateSuccess": "Utworzono folder",
|
|
"folderCreateFailed": "Nie udało się utworzyć folderu",
|
|
"editFolderTitle": "Edytuj folder",
|
|
"saveFolderButton": "Zapisz folder",
|
|
"folderEditSuccess": "Folder zaktualizowany",
|
|
"folderEditFailed": "Nie udało się zaktualizować folderu",
|
|
"folderNameLabel": "Nazwa folderu",
|
|
"folderNamePlaceholder": "Nazwa folderu",
|
|
"folderIconLabel": "Ikona",
|
|
"folderDeleteSuccess": "Folder usunięty",
|
|
"folderDeleteFailed": "Nie udało się usunąć folderu",
|
|
"confirmRunMessage": "Uruchomić „{{name}}”?",
|
|
"confirmRunButton": "Uruchom",
|
|
"runSuccess": "Uruchomiono „{{name}}” na terminalach {{count}}",
|
|
"pasteSuccess": "Wklejono „{{name}}” do {{count}} terminali",
|
|
"admin": {
|
|
"tabTitle": "Snippety",
|
|
"count": "{{count}} snippetów",
|
|
"add": "Dodaj snippet",
|
|
"namePlaceholder": "Nazwa snippetu",
|
|
"contentPlaceholder": "Treść polecenia",
|
|
"folderPlaceholder": "Folder (opcjonalnie)",
|
|
"empty": "Ten użytkownik nie ma żadnych snippetów",
|
|
"deleteConfirm": "Usunąć snippet „{{name}}” należący do {{username}}?",
|
|
"deleted": "Usunięto snippet",
|
|
"deleteFailed": "Nie udało się usunąć snippetu",
|
|
"requiredFields": "Nazwa i treść snippetu są wymagane",
|
|
"saved": "Zapisano snippet",
|
|
"saveFailed": "Nie udało się zapisać snippetu",
|
|
"saving": "Zapisywanie...",
|
|
"save": "Zapisz"
|
|
},
|
|
"backToSnippets": "Powrót do fragmentów",
|
|
"settingsTitle": "Ustawienia snippetów",
|
|
"settingsDisplayTitle": "Wyświetlanie",
|
|
"settingsBehaviorTitle": "Zachowanie",
|
|
"typeCommandHint": "Działa w aktywnym terminalu.",
|
|
"typeNoteHint": "Wkleja do aktywnego terminala bez uruchamiania.",
|
|
"variablesHint": "Zmienne: $HOST, $USER, $PORT, $NAME, ${INPUT_1:Label}",
|
|
"doubleClickToRun": "Kliknij dwukrotnie, aby uruchomić",
|
|
"sharedBadge": "Udostępniony",
|
|
"copyToClipboard": "Kopiuj do schowka",
|
|
"copyFailed": "Nie udało się skopiować do schowka",
|
|
"moreOptions": "Więcej opcji",
|
|
"moreActions": "Więcej akcji",
|
|
"moveToFolder": "Przenieś do folderu",
|
|
"deleteSnippet": "Usuń fragment kodu",
|
|
"deleteSnippetConfirm": "Usunąć fragment „{{name}}”?",
|
|
"deleteSuccess": "Usunięto snippet",
|
|
"delete": "Usuń",
|
|
"folderActions": "Akcje folderów",
|
|
"addSnippetHere": "Nowy fragment tutaj",
|
|
"deleteFolder": "Usuń folder",
|
|
"deleteFolderConfirm": "Usunąć folder „{{name}}”? Jego fragmenty zostaną przeniesione poza folder.",
|
|
"createFolderDescription": "Połącz powiązane ze sobą fragmenty.",
|
|
"editFolderDescription": "Zmień nazwę, kolor lub ikonę tego folderu.",
|
|
"folderColorLabel": "Kolor",
|
|
"loadFailed": "Nie udało się załadować fragmentów kodu",
|
|
"importSkipExisting": "Importuj (pomiń istniejące)",
|
|
"importOverwrite": "Importuj (nadpisz istniejące)",
|
|
"importInvalidFile": "Ten plik nie jest prawidłowym eksportem fragmentów kodu",
|
|
"importSuccess": "Zaimportowano {{imported}}, zaktualizowano {{updated}}, pominięto {{skipped}}",
|
|
"exportSnippets": "Eksportuj fragmenty kodu",
|
|
"exportSuccess": "Wyeksportowano fragmenty kodu",
|
|
"exportFailed": "Nie udało się wyeksportować snippetów",
|
|
"expandAll": "Rozwiń wszystkie foldery",
|
|
"collapseAll": "Zwiń wszystkie foldery",
|
|
"docsLink": "Dokumentacja",
|
|
"clearSearch": "Wyczyść wyszukiwanie",
|
|
"noSearchResults": "Brak fragmentów odpowiadających Twojemu wyszukiwaniu",
|
|
"emptyTitle": "Brak fragmentów",
|
|
"emptyDescription": "Zapisz często uruchamiane polecenia, a następnie uruchom je w terminalu jednym kliknięciem.",
|
|
"shareSnippet": "Udostępnij fragment",
|
|
"shareFolder": "Udostępnij folder",
|
|
"shareExpiry": "Wygasa",
|
|
"shareExpiryOptions": {
|
|
"h0": "Nigdy",
|
|
"h1": "Za 1 godzinę",
|
|
"h24": "W 1 dzień",
|
|
"h168": "Za 7 dni",
|
|
"h720": "Za 30 dni"
|
|
},
|
|
"shareButton": "Udostępnij",
|
|
"shareSuccess": "Udostępniono {{count}}",
|
|
"shareFailed": "Nie udało się udostępnić",
|
|
"shareLoadFailed": "Nie udało się załadować szczegółów udostępniania",
|
|
"currentAccess": "Aktualny dostęp",
|
|
"notSharedYet": "Jeszcze nikomu nie udostępniono",
|
|
"revokeAccess": "Unieważnij",
|
|
"revokeSuccess": "Unieważniono dostęp",
|
|
"revokeFailed": "Nie udało się unieważnić dostępu",
|
|
"close": "Zamknij",
|
|
"targetHostsLabel": "Docelowi gospodarze",
|
|
"targetHostsHint": "Wybierz hosty, na których chcesz uruchomić to polecenie bezpośrednio, bez otwierania terminala. Pozostaw puste, aby uruchomić je w aktywnym terminalu.",
|
|
"clearTargetHosts": "Wyczyść",
|
|
"noHostsAvailable": "Brak dostępnych gospodarzy",
|
|
"searchHosts": "Wyszukaj hosty",
|
|
"runOnTargets": "Uruchom na hostach docelowych",
|
|
"executionResultTitle": "Wyniki dla „{{name}}”",
|
|
"executionResultDescription": "Dane wyjściowe z każdego hosta docelowego.",
|
|
"executionSuccess": "Powodzenie",
|
|
"executionFailed": "Niepowodzenie",
|
|
"directRunSuccess": "Uruchomiono „{{name}}” na {{count}} hostach",
|
|
"directRunPartialFail": "„{{name}}” nie powiodło się na niektórych hostach",
|
|
"reorderFailed": "Nie udało się zmienić kolejności fragmentów kodu",
|
|
"dropToRemoveFromFolder": "Upuść tutaj, aby wyjść z folderu",
|
|
"shareSnippetTitle": "Udostępnij „{{name}}”",
|
|
"shareFolderTitle": "Udostępnij folder „{{name}}”",
|
|
"shareWith": "Udostępnij",
|
|
"usersTab": "Użytkownicy",
|
|
"rolesTab": "Role",
|
|
"shareSearchPlaceholder": "Wyszukaj użytkowników lub role",
|
|
"shareNoMatches": "Brak dopasowań",
|
|
"shareWithCount": "Udostępnij za pomocą {{count}}",
|
|
"shareFolderHint": "Udostępnia każdy fragment kodu w tym folderze. Fragmenty dodane później nie są udostępniane automatycznie.",
|
|
"shareFolderSummary": "Udostępniono {{count}} fragmentów w tym folderze",
|
|
"grantedBy": "Przyznane przez",
|
|
"expired": "Wygasły",
|
|
"variablesDialogTitle": "Uruchom „{{name}}”",
|
|
"variablesDialogDescription": "Przed uruchomieniem snippetu wprowadź wymagane wartości.",
|
|
"variablesPreviewLabel": "Podgląd",
|
|
"variablesConfirmButton": "Uruchom",
|
|
"keybindings": {
|
|
"runSnippet": "Uruchom istniejący snippet",
|
|
"snippetLabel": "Snippet",
|
|
"selectSnippet": "Wybierz snippet",
|
|
"snippetMissing": "nie znaleziono snippetu",
|
|
"snippetRequired": "Wybierz snippet"
|
|
},
|
|
"paletteHintRun": "Uruchom w aktywnej karcie terminala",
|
|
"host": {
|
|
"startupTitle": "Snippet startowy",
|
|
"quickActionsTitle": "Szybkie akcje",
|
|
"quickActionsDescription": "Szybkie akcje pojawiają się jako przyciski na pasku narzędzi Metryki hosta, umożliwiając wykonanie polecenia jednym kliknięciem.",
|
|
"noQuickActions": "Brak szybkich akcji.",
|
|
"buttonLabel": "Etykieta przycisku",
|
|
"selectSnippet": "Wybierz snippet...",
|
|
"addQuickAction": "Dodaj akcję",
|
|
"tabTitle": "Snippety",
|
|
"startupDescription": "Działa w terminalu za każdym razem, gdy łączy się z tym hostem. Zmienne takie jak $HOST są wypełniane; fragment kodu, który prosi o dane wejściowe, jest pomijany.",
|
|
"none": "Żaden",
|
|
"removeQuickAction": "Usuń szybką akcję"
|
|
},
|
|
"quickActions": {
|
|
"running": "Wykonywanie {{name}}...",
|
|
"succeeded": "{{name}} ukończono pomyślnie",
|
|
"failed": "{{name}} nie powiodło się",
|
|
"error": "Nie udało się wykonać {{name}}"
|
|
},
|
|
"paletteHintPaste": "Wklej w aktywnej karcie terminala",
|
|
"targetTerminals": "Wbiec",
|
|
"targetTerminalsHint": "opcjonalnie, w przeciwnym razie aktywna karta",
|
|
"selectAll": "Wszystkie",
|
|
"selectNone": "Żaden",
|
|
"plugin": {
|
|
"name": "Snippets"
|
|
}
|
|
}
|