Repository: Eugeny/tabby Branch: master Commit: 19eb46a72b83 Files: 772 Total size: 4.5 MB Directory structure: gitextract_38kc1ygb/ ├── .all-contributorsrc ├── .editorconfig ├── .eslintrc.yml ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── feature_request.md │ │ └── issue-report.md │ ├── dependabot.yml │ ├── stale.yml │ └── workflows/ │ ├── build.yml │ ├── codeql-analysis.yml │ ├── docs.yml │ └── release.yml ├── .gitignore ├── .mergify.yml ├── .pug-lintrc.js ├── .vscode/ │ └── launch.json ├── .well-known/ │ └── funding-manifest-urls ├── CODE_OF_CONDUCT.md ├── HACKING.md ├── LICENSE ├── README.de-DE.md ├── README.es-ES.md ├── README.id-ID.md ├── README.it-IT.md ├── README.ja-JP.md ├── README.ko-KR.md ├── README.md ├── README.pl-PL.md ├── README.pt-BR.md ├── README.ru-RU.md ├── README.zh-CN.md ├── app/ │ ├── dev-app-update.yml │ ├── index.pug │ ├── lib/ │ │ ├── app.ts │ │ ├── cli.ts │ │ ├── config.ts │ │ ├── index.ts │ │ ├── lru.ts │ │ ├── pluginManager.ts │ │ ├── portable.ts │ │ ├── pty.ts │ │ ├── sentry.ts │ │ ├── urlHandler.ts │ │ ├── utfSplitter.ts │ │ └── window.ts │ ├── package.json │ ├── patches/ │ │ └── @serialport+bindings-cpp+11.0.3.patch │ ├── src/ │ │ ├── app.module.ts │ │ ├── entry.preload.ts │ │ ├── entry.ts │ │ ├── global.scss │ │ ├── pluginBlacklist.ts │ │ ├── plugins.ts │ │ ├── preload.scss │ │ └── toastr.scss │ ├── tsconfig.json │ ├── tsconfig.main.json │ ├── webpack.config.main.mjs │ └── webpack.config.mjs ├── build/ │ ├── installer.nsh │ ├── linux/ │ │ └── after-install.tpl │ └── mac/ │ ├── entitlements.plist │ └── icon.icns ├── electron-builder.yml ├── extras/ │ ├── automator-workflows/ │ │ ├── Open Tabby here.workflow/ │ │ │ └── Contents/ │ │ │ ├── Info.plist │ │ │ ├── _CodeSignature/ │ │ │ │ ├── CodeDirectory │ │ │ │ ├── CodeRequirements │ │ │ │ ├── CodeRequirements-1 │ │ │ │ ├── CodeResources │ │ │ │ └── CodeSignature │ │ │ └── document.wflow │ │ └── Paste path into Tabby.workflow/ │ │ └── Contents/ │ │ ├── Info.plist │ │ ├── _CodeSignature/ │ │ │ ├── CodeDirectory │ │ │ ├── CodeRequirements │ │ │ ├── CodeRequirements-1 │ │ │ ├── CodeResources │ │ │ └── CodeSignature │ │ └── document.wflow │ └── clink/ │ ├── CHANGES │ ├── LICENSE │ ├── clink.bat │ ├── clink.lua │ ├── clink_inputrc_base │ ├── default_inputrc │ └── default_settings ├── firebase.json ├── locale/ │ ├── STOP.txt │ ├── af-ZA.po │ ├── app.pot │ ├── bg-BG.po │ ├── cs-CZ.po │ ├── da-DK.po │ ├── de-DE.po │ ├── en-GB.po │ ├── en-US.po │ ├── es-ES.po │ ├── fr-FR.po │ ├── hr-HR.po │ ├── id-ID.po │ ├── it-IT.po │ ├── ja-JP.po │ ├── ko-KR.po │ ├── pl-PL.po │ ├── pt-BR.po │ ├── pt-PT.po │ ├── ru-RU.po │ ├── sr-SP.po │ ├── sv-SE.po │ ├── tr-TR.po │ ├── uk-UA.po │ ├── zh-CN.po │ └── zh-TW.po ├── package.json ├── patches/ │ └── app-builder-lib+26.0.12.patch ├── scripts/ │ ├── build-docs.mjs │ ├── build-linux.mjs │ ├── build-macos.mjs │ ├── build-modules.mjs │ ├── build-native.mjs │ ├── build-typings.mjs │ ├── build-windows.mjs │ ├── generate-icon-metadata.mjs │ ├── i18n-extract.mjs │ ├── install-deps.mjs │ ├── prepackage-plugins.mjs │ ├── publish-plugins.mjs │ ├── sentry-upload.mjs │ └── vars.mjs ├── snap/ │ └── snapcraft.yaml ├── tabby-auto-sudo-password/ │ ├── package.json │ ├── src/ │ │ ├── decorator.ts │ │ └── index.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-community-color-schemes/ │ ├── .editorconfig │ ├── package.json │ ├── schemes/ │ │ ├── 3024 Day │ │ ├── 3024 Night │ │ ├── AdventureTime │ │ ├── Afterglow │ │ ├── AlienBlood │ │ ├── Argonaut │ │ ├── Arthur │ │ ├── AtelierSulphurpool │ │ ├── Atom │ │ ├── AtomOneLight │ │ ├── Base16 Default Dark │ │ ├── Batman │ │ ├── Belafonte Day │ │ ├── Belafonte Night │ │ ├── BirdsOfParadise │ │ ├── Blazer │ │ ├── Borland │ │ ├── Bright Lights │ │ ├── Broadcast │ │ ├── Brogrammer │ │ ├── C64 │ │ ├── CLRS │ │ ├── Chalk │ │ ├── Chalkboard │ │ ├── Ciapre │ │ ├── Cobalt Neon │ │ ├── Cobalt2 │ │ ├── CrayonPonyFish │ │ ├── Dark Pastel │ │ ├── Darkside │ │ ├── Desert │ │ ├── DimmedMonokai │ │ ├── DotGov │ │ ├── Dracula │ │ ├── Duotone Dark │ │ ├── ENCOM │ │ ├── Earthsong │ │ ├── Elemental │ │ ├── Elementary │ │ ├── Espresso │ │ ├── Espresso Libre │ │ ├── Fideloper │ │ ├── FirefoxDev │ │ ├── Firewatch │ │ ├── FishTank │ │ ├── Flat │ │ ├── Flatland │ │ ├── Floraverse │ │ ├── ForestBlue │ │ ├── FrontEndDelight │ │ ├── FunForrest │ │ ├── Galaxy │ │ ├── Github │ │ ├── Glacier │ │ ├── Grape │ │ ├── Grass │ │ ├── Gruvbox Dark │ │ ├── Hardcore │ │ ├── Harper │ │ ├── Highway │ │ ├── Hipster Green │ │ ├── Homebrew │ │ ├── Hurtado │ │ ├── Hybrid │ │ ├── IC_Green_PPL │ │ ├── IC_Orange_PPL │ │ ├── IR_Black │ │ ├── Iceberg │ │ ├── Jackie Brown │ │ ├── Japanesque │ │ ├── Jazz │ │ ├── Jellybeans │ │ ├── JetBrains Darcula │ │ ├── Kibble │ │ ├── Later This Evening │ │ ├── Lavandula │ │ ├── Light Owl │ │ ├── LiquidCarbon │ │ ├── LiquidCarbonTransparent │ │ ├── LiquidCarbonTransparentInverse │ │ ├── Man Page │ │ ├── Material │ │ ├── MaterialDark │ │ ├── Mathias │ │ ├── Medallion │ │ ├── Melange Dark │ │ ├── Misterioso │ │ ├── Molokai │ │ ├── MonaLisa │ │ ├── Monokai Soda │ │ ├── Monokai Vivid │ │ ├── N0tch2k │ │ ├── Neopolitan │ │ ├── Neutron │ │ ├── Night Owl │ │ ├── NightLion v1 │ │ ├── NightLion v2 │ │ ├── Nord │ │ ├── Novel │ │ ├── Obsidian │ │ ├── Ocean │ │ ├── OceanicMaterial │ │ ├── Ollie │ │ ├── OneHalfDark │ │ ├── OneHalfLight │ │ ├── Pandora │ │ ├── Paraiso Dark │ │ ├── Parasio Dark │ │ ├── PaulMillr │ │ ├── PencilDark │ │ ├── PencilLight │ │ ├── Piatto Light │ │ ├── Pnevma │ │ ├── Pro │ │ ├── Red Alert │ │ ├── Red Sands │ │ ├── Relaxed │ │ ├── Rippedcasts │ │ ├── Rose Pine │ │ ├── Rose Pine Dawn │ │ ├── Rose Pine Moon │ │ ├── Royal │ │ ├── Ryuuko │ │ ├── SeaShells │ │ ├── Seafoam Pastel │ │ ├── Seti │ │ ├── Shaman │ │ ├── Slate │ │ ├── Smyck │ │ ├── SoftServer │ │ ├── Solarized Darcula │ │ ├── Solarized Dark │ │ ├── Solarized Dark - Patched │ │ ├── Solarized Dark Higher Contrast │ │ ├── Solarized Light │ │ ├── SpaceGray │ │ ├── SpaceGray Eighties │ │ ├── SpaceGray Eighties Dull │ │ ├── Spacedust │ │ ├── Spiderman │ │ ├── Spring │ │ ├── Square │ │ ├── Sundried │ │ ├── Symfonic │ │ ├── Tango │ │ ├── Teerb │ │ ├── Terminal Basic │ │ ├── Thayer Bright │ │ ├── The Hulk │ │ ├── TokyoNight │ │ ├── TokyoNight Day │ │ ├── TokyoNight Storm │ │ ├── Tomorrow │ │ ├── Tomorrow Night │ │ ├── Tomorrow Night Blue │ │ ├── Tomorrow Night Bright │ │ ├── Tomorrow Night Eighties │ │ ├── ToyChest │ │ ├── Treehouse │ │ ├── Twilight │ │ ├── Ubuntu │ │ ├── UnderTheSea │ │ ├── Urple │ │ ├── Vaughn │ │ ├── VibrantInk │ │ ├── Violet Dark │ │ ├── Violet Light │ │ ├── WarmNeon │ │ ├── Wez │ │ ├── WildCherry │ │ ├── Wombat │ │ ├── Wryan │ │ ├── Zenburn │ │ ├── ayu │ │ ├── ayu_light │ │ ├── base2tone-cave-dark │ │ ├── base2tone-desert-dark │ │ ├── base2tone-drawbridge-dark │ │ ├── base2tone-evening-dark │ │ ├── base2tone-forest-dark │ │ ├── base2tone-heath-dark │ │ ├── base2tone-heath-light │ │ ├── base2tone-lake-dark │ │ ├── base2tone-meadow-dark │ │ ├── base2tone-morning-light │ │ ├── base2tone-pool-dark │ │ ├── base2tone-sea-dark │ │ ├── base2tone-space-dark │ │ ├── deep │ │ └── idleToes │ ├── src/ │ │ ├── colorSchemes.ts │ │ └── index.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-core/ │ ├── README.md │ ├── package.json │ ├── src/ │ │ ├── api/ │ │ │ ├── cli.ts │ │ │ ├── commands.ts │ │ │ ├── configProvider.ts │ │ │ ├── fileProvider.ts │ │ │ ├── hostApp.ts │ │ │ ├── hostWindow.ts │ │ │ ├── hotkeyProvider.ts │ │ │ ├── index.ts │ │ │ ├── mainProcess.ts │ │ │ ├── menu.ts │ │ │ ├── platform.ts │ │ │ ├── profileProvider.ts │ │ │ ├── selector.ts │ │ │ ├── tabContextMenuProvider.ts │ │ │ ├── tabRecovery.ts │ │ │ ├── theme.ts │ │ │ └── toolbarButtonProvider.ts │ │ ├── cli.ts │ │ ├── commands.ts │ │ ├── components/ │ │ │ ├── appRoot.component.pug │ │ │ ├── appRoot.component.scss │ │ │ ├── appRoot.component.ts │ │ │ ├── base.component.ts │ │ │ ├── baseTab.component.ts │ │ │ ├── checkbox.component.ts │ │ │ ├── profileIcon.component.pug │ │ │ ├── profileIcon.component.scss │ │ │ ├── profileIcon.component.ts │ │ │ ├── promptModal.component.pug │ │ │ ├── promptModal.component.ts │ │ │ ├── renameTabModal.component.pug │ │ │ ├── renameTabModal.component.ts │ │ │ ├── safeModeModal.component.pug │ │ │ ├── safeModeModal.component.ts │ │ │ ├── selectorModal.component.pug │ │ │ ├── selectorModal.component.scss │ │ │ ├── selectorModal.component.ts │ │ │ ├── selfPositioning.component.ts │ │ │ ├── splitTab.component.scss │ │ │ ├── splitTab.component.ts │ │ │ ├── splitTabDropZone.component.scss │ │ │ ├── splitTabDropZone.component.ts │ │ │ ├── splitTabPaneLabel.component.scss │ │ │ ├── splitTabPaneLabel.component.ts │ │ │ ├── splitTabSpanner.component.scss │ │ │ ├── splitTabSpanner.component.ts │ │ │ ├── startPage.component.pug │ │ │ ├── startPage.component.scss │ │ │ ├── startPage.component.ts │ │ │ ├── tabBody.component.scss │ │ │ ├── tabBody.component.ts │ │ │ ├── tabBody.deep.component.css │ │ │ ├── tabHeader.component.pug │ │ │ ├── tabHeader.component.scss │ │ │ ├── tabHeader.component.ts │ │ │ ├── titleBar.component.pug │ │ │ ├── titleBar.component.scss │ │ │ ├── titleBar.component.ts │ │ │ ├── toggle.component.scss │ │ │ ├── toggle.component.ts │ │ │ ├── transfersMenu.component.pug │ │ │ ├── transfersMenu.component.scss │ │ │ ├── transfersMenu.component.ts │ │ │ ├── unlockVaultModal.component.pug │ │ │ ├── unlockVaultModal.component.ts │ │ │ ├── welcomeTab.component.pug │ │ │ ├── welcomeTab.component.scss │ │ │ ├── welcomeTab.component.ts │ │ │ ├── windowControls.component.pug │ │ │ ├── windowControls.component.scss │ │ │ └── windowControls.component.ts │ │ ├── config.ts │ │ ├── configDefaults.linux.yaml │ │ ├── configDefaults.macos.yaml │ │ ├── configDefaults.web.yaml │ │ ├── configDefaults.windows.yaml │ │ ├── configDefaults.yaml │ │ ├── directives/ │ │ │ ├── alwaysVisibleTypeahead.directive.ts │ │ │ ├── autofocus.directive.ts │ │ │ ├── cdkAutoDropGroup.directive.ts │ │ │ ├── dropZone.directive.pug │ │ │ ├── dropZone.directive.scss │ │ │ ├── dropZone.directive.ts │ │ │ └── fastHtmlBind.directive.ts │ │ ├── hotkeys.ts │ │ ├── icons.json │ │ ├── index.ts │ │ ├── profiles.ts │ │ ├── services/ │ │ │ ├── app.service.ts │ │ │ ├── commands.service.ts │ │ │ ├── config.service.ts │ │ │ ├── docking.service.ts │ │ │ ├── fileProviders.service.ts │ │ │ ├── homeBase.service.ts │ │ │ ├── hotkeys.service.ts │ │ │ ├── hotkeys.util.ts │ │ │ ├── locale.service.ts │ │ │ ├── log.service.ts │ │ │ ├── notifications.service.ts │ │ │ ├── profiles.service.ts │ │ │ ├── selector.service.ts │ │ │ ├── tabRecovery.service.ts │ │ │ ├── tabs.service.ts │ │ │ ├── themes.service.ts │ │ │ ├── updater.service.ts │ │ │ └── vault.service.ts │ │ ├── tabContextMenu.ts │ │ ├── theme.new.scss │ │ ├── theme.ts │ │ ├── theme.vars.scss │ │ ├── theme.vendor.scss │ │ ├── utfSplitter.ts │ │ └── utils.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-electron/ │ ├── package.json │ ├── src/ │ │ ├── colorSchemes.ts │ │ ├── config.ts │ │ ├── hotkeys.ts │ │ ├── index.ts │ │ ├── pathDrop.ts │ │ ├── pty.ts │ │ ├── services/ │ │ │ ├── dockMenu.service.ts │ │ │ ├── docking.service.ts │ │ │ ├── electron.service.ts │ │ │ ├── fileProvider.service.ts │ │ │ ├── hostApp.service.ts │ │ │ ├── hostWindow.service.ts │ │ │ ├── log.service.ts │ │ │ ├── platform.service.ts │ │ │ ├── shellIntegration.service.ts │ │ │ ├── touchbar.service.ts │ │ │ ├── uac.service.ts │ │ │ └── updater.service.ts │ │ ├── sftpContextMenu.ts │ │ ├── shells/ │ │ │ ├── cmder.ts │ │ │ ├── cygwin32.ts │ │ │ ├── cygwin64.ts │ │ │ ├── gitBash.ts │ │ │ ├── linuxDefault.ts │ │ │ ├── macDefault.ts │ │ │ ├── msys2.ts │ │ │ ├── posix.ts │ │ │ ├── powershellCore.ts │ │ │ ├── vs.ts │ │ │ ├── winDefault.ts │ │ │ ├── windowsBase.ts │ │ │ ├── windowsStock.ts │ │ │ └── wsl.ts │ │ └── sshImporters.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-linkifier/ │ ├── README.md │ ├── package.json │ ├── src/ │ │ ├── api.ts │ │ ├── config.ts │ │ ├── decorator.ts │ │ ├── handlers.ts │ │ └── index.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-local/ │ ├── README.md │ ├── package.json │ ├── src/ │ │ ├── api.ts │ │ ├── buttonProvider.ts │ │ ├── cli.ts │ │ ├── components/ │ │ │ ├── commandLineEditor.component.pug │ │ │ ├── commandLineEditor.component.ts │ │ │ ├── environmentEditor.component.pug │ │ │ ├── environmentEditor.component.scss │ │ │ ├── environmentEditor.component.ts │ │ │ ├── localProfileSettings.component.pug │ │ │ ├── localProfileSettings.component.ts │ │ │ ├── shellSettingsTab.component.pug │ │ │ ├── shellSettingsTab.component.ts │ │ │ └── terminalTab.component.ts │ │ ├── config.ts │ │ ├── hotkeys.ts │ │ ├── index.ts │ │ ├── profiles.ts │ │ ├── recoveryProvider.ts │ │ ├── services/ │ │ │ └── terminal.service.ts │ │ ├── session.ts │ │ ├── settings.ts │ │ └── tabContextMenu.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-plugin-manager/ │ ├── package.json │ ├── src/ │ │ ├── components/ │ │ │ ├── pluginsSettingsTab.component.pug │ │ │ ├── pluginsSettingsTab.component.scss │ │ │ └── pluginsSettingsTab.component.ts │ │ ├── index.ts │ │ ├── services/ │ │ │ └── pluginManager.service.ts │ │ └── settings.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-serial/ │ ├── package.json │ ├── src/ │ │ ├── api.ts │ │ ├── components/ │ │ │ ├── serialProfileSettings.component.pug │ │ │ ├── serialProfileSettings.component.ts │ │ │ ├── serialTab.component.pug │ │ │ ├── serialTab.component.scss │ │ │ └── serialTab.component.ts │ │ ├── config.ts │ │ ├── hotkeys.ts │ │ ├── index.ts │ │ ├── profiles.ts │ │ ├── recoveryProvider.ts │ │ └── services/ │ │ └── serial.service.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-settings/ │ ├── README.md │ ├── package.json │ ├── src/ │ │ ├── api.ts │ │ ├── buttonProvider.ts │ │ ├── components/ │ │ │ ├── configSyncSettingsTab.component.pug │ │ │ ├── configSyncSettingsTab.component.ts │ │ │ ├── editProfileGroupModal.component.pug │ │ │ ├── editProfileGroupModal.component.ts │ │ │ ├── editProfileModal.component.pug │ │ │ ├── editProfileModal.component.ts │ │ │ ├── hotkeyInputModal.component.pug │ │ │ ├── hotkeyInputModal.component.scss │ │ │ ├── hotkeyInputModal.component.ts │ │ │ ├── hotkeySettingsTab.component.pug │ │ │ ├── hotkeySettingsTab.component.ts │ │ │ ├── multiHotkeyInput.component.pug │ │ │ ├── multiHotkeyInput.component.scss │ │ │ ├── multiHotkeyInput.component.ts │ │ │ ├── profilesSettingsTab.component.pug │ │ │ ├── profilesSettingsTab.component.scss │ │ │ ├── profilesSettingsTab.component.ts │ │ │ ├── releaseNotesTab.component.pug │ │ │ ├── releaseNotesTab.component.scss │ │ │ ├── releaseNotesTab.component.ts │ │ │ ├── setVaultPassphraseModal.component.pug │ │ │ ├── setVaultPassphraseModal.component.ts │ │ │ ├── settingsTab.component.pug │ │ │ ├── settingsTab.component.scss │ │ │ ├── settingsTab.component.ts │ │ │ ├── settingsTabBody.component.ts │ │ │ ├── showSecretModal.component.pug │ │ │ ├── showSecretModal.component.ts │ │ │ ├── vaultSettingsTab.component.pug │ │ │ ├── vaultSettingsTab.component.ts │ │ │ ├── windowSettingsTab.component.pug │ │ │ └── windowSettingsTab.component.ts │ │ ├── config.ts │ │ ├── hotkeys.ts │ │ ├── index.ts │ │ ├── services/ │ │ │ └── configSync.service.ts │ │ └── settings.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-ssh/ │ ├── package.json │ ├── src/ │ │ ├── algorithms.ts │ │ ├── api/ │ │ │ ├── contextMenu.ts │ │ │ ├── importer.ts │ │ │ ├── index.ts │ │ │ └── interfaces.ts │ │ ├── components/ │ │ │ ├── hostKeyPromptModal.component.pug │ │ │ ├── hostKeyPromptModal.component.ts │ │ │ ├── keyboardInteractiveAuthPanel.component.pug │ │ │ ├── keyboardInteractiveAuthPanel.component.scss │ │ │ ├── keyboardInteractiveAuthPanel.component.ts │ │ │ ├── sftpCreateDirectoryModal.component.pug │ │ │ ├── sftpCreateDirectoryModal.component.ts │ │ │ ├── sftpDeleteModal.component.pug │ │ │ ├── sftpDeleteModal.component.ts │ │ │ ├── sftpPanel.component.pug │ │ │ ├── sftpPanel.component.scss │ │ │ ├── sftpPanel.component.ts │ │ │ ├── sshPortForwardingConfig.component.pug │ │ │ ├── sshPortForwardingConfig.component.ts │ │ │ ├── sshPortForwardingModal.component.pug │ │ │ ├── sshPortForwardingModal.component.ts │ │ │ ├── sshProfileSettings.component.pug │ │ │ ├── sshProfileSettings.component.ts │ │ │ ├── sshSettingsTab.component.pug │ │ │ ├── sshSettingsTab.component.ts │ │ │ ├── sshTab.component.pug │ │ │ ├── sshTab.component.scss │ │ │ └── sshTab.component.ts │ │ ├── config.ts │ │ ├── hotkeys.ts │ │ ├── index.ts │ │ ├── profiles.ts │ │ ├── recoveryProvider.ts │ │ ├── services/ │ │ │ ├── passwordStorage.service.ts │ │ │ ├── ssh.service.ts │ │ │ ├── sshKnownHosts.service.ts │ │ │ └── sshMultiplexer.service.ts │ │ ├── session/ │ │ │ ├── forwards.ts │ │ │ ├── sftp.ts │ │ │ ├── shell.ts │ │ │ ├── ssh.ts │ │ │ └── x11.ts │ │ ├── settings.ts │ │ ├── sftpContextMenu.ts │ │ └── tabContextMenu.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-telnet/ │ ├── package.json │ ├── src/ │ │ ├── components/ │ │ │ ├── telnetProfileSettings.component.pug │ │ │ ├── telnetProfileSettings.component.ts │ │ │ ├── telnetTab.component.pug │ │ │ ├── telnetTab.component.scss │ │ │ └── telnetTab.component.ts │ │ ├── config.ts │ │ ├── hotkeys.ts │ │ ├── index.ts │ │ ├── profiles.ts │ │ ├── recoveryProvider.ts │ │ └── session.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-terminal/ │ ├── README.md │ ├── package.json │ ├── patches/ │ │ └── ansi-color+0.2.1.patch │ ├── src/ │ │ ├── api/ │ │ │ ├── baseTerminalTab.component.ts │ │ │ ├── colorSchemeProvider.ts │ │ │ ├── connectableTerminalTab.component.ts │ │ │ ├── contextMenuProvider.ts │ │ │ ├── decorator.ts │ │ │ ├── interfaces.ts │ │ │ └── middleware.ts │ │ ├── bell.ogg │ │ ├── cli.ts │ │ ├── colorSchemes.ts │ │ ├── components/ │ │ │ ├── appearanceSettingsTab.component.pug │ │ │ ├── appearanceSettingsTab.component.scss │ │ │ ├── appearanceSettingsTab.component.ts │ │ │ ├── baseTerminalTab.component.pug │ │ │ ├── baseTerminalTab.component.scss │ │ │ ├── colorPicker.component.pug │ │ │ ├── colorPicker.component.scss │ │ │ ├── colorPicker.component.ts │ │ │ ├── colorSchemePreview.component.pug │ │ │ ├── colorSchemePreview.component.scss │ │ │ ├── colorSchemePreview.component.ts │ │ │ ├── colorSchemeSelector.component.pug │ │ │ ├── colorSchemeSelector.component.ts │ │ │ ├── colorSchemeSettingsForMode.component.pug │ │ │ ├── colorSchemeSettingsForMode.component.scss │ │ │ ├── colorSchemeSettingsForMode.component.ts │ │ │ ├── colorSchemeSettingsTab.component.pug │ │ │ ├── colorSchemeSettingsTab.component.ts │ │ │ ├── inputProcessingSettings.component.pug │ │ │ ├── inputProcessingSettings.component.ts │ │ │ ├── loginScriptsSettings.component.pug │ │ │ ├── loginScriptsSettings.component.ts │ │ │ ├── searchPanel.component.pug │ │ │ ├── searchPanel.component.scss │ │ │ ├── searchPanel.component.ts │ │ │ ├── streamProcessingSettings.component.pug │ │ │ ├── streamProcessingSettings.component.ts │ │ │ ├── terminalSettingsTab.component.pug │ │ │ ├── terminalSettingsTab.component.ts │ │ │ ├── terminalToolbar.component.pug │ │ │ ├── terminalToolbar.component.scss │ │ │ └── terminalToolbar.component.ts │ │ ├── config.ts │ │ ├── features/ │ │ │ ├── debug.ts │ │ │ └── zmodem.ts │ │ ├── frontends/ │ │ │ ├── frontend.ts │ │ │ ├── xterm.css │ │ │ └── xtermFrontend.ts │ │ ├── helpers.ts │ │ ├── hotkeys.ts │ │ ├── index.ts │ │ ├── middleware/ │ │ │ ├── inputProcessing.ts │ │ │ ├── loginScriptProcessing.ts │ │ │ ├── oscProcessing.ts │ │ │ ├── streamProcessing.ts │ │ │ └── utf8Splitter.ts │ │ ├── services/ │ │ │ └── multifocus.service.ts │ │ ├── session.ts │ │ ├── settings.ts │ │ └── tabContextMenu.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-uac/ │ ├── .gitignore │ ├── UAC/ │ │ ├── UAC.cpp │ │ ├── UAC.vcxproj │ │ ├── UAC.vcxproj.filters │ │ ├── UAC.vcxproj.user │ │ ├── app.manifest │ │ ├── stdafx.cpp │ │ ├── stdafx.h │ │ └── targetver.h │ └── UAC.sln ├── tabby-web/ │ ├── package.json │ ├── src/ │ │ ├── components/ │ │ │ ├── messageBoxModal.component.pug │ │ │ └── messageBoxModal.component.ts │ │ ├── config.ts │ │ ├── index.ts │ │ ├── platform.ts │ │ ├── services/ │ │ │ ├── hostApp.service.ts │ │ │ ├── hostWindow.service.ts │ │ │ ├── log.service.ts │ │ │ └── updater.service.ts │ │ └── styles.scss │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-web-demo/ │ ├── data/ │ │ ├── linux.iso │ │ ├── v86.wasm │ │ └── v86_all.js │ ├── package.json │ ├── src/ │ │ ├── buttonProvider.ts │ │ ├── components/ │ │ │ └── terminalTab.component.ts │ │ ├── index.ts │ │ ├── profiles.ts │ │ └── session.ts │ ├── tsconfig.json │ └── webpack.config.mjs ├── tsconfig.json ├── typedoc.mjs ├── web/ │ ├── entry.preload.ts │ ├── entry.ts │ ├── package.json │ ├── patches/ │ │ └── browserify-sign+4.2.1.patch │ ├── polyfills.buffer.ts │ ├── polyfills.ts │ ├── tsconfig.json │ └── webpack.config.mjs ├── webpack.config.mjs └── webpack.plugin.config.mjs ================================================ FILE CONTENTS ================================================ ================================================ FILE: .all-contributorsrc ================================================ { "files": [ "README.md", "README.zh-CN.md", "README.ru-RU.md", "README.ko-KR.md", "README.it-IT.md", "README.de-DE.md", "README.id-ID.md", "README.ja-JP.md", "README.pt-BR.md", "README.es-ES.md" ], "imageSize": 100, "commit": false, "contributors": [ { "login": "mezner", "name": "Russell Myers", "avatar_url": "https://avatars2.githubusercontent.com/u/184085?v=4", "profile": "http://www.russellmyers.com", "contributions": [ "code" ] }, { "login": "ehwarren", "name": "Austin Warren", "avatar_url": "https://avatars1.githubusercontent.com/u/3991658?v=4", "profile": "http://www.morwire.com", "contributions": [ "code" ] }, { "login": "Drachenkaetzchen", "name": "Felicia Hummel", "avatar_url": "https://avatars1.githubusercontent.com/u/162974?v=4", "profile": "https://github.com/Drachenkaetzchen", "contributions": [ "code" ] }, { "login": "mikemaccana", "name": "Mike MacCana", "avatar_url": "https://avatars2.githubusercontent.com/u/172594?v=4", "profile": "https://github.com/mikemaccana", "contributions": [ "test", "design" ] }, { "login": "yxuko", "name": "Yacine Kanzari", "avatar_url": "https://avatars1.githubusercontent.com/u/1786317?v=4", "profile": "https://github.com/yxuko", "contributions": [ "code" ] }, { "login": "BBJip", "name": "BBJip", "avatar_url": "https://avatars2.githubusercontent.com/u/32908927?v=4", "profile": "https://github.com/BBJip", "contributions": [ "code" ] }, { "login": "Futagirl", "name": "Futagirl", "avatar_url": "https://avatars2.githubusercontent.com/u/33533958?v=4", "profile": "https://github.com/Futagirl", "contributions": [ "design" ] }, { "login": "levrik", "name": "Levin Rickert", "avatar_url": "https://avatars3.githubusercontent.com/u/9491603?v=4", "profile": "https://www.levrik.io", "contributions": [ "code" ] }, { "login": "kwonoj", "name": "OJ Kwon", "avatar_url": "https://avatars2.githubusercontent.com/u/1210596?v=4", "profile": "https://kwonoj.github.io", "contributions": [ "code" ] }, { "login": "Domain", "name": "domain", "avatar_url": "https://avatars2.githubusercontent.com/u/903197?v=4", "profile": "https://github.com/Domain", "contributions": [ "plugin", "code" ] }, { "login": "kbjr", "name": "James Brumond", "avatar_url": "https://avatars1.githubusercontent.com/u/195127?v=4", "profile": "http://www.jbrumond.me", "contributions": [ "plugin" ] }, { "login": "Tyriar", "name": "Daniel Imms", "avatar_url": "https://avatars0.githubusercontent.com/u/2193314?v=4", "profile": "http://www.growingwiththeweb.com", "contributions": [ "code", "plugin", "test" ] }, { "login": "baflo", "name": "Florian Bachmann", "avatar_url": "https://avatars2.githubusercontent.com/u/834350?v=4", "profile": "https://github.com/baflo", "contributions": [ "code" ] }, { "login": "mischah", "name": "Michael Kühnel", "avatar_url": "https://avatars2.githubusercontent.com/u/441011?v=4", "profile": "http://michael-kuehnel.de", "contributions": [ "code", "design" ] }, { "login": "NieLeben", "name": "Tilmann Meyer", "avatar_url": "https://avatars3.githubusercontent.com/u/47182955?v=4", "profile": "https://github.com/NieLeben", "contributions": [ "code" ] }, { "login": "PMExtra", "name": "PM Extra", "avatar_url": "https://avatars3.githubusercontent.com/u/11289158?v=4", "profile": "http://www.jubeat.net", "contributions": [ "bug" ] }, { "login": "IgnusG", "name": "Jonathan", "avatar_url": "https://avatars1.githubusercontent.com/u/6438760?v=4", "profile": "https://jjuhas.keybase.pub//", "contributions": [ "code" ] }, { "login": "hammster", "name": "Hans Koch", "avatar_url": "https://avatars0.githubusercontent.com/u/1093709?v=4", "profile": "https://hans-koch.me", "contributions": [ "code" ] }, { "login": "ThePuzzlemaker", "name": "Dak Smyth", "avatar_url": "https://avatars3.githubusercontent.com/u/12666617?v=4", "profile": "http://thepuzzlemaker.info", "contributions": [ "code" ] }, { "login": "yfwz100", "name": "Wang Zhi", "avatar_url": "https://avatars2.githubusercontent.com/u/983211?v=4", "profile": "http://yfwz100.github.io", "contributions": [ "code" ] }, { "login": "jack1142", "name": "jack1142", "avatar_url": "https://avatars0.githubusercontent.com/u/6032823?v=4", "profile": "https://github.com/jack1142", "contributions": [ "code" ] }, { "login": "hdougie", "name": "Howie Douglas", "avatar_url": "https://avatars1.githubusercontent.com/u/450799?v=4", "profile": "https://github.com/hdougie", "contributions": [ "code" ] }, { "login": "ckaczor", "name": "Chris Kaczor", "avatar_url": "https://avatars2.githubusercontent.com/u/180906?v=4", "profile": "https://chriskaczor.com", "contributions": [ "code" ] }, { "login": "boxmein", "name": "Johannes Kadak", "avatar_url": "https://avatars1.githubusercontent.com/u/358714?v=4", "profile": "https://www.boxmein.net", "contributions": [ "code" ] }, { "login": "LeSeulArtichaut", "name": "LeSeulArtichaut", "avatar_url": "https://avatars1.githubusercontent.com/u/38361244?v=4", "profile": "https://github.com/LeSeulArtichaut", "contributions": [ "code" ] }, { "login": "CyrilTaylor", "name": "Cyril Taylor", "avatar_url": "https://avatars0.githubusercontent.com/u/12631466?v=4", "profile": "https://github.com/CyrilTaylor", "contributions": [ "code" ] }, { "login": "nstefanou", "name": "nstefanou", "avatar_url": "https://avatars3.githubusercontent.com/u/51129173?v=4", "profile": "https://github.com/nstefanou", "contributions": [ "code", "plugin" ] }, { "login": "orin220444", "name": "orin220444", "avatar_url": "https://avatars3.githubusercontent.com/u/30747229?v=4", "profile": "https://github.com/orin220444", "contributions": [ "code" ] }, { "login": "Goobles", "name": "Gobius Dolhain", "avatar_url": "https://avatars3.githubusercontent.com/u/8776771?v=4", "profile": "https://github.com/Goobles", "contributions": [ "code" ] }, { "login": "3l0w", "name": "Gwilherm Folliot", "avatar_url": "https://avatars2.githubusercontent.com/u/37798980?v=4", "profile": "https://github.com/3l0w", "contributions": [ "code" ] }, { "login": "dimitory", "name": "Dmitry Pronin", "avatar_url": "https://avatars0.githubusercontent.com/u/475955?v=4", "profile": "https://github.com/Dimitory", "contributions": [ "code" ] }, { "login": "JonathanBeverley", "name": "Jonathan Beverley", "avatar_url": "https://avatars1.githubusercontent.com/u/20328966?v=4", "profile": "https://github.com/JonathanBeverley", "contributions": [ "code" ] }, { "login": "zend", "name": "Zenghai Liang", "avatar_url": "https://avatars1.githubusercontent.com/u/25160?v=4", "profile": "https://github.com/zend", "contributions": [ "code" ] }, { "login": "matishadow", "name": "Mateusz Tracz", "avatar_url": "https://avatars0.githubusercontent.com/u/9083085?v=4", "profile": "https://about.me/matishadow", "contributions": [ "code" ] }, { "login": "pinpins", "name": "pinpin", "avatar_url": "https://avatars3.githubusercontent.com/u/36234677?v=4", "profile": "https://zergpool.com", "contributions": [ "code" ] }, { "login": "TakuroOnoda", "name": "Takuro Onoda", "avatar_url": "https://avatars0.githubusercontent.com/u/1407926?v=4", "profile": "https://github.com/TakuroOnoda", "contributions": [ "code" ] }, { "login": "frauhottelmann", "name": "frauhottelmann", "avatar_url": "https://avatars2.githubusercontent.com/u/902705?v=4", "profile": "https://github.com/frauhottelmann", "contributions": [ "code" ] }, { "login": "VectorKappa", "name": "Piotr Patalong", "avatar_url": "https://avatars.githubusercontent.com/u/29167842?v=4", "profile": "http://patalong.pl", "contributions": [ "design" ] }, { "login": "clarkwang", "name": "Clark Wang", "avatar_url": "https://avatars.githubusercontent.com/u/157076?v=4", "profile": "https://github.com/clarkwang", "contributions": [ "code" ] }, { "login": "iamchating", "name": "iamchating", "avatar_url": "https://avatars.githubusercontent.com/u/7088153?v=4", "profile": "https://github.com/iamchating", "contributions": [ "code" ] }, { "login": "starxg", "name": "starxg", "avatar_url": "https://avatars.githubusercontent.com/u/34997494?v=4", "profile": "https://github.com/starxg", "contributions": [ "plugin" ] }, { "login": "lambdalisue", "name": "Alisue", "avatar_url": "https://avatars.githubusercontent.com/u/546312?v=4", "profile": "http://hashnote.net/", "contributions": [ "design" ] }, { "login": "ydcool", "name": "Dominic Yin", "avatar_url": "https://avatars.githubusercontent.com/u/5668295?v=4", "profile": "https://github.com/ydcool", "contributions": [ "code" ] }, { "login": "bdr99", "name": "Brandon Rothweiler", "avatar_url": "https://avatars.githubusercontent.com/u/2292715?v=4", "profile": "https://github.com/bdr99", "contributions": [ "design" ] }, { "login": "logicmachine123", "name": "Logic Machine", "avatar_url": "https://avatars.githubusercontent.com/u/63876444?v=4", "profile": "https://git.io/JnP49", "contributions": [ "doc" ] }, { "login": "cypherbits", "name": "cypherbits", "avatar_url": "https://avatars.githubusercontent.com/u/10424900?v=4", "profile": "https://github.com/cypherbits", "contributions": [ "doc" ] }, { "login": "KingMob", "name": "Matthew Davidson", "avatar_url": "https://avatars.githubusercontent.com/u/946421?v=4", "profile": "https://modulolotus.net", "contributions": [ "code" ] }, { "login": "al-wi", "name": "Alexander Wiedemann", "avatar_url": "https://avatars.githubusercontent.com/u/11092199?v=4", "profile": "https://github.com/al-wi", "contributions": [ "code" ] }, { "login": "BoYeonJang", "name": "장보연", "avatar_url": "https://avatars.githubusercontent.com/u/59506394?v=4", "profile": "https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375", "contributions": [ "doc" ] }, { "login": "Me1onRind", "name": "zZ", "avatar_url": "https://avatars.githubusercontent.com/u/19531270?v=4", "profile": "https://github.com/Me1onRind", "contributions": [ "code" ] }, { "login": "tainoNZ", "name": "Aaron Davison", "avatar_url": "https://avatars.githubusercontent.com/u/49261322?v=4", "profile": "https://github.com/tainoNZ", "contributions": [ "code" ] }, { "login": "composer404", "name": "Przemyslaw Kozik", "avatar_url": "https://avatars.githubusercontent.com/u/58251560?v=4", "profile": "https://github.com/composer404", "contributions": [ "design" ] }, { "login": "highfredo", "name": "Alfredo Arellano de la Fuente", "avatar_url": "https://avatars.githubusercontent.com/u/5951524?v=4", "profile": "https://github.com/highfredo", "contributions": [ "code" ] }, { "login": "NessunKim", "name": "MH Kim", "avatar_url": "https://avatars.githubusercontent.com/u/12974079?v=4", "profile": "https://github.com/NessunKim", "contributions": [ "code" ] }, { "login": "jaimeadf", "name": "Marmota", "avatar_url": "https://avatars.githubusercontent.com/u/40345645?v=4", "profile": "https://discord.gg/4c5EVTBhtp", "contributions": [ "design" ] }, { "login": "TENX-S", "name": "Ares Andrew", "avatar_url": "https://avatars.githubusercontent.com/u/40336192?v=4", "profile": "https://ares.zone", "contributions": [ "doc" ] }, { "login": "gkor", "name": "George Korsnick", "avatar_url": "https://avatars.githubusercontent.com/u/780052?v=4", "profile": "https://usual.io/", "contributions": [ "financial" ] }, { "login": "uluhonolulu", "name": "Artem Smirnov", "avatar_url": "https://avatars.githubusercontent.com/u/872764?v=4", "profile": "https://about.me/ulu", "contributions": [ "financial" ] }, { "login": "nevotheless", "name": "Tim Kopplow", "avatar_url": "https://avatars.githubusercontent.com/u/779797?v=4", "profile": "https://github.com/nevotheless", "contributions": [ "financial" ] }, { "login": "mrthock", "name": "mrthock", "avatar_url": "https://avatars.githubusercontent.com/u/88901709?v=4", "profile": "https://github.com/mrthock", "contributions": [ "financial" ] }, { "login": "lrottach", "name": "Lukas Rottach", "avatar_url": "https://avatars.githubusercontent.com/u/50323692?v=4", "profile": "https://github.com/lrottach", "contributions": [ "financial" ] }, { "login": "boonkerz", "name": "boonkerz", "avatar_url": "https://avatars.githubusercontent.com/u/277321?v=4", "profile": "https://github.com/boonkerz", "contributions": [ "code", "translation" ] }, { "login": "milotype", "name": "Milo Ivir", "avatar_url": "https://avatars.githubusercontent.com/u/43657314?v=4", "profile": "https://github.com/milotype", "contributions": [ "translation" ] }, { "login": "JasonCubic", "name": "JasonCubic", "avatar_url": "https://avatars.githubusercontent.com/u/8921015?v=4", "profile": "https://github.com/JasonCubic", "contributions": [ "design" ] }, { "login": "MaxWaldorf", "name": "MaxWaldorf", "avatar_url": "https://avatars.githubusercontent.com/u/15877853?v=4", "profile": "https://github.com/MaxWaldorf", "contributions": [ "infra" ] }, { "login": "mwz", "name": "Michael Wizner", "avatar_url": "https://avatars.githubusercontent.com/u/1190768?v=4", "profile": "https://github.com/mwz", "contributions": [ "code" ] }, { "login": "mgrulich", "name": "Martin", "avatar_url": "https://avatars.githubusercontent.com/u/781036?v=4", "profile": "https://github.com/mgrulich", "contributions": [ "code" ] }, { "login": "piersandro", "name": "Piersandro Guerrera", "avatar_url": "https://avatars.githubusercontent.com/u/19996309?v=4", "profile": "https://github.com/piersandro", "contributions": [ "doc", "translation" ] }, { "login": "0x973", "name": "0x973", "avatar_url": "https://avatars.githubusercontent.com/u/19320096?v=4", "profile": "https://github.com/0x973", "contributions": [ "code" ] }, { "login": "Allenator", "name": "Allenator", "avatar_url": "https://avatars.githubusercontent.com/u/11794943?v=4", "profile": "https://github.com/Allenator", "contributions": [ "doc" ] }, { "login": "microhobby", "name": "Matheus Castello", "avatar_url": "https://avatars.githubusercontent.com/u/2633321?v=4", "profile": "http://microhobby.com.br/blog", "contributions": [ "code" ] }, { "login": "Jai-JAP", "name": "Jai A P", "avatar_url": "https://avatars.githubusercontent.com/u/78354625?v=4", "profile": "https://github.com/Jai-JAP", "contributions": [ "platform" ] }, { "login": "ysc3839", "name": "Richard Yu", "avatar_url": "https://avatars.githubusercontent.com/u/12028138?v=4", "profile": "https://blog.ysc3839.com", "contributions": [ "code" ] }, { "login": "artu-ole", "name": "artu-ole", "avatar_url": "https://avatars.githubusercontent.com/u/15938416?v=4", "profile": "https://github.com/artu-ole", "contributions": [ "code" ] }, { "login": "TimaGribanov", "name": "Timofey Gribanov", "avatar_url": "https://avatars.githubusercontent.com/u/48593815?v=4", "profile": "https://timagribanov.github.io/", "contributions": [ "doc", "translation" ] }, { "login": "ChristianBingman", "name": "Christian Bingman", "avatar_url": "https://avatars.githubusercontent.com/u/42191425?v=4", "profile": "https://git.christianbingman.com", "contributions": [ "code" ] }, { "login": "Ox0400", "name": "zhipeng", "avatar_url": "https://avatars.githubusercontent.com/u/5310853?v=4", "profile": "http://zhangzhipeng2023.cn/", "contributions": [ "code" ] }, { "login": "woodmeal", "name": "woodmeal", "avatar_url": "https://avatars.githubusercontent.com/u/104011197?v=4", "profile": "https://github.com/woodmeal", "contributions": [ "code" ] }, { "login": "MagicLike", "name": "MagicLike", "avatar_url": "https://avatars.githubusercontent.com/u/82117109?v=4", "profile": "https://magiclike.codeberg.page/", "contributions": [ "doc" ] }, { "login": "hisamafahri", "name": "Hisam Fahri", "avatar_url": "https://avatars.githubusercontent.com/u/65691613?v=4", "profile": "https://github.com/hisamafahri", "contributions": [ "code" ] }, { "login": "LiangchengJ", "name": "Liangcheng Juves", "avatar_url": "https://avatars.githubusercontent.com/u/48881023?v=4", "profile": "https://liangchengj.com", "contributions": [ "code" ] }, { "login": "attet", "name": "Atte Timonen", "avatar_url": "https://avatars.githubusercontent.com/u/1911416?v=4", "profile": "https://github.com/attet", "contributions": [ "code" ] }, { "login": "joaompinto", "name": "João Pinto", "avatar_url": "https://avatars.githubusercontent.com/u/1143125?v=4", "profile": "https://www.linkedin.com/in/joaolmpinto/", "contributions": [ "doc" ] }, { "login": "Qiming-Liu", "name": "Alan", "avatar_url": "https://avatars.githubusercontent.com/u/68600416?v=4", "profile": "https://github.com/Qiming-Liu", "contributions": [ "code" ] }, { "login": "74th", "name": "Atsushi Morimoto", "avatar_url": "https://avatars.githubusercontent.com/u/1060011?v=4", "profile": "https://74th.tech/", "contributions": [ "financial" ] }, { "login": "aarles", "name": "Arles", "avatar_url": "https://avatars.githubusercontent.com/u/5369096?v=4", "profile": "https://arles.red/", "contributions": [ "financial" ] }, { "login": "six2dez", "name": "six2dez", "avatar_url": "https://avatars.githubusercontent.com/u/24670991?v=4", "profile": "https://pentestbook.six2dez.com/", "contributions": [ "financial" ] }, { "login": "CandiceJoy", "name": "Candice", "avatar_url": "https://avatars.githubusercontent.com/u/8854890?v=4", "profile": "https://github.com/CandiceJoy", "contributions": [ "financial" ] }, { "login": "kingrowen", "name": "Rowen Willabus", "avatar_url": "https://avatars.githubusercontent.com/u/13178700?v=4", "profile": "https://github.com/kingrowen", "contributions": [ "financial" ] }, { "login": "HengY1Sky", "name": "HengY1Coding✨", "avatar_url": "https://avatars.githubusercontent.com/u/98681454?v=4", "profile": "https://hengy1.top/", "contributions": [ "financial" ] }, { "login": "FrancisHG", "name": "Francis Gelderloos", "avatar_url": "https://avatars.githubusercontent.com/u/1611626?v=4", "profile": "https://github.com/FrancisHG", "contributions": [ "financial" ] }, { "login": "astromasoud", "name": "astromasoud", "avatar_url": "https://avatars.githubusercontent.com/u/18737721?v=4", "profile": "https://github.com/astromasoud", "contributions": [ "financial" ] }, { "login": "Spirit55555", "name": "Anders G. Jørgensen", "avatar_url": "https://avatars.githubusercontent.com/u/2357565?v=4", "profile": "https://spirit55555.dk/", "contributions": [ "financial" ] }, { "login": "djradon", "name": "Dave Richardson", "avatar_url": "https://avatars.githubusercontent.com/u/5224156?v=4", "profile": "https://github.com/djradon", "contributions": [ "financial" ] }, { "login": "tpberntsen", "name": "Thomas Peter Berntsen", "avatar_url": "https://avatars.githubusercontent.com/u/922318?v=4", "profile": "https://twitter.com/tpberntsen", "contributions": [ "financial" ] }, { "login": "eltociear", "name": "Ikko Ashimine", "avatar_url": "https://avatars.githubusercontent.com/u/22633385?v=4", "profile": "https://bandism.net/", "contributions": [ "doc" ] }, { "login": "giejqf", "name": "giejqf", "avatar_url": "https://avatars.githubusercontent.com/u/9211230?v=4", "profile": "https://github.com/giejqf", "contributions": [ "code" ] }, { "login": "LacazeThomas", "name": "Thomas LACAZE", "avatar_url": "https://avatars.githubusercontent.com/u/19855907?v=4", "profile": "https://github.com/LacazeThomas", "contributions": [ "code" ] }, { "login": "princemaple", "name": "Po Chen", "avatar_url": "https://avatars.githubusercontent.com/u/1329716?v=4", "profile": "https://pochen.me/", "contributions": [ "financial" ] }, { "login": "mzmznasipadang", "name": "Victor Chandra", "avatar_url": "https://avatars.githubusercontent.com/u/41635105?v=4", "profile": "https://victorchandra.carrd.co/", "contributions": [ "doc" ] }, { "login": "daniel347x", "name": "Dan Nissenbaum", "avatar_url": "https://avatars.githubusercontent.com/u/309746?v=4", "profile": "https://github.com/daniel347x", "contributions": [ "financial" ] }, { "login": "DunklerPhoenix", "name": "RogueThorn", "avatar_url": "https://avatars.githubusercontent.com/u/1261305?v=4", "profile": "https://github.com/DunklerPhoenix", "contributions": [ "financial" ] }, { "login": "spenserblack", "name": "Spenser Black", "avatar_url": "https://avatars.githubusercontent.com/u/8546709?v=4", "profile": "http://spenserblack.github.io", "contributions": [ "code" ] }, { "login": "zuedev", "name": "Alex", "avatar_url": "https://avatars.githubusercontent.com/u/24614929?v=4", "profile": "https://github.com/zuedev", "contributions": [ "financial" ] }, { "login": "HengY1Cola", "name": "HengY1Coding✨", "avatar_url": "https://avatars.githubusercontent.com/u/98681454?v=4", "profile": "https://hengy1.top/", "contributions": [ "financial" ] }, { "login": "dcarrero", "name": "David Carrero", "avatar_url": "https://avatars.githubusercontent.com/u/195768?v=4", "profile": "https://www.stackscale.com/", "contributions": [ "doc" ] }, { "login": "zhoro", "name": "Andrii Zhovtiak", "avatar_url": "https://avatars.githubusercontent.com/u/1105687?v=4", "profile": "https://github.com/zhoro", "contributions": [ "code" ] }, { "login": "JohnMasoner", "name": "Mason Ma", "avatar_url": "https://avatars.githubusercontent.com/u/42313377?v=4", "profile": "https://github.com/JohnMasoner", "contributions": [ "financial" ] }, { "login": "ntimo", "name": "Timo", "avatar_url": "https://avatars.githubusercontent.com/u/6145026?v=4", "profile": "https://github.com/ntimo", "contributions": [ "financial" ] }, { "login": "EvinRWatson", "name": "Evin Watson", "avatar_url": "https://avatars.githubusercontent.com/u/24227251?v=4", "profile": "https://www.linkedin.com/in/evinwatson/", "contributions": [ "doc" ] }, { "login": "deulizealand", "name": "Hendra Juli", "avatar_url": "https://avatars.githubusercontent.com/u/15981200?v=4", "profile": "https://t.me/hendrjl", "contributions": [ "doc" ] }, { "login": "wkricowski", "name": "Wellinton Kricowski", "avatar_url": "https://avatars.githubusercontent.com/u/36803521?v=4", "profile": "https://github.com/wkricowski", "contributions": [ "financial", "doc" ] }, { "login": "almzau", "name": "Allan", "avatar_url": "https://avatars.githubusercontent.com/u/29115846?v=4", "profile": "https://github.com/almzau", "contributions": [ "design" ] }, { "login": "BenjaminBrandmeier", "name": "Benjamin Brandmeier", "avatar_url": "https://avatars.githubusercontent.com/u/17959794?v=4", "profile": "https://oidamo.de", "contributions": [ "code" ] }, { "login": "patric1025", "name": "patric1025", "avatar_url": "https://avatars.githubusercontent.com/u/65654040?v=4", "profile": "https://github.com/patric1025", "contributions": [ "translation" ] }, { "login": "hermitpopcorn", "name": "hermitpopcorn", "avatar_url": "https://avatars.githubusercontent.com/u/16042129?v=4", "profile": "https://github.com/hermitpopcorn", "contributions": [ "code" ] }, { "login": "joshuatz", "name": "Joshua Tzucker", "avatar_url": "https://avatars.githubusercontent.com/u/17817563?v=4", "profile": "https://joshuatz.com/", "contributions": [ "financial" ] }, { "login": "luxifr", "name": "luxifr", "avatar_url": "https://avatars.githubusercontent.com/u/665715?v=4", "profile": "https://github.com/luxifr", "contributions": [ "financial" ] }, { "login": "ukulanne", "name": "Anne Summers", "avatar_url": "https://avatars.githubusercontent.com/u/28586666?v=4", "profile": "https://github.com/ukulanne", "contributions": [ "financial" ] }, { "login": "Clem-Fern", "name": "Clem", "avatar_url": "https://avatars.githubusercontent.com/u/20025949?v=4", "profile": "https://github.com/Clem-Fern", "contributions": [ "code" ] }, { "login": "elizabeth-dev", "name": "Elizabeth Martín Campos", "avatar_url": "https://avatars.githubusercontent.com/u/13015727?v=4", "profile": "https://github.com/elizabeth-dev", "contributions": [ "code" ] }, { "login": "siccous", "name": "Tomáš Hruška", "avatar_url": "https://avatars.githubusercontent.com/u/7812885?v=4", "profile": "https://github.com/siccous", "contributions": [ "code" ] }, { "login": "karaketir16", "name": "Osman Karaketir", "avatar_url": "https://avatars.githubusercontent.com/u/27349806?v=4", "profile": "https://github.com/karaketir16", "contributions": [ "code" ] }, { "login": "CryptoGnome", "name": "Crypto Gnome", "avatar_url": "https://avatars.githubusercontent.com/u/33667144?v=4", "profile": "https://www.gnomegarden.io/", "contributions": [ "financial" ] }, { "login": "rbukovansky", "name": "Richard Bukovansky", "avatar_url": "https://avatars.githubusercontent.com/u/1004491?v=4", "profile": "https://github.com/rbukovansky", "contributions": [ "financial" ] }, { "login": "pseudocc", "name": "catlas", "avatar_url": "https://avatars.githubusercontent.com/u/85104110?v=4", "profile": "https://github.com/pseudocc", "contributions": [ "financial" ] }, { "login": "Kapocsi", "name": "Thomas Kapocsi", "avatar_url": "https://avatars.githubusercontent.com/u/84490604?v=4", "profile": "http://kapocsi.ca", "contributions": [ "doc" ] }, { "login": "dylhack", "name": "Dylan Hackworth", "avatar_url": "https://avatars.githubusercontent.com/u/27179786?v=4", "profile": "https://dylhack.dev/", "contributions": [ "financial" ] }, { "login": "echo304", "name": "Sangboak Lee", "avatar_url": "https://avatars.githubusercontent.com/u/16456651?v=4", "profile": "https://github.com/echo304", "contributions": [ "code" ] }, { "login": "qyecst", "name": "qyecst", "avatar_url": "https://avatars.githubusercontent.com/u/13901864?v=4", "profile": "https://github.com/qyecst", "contributions": [ "code" ] }, { "login": "DehanLUO", "name": "Han", "avatar_url": "https://avatars.githubusercontent.com/u/53093688?v=4", "profile": "https://github.com/DehanLUO", "contributions": [ "code" ] }, { "login": "wljince007", "name": "wljince007", "avatar_url": "https://avatars.githubusercontent.com/u/88243938?v=4", "profile": "https://github.com/wljince007", "contributions": [ "code" ] }, { "login": "FeroTheFox", "name": "fero", "avatar_url": "https://avatars.githubusercontent.com/u/52982404?v=4", "profile": "https://github.com/FeroTheFox", "contributions": [ "code" ] }, { "login": "siebsie23", "name": "Sibren", "avatar_url": "https://avatars.githubusercontent.com/u/25083973?v=4", "profile": "https://siebsie23.nl/", "contributions": [ "code" ] }, { "login": "nwalser", "name": "Nathaniel Walser", "avatar_url": "https://avatars.githubusercontent.com/u/33339996?v=4", "profile": "https://www.nathaniel-walser.com", "contributions": [ "code" ] }, { "login": "aaronhuggins", "name": "Aaron Huggins", "avatar_url": "https://avatars.githubusercontent.com/u/16567111?v=4", "profile": "https://github.com/aaronhuggins", "contributions": [ "design" ] }, { "login": "zKXDEX", "name": "KDex", "avatar_url": "https://avatars.githubusercontent.com/u/66271780?v=4", "profile": "https://zkxdex.github.io/", "contributions": [ "code" ] }, { "login": "kimbob13", "name": "ChangHwan Kim", "avatar_url": "https://avatars.githubusercontent.com/u/26755098?v=4", "profile": "https://github.com/kimbob13", "contributions": [ "code" ] }, { "login": "ashneilson", "name": "Ash Neilson", "avatar_url": "https://avatars.githubusercontent.com/u/35913512?v=4", "profile": "https://github.com/ashneilson", "contributions": [ "code" ] }, { "login": "cfs4819", "name": "Chen Fansong", "avatar_url": "https://avatars.githubusercontent.com/u/53071761?v=4", "profile": "https://github.com/cfs4819", "contributions": [ "code" ] }, { "login": "Mxmilu666", "name": "Mxmilu", "avatar_url": "https://avatars.githubusercontent.com/u/82694310?v=4", "profile": "https://5k.work/", "contributions": [ "code" ] }, { "login": "C41M50N", "name": "Charles Buffington", "avatar_url": "https://avatars.githubusercontent.com/u/29805363?v=4", "profile": "https://cbuff.dev", "contributions": [ "code" ] }, { "login": "GeminiLn", "name": "Yu Qin", "avatar_url": "https://avatars.githubusercontent.com/u/12425057?v=4", "profile": "https://github.com/GeminiLn", "contributions": [ "code" ] }, { "login": "fireblue", "name": "fireblue", "avatar_url": "https://avatars.githubusercontent.com/u/1034929?v=4", "profile": "https://github.com/fireblue", "contributions": [ "code" ] }, { "login": "marko1616", "name": "marko1616", "avatar_url": "https://avatars.githubusercontent.com/u/45327989?v=4", "profile": "https://github.com/marko1616", "contributions": [ "code" ] }, { "login": "SelfHosted-Club", "name": "SelfHosted", "avatar_url": "https://avatars.githubusercontent.com/u/128927132?v=4", "profile": "https://www.selfhosted.sg/", "contributions": [ "financial" ] }, { "login": "xhiroga", "name": "Hiroaki Ogasawara", "avatar_url": "https://avatars.githubusercontent.com/u/13391129?v=4", "profile": "http://hiroga.hatenablog.com/", "contributions": [ "code" ] }, { "login": "geodic", "name": "geodic", "avatar_url": "https://avatars.githubusercontent.com/u/64704703?v=4", "profile": "https://github.com/geodic", "contributions": [ "code" ] }, { "login": "pfoundation", "name": "P Foundation", "avatar_url": "https://avatars.githubusercontent.com/u/80860929?v=4", "profile": "https://p.foundation/", "contributions": [ "financial" ] }, { "login": "et304383", "name": "et304383", "avatar_url": "https://avatars.githubusercontent.com/u/2693414?v=4", "profile": "https://github.com/et304383", "contributions": [ "code" ] }, { "login": "ajkrj", "name": "ajkrj", "avatar_url": "https://avatars.githubusercontent.com/u/210226755?v=4", "profile": "https://github.com/ajkrj", "contributions": [ "code" ] }, { "login": "leoberbert", "name": "Leonardo Berbert", "avatar_url": "https://avatars.githubusercontent.com/u/16724862?v=4", "profile": "https://www.linkedin.com/in/leoberbert/", "contributions": [ "code" ] } ], "contributorsPerLine": 7, "projectName": "tabby", "projectOwner": "Eugeny", "repoType": "github", "repoHost": "https://github.com", "commitConvention": "none", "skipCi": true, "commitType": "docs" } ================================================ FILE: .editorconfig ================================================ root = true [*] end_of_line = LF charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [*.sln] indent_style = tab # TODO Determine if there is a preferred tab width for this file type # Programming/Scripts [*.{js,ts}] indent_style = space indent_size = 4 [*.cpp] indent_style = tab # TODO Determine if there is a preferred tab width for this file type # Markup [*.pug] indent_style = space indent_size = 4 # Stylesheets [*.scss] indent_style = space indent_size = 4 # Data Files [*.json] indent_style = space indent_size = 2 [*.{yaml,yml}] indent_style = space indent_size = 2 ================================================ FILE: .eslintrc.yml ================================================ settings: import/parsers: '@typescript-eslint/parser': ['.ts'] import/resolver: typescript: project: - tsconfig.json - tabby-*/tsconfig.json node: true env: browser: true es6: true node: true commonjs: true overrides: - files: '*.mjs' plugins: - 'import' parserOptions: sourceType: module ecmaVersion: latest - files: '*.ts' parser: '@typescript-eslint/parser' parserOptions: project: - tsconfig.json - '*/tsconfig.typings.json' extends: - 'plugin:@typescript-eslint/all' - plugin:import/recommended - plugin:import/typescript plugins: - '@typescript-eslint' - import rules: '@typescript-eslint/semi': - error - never '@typescript-eslint/indent': - error - 4 '@typescript-eslint/explicit-member-accessibility': - error - accessibility: no-public overrides: parameterProperties: explicit '@typescript-eslint/no-require-imports': off '@typescript-eslint/no-parameter-properties': off '@typescript-eslint/explicit-function-return-type': off '@typescript-eslint/no-explicit-any': off '@typescript-eslint/no-magic-numbers': off '@typescript-eslint/member-delimiter-style': off '@typescript-eslint/promise-function-async': off '@typescript-eslint/require-array-sort-compare': off '@typescript-eslint/no-floating-promises': off '@typescript-eslint/prefer-readonly': off '@typescript-eslint/require-await': off '@typescript-eslint/strict-boolean-expressions': off '@typescript-eslint/no-misused-promises': - error - checksVoidReturn: false '@typescript-eslint/typedef': off '@typescript-eslint/consistent-type-imports': off '@typescript-eslint/sort-type-union-intersection-members': off '@typescript-eslint/no-use-before-define': - error - classes: false no-duplicate-imports: error array-bracket-spacing: - error - never block-scoped-var: error brace-style: off '@typescript-eslint/brace-style': - error - 1tbs - allowSingleLine: true computed-property-spacing: - error - never comma-dangle: off '@typescript-eslint/comma-dangle': - error - always-multiline curly: error eol-last: error eqeqeq: - error - smart max-depth: - 1 - 5 max-statements: - 1 - 80 no-multiple-empty-lines: error no-mixed-spaces-and-tabs: error no-trailing-spaces: error '@typescript-eslint/no-unused-vars': - error - vars: all args: after-used argsIgnorePattern: ^_ no-undef: error no-var: error object-curly-spacing: off '@typescript-eslint/object-curly-spacing': - error - always quote-props: - warn - as-needed - keywords: true numbers: true quotes: off '@typescript-eslint/quotes': - error - single - allowTemplateLiterals: true '@typescript-eslint/no-confusing-void-expression': - error - ignoreArrowShorthand: true '@typescript-eslint/no-non-null-assertion': off '@typescript-eslint/no-unnecessary-condition': - error - allowConstantLoopConditions: true '@typescript-eslint/restrict-template-expressions': off '@typescript-eslint/prefer-readonly-parameter-types': off '@typescript-eslint/no-unsafe-member-access': off '@typescript-eslint/no-unsafe-call': off '@typescript-eslint/no-unsafe-return': off '@typescript-eslint/no-unsafe-assignment': off '@typescript-eslint/naming-convention': off '@typescript-eslint/lines-between-class-members': - error - always - exceptAfterSingleLine: true '@typescript-eslint/dot-notation': off '@typescript-eslint/no-implicit-any-catch': off '@typescript-eslint/member-ordering': off '@typescript-eslint/no-var-requires': off '@typescript-eslint/no-unsafe-argument': off '@typescript-eslint/restrict-plus-operands': off '@typescript-eslint/space-infix-ops': off '@typescript-eslint/no-type-alias': - error - allowAliases: in-unions-and-intersections allowLiterals: always allowCallbacks: always '@typescript-eslint/sort-type-constituents': off '@typescript-eslint/parameter-properties': - error - prefer: parameter-property 'import/no-named-as-default-member': off '@typescript-eslint/consistent-type-exports': off '@typescript-eslint/consistent-generic-constructors': off 'keyword-spacing': off '@typescript-eslint/keyword-spacing': off '@typescript-eslint/class-methods-use-this': off '@typescript-eslint/lines-around-comment': off '@typescript-eslint/no-redundant-type-constituents': off # broken ================================================ FILE: .github/FUNDING.yml ================================================ github: eugeny open_collective: tabby ko_fi: eugeny ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: Suggest an idea for this project title: '' labels: '' assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. ================================================ FILE: .github/ISSUE_TEMPLATE/issue-report.md ================================================ --- name: Issue report about: Report a problem title: '' labels: 'T: Bug' assignees: '' --- **Describe the problem**: [A clear and concise description of what the bug is.] **To Reproduce**: [Steps to reproduce the behavior] ================================================ FILE: .github/dependabot.yml ================================================ version: 2 updates: - package-ecosystem: npm directory: "/" schedule: interval: daily time: "04:00" open-pull-requests-limit: 20 - package-ecosystem: npm directory: "/app" schedule: interval: daily time: "04:00" open-pull-requests-limit: 20 - package-ecosystem: npm directory: "/tabby-core" schedule: interval: daily time: "04:00" open-pull-requests-limit: 20 - package-ecosystem: npm directory: "/tabby-settings" schedule: interval: daily time: "04:00" open-pull-requests-limit: 20 - package-ecosystem: npm directory: "/tabby-terminal" schedule: interval: daily time: "04:00" open-pull-requests-limit: 20 - package-ecosystem: npm directory: "/tabby-local" schedule: interval: daily time: "04:00" open-pull-requests-limit: 20 - package-ecosystem: npm directory: "/tabby-community-color-schemes" schedule: interval: daily time: "04:00" open-pull-requests-limit: 20 - package-ecosystem: npm directory: "/tabby-electron" schedule: interval: daily time: "04:00" open-pull-requests-limit: 20 - package-ecosystem: npm directory: "/tabby-web" schedule: interval: daily time: "04:00" open-pull-requests-limit: 20 - package-ecosystem: npm directory: "/tabby-plugin-manager" schedule: interval: daily time: "04:00" open-pull-requests-limit: 20 - package-ecosystem: npm directory: "/tabby-ssh" schedule: interval: daily time: "04:00" open-pull-requests-limit: 20 - package-ecosystem: github-actions directory: "/" schedule: interval: daily time: "04:00" open-pull-requests-limit: 20 ================================================ FILE: .github/stale.yml ================================================ # Number of days of inactivity before an issue becomes stale daysUntilStale: 180 # Number of days of inactivity before a stale issue is closed daysUntilClose: 90 # Issues with these labels will never be considered stale exemptLabels: - "T: Enhancement" - "S: Confirmed" # Label to use when marking an issue as stale staleLabel: "S: Stale" # Comment to post when marking an issue as stale. Set to `false` to disable markComment: > This issue has been automatically marked as stale because it has not had recent activity. It will be closed in two weeks unless you comment. Thank you for your contributions. # Comment to post when closing a stale issue. Set to `false` to disable closeComment: false ================================================ FILE: .github/workflows/build.yml ================================================ name: Package-Build on: [push, pull_request] jobs: Lint: runs-on: ubuntu-24.04 steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Installing Node uses: actions/setup-node@v4.4.0 with: node-version: 22 - name: Install deps run: | sudo apt-get update && sudo apt-get install -y libfontconfig1-dev npm i -g yarn cd app yarn cd .. rm app/node_modules/.yarn-integrity yarn - name: Build typings run: yarn run build:typings - name: Lint run: yarn run lint macOS-Build: runs-on: macos-15 needs: Lint strategy: matrix: include: - arch: x86_64 rust_triple: x86_64-apple-darwin - arch: arm64 rust_triple: aarch64-apple-darwin fail-fast: false env: ARCH: ${{matrix.arch}} RUST_TARGET_TRIPLE: ${{matrix.rust_triple}} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Installing Node uses: actions/setup-node@v4.4.0 with: node-version: 22 - run: rustup target add ${{matrix.rust_triple}} - name: Install deps run: | yarn --network-timeout 1000000 env: ARCH: ${{matrix.arch}} - name: Webpack run: yarn run build - name: Prepackage plugins run: scripts/prepackage-plugins.mjs env: ARCH: ${{matrix.arch}} - run: sed -i '' 's/updateInfo = await/\/\/updateInfo = await/g' node_modules/app-builder-lib/out/targets/ArchiveTarget.js # Work around electron-builder beta bug - run: ln -s ../../node_modules/electron app/node_modules - name: Build and sign packages run: scripts/build-macos.mjs if: github.event_name == 'push' && (github.ref_protected || startsWith(github.ref, 'refs/tags')) env: ARCH: ${{matrix.arch}} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }} CSC_LINK: ${{ secrets.CSC_LINK }} CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} APPSTORE_USERNAME: ${{ secrets.APPSTORE_USERNAME }} APPSTORE_PASSWORD: ${{ secrets.APPSTORE_PASSWORD }} USE_HARD_LINKS: false # DEBUG: electron-builder,electron-builder:* - name: Build packages without signing run: scripts/build-macos.mjs if: "! (github.event_name == 'push' && (github.ref_protected || startsWith(github.ref, 'refs/tags')))" env: ARCH: ${{matrix.arch}} # DEBUG: electron-builder,electron-builder:* - name: Upload symbols run: | sudo npm install -g @sentry/cli --unsafe-perm ./scripts/sentry-upload.mjs env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} SENTRY_ORG: ${{ secrets.SENTRY_ORG }} SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} - name: Package artifacts run: | mkdir artifact-dmg mv dist/*.dmg artifact-dmg/ mkdir artifact-zip mv dist/*.zip artifact-zip/ - uses: actions/upload-artifact@master name: Upload DMG with: name: macOS .dmg (${{matrix.arch}}) path: artifact-dmg - uses: actions/upload-artifact@master name: Upload ZIP with: name: macOS .zip (${{matrix.arch}}) path: artifact-zip Linux-Build: runs-on: ${{matrix.os}} needs: Lint strategy: matrix: include: - build-arch: x64 arch: amd64 rust_triple: x86_64-unknown-linux-gnu os: ubuntu-24.04 - build-arch: arm64 arch: arm64 rust_triple: aarch64-unknown-linux-gnu triplet: aarch64-linux-gnu- os: ubuntu-24.04-arm - build-arch: arm arch: armhf rust_triple: arm-unknown-linux-gnueabihf triplet: arm-linux-gnueabihf- os: ubuntu-24.04 fail-fast: false env: CC: ${{matrix.triplet}}gcc CXX: ${{matrix.triplet}}g++ ARCH: ${{matrix.build-arch}} npm_config_arch: ${{matrix.build-arch}} npm_config_target_arch: ${{matrix.build-arch}} RUST_TARGET_TRIPLE: ${{matrix.rust_triple}} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Install Node uses: actions/setup-node@v4.4.0 with: node-version: 22 - name: Install FPM run: | sudo gem install fpm - run: rustup target add ${{matrix.rust_triple}} - name: Install dependencies run: | sudo apt-get update sudo apt-get install libfontconfig1-dev libarchive-tools zsh crossbuild-essential-${{matrix.arch}} - name: Setup tar to run as root run: sudo chmod u+s "$(command -v tar)" if: matrix.build-arch == 'arm' - name: Download cached sysroot uses: actions/cache@v3 id: dl-cached-sysroot if: matrix.build-arch == 'arm' with: key: sysroot-${{matrix.build-arch}} path: /${{matrix.build-arch}}-sysroot - name: Setup crossbuild sysroot run: | sudo apt-get update -y && sudo apt-get install debootstrap qemu-user-static binfmt-support -y sudo qemu-debootstrap --include=libfontconfig1-dev,libsecret-1-dev,libnss3,libatk1.0-0,libatk-bridge2.0-0,libgdk-pixbuf2.0-0,libgtk-3-0,libgbm1 --variant=buildd --exclude=snapd --components=main,restricted,universe,multiverse --extractor=dpkg-deb --arch ${{matrix.arch}} bionic /${{matrix.build-arch}}-sysroot/ http://ports.ubuntu.com/ubuntu-ports/ sudo find /${{matrix.build-arch}}-sysroot -type l -lname '/*' -exec sh -c 'file="$0"; dir=$(dirname "$file"); target=$(readlink "$0"); prefix=$(dirname "$dir" | sed 's@[^/]*@\.\.@g'); newtarget="$prefix$target"; ln -snf $newtarget $file' {} \; ; if: matrix.build-arch == 'arm' && steps.dl-cached-sysroot.outputs.cache-hit != 'true' - name: Setup env to use ${{matrix.build-arch}} sysroot run: | echo "CFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV echo "CXXFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV echo "LDFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV [[ ${npm_config_arch} == 'arm' ]] && echo "npm_config_arch=armv7l" >> $GITHUB_ENV if [[ ${{matrix.arch}} == 'armhf' ]]; then echo "PKG_CONFIG_PATH=/${{matrix.build-arch}}-sysroot/usr/lib/pkgconfig/:/${{matrix.build-arch}}-sysroot/usr/lib/arm-linux-gnueabihf/pkgconfig/" >> $GITHUB_ENV elif [[ ${{matrix.arch}} == 'arm64' ]]; then echo "PKG_CONFIG_PATH=/${{matrix.build-arch}}-sysroot/usr/lib/pkgconfig/:/${{matrix.build-arch}}-sysroot/usr/lib/aarch64-linux-gnu/pkgconfig/" >> $GITHUB_ENV fi if: matrix.build-arch == 'arm' - name: Install npm_modules (native) run: | npm i -g yarn node-gyp yarn --network-timeout 1000000 --arch=${{matrix.build-arch}} --target-arch=${{matrix.build-arch}} - name: Webpack (${{matrix.arch}}) run: yarn run build --arch=${{matrix.build-arch}} --target_arch=${{matrix.build-arch}} - name: Prepackage plugins (${{matrix.arch}}) run: scripts/prepackage-plugins.mjs - name: Build packages (${{matrix.arch}}) run: scripts/build-linux.mjs env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }} USE_HARD_LINKS: false USE_SYSTEM_FPM: true # DEBUG: electron-builder,electron-builder:* - name: Build web resources (amd64 only) run: zsh -c 'tar czf tabby-web.tar.gz (tabby-*|web)/dist' if: matrix.build-arch == 'x64' - name: Upload symbols (amd64 only) run: | sudo npm install -g @sentry/cli --unsafe-perm ./scripts/sentry-upload.mjs if: matrix.build-arch == 'x64' env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} SENTRY_ORG: ${{ secrets.SENTRY_ORG }} SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} - name: Upload packages to packagecloud.io uses: TykTechnologies/packagecloud-action@main if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') env: PACKAGECLOUD_TOKEN: ${{ secrets.PACKAGECLOUD_TOKEN }} with: repo: 'eugeny/tabby' dir: 'dist' rpmvers: 'el/9 el/8 ol/6 ol/7' debvers: 'ubuntu/bionic ubuntu/focal ubuntu/hirsute ubuntu/impish ubuntu/jammy ubuntu/kinetic ubuntu/noble ubuntu/oracular debian/jessie debian/stretch debian/buster debian/bullseye debian/bookworm debian/trixie debian/forky debian/duke debian/testing debian/unstable debian/sid' - uses: actions/upload-artifact@master name: Upload AppImage (${{matrix.arch}}) with: name: Linux AppImage (${{matrix.arch}}) path: dist/*.AppImage - uses: actions/upload-artifact@master name: Upload DEB (${{matrix.arch}}) with: name: Linux DEB (${{matrix.arch}}) path: dist/*.deb - uses: actions/upload-artifact@master name: Upload RPM (${{matrix.arch}}) with: name: Linux RPM (${{matrix.arch}}) path: dist/*.rpm - uses: actions/upload-artifact@master name: Upload Pacman Package (${{matrix.arch}}) with: name: Linux Pacman (${{matrix.arch}}) path: dist/*.pacman - uses: actions/upload-artifact@master name: Upload Linux tarball (${{matrix.arch}}) with: name: Linux tarball (${{matrix.arch}}) path: dist/*.tar.gz - uses: actions/upload-artifact@master name: Upload web tarball (amd64 only) with: name: Web tarball path: tabby-web.tar.gz if: matrix.build-arch == 'x64' Windows-Build: runs-on: windows-latest needs: Lint strategy: matrix: include: - arch: x64 rust_triple: x86_64-pc-windows-msvc - arch: arm64 rust_triple: aarch64-pc-windows-msvc fail-fast: false env: RUST_TARGET_TRIPLE: ${{matrix.rust_triple}} ARCH: ${{matrix.arch}} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Code signing with Software Trust Manager uses: digicert/ssm-code-signing@v1.1.1 if: github.event_name == 'push' && (startsWith(github.ref, 'refs/tags')) env: FORCE_DOWNLOAD_TOOLS: 'true' - name: Installing Node uses: actions/setup-node@v4.4.0 with: node-version: 22 - run: npm i -g npx - run: rustup target add ${{matrix.rust_triple}} - name: Update node-gyp run: | npm install --global node-gyp@10.2.0 npm prefix -g | % {npm config set node_gyp "$_\node_modules\node-gyp\bin\node-gyp.js"} - name: Build shell: powershell run: | npm i -g yar node-gyp yarn --network-timeout 1000000 yarn run build node scripts/prepackage-plugins.mjs env: ARCH: ${{matrix.arch}} - name: Decode certificate if: github.event_name == 'push' && (startsWith(github.ref, 'refs/tags')) env: SM_CLIENT_CERT_FILE_B64: ${{ secrets.SM_CLIENT_CERT_FILE_B64 }} run: | SM_CLIENT_CERT_FILE=$RUNNER_TEMP/certificate.p12 echo "$SM_CLIENT_CERT_FILE_B64" | base64 --decode > $SM_CLIENT_CERT_FILE echo "SM_CLIENT_CERT_FILE=$SM_CLIENT_CERT_FILE" >> "$GITHUB_ENV" shell: bash - name: Build and sign packages if: github.event_name == 'push' && (startsWith(github.ref, 'refs/tags')) shell: powershell run: | Get-FileHash $env:SM_CLIENT_CERT_FILE -Algorithm MD5 smksp_registrar.exe list smctl.exe healthcheck smctl.exe keypair ls smctl windows certsync --keypair-alias $env:SM_KEYPAIR_ALIAS smctl.exe certificate ls C:\Windows\System32\certutil.exe -csp "DigiCert Signing Manager KSP" -key -user smksp_cert_sync.exe # not used but necessary for electron-builder to run $env:WIN_CSC_LINK=$env:SM_CLIENT_CERT_FILE $env:WIN_CSC_KEY_PASSWORD=$env:SM_CLIENT_CERT_PASSWORD node scripts/build-windows.mjs env: ARCH: ${{matrix.arch}} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }} SM_CLIENT_CERT_PASSWORD: ${{ secrets.SM_CLIENT_CERT_PASSWORD }} SM_PUBLISHER_NAME: ${{ secrets.SM_PUBLISHER_NAME }} SM_API_KEY: ${{ secrets.SM_API_KEY }} SM_HOST: ${{ vars.SM_HOST }} SM_CODE_SIGNING_CERT_SHA1_HASH: ${{ vars.SM_CODE_SIGNING_CERT_SHA1_HASH }} SM_KEYPAIR_ALIAS: ${{ vars.SM_KEYPAIR_ALIAS }} # DEBUG: electron-builder,electron-builder:* - name: Build packages without signing run: node scripts/build-windows.mjs if: "! (github.event_name == 'push' && (startsWith(github.ref, 'refs/tags')))" env: ARCH: ${{matrix.arch}} - name: Upload symbols run: | npm install @sentry/cli node scripts/sentry-upload.mjs env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} SENTRY_ORG: ${{ secrets.SENTRY_ORG }} SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} - name: Package artifacts run: | mkdir artifact-setup mv dist/*-setup-*.exe artifact-setup/ mkdir artifact-portable mv dist/*-portable-*.zip artifact-portable/ - uses: actions/upload-artifact@master name: Upload installer with: name: Windows installer (${{matrix.arch}}) path: artifact-setup - uses: actions/upload-artifact@master name: Upload portable build with: name: Windows portable build (${{matrix.arch}}) path: artifact-portable ================================================ FILE: .github/workflows/codeql-analysis.yml ================================================ # For most projects, this workflow file will not need changing; you simply need # to commit it to your repository. # # You may wish to alter this file to override the set of languages analyzed, # or to provide custom queries or build logic. # # ******** NOTE ******** # We have attempted to detect the languages in your repository. Please check # the `language` matrix defined below to confirm you have the correct set of # supported CodeQL languages. # name: "CodeQL" on: push: branches: [ master ] pull_request: # The branches below must be a subset of the branches above branches: [ master ] schedule: - cron: '26 7 * * 4' jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: [ 'javascript' ] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] # Learn more about CodeQL language support at https://git.io/codeql-language-support steps: - name: Checkout repository uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # queries: ./path/to/local/query, your-org/your-repo/queries@main # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild uses: github/codeql-action/autobuild@v2 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines # and modify them (or add more) to build your code if your project # uses a compiled language #- run: | # make bootstrap # make release - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v2 ================================================ FILE: .github/workflows/docs.yml ================================================ name: Docs on: push jobs: build: runs-on: ubuntu-latest if: ${{ github.actor != 'dependabot[bot]' }} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Installing Node uses: actions/setup-node@v4.4.0 with: node-version: 22 - name: Build run: | sudo apt update && sudo apt install libfontconfig1-dev yarn cache clean cd app yarn cd .. rm app/node_modules/.yarn-integrity yarn yarn run build:typings yarn run docs env: DOCS_PRIVATE_KEY: ${{ secrets.DOCS_PRIVATE_KEY }} - uses: FirebaseExtended/action-hosting-deploy@v0 with: repoToken: '${{ secrets.GITHUB_TOKEN }}' firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_TABBY_DOCS }}' channelId: live projectId: tabby-docs ================================================ FILE: .github/workflows/release.yml ================================================ --- name: "tagged-release" on: push: tags: - "v*" jobs: tagged-release: name: "Tagged Release" runs-on: "ubuntu-latest" steps: - uses: "marvinpinto/action-automatic-releases@latest" with: repo_token: "${{ secrets.GITHUB_TOKEN }}" prerelease: false draft: true ================================================ FILE: .gitignore ================================================ app/node_modules app/assets/webpack node_modules build/files.wxs dist */dist */typings *.tsbuildinfo *.xcworkspacedata *.xcuserstate *.wixpdb .DS_Store .DS_Store? coverage .nyc_output npm-debug.log builtin-plugins package-lock.json yarn-error.log docs/api .travis.ssh.key *.code-workspace .idea/ .electron-symbols sentry.properties sentry-symbols.js *.psd crowdin.yml .crowdin.env ================================================ FILE: .mergify.yml ================================================ pull_request_rules: - name: automatic merge on CI success and review conditions: - "status-success=Windows Build / Build" - "status-success=macOS Build / Build" - "status-success=Linux Build / Build" - "status-success=continuous-integration/appveyor/pr" - "#approved-reviews-by>=1" - "#changes-requested-reviews-by=0" - base=master actions: merge: method: merge strict: true ================================================ FILE: .pug-lintrc.js ================================================ module.export = { } ================================================ FILE: .vscode/launch.json ================================================ { "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "Electron: Main", "protocol": "inspector", "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron", "env": { "TABBY_DEV": "1" }, "runtimeArgs": [ "--remote-debugging-port=9223", "app" ], "windows": { "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd" } }, { "name": "Electron: Renderer", "type": "pwa-chrome", "request": "attach", "port": 9223, "webRoot": "${workspaceFolder}", "timeout": 30000 } ], "compounds": [ { "name": "Electron: All", "configurations": [ "Electron: Main", "Electron: Renderer" ] } ] } ================================================ FILE: .well-known/funding-manifest-urls ================================================ https://null.page/funding.json ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at e@ajenti.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/4/ ================================================ FILE: HACKING.md ================================================ # Some background Tabby is an Electron app, with the frontend written in Typescript with the help of Angular framework. It's built using Webpack. # Getting started First of all, clone this repository. # Install Dependencies - [Node.js](https://nodejs.org/en/download/) **version 15 or newer* - [Yarn](https://yarnpkg.com/) First, from within the `tabby` directory install the dependencies via yarn: ``` # macOS & Windows: yarn ``` ``` # Linux (Debian/Ubuntu here as an example) sudo apt install libfontconfig-dev libsecret-1-dev libarchive-tools libnss3 libatk1.0-0 libatk-bridge2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libgbm1 cmake yarn ``` _⚠️Note: If you forked this repository, you may need to pull down the tags from this repository before installing node modules. `git pull --tags upstream master`_ Build Tabby: ``` yarn run build ``` Start Tabby ``` yarn start ``` # Building an installer To build an installer, first complete a "normal" build as described above and then run: ``` node scripts/prepackage-plugins.mjs node scripts/build-windows.mjs # or node scripts/build-linux.mjs # or node scripts/build-macos.mjs ``` The artifacts will be produced in the `dist` folder. # Project layout ``` tabby ├─ app # Electron app, just the bare essentials | ├─ src # Electron renderer code | └─ main.js # Electron main entry point ├─ build ├─ clink # Clink distribution, for Windows ├─ scripts # Maintenance scripts ├─ tabby-community-color-schemes # Plugin that provides color schemes ├─ tabby-core # Plugin that provides base UI and tab management ├─ tabby-electron # Plugin that provides Electron-specific functions ├─ tabby-local # Plugin that provides local shells and profiles ├─ tabby-plugin-manager # Plugin that installs other plugins ├─ tabby-settings # Plugin that provides the settings tab ├─ tabby-terminal # Plugin that provides terminal tabs └─ tabby-web # Plugin that provides web-specific functions ``` # Plugin layout ``` tabby-pluginname ├─ src # Typescript code | ├─ components # Angular components | | ├─ foo.component.ts # Code | | ├─ foo.component.scss # Styles | | └─ foo.component.pug # Template | ├─ services # Angular services | | └─ foo.service.ts | ├─ api.ts # Publicly exported API | └─ index.ts # Module entry point ├─ package.json ├─ tsconfig.json └─ webpack.config.js ``` # Plugins The app will load all plugins from the source checkout in the dev mode, from the user's plugins directory at all times (click `Open Plugins Directory` under `Settings` > `Plugins`) and from the directory specified by the `TABBY_PLUGINS` environment var. Only modules whose `package.json` file contains a `tabby-plugin` keyword will be loaded. If you're currently in your plugin's directory, start Tabby as `TABBY_PLUGINS=$(pwd) tabby --debug` A plugin should only provide a default export, which should be a `NgModule` class (or a `NgModuleWithDependencies` where applicable). This module will be injected as a dependency to the app's root module. ```javascript import { NgModule } from '@angular/core' @NgModule() export default class MyModule { constructor () { console.log('Angular engaged, cap\'n.') } } ``` Plugins provide functionality by exporting singular or multi providers: ```javascript import { NgModule, Injectable } from '@angular/core' import { ToolbarButtonProvider, ToolbarButton } from 'tabby-core' @Injectable() export class MyButtonProvider extends ToolbarButtonProvider { provide (): ToolbarButton[] { return [{ icon: 'star', title: 'Foobar', weight: 10, click: () => { alert('Woohoo!') } }] } } @NgModule({ providers: [ { provide: ToolbarButtonProvider, useClass: MyButtonProvider, multi: true }, ], }) export default class MyModule { } ``` See `tabby-core/src/api.ts`, `tabby-settings/src/api.ts`, `tabby-local/src/api.ts` and `tabby-terminal/src/api.ts` for the available extension points. Also check out [the example plugin](https://github.com/Eugeny/tabby-clippy). Publish your plugin on NPM with a `tabby-plugin` keyword to make it appear in the Plugin Manager. ================================================ FILE: LICENSE ================================================ The MIT License (MIT) Copyright (c) 2017 Tabby Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.de-DE.md ================================================ [![](docs/readme.png)](https://tabby.sh)

Alle GitHub Releases Matrix   Übersetzen Twitter

---- ### Downloads: * [Neueste Version](https://github.com/Eugeny/tabby/releases/latest) * [Repositories](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu-basiert](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM-basiert](https://packagecloud.io/eugeny/tabby/install#bash-rpm) * [Neueste nightly Version](https://nightly.link/Eugeny/tabby/workflows/build/master)

Diese README ist auch verfügbar in: :gb: English · :es: Spanish · :ru: Русский · :kr: 한국어 · :cn: 简体中文 · :it: Italiano · :jp: 日本語 · :id: Bahasa Indonesia · :brazil: Português · :poland: Polski

---- [**Tabby**](https://tabby.sh) (ehemals **Terminus**) ist ein äußerst konfigurierbarer Terminalemulator, SSH- und serieller Client für Windows, macOS und Linux * Integrierter SSH- und Telnet-Client und Verbindungsmanager * Integriertes serielles Terminal * Theming und Farbschemata * Vollständig konfigurierbare Tastenkombinationen und Multi-Akkord-Tastenkombinationen * Geteilte Fenster * Merkt sich deine Tabs * Unterstützung für PowerShell (und PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder und CMD * Direkte Dateiübertragung von/zu SSH-Sitzungen über Zmodem * Vollständige Unicode-Unterstützung, einschließlich Zeichen mit doppelter Breite * Kein Abbruch bei schnell ablaufenden Ausgaben * Richtiges Shell-Erlebnis unter Windows, einschließlich Tabulator-Vervollständigung (über Clink) * Integrierter verschlüsselter Container für SSH-Secrets und Konfiguration * SSH-, SFTP- und Telnet-Client verfügbar als [Web-App](https://tabby.sh/app) (auch [selbstgehostet](https://github.com/Eugeny/tabby-web)). # Inhaltsverzeichnis - [Was Tabby ist und was nicht](#what-tabby-is-and-isnt) - [Terminal-Funktionen](#terminal-features) - [SSH Client](#ssh-client) - [Serielles Terminal](#serial-terminal) - [Portabel](#portable) - [Plugins](#plugins) - [Themen](#themes) - [Beitragen](#contributing) # Was Tabby ist und was nicht **Tabby ist** eine Alternative zu Windows Standard-Terminal (conhost), PowerShell ISE, PuTTY, macOS Terminal.app und iTerm **Tabby ist weder** eine neue Shell noch ein MinGW- oder Cygwin-Ersatz. Sie ist auch nicht gerade sparsam - wenn die RAM-Nutzung von Bedeutung ist, solltest Du [Conemu](https://conemu.github.io) oder [Alacritty](https://github.com/jwilm/alacritty) in Betracht ziehen. # Terminal-Funktionen ![](docs/readme-terminal.png) * Ein VT220-Terminal + verschiedene Erweiterungen * Mehrere verschachtelte, geteilte Fenster * Tabs auf jeder Seite des Fensters * Optional andockbares Fenster mit einem globalen Spawn-Hotkey ("Quake-Konsole") * Fortschrittserkennung * Benachrichtigung bei Prozessabschluss * Einfügen in Klammern, mehrzeilige Einfügewarnungen * Schriftart-Ligaturen * Benutzerdefinierte Shell-Profile * Optionales RMB-Einfügen und Kopieren bei Auswahl (PuTTY-Stil) # SSH Client ![](docs/readme-ssh.png) * SSH2-Client mit einem Verbindungsmanager * X11 und Portweiterleitung * Automatisches Jump-Host-Management * Agent-Weiterleitung (inkl. Pageant und Windows-eigenem OpenSSH-Agent) * Anmeldeskripte # Serielles Terminal * Gespeicherte Verbindungen * Unterstützung von Readline-Eingaben * Optionale hexadezimale Byte-für-Byte-Eingabe und Hexdump-Ausgabe * Newline-Konvertierung * Automatische Wiederverbindung # Portabel Tabby läuft als portable Anwendung unter Windows, wenn Sie einen `data`-Ordner am selben Ort erstellen, an dem sich auch `Tabby.exe` befindet. # Plugins Plugins und Themen können direkt aus der Ansicht "Einstellungen" in Tabby installiert werden. * [docker](https://github.com/Eugeny/tabby-docker) - Verbindung zu Docker-Containern * [title-control](https://github.com/kbjr/terminus-title-control) - ermöglicht die Änderung des Titels der Terminal-Tabs durch Angabe eines Präfixes, Suffixes und/oder zu entfernender Strings * [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - schnelles Senden von Befehlen an eine oder alle Terminal-Tabs * [save-output](https://github.com/Eugeny/tabby-save-output) - speichert Terminalausgaben in einer Datei * [sync-config](https://github.com/starxg/terminus-sync-config) - synchronisiert die Konfiguration mit Gist oder Gitee * [clippy](https://github.com/Eugeny/tabby-clippy) - ein Beispiel-Plugin, das einen die ganze Zeit nervt * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - ermöglicht das Erstellen eigener Workspace-Profile auf Basis der angegebenen Konfiguration * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - öffnet den Standard-Systembrowser mit einem Text, der aus dem Tabby Tab ausgewählt wurde * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - Öffnet ein SFTP-Tab für SSH-Verbindungen ähnlich wie SecureCRT * [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - In-App-Web-Authentifizierungspopups (Hauptsächlich für die in-Browser-Authentifizierung von Warpgate entwickelt) * [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Leistungsstarke Model Context Protocol Server-Integration für Tabby, die sich nahtlos mit KI-Assistenten über MCP-Clients wie Cursor und Windsurf verbindet und Ihren Terminal-Workflow mit intelligenten KI-Funktionen verbessert. # Themen * [hype](https://github.com/Eugeny/tabby-theme-hype) - ein von Hyper inspiriertes Thema * [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - das entspannte Thema für Tabby * [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox) * [windows10](https://www.npmjs.com/package/terminus-theme-windows10) * [altair](https://github.com/yxuko/terminus-altair) # Sponsoren [![](https://assets-production.packagecloud.io/assets/packagecloud-logo-light-scaled-26ce8e96060fddf74afbd4445e63ba35590d4aaa56edc98495bb390ef3cae0ae.png)](https://packagecloud.io) [**packagecloud**](https://packagecloud.io) bietet kostenloses Debian/RPM-Repository-Hosting an # Beitragen Pull Requests und Plugins sind willkommen! Siehe [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) und [API docs](https://docs.tabby.sh/) für Informationen über den Aufbau des Projekts und ein sehr kurzes Tutorial zur Plugin-Entwicklung. --- Dank geht an diese wunderbaren Menschen ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
Russell Myers
Russell Myers

💻
Austin Warren
Austin Warren

💻
Felicia Hummel
Felicia Hummel

💻
Mike MacCana
Mike MacCana

⚠️ 🎨
Yacine Kanzari
Yacine Kanzari

💻
BBJip
BBJip

💻
Futagirl
Futagirl

🎨
Levin Rickert
Levin Rickert

💻
OJ Kwon
OJ Kwon

💻
domain
domain

🔌 💻
James Brumond
James Brumond

🔌
Daniel Imms
Daniel Imms

💻 🔌 ⚠️
Florian Bachmann
Florian Bachmann

💻
Michael Kühnel
Michael Kühnel

💻 🎨
Tilmann Meyer
Tilmann Meyer

💻
PM Extra
PM Extra

🐛
Jonathan
Jonathan

💻
Hans Koch
Hans Koch

💻
Dak Smyth
Dak Smyth

💻
Wang Zhi
Wang Zhi

💻
jack1142
jack1142

💻
Howie Douglas
Howie Douglas

💻
Chris Kaczor
Chris Kaczor

💻
Johannes Kadak
Johannes Kadak

💻
LeSeulArtichaut
LeSeulArtichaut

💻
Cyril Taylor
Cyril Taylor

💻
nstefanou
nstefanou

💻 🔌
orin220444
orin220444

💻
Gobius Dolhain
Gobius Dolhain

💻
Gwilherm Folliot
Gwilherm Folliot

💻
Dmitry Pronin
Dmitry Pronin

💻
Jonathan Beverley
Jonathan Beverley

💻
Zenghai Liang
Zenghai Liang

💻
Mateusz Tracz
Mateusz Tracz

💻
pinpin
pinpin

💻
Takuro Onoda
Takuro Onoda

💻
frauhottelmann
frauhottelmann

💻
Piotr Patalong
Piotr Patalong

🎨
Clark Wang
Clark Wang

💻
iamchating
iamchating

💻
starxg
starxg

🔌
Alisue
Alisue

🎨
Dominic Yin
Dominic Yin

💻
Brandon Rothweiler
Brandon Rothweiler

🎨
Logic Machine
Logic Machine

📖
cypherbits
cypherbits

📖
Matthew Davidson
Matthew Davidson

💻
Alexander Wiedemann
Alexander Wiedemann

💻
장보연
장보연

📖
zZ
zZ

💻
Aaron Davison
Aaron Davison

💻
Przemyslaw Kozik
Przemyslaw Kozik

🎨
Alfredo Arellano de la Fuente
Alfredo Arellano de la Fuente

💻
MH Kim
MH Kim

💻
Marmota
Marmota

🎨
Ares Andrew
Ares Andrew

📖
George Korsnick
George Korsnick

💵
Artem Smirnov
Artem Smirnov

💵
Tim Kopplow
Tim Kopplow

💵
mrthock
mrthock

💵
Lukas Rottach
Lukas Rottach

💵
boonkerz
boonkerz

💻 🌍
Milo Ivir
Milo Ivir

🌍
JasonCubic
JasonCubic

🎨
MaxWaldorf
MaxWaldorf

🚇
Michael Wizner
Michael Wizner

💻
Martin
Martin

💻
Piersandro Guerrera
Piersandro Guerrera

📖 🌍
0x973
0x973

💻
Allenator
Allenator

📖
Matheus Castello
Matheus Castello

💻
Jai A P
Jai A P

📦
Richard Yu
Richard Yu

💻
artu-ole
artu-ole

💻
Timofey Gribanov
Timofey Gribanov

📖 🌍
Christian Bingman
Christian Bingman

💻
zhipeng
zhipeng

💻
woodmeal
woodmeal

💻
MagicLike
MagicLike

📖
Hisam Fahri
Hisam Fahri

💻
Liangcheng Juves
Liangcheng Juves

💻
Atte Timonen
Atte Timonen

💻
João Pinto
João Pinto

📖
Alan
Alan

💻
Atsushi Morimoto
Atsushi Morimoto

💵
Arles
Arles

💵
six2dez
six2dez

💵
Candice
Candice

💵
Rowen Willabus
Rowen Willabus

💵
HengY1Coding✨
HengY1Coding✨

💵
Francis Gelderloos
Francis Gelderloos

💵
astromasoud
astromasoud

💵
Anders G. Jørgensen
Anders G. Jørgensen

💵
Dave Richardson
Dave Richardson

💵
Thomas Peter Berntsen
Thomas Peter Berntsen

💵
Ikko Ashimine
Ikko Ashimine

📖
giejqf
giejqf

💻
Thomas LACAZE
Thomas LACAZE

💻
Po Chen
Po Chen

💵
Victor Chandra
Victor Chandra

📖
Dan Nissenbaum
Dan Nissenbaum

💵
RogueThorn
RogueThorn

💵
Spenser Black
Spenser Black

💻
Alex
Alex

💵
HengY1Coding✨
HengY1Coding✨

💵
David Carrero
David Carrero

📖
Andrii Zhovtiak
Andrii Zhovtiak

💻
Mason Ma
Mason Ma

💵
Timo
Timo

💵
Evin Watson
Evin Watson

📖
Hendra Juli
Hendra Juli

📖
Wellinton Kricowski
Wellinton Kricowski

💵 📖
Allan
Allan

🎨
Benjamin Brandmeier
Benjamin Brandmeier

💻
patric1025
patric1025

🌍
hermitpopcorn
hermitpopcorn

💻
Joshua Tzucker
Joshua Tzucker

💵
luxifr
luxifr

💵
Anne Summers
Anne Summers

💵
Clem
Clem

💻
Elizabeth Martín Campos
Elizabeth Martín Campos

💻
Tomáš Hruška
Tomáš Hruška

💻
Osman Karaketir
Osman Karaketir

💻
Crypto Gnome
Crypto Gnome

💵
Richard Bukovansky
Richard Bukovansky

💵
catlas
catlas

💵
Thomas Kapocsi
Thomas Kapocsi

📖
Dylan Hackworth
Dylan Hackworth

💵
Sangboak Lee
Sangboak Lee

💻
qyecst
qyecst

💻
Han
Han

💻
wljince007
wljince007

💻
fero
fero

💻
Sibren
Sibren

💻
Nathaniel Walser
Nathaniel Walser

💻
Aaron Huggins
Aaron Huggins

🎨
KDex
KDex

💻
ChangHwan Kim
ChangHwan Kim

💻
Ash Neilson
Ash Neilson

💻
Chen Fansong
Chen Fansong

💻
Mxmilu
Mxmilu

💻
Charles Buffington
Charles Buffington

💻
Yu Qin
Yu Qin

💻
fireblue
fireblue

💻
marko1616
marko1616

💻
SelfHosted
SelfHosted

💵
Hiroaki Ogasawara
Hiroaki Ogasawara

💻
geodic
geodic

💻
P Foundation
P Foundation

💵
et304383
et304383

💻
ajkrj
ajkrj

💻
Leonardo Berbert
Leonardo Berbert

💻
Dieses Projekt folgt der [all-contributors](https://github.com/all-contributors/all-contributors) Spezifikation. Beiträge jeglicher Art sind willkommen! ================================================ FILE: README.es-ES.md ================================================ [![](docs/readme.png)](https://tabby.sh)

Todas las revisiones en GitHub     Matrix   Translate   Twitter

---- ### Descargas: * [Última versión](https://github.com/Eugeny/tabby/releases/latest) * [Repositorios](https://packagecloud.io/eugeny/tabby): [Basado en Debian/Ubuntu](https://packagecloud.io/eugeny/tabby/install#bash-deb), [basado en RPM](https://packagecloud.io/eugeny/tabby/install#bash-rpm) * [Última versión nocturna](https://nightly.link/Eugeny/tabby/workflows/build/master)

Este fichero README está disponible en: :gb: English · :ru: Русский · :kr: 한국어 · :cn: 简体中文 · :it: Italiano · :de: Deutsch · :jp: 日本語 · :id: Bahasa Indonesia · :brazil: Português · :poland: Polski

---- [**Tabby**](https://tabby.sh) (anteriormente **Terminus**) es un emulador de terminal, SSH y cliente serie altamente configurable parar Windows, macOS y Linux * Cliente y gestor de conexiones SSH y Telnet integrados * Terminal serie integrado * Esquemas de colores y temas * Totalmente configurable con atajos y atajos múltiples * Paneles divididos * Recuerda tus pestañas * Soporte para PowerShell (y PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder y CMD * Transferencia de ficheros directa desde/a sesiones SSH via Zmodem * Soporte completo Unicode incluyendo caracteres dobles * No se bloquea con las salidas rápidas * Experiencia adecuada del shell en Windows, incluyendo la finalización de pestañas (via Clink) * Contenedor encriptado integrado para los secretos SSH y la configuración * Cliente SSH, SFTP y Telnet disponible como [aplicación web](https://tabby.sh/app) (incluso [auto-alojada](https://github.com/Eugeny/tabby-web)). # Contenidos - [¿Qué es Tabby y que no es?](#what-tabby-is-and-isnt) - [Características de Terminal](#terminal-features) - [Cliente SSH](#ssh-client) - [Terminal Serie](#serial-terminal) - [Portable](#portable) - [Plugins](#plugins) - [Temas](#themes) - [Contribuciones](#contributing) # ¿Qué es Tabby y que no es? * **Tabby es** una alternativa al terminal estándar de Windows (cohost), PowerShell ISE, PuTTY, macOS Terminal.app e iTerm * **Tabby no es** un nuevo shell o un sustituto de MinGW o de Cygwin. Tampo es ligero - si el uso de RAM es importante, considera [Conemu](https://conemu.github.io) o [Alacritty](https://github.com/jwilm/alacritty) # Características de Terminal ![](docs/readme-terminal.png) * Un terminal VT220 + varias extensiones * Múltiples paneles divididos anidados * Pestañas en cualquier lado de la ventana * Ventana acoplable opcional con una tecla de acceso directo global ("consola de Quake") * Detección del progreso * Notificación de la finalización del proceso * Pegar entre corchetes, avisos de pegar multilínea * Tipos de letra ligados * Perfiles personalizados en el shell * Opción de pegar y copiar al seleccionar RMB (estilo PuTTY) # Cliente SSH ![](docs/readme-ssh.png) * Cliente SSH2 con gestor de conexiones * X11 y reenvío de puertos * Gestión de host de salto automático * Reenvío de agentes (incluido el agente de Pageant y el agente OpenSSH nativo de Windows) * Scripts de inicio de sesión # Terminal Serie * Conexiones guardadas * Soporte de entrada de línea de lectura * Entrada hexagonal byte a byte y salida hexdump opcionales * Conversión de la nueva línea * Reconexión automática # Portable Tabby se ejecutará como una aplicación portátil en Windows, si crea una carpeta `data` en la misma ubicación donde se encuentra `Tabby.exe`. # Plugins Los plugins y los temas se pueden instalar directamente desde la vista de Configuración dentro de Tabby. * [docker](https://github.com/Eugeny/tabby-docker) - conectarse a los contenedores Docker * [title-control](https://github.com/kbjr/terminus-title-control) - permite modificar el título de las pestañas de los terminales proporcionando un prefijo, un sufijo y/o cadenas a eliminar * [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - enviar rápidamente comandos a una o a todas las pestañas del terminal * [save-output](https://github.com/Eugeny/tabby-save-output) - registrar la salida del terminal en un archivo * [sync-config](https://github.com/starxg/terminus-sync-config) - sincronizar la configuración con Gist o Gitee * [clippy](https://github.com/Eugeny/tabby-clippy) - un ejemplo de plugin que te molesta todo el tiempo * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - permite crear perfiles de espacio de trabajo personalizados basados en la configuración dada * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - abre el navegador del sistema por defecto con un texto seleccionado en la pestaña de Tabby's * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - abre una pestaña sftp para la conexión ssh como SecureCRT * [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - Ventanas emergentes de autenticación web dentro de la app (Construidas principalmente para la autenticación en el navegador de warpgate) * [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Potente integración del servidor de Protocolo de Contexto de Modelo para Tabby que se conecta sin problemas con asistentes de IA a través de clientes MCP como Cursor y Windsurf, mejorando tu flujo de trabajo en terminal con capacidades inteligentes de IA. # Temas * [hype](https://github.com/Eugeny/tabby-theme-hype) - Tema inspirado en Hyper * [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - El tema relajado para Tabby * [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox) * [windows10](https://www.npmjs.com/package/terminus-theme-windows10) * [altair](https://github.com/yxuko/terminus-altair) # Patrocinadores [![](https://assets-production.packagecloud.io/assets/packagecloud-logo-light-scaled-26ce8e96060fddf74afbd4445e63ba35590d4aaa56edc98495bb390ef3cae0ae.png)](https://packagecloud.io) [**packagecloud**](https://packagecloud.io) ha proporcionado alojamiento gratuito de repositorios Debian/RPM [![](https://user-images.githubusercontent.com/161476/193406404-1784f40c-eaba-44d0-af11-d8bd35517382.png)](https://keygen.sh/?via=eugene) [**keygen**](https://keygen.sh/?via=eugene) ha proporcionado alojamiento gratuito para la liberación y la actualización automática # Contribuciones ¡Solicitudes de Pull y plugins son bienvenidas! Mira [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) y [documentación API](https://docs.tabby.sh/) para obtener información sobre el diseño del proyecto y un breve tutorial de desarrollo de plugins. --- Gracias a estas maravillosas personas ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
Russell Myers
Russell Myers

💻
Austin Warren
Austin Warren

💻
Felicia Hummel
Felicia Hummel

💻
Mike MacCana
Mike MacCana

⚠️ 🎨
Yacine Kanzari
Yacine Kanzari

💻
BBJip
BBJip

💻
Futagirl
Futagirl

🎨
Levin Rickert
Levin Rickert

💻
OJ Kwon
OJ Kwon

💻
domain
domain

🔌 💻
James Brumond
James Brumond

🔌
Daniel Imms
Daniel Imms

💻 🔌 ⚠️
Florian Bachmann
Florian Bachmann

💻
Michael Kühnel
Michael Kühnel

💻 🎨
Tilmann Meyer
Tilmann Meyer

💻
PM Extra
PM Extra

🐛
Jonathan
Jonathan

💻
Hans Koch
Hans Koch

💻
Dak Smyth
Dak Smyth

💻
Wang Zhi
Wang Zhi

💻
jack1142
jack1142

💻
Howie Douglas
Howie Douglas

💻
Chris Kaczor
Chris Kaczor

💻
Johannes Kadak
Johannes Kadak

💻
LeSeulArtichaut
LeSeulArtichaut

💻
Cyril Taylor
Cyril Taylor

💻
nstefanou
nstefanou

💻 🔌
orin220444
orin220444

💻
Gobius Dolhain
Gobius Dolhain

💻
Gwilherm Folliot
Gwilherm Folliot

💻
Dmitry Pronin
Dmitry Pronin

💻
Jonathan Beverley
Jonathan Beverley

💻
Zenghai Liang
Zenghai Liang

💻
Mateusz Tracz
Mateusz Tracz

💻
pinpin
pinpin

💻
Takuro Onoda
Takuro Onoda

💻
frauhottelmann
frauhottelmann

💻
Piotr Patalong
Piotr Patalong

🎨
Clark Wang
Clark Wang

💻
iamchating
iamchating

💻
starxg
starxg

🔌
Alisue
Alisue

🎨
Dominic Yin
Dominic Yin

💻
Brandon Rothweiler
Brandon Rothweiler

🎨
Logic Machine
Logic Machine

📖
cypherbits
cypherbits

📖
Matthew Davidson
Matthew Davidson

💻
Alexander Wiedemann
Alexander Wiedemann

💻
장보연
장보연

📖
zZ
zZ

💻
Aaron Davison
Aaron Davison

💻
Przemyslaw Kozik
Przemyslaw Kozik

🎨
Alfredo Arellano de la Fuente
Alfredo Arellano de la Fuente

💻
MH Kim
MH Kim

💻
Marmota
Marmota

🎨
Ares Andrew
Ares Andrew

📖
George Korsnick
George Korsnick

💵
Artem Smirnov
Artem Smirnov

💵
Tim Kopplow
Tim Kopplow

💵
mrthock
mrthock

💵
Lukas Rottach
Lukas Rottach

💵
boonkerz
boonkerz

💻 🌍
Milo Ivir
Milo Ivir

🌍
JasonCubic
JasonCubic

🎨
MaxWaldorf
MaxWaldorf

🚇
Michael Wizner
Michael Wizner

💻
Martin
Martin

💻
Piersandro Guerrera
Piersandro Guerrera

📖 🌍
0x973
0x973

💻
Allenator
Allenator

📖
Matheus Castello
Matheus Castello

💻
Jai A P
Jai A P

📦
Richard Yu
Richard Yu

💻
artu-ole
artu-ole

💻
Timofey Gribanov
Timofey Gribanov

📖 🌍
Christian Bingman
Christian Bingman

💻
zhipeng
zhipeng

💻
woodmeal
woodmeal

💻
MagicLike
MagicLike

📖
Hisam Fahri
Hisam Fahri

💻
Liangcheng Juves
Liangcheng Juves

💻
Atte Timonen
Atte Timonen

💻
João Pinto
João Pinto

📖
Alan
Alan

💻
Atsushi Morimoto
Atsushi Morimoto

💵
Arles
Arles

💵
six2dez
six2dez

💵
Candice
Candice

💵
Rowen Willabus
Rowen Willabus

💵
HengY1Coding✨
HengY1Coding✨

💵
Francis Gelderloos
Francis Gelderloos

💵
astromasoud
astromasoud

💵
Anders G. Jørgensen
Anders G. Jørgensen

💵
Dave Richardson
Dave Richardson

💵
Thomas Peter Berntsen
Thomas Peter Berntsen

💵
Ikko Ashimine
Ikko Ashimine

📖
giejqf
giejqf

💻
Thomas LACAZE
Thomas LACAZE

💻
Po Chen
Po Chen

💵
Victor Chandra
Victor Chandra

📖
Dan Nissenbaum
Dan Nissenbaum

💵
RogueThorn
RogueThorn

💵
Spenser Black
Spenser Black

💻
Alex
Alex

💵
HengY1Coding✨
HengY1Coding✨

💵
David Carrero
David Carrero

📖
Andrii Zhovtiak
Andrii Zhovtiak

💻
Mason Ma
Mason Ma

💵
Timo
Timo

💵
Evin Watson
Evin Watson

📖
Hendra Juli
Hendra Juli

📖
Wellinton Kricowski
Wellinton Kricowski

💵 📖
Allan
Allan

🎨
Benjamin Brandmeier
Benjamin Brandmeier

💻
patric1025
patric1025

🌍
hermitpopcorn
hermitpopcorn

💻
Joshua Tzucker
Joshua Tzucker

💵
luxifr
luxifr

💵
Anne Summers
Anne Summers

💵
Clem
Clem

💻
Elizabeth Martín Campos
Elizabeth Martín Campos

💻
Tomáš Hruška
Tomáš Hruška

💻
Osman Karaketir
Osman Karaketir

💻
Crypto Gnome
Crypto Gnome

💵
Richard Bukovansky
Richard Bukovansky

💵
catlas
catlas

💵
Thomas Kapocsi
Thomas Kapocsi

📖
Dylan Hackworth
Dylan Hackworth

💵
Sangboak Lee
Sangboak Lee

💻
qyecst
qyecst

💻
Han
Han

💻
wljince007
wljince007

💻
fero
fero

💻
Sibren
Sibren

💻
Nathaniel Walser
Nathaniel Walser

💻
Aaron Huggins
Aaron Huggins

🎨
KDex
KDex

💻
ChangHwan Kim
ChangHwan Kim

💻
Ash Neilson
Ash Neilson

💻
Chen Fansong
Chen Fansong

💻
Mxmilu
Mxmilu

💻
Charles Buffington
Charles Buffington

💻
Yu Qin
Yu Qin

💻
fireblue
fireblue

💻
marko1616
marko1616

💻
SelfHosted
SelfHosted

💵
Hiroaki Ogasawara
Hiroaki Ogasawara

💻
geodic
geodic

💻
P Foundation
P Foundation

💵
et304383
et304383

💻
ajkrj
ajkrj

💻
Leonardo Berbert
Leonardo Berbert

💻
Este proyecto sigue la especificación [all-contributors](https://github.com/all-contributors/all-contributors). ¡Las contribuciones de cualquier tipo son bienvenidas!. ================================================ FILE: README.id-ID.md ================================================ [![](docs/readme.png)](https://tabby.sh)

GitHub All Releases     Matrix   Translate   Twitter

---- ### Downloads: * [Rilis Terbaru](https://github.com/Eugeny/tabby/releases/latest) * [Repositories](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu-based](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM-based](https://packagecloud.io/eugeny/tabby/install#bash-rpm) * [Latest nightly build](https://nightly.link/Eugeny/tabby/workflows/build/master)

This README is also available in: :gb: English · :es: Spanish · :ru: Русский · :kr: 한국어 · :cn: 简体中文 · :it: Italiano · :de: Deutsch · :jp: 日本語 · :brazil: Português · :poland: Polski

---- [**Tabby**](https://tabby.sh) (sebelumnya **Terminus**) adalah emulator terminal, SSH, dan klien serial yang sangat dapat dikonfigurasi untuk Windows, macOS, dan Linux * Integrasi SSH dan klien Telnet dan Koneksi Manager * Integrasi terminal serial * Tema dan skema warna * Pintasan yang dapat dikonfigurasi sepenuhnya dan pintasan multi-chord * Panel yang bisa dipisahkan * Mengingat tab anda * Mendukung PowerShell (dan PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder dan CMD * File transfer secara langsung dari/ke sesi SSH melalui Zmodem * Mendukung Unicode termasuk karakter double-width * Tidak tersendat dengan output yang tampil dengan cepat * Pengalaman shell yang tepat di Windows termasuk penyelesaian tab (melalui Clink) * Terintegrasi dengan wadah terenkripsi untuk rahasia dan konfigurasi SSH * SSH, SFTP dan klien Telnet tersedia sebagai [aplikasi web](https://tabby.sh/app) (dan juga [self-hosted](https://github.com/Eugeny/tabby-web)). # Contents - [Apa itu Tabby dan bukan Tabby](#what-tabby-is-and-isnt) - [Fitur Terminal](#terminal-features) - [SSH Client](#ssh-client) - [Serial Terminal](#serial-terminal) - [Portabel](#portable) - [Plugins](#plugins) - [Tema](#themes) - [Kontribusi](#contributing) # Apa itu Tabby dan bukan Tabby * **Tabby adalah** sebuah alternatif untuk terminal standar Windows' (conhost), PowerShell ISE, PuTTY, macOS Terminal.app dan iTerm * **Tabby bukan** shell yang baru atau pengganti MinGW atau Cygwin. Dan bukan aplikasi ringan - jika mengutamakan penggunaan RAM, mungkin boleh mencoba [Conemu](https://conemu.github.io) atau [Alacritty](https://github.com/jwilm/alacritty) # Fitur terminal ![](docs/readme-terminal.png) * Terminal VT220 + berbagai macam ekstensi * Beberapa pembagian panel * Tab di sisi mana pun dari jendela * Jendela dockable opsional dengan hotkey spawn global ("Quake console") * Deteksi Progres * Notifikasi saat proses telah selesai * Tempel tanda kurung, peringatan tempel multiline * Pengikat font * Kustom profil shell * Opsional tempel RMB dan copy-on select (PuTTY style) # Klien SSH ![](docs/readme-ssh.png) * Klien SSH2 dengan manajemen koneksi * X11 dan port forwarding * Otomatis berpindah host management * Agent forwarding (termasuk Pageant dan Windows native OpenSSH Agent) * Login scripts # Serial Terminal * Koneksi yang disimpan * Support Readline input * Opsional hex byte-by-byte input dan hexdump output * Konversi Newline * Rekoneksi secara otomatis # Portabel Tabby tetap bisa berjalan sebagai aplikasi portabel di Windows, jika anda membuat folder `data` di tempat yang sama dengan `Tabby.exe`. # Plugins Tema dan Plugin bisa langsung di install dari Pengaturan di dalam Tabby. * [docker](https://github.com/Eugeny/tabby-docker) - untuk koneksi ke Docker containers * [title-control](https://github.com/kbjr/terminus-title-control) - memperbolehkan untuk mengganti judul di tab terminal dengan menyediakan prefix, suffix, dan/atau strings untuk di buang * [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - kirimkan perintah ke satu atau semua tab terminal dengan cepat * [save-output](https://github.com/Eugeny/tabby-save-output) - merekam output terminal ke suatu file * [sync-config](https://github.com/starxg/terminus-sync-config) - sinkronisasi konfigurasi ke Gist atau Gitee * [clippy](https://github.com/Eugeny/tabby-clippy) - suatu contoh plugin yang akan mengganggu anda setiap saat * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - memperbolehkan membuat kustom profil workspace dari konfigurasi yang diberikan * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - membuka browser default dengan text yang dipilih dari Tab Tabby * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - membuka tab sftp untuk koneksi ssh seperti SecureCRT * [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - Pop-up otentikasi web di dalam aplikasi (Dibangun terutama untuk otentikasi in-browser warpgate) * [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Integrasi server Model Context Protocol yang kuat untuk Tabby yang terhubung secara mulus dengan asisten AI melalui klien MCP seperti Cursor dan Windsurf, meningkatkan alur kerja terminal Anda dengan kemampuan AI yang cerdas. # Tema * [hype](https://github.com/Eugeny/tabby-theme-hype) - inspirasi dari tema Hyper * [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - Tabby, tapi lebih santuy * [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox) * [windows10](https://www.npmjs.com/package/terminus-theme-windows10) * [altair](https://github.com/yxuko/terminus-altair) # Sponsors [![](https://assets-production.packagecloud.io/assets/packagecloud-logo-light-scaled-26ce8e96060fddf74afbd4445e63ba35590d4aaa56edc98495bb390ef3cae0ae.png)](https://packagecloud.io) [**packagecloud**](https://packagecloud.io) telah menyediakan hosting gratis untuk Debian/RPM Repisitory # Kontribusi Pull requests dan plugins dipersilahkan! Lihat [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) dan [API docs](https://docs.tabby.sh/) untuk informasi lebih lajut tentang project ini, dan tutorial singkat untuk plugin. --- Terima kasih kepada mereka yang telah membantu ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
Russell Myers
Russell Myers

💻
Austin Warren
Austin Warren

💻
Felicia Hummel
Felicia Hummel

💻
Mike MacCana
Mike MacCana

⚠️ 🎨
Yacine Kanzari
Yacine Kanzari

💻
BBJip
BBJip

💻
Futagirl
Futagirl

🎨
Levin Rickert
Levin Rickert

💻
OJ Kwon
OJ Kwon

💻
domain
domain

🔌 💻
James Brumond
James Brumond

🔌
Daniel Imms
Daniel Imms

💻 🔌 ⚠️
Florian Bachmann
Florian Bachmann

💻
Michael Kühnel
Michael Kühnel

💻 🎨
Tilmann Meyer
Tilmann Meyer

💻
PM Extra
PM Extra

🐛
Jonathan
Jonathan

💻
Hans Koch
Hans Koch

💻
Dak Smyth
Dak Smyth

💻
Wang Zhi
Wang Zhi

💻
jack1142
jack1142

💻
Howie Douglas
Howie Douglas

💻
Chris Kaczor
Chris Kaczor

💻
Johannes Kadak
Johannes Kadak

💻
LeSeulArtichaut
LeSeulArtichaut

💻
Cyril Taylor
Cyril Taylor

💻
nstefanou
nstefanou

💻 🔌
orin220444
orin220444

💻
Gobius Dolhain
Gobius Dolhain

💻
Gwilherm Folliot
Gwilherm Folliot

💻
Dmitry Pronin
Dmitry Pronin

💻
Jonathan Beverley
Jonathan Beverley

💻
Zenghai Liang
Zenghai Liang

💻
Mateusz Tracz
Mateusz Tracz

💻
pinpin
pinpin

💻
Takuro Onoda
Takuro Onoda

💻
frauhottelmann
frauhottelmann

💻
Piotr Patalong
Piotr Patalong

🎨
Clark Wang
Clark Wang

💻
iamchating
iamchating

💻
starxg
starxg

🔌
Alisue
Alisue

🎨
Dominic Yin
Dominic Yin

💻
Brandon Rothweiler
Brandon Rothweiler

🎨
Logic Machine
Logic Machine

📖
cypherbits
cypherbits

📖
Matthew Davidson
Matthew Davidson

💻
Alexander Wiedemann
Alexander Wiedemann

💻
장보연
장보연

📖
zZ
zZ

💻
Aaron Davison
Aaron Davison

💻
Przemyslaw Kozik
Przemyslaw Kozik

🎨
Alfredo Arellano de la Fuente
Alfredo Arellano de la Fuente

💻
MH Kim
MH Kim

💻
Marmota
Marmota

🎨
Ares Andrew
Ares Andrew

📖
George Korsnick
George Korsnick

💵
Artem Smirnov
Artem Smirnov

💵
Tim Kopplow
Tim Kopplow

💵
mrthock
mrthock

💵
Lukas Rottach
Lukas Rottach

💵
boonkerz
boonkerz

💻 🌍
Milo Ivir
Milo Ivir

🌍
JasonCubic
JasonCubic

🎨
MaxWaldorf
MaxWaldorf

🚇
Michael Wizner
Michael Wizner

💻
Martin
Martin

💻
Piersandro Guerrera
Piersandro Guerrera

📖 🌍
0x973
0x973

💻
Allenator
Allenator

📖
Matheus Castello
Matheus Castello

💻
Jai A P
Jai A P

📦
Richard Yu
Richard Yu

💻
artu-ole
artu-ole

💻
Timofey Gribanov
Timofey Gribanov

📖 🌍
Christian Bingman
Christian Bingman

💻
zhipeng
zhipeng

💻
woodmeal
woodmeal

💻
MagicLike
MagicLike

📖
Hisam Fahri
Hisam Fahri

💻
Liangcheng Juves
Liangcheng Juves

💻
Atte Timonen
Atte Timonen

💻
João Pinto
João Pinto

📖
Alan
Alan

💻
Atsushi Morimoto
Atsushi Morimoto

💵
Arles
Arles

💵
six2dez
six2dez

💵
Candice
Candice

💵
Rowen Willabus
Rowen Willabus

💵
HengY1Coding✨
HengY1Coding✨

💵
Francis Gelderloos
Francis Gelderloos

💵
astromasoud
astromasoud

💵
Anders G. Jørgensen
Anders G. Jørgensen

💵
Dave Richardson
Dave Richardson

💵
Thomas Peter Berntsen
Thomas Peter Berntsen

💵
Ikko Ashimine
Ikko Ashimine

📖
giejqf
giejqf

💻
Thomas LACAZE
Thomas LACAZE

💻
Po Chen
Po Chen

💵
Victor Chandra
Victor Chandra

📖
Dan Nissenbaum
Dan Nissenbaum

💵
RogueThorn
RogueThorn

💵
Spenser Black
Spenser Black

💻
Alex
Alex

💵
HengY1Coding✨
HengY1Coding✨

💵
David Carrero
David Carrero

📖
Andrii Zhovtiak
Andrii Zhovtiak

💻
Mason Ma
Mason Ma

💵
Timo
Timo

💵
Evin Watson
Evin Watson

📖
Hendra Juli
Hendra Juli

📖
Wellinton Kricowski
Wellinton Kricowski

💵 📖
Allan
Allan

🎨
Benjamin Brandmeier
Benjamin Brandmeier

💻
patric1025
patric1025

🌍
hermitpopcorn
hermitpopcorn

💻
Joshua Tzucker
Joshua Tzucker

💵
luxifr
luxifr

💵
Anne Summers
Anne Summers

💵
Clem
Clem

💻
Elizabeth Martín Campos
Elizabeth Martín Campos

💻
Tomáš Hruška
Tomáš Hruška

💻
Osman Karaketir
Osman Karaketir

💻
Crypto Gnome
Crypto Gnome

💵
Richard Bukovansky
Richard Bukovansky

💵
catlas
catlas

💵
Thomas Kapocsi
Thomas Kapocsi

📖
Dylan Hackworth
Dylan Hackworth

💵
Sangboak Lee
Sangboak Lee

💻
qyecst
qyecst

💻
Han
Han

💻
wljince007
wljince007

💻
fero
fero

💻
Sibren
Sibren

💻
Nathaniel Walser
Nathaniel Walser

💻
Aaron Huggins
Aaron Huggins

🎨
KDex
KDex

💻
ChangHwan Kim
ChangHwan Kim

💻
Ash Neilson
Ash Neilson

💻
Chen Fansong
Chen Fansong

💻
Mxmilu
Mxmilu

💻
Charles Buffington
Charles Buffington

💻
Yu Qin
Yu Qin

💻
fireblue
fireblue

💻
marko1616
marko1616

💻
SelfHosted
SelfHosted

💵
Hiroaki Ogasawara
Hiroaki Ogasawara

💻
geodic
geodic

💻
P Foundation
P Foundation

💵
et304383
et304383

💻
ajkrj
ajkrj

💻
Leonardo Berbert
Leonardo Berbert

💻
Project ini mengikuti semua spesifikasi dari [all-contributors](https://github.com/all-contributors/all-contributors). Kontribusi akan sangat diterima! ================================================ FILE: README.it-IT.md ================================================ [![](docs/readme.png)](https://tabby.sh)

GitHub All Releases     Matrix   Translate   Twitter

---- ### Downloads: * [Ultima versione](https://github.com/Eugeny/tabby/releases/latest) * [Repository](https://packagecloud.io/eugeny/tabby): [Pacchetto Debian/Ubuntu](https://packagecloud.io/eugeny/tabby/install#bash-deb), [Pachetto RPM](https://packagecloud.io/eugeny/tabby/install#bash-rpm) * [Ultima edizione nightly](https://nightly.link/Eugeny/tabby/workflows/build/master)

Questo README è disponibile anche in: :gb: English · :es: Spanish · :ru: Русский · :kr: 한국어 · :cn: 简体中文 · :de: Deutsch · :jp: 日本語 · :id: Bahasa Indonesia · :brazil: Português · :poland: Polski ---- [**Tabby**](https://tabby.sh) (precedentemente **Terminus**) è un emulatore di terminale, SSH e client seriale altamente configurabile per Windows, macOS e Linux * Client SSH e Telnet integrato con gestore delle connessioni * Terminale seriale integrato * Temi e combinazioni di colori * Scorciatoie completamente configurabili e scorciatoie multi-tasto * Divisibile in pannelli * Ricorda le schede aperte * Supporto PowerShell (e PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder e CMD * Trasferimento file diretto da/a sessioni SSH tramite Zmodem * Pieno supporto Unicode inclusi caratteri a doppia larghezza * Non si blocca su output a flusso rapido * Proper shell experience on Windows including tab completion (via Clink) * Integrated encrypted container for SSH secrets and configuration * Esperienza shell studiaat per Windows incluso il completamento delle schede (tramite Clink) * Contenitore crittografato integrato per chiavi SSH e file di configurazione * Client SSH, SFTP e Telnet disponibile come [web app](https://tabby.sh/app) (anche [self-hosted](https://github.com/Eugeny/tabby-web)). # Contenuti - [Cosa è e cosa non è Tabby](#cosa-è-e-cosa-non-è-tabby) - [Caratteristiche del Terminale](#caratteristiche-del-terminale) - [Client SSH](#client-ssh) - [Terminale Seriale](#terminale-seriale) - [Portabilità](#portabilità) - [Plugin](#plugin) - [Temi](#temi) - [Partecipazione](#partecipazione) # Cosa è e cosa non è Tabby * **Tabby è** un'alternativa al terminale standard di Windows (conhost), PowerShell ISE, PuTTY, macOS Terminal.app e iTerm * **Tabby non è** una nuova shell o un'alternativa a MinGW o Cygwin. Non è nemmeno leggero: se l'utilizzo della RAM è importante, considera [Conemu](https://conemu.github.io) o [Alacritty](https://github.com/jwilm/alacritty) # Caratteristiche del Terminale ![](docs/readme-terminal.png) * Un terminale VT220 + vari estensioni * Suddivisione in pannelli * Schede su qualsiasi lato della finestra * Finestra agganciabile opzionale con un tasto di scelta rapida ("Quake console") * Rilevamento del progresso * Notifica al completamento del processo * Incolla tra parentesi e avvisi di incollaggio multilinea * Legature dei caratteri * Profili shell personalizzati * Incolla RMB e copia su selezione opzionale (in stile PuTTY) # Client SSH ![](docs/readme-ssh.png) * Client SSH2 con un gestore di connessioni * X11 e port forwarding * Gestione automatica dell'host di salto * Inoltro dell'agente (incluso Pageant e l'agente OpenSSH nativo di Windows) * Script di accesso # Terminale Seriale * Connessioni salvate * Supporto per l'input Readline * Input esadecimale byte per byte opzionale e output hexdump * Conversione nuova riga * Riconnessione automatica # Portabilità Tabby può essere eseguito come app portatile su Windows, se crei una cartella `data` nella stessa posizione in cui si trova `Tabby.exe`. # Plugin I plugin e i temi possono essere installati direttamente dalla vista Impostazioni all'interno di Tabby. * [docker](https://github.com/Eugeny/tabby-docker) - connessione ai container Docker * [title-control](https://github.com/kbjr/terminus-title-control) - consente di modificare il titolo delle schede del terminale fornendo un prefisso, un suffisso e/o stringhe da rimuovere * [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - invia rapidamente comandi a una o tutte le schede del terminale * [save-output](https://github.com/Eugeny/tabby-save-output) - registra l'output del terminale in un file * [sync-config](https://github.com/starxg/terminus-sync-config) - sincronizza la configurazione con Gist o Gitee * [clippy](https://github.com/Eugeny/tabby-clippy) - un esempio di plugin che ti infastidisce tutto il tempo * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - consente di creare profili di spazio di lavoro personalizzati basati sulla configurazione fornita * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - apre il browser di sistema predefinito con un testo selezionato dalla scheda di Tabby * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - apre una scheda SFTP per la connessione SSH come SecureCRT * [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - Popup di autenticazione web in-app (costruito principalmente per l'autenticazione in-browser di Warpgate) * [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Potente integrazione del server Model Context Protocol per Tabby che si connette perfettamente con assistenti AI attraverso client MCP come Cursor e Windsurf, migliorando il tuo flusso di lavoro del terminale con capacità AI intelligenti. # Temi * [hype](https://github.com/Eugeny/tabby-theme-hype) - a Hyper inspired theme * [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - the Relaxed theme for Tabby * [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox) * [windows10](https://www.npmjs.com/package/terminus-theme-windows10) * [altair](https://github.com/yxuko/terminus-altair) # Sponsor [![](https://assets-production.packagecloud.io/assets/packagecloud-logo-light-scaled-26ce8e96060fddf74afbd4445e63ba35590d4aaa56edc98495bb390ef3cae0ae.png)](https://packagecloud.io) [**packagecloud**](https://packagecloud.io) ha fornito gratuitamente un hosting per i repository Debian/RPM # Partecipazione Richieste pull e plugin sono i benvenuti! Vedi [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) e la [documentazione API](https://docs.tabby.sh/) per informazioni su come è strutturato il progetto e un brevissimo tutorial sullo sviluppo dei plugin. --- Grazie a queste persone meravigliose ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
Russell Myers
Russell Myers

💻
Austin Warren
Austin Warren

💻
Felicia Hummel
Felicia Hummel

💻
Mike MacCana
Mike MacCana

⚠️ 🎨
Yacine Kanzari
Yacine Kanzari

💻
BBJip
BBJip

💻
Futagirl
Futagirl

🎨
Levin Rickert
Levin Rickert

💻
OJ Kwon
OJ Kwon

💻
domain
domain

🔌 💻
James Brumond
James Brumond

🔌
Daniel Imms
Daniel Imms

💻 🔌 ⚠️
Florian Bachmann
Florian Bachmann

💻
Michael Kühnel
Michael Kühnel

💻 🎨
Tilmann Meyer
Tilmann Meyer

💻
PM Extra
PM Extra

🐛
Jonathan
Jonathan

💻
Hans Koch
Hans Koch

💻
Dak Smyth
Dak Smyth

💻
Wang Zhi
Wang Zhi

💻
jack1142
jack1142

💻
Howie Douglas
Howie Douglas

💻
Chris Kaczor
Chris Kaczor

💻
Johannes Kadak
Johannes Kadak

💻
LeSeulArtichaut
LeSeulArtichaut

💻
Cyril Taylor
Cyril Taylor

💻
nstefanou
nstefanou

💻 🔌
orin220444
orin220444

💻
Gobius Dolhain
Gobius Dolhain

💻
Gwilherm Folliot
Gwilherm Folliot

💻
Dmitry Pronin
Dmitry Pronin

💻
Jonathan Beverley
Jonathan Beverley

💻
Zenghai Liang
Zenghai Liang

💻
Mateusz Tracz
Mateusz Tracz

💻
pinpin
pinpin

💻
Takuro Onoda
Takuro Onoda

💻
frauhottelmann
frauhottelmann

💻
Piotr Patalong
Piotr Patalong

🎨
Clark Wang
Clark Wang

💻
iamchating
iamchating

💻
starxg
starxg

🔌
Alisue
Alisue

🎨
Dominic Yin
Dominic Yin

💻
Brandon Rothweiler
Brandon Rothweiler

🎨
Logic Machine
Logic Machine

📖
cypherbits
cypherbits

📖
Matthew Davidson
Matthew Davidson

💻
Alexander Wiedemann
Alexander Wiedemann

💻
장보연
장보연

📖
zZ
zZ

💻
Aaron Davison
Aaron Davison

💻
Przemyslaw Kozik
Przemyslaw Kozik

🎨
Alfredo Arellano de la Fuente
Alfredo Arellano de la Fuente

💻
MH Kim
MH Kim

💻
Marmota
Marmota

🎨
Ares Andrew
Ares Andrew

📖
George Korsnick
George Korsnick

💵
Artem Smirnov
Artem Smirnov

💵
Tim Kopplow
Tim Kopplow

💵
mrthock
mrthock

💵
Lukas Rottach
Lukas Rottach

💵
boonkerz
boonkerz

💻 🌍
Milo Ivir
Milo Ivir

🌍
JasonCubic
JasonCubic

🎨
MaxWaldorf
MaxWaldorf

🚇
Michael Wizner
Michael Wizner

💻
Martin
Martin

💻
Piersandro Guerrera
Piersandro Guerrera

📖 🌍
0x973
0x973

💻
Allenator
Allenator

📖
Matheus Castello
Matheus Castello

💻
Jai A P
Jai A P

📦
Richard Yu
Richard Yu

💻
artu-ole
artu-ole

💻
Timofey Gribanov
Timofey Gribanov

📖 🌍
Christian Bingman
Christian Bingman

💻
zhipeng
zhipeng

💻
woodmeal
woodmeal

💻
MagicLike
MagicLike

📖
Hisam Fahri
Hisam Fahri

💻
Liangcheng Juves
Liangcheng Juves

💻
Atte Timonen
Atte Timonen

💻
João Pinto
João Pinto

📖
Alan
Alan

💻
Atsushi Morimoto
Atsushi Morimoto

💵
Arles
Arles

💵
six2dez
six2dez

💵
Candice
Candice

💵
Rowen Willabus
Rowen Willabus

💵
HengY1Coding✨
HengY1Coding✨

💵
Francis Gelderloos
Francis Gelderloos

💵
astromasoud
astromasoud

💵
Anders G. Jørgensen
Anders G. Jørgensen

💵
Dave Richardson
Dave Richardson

💵
Thomas Peter Berntsen
Thomas Peter Berntsen

💵
Ikko Ashimine
Ikko Ashimine

📖
giejqf
giejqf

💻
Thomas LACAZE
Thomas LACAZE

💻
Po Chen
Po Chen

💵
Victor Chandra
Victor Chandra

📖
Dan Nissenbaum
Dan Nissenbaum

💵
RogueThorn
RogueThorn

💵
Spenser Black
Spenser Black

💻
Alex
Alex

💵
HengY1Coding✨
HengY1Coding✨

💵
David Carrero
David Carrero

📖
Andrii Zhovtiak
Andrii Zhovtiak

💻
Mason Ma
Mason Ma

💵
Timo
Timo

💵
Evin Watson
Evin Watson

📖
Hendra Juli
Hendra Juli

📖
Wellinton Kricowski
Wellinton Kricowski

💵 📖
Allan
Allan

🎨
Benjamin Brandmeier
Benjamin Brandmeier

💻
patric1025
patric1025

🌍
hermitpopcorn
hermitpopcorn

💻
Joshua Tzucker
Joshua Tzucker

💵
luxifr
luxifr

💵
Anne Summers
Anne Summers

💵
Clem
Clem

💻
Elizabeth Martín Campos
Elizabeth Martín Campos

💻
Tomáš Hruška
Tomáš Hruška

💻
Osman Karaketir
Osman Karaketir

💻
Crypto Gnome
Crypto Gnome

💵
Richard Bukovansky
Richard Bukovansky

💵
catlas
catlas

💵
Thomas Kapocsi
Thomas Kapocsi

📖
Dylan Hackworth
Dylan Hackworth

💵
Sangboak Lee
Sangboak Lee

💻
qyecst
qyecst

💻
Han
Han

💻
wljince007
wljince007

💻
fero
fero

💻
Sibren
Sibren

💻
Nathaniel Walser
Nathaniel Walser

💻
Aaron Huggins
Aaron Huggins

🎨
KDex
KDex

💻
ChangHwan Kim
ChangHwan Kim

💻
Ash Neilson
Ash Neilson

💻
Chen Fansong
Chen Fansong

💻
Mxmilu
Mxmilu

💻
Charles Buffington
Charles Buffington

💻
Yu Qin
Yu Qin

💻
fireblue
fireblue

💻
marko1616
marko1616

💻
SelfHosted
SelfHosted

💵
Hiroaki Ogasawara
Hiroaki Ogasawara

💻
geodic
geodic

💻
P Foundation
P Foundation

💵
et304383
et304383

💻
ajkrj
ajkrj

💻
Leonardo Berbert
Leonardo Berbert

💻
Questo progetto segue le specifiche [all-contributors](https://github.com/all-contributors/all-contributors). Contributi di qualsiasi genere sono ben accetti! ================================================ FILE: README.ja-JP.md ================================================ [![](docs/readme.png)](https://tabby.sh)

GitHub All Releases     Matrix   Translate   Twitter

--- > 👋 リモート環境の管理に困ってませんか? [WarpgateというSSH/HTTP/MySQL向けの便利な踏み台サーバー](https://github.com/warp-tech/warpgate)も作ってます。Tabbyとも相性ばっちりなので良かったらお試しください。 ---- ### ダウンロード: * [最新のリリース](https://github.com/Eugeny/tabby/releases/latest) * [リポジトリ](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu向け](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM向け](https://packagecloud.io/eugeny/tabby/install#bash-rpm) * [最新の開発ビルド版](https://nightly.link/Eugeny/tabby/workflows/build/master)

このREADMEは次の言語でもご覧いただけます: :gb: English · :es: Spanish · :ru: Русский · :kr: 한국어 · :cn: 简体中文 · :it: Italiano · :de: Deutsch · :id: Bahasa Indonesia · :brazil: Português · :poland: Polski

---- [**Tabby**](https://tabby.sh)(旧**Terminus**)は、Windows、macOS、Linux向けの高度なカスタマイズに対応した端末エミュレータ、SSH、シリアルコンソールです * SSH、Telnetクライアントと接続マネージャーの統合 * シリアルコンソールの統合 * テーマと配色のカスタマイズ * 自由なショートカットのカスタマイズと複数キー入力にも対応 * ペイン分割に対応 * タブの保存機能 * PowerShell(または PS Core)やWSL、Git-Bash、Cygwin、MSYS2、Cmder、CMDに対応 * Zmodemを介したSSHセッションへの直接ファイル転送 * 全角文字を含むUnicodeの完全対応 * 大量の出力にも止まることはありません * タブキーによる補完機能にも対応したWindows上での快適なシェル (Clink使用) * SSHの機密性の高い情報と設定を保存する暗号化コンテナの搭載 * SSH、SFTP、Telnetクライアントが[Webアプリ](https://tabby.sh/app)としても利用できます ([セルフホスティング](https://github.com/Eugeny/tabby-web)も可能) # コンテンツ - [Tabbyとは](#tabbyとは) - [ターミナル機能](#ターミナル機能) - [SSHクライアント](#sshクライアント) - [シリアルコンソール](#シリアルコンソール) - [ポータブル機能](#ポータブル機能) - [プラグイン](#プラグイン) - [テーマ](#テーマ) - [コントリビュート](#コントリビュート) # Tabbyとは * **Tabbyは**Windows 標準のターミナル(conhost)、PowerShell ISE、PuTTY、macOSのTerminal.appおよびiTermの代替となるアプリケーションです。 * **Tabby**は新しいシェル**でもなければ**、MinGWやCygwinの置き換え**でもありません**。また、軽量**でもありません**。RAMの使用量を重視するのではあれば、[Conemu](https://conemu.github.io)や[Alacritty](https://github.com/jwilm/alacritty)の利用をお勧めします。 # ターミナル機能 ![](docs/readme-terminal.png) * VT220ターミナル+各種拡張機能 * 複数ネストされたペイン分割に対応 * ウィンドウ内に自由に配置可能なタブ * グローバルホットキーで呼び出せるドックウィンドウ機能("Quakeコンソール") * 進行状況の検出 * プロセス完了時の通知 * ブラケットペーストや複数行のペーストの警告機能 * 合字フォントの対応 * シェルプロファイルの自由なカスタマイズ * RMBペーストと選択時の自動コピー機能(PuTTYスタイル)の対応 # SSHクライアント ![](docs/readme-ssh.png) * SSH2クライアントと接続マネージャー * X11とポートフォワーディング * 自動ジャンプサーバー管理 * エージェント転送(PageantとWindows標準OpenSSHエージェントを含む) * ログインスクリプト # シリアルコンソール * 接続の保存機能 * 行単位入力の対応 * 16進バイト入力および16進ダンプ出力の対応 * 改行コードの変換 * 自動再接続 # ポータブル機能 Windows上では、`Tabby.exe`がある場所と同じ場所に`data`フォルダを作成すれば、ポータブルアプリとして実行することができます。 # プラグイン プラグインやテーマは、Tabby内の設定画面から直接インストールすることができます。 * [docker](https://github.com/Eugeny/tabby-docker) - Dockerコンテナに接続することができます * [title-control](https://github.com/kbjr/terminus-title-control) - タブ名の前後に文字を入れたり指定した文字の削除をすることができます * [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - 一つもしくは複数のタブに手軽にコマンド送信することができます * [save-output](https://github.com/Eugeny/tabby-save-output) - ターミナルの出力をファイルに保存することができます * [sync-config](https://github.com/starxg/terminus-sync-config) - GistやGiteeで設定ファイルを同期することができます * [clippy](https://github.com/Eugeny/tabby-clippy) - プラグインの作例として、いつも厄介なあいつが出てくるプラグイン * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 指定された設定からカスタマイズされたワークスペースを作成することができます * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - Tabby内の端末で選択したテキストを既定ブラウザで開くことができます。 * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - SecureCRTのようにSSH接続のSFTPタブを開く * [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - アプリ内ウェブ認証ポップアップ(主にwarpgateのブラウザ認証用に構築) * [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - TabbyのためのパワフルなModel Context Protocolサーバー統合機能で、CursorやWindsurfなどのMCPクライアントを通じてAIアシスタントとシームレスに接続し、インテリジェントなAI機能によってターミナルワークフローを強化します。 # テーマ * [hype](https://github.com/Eugeny/tabby-theme-hype) - Hyperをイメージしたテーマ * [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - Tabby向けのRelaxedテーマ * [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox) * [windows10](https://www.npmjs.com/package/terminus-theme-windows10) * [altair](https://github.com/yxuko/terminus-altair) # スポンサー [![](https://assets-production.packagecloud.io/assets/packagecloud-logo-light-scaled-26ce8e96060fddf74afbd4445e63ba35590d4aaa56edc98495bb390ef3cae0ae.png)](https://packagecloud.io) [**packagecloud**](https://packagecloud.io)は、Debian/RPMリポジトリのホスティングを無償で提供しています [![](https://user-images.githubusercontent.com/161476/200423885-7aba2202-fea7-4409-95b9-3a062ce902c7.png)](https://keygen.sh/?via=eugene) [**keygen**](https://keygen.sh/?via=eugene)は、自動リリース機能および自動更新機能のホスティングを無償で提供しています # コントリビュート プルリクエストやプラグインは大歓迎です! プロジェクトの構成や、非常に簡単なプラグイン開発のチュートリアルについては、[HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md)および、[API docs](https://docs.tabby.sh/)を参照してください。 --- 以下の素晴らしい方々([emoji key](https://allcontributors.org/docs/en/emoji-key))に感謝いたします:
Russell Myers
Russell Myers

💻
Austin Warren
Austin Warren

💻
Felicia Hummel
Felicia Hummel

💻
Mike MacCana
Mike MacCana

⚠️ 🎨
Yacine Kanzari
Yacine Kanzari

💻
BBJip
BBJip

💻
Futagirl
Futagirl

🎨
Levin Rickert
Levin Rickert

💻
OJ Kwon
OJ Kwon

💻
domain
domain

🔌 💻
James Brumond
James Brumond

🔌
Daniel Imms
Daniel Imms

💻 🔌 ⚠️
Florian Bachmann
Florian Bachmann

💻
Michael Kühnel
Michael Kühnel

💻 🎨
Tilmann Meyer
Tilmann Meyer

💻
PM Extra
PM Extra

🐛
Jonathan
Jonathan

💻
Hans Koch
Hans Koch

💻
Dak Smyth
Dak Smyth

💻
Wang Zhi
Wang Zhi

💻
jack1142
jack1142

💻
Howie Douglas
Howie Douglas

💻
Chris Kaczor
Chris Kaczor

💻
Johannes Kadak
Johannes Kadak

💻
LeSeulArtichaut
LeSeulArtichaut

💻
Cyril Taylor
Cyril Taylor

💻
nstefanou
nstefanou

💻 🔌
orin220444
orin220444

💻
Gobius Dolhain
Gobius Dolhain

💻
Gwilherm Folliot
Gwilherm Folliot

💻
Dmitry Pronin
Dmitry Pronin

💻
Jonathan Beverley
Jonathan Beverley

💻
Zenghai Liang
Zenghai Liang

💻
Mateusz Tracz
Mateusz Tracz

💻
pinpin
pinpin

💻
Takuro Onoda
Takuro Onoda

💻
frauhottelmann
frauhottelmann

💻
Piotr Patalong
Piotr Patalong

🎨
Clark Wang
Clark Wang

💻
iamchating
iamchating

💻
starxg
starxg

🔌
Alisue
Alisue

🎨
Dominic Yin
Dominic Yin

💻
Brandon Rothweiler
Brandon Rothweiler

🎨
Logic Machine
Logic Machine

📖
cypherbits
cypherbits

📖
Matthew Davidson
Matthew Davidson

💻
Alexander Wiedemann
Alexander Wiedemann

💻
장보연
장보연

📖
zZ
zZ

💻
Aaron Davison
Aaron Davison

💻
Przemyslaw Kozik
Przemyslaw Kozik

🎨
Alfredo Arellano de la Fuente
Alfredo Arellano de la Fuente

💻
MH Kim
MH Kim

💻
Marmota
Marmota

🎨
Ares Andrew
Ares Andrew

📖
George Korsnick
George Korsnick

💵
Artem Smirnov
Artem Smirnov

💵
Tim Kopplow
Tim Kopplow

💵
mrthock
mrthock

💵
Lukas Rottach
Lukas Rottach

💵
boonkerz
boonkerz

💻 🌍
Milo Ivir
Milo Ivir

🌍
JasonCubic
JasonCubic

🎨
MaxWaldorf
MaxWaldorf

🚇
Michael Wizner
Michael Wizner

💻
Martin
Martin

💻
Piersandro Guerrera
Piersandro Guerrera

📖 🌍
0x973
0x973

💻
Allenator
Allenator

📖
Matheus Castello
Matheus Castello

💻
Jai A P
Jai A P

📦
Richard Yu
Richard Yu

💻
artu-ole
artu-ole

💻
Timofey Gribanov
Timofey Gribanov

📖 🌍
Christian Bingman
Christian Bingman

💻
zhipeng
zhipeng

💻
woodmeal
woodmeal

💻
MagicLike
MagicLike

📖
Hisam Fahri
Hisam Fahri

💻
Liangcheng Juves
Liangcheng Juves

💻
Atte Timonen
Atte Timonen

💻
João Pinto
João Pinto

📖
Alan
Alan

💻
Atsushi Morimoto
Atsushi Morimoto

💵
Arles
Arles

💵
six2dez
six2dez

💵
Candice
Candice

💵
Rowen Willabus
Rowen Willabus

💵
HengY1Coding✨
HengY1Coding✨

💵
Francis Gelderloos
Francis Gelderloos

💵
astromasoud
astromasoud

💵
Anders G. Jørgensen
Anders G. Jørgensen

💵
Dave Richardson
Dave Richardson

💵
Thomas Peter Berntsen
Thomas Peter Berntsen

💵
Ikko Ashimine
Ikko Ashimine

📖
giejqf
giejqf

💻
Thomas LACAZE
Thomas LACAZE

💻
Po Chen
Po Chen

💵
Victor Chandra
Victor Chandra

📖
Dan Nissenbaum
Dan Nissenbaum

💵
RogueThorn
RogueThorn

💵
Spenser Black
Spenser Black

💻
Alex
Alex

💵
HengY1Coding✨
HengY1Coding✨

💵
David Carrero
David Carrero

📖
Andrii Zhovtiak
Andrii Zhovtiak

💻
Mason Ma
Mason Ma

💵
Timo
Timo

💵
Evin Watson
Evin Watson

📖
Hendra Juli
Hendra Juli

📖
Wellinton Kricowski
Wellinton Kricowski

💵 📖
Allan
Allan

🎨
Benjamin Brandmeier
Benjamin Brandmeier

💻
patric1025
patric1025

🌍
hermitpopcorn
hermitpopcorn

💻
Joshua Tzucker
Joshua Tzucker

💵
luxifr
luxifr

💵
Anne Summers
Anne Summers

💵
Clem
Clem

💻
Elizabeth Martín Campos
Elizabeth Martín Campos

💻
Tomáš Hruška
Tomáš Hruška

💻
Osman Karaketir
Osman Karaketir

💻
Crypto Gnome
Crypto Gnome

💵
Richard Bukovansky
Richard Bukovansky

💵
catlas
catlas

💵
Thomas Kapocsi
Thomas Kapocsi

📖
Dylan Hackworth
Dylan Hackworth

💵
Sangboak Lee
Sangboak Lee

💻
qyecst
qyecst

💻
Han
Han

💻
wljince007
wljince007

💻
fero
fero

💻
Sibren
Sibren

💻
Nathaniel Walser
Nathaniel Walser

💻
Aaron Huggins
Aaron Huggins

🎨
KDex
KDex

💻
ChangHwan Kim
ChangHwan Kim

💻
Ash Neilson
Ash Neilson

💻
Chen Fansong
Chen Fansong

💻
Mxmilu
Mxmilu

💻
Charles Buffington
Charles Buffington

💻
Yu Qin
Yu Qin

💻
fireblue
fireblue

💻
marko1616
marko1616

💻
SelfHosted
SelfHosted

💵
Hiroaki Ogasawara
Hiroaki Ogasawara

💻
geodic
geodic

💻
P Foundation
P Foundation

💵
et304383
et304383

💻
ajkrj
ajkrj

💻
Leonardo Berbert
Leonardo Berbert

💻
このプロジェクトは[all-contributors](https://github.com/all-contributors/all-contributors)の仕様に準拠しています。どのような形の貢献でも歓迎いたします! ================================================ FILE: README.ko-KR.md ================================================ [![](docs/readme.png)](https://tabby.sh)

GitHub All Releases     Matrix

---- ### 다운로드: * [Latest release](https://github.com/Eugeny/tabby/releases/latest) * [Repositories](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu-based](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM-based](https://packagecloud.io/eugeny/tabby/install#bash-rpm) * [Latest nightly build](https://nightly.link/Eugeny/tabby/workflows/build/master)

This README is also available in: :gb: English · :es: Spanish · :ru: Русский · :cn: 简体中文 · :it: Italiano · :de: Deutsch · :jp: 日本語 · :id: Bahasa Indonesia · :brazil: Português · :poland: Polski

---- **Tabby** (구 **Terminus**)는 Windows, macOS 및 Linux용으로 뛰어난 구성의 터미널 에뮬레이터, SSH 및 시리얼 클라이언트입니다. * 통합 SSH 클라이언트 및 연결 관리자 * 통합 시리얼 터미널 * 테마 및 색 구성표 * 전체 구성이 가능한 단축키 및 다중 코드 단축키 * 창 분할 * 이전 탭 사용을 기억 * PowerShell (및 PS Core), WSL, Git-Bash, Cygwin, Cmder 및 CMD 지원 * Zmodem을 통한 SSH 세션 간의 직접 파일 전송 * 2바이트 문자를 포함한 전체 유니코드 지원 * 빠르게 출력되는 것에 대해 휩쓸리지 않음 * 탭 완성을 포함한 Windows에서의 적절한 셸 환경 (Clink을 통해) * SSH 시크릿 및 구성을 위한 통합 암호화 컨테이너 # 목차 - [Tabby는 무엇인가](#tabby는-무엇인가) - [터미널 기능](#터미널-기능) - [SSH 클라이언트](#ssh-클라이언트) - [시리얼 터미널](#시리얼-터미널) - [포터블](#포터블) - [플러그인](#플러그인) - [테마](#테마) - [기여](#기여) # Tabby는 무엇인가 * **Tabby는** Windows의 표준 터미널 (conhost), PowerShell ISE, PuTTY 또는 iTerm의 대안 프로그램입니다. * **Tabby는** 새로운 셸이나 MinGW 또는 Cygwin을 대체하지 **않습니다**. 가볍지도 않습니다. - RAM 사용량이 중요한 경우, [Conemu](https://conemu.github.io) 또는 [Alacritty](https://github.com/jwilm/alacritty)를 고려하십시오. # 터미널 기능 ![](docs/readme-terminal.png) * A VT220 터미널 + 다양한 확장 * 여러 개의 분할 창 중첩 * 모든 측면에 탭이 위치함 * 전역 스폰 단축키가 있는 도킹 가능한 윈도우 ("Quake console") * 진행률 탐지 * 프로세스 완료 시 알림 * 괄호 붙여넣기, 여러 줄 붙여넣기 경고 * 폰트 합자(ligatures) * 커스텀 셸 프로필 * RMB 붙여넣기 및 복사 선택 옵션 (PuTTY 스타일) # SSH 클라이언트 ![](docs/readme-ssh.png) * 연결 관리자가 있는 SSH2 클라이언트 * X11 및 포트 포워딩 * 자동 jump 호스트 관리 * 에이전트 전달 (Pageant 및 Windows 기본 OpenSSH 에이전트 포함) * 로그인 스크립트 # 시리얼 터미널 * 연결 저장 * Readline 입력 지원 * 선택적 hex byte별 입력 및 hexdump 출력 * 개행 변환 * 자동 재접속 # 포터블 `Tabby.exe`가 있는 동일한 위치에 `data` 폴더를 생성하면 Windows에서 Tabby가 포터블 앱으로 실행됩니다. # 플러그인 플러그인과 테마는 Tabby 내부의 설정에서 직접 설치할 수 있습니다. * [clickable-links](https://github.com/Eugeny/tabby-clickable-links) - 터미널의 경로 및 URL을 클릭 가능하게 * [docker](https://github.com/Eugeny/tabby-docker) - Docker 컨테이너에 연결 * [title-control](https://github.com/kbjr/terminus-title-control) - 접두사, 접미사 및/또는 문자열 제거를 제공하여 터미널 탭의 제목을 수정 * [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - 하나 또는 모든 터미널 탭에 신속한 명령 전송 * [save-output](https://github.com/Eugeny/tabby-save-output) - 터미널 출력을 파일에 기록 * [sync-config](https://github.com/starxg/terminus-sync-config) - 구성을 Gist 또는 Gitee에 동기화 * [clippy](https://github.com/Eugeny/tabby-clippy) - 항상 당신을 귀찮게 하는 예제 플러그인 * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 주어진 구성을 기반으로 사용자 정의 작업 공간 프로필을 생성할 수 있습니다 * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - Tabby의 탭에서 선택한 텍스트로 기본 시스템 브라우저를 엽니다 * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - SecureCRT와 유사하게 SSH 연결에 대한 SFTP 탭을 엽니다. * [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - 앱 내 웹 인증 팝업 (주로 warpgate 브라우저 인증을 위해 구축) * [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Cursor 및 Windsurf와 같은 MCP 클라이언트를 통해 AI 어시스턴트와 원활하게 연결되는 Tabby용 강력한 모델 컨텍스트 프로토콜 서버 통합으로, 지능형 AI 기능으로 터미널 워크플로우를 향상시킵니다. # 테마 * [hype](https://github.com/Eugeny/tabby-theme-hype) - Hyper에서 영감을 받은 테마 * [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - Tabby를 위해 여유로움을 제공하는 테마 * [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox) * [windows10](https://www.npmjs.com/package/terminus-theme-windows10) * [altair](https://github.com/yxuko/terminus-altair) # 스폰서 [![](https://assets-production.packagecloud.io/assets/packagecloud-logo-light-scaled-26ce8e96060fddf74afbd4445e63ba35590d4aaa56edc98495bb390ef3cae0ae.png)](https://packagecloud.io) [**packagecloud**](https://packagecloud.io)가 무료 Debian/RPM 저장소 호스팅을 제공하였습니다. # 기여 Pull requests and plugins are welcome! 프로젝트 배치 방법에 대한 자세한 내용과 매우 간단한 플러그인 개발 튜토리얼은 [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) 및 [API docs](https://docs.tabby.sh/)를 참조하십시오. --- 여기 있는 멋진 사람들에게 진심으로 감사합니다. ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
Russell Myers
Russell Myers

💻
Austin Warren
Austin Warren

💻
Felicia Hummel
Felicia Hummel

💻
Mike MacCana
Mike MacCana

⚠️ 🎨
Yacine Kanzari
Yacine Kanzari

💻
BBJip
BBJip

💻
Futagirl
Futagirl

🎨
Levin Rickert
Levin Rickert

💻
OJ Kwon
OJ Kwon

💻
domain
domain

🔌 💻
James Brumond
James Brumond

🔌
Daniel Imms
Daniel Imms

💻 🔌 ⚠️
Florian Bachmann
Florian Bachmann

💻
Michael Kühnel
Michael Kühnel

💻 🎨
Tilmann Meyer
Tilmann Meyer

💻
PM Extra
PM Extra

🐛
Jonathan
Jonathan

💻
Hans Koch
Hans Koch

💻
Dak Smyth
Dak Smyth

💻
Wang Zhi
Wang Zhi

💻
jack1142
jack1142

💻
Howie Douglas
Howie Douglas

💻
Chris Kaczor
Chris Kaczor

💻
Johannes Kadak
Johannes Kadak

💻
LeSeulArtichaut
LeSeulArtichaut

💻
Cyril Taylor
Cyril Taylor

💻
nstefanou
nstefanou

💻 🔌
orin220444
orin220444

💻
Gobius Dolhain
Gobius Dolhain

💻
Gwilherm Folliot
Gwilherm Folliot

💻
Dmitry Pronin
Dmitry Pronin

💻
Jonathan Beverley
Jonathan Beverley

💻
Zenghai Liang
Zenghai Liang

💻
Mateusz Tracz
Mateusz Tracz

💻
pinpin
pinpin

💻
Takuro Onoda
Takuro Onoda

💻
frauhottelmann
frauhottelmann

💻
Piotr Patalong
Piotr Patalong

🎨
Clark Wang
Clark Wang

💻
iamchating
iamchating

💻
starxg
starxg

🔌
Alisue
Alisue

🎨
Dominic Yin
Dominic Yin

💻
Brandon Rothweiler
Brandon Rothweiler

🎨
Logic Machine
Logic Machine

📖
cypherbits
cypherbits

📖
Matthew Davidson
Matthew Davidson

💻
Alexander Wiedemann
Alexander Wiedemann

💻
장보연
장보연

📖
zZ
zZ

💻
Aaron Davison
Aaron Davison

💻
Przemyslaw Kozik
Przemyslaw Kozik

🎨
Alfredo Arellano de la Fuente
Alfredo Arellano de la Fuente

💻
MH Kim
MH Kim

💻
Marmota
Marmota

🎨
Ares Andrew
Ares Andrew

📖
George Korsnick
George Korsnick

💵
Artem Smirnov
Artem Smirnov

💵
Tim Kopplow
Tim Kopplow

💵
mrthock
mrthock

💵
Lukas Rottach
Lukas Rottach

💵
boonkerz
boonkerz

💻 🌍
Milo Ivir
Milo Ivir

🌍
JasonCubic
JasonCubic

🎨
MaxWaldorf
MaxWaldorf

🚇
Michael Wizner
Michael Wizner

💻
Martin
Martin

💻
Piersandro Guerrera
Piersandro Guerrera

📖 🌍
0x973
0x973

💻
Allenator
Allenator

📖
Matheus Castello
Matheus Castello

💻
Jai A P
Jai A P

📦
Richard Yu
Richard Yu

💻
artu-ole
artu-ole

💻
Timofey Gribanov
Timofey Gribanov

📖 🌍
Christian Bingman
Christian Bingman

💻
zhipeng
zhipeng

💻
woodmeal
woodmeal

💻
MagicLike
MagicLike

📖
Hisam Fahri
Hisam Fahri

💻
Liangcheng Juves
Liangcheng Juves

💻
Atte Timonen
Atte Timonen

💻
João Pinto
João Pinto

📖
Alan
Alan

💻
Atsushi Morimoto
Atsushi Morimoto

💵
Arles
Arles

💵
six2dez
six2dez

💵
Candice
Candice

💵
Rowen Willabus
Rowen Willabus

💵
HengY1Coding✨
HengY1Coding✨

💵
Francis Gelderloos
Francis Gelderloos

💵
astromasoud
astromasoud

💵
Anders G. Jørgensen
Anders G. Jørgensen

💵
Dave Richardson
Dave Richardson

💵
Thomas Peter Berntsen
Thomas Peter Berntsen

💵
Ikko Ashimine
Ikko Ashimine

📖
giejqf
giejqf

💻
Thomas LACAZE
Thomas LACAZE

💻
Po Chen
Po Chen

💵
Victor Chandra
Victor Chandra

📖
Dan Nissenbaum
Dan Nissenbaum

💵
RogueThorn
RogueThorn

💵
Spenser Black
Spenser Black

💻
Alex
Alex

💵
HengY1Coding✨
HengY1Coding✨

💵
David Carrero
David Carrero

📖
Andrii Zhovtiak
Andrii Zhovtiak

💻
Mason Ma
Mason Ma

💵
Timo
Timo

💵
Evin Watson
Evin Watson

📖
Hendra Juli
Hendra Juli

📖
Wellinton Kricowski
Wellinton Kricowski

💵 📖
Allan
Allan

🎨
Benjamin Brandmeier
Benjamin Brandmeier

💻
patric1025
patric1025

🌍
hermitpopcorn
hermitpopcorn

💻
Joshua Tzucker
Joshua Tzucker

💵
luxifr
luxifr

💵
Anne Summers
Anne Summers

💵
Clem
Clem

💻
Elizabeth Martín Campos
Elizabeth Martín Campos

💻
Tomáš Hruška
Tomáš Hruška

💻
Osman Karaketir
Osman Karaketir

💻
Crypto Gnome
Crypto Gnome

💵
Richard Bukovansky
Richard Bukovansky

💵
catlas
catlas

💵
Thomas Kapocsi
Thomas Kapocsi

📖
Dylan Hackworth
Dylan Hackworth

💵
Sangboak Lee
Sangboak Lee

💻
qyecst
qyecst

💻
Han
Han

💻
wljince007
wljince007

💻
fero
fero

💻
Sibren
Sibren

💻
Nathaniel Walser
Nathaniel Walser

💻
Aaron Huggins
Aaron Huggins

🎨
KDex
KDex

💻
ChangHwan Kim
ChangHwan Kim

💻
Ash Neilson
Ash Neilson

💻
Chen Fansong
Chen Fansong

💻
Mxmilu
Mxmilu

💻
Charles Buffington
Charles Buffington

💻
Yu Qin
Yu Qin

💻
fireblue
fireblue

💻
marko1616
marko1616

💻
SelfHosted
SelfHosted

💵
Hiroaki Ogasawara
Hiroaki Ogasawara

💻
geodic
geodic

💻
P Foundation
P Foundation

💵
et304383
et304383

💻
ajkrj
ajkrj

💻
Leonardo Berbert
Leonardo Berbert

💻
이 프로젝트는 [모든 기여자](https://github.com/all-contributors/all-contributors)의 규격을 따릅니다. 어떠한 종류의 기여도 모두 환영합니다! ================================================ FILE: README.md ================================================ [![](docs/readme.png)](https://tabby.sh)

GitHub All Releases     Discord   Translate

--- > 👋 Managing remote environments? Check out [Warpgate, my smart SSH/HTTP/MySQL bastion server](https://github.com/warp-tech/warpgate), it works great with Tabby, you'll love it. ---- ### Downloads: * [Latest release](https://github.com/Eugeny/tabby/releases/latest) * [Repositories](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu-based](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM-based](https://packagecloud.io/eugeny/tabby/install#bash-rpm) * [Latest nightly build](https://nightly.link/Eugeny/tabby/workflows/build/master)

This README is also available in: :es: Spanish · :ru: Русский · :kr: 한국어 · :cn: 简体中文 · :it: Italiano · :de: Deutsch · :jp: 日本語 · :id: Bahasa Indonesia · :brazil: Português · :poland: Polski

---- [**Tabby**](https://tabby.sh) (formerly **Terminus**) is a highly configurable terminal emulator, SSH and serial client for Windows 10, macOS and Linux * Integrated SSH and Telnet client and connection manager * Integrated serial terminal * Theming and color schemes * Fully configurable shortcuts and multi-chord shortcuts * Split panes * Remembers your tabs * PowerShell (and PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder and CMD support * Direct file transfer from/to SSH sessions via Zmodem * Full Unicode support including double-width characters * Doesn't choke on fast-flowing outputs * Proper shell experience on Windows including tab completion (via Clink) * Integrated encrypted container for SSH secrets and configuration * SSH, SFTP and Telnet client available as a [web app](https://tabby.sh/app) (also [self-hosted](https://github.com/Eugeny/tabby-web)). # Contents - [What Tabby is and isn't](#what-tabby-is-and-isnt) - [Terminal features](#terminal-features) - [SSH Client](#ssh-client) - [Serial Terminal](#serial-terminal) - [Portable](#portable) - [Plugins](#plugins) - [Themes](#themes) - [Contributing](#contributing) # What Tabby is and isn't * **Tabby is** an alternative to Windows' standard terminal (conhost), PowerShell ISE, PuTTY, macOS Terminal.app and iTerm * **Tabby is not** a new shell or a MinGW or Cygwin replacement. Neither is it lightweight - if RAM usage is of importance, consider [Conemu](https://conemu.github.io) or [Alacritty](https://github.com/jwilm/alacritty) # Terminal features ![](docs/readme-terminal.png) * A VT220 terminal + various extensions * Multiple nested split panes * Tabs on any side of the window * Optional dockable window with a global spawn hotkey ("Quake console") * Progress detection * Notification on process completion * Bracketed paste, multiline paste warnings * Font ligatures * Custom shell profiles * Optional RMB paste and copy-on select (PuTTY style) # SSH Client ![](docs/readme-ssh.png) * SSH2 client with a connection manager * X11 and port forwarding * Automatic jump host management * Agent forwarding (incl. Pageant and Windows native OpenSSH Agent) * Login scripts # Serial Terminal * Saved connections * Readline input support * Optional hex byte-by-byte input and hexdump output * Newline conversion * Automatic reconnection # Portable Tabby will run as a portable app on Windows, if you create a `data` folder in the same location where `Tabby.exe` lives. # Plugins Plugins and themes can be installed directly from the Settings view inside Tabby. * [docker](https://github.com/Eugeny/tabby-docker) - connect to Docker containers * [title-control](https://github.com/kbjr/terminus-title-control) - allows modifying the title of the terminal tabs by providing a prefix, suffix, and/or strings to be removed * [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - quickly send commands to one or all terminal tabs * [save-output](https://github.com/Eugeny/tabby-save-output) - record terminal output into a file * [sync-config](https://github.com/starxg/terminus-sync-config) - sync the config to Gist or Gitee * [clippy](https://github.com/Eugeny/tabby-clippy) - an example plugin which annoys you all the time * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - allows creating custom workspace profiles based on the given config * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - opens default system browser with a text selected from the Tabby's tab * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT * [background](https://github.com/moemoechu/tabby-background) - change Tabby background image and more... * [highlight](https://github.com/moemoechu/tabby-highlight) - Tabby terminal keyword highlight plugin * [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - In-app web authentication popups (Built primarily for warpgate in-browser auth) * [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Powerful Model Context Protocol server integration for Tabby that seamlessly connects with AI assistants through MCP clients like Cursor and Windsurf, enhancing your terminal workflow with intelligent AI capabilities. # Themes * [hype](https://github.com/Eugeny/tabby-theme-hype) - a Hyper inspired theme * [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - the Relaxed theme for Tabby * [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox) * [windows10](https://www.npmjs.com/package/terminus-theme-windows10) * [altair](https://github.com/yxuko/terminus-altair) * [catppuccin](https://github.com/catppuccin/tabby) - Soothing pastel theme for Tabby * [noctis](https://github.com/aaronhuggins/tabby-colors-noctis) - color themes inspired by Noctis VS Code theme # Sponsors [**packagecloud**](https://packagecloud.io) has provided free Debian/RPM repository hosting [![](https://user-images.githubusercontent.com/161476/200423885-7aba2202-fea7-4409-95b9-3a062ce902c7.png)](https://keygen.sh/?via=eugene) [**keygen**](https://keygen.sh/?via=eugene) has provided free release & auto-update hosting [**IQ Hive**](https://iqhive.com) is providing financial support for the project development # Contributing Pull requests and plugins are welcome! See [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) and [API docs](https://docs.tabby.sh/) for information of how the project is laid out, and a very brief plugin development tutorial. --- Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
Russell Myers
Russell Myers

💻
Austin Warren
Austin Warren

💻
Felicia Hummel
Felicia Hummel

💻
Mike MacCana
Mike MacCana

⚠️ 🎨
Yacine Kanzari
Yacine Kanzari

💻
BBJip
BBJip

💻
Futagirl
Futagirl

🎨
Levin Rickert
Levin Rickert

💻
OJ Kwon
OJ Kwon

💻
domain
domain

🔌 💻
James Brumond
James Brumond

🔌
Daniel Imms
Daniel Imms

💻 🔌 ⚠️
Florian Bachmann
Florian Bachmann

💻
Michael Kühnel
Michael Kühnel

💻 🎨
Tilmann Meyer
Tilmann Meyer

💻
PM Extra
PM Extra

🐛
Jonathan
Jonathan

💻
Hans Koch
Hans Koch

💻
Dak Smyth
Dak Smyth

💻
Wang Zhi
Wang Zhi

💻
jack1142
jack1142

💻
Howie Douglas
Howie Douglas

💻
Chris Kaczor
Chris Kaczor

💻
Johannes Kadak
Johannes Kadak

💻
LeSeulArtichaut
LeSeulArtichaut

💻
Cyril Taylor
Cyril Taylor

💻
nstefanou
nstefanou

💻 🔌
orin220444
orin220444

💻
Gobius Dolhain
Gobius Dolhain

💻
Gwilherm Folliot
Gwilherm Folliot

💻
Dmitry Pronin
Dmitry Pronin

💻
Jonathan Beverley
Jonathan Beverley

💻
Zenghai Liang
Zenghai Liang

💻
Mateusz Tracz
Mateusz Tracz

💻
pinpin
pinpin

💻
Takuro Onoda
Takuro Onoda

💻
frauhottelmann
frauhottelmann

💻
Piotr Patalong
Piotr Patalong

🎨
Clark Wang
Clark Wang

💻
iamchating
iamchating

💻
starxg
starxg

🔌
Alisue
Alisue

🎨
Dominic Yin
Dominic Yin

💻
Brandon Rothweiler
Brandon Rothweiler

🎨
Logic Machine
Logic Machine

📖
cypherbits
cypherbits

📖
Matthew Davidson
Matthew Davidson

💻
Alexander Wiedemann
Alexander Wiedemann

💻
장보연
장보연

📖
zZ
zZ

💻
Aaron Davison
Aaron Davison

💻
Przemyslaw Kozik
Przemyslaw Kozik

🎨
Alfredo Arellano de la Fuente
Alfredo Arellano de la Fuente

💻
MH Kim
MH Kim

💻
Marmota
Marmota

🎨
Ares Andrew
Ares Andrew

📖
George Korsnick
George Korsnick

💵
Artem Smirnov
Artem Smirnov

💵
Tim Kopplow
Tim Kopplow

💵
mrthock
mrthock

💵
Lukas Rottach
Lukas Rottach

💵
boonkerz
boonkerz

💻 🌍
Milo Ivir
Milo Ivir

🌍
JasonCubic
JasonCubic

🎨
MaxWaldorf
MaxWaldorf

🚇
Michael Wizner
Michael Wizner

💻
Martin
Martin

💻
Piersandro Guerrera
Piersandro Guerrera

📖 🌍
0x973
0x973

💻
Allenator
Allenator

📖
Matheus Castello
Matheus Castello

💻
Jai A P
Jai A P

📦
Richard Yu
Richard Yu

💻
artu-ole
artu-ole

💻
Timofey Gribanov
Timofey Gribanov

📖 🌍
Christian Bingman
Christian Bingman

💻
zhipeng
zhipeng

💻
woodmeal
woodmeal

💻
MagicLike
MagicLike

📖
Hisam Fahri
Hisam Fahri

💻
Liangcheng Juves
Liangcheng Juves

💻
Atte Timonen
Atte Timonen

💻
João Pinto
João Pinto

📖
Alan
Alan

💻
Atsushi Morimoto
Atsushi Morimoto

💵
Arles
Arles

💵
six2dez
six2dez

💵
Candice
Candice

💵
Rowen Willabus
Rowen Willabus

💵
HengY1Coding✨
HengY1Coding✨

💵
Francis Gelderloos
Francis Gelderloos

💵
astromasoud
astromasoud

💵
Anders G. Jørgensen
Anders G. Jørgensen

💵
Dave Richardson
Dave Richardson

💵
Thomas Peter Berntsen
Thomas Peter Berntsen

💵
Ikko Ashimine
Ikko Ashimine

📖
giejqf
giejqf

💻
Thomas LACAZE
Thomas LACAZE

💻
Po Chen
Po Chen

💵
Victor Chandra
Victor Chandra

📖
Dan Nissenbaum
Dan Nissenbaum

💵
RogueThorn
RogueThorn

💵
Spenser Black
Spenser Black

💻
Alex
Alex

💵
HengY1Coding✨
HengY1Coding✨

💵
David Carrero
David Carrero

📖
Andrii Zhovtiak
Andrii Zhovtiak

💻
Mason Ma
Mason Ma

💵
Timo
Timo

💵
Evin Watson
Evin Watson

📖
Hendra Juli
Hendra Juli

📖
Wellinton Kricowski
Wellinton Kricowski

💵 📖
Allan
Allan

🎨
Benjamin Brandmeier
Benjamin Brandmeier

💻
patric1025
patric1025

🌍
hermitpopcorn
hermitpopcorn

💻
Joshua Tzucker
Joshua Tzucker

💵
luxifr
luxifr

💵
Anne Summers
Anne Summers

💵
Clem
Clem

💻
Elizabeth Martín Campos
Elizabeth Martín Campos

💻
Tomáš Hruška
Tomáš Hruška

💻
Osman Karaketir
Osman Karaketir

💻
Crypto Gnome
Crypto Gnome

💵
Richard Bukovansky
Richard Bukovansky

💵
catlas
catlas

💵
Thomas Kapocsi
Thomas Kapocsi

📖
Dylan Hackworth
Dylan Hackworth

💵
Sangboak Lee
Sangboak Lee

💻
qyecst
qyecst

💻
Han
Han

💻
wljince007
wljince007

💻
fero
fero

💻
Sibren
Sibren

💻
Nathaniel Walser
Nathaniel Walser

💻
Aaron Huggins
Aaron Huggins

🎨
KDex
KDex

💻
ChangHwan Kim
ChangHwan Kim

💻
Ash Neilson
Ash Neilson

💻
Chen Fansong
Chen Fansong

💻
Mxmilu
Mxmilu

💻
Charles Buffington
Charles Buffington

💻
Yu Qin
Yu Qin

💻
fireblue
fireblue

💻
marko1616
marko1616

💻
SelfHosted
SelfHosted

💵
Hiroaki Ogasawara
Hiroaki Ogasawara

💻
geodic
geodic

💻
P Foundation
P Foundation

💵
et304383
et304383

💻
ajkrj
ajkrj

💻
Leonardo Berbert
Leonardo Berbert

💻
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind are welcome! ================================================ FILE: README.pl-PL.md ================================================ [![](docs/readme.png)](https://tabby.sh)

Wszystkie wydania na GitHubie     Matrix   Przetłumacz   Twitter

--- > 👋 Zarządzasz zdalnymi środowiskami? Rzuć okiem na [WarpGate, inteligentny serwer typu bastion SSH/HTTP/MySQL](https://github.com/warp-tech/warpgate), świetnie współdziała z Tabby, pokochasz go! > 👋 [Tabby-Web](https://github.com/Eugeny/tabby-web) poszukuje sponsorów. Nie jestem w stanie pokryć kosztów hostowania całej infrastruktury, jeśli jesteś zainteresowany wsparciem, proszę [skontakuj się ze mną!](https://twitter.com/eugeeeeny) ---- ### Pobieranie: * [Ostatnie wydania](https://github.com/Eugeny/tabby/releases/latest) * [Repozytoria](https://packagecloud.io/eugeny/tabby): [Systemy Debian/Ubuntu](https://packagecloud.io/eugeny/tabby/install#bash-deb), [Środowiska RPM](https://packagecloud.io/eugeny/tabby/install#bash-rpm) * [Ostatnie wydania developerskie](https://nightly.link/Eugeny/tabby/workflows/build/master)

Ten plik README jest również dostępny w językach: :gb: English · :es: Spanish · :ru: Русский · :kr: 한국어 · :cn: 简体中文 · :it: Italiano · :de: Deutsch · :jp: 日本語 · :id: Bahasa Indonesia · 🇧🇷 Português

---- [**Tabby**](https://tabby.sh) (formalnie **Terminus**) to wysoce konfigurowalny emulator konsoli, SSH oraz klienta konsoli szeregowej na systemy Windows 10, macOS oraz Linux * Zintegrowany klient SSH i Telnet oraz menedżer sesji * Zintegrowany klient terminala szeregowego * Motywy and palety kolorów * W pełni konfigurowalne skróty klawiszowe * Dzielenie ekranu * Zapamiętywanie okien z poprzednich sesji * PowerShell (oraz PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder i wsparcie dla CMD * Bezpośredni transfer plików sesji SSH przez Zmodem * Pełne wsparcie dla znaków Unicode wraz z podwójnymi znakami * Nie zawieszanie się przy szybko wyświetlanych wynikach * Pełne doświadczenie powłoki na systemie Windows zawierającej podpowiedzi (przez Clink) * Zintegrowany zaszyfrowany kontener na klucze SSH i jego konfigurację * Klient SSH, SFTP oraz Telnet dostępny jako [aplikacja webowa](https://tabby.sh/app) (również jako [własna instacja](https://github.com/Eugeny/tabby-web)). # Spis treści - [Czym jest, a czym nie jest Tabby](#what-tabby-is-and-isnt) - [Funkcje konsoli](#terminal-features) - [Klient SSH](#ssh-client) - [Konsola szeregowa](#serial-terminal) - [Wersja przenośna](#portable) - [Wtyczki](#plugins) - [Motywy i palety kolorów](#themes) - [Współtworzenie](#contributing) # Czym jest, a czym nie jest Tabby * **Tabby jest** alternatywą dla standardowej konsoli Windows (conhost), PowerShell ISE, PuTTY, Terminal.app oraz iTerm z macOS * **Tabby nie jest** nową powłoką lub zamiennikiem dla MinGW czy Cygwin. Nie jest również zatrważająco szybki - jeśli ważne jest dla Ciebie użycie pamięci RAM, rozważ użycie [Conemu](https://conemu.github.io) lub [Alacritty](https://github.com/jwilm/alacritty) # Funkcje konsoli ![](docs/readme-terminal.png) * Konsola VT220 + wiele rozszerzeń * Wiele nakładających się podzielonych okien * Okna na każdej stronie ekranu * Opcjonalne dokowanie okna za pomocą skrótu ("Quake console") * Wykrywanie postępu (Pasek) * Powiadomienia przy ukończeniu procesu podczas postępu * Wklejanie z nawiasami, ostrzeżenie przy wielu liniach * Wsparcie różnych czcionek * Niestandardowe profile powłoki * Opcjonalne wklejanie PPM oraz kopiowanie na zaznaczeniu (Styl PuTTY) # Klient SSH ![](docs/readme-ssh.png) * Klient SSH2 z zarządzaniem połączeń * X11 oraz przekierowywanie portów * Automatyczne przejście między hostami * Przekierowanie agenta (Pageant oraz Windowsowy natywny "OpenSSH Agent") * Skrypty logowania # Konsola Szeregowa * Zapisane połączenia * Wczytywanie danych wejścia linii * Opcjonalna konwersja danych wejścia i wyjścia na szesnastkowe "byte-by-byte" * Konwersja na nową linię * Automatyczne połączenie po rozłączeniu # Wersja przenośna Tabby będzie uruchamiał się jako aplikacja przenośna, tylko wtedy, kiedy utworzysz folder `data` w tej samej lokacji, w której znajduje się `Tabby.exe`. # Wtyczki Wtyczki (jak i motywy) mogą być instalowane bezpośrednio z widoku ustawień w środku aplikacji Tabby. * [docker](https://github.com/Eugeny/tabby-docker) - połączenie z kontenerami Docker * [title-control](https://github.com/kbjr/terminus-title-control) - pozwala na zmienianie tytułu konsoli jako prefiks, sufiks lub/albo tekst do usunięcia * [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - szybko wysyłaj komendy z jednej konsoli do wielu * [save-output](https://github.com/Eugeny/tabby-save-output) - zapisuj dane wyjściowe do pliku * [sync-config](https://github.com/starxg/terminus-sync-config) - synchronizuj konfigurację przez Gista lub Gitee * [clippy](https://github.com/Eugeny/tabby-clippy) - przykładowa wtyczka, która zwyczajnie denerwuje * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - pozwala na utworzenie niestandardowego profilu pracy w aplikacji odpowiednio do konfiguracji * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - otwiera domyślną przeglądarkę z zaznaczonym tekstem w oknie Tabby * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - otwiera okno z połączeniem SFTP dla połączeń SSH jak SecureCRT * [background](https://github.com/moemoechu/tabby-background) - zmień tło Tabby oraz wiele więcej * [highlight](https://github.com/moemoechu/tabby-highlight) - Tabby terminal keyword highlight plugin * [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - okienka autoryzacji wewnątrz konsoli (Zbudowany głównie pod autoryzację projektu Warpgate w przeglądarce) * [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Potężna integracja serwera Model Context Protocol dla Tabby, która bezproblemowo łączy się z asystentami AI poprzez klientów MCP, takich jak Cursor i Windsurf, usprawniając przepływ pracy w terminalu dzięki inteligentnym możliwościom AI. # Motywy i palety kolorów * [hype](https://github.com/Eugeny/tabby-theme-hype) - Motyw zainspirowany konsolą "Hyper" * [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - Motyw "pełnej relaksacji" * [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox) - Motyw zainspirowany konsolą "Hyper" (kolejny) * [windows10](https://www.npmjs.com/package/terminus-theme-windows10) - Motyw zainspirowany Microsoftem * [altair](https://github.com/yxuko/terminus-altair) - Motwy autorstwa Yacine Kanzari * [catppuccin](https://github.com/catppuccin/tabby) - Paleta pastelowa dla Tabby * [noctis](https://github.com/aaronhuggins/tabby-colors-noctis) - Paleta kolorów zainspirowana motywem Noctis z VS Code # Sponsorzy [![](https://assets-production.packagecloud.io/assets/packagecloud-logo-light-scaled-26ce8e96060fddf74afbd4445e63ba35590d4aaa56edc98495bb390ef3cae0ae.png)](https://packagecloud.io) [**packagecloud**](https://packagecloud.io) zapewnia darmowe utrzymanie repozytorium Debian/RPM [![](https://user-images.githubusercontent.com/161476/200423885-7aba2202-fea7-4409-95b9-3a062ce902c7.png)](https://keygen.sh/?via=eugene) [**keygen**](https://keygen.sh/?via=eugene) zapewnia darmowe wydawanie oraz automatycznie utrzymywanie strony # Współtworzenie Pull requesty and dodawanie nowych wtyczek jest mile widziane! Zobacz plik [HAKOWANIE.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) oraz [Dokumentację API](https://docs.tabby.sh/), aby poznać, jak projekt jest prowadzony wraz ze wstępnym poradnikiem jak tworzyć wtyczki. --- Dziękujemy wszystkim osobom współtworzącym ten projekt ([emotki są specjalizacją](https://allcontributors.org/docs/en/emoji-key)):
Russell Myers
Russell Myers

💻
Austin Warren
Austin Warren

💻
Felicia Hummel
Felicia Hummel

💻
Mike MacCana
Mike MacCana

⚠️ 🎨
Yacine Kanzari
Yacine Kanzari

💻
BBJip
BBJip

💻
Futagirl
Futagirl

🎨
Levin Rickert
Levin Rickert

💻
OJ Kwon
OJ Kwon

💻
domain
domain

🔌 💻
James Brumond
James Brumond

🔌
Daniel Imms
Daniel Imms

💻 🔌 ⚠️
Florian Bachmann
Florian Bachmann

💻
Michael Kühnel
Michael Kühnel

💻 🎨
Tilmann Meyer
Tilmann Meyer

💻
PM Extra
PM Extra

🐛
Jonathan
Jonathan

💻
Hans Koch
Hans Koch

💻
Dak Smyth
Dak Smyth

💻
Wang Zhi
Wang Zhi

💻
jack1142
jack1142

💻
Howie Douglas
Howie Douglas

💻
Chris Kaczor
Chris Kaczor

💻
Johannes Kadak
Johannes Kadak

💻
LeSeulArtichaut
LeSeulArtichaut

💻
Cyril Taylor
Cyril Taylor

💻
nstefanou
nstefanou

💻 🔌
orin220444
orin220444

💻
Gobius Dolhain
Gobius Dolhain

💻
Gwilherm Folliot
Gwilherm Folliot

💻
Dmitry Pronin
Dmitry Pronin

💻
Jonathan Beverley
Jonathan Beverley

💻
Zenghai Liang
Zenghai Liang

💻
Mateusz Tracz
Mateusz Tracz

💻
pinpin
pinpin

💻
Takuro Onoda
Takuro Onoda

💻
frauhottelmann
frauhottelmann

💻
Piotr Patalong
Piotr Patalong

🎨
Clark Wang
Clark Wang

💻
iamchating
iamchating

💻
starxg
starxg

🔌
Alisue
Alisue

🎨
Dominic Yin
Dominic Yin

💻
Brandon Rothweiler
Brandon Rothweiler

🎨
Logic Machine
Logic Machine

📖
cypherbits
cypherbits

📖
Matthew Davidson
Matthew Davidson

💻
Alexander Wiedemann
Alexander Wiedemann

💻
장보연
장보연

📖
zZ
zZ

💻
Aaron Davison
Aaron Davison

💻
Przemyslaw Kozik
Przemyslaw Kozik

🎨
Alfredo Arellano de la Fuente
Alfredo Arellano de la Fuente

💻
MH Kim
MH Kim

💻
Marmota
Marmota

🎨
Ares Andrew
Ares Andrew

📖
George Korsnick
George Korsnick

💵
Artem Smirnov
Artem Smirnov

💵
Tim Kopplow
Tim Kopplow

💵
mrthock
mrthock

💵
Lukas Rottach
Lukas Rottach

💵
boonkerz
boonkerz

💻 🌍
Milo Ivir
Milo Ivir

🌍
JasonCubic
JasonCubic

🎨
MaxWaldorf
MaxWaldorf

🚇
Michael Wizner
Michael Wizner

💻
Martin
Martin

💻
Piersandro Guerrera
Piersandro Guerrera

📖 🌍
0x973
0x973

💻
Allenator
Allenator

📖
Matheus Castello
Matheus Castello

💻
Jai A P
Jai A P

📦
Richard Yu
Richard Yu

💻
artu-ole
artu-ole

💻
Timofey Gribanov
Timofey Gribanov

📖 🌍
Christian Bingman
Christian Bingman

💻
zhipeng
zhipeng

💻
woodmeal
woodmeal

💻
MagicLike
MagicLike

📖
Hisam Fahri
Hisam Fahri

💻
Liangcheng Juves
Liangcheng Juves

💻
Atte Timonen
Atte Timonen

💻
João Pinto
João Pinto

📖
Alan
Alan

💻
Atsushi Morimoto
Atsushi Morimoto

💵
Arles
Arles

💵
six2dez
six2dez

💵
Candice
Candice

💵
Rowen Willabus
Rowen Willabus

💵
HengY1Coding✨
HengY1Coding✨

💵
Francis Gelderloos
Francis Gelderloos

💵
astromasoud
astromasoud

💵
Anders G. Jørgensen
Anders G. Jørgensen

💵
Dave Richardson
Dave Richardson

💵
Thomas Peter Berntsen
Thomas Peter Berntsen

💵
Ikko Ashimine
Ikko Ashimine

📖
giejqf
giejqf

💻
Thomas LACAZE
Thomas LACAZE

💻
Po Chen
Po Chen

💵
Victor Chandra
Victor Chandra

📖
Dan Nissenbaum
Dan Nissenbaum

💵
RogueThorn
RogueThorn

💵
Spenser Black
Spenser Black

💻
Alex
Alex

💵
HengY1Coding✨
HengY1Coding✨

💵
David Carrero
David Carrero

📖
Andrii Zhovtiak
Andrii Zhovtiak

💻
Mason Ma
Mason Ma

💵
Timo
Timo

💵
Evin Watson
Evin Watson

📖
Hendra Juli
Hendra Juli

📖
Wellinton Kricowski
Wellinton Kricowski

💵 📖
Allan
Allan

🎨
Benjamin Brandmeier
Benjamin Brandmeier

💻
patric1025
patric1025

🌍
hermitpopcorn
hermitpopcorn

💻
Joshua Tzucker
Joshua Tzucker

💵
luxifr
luxifr

💵
Anne Summers
Anne Summers

💵
Clem
Clem

💻
Elizabeth Martín Campos
Elizabeth Martín Campos

💻
Tomáš Hruška
Tomáš Hruška

💻
Osman Karaketir
Osman Karaketir

💻
Crypto Gnome
Crypto Gnome

💵
Richard Bukovansky
Richard Bukovansky

💵
catlas
catlas

💵
Thomas Kapocsi
Thomas Kapocsi

📖
Dylan Hackworth
Dylan Hackworth

💵
Sangboak Lee
Sangboak Lee

💻
qyecst
qyecst

💻
Han
Han

💻
wljince007
wljince007

💻
fero
fero

💻
Sibren
Sibren

💻
Nathaniel Walser
Nathaniel Walser

💻
Aaron Huggins
Aaron Huggins

🎨
KDex
KDex

💻
ChangHwan Kim
ChangHwan Kim

💻
Ash Neilson
Ash Neilson

💻
Chen Fansong
Chen Fansong

💻
Ten projekt podlega specyfikacji [dla współautorów](https://github.com/all-contributors/all-contributors). Wszelkiego rodzaju przyczynianie się do rozwoju jest tu mile widziane! ================================================ FILE: README.pt-BR.md ================================================ [![](docs/readme.png)](https://tabby.sh)

GitHub All Releases     Matrix   Translate   Twitter

---- ### Downloads: * [Última versão](https://github.com/Eugeny/tabby/releases/latest) * [Repositórios](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu-based](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM-based](https://packagecloud.io/eugeny/tabby/install#bash-rpm) * [Última compilação nightly](https://nightly.link/Eugeny/tabby/workflows/build/master)

Esse README também está disponível em: :gb: English · :es: Spanish · :ru: Русский · :kr: 한국어 · :cn: 简体中文 · :it: Italiano · :de: Deutsch · :jp: 日本語 · :id: Bahasa Indonesia · :poland: Polski

---- [**Tabby**](https://tabby.sh) (anteriormente **Terminus**) é um emulador de terminal, SSH e serial client altamente configurável para Windows, macOS e Linux. * Cliente e gerenciador de conexões SSH e Telnet integrado * Terminal serial integrado * Temas e esquemas de cores * Atalhos e atalhos multiplos totalmente configuravéis * Divisor de painéis * Recupera as guias da ultima execução * Suporte para PowerShell (e PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder e CMD * Transferência direta de arquivos de/para sessões SSH via Zmodem * Suporte total para Unicode, incluindo caracteres de largura dupla * Não trava com saídas de fluxo rápido * Experiência de shell adequada no Windows, incluindo preenchimento de guia (via Clink) * Contêiner criptografado integrado para as chaves SSH e configurações * SSH, SFTP e Cliente Telnet disponível como [aplicação web](https://tabby.sh/app) (também em [hospedagem local](https://github.com/Eugeny/tabby-web)). # Conteúdo - [O que é Tabby e o que não é](#what-tabby-is-and-isnt) - [Recursos do Terminal](#terminal-features) - [Cliente SSH](#ssh-client) - [Terminal Serial](#serial-terminal) - [Portátil](#portable) - [Plugins](#plugins) - [Temas](#themes) - [Contribuições](#contributing) # O que é Tabby e o que não é * **Tabby é** uma alternativa ao terminal padrão do Windows (conhost), PowerShell ISE, PuTTY, macOS Terminal.app e iTerm * **Tabby não é** um novo shell ou um substituto do MinGW ou Cygwin. Também não é leve - se o uso de RAM for importante, considere usar o [Conemu](https://conemu.github.io) ou [Alacritty](https://github.com/jwilm/alacritty) # Recursos do Terminal ![](docs/readme-terminal.png) * Um terminal VT220 + várias extensões * Múltiplos painéis divididos aninhados * Guias em qualquer lado da janela * Opção de minimizar para a barra de tarefas com uma tecla de atalho global ("Quake console") * Detecção de progresso * Notificação da conclusão do processo * Colar entre colchetes, avisos de colagem de várias linhas * Ligadura tipográfica * Perfis shell personalizados * Opção de selecionar para copiar e colar com o botão direto do mouse (RMB) igual ao Putty # Cliente SSH ![](docs/readme-ssh.png) * Cliente SSH2 com gerenciador de conexões * X11 e redirecionamento de portas (port forwarding) * Gerenciamento de host de saldo automatico (Jump Host) * Encaminhamento de agente (incl. Pageant e agente OpenSSH nativo do Windows) * Scripts de Login # Terminal Serial * Salva as Conexões * Suporte de entrada de linha * Opões de saida em hex, byte a byte e hexdump * Conversão de nova linha * Reconexão automatica # Portátil Tabby será executado como um aplicativo portátil no Windows, se você criar uma pasta chamada 'data' no mesmo local do executável 'Tabby.exe' # Plugins Plugins e temas podem ser instalados durante a execução na pagina de configurações > plugins * [docker](https://github.com/Eugeny/tabby-docker) - conecta aos conteiners Docker * [title-control](https://github.com/kbjr/terminus-title-control) - permite modificar o título das guias do terminal fornecendo um prefixo, sufixo e/ou strings a serem removidos * [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - envie comandos rapidamente para uma ou todas as guias do terminal * [save-output](https://github.com/Eugeny/tabby-save-output) - gravar a saída do terminal em um arquivo * [sync-config](https://github.com/starxg/terminus-sync-config) - sincronizar a configuração com Gist ou Gitee * [clippy](https://github.com/Eugeny/tabby-clippy) - um plugin de exemplo que te incomoda o tempo todo * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - permite criar perfis de espaço de trabalho personalizados com base na configuração fornecida * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - abre o navegador padrão do sistema com um texto selecionado na guia do Tabby * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - abre uma guia SFTP para conexão SSH como o SecureCRT * [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - pop-ups de autenticação web dentro do aplicativo (Construído principalmente para autenticação in-browser do warpgate) * [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Integração poderosa do servidor Model Context Protocol para Tabby que se conecta perfeitamente com assistentes de IA através de clientes MCP como Cursor e Windsurf, aprimorando seu fluxo de trabalho no terminal com recursos inteligentes de IA. # Temas * [hype](https://github.com/Eugeny/tabby-theme-hype) * [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) * [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox) * [windows10](https://www.npmjs.com/package/terminus-theme-windows10) * [altair](https://github.com/yxuko/terminus-altair) # Patrocinadores [![](https://assets-production.packagecloud.io/assets/packagecloud-logo-light-scaled-26ce8e96060fddf74afbd4445e63ba35590d4aaa56edc98495bb390ef3cae0ae.png)](https://packagecloud.io) [**packagecloud**](https://packagecloud.io) forneceu hospedagem gratuita de repositório Debian/RPM [![](https://user-images.githubusercontent.com/161476/200423885-7aba2202-fea7-4409-95b9-3a062ce902c7.png)](https://keygen.sh/?via=eugene) [**keygen**](https://keygen.sh/?via=eugene) forneceu hospedagem gratuita para liberação e atualização automática # Contribuições Pull requests e plugins são bem-vindos! Consulte os documentos [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) e [API docs](https://docs.tabby.sh/) para obter informações sobre como o projeto foi estruturado e um breve tutorial de desenvolvimento de plug-in. --- Obrigado vai para essas pessoas maravilhosas ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
Russell Myers
Russell Myers

💻
Austin Warren
Austin Warren

💻
Felicia Hummel
Felicia Hummel

💻
Mike MacCana
Mike MacCana

⚠️ 🎨
Yacine Kanzari
Yacine Kanzari

💻
BBJip
BBJip

💻
Futagirl
Futagirl

🎨
Levin Rickert
Levin Rickert

💻
OJ Kwon
OJ Kwon

💻
domain
domain

🔌 💻
James Brumond
James Brumond

🔌
Daniel Imms
Daniel Imms

💻 🔌 ⚠️
Florian Bachmann
Florian Bachmann

💻
Michael Kühnel
Michael Kühnel

💻 🎨
Tilmann Meyer
Tilmann Meyer

💻
PM Extra
PM Extra

🐛
Jonathan
Jonathan

💻
Hans Koch
Hans Koch

💻
Dak Smyth
Dak Smyth

💻
Wang Zhi
Wang Zhi

💻
jack1142
jack1142

💻
Howie Douglas
Howie Douglas

💻
Chris Kaczor
Chris Kaczor

💻
Johannes Kadak
Johannes Kadak

💻
LeSeulArtichaut
LeSeulArtichaut

💻
Cyril Taylor
Cyril Taylor

💻
nstefanou
nstefanou

💻 🔌
orin220444
orin220444

💻
Gobius Dolhain
Gobius Dolhain

💻
Gwilherm Folliot
Gwilherm Folliot

💻
Dmitry Pronin
Dmitry Pronin

💻
Jonathan Beverley
Jonathan Beverley

💻
Zenghai Liang
Zenghai Liang

💻
Mateusz Tracz
Mateusz Tracz

💻
pinpin
pinpin

💻
Takuro Onoda
Takuro Onoda

💻
frauhottelmann
frauhottelmann

💻
Piotr Patalong
Piotr Patalong

🎨
Clark Wang
Clark Wang

💻
iamchating
iamchating

💻
starxg
starxg

🔌
Alisue
Alisue

🎨
Dominic Yin
Dominic Yin

💻
Brandon Rothweiler
Brandon Rothweiler

🎨
Logic Machine
Logic Machine

📖
cypherbits
cypherbits

📖
Matthew Davidson
Matthew Davidson

💻
Alexander Wiedemann
Alexander Wiedemann

💻
장보연
장보연

📖
zZ
zZ

💻
Aaron Davison
Aaron Davison

💻
Przemyslaw Kozik
Przemyslaw Kozik

🎨
Alfredo Arellano de la Fuente
Alfredo Arellano de la Fuente

💻
MH Kim
MH Kim

💻
Marmota
Marmota

🎨
Ares Andrew
Ares Andrew

📖
George Korsnick
George Korsnick

💵
Artem Smirnov
Artem Smirnov

💵
Tim Kopplow
Tim Kopplow

💵
mrthock
mrthock

💵
Lukas Rottach
Lukas Rottach

💵
boonkerz
boonkerz

💻 🌍
Milo Ivir
Milo Ivir

🌍
JasonCubic
JasonCubic

🎨
MaxWaldorf
MaxWaldorf

🚇
Michael Wizner
Michael Wizner

💻
Martin
Martin

💻
Piersandro Guerrera
Piersandro Guerrera

📖 🌍
0x973
0x973

💻
Allenator
Allenator

📖
Matheus Castello
Matheus Castello

💻
Jai A P
Jai A P

📦
Richard Yu
Richard Yu

💻
artu-ole
artu-ole

💻
Timofey Gribanov
Timofey Gribanov

📖 🌍
Christian Bingman
Christian Bingman

💻
zhipeng
zhipeng

💻
woodmeal
woodmeal

💻
MagicLike
MagicLike

📖
Hisam Fahri
Hisam Fahri

💻
Liangcheng Juves
Liangcheng Juves

💻
Atte Timonen
Atte Timonen

💻
João Pinto
João Pinto

📖
Alan
Alan

💻
Atsushi Morimoto
Atsushi Morimoto

💵
Arles
Arles

💵
six2dez
six2dez

💵
Candice
Candice

💵
Rowen Willabus
Rowen Willabus

💵
HengY1Coding✨
HengY1Coding✨

💵
Francis Gelderloos
Francis Gelderloos

💵
astromasoud
astromasoud

💵
Anders G. Jørgensen
Anders G. Jørgensen

💵
Dave Richardson
Dave Richardson

💵
Thomas Peter Berntsen
Thomas Peter Berntsen

💵
Ikko Ashimine
Ikko Ashimine

📖
giejqf
giejqf

💻
Thomas LACAZE
Thomas LACAZE

💻
Po Chen
Po Chen

💵
Victor Chandra
Victor Chandra

📖
Dan Nissenbaum
Dan Nissenbaum

💵
RogueThorn
RogueThorn

💵
Spenser Black
Spenser Black

💻
Alex
Alex

💵
HengY1Coding✨
HengY1Coding✨

💵
David Carrero
David Carrero

📖
Andrii Zhovtiak
Andrii Zhovtiak

💻
Mason Ma
Mason Ma

💵
Timo
Timo

💵
Evin Watson
Evin Watson

📖
Hendra Juli
Hendra Juli

📖
Wellinton Kricowski
Wellinton Kricowski

💵 📖
Allan
Allan

🎨
Benjamin Brandmeier
Benjamin Brandmeier

💻
patric1025
patric1025

🌍
hermitpopcorn
hermitpopcorn

💻
Joshua Tzucker
Joshua Tzucker

💵
luxifr
luxifr

💵
Anne Summers
Anne Summers

💵
Clem
Clem

💻
Elizabeth Martín Campos
Elizabeth Martín Campos

💻
Tomáš Hruška
Tomáš Hruška

💻
Osman Karaketir
Osman Karaketir

💻
Crypto Gnome
Crypto Gnome

💵
Richard Bukovansky
Richard Bukovansky

💵
catlas
catlas

💵
Thomas Kapocsi
Thomas Kapocsi

📖
Dylan Hackworth
Dylan Hackworth

💵
Sangboak Lee
Sangboak Lee

💻
qyecst
qyecst

💻
Han
Han

💻
wljince007
wljince007

💻
fero
fero

💻
Sibren
Sibren

💻
Nathaniel Walser
Nathaniel Walser

💻
Aaron Huggins
Aaron Huggins

🎨
KDex
KDex

💻
ChangHwan Kim
ChangHwan Kim

💻
Ash Neilson
Ash Neilson

💻
Chen Fansong
Chen Fansong

💻
Mxmilu
Mxmilu

💻
Charles Buffington
Charles Buffington

💻
Yu Qin
Yu Qin

💻
fireblue
fireblue

💻
marko1616
marko1616

💻
SelfHosted
SelfHosted

💵
Hiroaki Ogasawara
Hiroaki Ogasawara

💻
geodic
geodic

💻
P Foundation
P Foundation

💵
et304383
et304383

💻
ajkrj
ajkrj

💻
Leonardo Berbert
Leonardo Berbert

💻
Este projeto segue a especificação [all-contributors](https://github.com/all-contributors/all-contributors). Contribuições de qualquer tipo são bem vindas! ================================================ FILE: README.ru-RU.md ================================================ [![](docs/readme.png)](https://tabby.sh)

GitHub All Releases     Matrix   Translate   Twitter

---- ### Загрузки: * [Последняя версия](https://github.com/Eugeny/tabby/releases/latest) * [Репозитории](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM](https://packagecloud.io/eugeny/tabby/install#bash-rpm) * [Последний nightly-билд](https://nightly.link/Eugeny/tabby/workflows/build/master)

Этот README также доступен на: :gb: English · :es: Spanish · :kr: 한국어 · :cn: 简体中文 · :it: Italiano · :de: Deutsch · :jp: 日本語 · :id: Bahasa Indonesia · :brazil: Português · :poland: Polski

---- [**Tabby**](https://tabby.sh) (ранее **Terminus**) — широко конфигурируемый эмулятор терминала, SSH- и COM-клиент для Windows, macOS и Linux: * Встроенный SSH- и Telnet-клиент и менеджер подключений; * Встроенный последовательный терминал; * Темы и цветовые схемы; * Полностью настраиваемые сочетания клавиш; * Панели; * Запоминание вкладок; * Поддержка PowerShell (and PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder и CMD; * Прямая передача файлов из и в SSH-сессии через Zmodem; * Полная поддержка Unicode, включая символы двойной ширины; * Не задыхается при быстром выводе; * Полноценный опыт работы с shell на Windows, включая дополнение слов и команд по Tab (при помощи Clink); * Встроенное защищённое хранилище для SSH-ключей и настроек; * SSH-, SFTP- и Telnet-клиент доступен как [веб-приложение](https://tabby.sh/app) (также для [самостоятелньного хостинга](https://github.com/Eugeny/tabby-web)). # Содержание - [Правда и ложь про Tabby](#правда-и-ложь-про-tabby) - [Функции терминала](#функции-терминала) - [SSH-клиент](#ssh-клиент) - [Терминал последовательного порта](#терминал-последовательного-порта) - [Портативность](#портативность) - [Плагины](#плагины) - [Темы](#темы) - [Внести свой вклад](#внести-свой-вклад) # Правда и ложь про Tabby * **Правда:** Tabby — это альтернатива стандартному терминалу Windows (conhost), PowerShell ISE, PuTTY, macOS Terminal.app и iTerm. * **Ложь:** Tabby — это не новая оболочка или замена MinGW или Cygwin. Также он нелёгок — если потребление ОЗУ крайне важно для вас, лучше взгляните на [Conemu](https://conemu.github.io) или [Alacritty](https://github.com/jwilm/alacritty). # Функции терминала ![](docs/readme-terminal.png) * Терминал VT220 + различные дополнения; * Деление окна на несколько панелей; * Вкладки на любой стороне окна; * Опционально закрепляемое окно с глобальной горячей клавишей для вызова («Quake console»); * Определение прогресса выполняемого процесса; * Уведомления о завершении процессов; * Защита от выполнения команд при вставке, предупреждения о вставке нескольких строк; * Лигатуры шрифтов; * Пользовательские профили оболочки; * Опциональная ПКМ-вставка и копирование при выделении (в стиле PuTTY). # SSH-клиент ![](docs/readme-ssh.png) * SSH2-клиент с менеджером соединений; * Проброс портов и X11; * Управление автоматическими джамп-хостами; * Проброс агента (включая Pageant и встроеный в Windows OpenSSH Agent); * Скрипты для входа. # Терминал последовательного порта * Сохранение соединений; * Поддержка ввода readline; * Опциональный побатный ввод HEX и вывод hexdump; * Преобразование newline; * Автоматическое восстановление соединения. # Портативность На Windows Tabby будет работать в портативном режиме, если создать папку `data` там же, где расположен файл `Tabby.exe`. # Плагины Плагины и темы можно установить напрямую из Настроек Tabby. * [clickable-links](https://github.com/Eugeny/tabby-clickable-links) — делает пути и URL в терминале гиперссылками; * [docker](https://github.com/Eugeny/tabby-docker) — подключения к Docker-контейнерам; * [title-control](https://github.com/kbjr/terminus-title-control) — позволяет изменять названия вкладок, добавляя префиксы, суффиксы и позволяя удалять строки; * [quick-cmds](https://github.com/Domain/terminus-quick-cmds) — быстро передаёт команды в одну или все вкладки терминала; * [save-output](https://github.com/Eugeny/tabby-save-output) — запись вывода терминала в файл; * [sync-config](https://github.com/starxg/terminus-sync-config) — синхронизация конфига в Gist или Gitee; * [clippy](https://github.com/Eugeny/tabby-clippy) — плагин-пример, который постоянно будет вас бесить; * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) — позволяет создавать пользовательские профили рабочего окружения на основе конфига; * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) — открывает браузер по умолчанию с текстом, выделенном во вкладке Tabby. * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - открывает sftp вкладку для ssh соединения, похож на SecureCRT * [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - Встроенные всплывающие окна веб-аутентификации (Основано в основном для аутентификации в браузере warpgate) * [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Мощная интеграция сервера протокола Model Context Protocol для Tabby, которая беспрепятственно соединяется с ИИ-ассистентами через MCP-клиенты, такие как Cursor и Windsurf, улучшая рабочий процесс в терминале с помощью интеллектуальных возможностей искусственного интеллекта. # Темы * [hype](https://github.com/Eugeny/tabby-theme-hype) — тема, вдохновлённая Hyper; * [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) — тема Relaxed для Tabby; * [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox); * [windows10](https://www.npmjs.com/package/terminus-theme-windows10); * [altair](https://github.com/yxuko/terminus-altair). # Спонсоры [![](https://assets-production.packagecloud.io/assets/packagecloud-logo-light-scaled-26ce8e96060fddf74afbd4445e63ba35590d4aaa56edc98495bb390ef3cae0ae.png)](https://packagecloud.io) [**packagecloud**](https://packagecloud.io) предоставил бесплатный хостинг для Debian/RPM репозитория. # Внести свой вклад Pull-запросы и плагины приветствуются! Взгляните на [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) и [API docs](https://docs.tabby.sh/), чтобы понять, как устроен проект, и ради очень краткого туториала по созданию плагинов. --- Огромное спасибо этим прекрасным людям ([описание эмодзи](https://allcontributors.org/docs/en/emoji-key)):
Russell Myers
Russell Myers

💻
Austin Warren
Austin Warren

💻
Felicia Hummel
Felicia Hummel

💻
Mike MacCana
Mike MacCana

⚠️ 🎨
Yacine Kanzari
Yacine Kanzari

💻
BBJip
BBJip

💻
Futagirl
Futagirl

🎨
Levin Rickert
Levin Rickert

💻
OJ Kwon
OJ Kwon

💻
domain
domain

🔌 💻
James Brumond
James Brumond

🔌
Daniel Imms
Daniel Imms

💻 🔌 ⚠️
Florian Bachmann
Florian Bachmann

💻
Michael Kühnel
Michael Kühnel

💻 🎨
Tilmann Meyer
Tilmann Meyer

💻
PM Extra
PM Extra

🐛
Jonathan
Jonathan

💻
Hans Koch
Hans Koch

💻
Dak Smyth
Dak Smyth

💻
Wang Zhi
Wang Zhi

💻
jack1142
jack1142

💻
Howie Douglas
Howie Douglas

💻
Chris Kaczor
Chris Kaczor

💻
Johannes Kadak
Johannes Kadak

💻
LeSeulArtichaut
LeSeulArtichaut

💻
Cyril Taylor
Cyril Taylor

💻
nstefanou
nstefanou

💻 🔌
orin220444
orin220444

💻
Gobius Dolhain
Gobius Dolhain

💻
Gwilherm Folliot
Gwilherm Folliot

💻
Dmitry Pronin
Dmitry Pronin

💻
Jonathan Beverley
Jonathan Beverley

💻
Zenghai Liang
Zenghai Liang

💻
Mateusz Tracz
Mateusz Tracz

💻
pinpin
pinpin

💻
Takuro Onoda
Takuro Onoda

💻
frauhottelmann
frauhottelmann

💻
Piotr Patalong
Piotr Patalong

🎨
Clark Wang
Clark Wang

💻
iamchating
iamchating

💻
starxg
starxg

🔌
Alisue
Alisue

🎨
Dominic Yin
Dominic Yin

💻
Brandon Rothweiler
Brandon Rothweiler

🎨
Logic Machine
Logic Machine

📖
cypherbits
cypherbits

📖
Matthew Davidson
Matthew Davidson

💻
Alexander Wiedemann
Alexander Wiedemann

💻
장보연
장보연

📖
zZ
zZ

💻
Aaron Davison
Aaron Davison

💻
Przemyslaw Kozik
Przemyslaw Kozik

🎨
Alfredo Arellano de la Fuente
Alfredo Arellano de la Fuente

💻
MH Kim
MH Kim

💻
Marmota
Marmota

🎨
Ares Andrew
Ares Andrew

📖
George Korsnick
George Korsnick

💵
Artem Smirnov
Artem Smirnov

💵
Tim Kopplow
Tim Kopplow

💵
mrthock
mrthock

💵
Lukas Rottach
Lukas Rottach

💵
boonkerz
boonkerz

💻 🌍
Milo Ivir
Milo Ivir

🌍
JasonCubic
JasonCubic

🎨
MaxWaldorf
MaxWaldorf

🚇
Michael Wizner
Michael Wizner

💻
Martin
Martin

💻
Piersandro Guerrera
Piersandro Guerrera

📖 🌍
0x973
0x973

💻
Allenator
Allenator

📖
Matheus Castello
Matheus Castello

💻
Jai A P
Jai A P

📦
Richard Yu
Richard Yu

💻
artu-ole
artu-ole

💻
Timofey Gribanov
Timofey Gribanov

📖 🌍
Christian Bingman
Christian Bingman

💻
zhipeng
zhipeng

💻
woodmeal
woodmeal

💻
MagicLike
MagicLike

📖
Hisam Fahri
Hisam Fahri

💻
Liangcheng Juves
Liangcheng Juves

💻
Atte Timonen
Atte Timonen

💻
João Pinto
João Pinto

📖
Alan
Alan

💻
Atsushi Morimoto
Atsushi Morimoto

💵
Arles
Arles

💵
six2dez
six2dez

💵
Candice
Candice

💵
Rowen Willabus
Rowen Willabus

💵
HengY1Coding✨
HengY1Coding✨

💵
Francis Gelderloos
Francis Gelderloos

💵
astromasoud
astromasoud

💵
Anders G. Jørgensen
Anders G. Jørgensen

💵
Dave Richardson
Dave Richardson

💵
Thomas Peter Berntsen
Thomas Peter Berntsen

💵
Ikko Ashimine
Ikko Ashimine

📖
giejqf
giejqf

💻
Thomas LACAZE
Thomas LACAZE

💻
Po Chen
Po Chen

💵
Victor Chandra
Victor Chandra

📖
Dan Nissenbaum
Dan Nissenbaum

💵
RogueThorn
RogueThorn

💵
Spenser Black
Spenser Black

💻
Alex
Alex

💵
HengY1Coding✨
HengY1Coding✨

💵
David Carrero
David Carrero

📖
Andrii Zhovtiak
Andrii Zhovtiak

💻
Mason Ma
Mason Ma

💵
Timo
Timo

💵
Evin Watson
Evin Watson

📖
Hendra Juli
Hendra Juli

📖
Wellinton Kricowski
Wellinton Kricowski

💵 📖
Allan
Allan

🎨
Benjamin Brandmeier
Benjamin Brandmeier

💻
patric1025
patric1025

🌍
hermitpopcorn
hermitpopcorn

💻
Joshua Tzucker
Joshua Tzucker

💵
luxifr
luxifr

💵
Anne Summers
Anne Summers

💵
Clem
Clem

💻
Elizabeth Martín Campos
Elizabeth Martín Campos

💻
Tomáš Hruška
Tomáš Hruška

💻
Osman Karaketir
Osman Karaketir

💻
Crypto Gnome
Crypto Gnome

💵
Richard Bukovansky
Richard Bukovansky

💵
catlas
catlas

💵
Thomas Kapocsi
Thomas Kapocsi

📖
Dylan Hackworth
Dylan Hackworth

💵
Sangboak Lee
Sangboak Lee

💻
qyecst
qyecst

💻
Han
Han

💻
wljince007
wljince007

💻
fero
fero

💻
Sibren
Sibren

💻
Nathaniel Walser
Nathaniel Walser

💻
Aaron Huggins
Aaron Huggins

🎨
KDex
KDex

💻
ChangHwan Kim
ChangHwan Kim

💻
Ash Neilson
Ash Neilson

💻
Chen Fansong
Chen Fansong

💻
Mxmilu
Mxmilu

💻
Charles Buffington
Charles Buffington

💻
Yu Qin
Yu Qin

💻
fireblue
fireblue

💻
marko1616
marko1616

💻
SelfHosted
SelfHosted

💵
Hiroaki Ogasawara
Hiroaki Ogasawara

💻
geodic
geodic

💻
P Foundation
P Foundation

💵
et304383
et304383

💻
ajkrj
ajkrj

💻
Leonardo Berbert
Leonardo Berbert

💻
Данный проект следует заветам [all-contributors](https://github.com/all-contributors/all-contributors). Любые созидатели приветствуются! ================================================ FILE: README.zh-CN.md ================================================ [![](docs/readme.png)](https://tabby.sh)

GitHub All Releases     Matrix   Translate   Twitter

---- ### 下载 * [Latest release](https://github.com/Eugeny/tabby/releases/latest) * [Repositories](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu-based](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM-based](https://packagecloud.io/eugeny/tabby/install#bash-rpm) * [Latest nightly build](https://nightly.link/Eugeny/tabby/workflows/build/master)

本 README 还适用于以下语言: :gb: English · :es: Spanish · :ru: Русский · :kr: 한국어 · :it: Italiano · :de: Deutsch · :jp: 日本語 · :id: Bahasa Indonesia · :brazil: Português · :poland: Polski

---- [**Tabby**](https://tabby.sh) (前身是 **Terminus**) 是一个可高度配置的终端模拟器和 SSH 或串口客户端,支持 Windows,macOS 和 Linux * 集成 SSH,Telnet 客户端和连接管理器 * 集成串行终端 * 定制主题和配色方案 * 完全可配置的快捷键和多键快捷键 * 分体式窗格 * 自动保存标签页 * 支持 PowerShell(和 PS Core)、WSL、Git-Bash、Cygwin、MSYS2、Cmder 和 CMD * 在 SSH 会话中通过 Zmodem 进行直接文件传输 * 完整的 Unicode 支持,包括双角字符 * 不会因快速的输出而卡住 * Windows 上舒适的 shell 体验,包括 tab 自动补全(通过 Clink) * 为 SSH secrets 和设置集成了加密容器 * SSH、SFTP 和 Telnet 客户端可用作 [Web 应用](https://tabby.sh/app)(也可[托管](https://github.com/Eugeny/tabby-web)) # 目录 - [Tabby是什么](#tabby是什么) - [终端特性](#终端特性) - [SSH 客户端](#ssh-客户端) - [串行终端](#串行终端) - [便携式应用](#便携式应用) - [插件](#插件) - [主题](#主题) - [贡献](#贡献) # Tabby是什么 * **Tabby 是** Windows 标准终端 (conhost)、PowerShell ISE、PuTTY、macOS Terminal.app 和 iTerm 的替代品 * **Tabby 不是**一个全新的 shell,也不是 MinGW 或 Cygwin 的替代品。它也不是轻量级的 - 如果你对内存的占用很敏感,请考虑 [Conemu](https://conemu.github.io) 或 [Alacritty](https://github.com/jwilm/alacritty) # 终端特性 ![](docs/readme-terminal.png) * 一个 VT220 终端 + 各种插件 * 多个嵌套的拆分窗格 * 可以将标签页设置在窗口的任意一侧 * 带有全局生成热键的可选可停靠窗口(“Quake console”) * 进度检测 * 流程完成通知 * 带括号的粘贴,多行粘贴提示 * 连体字 * 自定义 shell 配置文件 * 可选的 RMB 粘贴和复制选择(PuTTY 风格) # SSH 客户端 ![](docs/readme-ssh.png) * 带有连接管理器的 SSH2 客户端 * X11和端口转发 * 自动跳转主机管理 * 代理转发(包括 Pageant 和 Windows 原生 OpenSSH 代理) * 登录脚本 # 串行终端 * 保存连接 * 逐行读取的输入支持 * 可选的十六进制逐字节输入和十六进制转储输出 * 换行转换 * 自动重连 # 便携式应用 如果在 Tabby.exe 所在的目录创建一个名为`data`文件夹,Tabby 将可以在 Windows 上作为便携式的应用程序运行。 # 插件 插件和主题可以直接在 Tabby 设置中安装。 * [clickable-links](https://github.com/Eugeny/tabby-clickable-links) - 使终端中的路径和 URL 可点击 * [docker](https://github.com/Eugeny/tabby-docker) - 连接 Docker 容器 * [title-control](https://github.com/kbjr/terminus-title-control) - 允许通过提供要删除的前缀、后缀和/或字符串来修改标签页的标题 * [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - 快速向一个或所有标签页发送命令 * [save-output](https://github.com/Eugeny/tabby-save-output) - 将终端输出记录到文件中 * [sync-config](https://github.com/starxg/terminus-sync-config) - 将配置同步到 Gist 或 Gitee * [clippy](https://github.com/Eugeny/tabby-clippy) - 一个可以一直烦你的示例插件 * [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 允许根据给定的配置创建自定义工作区配置文件 * [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - 从 Tabby 标签页带有选中的文本来打开系统默认浏览器 * [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - 为ssh连接打开类似SecureCRT的sftp标签页 * [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - 应用内网页认证弹出窗口(主要为warpgate浏览器认证而建) * [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - 为 Tabby 提供强大的模型上下文协议服务器集成,可通过 Cursor 和 Windsurf 等 MCP 客户端无缝连接 AI 助手,利用智能 AI 功能增强您的终端工作流程。 # 主题 * [hype](https://github.com/Eugeny/tabby-theme-hype) - 受 Hyper 启发的主题 * [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - 为 Tabby 打造的 Relaxed 主题 * [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox) * [windows10](https://www.npmjs.com/package/terminus-theme-windows10) * [altair](https://github.com/yxuko/terminus-altair) # Sponsors [![](https://assets-production.packagecloud.io/assets/packagecloud-logo-light-scaled-26ce8e96060fddf74afbd4445e63ba35590d4aaa56edc98495bb390ef3cae0ae.png)](https://packagecloud.io) [**packagecloud**](https://packagecloud.io) 提供了免费的 Debian/RPM 存储库托管 # 贡献 欢迎提交 PR 和插件! 请参阅 [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) 和 [API 文档](https://docs.tabby.sh/) 以获取有关项目布局的信息以及非常简短的插件开发教程。 --- 感谢这些人,他们棒极了!([emoji key](https://allcontributors.org/docs/en/emoji-key)):
Russell Myers
Russell Myers

💻
Austin Warren
Austin Warren

💻
Felicia Hummel
Felicia Hummel

💻
Mike MacCana
Mike MacCana

⚠️ 🎨
Yacine Kanzari
Yacine Kanzari

💻
BBJip
BBJip

💻
Futagirl
Futagirl

🎨
Levin Rickert
Levin Rickert

💻
OJ Kwon
OJ Kwon

💻
domain
domain

🔌 💻
James Brumond
James Brumond

🔌
Daniel Imms
Daniel Imms

💻 🔌 ⚠️
Florian Bachmann
Florian Bachmann

💻
Michael Kühnel
Michael Kühnel

💻 🎨
Tilmann Meyer
Tilmann Meyer

💻
PM Extra
PM Extra

🐛
Jonathan
Jonathan

💻
Hans Koch
Hans Koch

💻
Dak Smyth
Dak Smyth

💻
Wang Zhi
Wang Zhi

💻
jack1142
jack1142

💻
Howie Douglas
Howie Douglas

💻
Chris Kaczor
Chris Kaczor

💻
Johannes Kadak
Johannes Kadak

💻
LeSeulArtichaut
LeSeulArtichaut

💻
Cyril Taylor
Cyril Taylor

💻
nstefanou
nstefanou

💻 🔌
orin220444
orin220444

💻
Gobius Dolhain
Gobius Dolhain

💻
Gwilherm Folliot
Gwilherm Folliot

💻
Dmitry Pronin
Dmitry Pronin

💻
Jonathan Beverley
Jonathan Beverley

💻
Zenghai Liang
Zenghai Liang

💻
Mateusz Tracz
Mateusz Tracz

💻
pinpin
pinpin

💻
Takuro Onoda
Takuro Onoda

💻
frauhottelmann
frauhottelmann

💻
Piotr Patalong
Piotr Patalong

🎨
Clark Wang
Clark Wang

💻
iamchating
iamchating

💻
starxg
starxg

🔌
Alisue
Alisue

🎨
Dominic Yin
Dominic Yin

💻
Brandon Rothweiler
Brandon Rothweiler

🎨
Logic Machine
Logic Machine

📖
cypherbits
cypherbits

📖
Matthew Davidson
Matthew Davidson

💻
Alexander Wiedemann
Alexander Wiedemann

💻
장보연
장보연

📖
zZ
zZ

💻
Aaron Davison
Aaron Davison

💻
Przemyslaw Kozik
Przemyslaw Kozik

🎨
Alfredo Arellano de la Fuente
Alfredo Arellano de la Fuente

💻
MH Kim
MH Kim

💻
Marmota
Marmota

🎨
Ares Andrew
Ares Andrew

📖
George Korsnick
George Korsnick

💵
Artem Smirnov
Artem Smirnov

💵
Tim Kopplow
Tim Kopplow

💵
mrthock
mrthock

💵
Lukas Rottach
Lukas Rottach

💵
boonkerz
boonkerz

💻 🌍
Milo Ivir
Milo Ivir

🌍
JasonCubic
JasonCubic

🎨
MaxWaldorf
MaxWaldorf

🚇
Michael Wizner
Michael Wizner

💻
Martin
Martin

💻
Piersandro Guerrera
Piersandro Guerrera

📖 🌍
0x973
0x973

💻
Allenator
Allenator

📖
Matheus Castello
Matheus Castello

💻
Jai A P
Jai A P

📦
Richard Yu
Richard Yu

💻
artu-ole
artu-ole

💻
Timofey Gribanov
Timofey Gribanov

📖 🌍
Christian Bingman
Christian Bingman

💻
zhipeng
zhipeng

💻
woodmeal
woodmeal

💻
MagicLike
MagicLike

📖
Hisam Fahri
Hisam Fahri

💻
Liangcheng Juves
Liangcheng Juves

💻
Atte Timonen
Atte Timonen

💻
João Pinto
João Pinto

📖
Alan
Alan

💻
Atsushi Morimoto
Atsushi Morimoto

💵
Arles
Arles

💵
six2dez
six2dez

💵
Candice
Candice

💵
Rowen Willabus
Rowen Willabus

💵
HengY1Coding✨
HengY1Coding✨

💵
Francis Gelderloos
Francis Gelderloos

💵
astromasoud
astromasoud

💵
Anders G. Jørgensen
Anders G. Jørgensen

💵
Dave Richardson
Dave Richardson

💵
Thomas Peter Berntsen
Thomas Peter Berntsen

💵
Ikko Ashimine
Ikko Ashimine

📖
giejqf
giejqf

💻
Thomas LACAZE
Thomas LACAZE

💻
Po Chen
Po Chen

💵
Victor Chandra
Victor Chandra

📖
Dan Nissenbaum
Dan Nissenbaum

💵
RogueThorn
RogueThorn

💵
Spenser Black
Spenser Black

💻
Alex
Alex

💵
HengY1Coding✨
HengY1Coding✨

💵
David Carrero
David Carrero

📖
Andrii Zhovtiak
Andrii Zhovtiak

💻
Mason Ma
Mason Ma

💵
Timo
Timo

💵
Evin Watson
Evin Watson

📖
Hendra Juli
Hendra Juli

📖
Wellinton Kricowski
Wellinton Kricowski

💵 📖
Allan
Allan

🎨
Benjamin Brandmeier
Benjamin Brandmeier

💻
patric1025
patric1025

🌍
hermitpopcorn
hermitpopcorn

💻
Joshua Tzucker
Joshua Tzucker

💵
luxifr
luxifr

💵
Anne Summers
Anne Summers

💵
Clem
Clem

💻
Elizabeth Martín Campos
Elizabeth Martín Campos

💻
Tomáš Hruška
Tomáš Hruška

💻
Osman Karaketir
Osman Karaketir

💻
Crypto Gnome
Crypto Gnome

💵
Richard Bukovansky
Richard Bukovansky

💵
catlas
catlas

💵
Thomas Kapocsi
Thomas Kapocsi

📖
Dylan Hackworth
Dylan Hackworth

💵
Sangboak Lee
Sangboak Lee

💻
qyecst
qyecst

💻
Han
Han

💻
wljince007
wljince007

💻
fero
fero

💻
Sibren
Sibren

💻
Nathaniel Walser
Nathaniel Walser

💻
Aaron Huggins
Aaron Huggins

🎨
KDex
KDex

💻
ChangHwan Kim
ChangHwan Kim

💻
Ash Neilson
Ash Neilson

💻
Chen Fansong
Chen Fansong

💻
Mxmilu
Mxmilu

💻
Charles Buffington
Charles Buffington

💻
Yu Qin
Yu Qin

💻
fireblue
fireblue

💻
marko1616
marko1616

💻
SelfHosted
SelfHosted

💵
Hiroaki Ogasawara
Hiroaki Ogasawara

💻
geodic
geodic

💻
P Foundation
P Foundation

💵
et304383
et304383

💻
ajkrj
ajkrj

💻
Leonardo Berbert
Leonardo Berbert

💻
本项目遵循 [all-contributors](https://github.com/all-contributors/all-contributors) 规范。 欢迎任何形式的贡献! ================================================ FILE: app/dev-app-update.yml ================================================ owner: eugeny repo: tabby provider: github updaterCacheDirName: tabby-updater ================================================ FILE: app/index.pug ================================================ doctype html html.tabby head meta(charset='UTF-8') base(href='index.html') script. console.timeStamp('index') window.nodeRequire = require script(src='./preload.js') script(src='./bundle.js', defer) style. body { transition: 0.5s background; } body style#custom-css root app-root .preload-logo div .tabby-logo h1.tabby-title Tabby sup α .progress .bar(style='width: 0%') ================================================ FILE: app/lib/app.ts ================================================ import { app, ipcMain, Menu, Tray, shell, screen, globalShortcut, MenuItemConstructorOptions, WebContents } from 'electron' import promiseIpc from 'electron-promise-ipc' import * as remote from '@electron/remote/main' import { exec } from 'mz/child_process' import * as path from 'path' import * as fs from 'fs' import { Subject, throttleTime } from 'rxjs' import { saveConfig } from './config' import { Window, WindowOptions } from './window' import { pluginManager } from './pluginManager' import { PTYManager } from './pty' /* eslint-disable block-scoped-var */ try { var wnr = require('windows-native-registry') // eslint-disable-line @typescript-eslint/no-var-requires, no-var } catch (_) { } export class Application { private tray?: Tray private ptyManager = new PTYManager() private windows: Window[] = [] private globalHotkey$ = new Subject() private quitRequested = false userPluginsPath: string // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types constructor (private configStore: any) { remote.initialize() this.useBuiltinGraphics() this.ptyManager.init(this) ipcMain.handle('app:save-config', async (event, config) => { await saveConfig(config) this.broadcastExcept('host:config-change', event.sender, config) }) ipcMain.on('app:register-global-hotkey', (_event, specs) => { globalShortcut.unregisterAll() for (const spec of specs) { globalShortcut.register(spec, () => this.globalHotkey$.next()) } }) this.globalHotkey$.pipe(throttleTime(100)).subscribe(() => { this.onGlobalHotkey() }) ;(promiseIpc as any).on('plugin-manager:install', (name, version) => { return pluginManager.install(this.userPluginsPath, name, version) }) ;(promiseIpc as any).on('plugin-manager:uninstall', (name) => { return pluginManager.uninstall(this.userPluginsPath, name) }) ;(promiseIpc as any).on('get-default-mac-shell', async () => { try { return (await exec(`/usr/bin/dscl . -read /Users/${process.env.LOGNAME} UserShell`))[0].toString().split(' ')[1].trim() } catch { return '/bin/bash' } }) if (process.platform === 'linux') { app.commandLine.appendSwitch('no-sandbox') if ((this.configStore.appearance?.opacity || 1) !== 1) { app.commandLine.appendSwitch('enable-transparent-visuals') app.disableHardwareAcceleration() } } if (this.configStore.hacks?.disableGPU) { app.commandLine.appendSwitch('disable-gpu') app.disableHardwareAcceleration() } this.userPluginsPath = path.join( app.getPath('userData'), 'plugins', ) if (!fs.existsSync(this.userPluginsPath)) { fs.mkdirSync(this.userPluginsPath) } app.commandLine.appendSwitch('disable-http-cache') app.commandLine.appendSwitch('max-active-webgl-contexts', '9000') app.commandLine.appendSwitch('lang', 'EN') for (const flag of this.configStore.flags || [['force_discrete_gpu', '0']]) { app.commandLine.appendSwitch(flag[0], flag[1]) } app.on('before-quit', () => { this.quitRequested = true }) app.on('window-all-closed', () => { if (this.quitRequested || process.platform !== 'darwin') { app.quit() } }) } init (): void { screen.on('display-metrics-changed', () => this.broadcast('host:display-metrics-changed')) screen.on('display-added', () => this.broadcast('host:displays-changed')) screen.on('display-removed', () => this.broadcast('host:displays-changed')) } async newWindow (options?: WindowOptions): Promise { const window = new Window(this, this.configStore, options) this.windows.push(window) if (this.windows.length === 1) { window.makeMain() } window.visible$.subscribe(visible => { if (visible) { this.disableTray() } else { this.enableTray() } }) window.closed$.subscribe(() => { this.windows = this.windows.filter(x => x !== window) if (!this.windows.some(x => x.isMainWindow)) { this.windows[0]?.makeMain() this.windows[0]?.present() } }) if (process.platform === 'darwin') { this.setupMenu() } await window.ready return window } onGlobalHotkey (): void { let isPresent = this.windows.some(x => x.isFocused() && x.isVisible()) const isDockedOnTop = this.windows.some(x => x.isDockedOnTop()) if (isDockedOnTop) { // if docked and on top, hide even if not focused right now isPresent = this.windows.some(x => x.isVisible()) } if (isPresent) { for (const window of this.windows) { window.hide() } } else { for (const window of this.windows) { window.present() } } } presentAllWindows (): void { for (const window of this.windows) { window.present() } } broadcast (event: string, ...args: any[]): void { for (const window of this.windows) { window.send(event, ...args) } } broadcastExcept (event: string, except: WebContents, ...args: any[]): void { for (const window of this.windows) { if (window.webContents.id !== except.id) { window.send(event, ...args) } } } async send (event: string, ...args: any[]): Promise { if (!this.hasWindows()) { await this.newWindow() } this.windows.filter(w => !w.isDestroyed())[0].send(event, ...args) } enableTray (): void { if (!!this.tray || process.platform === 'linux' || (this.configStore.hideTray ?? false) === true) { return } if (process.platform === 'darwin') { this.tray = new Tray(`${app.getAppPath()}/assets/tray-darwinTemplate.png`) this.tray.setPressedImage(`${app.getAppPath()}/assets/tray-darwinHighlightTemplate.png`) } else { this.tray = new Tray(`${app.getAppPath()}/assets/tray.png`) } this.tray.on('click', () => setTimeout(() => this.focus())) const contextMenu = Menu.buildFromTemplate([{ label: 'Show', click: () => this.focus(), }]) if (process.platform !== 'darwin') { this.tray.setContextMenu(contextMenu) } this.tray.setToolTip(`Tabby ${app.getVersion()}`) } disableTray (): void { if (process.platform === 'linux') { return } this.tray?.destroy() this.tray = null } hasWindows (): boolean { return !!this.windows.length } focus (): void { for (const window of this.windows) { window.present() } } async handleSecondInstance (argv: string[], cwd: string): Promise { if (!this.windows.length) { await this.newWindow() } this.presentAllWindows() this.windows[this.windows.length - 1].passCliArguments(argv, cwd, true) } private useBuiltinGraphics (): void { if (process.platform === 'win32') { const keyPath = 'SOFTWARE\\Microsoft\\DirectX\\UserGpuPreferences' const valueName = app.getPath('exe') if (!wnr.getRegistryValue(wnr.HK.CU, keyPath, valueName)) { wnr.setRegistryValue(wnr.HK.CU, keyPath, valueName, wnr.REG.SZ, 'GpuPreference=1;') } } } private setupMenu () { const template: MenuItemConstructorOptions[] = [ { label: 'Application', submenu: [ { role: 'about', label: 'About Tabby' }, { type: 'separator' }, { label: 'Preferences', accelerator: 'Cmd+,', click: async () => { if (!this.hasWindows()) { await this.newWindow() } this.windows[0].send('host:preferences-menu') }, }, { type: 'separator' }, { role: 'services', submenu: [] }, { type: 'separator' }, { role: 'hide' }, { role: 'hideOthers' }, { role: 'unhide' }, { type: 'separator' }, { label: 'Quit', accelerator: 'Cmd+Q', click: () => { this.quitRequested = true app.quit() }, }, ], }, { label: 'Edit', submenu: [ { role: 'undo' }, { role: 'redo' }, { type: 'separator' }, { role: 'cut' }, { role: 'copy' }, { role: 'paste' }, { role: 'pasteAndMatchStyle' }, { role: 'delete' }, { role: 'selectAll' }, ], }, { label: 'View', submenu: [ { role: 'toggleDevTools' }, { type: 'separator' }, { role: 'togglefullscreen' }, ], }, { role: 'window', submenu: [ { role: 'minimize' }, { role: 'zoom' }, { type: 'separator' }, { role: 'front' }, ], }, { role: 'help', submenu: [ { label: 'Website', click () { shell.openExternal('https://eugeny.github.io/tabby') }, }, ], }, ] if (process.env.TABBY_DEV) { template[2].submenu['unshift']({ role: 'reload' }) } Menu.setApplicationMenu(Menu.buildFromTemplate(template)) } } ================================================ FILE: app/lib/cli.ts ================================================ import { app } from 'electron' interface YargsOption { type?: 'string' | 'number' | 'boolean' | 'array' alias?: string describe?: string default?: any choices?: string[] } interface CommandConfig { command: string | string[] description: string options?: Record positionals?: Record } interface ParserConfig { usage: string commands: CommandConfig[] options: Record version: string } export function createParserConfig (cwd: string): ParserConfig { return { usage: 'tabby [command] [arguments]', commands: [ { command: 'open [directory]', description: 'open a shell in a directory', options: { directory: { type: 'string', 'default': cwd }, }, }, { command: ['run [command...]', '/k'], description: 'run a command in the terminal', options: { command: { type: 'array' }, }, }, { command: 'profile [profileName]', description: 'open a tab with specified profile', options: { profileName: { type: 'string' }, }, }, { command: 'paste [text]', description: 'paste stdin into the active tab', options: { escape: { alias: 'e', type: 'boolean', describe: 'Perform shell escaping', }, }, positionals: { text: { type: 'string' }, }, }, { command: 'recent [index]', description: 'open a tab with a recent profile', options: { profileNumber: { type: 'number' }, }, }, { command: 'quickConnect ', description: 'open a tab for specified quick connect provider', positionals: { providerId: { describe: 'The name of a quick connect profile provider', type: 'string', }, query: { describe: 'The quick connect query string', type: 'string', }, }, }, ], options: { debug: { alias: 'd', describe: 'Show DevTools on start', type: 'boolean', }, hidden: { describe: 'Start minimized', type: 'boolean', }, }, version: app.getVersion(), } } function applyOptionsToYargs (yargsInstance: any, options: Record, method: 'option' | 'positional') { return Object.entries(options).reduce( (yargs, [key, value]) => yargs[method](key, value), yargsInstance, ) } function createParserFromConfig (config: ParserConfig) { const yargs = require('yargs/yargs') let parser = yargs().usage(config.usage) config.commands.forEach(cmd => { const builder = (yargsInstance: any) => { let instance = yargsInstance if (cmd.options) { instance = applyOptionsToYargs(instance, cmd.options, 'option') } if (cmd.positionals) { instance = applyOptionsToYargs(instance, cmd.positionals, 'positional') } return instance } parser = parser.command(cmd.command, cmd.description, builder) }) parser = applyOptionsToYargs(parser, config.options, 'option') return parser.version(config.version).help('help') } export function parseArgs (argv: string[], cwd: string): any { const args = argv[0].includes('node') ? argv.slice(2) : argv.slice(1) const config = createParserConfig(cwd) const parser = createParserFromConfig(config) return parser.parse(args) } ================================================ FILE: app/lib/config.ts ================================================ import * as fs from 'fs' import * as path from 'path' import * as yaml from 'js-yaml' import { writeFile } from 'atomically' export const configPath = path.join(process.env.TABBY_CONFIG_DIRECTORY!, 'config.yaml') const legacyConfigPath = path.join(process.env.TABBY_CONFIG_DIRECTORY!, '../terminus', 'config.yaml') export function migrateConfig (): void { if (fs.existsSync(legacyConfigPath) && ( !fs.existsSync(configPath) || fs.statSync(configPath).mtime < fs.statSync(legacyConfigPath).mtime )) { fs.writeFileSync(configPath, fs.readFileSync(legacyConfigPath)) } } export function loadConfig (): any { migrateConfig() if (fs.existsSync(configPath)) { return yaml.load(fs.readFileSync(configPath, 'utf8')) } else { return {} } } export async function saveConfig (content: string): Promise { await writeFile(configPath, content, { encoding: 'utf8' }) await writeFile(configPath + '.backup', content, { encoding: 'utf8' }) } ================================================ FILE: app/lib/index.ts ================================================ import { app, ipcMain, Menu, dialog } from 'electron' // set userData Path on portable version import './portable' // set defaults of environment variables import 'dotenv/config' process.env.TABBY_PLUGINS ??= '' process.env.TABBY_CONFIG_DIRECTORY ??= app.getPath('userData') import 'v8-compile-cache' import 'source-map-support/register' import './sentry' import './lru' import { parseArgs } from './cli' import { Application } from './app' import electronDebug from 'electron-debug' import { loadConfig } from './config' const argv = parseArgs(process.argv, process.cwd()) // eslint-disable-next-line @typescript-eslint/init-declarations let configStore: any try { configStore = loadConfig() } catch (err) { dialog.showErrorBox('Could not read config', err.message) app.exit(1) } process.mainModule = module const application = new Application(configStore) // Register tabby:// URL scheme if (process.defaultApp) { if (process.argv.length >= 2) { app.setAsDefaultProtocolClient('tabby', process.execPath, [process.argv[1]]) } } else { app.setAsDefaultProtocolClient('tabby') } ipcMain.on('app:new-window', () => { application.newWindow() }) process.on('uncaughtException' as any, err => { console.log(err) application.broadcast('uncaughtException', err) }) if (argv.d) { electronDebug({ isEnabled: true, showDevTools: true, devToolsMode: 'undocked', }) } app.on('activate', async () => { if (!application.hasWindows()) { application.newWindow() } else { application.focus() } }) // Handle URL scheme on macOS app.on('open-url', async (event, url) => { event.preventDefault() console.log('Received open-url event:', url) if (!application.hasWindows()) { process.argv.push(url) } else { await app.whenReady() application.handleSecondInstance([url], process.cwd()) } }) app.on('second-instance', async (_event, newArgv, cwd) => { application.handleSecondInstance(newArgv, cwd) }) if (!app.requestSingleInstanceLock()) { app.quit() app.exit(0) } app.on('ready', async () => { if (process.platform === 'darwin') { app.dock.setMenu(Menu.buildFromTemplate([ { label: 'New window', click () { this.app.newWindow() }, }, ])) } application.init() const window = await application.newWindow({ hidden: argv.hidden }) await window.ready window.passCliArguments(process.argv, process.cwd(), false) window.focus() }) ================================================ FILE: app/lib/lru.ts ================================================ import LRU from 'lru-cache' import * as fs from 'fs' const lru = new LRU({ max: 256, maxAge: 250 }) const origLstat = fs.realpathSync.bind(fs) // NB: The biggest offender of thrashing realpathSync is the node module system // itself, which we can't get into via any sane means. require('fs').realpathSync = function (p) { let r = lru.get(p) if (r) { return r } r = origLstat(p) lru.set(p, r) return r } ================================================ FILE: app/lib/pluginManager.ts ================================================ import { promisify } from 'util' export class PluginManager { npm: any npmReady?: Promise async ensureLoaded (): Promise { if (!this.npmReady) { this.npmReady = new Promise(resolve => { const npm = require('npm') npm.load(err => { if (err) { console.error(err) return } npm.config.set('global', false) this.npm = npm resolve() }) }) } return this.npmReady } async install (path: string, name: string, version: string): Promise { await this.ensureLoaded() this.npm.prefix = path return promisify(this.npm.commands.install)([`${name}@${version}`]) } async uninstall (path: string, name: string): Promise { await this.ensureLoaded() this.npm.prefix = path return promisify(this.npm.commands.remove)([name]) } } export const pluginManager = new PluginManager() ================================================ FILE: app/lib/portable.ts ================================================ import * as path from 'path' import * as fs from 'fs' import * as electron from 'electron' const appPath = path.dirname(electron.app.getPath('exe')) const portableData = path.join(appPath, 'data') if (fs.existsSync(portableData)) { console.log('reset user data to ' + portableData) electron.app.setPath('userData', portableData) } ================================================ FILE: app/lib/pty.ts ================================================ import * as nodePTY from 'node-pty' import { v4 as uuidv4 } from 'uuid' import { ipcMain } from 'electron' import { Application } from './app' import { UTF8Splitter } from './utfSplitter' import { Subject, debounceTime } from 'rxjs' class PTYDataQueue { private buffers: Buffer[] = [] private delta = 0 private maxChunk = 1024 * 100 private maxDelta = this.maxChunk * 5 private flowPaused = false private decoder = new UTF8Splitter() private output$ = new Subject() constructor (private pty: nodePTY.IPty, private onData: (data: Buffer) => void) { this.output$.pipe(debounceTime(500)).subscribe(() => { const remainder = this.decoder.flush() if (remainder.length) { this.onData(remainder) } }) } push (data: Buffer) { this.buffers.push(data) this.maybeEmit() } ack (length: number) { this.delta -= length this.maybeEmit() } private maybeEmit () { if (this.delta <= this.maxDelta && this.flowPaused) { this.resume() return } if (this.buffers.length > 0) { if (this.delta > this.maxDelta && !this.flowPaused) { this.pause() return } const buffersToSend = [] let totalLength = 0 while (totalLength < this.maxChunk && this.buffers.length) { totalLength += this.buffers[0].length buffersToSend.push(this.buffers.shift()) } if (buffersToSend.length === 0) { return } let toSend = Buffer.concat(buffersToSend) if (toSend.length > this.maxChunk) { this.buffers.unshift(toSend.slice(this.maxChunk)) toSend = toSend.slice(0, this.maxChunk) } this.emitData(toSend) this.delta += toSend.length if (this.buffers.length) { setImmediate(() => this.maybeEmit()) } } } private emitData (data: Buffer) { const validChunk = this.decoder.write(data) this.onData(validChunk) this.output$.next(validChunk) } private pause () { this.pty.pause() this.flowPaused = true } private resume () { this.pty.resume() this.flowPaused = false this.maybeEmit() } } export class PTY { private pty: nodePTY.IPty private outputQueue: PTYDataQueue exited = false constructor (private id: string, private app: Application, ...args: any[]) { this.pty = (nodePTY as any).spawn(...args) for (const key of ['close', 'exit']) { (this.pty as any).on(key, (...eventArgs) => this.emit(key, ...eventArgs)) } this.outputQueue = new PTYDataQueue(this.pty, data => { setImmediate(() => this.emit('data', data)) }) this.pty.onData(data => this.outputQueue.push(Buffer.from(data))) this.pty.onExit(() => { this.exited = true }) } getPID (): number { return this.pty.pid } resize (columns: number, rows: number): void { if ((this.pty as any)._writable) { this.pty.resize(columns, rows) } } write (buffer: Buffer): void { if ((this.pty as any)._writable) { this.pty.write(buffer as any) } } ackData (length: number): void { this.outputQueue.ack(length) } kill (signal?: string): void { this.pty.kill(signal) } private emit (event: string, ...args: any[]) { this.app.broadcast(`pty:${this.id}:${event}`, ...args) } } export class PTYManager { private ptys: Record = {} init (app: Application): void { ipcMain.on('pty:spawn', (event, ...options) => { const id = uuidv4().toString() event.returnValue = id this.ptys[id] = new PTY(id, app, ...options) }) ipcMain.on('pty:exists', (event, id) => { event.returnValue = this.ptys[id] && !this.ptys[id].exited }) ipcMain.on('pty:get-pid', (event, id) => { event.returnValue = this.ptys[id]?.getPID() }) ipcMain.on('pty:resize', (_event, id, columns, rows) => { this.ptys[id]?.resize(columns, rows) }) ipcMain.on('pty:write', (_event, id, data) => { this.ptys[id]?.write(Buffer.from(data)) }) ipcMain.on('pty:kill', (_event, id, signal) => { this.ptys[id]?.kill(signal) }) ipcMain.on('pty:ack-data', (_event, id, length) => { this.ptys[id]?.ackData(length) }) } } ================================================ FILE: app/lib/sentry.ts ================================================ const { init } = String(process.type) === 'main' ? require('@sentry/electron/dist/main') : require('@sentry/electron/dist/renderer') const SENTRY_DSN = 'https://4717a0a7ee0b4429bd3a0f06c3d7eec3@sentry.io/181876' let release = null try { release = require('electron').app.getVersion() } catch { release = require('@electron/remote').app.getVersion() } if (!process.env.TABBY_DEV) { init({ dsn: SENTRY_DSN, release, integrations (integrations) { return integrations.filter(integration => integration.name !== 'Breadcrumbs') }, }) } ================================================ FILE: app/lib/urlHandler.ts ================================================ import { createParserConfig } from './cli' import { parse as parseShellCommand } from 'shell-quote' export function isTabbyURL (arg: string): boolean { return arg.toLowerCase().startsWith('tabby://') } export function parseTabbyURL (url: string, cwd: string = process.cwd()): any { try { if (!isTabbyURL(url)) { return null } // NOTE: the url host may be lowercased (xdg-open), need to use the original command const urlInstance = new URL(url) const command = urlInstance.host || urlInstance.pathname.replace(/^\/+/, '') const config = createParserConfig(cwd) const commandConfig = config.commands.find(cmd => { const primaryCommand = Array.isArray(cmd.command) ? cmd.command[0] : cmd.command return command.toLowerCase() === primaryCommand.split(/\s+/)[0].toLowerCase() }) if (!commandConfig) { console.error(`Unknown command in tabby:// URL: ${command}`) return null } const primaryCommand = Array.isArray(commandConfig.command) ? commandConfig.command[0] : commandConfig.command const actualCommand = primaryCommand.split(/\s+/)[0] const argv: any = { _: [actualCommand], } for (const [key, value] of urlInstance.searchParams.entries()) { let parsedValue: any = value const optionConfig = commandConfig.options?.[key] ?? commandConfig.positionals?.[key] if (optionConfig) { switch (optionConfig.type) { case 'boolean': parsedValue = value === 'true' || value === '' break case 'number': parsedValue = parseInt(value, 10) break case 'array': parsedValue = parseShellCommand(value).filter(item => typeof item === 'string') break case 'string': default: parsedValue = value break } } else { parsedValue = value } argv[key] = parsedValue } console.log(`URL Handler - Safely parsed [${url}] to:`, JSON.stringify(argv)) return argv } catch (e) { console.error('Failed to parse tabby:// URL:', e) return null } } ================================================ FILE: app/lib/utfSplitter.ts ================================================ const partials = [ [0b110, 5, 0], [0b1110, 4, 1], [0b11110, 3, 2], ] export class UTF8Splitter { private internal = Buffer.alloc(0) write (data: Buffer): Buffer { this.internal = Buffer.concat([this.internal, data]) let keep = 0 for (const [pattern, shift, maxOffset] of partials) { for (let offset = 0; offset < maxOffset + 1; offset++) { if (this.internal[this.internal.length - offset - 1] >> shift === pattern) { keep = Math.max(keep, offset + 1) } } } const result = this.internal.slice(0, this.internal.length - keep) this.internal = this.internal.slice(this.internal.length - keep) return result } flush (): Buffer { const result = this.internal this.internal = Buffer.alloc(0) return result } } ================================================ FILE: app/lib/window.ts ================================================ import * as glasstron from 'glasstron' import { autoUpdater } from 'electron-updater' import { Subject, Observable, debounceTime } from 'rxjs' import { BrowserWindow, app, ipcMain, Rectangle, Menu, screen, BrowserWindowConstructorOptions, TouchBar, nativeImage, WebContents, nativeTheme } from 'electron' import ElectronConfig = require('electron-config') import { enable as enableRemote } from '@electron/remote/main' import * as os from 'os' import * as path from 'path' import macOSRelease from 'macos-release' import { compare as compareVersions } from 'compare-versions' import type { Application } from './app' import { parseArgs } from './cli' import { parseTabbyURL, isTabbyURL } from './urlHandler' let DwmEnableBlurBehindWindow: any = null if (process.platform === 'win32') { DwmEnableBlurBehindWindow = require('@tabby-gang/windows-blurbehind').DwmEnableBlurBehindWindow } export interface WindowOptions { hidden?: boolean } abstract class GlasstronWindow extends BrowserWindow { blurType: string abstract setBlur (_: boolean) } const macOSVibrancyType: any = process.platform === 'darwin' ? compareVersions(macOSRelease().version || '0.0', '10.14', '>=') ? 'fullscreen-ui' : 'dark' : null const activityIcon = nativeImage.createFromPath(`${app.getAppPath()}/assets/activity.png`) export class Window { ready: Promise isMainWindow = false webContents: WebContents private visible = new Subject() private closed = new Subject() private window?: GlasstronWindow private windowConfig: ElectronConfig private windowBounds?: Rectangle private closing = false private lastVibrancy: { enabled: boolean, type?: string } | null = null private disableVibrancyWhileDragging = false private touchBarControl: any private isFluentVibrancy = false private dockHidden = false get visible$ (): Observable { return this.visible } get closed$ (): Observable { return this.closed } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types constructor (private application: Application, private configStore: any, options?: WindowOptions) { options = options ?? {} this.windowConfig = new ElectronConfig({ name: 'window' }) this.windowBounds = this.windowConfig.get('windowBoundaries') const maximized = this.windowConfig.get('maximized') const bwOptions: BrowserWindowConstructorOptions = { width: 800, height: 600, title: 'Tabby', minWidth: 400, minHeight: 300, webPreferences: { nodeIntegration: true, preload: path.join(__dirname, 'sentry.js'), backgroundThrottling: false, contextIsolation: false, }, maximizable: true, frame: false, show: false, backgroundColor: '#00000000', acceptFirstMouse: true, } if (this.windowBounds) { Object.assign(bwOptions, this.windowBounds) const closestDisplay = screen.getDisplayNearestPoint( { x: this.windowBounds.x, y: this.windowBounds.y } ) const [left1, top1, right1, bottom1] = [this.windowBounds.x, this.windowBounds.y, this.windowBounds.x + this.windowBounds.width, this.windowBounds.y + this.windowBounds.height] const [left2, top2, right2, bottom2] = [closestDisplay.bounds.x, closestDisplay.bounds.y, closestDisplay.bounds.x + closestDisplay.bounds.width, closestDisplay.bounds.y + closestDisplay.bounds.height] if ((left2 > right1 || right2 < left1 || top2 > bottom1 || bottom2 < top1) && !maximized) { bwOptions.x = closestDisplay.bounds.width / 2 - bwOptions.width / 2 bwOptions.y = closestDisplay.bounds.height / 2 - bwOptions.height / 2 } } if (this.configStore.appearance?.frame === 'native') { bwOptions.frame = true } else { bwOptions.titleBarStyle = 'hidden' if (process.platform === 'win32') { bwOptions.titleBarOverlay = { color: '#00000000', } } } if (process.platform === 'darwin') { bwOptions.visualEffectState = 'active' } if (process.platform === 'darwin') { this.window = new BrowserWindow(bwOptions) as GlasstronWindow } else { this.window = new glasstron.BrowserWindow(bwOptions) } this.webContents = this.window.webContents this.window.webContents.once('did-finish-load', () => { if (process.platform === 'darwin') { this.window.setVibrancy(macOSVibrancyType) } else if (process.platform === 'win32' && this.configStore.appearance?.vibrancy) { this.setVibrancy(true) } this.setDarkMode(this.configStore.appearance?.colorSchemeMode ?? 'dark') if (!options.hidden) { if (maximized) { this.window.maximize() } else { this.window.show() } this.window.focus() this.window.moveTop() application.focus() } }) this.window.on('blur', () => { if ( (this.configStore.appearance?.dock ?? 'off') !== 'off' && this.configStore.appearance?.dockHideOnBlur && !BrowserWindow.getFocusedWindow() ) { this.hide() } }) enableRemote(this.window.webContents) this.window.loadFile(path.join(app.getAppPath(), 'dist', 'index.html')) this.window.webContents.setVisualZoomLevelLimits(1, 1) this.window.webContents.setZoomFactor(1) this.window.webContents.session.setPermissionCheckHandler(() => true) this.window.webContents.session.setDevicePermissionHandler(() => true) if (process.platform === 'darwin') { this.touchBarControl = new TouchBar.TouchBarSegmentedControl({ segments: [], change: index => this.send('touchbar-selection', index), }) this.window.setTouchBar(new TouchBar({ items: [this.touchBarControl], })) } else { this.window.setMenu(null) } this.setupWindowManagement() this.setupUpdater() this.ready = new Promise(resolve => { const listener = event => { if (event.sender === this.window.webContents) { ipcMain.removeListener('app:ready', listener as any) resolve() } } ipcMain.on('app:ready', listener) }) } makeMain (): void { this.isMainWindow = true this.window.webContents.send('host:became-main-window') } setVibrancy (enabled: boolean, type?: string, userRequested?: boolean): void { if (userRequested ?? true) { this.lastVibrancy = { enabled, type } } if (process.platform === 'win32') { if (parseFloat(os.release()) >= 10) { this.window.blurType = enabled ? type === 'fluent' ? 'acrylic' : 'blurbehind' : null try { this.window.setBlur(enabled) this.isFluentVibrancy = enabled && type === 'fluent' } catch (error) { console.error('Failed to set window blur', error) } } else { DwmEnableBlurBehindWindow(this.window.getNativeWindowHandle(), enabled) } } else if (process.platform === 'linux') { this.window.setBackgroundColor(enabled ? '#00000000' : '#131d27') this.window.setBlur(enabled) } else { this.window.setVibrancy(enabled ? macOSVibrancyType : null) } } setDarkMode (mode: string): void { if (process.platform === 'darwin') { if ('light' === mode ) { nativeTheme.themeSource = 'light' } else if ('auto' === mode) { nativeTheme.themeSource = 'system' } else { nativeTheme.themeSource = 'dark' } } } focus (): void { this.window.focus() } send (event: string, ...args: any[]): void { if (!this.window) { return } this.window.webContents.send(event, ...args) if (event === 'host:config-change') { this.configStore = args[0] this.enableDockedWindowStyles(this.isDockedOnTop()) } } isDestroyed (): boolean { return !this.window || this.window.isDestroyed() } isFocused (): boolean { return this.window.isFocused() } isVisible (): boolean { return this.window.isVisible() } isDockedOnTop (): boolean { return this.isMainWindow && this.configStore.appearance?.dock && this.configStore.appearance?.dock !== 'off' && (this.configStore.appearance?.dockAlwaysOnTop ?? true) } async hide (): Promise { if (process.platform === 'darwin') { // Lose focus Menu.sendActionToFirstResponder('hide:') // Don't disable docked window styles when hiding - keep dock hidden if feature is enabled if (this.isDockedOnTop()) { // Temporarily disable always-on-top and other properties while hidden if (this.window.isAlwaysOnTop()) { this.window.setAlwaysOnTop(false) } } } this.window.blur() this.window.hide() } async show (): Promise { await this.enableDockedWindowStyles(this.isDockedOnTop()) this.window.show() this.window.focus() } async present (): Promise { await this.show() this.window.moveTop() } passCliArguments (argv: string[], cwd: string, secondInstance: boolean): void { const urlArg = argv.find(arg => isTabbyURL(arg)) if (urlArg) { this.send('cli', parseTabbyURL(urlArg, cwd), cwd, secondInstance) } else { this.send('cli', parseArgs(argv, cwd), cwd, secondInstance) } } private async enableDockedWindowStyles (enabled: boolean) { if (process.platform === 'darwin') { if (enabled) { if (!this.dockHidden) { app.dock.hide() this.dockHidden = true } this.window.setAlwaysOnTop(true, 'screen-saver', 1) if (!this.window.isVisibleOnAllWorkspaces()) { this.window.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true }) } if (this.window.fullScreenable) { this.window.setFullScreenable(false) } } else { if (this.dockHidden) { await app.dock.show() this.dockHidden = false } if (this.window.isAlwaysOnTop()) { this.window.setAlwaysOnTop(false) } if (this.window.isVisibleOnAllWorkspaces()) { this.window.setVisibleOnAllWorkspaces(false) } if (!this.window.fullScreenable) { this.window.setFullScreenable(true) } } } } private setupWindowManagement () { this.window.on('show', () => { this.visible.next(true) this.send('host:window-shown') }) this.window.on('hide', () => { this.visible.next(false) }) const moveSubscription = new Observable(observer => { this.window.on('move', () => observer.next()) }).pipe(debounceTime(250)).subscribe(() => { this.send('host:window-moved') }) this.window.on('closed', () => { moveSubscription.unsubscribe() }) this.window.on('enter-full-screen', () => this.send('host:window-enter-full-screen')) this.window.on('leave-full-screen', () => this.send('host:window-leave-full-screen')) this.window.on('maximize', () => this.send('host:window-maximized')) this.window.on('unmaximize', () => this.send('host:window-unmaximized')) this.window.on('close', event => { if (!this.closing) { event.preventDefault() this.send('host:window-close-request') return } this.windowConfig.set('windowBoundaries', this.windowBounds) this.windowConfig.set('maximized', this.window.isMaximized()) }) this.window.on('closed', () => { this.destroy() }) this.window.on('resize', () => { if (!this.window.isMaximized()) { this.windowBounds = this.window.getBounds() } }) this.window.on('move', () => { if (!this.window.isMaximized()) { this.windowBounds = this.window.getBounds() } }) this.window.on('focus', () => { this.send('host:window-focused') }) this.on('ready', () => { this.window?.webContents.send('start', { config: this.configStore, executable: app.getPath('exe'), windowID: this.window.id, isMainWindow: this.isMainWindow, userPluginsPath: this.application.userPluginsPath, }) }) this.on('window-minimize', () => { this.window?.minimize() }) this.on('window-set-bounds', (_, bounds) => { this.window?.setBounds(bounds) }) this.on('window-set-always-on-top', (_, flag) => { this.window?.setAlwaysOnTop(flag) }) this.on('window-set-vibrancy', (_, enabled, type) => { this.setVibrancy(enabled, type) }) this.on('window-set-dark-mode', (_, mode) => { this.setDarkMode(mode) }) this.on('window-set-window-controls-color', (_, theme) => { if (process.platform === 'win32') { const symbolColor: string = theme.foreground this.window?.setTitleBarOverlay( { symbolColor: symbolColor, height: 32, }, ) } }) this.on('window-set-title', (_, title) => { this.window?.setTitle(title) }) this.on('window-bring-to-front', () => { if (this.window?.isMinimized()) { this.window.restore() } this.present() }) this.on('window-close', () => { this.closing = true this.window.close() }) this.on('window-set-touch-bar', (_, segments, selectedIndex) => { this.touchBarControl.segments = segments.map(s => ({ label: s.label, icon: s.hasActivity ? activityIcon : undefined, })) this.touchBarControl.selectedIndex = selectedIndex }) this.window.webContents.setWindowOpenHandler(() => { return { action: 'deny' } }) ipcMain.on('window-set-disable-vibrancy-while-dragging', (_event, value) => { this.disableVibrancyWhileDragging = value && this.configStore.hacks?.disableVibrancyWhileDragging }) let moveEndedTimeout: any = null const onBoundsChange = () => { if (!this.lastVibrancy?.enabled || !this.disableVibrancyWhileDragging || !this.isFluentVibrancy) { return } this.setVibrancy(false, undefined, false) if (moveEndedTimeout) { clearTimeout(moveEndedTimeout) } moveEndedTimeout = setTimeout(() => { this.setVibrancy(this.lastVibrancy.enabled, this.lastVibrancy.type) }, 50) } this.window.on('move', onBoundsChange) this.window.on('resize', onBoundsChange) ipcMain.on('window-set-traffic-light-position', (_event, x, y) => { this.window.setWindowButtonPosition({ x, y }) }) ipcMain.on('window-set-opacity', (_event, opacity) => { this.window.setOpacity(opacity) }) this.on('window-set-progress-bar', (_, value) => { this.window?.setProgressBar(value, { mode: value < 0 ? 'none' : 'normal' }) }) } on (event: string, listener: (...args: any[]) => void): void { ipcMain.on(event, (e, ...args) => { if (!this.window || e.sender !== this.window.webContents) { return } listener(e, ...args) }) } private setupUpdater () { autoUpdater.autoDownload = true autoUpdater.autoInstallOnAppQuit = true autoUpdater.on('update-available', () => { this.send('updater:update-available') }) autoUpdater.on('update-not-available', () => { this.send('updater:update-not-available') }) autoUpdater.on('error', err => { this.send('updater:error', err) }) autoUpdater.on('update-downloaded', () => { this.send('updater:update-downloaded') }) this.on('updater:check-for-updates', () => { autoUpdater.checkForUpdates() }) this.on('updater:quit-and-install', () => { autoUpdater.quitAndInstall() }) } private destroy () { this.window = null this.closed.next() this.visible.complete() this.closed.complete() } } ================================================ FILE: app/package.json ================================================ { "name": "tabby", "description": "A terminal for a modern age", "private": true, "repository": "https://github.com/Eugeny/tabby", "author": { "name": "Tabby Developers", "email": "e@ajenti.org" }, "main": "dist/main.js", "version": "1.0.0-alpha.1", "scripts": { "postinstall": "patch-package", "build": "webpack --progress --color --display-modules", "watch": "webpack --progress --color --watch" }, "dependencies": { "@electron/remote": "^2", "atomically": "^2.0.2", "any-promise": "^1.3.0", "dunder-proto": "^1", "electron-config": "2.0.0", "electron-debug": "^3.2.0", "electron-promise-ipc": "^2.2.4", "electron-updater": "^5.2.1", "fontmanager-redux": "1.1.0", "glasstron": "0.1.1", "js-yaml": "4.1.0", "keytar": "^7.9.0", "mz": "^2.7.0", "native-process-working-directory": "^1.0.2", "node-pty": "^1.2.0-beta.8", "npm": "6", "russh": "0.1.35", "rxjs": "^7.5.7", "source-map-support": "^0.5.20", "v8-compile-cache": "^2.3.0", "yargs": "^17.7.2" }, "optionalDependencies": { "@tabby-gang/windows-blurbehind": "^3.1.0", "@tabby-gang/windows-process-tree": "^0.6.1", "macos-native-processlist": "^2.1.0", "patch-package": "^8", "serialport": "11.0.1", "serialport-binding-webserialapi": "^1.0.3", "windows-native-registry": "^3.2.1" }, "devDependencies": { "@ngx-translate/core": "^14.0.0", "@types/mz": "2.7.4", "@types/node": "20.3.1" }, "peerDependencies": { "tabby-community-color-schemes": "*", "tabby-core": "*", "tabby-electron": "*", "tabby-local": "*", "tabby-plugin-manager": "*", "tabby-serial": "*", "tabby-settings": "*", "tabby-ssh": "*", "tabby-terminal": "*" }, "resolutions": { "node-abi": "4.9.0", "node-gyp": "^10.0.0", "nan": "2.22.2", "node-addon-api": "^8.3.0" } } ================================================ FILE: app/patches/@serialport+bindings-cpp+11.0.3.patch ================================================ diff --git a/node_modules/@serialport/bindings-cpp/src/serialport_win.cpp b/node_modules/@serialport/bindings-cpp/src/serialport_win.cpp index b11c07f..910023e 100644 --- a/node_modules/@serialport/bindings-cpp/src/serialport_win.cpp +++ b/node_modules/@serialport/bindings-cpp/src/serialport_win.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #pragma comment(lib, "setupapi.lib") #define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0])) @@ -25,6 +26,29 @@ typedef BOOL (WINAPI *CancelIoExType)(HANDLE hFile, LPOVERLAPPED lpOverlapped); std::list g_closingHandles; +void ErrorCodeToString(const wchar_t* prefix, int errorCode, wchar_t *errorStr) { + switch (errorCode) { + case ERROR_FILE_NOT_FOUND: + _snwprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, L"%ls: File not found", prefix); + break; + case ERROR_INVALID_HANDLE: + _snwprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, L"%ls: Invalid handle", prefix); + break; + case ERROR_ACCESS_DENIED: + _snwprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, L"%ls: Access denied", prefix); + break; + case ERROR_OPERATION_ABORTED: + _snwprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, L"%ls: Operation aborted", prefix); + break; + case ERROR_INVALID_PARAMETER: + _snwprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, L"%ls: The parameter is incorrect %d", prefix, errorCode); + break; + default: + _snwprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, L"%ls: Unknown error code %d", prefix, errorCode); + break; + } +} + void ErrorCodeToString(const char* prefix, int errorCode, char *errorStr) { switch (errorCode) { case ERROR_FILE_NOT_FOUND: @@ -608,9 +632,9 @@ void CloseBaton::Execute() { } } -char *copySubstring(char *someString, int n) { - char *new_ = reinterpret_cast(malloc(sizeof(char)*n + 1)); - strncpy_s(new_, n + 1, someString, n); +wchar_t *copySubstring(wchar_t *someString, int n) { + wchar_t *new_ = reinterpret_cast(malloc(sizeof(wchar_t)*n + 1)); + wcsncpy_s(new_, n + 1, someString, n); new_[n] = '\0'; return new_; } @@ -625,7 +649,7 @@ Napi::Value List(const Napi::CallbackInfo& info) { Napi::Function callback = info[0].As(); ListBaton* baton = new ListBaton(callback); - snprintf(baton->errorString, sizeof(baton->errorString), ""); + _snwprintf(baton->errorString, sizeof(baton->errorString), L""); baton->Queue(); return env.Undefined(); @@ -633,20 +657,20 @@ Napi::Value List(const Napi::CallbackInfo& info) { // It's possible that the s/n is a construct and not the s/n of the parent USB // composite device. This performs some convoluted registry lookups to fetch the USB s/n. -void getSerialNumber(const char *vid, - const char *pid, +void getSerialNumber(const wchar_t *vid, + const wchar_t *pid, const HDEVINFO hDevInfo, SP_DEVINFO_DATA deviceInfoData, const unsigned int maxSerialNumberLength, - char* serialNumber) { - _snprintf_s(serialNumber, maxSerialNumberLength, _TRUNCATE, ""); + wchar_t* serialNumber) { + _snwprintf_s(serialNumber, maxSerialNumberLength, _TRUNCATE, L""); if (vid == NULL || pid == NULL) { return; } DWORD dwSize; WCHAR szWUuidBuffer[MAX_BUFFER_SIZE]; - WCHAR containerUuid[MAX_BUFFER_SIZE]; + WCHAR wantedUuid[MAX_BUFFER_SIZE]; // Fetch the "Container ID" for this device node. In USB context, this "Container @@ -683,7 +707,7 @@ void getSerialNumber(const char *vid, // Given the UUID bytes, build up a (widechar) string from it. There's some mangling // going on. - StringFromGUID2((REFGUID)szWUuidBuffer, containerUuid, ARRAY_SIZE(containerUuid)); + StringFromGUID2((REFGUID)szWUuidBuffer, wantedUuid, ARRAY_SIZE(wantedUuid)); } else { // Container UUID could not be fetched, return empty serial number. return; @@ -693,21 +717,15 @@ void getSerialNumber(const char *vid, // This means they're non-removable, and are not handled (yet). // Maybe they should inherit the s/n from somewhere else. - // Sanitize input - for whatever reason, StringFromGUID2() returns a WCHAR* but - // the comparisons later need a plain old char*, in lowercase ASCII. - char wantedUuid[MAX_BUFFER_SIZE]; - _snprintf_s(wantedUuid, MAX_BUFFER_SIZE, _TRUNCATE, "%ws", containerUuid); - strlwr(wantedUuid); - // Iterate through all the USB devices with the given VendorID/ProductID HKEY vendorProductHKey; DWORD retCode; - char hkeyPath[MAX_BUFFER_SIZE]; + wchar_t hkeyPath[MAX_BUFFER_SIZE]; - _snprintf_s(hkeyPath, MAX_BUFFER_SIZE, _TRUNCATE, "SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_%s&PID_%s", vid, pid); + _snwprintf_s(hkeyPath, MAX_BUFFER_SIZE, _TRUNCATE, L"SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_%s&PID_%s", vid, pid); - retCode = RegOpenKeyEx( + retCode = RegOpenKeyExW( HKEY_LOCAL_MACHINE, hkeyPath, 0, @@ -739,9 +757,9 @@ void getSerialNumber(const char *vid, // Each of the subkeys here is the serial number of a USB device with the // given VendorId/ProductId. Now fetch the string for the S/N. DWORD serialNumberLength = maxSerialNumberLength; - retCode = RegEnumKeyEx(vendorProductHKey, + retCode = RegEnumKeyExW(vendorProductHKey, i, - serialNumber, + reinterpret_cast(serialNumber), &serialNumberLength, NULL, NULL, @@ -751,21 +769,21 @@ void getSerialNumber(const char *vid, if (retCode == ERROR_SUCCESS) { // Lookup info for VID_(vendorId)&PID_(productId)\(serialnumber) - _snprintf_s(hkeyPath, MAX_BUFFER_SIZE, _TRUNCATE, - "SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_%s&PID_%s\\%s", + _snwprintf_s(hkeyPath, MAX_BUFFER_SIZE, _TRUNCATE, + L"SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_%ls&PID_%ls\\%ls", vid, pid, serialNumber); HKEY deviceHKey; - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, hkeyPath, 0, KEY_READ, &deviceHKey) == ERROR_SUCCESS) { - char readUuid[MAX_BUFFER_SIZE]; + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, hkeyPath, 0, KEY_READ, &deviceHKey) == ERROR_SUCCESS) { + wchar_t readUuid[MAX_BUFFER_SIZE]; DWORD readSize = sizeof(readUuid); // Query VID_(vendorId)&PID_(productId)\(serialnumber)\ContainerID - retCode = RegQueryValueEx(deviceHKey, "ContainerID", NULL, NULL, (LPBYTE)&readUuid, &readSize); + retCode = RegQueryValueExW(deviceHKey, L"ContainerID", NULL, NULL, (LPBYTE)&readUuid, &readSize); if (retCode == ERROR_SUCCESS) { readUuid[readSize] = '\0'; - if (strcmp(wantedUuid, readUuid) == 0) { + if (wcscmp(wantedUuid, readUuid) == 0) { // The ContainerID UUIDs match, return now that serialNumber has // the right value. RegCloseKey(deviceHKey); @@ -783,7 +801,7 @@ void getSerialNumber(const char *vid, RegCloseKey(vendorProductHKey); } - _snprintf_s(serialNumber, maxSerialNumberLength, _TRUNCATE, ""); + _snwprintf_s(serialNumber, maxSerialNumberLength, _TRUNCATE, L""); return; } @@ -795,15 +813,15 @@ void ListBaton::Execute() { int memberIndex = 0; DWORD dwSize, dwPropertyRegDataType; - char szBuffer[MAX_BUFFER_SIZE]; - char *pnpId; - char *vendorId; - char *productId; - char *name; - char *manufacturer; - char *locationId; - char *friendlyName; - char serialNumber[MAX_REGISTRY_KEY_SIZE]; + wchar_t szBuffer[MAX_BUFFER_SIZE]; + wchar_t *pnpId; + wchar_t *vendorId; + wchar_t *productId; + wchar_t *name; + wchar_t *manufacturer; + wchar_t *locationId; + wchar_t *friendlyName; + wchar_t serialNumber[MAX_REGISTRY_KEY_SIZE]; bool isCom; while (true) { isCom = false; @@ -814,7 +832,6 @@ void ListBaton::Execute() { manufacturer = NULL; locationId = NULL; friendlyName = NULL; - isCom = false; ZeroMemory(&deviceInfoData, sizeof(SP_DEVINFO_DATA)); deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); @@ -826,16 +843,16 @@ void ListBaton::Execute() { } dwSize = sizeof(szBuffer); - SetupDiGetDeviceInstanceId(hDevInfo, &deviceInfoData, szBuffer, dwSize, &dwSize); + SetupDiGetDeviceInstanceIdW(hDevInfo, &deviceInfoData, reinterpret_cast(szBuffer), dwSize, &dwSize); szBuffer[dwSize] = '\0'; - pnpId = strdup(szBuffer); + pnpId = wcsdup(szBuffer); - vendorId = strstr(szBuffer, "VID_"); + vendorId = wcsstr(szBuffer, L"VID_"); if (vendorId) { vendorId += 4; vendorId = copySubstring(vendorId, 4); } - productId = strstr(szBuffer, "PID_"); + productId = wcsstr(szBuffer, L"PID_"); if (productId) { productId += 4; productId = copySubstring(productId, 4); @@ -843,32 +860,29 @@ void ListBaton::Execute() { getSerialNumber(vendorId, productId, hDevInfo, deviceInfoData, MAX_REGISTRY_KEY_SIZE, serialNumber); - if (SetupDiGetDeviceRegistryProperty(hDevInfo, &deviceInfoData, + if (SetupDiGetDeviceRegistryPropertyW(hDevInfo, &deviceInfoData, SPDRP_LOCATION_INFORMATION, &dwPropertyRegDataType, - reinterpret_cast(szBuffer), - sizeof(szBuffer), &dwSize)) { - locationId = strdup(szBuffer); + reinterpret_cast(szBuffer), sizeof(szBuffer), &dwSize)) { + locationId = wcsdup(szBuffer); } - if (SetupDiGetDeviceRegistryProperty(hDevInfo, &deviceInfoData, + if (SetupDiGetDeviceRegistryPropertyW(hDevInfo, &deviceInfoData, SPDRP_FRIENDLYNAME, &dwPropertyRegDataType, - reinterpret_cast(szBuffer), - sizeof(szBuffer), &dwSize)) { - friendlyName = strdup(szBuffer); + reinterpret_cast(szBuffer), sizeof(szBuffer), &dwSize)) { + friendlyName = wcsdup(szBuffer); } - if (SetupDiGetDeviceRegistryProperty(hDevInfo, &deviceInfoData, + if (SetupDiGetDeviceRegistryPropertyW(hDevInfo, &deviceInfoData, SPDRP_MFG, &dwPropertyRegDataType, - reinterpret_cast(szBuffer), - sizeof(szBuffer), &dwSize)) { - manufacturer = strdup(szBuffer); + reinterpret_cast(szBuffer), sizeof(szBuffer), &dwSize)) { + manufacturer = wcsdup(szBuffer); } HKEY hkey = SetupDiOpenDevRegKey(hDevInfo, &deviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); if (hkey != INVALID_HANDLE_VALUE) { dwSize = sizeof(szBuffer); - if (RegQueryValueEx(hkey, "PortName", NULL, NULL, (LPBYTE)&szBuffer, &dwSize) == ERROR_SUCCESS) { + if (RegQueryValueExW(hkey, L"PortName", NULL, NULL, (LPBYTE)&szBuffer, &dwSize) == ERROR_SUCCESS) { + name = wcsdup(szBuffer); szBuffer[dwSize] = '\0'; - name = strdup(szBuffer); - isCom = strstr(szBuffer, "COM") != NULL; + isCom = wcsstr(szBuffer, L"COM") != NULL; } } if (isCom) { @@ -916,6 +930,16 @@ void setIfNotEmpty(Napi::Object item, std::string key, const char *value) { } } +void setIfNotEmpty(Napi::Object item, std::string key, const wchar_t *value) { + Napi::Env env = item.Env(); + Napi::String v8key = Napi::String::New(env, key); + if (wcslen(value) > 0) { + (item).Set(v8key, Napi::String::New(env, (const char16_t*) value)); + } else { + (item).Set(v8key, env.Undefined()); + } +} + void FlushBaton::Execute() { DWORD purge_all = PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR; if (!PurgeComm(int2handle(fd), purge_all)) { diff --git a/node_modules/@serialport/bindings-cpp/src/serialport_win.h b/node_modules/@serialport/bindings-cpp/src/serialport_win.h index f3e3c32..739b5dd 100644 --- a/node_modules/@serialport/bindings-cpp/src/serialport_win.h +++ b/node_modules/@serialport/bindings-cpp/src/serialport_win.h @@ -47,23 +47,24 @@ Napi::Value Read(const Napi::CallbackInfo& info); Napi::Value List(const Napi::CallbackInfo& info); void setIfNotEmpty(Napi::Object item, std::string key, const char *value); +void setIfNotEmpty(Napi::Object item, std::string key, const wchar_t *value); struct ListResultItem { - std::string path; - std::string manufacturer; - std::string serialNumber; - std::string pnpId; - std::string locationId; - std::string friendlyName; - std::string vendorId; - std::string productId; + std::wstring path; + std::wstring manufacturer; + std::wstring serialNumber; + std::wstring pnpId; + std::wstring locationId; + std::wstring friendlyName; + std::wstring vendorId; + std::wstring productId; }; struct ListBaton : public Napi::AsyncWorker { ListBaton(Napi::Function& callback) : Napi::AsyncWorker(callback, "node-serialport:ListBaton"), errorString() {} std::list results; - char errorString[ERROR_STRING_SIZE]; + wchar_t errorString[ERROR_STRING_SIZE]; void Execute() override; void OnOK() override { ================================================ FILE: app/src/app.module.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { ApplicationRef, NgModule } from '@angular/core' import { BrowserModule } from '@angular/platform-browser' import { ToastrModule } from 'ngx-toastr' export function getRootModule (plugins: any[]) { const imports = [ BrowserModule, ...plugins, ToastrModule.forRoot({ positionClass: 'toast-bottom-center', toastClass: 'toast', preventDuplicates: true, extendedTimeOut: 1000, }), ] const bootstrap = [ ...plugins.filter(x => x.bootstrap).map(x => x.bootstrap), ] if (bootstrap.length === 0) { throw new Error('Did not find any bootstrap components. Are there any plugins installed?') } @NgModule({ imports, }) class RootModule { ngDoBootstrap (appRef: ApplicationRef) { (window as any)['requestAnimationFrame'] = window[window['Zone'].__symbol__('requestAnimationFrame')] const componentDef = bootstrap[0] appRef.bootstrap(componentDef) } } return RootModule } ================================================ FILE: app/src/entry.preload.ts ================================================ import 'v8-compile-cache' import '../lib/lru' import 'source-sans-pro/source-sans-pro.css' import 'source-code-pro/source-code-pro.css' import '@fortawesome/fontawesome-free/css/solid.css' import '@fortawesome/fontawesome-free/css/brands.css' import '@fortawesome/fontawesome-free/css/regular.css' import '@fortawesome/fontawesome-free/css/fontawesome.css' import './preload.scss' ================================================ FILE: app/src/entry.ts ================================================ import 'zone.js' import 'core-js/proposals/reflect-metadata' import 'rxjs' import './global.scss' import './toastr.scss' // Importing before @angular/* import { findPlugins, initModuleLookup, loadPlugins } from './plugins' import { enableProdMode, NgModuleRef, ApplicationRef } from '@angular/core' import { enableDebugTools } from '@angular/platform-browser' import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' import { ipcRenderer } from 'electron' import { getRootModule } from './app.module' import { BootstrapData, BOOTSTRAP_DATA, PluginInfo } from '../../tabby-core/src/api/mainProcess' // Always land on the start view location.hash = '' ;(process as any).enablePromiseAPI = true if (process.platform === 'win32' && !('HOME' in process.env)) { process.env.HOME = `${process.env.HOMEDRIVE}${process.env.HOMEPATH}` } if (process.env.TABBY_DEV && !process.env.TABBY_FORCE_ANGULAR_PROD) { console.warn('Running in debug mode') } else { enableProdMode() } async function bootstrap (bootstrapData: BootstrapData, plugins: PluginInfo[], safeMode = false): Promise> { if (safeMode) { plugins = plugins.filter(x => x.isBuiltin) } const pluginModules = await loadPlugins(plugins, (current, total) => { (document.querySelector('.progress .bar') as HTMLElement).style.width = `${100 * current / total}%` // eslint-disable-line }) window['pluginModules'] = pluginModules const module = getRootModule(pluginModules) const moduleRef = await platformBrowserDynamic([ { provide: BOOTSTRAP_DATA, useValue: bootstrapData }, ]).bootstrapModule(module) if (process.env.TABBY_DEV) { const applicationRef = moduleRef.injector.get(ApplicationRef) const componentRef = applicationRef.components[0] enableDebugTools(componentRef) } return moduleRef } ipcRenderer.once('start', async (_$event, bootstrapData: BootstrapData) => { console.log('Window bootstrap data:', bootstrapData) initModuleLookup(bootstrapData.userPluginsPath) let plugins = await findPlugins() bootstrapData.installedPlugins = plugins if (bootstrapData.config.pluginBlacklist) { plugins = plugins.filter(x => !bootstrapData.config.pluginBlacklist.includes(x.name)) } plugins = plugins.filter(x => x.name !== 'web') console.log('Starting with plugins:', plugins) try { await bootstrap(bootstrapData, plugins) } catch (error) { console.error('Angular bootstrapping error:', error) console.warn('Trying safe mode') window['safeModeReason'] = error try { await bootstrap(bootstrapData, plugins, true) } catch (error2) { console.error('Bootstrap failed:', error2) } } }) ipcRenderer.send('ready') ================================================ FILE: app/src/global.scss ================================================ html { --spaciness: 1; } body { min-height: 100vh; overflow: hidden; background: transparent !important; -webkit-font-smoothing: antialiased; } .modal-dialog, .modal-backdrop, .no-drag { -webkit-app-region: no-drag; } .selectable { user-select: text; } a, button { &.btn { display: inline-flex; align-items: center; flex-wrap: nowrap; & > svg { pointer-events: none; // width: 16px; // height: 16px; } } } .form-line { display: flex; align-items: center; padding: 10px 0; margin: 0; min-height: 64px; .header { margin-right: auto; .title { } .description { font-size: 13px; opacity: .5; } } &>.form-control, &>.input-group { width: 33%; } &>.form-check { display: flex; } } input[type=range] { -webkit-appearance: none; background: transparent; outline: none; padding: 0; &:focus { border-color: transparent; } @mixin thumb() { -webkit-appearance: none; display: block; height: 12px; width: 12px; background: #aaa; border-radius: 6px; cursor: pointer; margin-top: -4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.95); transition: 0.25s background; &:hover { background: #777; } &:active { background: #666; } } &::-webkit-slider-thumb { @include thumb(); } &::-moz-range-thumb { @include thumb(); } &::-ms-thumb { @include thumb(); } &::thumb { @include thumb(); } @mixin track() { height: 4px; background: #111; margin: 3px 0 0; box-sizing: border-box; } &::-webkit-slider-runnable-track { @include track(); } &:focus::-webkit-slider-runnable-track { @include track(); } &::-moz-range-track { @include track(); } &::-ms-track { @include track(); } } a[ngbdropdownitem] { cursor: pointer; } ngb-typeahead-window { max-height: 60vh; overflow: auto; } .hover-reveal { opacity: 0; .hover-reveal-parent:hover &, *:hover > &, &:hover, &.show { opacity: 1; } } @keyframes terminalShakeFrames { 0% { transform: translateX(0); } 25% { transform: translateX(5px); } 50% { transform: translateX(-5px); } 75% { transform: translateX(5px); } 100% { transform: translateX(0); } } .dropdown { .dropdown-toggle::after { vertical-align: 0.15em; margin-left: .5em; opacity: .5; } .dropdown-item { i + span { margin-left: 10px; } } } .no-wrap { white-space: nowrap; text-overflow: ellipsis; overflow: hidden; } .list-group-item > button { margin: -7px 0; } .content-box { max-width: 600px; } // Windows high contrast mode @media screen and (forced-colors: active) { .form-switch .form-check-label::before { background: buttonface; } .form-switch .form-check-label::after { background: buttontext; } .form-switch .form-check-input:checked ~ .form-check-label::before { background: activetext; } .form-switch .form-check-input:checked ~ .form-check-label::after { background: canvas; } color-scheme-preview, terminaltab > .content { forced-color-adjust: none; } } ================================================ FILE: app/src/pluginBlacklist.ts ================================================ export const PLUGIN_BLACKLIST = [ 'terminus-shell-selector', // superseded by profiles 'terminus-scrollbar', // now useless 'terminus-clickable-links', // now bundled with Tabby 'tabby-clickable-links', // now bundled with Tabby 'terminus-clickable-ips', // broken, functionality now bundled with Tabby 'terminus-elastic-quick-commands', // broken and abandoned, fork of quick-commands 'terminus-elastic-quick-cmds', // broken and abandoned, fork of quick-commands 'tabby-fig', // abandoned, 'tabby-plugin-fig-integration', // abandoned, ] ================================================ FILE: app/src/plugins.ts ================================================ import * as fs from 'mz/fs' import * as path from 'path' import * as remote from '@electron/remote' import { PluginInfo } from '../../tabby-core/src/api/mainProcess' import { PLUGIN_BLACKLIST } from './pluginBlacklist' const nodeModule = require('module') // eslint-disable-line @typescript-eslint/no-var-requires const nodeRequire = global['require'] function normalizePath (p: string): string { const cygwinPrefix = '/cygdrive/' if (p.startsWith(cygwinPrefix)) { p = p.substring(cygwinPrefix.length).replace('/', '\\') p = p[0] + ':' + p.substring(1) } return p } const builtinPluginsPath = process.env.TABBY_DEV ? path.dirname(remote.app.getAppPath()) : path.join((process as any).resourcesPath, 'builtin-plugins') const cachedBuiltinModules = { '@angular/animations': require('@angular/animations'), '@angular/cdk/drag-drop': require('@angular/cdk/drag-drop'), '@angular/cdk/clipboard': require('@angular/cdk/clipboard'), '@angular/common': require('@angular/common'), '@angular/compiler': require('@angular/compiler'), '@angular/core': require('@angular/core'), '@angular/forms': require('@angular/forms'), '@angular/localize': require('@angular/localize'), '@angular/localize/init': require('@angular/localize/init'), '@angular/platform-browser': require('@angular/platform-browser'), '@angular/platform-browser/animations': require('@angular/platform-browser/animations'), '@angular/platform-browser-dynamic': require('@angular/platform-browser-dynamic'), '@ng-bootstrap/ng-bootstrap': require('@ng-bootstrap/ng-bootstrap'), 'ngx-toastr': require('ngx-toastr'), rxjs: require('rxjs'), 'rxjs/operators': require('rxjs/operators'), 'zone.js/dist/zone.js': require('zone.js'), 'zone.js': require('zone.js'), } const builtinModules = [ ...Object.keys(cachedBuiltinModules), 'tabby-core', 'tabby-local', 'tabby-settings', 'tabby-terminal', ] const originalRequire = (global as any).require ;(global as any).require = function (query: string) { if (cachedBuiltinModules[query]) { return cachedBuiltinModules[query] } return originalRequire.apply(this, [query]) } const originalModuleRequire = nodeModule.prototype.require nodeModule.prototype.require = function (query: string) { if (cachedBuiltinModules[query]) { return cachedBuiltinModules[query] } return originalModuleRequire.call(this, query) } export type ProgressCallback = (current: number, total: number) => void export function initModuleLookup (userPluginsPath: string): void { global['module'].paths.map((x: string) => nodeModule.globalPaths.push(normalizePath(x))) const paths = [] paths.unshift(path.join(userPluginsPath, 'node_modules')) paths.unshift(path.join(remote.app.getAppPath(), 'node_modules')) if (process.env.TABBY_DEV) { paths.unshift(path.dirname(remote.app.getAppPath())) } paths.unshift(builtinPluginsPath) // paths.unshift(path.join((process as any).resourcesPath, 'app.asar', 'node_modules')) if (process.env.TABBY_PLUGINS) { process.env.TABBY_PLUGINS.split(':').map(x => paths.push(normalizePath(x))) } process.env.NODE_PATH += path.delimiter + paths.join(path.delimiter) nodeModule._initPaths() builtinModules.forEach(m => { if (!cachedBuiltinModules[m]) { cachedBuiltinModules[m] = nodeRequire(m) } }) } const PLUGIN_PREFIX = 'tabby-' const LEGACY_PLUGIN_PREFIX = 'terminus-' async function getCandidateLocationsInPluginDir (pluginDir: any): Promise<{ pluginDir: string, packageName: string }[]> { const candidateLocations: { pluginDir: string, packageName: string }[] = [] if (await fs.exists(pluginDir)) { const pluginNames = await fs.readdir(pluginDir) if (await fs.exists(path.join(pluginDir, 'package.json'))) { candidateLocations.push({ pluginDir: path.dirname(pluginDir), packageName: path.basename(pluginDir), }) } const promises = [] for (const packageName of pluginNames) { if ((packageName.startsWith(PLUGIN_PREFIX) || packageName.startsWith(LEGACY_PLUGIN_PREFIX)) && !PLUGIN_BLACKLIST.includes(packageName)) { const pluginPath = path.join(pluginDir, packageName) const infoPath = path.join(pluginPath, 'package.json') promises.push(fs.exists(infoPath).then(result => { if (result) { candidateLocations.push({ pluginDir, packageName }) } })) } } await Promise.all(promises) } return candidateLocations } async function getPluginCandidateLocation (paths: any): Promise<{ pluginDir: string, packageName: string }[]> { const candidateLocationsPromises: Promise<{ pluginDir: string, packageName: string }[]>[] = [] const processedPaths = [] for (let pluginDir of paths) { if (processedPaths.includes(pluginDir)) { continue } processedPaths.push(pluginDir) pluginDir = normalizePath(pluginDir) candidateLocationsPromises.push(getCandidateLocationsInPluginDir(pluginDir)) } const candidateLocations: { pluginDir: string, packageName: string }[] = [] for (const pluginCandidateLocations of await Promise.all(candidateLocationsPromises)) { candidateLocations.push(...pluginCandidateLocations) } return candidateLocations } async function parsePluginInfo (pluginDir: string, packageName: string): Promise { const pluginPath = path.join(pluginDir, packageName) const infoPath = path.join(pluginPath, 'package.json') const name = packageName.startsWith(PLUGIN_PREFIX) ? packageName.substring(PLUGIN_PREFIX.length) : packageName.substring(LEGACY_PLUGIN_PREFIX.length) try { const info = JSON.parse(await fs.readFile(infoPath, { encoding: 'utf-8' })) if (!info.keywords || !(info.keywords.includes('terminus-plugin') || info.keywords.includes('terminus-builtin-plugin') || info.keywords.includes('tabby-plugin') || info.keywords.includes('tabby-builtin-plugin'))) { return null } let author = info.author author = author.name || author console.log(`Found ${name} in ${pluginDir}`) return { name: name, packageName: packageName, isBuiltin: pluginDir === builtinPluginsPath, isLegacy: info.keywords.includes('terminus-plugin') || info.keywords.includes('terminus-builtin-plugin'), version: info.version, description: info.description, author, path: pluginPath, info, } } catch (error) { console.error('Cannot load package info for', packageName) return null } } export async function findPlugins (): Promise { const paths = nodeModule.globalPaths let foundPlugins: PluginInfo[] = [] const candidateLocations: { pluginDir: string, packageName: string }[] = await getPluginCandidateLocation(paths) const foundPluginsPromises: Promise[] = [] for (const { pluginDir, packageName } of candidateLocations) { if (builtinModules.includes(packageName) && pluginDir !== builtinPluginsPath) { continue } foundPluginsPromises.push(parsePluginInfo(pluginDir, packageName)) } for (const pluginInfo of await Promise.all(foundPluginsPromises)) { if (pluginInfo) { const existing = foundPlugins.find(x => x.name === pluginInfo.name) if (existing) { if (existing.isLegacy) { console.info(`Plugin ${pluginInfo.packageName} already exists, overriding`) foundPlugins = foundPlugins.filter(x => x.name !== pluginInfo.name) } else { console.info(`Plugin ${pluginInfo.packageName} already exists, skipping`) continue } } foundPlugins.push(pluginInfo) } } foundPlugins.sort((a, b) => a.name > b.name ? 1 : -1) foundPlugins.sort((a, b) => a.isBuiltin < b.isBuiltin ? 1 : -1) return foundPlugins } export async function loadPlugins (foundPlugins: PluginInfo[], progress: ProgressCallback): Promise { const plugins: any[] = [] const pluginsPromises: Promise[] = [] let index = 0 const setProgress = function () { index++ progress(index, foundPlugins.length) } progress(0, 1) for (const foundPlugin of foundPlugins) { pluginsPromises.push(new Promise(x => { console.info(`Loading ${foundPlugin.name}: ${nodeRequire.resolve(foundPlugin.path)}`) try { const packageModule = nodeRequire(foundPlugin.path) if (foundPlugin.packageName.startsWith('tabby-')) { cachedBuiltinModules[foundPlugin.packageName.replace('tabby-', 'terminus-')] = packageModule } const pluginModule = packageModule.default.forRoot ? packageModule.default.forRoot() : packageModule.default pluginModule.pluginName = foundPlugin.name pluginModule.bootstrap = packageModule.bootstrap plugins.push(pluginModule) } catch (error) { console.error(`Could not load ${foundPlugin.name}:`, error) } setProgress() setTimeout(x, 50) })) } await Promise.all(pluginsPromises) progress(1, 1) return plugins } ================================================ FILE: app/src/preload.scss ================================================ app-root { background: #1D272D; } .preload-logo { -webkit-app-region: drag; position: fixed; left: 0; top: 0; width: 100vw; height: 100vh; display: flex; animation: 0.5s ease-out fadeIn; background-image: radial-gradient(#3a66820a 0%, #000e17 30%, black 100%); background-color: black; &>div { width: 200px; height: 200px; margin: auto; flex: none; .progress { background: rgba(0,0,0,.25); height: 3px; margin: 10px 50px; .bar { transition: 1s ease-out width; background: #a1c5e4; height: 3px; box-shadow: 0 0 2px #ffffff1f; } } } } @keyframes fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } } .tabby-logo { width: 120px; height: 120px; background: url('../assets/logo.svg'); background-repeat: none; background-size: contain; margin: auto; } .tabby-title { color: #a1c5e4; font-family: 'Source Sans Pro'; text-align: center; font-weight: normal; font-size: 32px; margin: 0; sup { color: #842fe0; } } ================================================ FILE: app/src/toastr.scss ================================================ #toast-container { display: flex; flex-direction: column; align-items: center; padding: 20px 0 50px; .toast { box-shadow: 0 1px 0 rgba(0,0,0,.25); padding: 7px 12px; background-image: none; display: block !important; border: none !important; width: auto; flex-basis: auto; border-radius: 0.5rem; font-size: 0.75rem; &.toast-error { background-color: #BD362F; color: white !important; } &.toast-info { background-color: #555; color: #eee !important; } } } ================================================ FILE: app/tsconfig.json ================================================ { "compilerOptions": { "baseUrl": "./src", "module": "commonjs", "target": "es2015", "declaration": false, "noImplicitAny": false, "removeComments": false, "esModuleInterop": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "sourceMap": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, "noUnusedParameters": true, "noUnusedLocals": true, "lib": [ "dom", "es2015", "es2015.iterable", "es2017", "es2019", "es7" ] }, "compileOnSave": false, "exclude": [ "dist", "node_modules", "*/node_modules", "tabby*", "platforms" ] } ================================================ FILE: app/tsconfig.main.json ================================================ { "compilerOptions": { "baseUrl": "./lib", "module": "commonjs", "target": "es2017", "moduleResolution": "node", "declaration": false, "noImplicitAny": false, "removeComments": false, "emitDecoratorMetadata": true, "experimentalDecorators": true, "esModuleInterop": true, "sourceMap": true, "noUnusedParameters": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, "noUnusedLocals": true, "lib": [ "dom", "es2015", "es2015.iterable", "es2017", "es7" ] }, "compileOnSave": false, "exclude": [ "dist", "src", "node_modules", "*/node_modules" ] } ================================================ FILE: app/webpack.config.main.mjs ================================================ import * as path from 'path' import wp from 'webpack' import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) const config = { name: 'tabby-main', target: 'electron-main', entry: { main: path.resolve(__dirname, 'lib/index.ts'), }, mode: process.env.TABBY_DEV ? 'development' : 'production', context: __dirname, devtool: 'source-map', output: { path: path.join(__dirname, 'dist'), pathinfo: true, filename: '[name].js', }, resolve: { modules: ['lib/', 'node_modules', '../node_modules'].map(x => path.join(__dirname, x)), extensions: ['.ts', '.js'], }, module: { rules: [ { test: /\.ts$/, use: { loader: 'ts-loader', options: { configFile: path.resolve(__dirname, 'tsconfig.main.json'), }, }, }, ], }, externals: { 'v8-compile-cache': 'commonjs v8-compile-cache', 'any-promise': 'commonjs any-promise', electron: 'commonjs electron', 'electron-config': 'commonjs electron-config', 'electron-debug': 'commonjs electron-debug', 'electron-promise-ipc': 'commonjs electron-promise-ipc', 'electron-updater': 'commonjs electron-updater', fs: 'commonjs fs', glasstron: 'commonjs glasstron', mz: 'commonjs mz', npm: 'commonjs npm', 'node:os': 'commonjs os', 'node-pty': 'commonjs node-pty', path: 'commonjs path', util: 'commonjs util', 'source-map-support': 'commonjs source-map-support', 'windows-swca': 'commonjs windows-swca', 'windows-native-registry': 'commonjs windows-native-registry', '@tabby-gang/windows-blurbehind': 'commonjs @tabby-gang/windows-blurbehind', 'yargs/yargs': 'commonjs yargs/yargs', }, plugins: [ new wp.optimize.ModuleConcatenationPlugin(), new wp.DefinePlugin({ 'process.type': '"main"', }), ], } if (process.env.BUNDLE_ANALYZER) { config.plugins.push(new BundleAnalyzerPlugin()) } export default () => config ================================================ FILE: app/webpack.config.mjs ================================================ import * as fs from 'fs' import * as path from 'path' import wp from 'webpack' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) import { AngularWebpackPlugin } from '@ngtools/webpack' import { createEs2015LinkerPlugin } from '@angular/compiler-cli/linker/babel' const linkerPlugin = createEs2015LinkerPlugin({ linkerJitMode: true, fileSystem: { resolve: path.resolve, exists: fs.existsSync, dirname: path.dirname, relative: path.relative, readFile: fs.readFileSync, }, }) export default () => ({ name: 'tabby', target: 'node', entry: { 'index.ignore': 'file-loader?name=index.html!pug-html-loader!' + path.resolve(__dirname, './index.pug'), sentry: path.resolve(__dirname, 'lib/sentry.ts'), preload: path.resolve(__dirname, 'src/entry.preload.ts'), bundle: path.resolve(__dirname, 'src/entry.ts'), }, mode: process.env.TABBY_DEV ? 'development' : 'production', optimization:{ minimize: false, }, context: __dirname, devtool: 'source-map', output: { path: path.join(__dirname, 'dist'), pathinfo: true, filename: '[name].js', publicPath: 'auto', }, resolve: { modules: ['src/', 'node_modules', '../node_modules', 'assets/'].map(x => path.join(__dirname, x)), extensions: ['.ts', '.js'], }, module: { rules: [ { test: /\.(m?)js$/, loader: 'babel-loader', options: { plugins: [linkerPlugin], compact: false, cacheDirectory: true, }, resolve: { fullySpecified: false, }, }, { test: /\.ts$/, use: { loader: '@ngtools/webpack', }, }, { test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] }, { test: /\.css$/, use: ['style-loader', 'css-loader', 'sass-loader'] }, { test: /\.(png|svg|ttf|eot|otf|woff|woff2)(\?v=[0-9]\.[0-9]\.[0-9])?$/, type: 'asset', }, ], }, externals: { '@electron/remote': 'commonjs @electron/remote', 'v8-compile-cache': 'commonjs v8-compile-cache', child_process: 'commonjs child_process', electron: 'commonjs electron', fs: 'commonjs fs', module: 'commonjs module', mz: 'commonjs mz', path: 'commonjs path', }, plugins: [ new wp.optimize.ModuleConcatenationPlugin(), new wp.DefinePlugin({ 'process.type': '"renderer"', }), new AngularWebpackPlugin({ tsconfig: path.resolve(__dirname, 'tsconfig.json'), directTemplateLoading: false, jitMode: true, }) ], }) ================================================ FILE: build/installer.nsh ================================================ !macro customInit nsExec::Exec '"$LOCALAPPDATA\tabby\Update.exe" --uninstall -s' !macroend ================================================ FILE: build/linux/after-install.tpl ================================================ #!/bin/bash cat > '/usr/bin/${executable}' << END #!/bin/sh '/opt/${productFilename}/${executable}' --no-sandbox \$@ END chmod +x '/usr/bin/${executable}' ================================================ FILE: build/mac/entitlements.plist ================================================ com.apple.security.automation.apple-events com.apple.security.cs.allow-jit com.apple.security.cs.allow-unsigned-executable-memory com.apple.security.device.audio-input com.apple.security.device.camera ================================================ FILE: electron-builder.yml ================================================ --- appId: org.tabby productName: Tabby compression: normal npmRebuild: false protocols: - name: Tabby URL schemes: - tabby files: - '**/*' - dist - '!lib' - '!src' - '!**/node_modules/*/{CHANGELOG.md,README.md,README,readme.md,readme,node.lib}' - '!**/node_modules/*/{test,__tests__,tests,powered-test,example,examples,docs}' - '!**/node_modules/@angular/common/locales' - '!**/node_modules/@angular/compiler/src' - '!**/node_modules/node-gyp' - '!**/node_modules/**/*.d.ts' - '!**/node_modules/**/*.map' - '!**/node_modules/**/include/node' - '!**/node_modules/.bin' - '!**/node_modules/*/*/{esm5,fesm5,esm2015,fesm2015,_esm2015,_fesm2015}' - '!**/*.{woff,ttf,otf,eot}' - '!**/*.{iml,o,hprof,orig,pyc,pyo,rbc,swp,csproj,sln,xproj}' - '!.editorconfig' - '!**/._*' - '!**/{.DS_Store,.git,.hg,.svn,CVS,RCS,SCCS,.gitignore,.gitattributes}' - '!**/{__pycache__,thumbs.db,.flowconfig,.idea,.vs,.nyc_output}' - '!**/{appveyor.yml,.travis.yml,circle.yml}' - '!**/{npm-debug.log,yarn.lock,.yarn-integrity,.yarn-metadata.json}' - '!**/deps/cpu_features/build' extraResources: - builtin-plugins - extras asarUnpack: - 'dist/*.map' - node_modules/keytar/build/Release/*.node - node_modules/**/*.node win: icon: "./build/windows/icon.ico" artifactName: tabby-${version}-portable-${env.ARCH}.${ext} signtoolOptions: rfc3161TimeStampServer: http://timestamp.sectigo.com nsis: oneClick: false artifactName: tabby-${version}-setup-${env.ARCH}.${ext} installerIcon: "./build/windows/icon.ico" allowToChangeInstallationDirectory: true shortcutName: Tabby Terminal mac: category: public.app-category.utilities icon: "./build/mac/icon.icns" artifactName: tabby-${version}-macos-${env.ARCH}.${ext} hardenedRuntime: true entitlements: "./build/mac/entitlements.plist" entitlementsInherit: "./build/mac/entitlements.plist" extendInfo: ElectronTeamID: ${teamId} NSRequiresAquaSystemAppearance: false NSCameraUsageDescription: "A subprocess requests access to the device's camera." NSMicrophoneUsageDescription: "A subprocess requests access to the device's microphone." NSLocationUsageDescription: "A subprocess requests access to the user's location information." NSDesktopFolderUsageDescription: "A subprocess requests access to the user's Desktop folder." NSDocumentsFolderUsageDescription: "A subprocess requests access to the user's Documents folder." NSDownloadsFolderUsageDescription: "A subprocess requests access to the user's Downloads folder." NSNetworkVolumesUsageDescription: 'A subprocess requests access to files on a network volume.' NSRemovableVolumesUsageDescription: 'A subprocess requests access to files on a removable volume.' NSAppleEventsUsageDescription: 'A subprocess requests permission to send AppleScript events to another application.' linux: category: "Utility;TerminalEmulator;System" icon: "./build/icons" artifactName: tabby-${version}-linux-${env.ARCH}.${ext} executableArgs: - "--no-sandbox" desktop: entry: StartupWMClass: tabby MimeType: x-scheme-handler/tabby snap: plugs: - default - system-files - system-observe deb: depends: - gnome-keyring - libnotify4 - libsecret-1-0 - libxtst6 - libnss3 afterInstall: build/linux/after-install.tpl fpm: - '--replaces' - 'terminus-terminal' pacman: depends: - gnome-keyring - libsecret rpm: depends: - gnome-keyring fpm: - '--rpm-rpmbuild-define' - '_build_id_links none' - '--replaces' - 'terminus-terminal' electronFuses: runAsNode: false enableNodeOptionsEnvironmentVariable: false enableNodeCliInspectArguments: false ================================================ FILE: extras/automator-workflows/Open Tabby here.workflow/Contents/Info.plist ================================================ NSServices NSBackgroundColorName background NSIconName NSActionTemplate NSMenuItem default Open Tabby here NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item ================================================ FILE: extras/automator-workflows/Open Tabby here.workflow/Contents/_CodeSignature/CodeResources ================================================ files files2 QuickLook/Thumbnail.png hash tv0Qtgo8zZ9+sQPQDNdKJHm7jeQ= hash2 8nlfnBbkORcam9cE84KuxM9Lgf6hYU0jehepX8sSNDU= document.wflow cdhash VK77ipNZktBsDCcUfnfht774juM= requirement identifier document and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = V4JSMC46SY rules ^Resources/ ^Resources/.*\.lproj/ optional weight 1000 ^Resources/.*\.lproj/locversion.plist$ omit weight 1100 ^Resources/Base\.lproj/ weight 1010 ^version.plist$ rules2 .*\.dSYM($|/) weight 11 ^(.*/)?\.DS_Store$ omit weight 2000 ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ nested weight 10 ^.* ^Info\.plist$ omit weight 20 ^PkgInfo$ omit weight 20 ^Resources/ weight 20 ^Resources/.*\.lproj/ optional weight 1000 ^Resources/.*\.lproj/locversion.plist$ omit weight 1100 ^Resources/Base\.lproj/ weight 1010 ^[^/]+$ nested weight 10 ^embedded\.provisionprofile$ weight 20 ^version\.plist$ weight 20 ================================================ FILE: extras/automator-workflows/Open Tabby here.workflow/Contents/document.wflow ================================================ AMApplicationBuild 444.38 AMApplicationVersion 2.9 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.3 AMApplication Automator AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /Applications/Tabby.app/Contents/MacOS/tabby open "$1" CheckedForUserDefaultShell inputMethod 1 shell /bin/sh source BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.3 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID CDBAB8D4-B8B8-4FBB-9115-B4082FB99E1C Keywords Shell Script Command Run Unix OutputUUID 96B5890B-A95F-4BF2-8E5A-38E07A849C33 UUID 62251AFB-502C-4EA0-821C-D9B8CA96E6EE UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 529.000000:305.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/Base.lproj/main.nib isViewVisible connectors workflowMetaData applicationBundleID com.apple.finder applicationBundleIDsByPath /System/Library/CoreServices/Finder.app com.apple.finder applicationPath /System/Library/CoreServices/Finder.app applicationPaths /System/Library/CoreServices/Finder.app inputTypeIdentifier com.apple.Automator.fileSystemObject outputTypeIdentifier com.apple.Automator.nothing presentationMode 15 processesInput 0 serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing serviceProcessesInput 0 systemImageName NSActionTemplate useAutomaticInputType 0 workflowTypeIdentifier com.apple.Automator.servicesMenu ================================================ FILE: extras/automator-workflows/Paste path into Tabby.workflow/Contents/Info.plist ================================================ NSServices NSBackgroundColorName background NSIconName NSActionTemplate NSMenuItem default Paste path into Tabby NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item ================================================ FILE: extras/automator-workflows/Paste path into Tabby.workflow/Contents/_CodeSignature/CodeResources ================================================ files files2 QuickLook/Thumbnail.png hash tv0Qtgo8zZ9+sQPQDNdKJHm7jeQ= hash2 8nlfnBbkORcam9cE84KuxM9Lgf6hYU0jehepX8sSNDU= document.wflow cdhash DwLo2M9xZ+aZGtMzRCGHhHB/wMY= requirement identifier document and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = V4JSMC46SY rules ^Resources/ ^Resources/.*\.lproj/ optional weight 1000 ^Resources/.*\.lproj/locversion.plist$ omit weight 1100 ^Resources/Base\.lproj/ weight 1010 ^version.plist$ rules2 .*\.dSYM($|/) weight 11 ^(.*/)?\.DS_Store$ omit weight 2000 ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ nested weight 10 ^.* ^Info\.plist$ omit weight 20 ^PkgInfo$ omit weight 20 ^Resources/ weight 20 ^Resources/.*\.lproj/ optional weight 1000 ^Resources/.*\.lproj/locversion.plist$ omit weight 1100 ^Resources/Base\.lproj/ weight 1010 ^[^/]+$ nested weight 10 ^embedded\.provisionprofile$ weight 20 ^version\.plist$ weight 20 ================================================ FILE: extras/automator-workflows/Paste path into Tabby.workflow/Contents/document.wflow ================================================ AMApplicationBuild 444.38 AMApplicationVersion 2.9 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.3 AMApplication Automator AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /Applications/Tabby.app/Contents/MacOS/tabby paste --escape "$1" CheckedForUserDefaultShell inputMethod 1 shell /bin/sh source BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.3 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID CDBAB8D4-B8B8-4FBB-9115-B4082FB99E1C Keywords Shell Script Command Run Unix OutputUUID 96B5890B-A95F-4BF2-8E5A-38E07A849C33 UUID 62251AFB-502C-4EA0-821C-D9B8CA96E6EE UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 529.000000:305.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/Base.lproj/main.nib isViewVisible connectors workflowMetaData applicationBundleID com.apple.finder applicationBundleIDsByPath /System/Library/CoreServices/Finder.app com.apple.finder applicationPath /System/Library/CoreServices/Finder.app applicationPaths /System/Library/CoreServices/Finder.app inputTypeIdentifier com.apple.Automator.fileSystemObject outputTypeIdentifier com.apple.Automator.nothing presentationMode 15 processesInput 0 serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing serviceProcessesInput 0 systemImageName NSActionTemplate useAutomaticInputType 0 workflowTypeIdentifier com.apple.Automator.servicesMenu ================================================ FILE: extras/clink/CHANGES ================================================ # Changes ### Releases from [chrisant996/clink](https://github.com/chrisant996/clink) fork #### v1.7.6 - Update Win8.1 character width measurements from [wcwidth-verifier](https://github.com/chrisant996/wcwidth-verifier). - Fixed a case where other popup list colors could interfere with the `colors.border` color in `clink.popuplist()`. - Fixed [#709](https://github.com/chrisant996/clink/issues/709); TAB expansion doesn't work for `cd ~` (regression introduced in v1.3.36). #### v1.7.5 - Added new Lua API [console.ellipsify()](#console.ellipsify) to truncate an input string in various ways. - Added new [rl_buffer:setcommentrow()](#rl_buffer:setcommentrow) to let [`"luafunc:"` commands](#luakeybindings) immediately show text in the comment row. - Adjusted some character width measurements based on analysis from [wcwidth-verifier](https://github.com/chrisant996/wcwidth-verifier) on Win8.1, Win10 with conhost, Win10 with Windows Terminal 1.22, Win11 with conhost, and Win11 with Windows Terminal 1.22. - The Headline, Pure, and Bureau clinkprompt files now consider unpublished branches as being "ahead", even in cases where git doesn't report a specific "ahead by" count. - Internal changes to the right side prompt implementation, to disentangle unnecessary internal dependencies. #### v1.7.4 - Changed searching for color themes and custom prompts to always include `themes\` directories under the Clink program directory and Clink profile directory, even when the `clink.path` setting has been used to remove them from the list of script directories. - Improved emoji width measurements. - Unqualified emojis are counted as a single cell now. Windows Terminal intentionally renders these as a single cell for compatibility with the behavior of the first terminal programs on Linux that began to support emoji characters (an important compatibility detail for the Windows Subsystem for Linux, for example). - Country flag emoji character pairs are recognized. - Skin tone variant selectors are recognized. - The zero width joiner is recognized when it joins two emoji characters, or an emoji and a male or female symbol. - **NOTE:** A given OS version and terminal program version will only recognize certain combinations of joined emojis as valid sequences. And Windows Terminal is one of the only terminal programs on Windows that can draw color emoji characters. Clink has no way to know how a given terminal will actually render sequences of Unicode emoji characters. If a terminal program renders a particular emoji sequence differently than Clink predicts, then the display may become garbled. If that happens, don't use that emoji sequence. But if a terminal program renders an emoji sequence as a single glyph and Clink predicts the width incorrectly, then please open an issue with details about the emoji. - The pure.clinkprompt now also supports virtualenv's `VIRTUAL_ENV_DISABLE_PROMPT` and `VIRTUAL_ENV_PROMPT` environment variables. - Added [console.cellcountiter()](#console.cellcountiter) so scripts can iterate over Unicode character sequences in a string. Using `unicode.iter()` returns one codepoint at a time, but emojis can have multiple codepoints and `console.cellcountiter()` groups them together for easy processing and accurate overall width measures (measuring the width of each codepoint in an emoji sequence is not the same as measuring the width of the emoji sequence as a whole). - Fixed the right side transient prompt so it shows up even when identical to the right side normal prompt. - Fixed the `demo` callback in .clinkprompt files. - Fixed potential for incomplete input of Unicode surrogate pairs. An easy way to encounter the problem was using the Windows emoji picker to input an emoji that's a sequence of other emojis joined together -- for example, the pride flag emoji is a flag emoji joined with a rainbow emoji, and the rainbow emoji uses a surrogate pair. - Fixed an edge case where if a .clinkprompt file calls `require()` to load a module, and later on a different script also calls `require()` for the same module, then any event handlers or prompt filters registered by the required module accidentally only worked inside the .clinkprompt that originally required it. Now required modules behave the same regardless whether they are first required by a .clinkprompt file or by some other script file. - Fixed [#685](https://github.com/chrisant996/clink/issues/685); CTRL-L while input text is present redraws the input line wrong. - Fixed [#686](https://github.com/chrisant996/clink/issues/686); `clink config -h` shows inaccurate info. - Fixed [#696](https://github.com/chrisant996/clink/issues/696); console width length off-by-one on certain characters (in particular U+26A1). - Fixed [#698](https://github.com/chrisant996/clink/issues/698); script error when using `clink config prompt show pure`. - Fixed [#701](https://github.com/chrisant996/clink/issues/701); issues in Antares prompt (missing tag and error when truncation is needed). #### v1.7.3 - Added the missing Tomorrow* color themes. - Fixed [#682](https://github.com/chrisant996/clink/issues/682); the `clink config theme use` and `clink config prompt use` commands had no effect if there is no `clink_settings` file yet. #### v1.7.2 - Fixed an error when the updater tried to install the new `themes\` subdirectory and files. #### v1.7.0 Clink now supports color theme files and custom prompt files. These enable packaging Clink color settings or Clink custom prompts into shareable files. This finally makes it easy to download and apply themes or prompts shared by other people, or copy them and modify them. The new [clink-themes](https://github.com/chrisant996/clink-themes) repo is a site where .clinktheme and .clinkprompt files can be shared (see [Contributing](https://github.com/chrisant996/clink-themes#contributing) for details on how to contribute your own themes and prompts). - Added support for `*.clinktheme` color theme files; see [Color Themes](#color-themes) for more information. - Added several `clink config theme` commands for color themes (run `clink config theme --help`). - The famous [Dracula](https://draculatheme.com), [Solarized](https://github.com/altercation/solarized) (light and dark), and [Tomorrow](https://github.com/chriskempson/tomorrow-theme) (1 light, 4 dark) themes are included. - Use clink config theme use name to apply a color theme, or set the `CLINK_COLORTHEME` environment variable to the color theme name. - Added support for `*.clinkprompt` custom prompt files; see [Custom Prompts](#custom-prompts) for more information. This makes it easy to share custom prompts, and to have a library of many different custom prompts and switch between them quickly and easily. One .clinkprompt can be active at a time; activating one deactivates any others. - Added several `clink config prompt` commands for custom prompts (run `clink config prompt --help`). - [Oh-My-Posh](#oh-my-posh) support is included. - Also included are ports of [Agnoster](https://github.com/agnoster/agnoster-zsh-theme), [Pure](https://github.com/sindresorhus/pure), [Headline](https://github.com/Moarram/headline), [Antares](https://github.com/elB4RTO/zsh-themes/tree/master/antares), and a few others (all ported from zsh to Clink). - Use clink config prompt use name to activate a custom prompt module, or set the `CLINK_CUSTOMPROMPT` environment variable to the custom prompt name. - Added the ability to show input hints in the comment row (below the input line). - Input hints are off by default, and can be enabled with `clink set comment_row.show_hints true`. - Argmatchers can provide input hints; see [Show a Usage Hint](#addarg_hint) for more information. - Lua scripts can create custom hinters; see [Showing Input Hints](#showinginputhints) for more information. - Enhanced the syntax for setting colors; added `italic` and `reverse`, and added `#XXXXXX` and `#XXX` shortcuts for specifying 24-bit color values. - Added more popup list colors: `color.popup_border`, `color.popup_header`, `color.popup_footer`, `color.popup_select`, and `color.popup_selectdesc`. - Changed phrasing from "Accept Suggestion" to "Insert Suggestion" in the documentation and in the auto-suggestions usage hint text. - Changed the Lua `print()` function to support UTF8 output and terminal escape codes. Now the only reasons for a script to use `clink.print()` instead of `print()` are (1) background compatibility or (2) using `NONL` to suppress printing a line ending. - Improved terminal output logging when the `debug.log_terminal` setting is enabled (the setting is only for diagnostic use). - Now it captures all WriteConsoleW and WriteFile output sent to stdout or stderr (instead of only capturing output from the Readline library). - Added a `debug.log_output_callstacks` setting which includes callstacks for each output reported by the `debug.log_terminal` setting. - Added a workaround for Unicode limitations in legacy console windows and legacy terminals (improves cursor position accuracy when Unicode surrogate pairs are present). - Added several new Lua APIs for color themes and custom prompts: [clink.getprompts()](#clink.getprompts), [clink.applyprompt()](#clink.applyprompt), [clink.getclinkprompt()](#clink.getclinkprompt), [clink.getthemes()](#clink.getthemes), [clink.readtheme()](#clink.readtheme), [clink.applytheme()](#clink.applytheme), [settings.clear()](#settings.clear), [settings.parsecolor()](#settings.parsecolor), [settings.formatcolor()](#settings.formatcolor), [os.createguid()](#os.createguid). - Added [git Lua APIs](#git) for use by custom prompts. - Added optional `cookie` argument to [clink.promptcoroutine()](#clink.promptcoroutine) to make it simple for *.clinkprompt files to allow customization that makes use of asynchronous prompt filtering without needing modifications to the main *.clinkprompt file. - Fixed detecting file associations (some file extensions weren't detected as having file associations, causing executable completion to omit them, and causing input line coloring to be inaccurate). - Fixed a case where updating the right side prompt could leave stray characters behind. - Fixed a case where the `match.coloring_rules` setting could have no effect. - Fixed delay when typing `X:` and it's a remote drive. - Fixed coloring `2>&1`; the `1` wasn't colored. - Fixed color of leading blank lines in a prompt string (use the terminal's default color, not the `color.prompt` color). - Fixed `rl.collapsetilde()` which just didn't do its job. - Fixed `%clink_dummy_capture_env%` to stop accidentally leaking into the environment variables collection. - Fixed an infinite loop when `prompt.async` was false. - Fixed F9 to stop jumping one past the actual entered history number. - Fixed various edge case bugs in the input line display, which were uncovered while adding the ability to show input hints. #### v1.6.21 - Reduced the performance overhead of hooked APIs from about 20 microseconds to about 2 microseconds. - Enhanced the executable recognition to avoid flickering red (or `color.unrecognized`) for an executable name that was already recognized in a recent previous input line. - Enhanced the `srcmap` command in the Lua debugger so that `srcmap dir` automatically sets up source mappings for Clink's built in scripts using `dir` as the repo root. - Fixed when `history.expand_mode` is `off`; it didn't fully turn off all of the history expansion syntax forms (for example the `^` syntax). - Fixed input line coloring when the first word is a device name (e.g. `nul` or `com1:`); it should use `color.unrecognized` for the color. - Fixed [#651](https://github.com/chrisant996/clink/issues/651); completion doesn't work for `./` and `../` anymore in the first word of a command line. Now when the `match.translate_slashes` setting is `system` or `backslash` then completing `./` and `../` can complete the word as a path, even though CMD does not consider it to be a path. - Fixed [#653](https://github.com/chrisant996/clink/issues/653); `clink_start.cmd` gets run twice if the binaries directory is the same as the profile directory. - Fixed [#654](https://github.com/chrisant996/clink/issues/654); input line coloring doesn't treat `^` correctly inside quotes (and related quirks). #### v1.6.20 - Fixed [#652](https://github.com/chrisant996/clink/issues/652); error when trying to update again after updating to v1.6.20 (regression introduced in v1.6.19). #### v1.6.19 - Fixed truncated descriptions with `clink set exec.` and then `clink-select-complete` (Ctrl-Space) (regression introduced in v1.6.11). - Fixed fully qualified paths from a different local drive accidentally being colored with `color.unrecognized`. - Fixed [#648](https://github.com/chrisant996/clink/issues/648); on Windows 8.1 the title bar can get changed to "Windows PowerShell" for the rest of the CMD session. #### v1.6.18 - Added a new callback function that can be assigned to an argument position in the table given to `:addarg()` via `onalias=` (see [Responding to Arguments in Argmatchers](#responsive-argmatchers) for more information). The git argmatcher in the [clink-completions](https://github.com/vladimir-kotikov/clink-completions) repo uses this to support git aliases. - When a doskey alias doesn't include any `$` tokens then CMD is guaranteed to ignore the rest of the command line after the alias, so now argmatcher parsing also ignores the rest of the command line and colors it using `color.unexpected`. - Suppress the ANSICON warning in the log file and diagnostics output on Windows 8.1. The performance problem in ANSICON exists, but apparently there isn't a better alternative before Windows 10. #### v1.6.17 - Added warning in the log file and in `clink-diagnostics` (Ctrl-X,Ctrl-Z) when ANSICON is detected on Windows 8.1 or greater (it's unnecessary, less functional, and greatly degrades performance). - Added language info in `clink-diagnostics` when the code page is not 1252 (for easier troubleshooting). - Fixed finding argmatchers registered with exact names (typing `foo` couldn't find an argmatcher registered as `c:\dir\foo.exe` because it accidentally looked for `c:\dir\foo.EXE`). - Fixed [#631](https://github.com/chrisant996/clink/issues/631); script error after `cmd ` when the current language is German. #### v1.6.16 - Added a workaround for how [scoop](https://scoop.sh/) tries to control app versions and updates ([#615](https://github.com/chrisant996/clink/issues/615); scoop causes `clink autorun install` to use a wrong path). - Added an `auto` mode for the `match.translate_slashes` setting. This mode makes completion translate all slashes in the completed word to match whichever kind occurs first in the word, or to the system path separator if there are no slashes yet (e.g. when completing a directory name). - Changed the default to `auto` for the `match.translate_slashes` setting. - Updated the `clink.slash_translation()` function. - UNC share name completion works with forward slashes now (e.g. `//localhost/`). - Added a `clink-toggle-slashes` bindable command, bound by default to Ctrl-/. The command toggles between forward and backslashes in the word at the cursor point, or in the Nth word if a numeric argument is provided (e.g. by the Alt-Digit keys). - Fixed the `off` mode for the `matches.translate_slashes` setting (regression introduced in v1.1.23). - Fixed input line coloring of `@` in `for %a in (*) do @whatever`. - Fixed crash in `glob-list-expansions` when used on an empty word (regression introduced in v1.3.36). - Fixed wildcard completions when `match.wild` is on and `match.substring` is off. - Fixed obscure edge case where match filtering with wildcards could potentially yield inaccurate results immediately after an auto-suggestion was offered. #### v1.6.15 - Fixed hiding internal script names in the `clink-diagnostics` output (regression introduced in v1.6.11). - Fixed [#613](https://github.com/chrisant996/clink/issues/613); wrong input line coloring for `cmd /c "command line"`. #### v1.6.14 - Fixed `menu-complete` to respect `completion-auto-query-items`. - Fixed missing line break before `dump-macros`, `dump-variables`, `clink-dump-functions`, and `clink-dump-macros` (regression introduced in v1.6.3). - Fixed `rl.getbinding()` to return `clink-select-complete` instead of `clink-popup-complete` (the latter is just an alias; the real command name is `clink-select-complete`). #### v1.6.13 - Popup lists can now be filtered. - Press F4 in a popup list to toggle the search mode between "find" and "filter". - The `clink.popup_search_mode` setting controls the default search mode. - The `clink.popuplist()` function can be told to start in a specific search mode. - Added `os.findfiles()` to allow getting files/directories one at a time (versus `os.globfiles()` which collects the entire set all at once into a table). - Added `exec.associations` setting to let Executable Completion include files with registered file associations as matches (e.g. launchable documents such as "*.pdf" files). - Fixed Ctrl-C in a popup list copying the wrong entry after having used Del to delete an entry. - Fixed input line coloring to use `color.executable` also for files included by the `exec.path` setting, if the files have registered file associations. #### v1.6.12 - Fixed [#597](https://github.com/chrisant996/clink/issues/597); prompt shows leftover text sometimes (regression introduced in v1.6.10). - Fixed [#596](https://github.com/chrisant996/clink/issues/596); it's easy to forget whether Enter in history list executes or inserts. #### v1.6.11 - Added `os.setalias()` for setting a doskey alias without needing to invoke the doskey.exe program. - Fixed a case where match descriptions could be displayed with incorrect padding and truncation. - Lua debugging enhancements: - Changed the built-in embedded scripts to include debug info, which allows some Lua error messages to be more useful for troubleshooting. - Added `srcmap` command in the Lua debugger to override where to find source files. #### v1.6.10 - Added an optimization to further reduce flicker when re-drawing the prompt. - Added a `user_data.shared_user_data` table to allow linked argmatchers to share data with each other while an input line is being parsed (see [Responding to Arguments in Argmatchers](https://chrisant996.github.io/clink/clink.html#responsive-argmatchers) for details). - Fixed [#579](https://github.com/chrisant996/clink/issues/579); popup lists could accidentally truncate text in the first column when there's only one column. - Fixed [#576](https://github.com/chrisant996/clink/issues/576); setup exe doesn't remove old uninstall exe files. - Fixed [#575](https://github.com/chrisant996/clink/issues/575); error when `color.executable` is set and `color.unrecognized` is not (regression introduced in v1.6.2). #### v1.6.9 - Fixed [#574](https://github.com/chrisant996/clink/issues/574); `prompt.spacing` "eats" lines containing Unicode Surrogate Pairs such as for some [nerdfont](https://nerdfonts.com) icons (Windows Terminal accidentally returns that such lines are empty). - Fixed [#573](https://github.com/chrisant996/clink/issues/573); C# was unable to read Clink's version resource. - Fixed [#555](https://github.com/chrisant996/clink/issues/555); security advisory [CVE-2020-24370](https://github.com/advisories/GHSA-gfr4-c37g-mm3v) for a Lua bug. #### v1.6.8 - Fixed [#571](https://github.com/chrisant996/clink/issues/571); error in clink.bat under some circumstances (regression introduced in v1.6.7). #### v1.6.7 - Recognize the little-known `cmd /r` as a synonym for `cmd /c` so that Clink can optimize and skip injecting into a `cmd /r` process. - Fixed displaying descriptions when they're left-justified (regression introduced in v1.6.6). - Fixed `argmatcher:chaincommand("run")` to not find argmatchers for builtin CMD command names (since CMD doesn't get invoked in that case, so it won't get interpreted as a CMD command). - Fixed `argmatcher:chaincommand()` to find an argmatcher for a builtin CMD command even if a directory exists with the same name (since CMD interprets that case as a CMD command). - Fixed `argmatcher:chaincommand("cmd")` so when `exec.aliases` is enabled it can include aliases as completions. - Fixed `argmatcher:addarg({loopchars="+", etcetc})` so that `-Q:+x` still gets parsed into two input words `-Q:` and `+x`. - Fixed to parse `foo^ bar` as two words "foo" and "bar". - Fixed to recognize `^echo` (etc) as a builtin CMD command name despite embedded `^` characters. - Fixed [#570](https://github.com/chrisant996/clink/issues/570); fixed #569 more thoroughly, and `cd /d` cannot be used anywhere because it also requires command extensions. #### v1.6.6 - Added `clink history --no-show-time` to allow omitting history timestamps even when the `history.time_stamp` setting is `show`. - Fixed match display to not right justify descriptions when the screen isn't wide enough or when descriptions contain aligned columns (like `clink set` completions do since v1.6.3). - Fixed `clink history` when output is redirected; strip any escape codes that might be embedded in the time format. - Fixed [#569](https://github.com/chrisant996/clink/issues/569); `cmd /e:off` causes syntax error in clink.bat script. - Fixed [#567](https://github.com/chrisant996/clink/issues/567); `clink history compact` accidentally deletes all timestamps. - Fixed documentation error in Lua API Reference about `"w"` mode in `io.open()` and `io.sopen()` (the behavior was correct, but the documentation was inaccurate/unclear). #### v1.6.5 - Added all match fields in the table of matches passed to the `clink.onfiltermatches()` callback function. - Fixed stripping colors from strings (e.g. when displaying in popup lists); it didn't strip 8-bit and 24-bit colors correctly. #### v1.6.4 - Added `rl_buffer:hassuggestion()` and `rl_buffer:insertsuggestion()` for direct access to inserting suggestions without invoking Readline commands. - Added `clink.dirmatchesexact()` and `clink.filematchesexact()` which are the same as the non-`exact` variants, except these don't append a `*` to the search pattern. For example, `clink.filematchesexact("*.zip")` can collect exactly "\*.zip" file matches instead of "\*.zip\*". - Added OS version info to `clink info`. - Added UNC share name completion when using Executable Completion (the `exec.enable` setting). - Fixed completing input `.` or `..` when the `exec.enable` setting is enabled. - Fixed applying `colored-completion-prefix` when match display filtering is active or a match has a custom `display` field. - Fixed the `exec.path` setting so it doesn't accidentally include directories if their names end with an executable extension such as `.exe`. - Fixed finding an argmatcher registered with a full path (e.g. `c:\foo\bar.exe`) when a full path is entered without a drive letter (e.g. enter `\foo\bar.exe`). - Fixed [#562](https://github.com/chrisant996/clink/issues/562); `clink autorun install` strips quotes by mistake. #### v1.6.3 - **Breaking Change:** For the four Ctrl-- key combinations, Clink got the Shift key backwards and generated inaccurate input codes. And that broke the Readline/bash default key binding for `undo` (the Windows default key binding of Ctrl-z works fine). If your .inputrc file has bindings for any of the Ctrl-- key combinations then you can keep the keys working the same by updating the key bindings. You can even use the [`$if clink_version >= 1.6.3`](#if_clink_version) syntax in your .inputrc file to make it define the key bindings differently in different versions of Clink. Key Combination | Old Code | New Code -|-|- Ctrl-- | `"\C-_"` or `C-_` | `"\e[27;5;189~"` Ctrl-Shift-- | `"\e[27;6;189~"` | `"\C-_"` or `C-_` Ctrl-Alt-- | `"\e\C-_"` or `"\M-\C-_"` or `M-C-_` or etc | `"\e[27;7;189~"` Ctrl-Alt-Shift-- | `"\e[27;8;189~"` | `"\e\C-_"` or `"\M-\C-_"` or `M-C-_` or etc - Completions for all `clink set` settings include the current value in the description field (e.g. type `clink set `Alt-= to see Clink settings and their current values). - Fixed to differentiate between `undo` and `vi-undo` commands again (they do the same thing, but are technically different commands). - Fixed `execute-named-command` to also accept Ctrl-- for `undo` (the emacs binding for undo). - Fixed redisplaying multi-line prompts after using completion during `execute-named-command`. - Fixed accidentally loading the history file twice on each prompt; now it loads once, as intended. - Fixed another double-free and potential crash in the Readline library; after navigating through history entries and then editing a history entry, pressing Ctrl-c or Ctrl-Break could cause a crash or memory corruption (regression exposed by changes in Readline 8.2). - Applied fixes for 6 Lua bugs, curated by [@goodusername123](https://github.com/goodusername123) (thank you!) from [Lua.org](https://lua.org/bugs.html): - "Dead keys with nil values can stay in weak tables." - "Expression list with four or more expressions in a 'for' loop can crash the interpreter." - "Label between local definitions can mix-up their initializations." - "Return hook may not see correct values for active local variables when function returns." - "Suspended __le metamethod can give wrong result." - "Wrong code generated for a 'goto' followed by a label inside an 'if'." - Fixed the Lua debugger so 5-digit line numbers don't break indentation when showing source code lines. #### v1.6.2 - Added optional argument `argmatcher:chaincommand(aliases)` to let the argmatcher know that the chained command will have doskey aliases expanded. - Fixed match display potentially missing some matches (regression introduced in v1.6.1). In particular, git command completions were affected. - Fixed command line input parsing so that the first word (the command word) `foo/` is interpreted as two words `foo` and `/` just like CMD does. - Fixed [#549](https://github.com/chrisant996/clink/issues/549); `cd -` intercept interferes with `cd` doskey alias. - Fixed [#546](https://github.com/chrisant996/clink/issues/546); in Windows 10 when "Wrap text output on resize" is unchecked or the Window Width is different from the Screen Buffer Width, then the display becomes garbled. The root cause is a limitation in how Windows 10 implements support for ANSI escape codes, but Clink now has workaround code that tries to compensate for the problems as much as possible (the terminal display will be a bit jittery, though; there's nothing that can be done about that). - Fixed updating the display after using `clink-popup-show-help` to invoke a command that changes only the cursor position. - Fixed a case where a custom strategy for auto-suggestions could accidentally skip inserting part of the suggestion. - Fixed a race condition where `clink-diagnostics` could encounter an error while printing information about coroutines. **Important pre-release changes in Readline:** Readline 8.2 introduced a crash in the `undo` command after navigating through history and making edits in history entries. The following pre-release updates in Readline fix the crash and several related issues. They also fix many other edge-case stability issues, and add a couple of new features. - Fixed crashes due to memory corruption in the undo information for editing operations. - Fixed many issues found by Address Sanitizer (ASAN); these are edge cases where crashes or memory corruption or malfunctions or memory leaks occurred. - Added new `execute-named-command` bindable command which reads a command name from the input and executes it (default is Alt-x). - Allow `quoted-insert` into search strings. - Repeated invocations of `vi-yank-pop` now cycle through the kill ring. - Fixed when `do-lowercase-version` is bound to something that's not an uppercase letter. - Fixed getting the value of the `active-region-start-color` config variable. #### v1.6.1 **Features:** - Improved input line parsing and coloring: - Commands starting with `@` are supported, and completion correctly ignores the `@`. - Each of the following CMD syntax errors are recognized: lines starting with `&` or `@2>`, and lines containing `& &` or `2>&file`. - The whole redirections `2>file` or `>file` or `2>&1` are colored instead of only the `>` or `>&`. - Completions for `clink set` color settings include a color sample in the description field (e.g. type `clink set color`Alt-= to see the color settings and their current color samples). - The `clink-reload` bindable command now reverts key bindings and config variables before reloading the inputrc file, so that old bindings and values don't linger in the current session if they've been removed from the inputrc file. - Added `clink-dump-functions` and `clink-dump-macros` bindable commands. These behave similar to `dump-functions` and `dump-macros`, but they show user-friendly key names and `luafunc:` macros are listed as functions instead of as macros. - Added some new "bigword" cursor movement commands for moving to the next or previous space delimited word; `clink-backward-bigword`, `clink-forward-bigword`, `cua-backward-bigword`, `cua-forward-bigword`. - Added a new conditional directive `$if clink_version` in the inputrc file (e.g. `$if clink_version >= 1.6.1`). - Added a new `prompt.spacing` setting which can control blank lines before the prompt (it was a clink-flex-prompt feature which has now been incorporated into Clink itself). - Added a new `match.coloring_rules` setting and `%CLINK_MATCH_COLORS%` environment variable, both of which supersede Readline's `%LS_COLORS%` definitions when displaying match completions. - Internal changes. **Lua:** - Added `line_state:getrangeoffset()` and `line_state:getrangelength()` to get the beginning offset and length of the range in the input line described by the line_state. - Added `console.explodeansi()` to split a string into substrings on ANSI escape code boundaries. - Added `rl.getinputrcfilename()` to get the loaded inputrc file name. - Added `rl.translatekey()` to translate between key sequence formats (input key, key binding, and friendly key name). - Added `rl.bracketpromptcodes()` to apply `\1` and `\2` codes as needed by Readline in certain inputrc config variables. - Document the `CLINK_EXE` global variable which has existed since v1.0.0 but was accidentally undocumented. **Fixes:** - Removed superfluous `;39` and/or `;49` from color setting escape codes in some cases. - Fixed `console.readinput()` repeatedly returning nil after `console.checkinput()` returns true (regression introduced in v1.5.12). - Fixed loading the `default_inputrc` file if it exists (introduced in v1.3.5, and it never worked properly until now). - Fixed the `history-size` config variable to be completely ignored (it interfered with Clink's history database and settings, which were meant to supersede it). - Fixed the `clink-popup-show-help` command when including unbound commands (numeric argument of 4) so it doesn't double-list the bound `luafunc:` macros. - Fixed updating column text in `clink.popuplist()` when Del is pressed (e.g. history timestamps in the `clink-popup-history` command). - Fixed the width of `clink.popuplist()` to take the title into account. - Fixed Lua argument errors for some objects (the argument # in the error message was one lower than it should have been in some messages). - Fixed the return value from `rl_buffer:setcursor()`. - Fixed `console:getnumlines()` between onendedit and onbeginedit. - Fixed erasing the "History expansion for" preview when the transient prompt is enabled. - Fixed the transient prompt sometimes not erasing properly (regression introduced in v1.5.17). - Fixed the color of flags for `clink set` (e.g. `--help`). - Fixed the `clink-reload` command so any inputrc file parse errors are printed on new lines. - Fixed the `lua.break_on_error` setting so it works properly in released builds of Clink. #### v1.6.0 - Updated the Readline library to v8.2 patch 7 (the list here omits changes that were contributed to Readline from Clink, or which do not affect Clink). - New features: - History expansion better understands multiple history expansions that may contain strings that would ordinarily inhibit history expansion (e.g., `abc!$!$`). - There is a new `fetch-history` bindable command that retrieves the history entry corresponding to its numeric argument. Negative arguments count back from the end of the history. - There is a new option: `enable-active-region`. This separates control of the active region and bracketed-paste. It has the same default value as `enable-bracketed-paste`, and enabling bracketed paste enables the active region. Users can now turn off the active region while leaving bracketed paste enabled. (Note that bracketed paste is currently ignored in Clink.) - Readline looks in `%LS_COLORS%` for a custom filename extension (`*.readline-colored-completion-prefix`) and uses that as the default color for the common prefix displayed when `colored-completion-prefix` is set, superseding the `so` type if both are present. - Two new bindable string variables: `active-region-start-color` and `active-region-end-color`. The first sets the color used to display the active region; the second is unused and unnecessary in Clink, but exists anyway for compatibility. If set, these are used in place of terminal standout mode. - Fixes: - Fixed a problem with cleaning up active marks. - Fixed a problem with arithmetic comparison operators checking the version in the inputrc file. - Fixed a bug that could cause readline to crash if the application removed the callback line handler before readline read all typeahead. - Added additional checks for read errors in the middle of readline commands. - Fixed a problem with `unix-filename-rubout` that caused it to delete too much when applied to a pathname consisting only of one or more slashes. - Fixed a couple problems where `transpose-words` could corrupt the end of the input line. - Fixed an issue that caused a history line's undo list to be cleared when it should not have been. - Fixed leaked memory from undo lists. - When replacing a history entry, make sure the existing entry has a non-NULL timestamp before copying it; it may have been added by the application, not the history library. - The `blink-matching-paren` setting works in Clink now. - Completion works for UNC share names now (share names like `\\server\share`, not server names like `\\server`). - Improved undo grouping for consecutive inserted text. - Added `os.enumshares()` to enumerate the SMB UNC shares on a given server. - Fixed Lua error messages from custom Lua libraries that report errors using table objects instead of strings. - Fixed issue with the `autosuggest.hint` setting where it could apply incorrect input line coloring when the Right key isn't bound to one of the usual commands for that key. - Internal changes and optimizations. #### v1.5.18 - Fixed [#524](https://github.com/chrisant996/clink/issues/524) and [#523](https://github.com/chrisant996/clink/issues/523); garbled display in wide terminal windows (regression introduced in v1.5.14, which exacerbated and revealed a bug that's existed since Clink v1.0.0 alpha and which could intermittently garble Unicode text or escape sequences). - Fixed the transient prompt sometimes not displaying properly (regression introduced in v1.5.17). #### v1.5.17 - Reduced flicker when async prompt filtering redraws the prompt. - When `_argmatcher:addarg()` or `_argmatcher:addflags()` is passed a table containing nowordbreakchars="chars" then the chars are not treated as word breaks for that argument index or for flags (see [Overcoming Word Breaks](#addarg_nowordbreakchars) for more information). - Added a `user_data` argument to the custom classifier function for an argmatcher (set via `_argmatcher:setclassifier()`). - Improved input line coloring for `clink set` so that `color.unexpected` is only used for a completed word that isn't a match. - Fixed reading lines from stdin in Lua scripts (e.g. `io.stdin:read()`). - Fixed accidentally showing matches in a single column sometimes even when there are no descriptions. - Fixed an incomplete `clink inject` if an explicit or implicit `endlocal` happens after `clink inject` but before the prompt is shown (the injection didn't finish successfully until the next time an environment variable was set, but now it finishes immediately). #### v1.5.16 - Fixed [#522](https://github.com/chrisant996/clink/issues/522); garbled display in JetBrains WebStorm terminal (regression introduced in v1.5.15). - Fixing this required reverting the change that automatically chose a default for `color.suggestion` based on the current console colors. - Fixed `:chaincommand()` so that generators and classifiers that come after argmatchers in the priority order receive the same `line_state` objects as ones that come before argmatchers in the priority order. - Fixed `:setdelayinit()` with linked argmatchers; the callback function was only called for registered argmatchers (e.g. `clink.argmatcher("foo"):setdelayinit(func)`) and it wasn't called for linked argmatchers (e.g. `"-x" .. clink.argmatcher():setdelayinit(func)`). - Fixed the word parser to recognize a single digit as a word when followed by punctuation. - Fixed `loopchars` for characters like `-` or `*` that are also Lua pattern characters. #### v1.5.15 - Added localized descriptions for flag completions in `cmd`, `cd`, and `rd`. - Added partial ability to detect light/dark console color themes: - Added `console.getcolortable()` which returns a table with the console's current 16 predefined colors. When possible, the table includes a field indicating whether the current console color theme is a light or dark theme. - At this time, the colors can be accurately retrieved only when using the legacy conhost terminal. When using Windows Terminal, ConEmu, or other ConPty-based terminals there is currently no way to accurately retrieve the colors. Once the [Terminal#10639](https://github.com/microsoft/terminal/issues/10639) issue is fixed then Clink will also detect the background color in these terminal programs. - Changed the default for `color.suggestion` so that it attempts to detect light themes (bright background colors) when possible, and it attempts to automatically choose a default color for suggestions that is faint but has sufficient contrast to be readable. - Fixed the `onlink` callback function in `:addflags()` so that the `arg_index` parameter is correctly `0` instead of `1`. - Fixed the upper bound line number for Lua console line API functions. - Fixed `console.getlinetext()` when emojis are present. #### v1.5.14 - Added a visible usage hint for [Auto-Suggestions](#gettingstarted_autosuggest) to help make the feature more discoverable and usable. The usage hint can be hidden by turning off the `autosuggest.hint` setting. - Added new callback functions that can be assigned to an argument position in the table given to `:addarg()` via `onadvance=` and `onlink=` (see [Responding to Arguments in Argmatchers](#responsive-argmatchers) for more information). - Fixed displaying match descriptions containing embedded color codes. - Fixed finding argmatchers for doskey alias names containing quotes. - Fixed parsing the input line when a doskey alias references a command with an argmatcher that uses the `:chaincommand()` function (e.g. an alias `foo=sudo dir $*` with an argmatcher like `clink.argmatcher("sudo"):chaincommand()` so that completions and input line coloring work properly for the rest of the input line). - Fixed the `exec.commands` setting with an argmatcher that uses the `:chaincommand()` function. - Fixed `_argmatcher:setclassifier()` so the custom classifier is called for flags as well as for arguments. #### v1.5.13 - Added `clink.onhistory()` to register a function to be called when the input line has been accepted and is about to be added to history (and optionally cancel adding it). - Fixed `history delete` with a negative number so it indexes backwards from the end, as advertised. - Fixed calling `clink.refilterprompt()` from a coroutine, and related fixes to ensure various Lua functions coexist properly with coroutines. - Fixed [#520](https://github.com/chrisant996/clink/issues/520); add a link to the Releases page in the updater dialog box. #### v1.5.12 - Fixed updating the input line display after using `clink-popup-history` or `win-popup-history` (regression introduced in v1.5.3; the fix in v1.5.4 was incomplete). - Fixed `console.checkinput()` so it doesn't eat whatever pending input it detects. - Fixed the updater to be more specific about what PowerShell cmdlet it invokes, in case a module replaces the built-in `Expand-Archive` cmdlet. #### v1.5.11 - Fixed prompt filters and other Lua coroutines when `color.executable` and `color.unrecognized` are both empty (regression introduced in v1.5.10). #### v1.5.10 - Changed `clink update` to consider "up-to-date" as a successful case. - Fixed a case where the `completion` auto-suggest strategy could be temporarily prevented from providing a suggestion (regression introduced in v1.4.22). - Fixed leaked memory when showing history expansion previews. - Fixed [#511](https://github.com/chrisant996/clink/issues/511); `!` doesn't need to be treated as a word break character. - Internal changes. #### v1.5.9 - Added default key binding Alt-Ctrl-Up for `clink-popup-history`. - Fixed the `match.max_rows` setting to control the number of rows of items (instead of the total number of rows including description rows). - Fixed [#509](https://github.com/chrisant996/clink/issues/509); crash when using `clink-popup-history` if `history.time_stamp` is `off` (regression introduced in v1.5.7). #### v1.5.8 - Fixed [#504](https://github.com/chrisant996/clink/issues/504); the `clink.autoupdate` setting behaves like `auto` even when it's set to `check` (regression introduced in v1.5.5). - Fixed [#503](https://github.com/chrisant996/clink/issues/503); the updater could hang if any additional CMD instances were started while the "Clink Update" prompt window was open (regression introduced in v1.5.5). #### v1.5.7 - Added vertical scrollbars in `clink-select-complete` and in popup lists. - Added `terminal.scrollbars` setting which can disable the vertical scrollbars (e.g. according to preference, or if a terminal or font is incompatible with extended Unicode box drawing characters). - Added `clink set --info` flag. - Added language-related diagnostic info in `clink info`. - Added minor optimization when displaying prompt text. - Added enhancements in the pager used when displaying help or matches; Tab or Space or Y print the next page, D prints the next half-page, Enter prints the next line, N or Q stop printing, and ? shows the available keys in the `-- More --` pager prompt (the enhancements were accidentally lost in v1.1.1-alpha). - Horizontal scrolling in popup lists works for all columns, if text doesn't fit in the column. - Fixed crash in `rl.getmatchcolor(match, type)`; when the optional `type` parameter was passed in, the API could crash. - Fixed [#498](https://github.com/chrisant996/clink/issues/498); when `autosuggest.enable` is False, cycling or searching through history and then pressing Right does nothing (regression introduced in v1.5.4). - Internal improvements. #### v1.5.6 - Added `os.getpushddepth()`, which works when `%PROMPT%` contains exactly one `$+`. - The `clink-popup-history` and `win-history-list` commands show timestamps when `history.time_stamp` is set to `show`. - Fixed `os.geterrorlevel()` when `cmd /u` was used. - Fixed word break parsing in the input line when certain Unicode characters are present. - Fixed Unicode string conversions to disallow translating to "similar" characters (which could be problematic in filenames). - Fixed a crash in `rl.getkeybindings()` if it's called by a Lua script running inside `clink set`. - Fixed Lua debugger input if a script error occurs inside `clink set`. - Fixed a width quirk in `clink-select-complete` where typing to narrow the list to a single item accidentally made the column width at least 3 characters, even if the item was only 1 or 2 characters width. - Fixed `clink history` to handle escape codes embedded in the `history.time_format` setting. - Fixed a potential crash after using `remove-history` at the beginning of the history list. - Fixed [#494](https://github.com/chrisant996/clink/issues/494); Lua error when using `unicode.fromcodepage()` (reported and fixed before the bug was published). - Fixed [#493](https://github.com/chrisant996/clink/issues/493); `clink-select-complete` displays the selected item incorrectly if both `colored-stats` and `colored-completion-prefix` are `off` (regression introduced in v1.5.5). #### v1.5.5 - Changed the `clink.autoupdate` setting to allow `off`, `check` (the default), `prompt`, and `auto` for more control over how and when updating happens. When set to `prompt` or `auto` Clink can trigger updates automatically, so you don't need to even run `clink update`. - Enhanced `debug.log_terminal` to include low level console keyboard and mouse input events. - Fixed `debug.log_terminal` to capture all input (regression introduced in v1.5.2). - Fixed slowness during `clink-select-complete` while typing, caused by excessive match generation. - Fixed selection highlight in `clink-select-complete` when the whole match text has been typed. - Fixed [#486](https://github.com/chrisant996/clink/issues/486); window title escape code doesn't work properly if it contains emojis or UTF8 content. - Internal changes. #### v1.5.4 - Further contrast improvements for default colors to be readable in both Dark and Light terminal themes. - Added `arginfo` field in `builder:addmatches()` and in match display filtering. - Auto-suggestions are no longer shown while searching history; it was too distracting and confusing. - Fixed updating the input line display after using `clink-popup-history` or `win-popup-history` (regression introduced in v1.5.3). - Fixed `old-menu-complete` and `menu-complete` when there's only one match. The first time it should insert the match, and subsequent times should ding instead of cycling through the same match over and over and requiring an equal number of `undo` to undo. - Fixed match display filtering to support the `match.substring` setting. - Fixed match display filtering to support the `files.system` setting. - Fixed the cursor position if match display filtering happens the first time `clink-select-complete` is used in a session. - Fixed a case where two `undo` were required to fully undo what `menu-complete` inserted. - Fixed Esc during incremental history search mode so it cancels the search. - Fixed input line coloring after `non-incremental-reverse-search-history` or `non-incremental-forward-search-history` finds an exact match for the search text (since v1.1.5). - Internal changes and optimizations. #### v1.5.3 - Added `builder:setfullyqualified()` to force completions to be inserted as fully qualified path names. - Completions for clink set setting_name input use fully qualified path names for input. This helps avoid accidentally setting relative paths in global settings; since the current directory changes frequently, setting relative paths usually leads to unintended consequences. - Only load a script from a `completions\` directory if the associated command exists in the file system. Also, pass the fully qualified file name as input to the script (in Lua, use `...` to get script arguments, e.g. `local command = ...`). - `clink info` now reports whether Clink is injected. - Improve efficiency of updating the input line display. This eliminates some redundant processing in the Readline library and in Clink. - Fixed input line parsing and coloring when the `doskey.enhanced` setting is off or when doskey macro expansion is suppressed. - Fixed `line_state:getwordinfo()` to accurately set the `.alias` field when the `doskey.enhanced` setting is off or when doskey macro expansion is suppressed. - Fixed coloring the command word in the command line when queued keys select and accept a command line from history instantly (it could accidentally continue without applying the appropriate coloring). - Fixed script error in `clink.filematches(nil)` and `clink.dirmatches(nil)`; they were meant to behave the same as passing an empty string. #### v1.5.2 - Adjusted the colors in "Use enhanced defaults" to have sufficient contrast to be readable in both Dark and Light terminal themes. - More reliably detect whether hosted in Windows Terminal, and even when Windows Terminal is set as the default terminal application. - Fixed crash in `clink.popuplist()` when the `current` argument is past the end of the list of items. - Fixed cursor location when the input line contains embedded CTRL characters. - Fixed [#474](https://github.com/chrisant996/clink/issues/474); pasting is slow in Windows Terminal and ConEmu. - Fixed [#470](https://github.com/chrisant996/clink/issues/470); typo in help text. #### v1.5.1 - Added `rl.getcommandbindings()` to get info about a command, including the key(s) bound to it, if any. - Changed to also allow `clink.popuplist()` inside a function registered by `clink.onfiltermatches()`. - Changed console input mode handling to more aggressively clear `ENABLE_VIRTUAL_TERMINAL_INPUT` since it interferes with input (especially Ctrl key combinations) and some console programs set it but accidentally neglect to clear it when they're finished. #### v1.5.0 - Added code-signing. - Added note after successful `clink update` to clarify that the update will take effect in new Clink windows. - Fixed order of running the autostart script (from the `clink.autostart` setting) vs loading Lua; the autostart script should run before Lua so that Lua scripts can query environment variables set by it. Otherwise Lua scripts may behave differently on initial load versus after invoking the `clink-reload` command (e.g. Ctrl-X,Ctrl-R). - Fixed precedence of match colors; readonly should be lower precedence than executable. - Fixed [#469](https://github.com/chrisant996/clink/issues/469); incorrect usage of `memset()`. ================================================ FILE: extras/clink/LICENSE ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: extras/clink/clink.bat ================================================ @echo off rem -- Copyright (c) 2012 Martin Ridgers rem -- Portions Copyright (c) 2020-2024 Christopher Antos rem -- License: http://opensource.org/licenses/MIT setlocal enableextensions set clink_profile_arg= set clink_quiet_arg= rem -- Mimic cmd.exe's behaviour when starting from the start menu. if /i "%~1"=="startmenu" ( cd /d "%userprofile%" shift ) rem -- Check for the --profile option. if /i "%~1"=="--profile" ( set clink_profile_arg=--profile "%~2" shift shift ) rem -- Check for the --quiet option. if /i "%~1"=="--quiet" ( set clink_quiet_arg= --quiet shift ) rem -- If the .bat is run without any arguments, then start a cmd.exe instance. if _%1==_ ( call :launch goto :end ) rem -- Test for autorun. if defined CLINK_NOAUTORUN if /i "%~1"=="inject" if /i "%~2"=="--autorun" goto :end rem -- Forward to appropriate loader, and endlocal before inject tags the prompt. if /i "%processor_architecture%"=="x86" ( endlocal "%~dp0\clink_x86.exe" %* ) else if /i "%processor_architecture%"=="arm64" ( endlocal "%~dp0\clink_arm64.exe" %* ) else if /i "%processor_architecture%"=="amd64" ( if defined processor_architew6432 ( endlocal "%~dp0\clink_x86.exe" %* ) else ( endlocal "%~dp0\clink_x64.exe" %* ) ) goto :end :launch setlocal enableextensions set WT_PROFILE_ID= set WT_SESSION= start "Clink" cmd.exe /s /k ""%~dpnx0" inject %clink_profile_arg%%clink_quiet_arg%" endlocal :end ================================================ FILE: extras/clink/clink.lua ================================================ -- This file is intentionally blank. -- -- The old clink.lua file is no longer used, and this blank file ensures if a -- new clink version is copied over an old clink version, it won't accidentally -- use an obsolete leftover clink.lua file. ================================================ FILE: extras/clink/clink_inputrc_base ================================================ set bell-style visible set completion-ignore-case on set completion-map-case on set completion-display-width 106 set output-meta on set skip-completed-text on set convert-meta on "\e`s": backward-word # ctrl-left "\e`t": forward-word # ctrl-right "\e`O": end-of-line # end "\e`G": beginning-of-line # home "\e`S": delete-char # del "\e`c": page-up # shift page-up "\e`u": kill-line # ctrl+end "\e`w": backward-kill-line # ctrl+home "\e`I": history-search-backward # page-up "\e`Q": history-search-forward # page-down set keymap emacs "\t": clink-completion-shim C-v: paste-from-clipboard C-q: reload-lua-state C-z: undo M-h: show-rl-help M-C-c: copy-line-to-clipboard C-c: ctrl-c M-a: "..\\" set keymap vi-insert "\t": clink-completion-shim C-v: paste-from-clipboard C-z: undo M-h: show-rl-help M-C-c: copy-line-to-clipboard C-c: ctrl-c M-a: "..\\" set keymap vi-move C-v: paste-from-clipboard C-z: undo M-h: show-rl-help M-C-c: copy-line-to-clipboard C-c: ctrl-c M-a: "..\\" $if cmd.exe set keymap emacs "\e`U": up-directory M-C-u: up-directory M-C-e: expand-env-vars set keymap vi-insert "\e`U": up-directory M-C-u: up-directory M-C-e: expand-env-vars set keymap vi-move "\e`U": up-directory M-C-u: up-directory M-C-e: expand-env-vars $endif set keymap emacs # Uncomment these two lines for vanilla cmd.exe style completion. # "\t": clink-menu-completion-shim # "\e`Z": clink-backward-menu-completion-shim $include ~/clink_inputrc $include ~/_inputrc $include ~/.inputrc ================================================ FILE: extras/clink/default_inputrc ================================================ # When this file is named "default_inputrc" and is in the binaries # directory or profile directory, it provides enhanced default settings. # Override the built-in Readline defaults with ones that provide a more # enhanced Clink experience. set colored-completion-prefix on set colored-stats on set mark-symlinked-directories on set completion-auto-query-items on set history-point-at-end-of-anchored-search on set search-ignore-case on ================================================ FILE: extras/clink/default_settings ================================================ # When this file is named "default_settings" and is in the binaries # directory or profile directory, it provides enhanced default settings. # Override built-in default settings with ones that provide a more # enhanced Clink experience. clink.default_bindings = windows clink.autoupdate = off cmd.ctrld_exits = False color.arginfo = sgr 38;5;172 color.argmatcher = sgr 1;38;5;40 color.cmd = bold color.cmdredir = sgr 38;5;172 color.cmdsep = sgr 38;5;135 color.comment_row = sgr 38;5;87;48;5;18 color.description = sgr 38;5;39 color.doskey = sgr 1;38;5;75 color.executable = sgr 1;38;5;33 color.filtered = bold color.flag = sgr 38;5;117 color.hidden = sgr 38;5;160 color.histexpand = sgr 97;48;5;55 color.horizscroll = sgr 38;5;16;48;5;30 color.input = sgr 38;5;214 color.readonly = sgr 38;5;28 color.selected_completion = sgr 7 color.selection = sgr 38;5;16;48;5;179 color.unrecognized = sgr 38;5;203 history.max_lines = 25000 history.time_stamp = show match.expand_envvars = True match.substring = True ================================================ FILE: firebase.json ================================================ { "hosting": { "public": "docs/api", "ignore": [ "firebase.json", "**/.*", "**/node_modules/**" ] } } ================================================ FILE: locale/STOP.txt ================================================ Do not submit pull requests for translations. Translations are managed at https://crowdin.com/project/tabby ================================================ FILE: locale/af-ZA.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: af\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Afrikaans\n" "Language: af_ZA\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" is steeds besig om te hardloop. Maak toe?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} kopie" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "'n Tweede lettertipefamilie wat gebruik word om karakters wat in die hooflettertipe ontbreek, te vertoon" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Stop alles" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Aanvaar en onthou sleutel" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Aanvaar net hierdie eenkeer" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "Toeganklikheid" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Akriel agtergrond" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Voeg by" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Voeg 'n poort aanstuurder by" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Voeg 'n privaat sleutel by" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Voeg by..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Bykomende spasie tussen lyne" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Gevorderd" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Agent" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Agent aanstuur" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Agent pyp pad" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Agent tipe" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Laat toe om .bat-lêers in oortjies oop te maak, maar breek sommige skulpe" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Laat toe om 'n terminaal vinnig oop te maak in die geselekteerde vouer" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "Altyd Donker" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Altyd Lig" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Voorkoms" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Toepassing" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Toepassing instellings" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Is jy seker jy wil Tabby toemaak? U kan hierdie boodskap deaktiveer in Instellings -> Venster." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Is jy seker?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Argumente" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Vra 'n vraag" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Vra voordat die blaaieroortjie toegemaak word" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Hoorbaar" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Stawing metode" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Skrywer" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Outo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Maak 'n terminaal outomaties oop wanneer die toep begin" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Outomaties" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Outomatiese Bywerkings" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Laai veranderinge outomaties op en kyk elke minuut vir opdaterings" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Beskikbaar" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Agtergrond tipe" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "Terugspasie-sleutelmodus" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Baud koers" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Begin van die lyn" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Flikker wyser" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Blou" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Vervaag" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Vet lettertipe gewig" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Onderkant" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Plak tussen hakies (vereis dop ondersteuning)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "Uitsaaimodus. Klik enige plek om te kanselleer." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Ingeboude" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Kanselleer" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Verander die baud-koers" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Verander oortjiekleur" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Verander die hoofwagfrase" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Kyk vir opdaterings" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Syfers" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Opruim" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Vee onlangse profiele uit" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Maak terminaal skoon" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "Maak terminaal skoon na verbinding" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Knipbord" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Maak toe" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Maak toe en wys nooit weer nie" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Maak gefokusde paneel toe" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Maak ander oortjies toe" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Maak oortjie toe" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Maak oortjies aan die linkerkant toe" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Maak oortjies aan die regterkant toe" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "Maak die venster toe nadat jy die laaste oortjie toegemaak het" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Kleur" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Kleur skema" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Kleurskemas" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Kleure" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Kombineer alle oortjies in die huidige oortjie" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Bevelreël" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "Command se stdin/stdout word gebruik in plaas van 'n netwerkverbinding" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Bevele" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "Kompak (erfenis)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Opstelling geskrap" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Opstelling afgelaai" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Opstelling lêer" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Opstelling sinchronisering" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Opstelling opgelaai" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Opstellings" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Koppel deur 'n instaanbediener" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "Koppel aan \"%s\"..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Koppel eers aan 'n ander gasheer en gebruik dit as 'n instaanbediener" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "Koppel tans" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Koppel" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "Koppel het misluk: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "Koppelnaam sal eerder gebruik word" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Kontekskieslys" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "Beheer die hoeveelheid spasie tussen elemente" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Gekopieer" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Kopieer" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Kopieer huidige pad" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Kopieer volle pad" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Kopieer op kies" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Kopieer na knipbord" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Kopieer met formatering" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Kon nie opstelling dekripteer nie" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Skep" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Skep gids" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Huidige" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Huidige kleurskema" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Huidige gasheersleutel-vingerafdruk" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Huidige proses: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Wyser vorm" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Pasgemaak" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "Pasgemaakte CSS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "Donker modus" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Data bisse" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Ontfouting" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Verminder die horisontale verdelingsgrootte" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Verminder die vertikale verdelingsgrootte" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "Standaard \"Koppel aan\" tiepe" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "Standaard verbindingssoort gebruik deur die vinnige koppelingsfunksie (bv. SSH, Telnet)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Verstekprofiel vir nuwe oortjies" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "Standaard profielgroepinstellings" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Verstekprofiel instellings" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "Verstekke" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "Verstekke vir {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Skrap" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "Skrap \"{name}\"?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "Skrap {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Skrap hele reël" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Skrap volgende woord" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Skrap vorige woord" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "Verwyder die konfigurasie aan die afgeleë kant?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Skrap die groep se profiele?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Skrap hierdie skrip?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Skrap kluisinhoud?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Skrap tans" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Toestel" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Direk" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Deaktiveer" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Deaktiveer dinamiese oortjietitel" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "Deaktiveer vlot-agtergrond terwyl jy sleep" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Deaktiveer GVE-versnelling" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Gediaktiveer" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Ontkoppel" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "Ontkoppel huidige oortjie (Serieel/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "Ontkoppel van {host}?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Vertoon beelde via Sixel-ontsnappingsreekse" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Skerm aan" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "Moenie aborteer nie" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Moenie toemaak nie" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Moet nie onthou nie" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "Dok altyd bo-op" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "Dok die terminaal" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "Gedokte terminaalgrootte" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "Gedokte terminaalruimte" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "Dokering" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "Dubbelklik seleksie sal stop by hierdie karakters" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "Af" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Aflaai" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Teken vet teks in helder kleure" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Dupliseer" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Dupliseer as administrateur" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Dupliseer oortjie" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Wysig" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Wysig plaaslik" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Aktiveer" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Aktiveer analise" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "Aktiveer animasies" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Aktiveer outomatiese installasie van opdaterings wanneer hulle beskikbaar word." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "Aktiveer vloeiende agtergrondopsie" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Aktiveer lettertipe-ligatuur" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Aktiveer globale snelsleutel (Ctrl-Space)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Aktiveer die eksperimentele Windows ConPTY API" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Enkripteer konfigurasielêer" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Einde van die lyn" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Omgewing" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Vee konfigurasie uit" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Vee die Kluis uit" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Fout in {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Presiese passing" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Voorbeeld:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "Eksperimentele Windows 10 agtergrondstyl wat bekend is om probleme te veroorsaak" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Uitvoer" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Terugval-lettertipe" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Lêeroordragte" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "Lêer: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "Filter" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Vaste" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Vloeiende agtergrond veroorsaak soms sleep vertraging" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Fokus alle ruite" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Fokus alle ruite gelyktydig (uitsaai)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "Fokus alle oortjies" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "Fokus alle oortjies gelyktydig (uitsaai)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "Fokus volg muis" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Fokus volgende ruit" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "Fokus ruit {number}" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Fokus vorige ruit" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Fokus op die ruit hierbo" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Fokus die ruit hieronder" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Fokus die ruit aan die linkerkant" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Fokus die ruit aan die regterkant" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "Volg die kleurskema" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Lettertipe" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "Vir sleutelbord kortpaaie" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "Dwing CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "Dwing CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "Dwing LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Dwing 'n spesifieke tipe SSH-agentverbinding." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Vergeet" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Stuur poort aan" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Aangestuurde poorte" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "Van kleurskema" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "Van stelsel" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "Van tema" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Voorkant" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Vol" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Algemeen" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Genereer 'n vooraf ingevulde GitHub-kwessie" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Kry" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Kry dit uit die Tabby Web-instellingsvenster" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Gee die venster 'n vaag deursigtige agtergrond" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Gaan op" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Groen" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Groep" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "Kappe" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "Help om die aantal Tabby-installasies regoor die wêreld te volg!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Help om Tabby te vertaal" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Heksadesimaal" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "Versteek" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Versteek oortjie toemaakknoppie" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Versteek oortjie-indeks" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "Versteek oortjie-opsies-knoppie" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Versteek venster op fokusverlies" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "Versteek die gekoppelde terminaal wanneer jy wegklik." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Tuisblad" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Gasheer" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Gasheer sleutel" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Gasheersleutel verifikasie" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Sneltoetse" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "Hoe Tabby homself deur omgewingsveranderlikes voorstel" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "HTTP-instaanbediener" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "HTTP-instaanbediener gasheer" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "HTTP-instaanbediener poort" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Ikoon" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "id.tab-width.dynamic" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Indien gedeaktiveer, sal slegs gepasmaakte profiele in die profielkieser verskyn" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Onmiddellik eggo jou insette plaaslik" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "Verhoog die horisontale verdelingsgrootte" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "Verhoog die vertikale verdelingsgrootte" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "Invoer" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "Invoer word gestuur soos jy tik" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Invoermodus" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "Voer nuwe lyne in" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Geïnstalleer" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "Die installering van die opdatering sal alle oortjies toemaak en Tabby herbegin." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "Intelligente Ctrl-C (kopieer/aborteer)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Interaktief" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Ongeldige sintaksis" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "Spring gasheer" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Spring na die volgende woord" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Spring na die vorige woord" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Behou" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Hou lewendig interval (millisekondes)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "Hou gedokte terminaal altyd bo" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Sleutel" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "Sleutel ruil" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Sleutelbord" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "Sleutelbord-interaktiewe verifikasie" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "Eindig" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Taal" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "Laas bekende gasheersleutel-vingerafdruk" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Begin WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Begin WinSCP vir huidige SSH sessie" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Leer hoe om Tabby toe te laat om afgeleë dop se werkgids op te spoor." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Links" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Laat die dop Meta-sleutel hanteer in plaas van BS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "Ligte modus" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Reël vir reël" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Reël-redigeerder, insette word gestuur nadat u Enter gedruk het" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Reël-vulling" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Laai tans" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Laai tans opstellings..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Plaaslike" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Plaaslike eggo" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Plaaslike terminaal" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Aanmelding skripte" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Langkliek vir kontekskieslys" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Bestuur profiele" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "Maks. hou-lewendig tel" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Maksimeer die aktiewe paneel" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "Minimum kontrasverhouding" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Gewysig op {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "Muis" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Skuif oortjie na links" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Skuif oortjie na regs" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Skuif na \"Ongegroepeer\"" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "Deur die muis oor 'n onaktiewe paneel te beweeg, sal dit aktiveer" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Naam" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Naam vir die nuwe opstelling" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "Naam vir die nuwe gids" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Inheems" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "Nuwe" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Nuwe admin-oortjie" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Nuwe opstelling op {platform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "Nuwe groepnaam" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Nuwe item" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Nuwe naam" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Nuwe profiel" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "Nuwe profielgroep" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Nuwe profiel naam" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Nuwe oortjie" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Nuwe oortjie: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Nuwe terminaal" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Nuwe venster" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "Nuwe Venster" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Nuut met profiel" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Volgende oortjie" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Geen kleur" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Geen wysiger nie" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Geen" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Normaal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "Normale lettertipe gewig" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Nie gevind nie" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Stel in kennis van aktiwiteit" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Stel in kennis wanneer klaar is" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Aantal lyne wat in die buffer gehou word" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Af" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Amptelik" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "Op GitHub-besprekings" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "Sluit net die oortjie wanneer die sessie uitdruklik beëindig is" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Ondeursigtigheid" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Maak DevTools oop" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Maak instellings oop" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Maak instellingsoortjie oop: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "Maak die SFTP-paneel oop" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "Opsioneel" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Opsies" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Oranje" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "OS verstek" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "OS verstek ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "Uitset word as 'n heksstort getoon" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "Uitset word getoon soos dit ontvang word" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Uitset modus" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Uitset nuwelyne" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "Oorskryf X11-vertoning" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "Oorskryf plaaslik en sinkroniseer" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Oorskryf afgeleë en sinkroniseer" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "Oorskryf die opstelling aan die afgeleë kant en begin sinkroniseer?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "Oorskryf die plaaslike opstelling en begin sinkroniseer?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "Paneel herskaleer stap" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "Panele" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "Papier (erfenis)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Pariteit" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "Gedeeltelike opstelling-sinkronisering is nie moontlik wanneer die opstelling via Vault geënkripteer is nie." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "Deurlaat" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "Wagfrase vir 'n private sleutel met hash {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Wagwoord" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Plak" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Plak uit knipbord" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "Plak indien geen seleksie nie, anders kopieer" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Plak veelvuldige reëls?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "Plak op middel-klik" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Pad of adres van die plaaslike X11-sok" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Speld vas" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Inproppe" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Inprop vouer" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Poort" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Port oopgemaak" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Poorte" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Druk enige sleutel om weer te koppel" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Druk die sleutel nou" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Voorkom toevallige sluiting" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Voorkom toevallige uitvoering van geplakte bevele" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Vorige oortjie" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Privaat sleutels" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Proses voltooi" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Profielnaam" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Profiele" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Profiele en verbindings" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Program" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Instaanbediener bevel" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Pers" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Plaas al Tabby se opstelling in die kluis" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Vinnig verbind" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Verlaat" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Rou-sok verbinding" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "Gereed-uitteltyd (Millisekondes)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Onlangse" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Herkoppel" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "Herkoppel huidige oortjie (Serieel/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Rooi" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Regeks" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Vrystelling notas" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "Onthou vir {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Afgeleë" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "Verwyder witspasie en nuwe lyne rondom die gekopieerde teks" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Hernoem" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "Hernoem oortjie" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "Beeldbouing" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Heropen laaste oortjie" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Vervang" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Meld ’n probleem" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "Vereis 'n sleutel om skakels te klik" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Herstel zoom" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Herbegin huidige reeks-sessie" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Herbegin huidige SSH-sessie" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Herbegin huidige Telnet-sessie" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "Herbegin oortjie" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Herbegin die toep om veranderinge toe te pas" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "Herstel instellings na verstek ?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "Herstel instellings na oorgeërfde verstekwaardes ?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "Herstel terminaal-oortjies gedurende die begin van die toep" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "Hergebruik sessie vir veelvuldige oortjies" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "Regs" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "Regs klik" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Laat loop as administrateur" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Stoor" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Stoor 'n wagwoord in die sleutelhanger" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Stoor en pas toe" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Stoor as profiel" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Stoor uitleg as profiel" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Gestoor" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Gestoorde uitleg" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "Rol op inset" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "Rol terminaal een bladsy af" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "Rol terminaal een bladsy op" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Rol terminaal tot onder" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "Rol terminaal tot bo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "Rol terug" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "Rol die terminaal tot onder op Gebruiker inset" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Soek" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Soek deur kleurskemas" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "Soek deur sneltoetse" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "Soek deur inproppe" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Geheime sinchronisasie-kenteken" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Kies" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Kies 'n basisprofiel om as 'n sjabloon te gebruik" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "Kies alles" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Kies lêerberging" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Kies profiel" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Kies profiel of voer 'n adres in" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "Stuur grepe deur hex-waardes in te tik" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Stuur data een greep op 'n slag" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Serie" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Serieverbinding" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Serie: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Stel hoofwagfrase" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Stel wagfrase" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Stel wagwoord" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Stel Tabby as %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "Stel na 0 om onlangse profiele te deaktiveer" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "Stel die SSH-agent se benoemde pyppad." #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Stellings" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Dop" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Dop ondersteun nie huidige padbespeuring nie" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Dop Integrasies" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "Wys" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "Wys {type} profielkieser" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "Wys 'n bevestigingsblokkie wanneer jy veelvuldige reëls plak" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "Wys ingeboude profiele in die kieser" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "Wys bevelkieser" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Wys opstellingslêer" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Wys verstek waardes" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Wys Menger" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "Wys paneeletikette (vir herrangskikking)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Wys profielikoon op oortjie" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Wys profielkieser" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Wys onlangse profiele in die kieser" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Wys vrystellingnotas" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Show Serie verbindings" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "Wys oortjies in volskermmodus" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "Toon Nutsbalk" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Wys kluisinhoud" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Sixel grafiese ondersteuning (eksperimenteel)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "Slaan BvDD/banier oor" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "Stadige voer" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "Knip die venster na 'n kant van die skerm" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "SOCKS instaanbediener" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "SOCKS instaanbediener gasheer" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "SOCKS instaanbediener poort" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "Klank" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Bronkode" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "Ruimtelikheid" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Verdeel" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Verdeel na onder" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "Verdeel na onder" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Verdeel na links" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Verdeel na regs" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Verdeel na bo" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "Verdeel na bo" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "SSH verbinding" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "SSH-verbindingsbestuur word nou gedoen deur die \"Profiel & Verbindings\"-oortjie" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "SSH-wagwoord vir {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "Standaard (erfenis)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "Begin" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Stop bisse" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Strook" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Teken in om opdaterings te kry" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Plaasvervangers toegelaat." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "Skakel kleurskema" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Wissel profiel" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Wissel profiel in die aktiewe paneel" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Wissel die terminaal voorkant implementering (eksperimenteel)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Sinkroniseer" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Sinkroniseer outomaties" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Sinkroniseer gasheer" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Sinkroniseer sneltoetse" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Sinkroniseer Kluis" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Sinkroniseer vensterinstellings" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Oortjie {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Oortjie-aktiwiteit" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby kon nie met jou inproppe begin nie, so alle derdeparty-inproppe is in hierdie sessie gedeaktiveer. Die fout was:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Tabby nuus en opdaterings op Twitter" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Oortjies" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Oortjie-ligging" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Oortjie breedte" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Telnet sessie" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Terminaal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Terminaal agtergrond" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Terminaal klok" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "Terminale identifikasie" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Dankie dat jy Tabby afgelaai het!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Tema" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Daar is aktiewe lêeroordragte" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Daar is 'n gestoorde wagwoord vir hierdie verbinding" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Dit is van toepassing op alle profiele van 'n gegewe tipe" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "Dit is van toepassing op alle profiele van 'n gegewe tipe in hierdie groep" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Dun" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Merk dit as jy aliasing, spookbeelde of ander visuele probleme ondervind" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Wissel volskerm modus" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "Wissel laaste oortjie" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Wissel terminaal venster" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Wissel die sigbaarheid van die Tabby-venster" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "Bo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "Knip witspasie en nuwe lyne af" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Probeer weer" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Probeer tans gestoorde wagwoord" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "Verander huidige oortjie se ruite in aparte oortjies" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Ongegroepeer" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Deïnstalleer" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Onbekend" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Onbekende geheim van tipe {type} vir {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Ontspeld" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "Op" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Opdateer" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Gradeer op na {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Laai op" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Laai op as 'n nuwe opstelling" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Gebruik {altKeyName} as die Meta-sleutel" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "Gebruik ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "Gebruiker verstek" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Gebruikersnaam" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "Gebruik CONNECT metode" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Gebruik vooraf ingestelde wagwoord" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Kluis" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Vault is 'n altyd-geïnkripteer houer vir geheime soos SSH-wagwoorde en privaat sleutelwagfrases." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Kluis is leeg" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Kluis is gesluit" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "Kluis is nie opgestel nie" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "Kluis-hoofwagfrase moet gestel word om geheime te stoor" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Verifieer gasheersleutels wanneer jy verbind" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Weergawe" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Weergawe: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Kleurhelderheid" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Visueel" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Waarsku op multi-reël plak" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Waarsku wanneer aktiewe verbindings gesluit word" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "Waarskuwing: afgeleë gasheer se sleutel het skielik verander!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Ons volg net jou Tabby- en OS-weergawes." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Welkom" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Wat's nuut" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "Wanneer 'n sessie eindig" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "Wanneer dit geaktiveer is, kan skakels slegs geklik word terwyl hierdie sleutel ingehou word" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "Wanneer WinSCP opgespoor word, kan u 'n SCP-sessie vanaf die kontekskieslys begin." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "Of 'n pasgemaakte venster of 'n OS-inheemse venster gebruik moet word" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "Sal voorkom dat die SSH-groet verskyn" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Venster" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "Vensterafmeting langs die rand" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "Vensterafmeting weg van die rand af" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Venster raam" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "Vensters" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Windows 10 bou 18309 of hoër word aanbeveel vir ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "WinSCP pad" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Woordskeier" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Werk gids" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Werkgidsopsporing" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "WSL-terminaalklok kan slegs deur Volume Mixer gedemp word" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "WSL-terminaal ondersteun slegs TrueColor met ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "X11 aanstuuring" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Geel" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "Jy kan dit later verander, maar dit is onherstelbaar as dit vergeet word." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "Jy kan nou onder 'n man-in-die-middel-aanval wees, of die gasheersleutel kon net verander gewees het." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Zoom in" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Zoem uit" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "id.port-forwarding.dynamic" ================================================ FILE: locale/app.pot ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "" #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "" #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "" #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "" #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "" #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "" #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "" ================================================ FILE: locale/bg-BG.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: bg\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Bulgarian\n" "Language: bg_BG\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" все още се изпълнява. Затваряне?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} копирай" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "Шрифт, който да се използва в случай, че символ отсъства в основния шрифт" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Отмени всички" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Приеми и запомни ключа" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Приеми самотози веднъж" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "Достъпност" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Акрилен фон" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Добави" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Добави препращащ порт" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Добави частен ключ" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Добави..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Допълнително разстояние между редовете" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Разширени" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Агент" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Пренасочване на агент" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Път към pipe SSH" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Агент тип" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Разрешава отваряне на .bat файлове в табове, но прекъсва някои терминали" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Разрешава бързо отваряне на терминал в избраната папка" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "Винаги тъмно" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Винаги светло" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Изглед" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Приложение" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Настройки на приложението" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Сигурни ли сте, че желаете да затворите Tabby? Може да изключите това съобщение от Настройки -> Прозорец." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Сигурни ли сте?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Аргументи" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Задайте въпрос" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Питай преди да затвориш таба на браузъра" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Звучен" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Метод за удостоверяване" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Автор" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Автоматично" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Автоматично отваряне на терминал при стартиране на приложението" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Автоматично" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Автоматична актуализация" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Автоматично качи промените и проверявай за актуализация всяка минута" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Налични" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Тип на фона" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "Режим на клавиша Backspace" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Скорост на предаване" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Начало на реда" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Мигане на курсора" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Синьо" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Замъгляване" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Тежест на шрифта" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Долу" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Bracketed paste (изисква shell подръжка)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "Режим на излъчване. Щракнете навсякъде, за да отмените." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Вградени" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Откажи" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Промени скорост на предаване" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Промяна цвета на таба" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Промяна на главна парола" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Провери за актуализация" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Шифри" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Изчисти" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Изчисти скорошни профили" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Изчисти терминала" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "Изчисти терминала след свързване" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Клипборд" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Затвори" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Затвори и не показвай отново" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Затвори панела на фокус" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Затвори останалите табове" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Затваряне на таба" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Затвори табовете вляво" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Затвори табовете вдясно" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "Затваряне на прозореца след затваряне на последния таб" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Цветове" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Цветови схеми" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Цветова схема" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Цветове" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Комбинирай всички табове в текущия" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Команден ред" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "Командния stdin/stdout се използва вместо мрежова връзка" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Команди" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "Компактен (наследен)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Конфигурацията е изтрита" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Конфифурацията е свалена" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Конфигурационен файл" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Синхронизация на конфигурация" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Конфигурацията е качена" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Конфигурации" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Връзка чрез прокси сървър" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "Свържи към \"%s\"..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Свържи се първо към друг хост и го използвай като прокси" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "Свързване" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Свързване" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "Свързването е неуспешно: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "Името на свръзката ще се се използва вместо това" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Контекстно меню" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "Контролира разстоянието между елементите" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Копирано" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Копирай" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Копирай текущия път" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Копирай пълния път" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Копирай при маркиране" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Копирай в клипборда" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Копирай с форматиране" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Конфигурацията не може да бъде декриптирана" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Създай" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Създай директория" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Текущ" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Текуща цветова схема" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Текущ ключов отпечатък на хоста" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Текущ процес: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Форма на курсора" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Потребителски" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "Персонализиран CSS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "Тъмен режим" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Битове на данните" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Отстраняване на грешки" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Намали размера на хоризонталното разделяне" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Намали размера на вертикалното разделяне" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "Тип по подразбиране \"Свързване към\"" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "Тип връзка по подразбиране, използване на функцията за бързо свързване (например SSH, Telnet)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Профил по подразбиране за нов таб" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "Настройки по подразбиране на групата профили" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Настройка на профил по подразбиране" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "По подразбиране" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "По подразбиране за {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Изтрий" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "Изтрий \"{name}\"?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "Изтриване {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Изтриване на целия ред" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Изтрий следваща дума" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Изтрий предишна дума" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "Изтриване конфигурацията на отсрещната страна?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Изтриване профилите на групата?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Изтриване на този скрипт?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Изтриване съдържанието на хранилището?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Изтриване" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Устройство" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Директно" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Изключи" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Изключи динамично заглавие на таб" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "Деактивиране на плавния фон при влачене" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Изключи ускоряване от графичния процесор" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Изключен" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Прекъсни" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "Прекъсване на връзката с текущия tab (Serial/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "Прекъсване на връзката с {host}?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Показване на изображения чрез Sixel escape sequences" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Показвай на" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "Не прекъсвай" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Не затваряй" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Не запаметявай" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "Закрепи винаги отгоре" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "Закрепи терминала" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "Рзамер на закрепения терминал" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "Отстояние от закрепения терминал" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "Закрепване" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "Селекцията с двоен клик ще спира при тези символи" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "Долу" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Свали" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Нарисувай удебелен текст в ярки цветове" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Дублирай" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Дублирай като администратор" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Дублирай таб" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Редактирай" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Редактирай локално" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Включи" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Включи събиране на статистики" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "Активиране на анимации" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Включи автоматично инсталиране на наличните актуализации." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "Включи на опцията за плавен фон" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Включи шрифрова типография" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Включи глобален бърз клавиш (Ctrl-Space)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Включва експерименталния Windows ConPTY API" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Криптирай конфигурационния файл" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Края на реда" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Среда" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Изтрий настройките" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Изтрий хранилището" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Грешка в {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Точно съвпадение" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Пример:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "Експериментален стил на фона на Windows 10, за който се знае, че причинява проблеми" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Експорт" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Резервен шрифт" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Прехвърляне на файл" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "Файл: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "Филтър" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Фиксирана" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "В някои случаи плавният фон води до насичания при влачене" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Фокусирай всички панели" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Фокусирай всички панели наведнъж (излъчвай)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "Фокусирай всички табове" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "Фокусирай всички табове наведнъж (Разпространение)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "Фокусът следва мишката" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Фокусирай следващия панел" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "Панел на фокус {number}" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Фокусирай предишния панел" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Фокусирай горен панел" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Фокусирай долен панел" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Фокусирай левия панел" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Фокусирай десния панел" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "Следване на цветовата схема" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Шрифт" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "За бързи клавиши" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "Принудително използване на CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "Принудително използване на CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "Принудително използване на LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Принудително използване на специфичен SSH агент връзка." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Забрави" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Пренасочи порт" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Пренасочени портове" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "От цветова схема" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "От система" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "От тема" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Фронтенд" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Пълен" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Общи" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Генерирай предварително попълнен GitHub проблем" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Получи" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Вземете от прозореца за Web настройки на Tabby" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Придава на прозореца размазано прозрачен фон" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Нагоре" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Зелен" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Група" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "Хакове" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "Помогнете за проследяване броя на инсталациите на Tabby по света!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Помощ за превод на Tabby" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Шестнайсетичен" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "Скрий" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Скрий бутон затвори таб" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Скрий номериране на таб" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "Бутон за скриване опциите на таба" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Скрий прозореца при загуба на фокус" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "Скриване на прикрепения терминал в случай на кликване извън него." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Начална страница" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Хост" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Ключ на хоста" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Проверка ключа на хоста" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Бързи клавиши" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "Как Tabby се представя чрез променливи на средата" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "HTTP прокси" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "HTTP прокси хост" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "HTTP прокси порт" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Икона" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "Динамична" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Ако е изключен, само потребителските профили ще се показват за избор" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Незабавно отразява локално въведеното от Вас" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "Увеличи размера на хоризонталното разделяне" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "Увеличи размера на вертикалното разделяне" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "Вход" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "Въведенето се изпраща докато пишете" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Режим на въвеждане" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "Въвеждане на нови редове" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Инсталирани" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "Инсталирането на актуализацията ще затвори всички табове и ще рестартира Tabby." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "Интелигентен Ctrl-C (копирай/прекъсни)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Интерактивен" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Неправилен синтаксис" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "Посреднически хост" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Прескочи към следваща дума" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Прескочи към предишна дума" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Запази" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Интервал за проверка на връзката (мс)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "Прикрепеният терминал винаги отгоре" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Ключ" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "Обмен на ключ" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Клавиатура" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "Интерактивно удостоверяване" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "Принудително спиране" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Език" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "Последно известен ключов отпечатък на хоста" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Стартирай WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Стартирай WinSCP за текущата SSH сесия" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Научете как да разрешите на Tabby да разпознава отдалечената работна директория." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Ляво" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Позволява на shell да обработва мета клавиша вместо ОС" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "Светъл режим" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Ред по ред" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Редактор на редове, входните данни се изпращат, след като натиснете Enter" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Разстояние между редовете" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Зареждане" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Зареждане на конфигурации..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Локално" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Локално ехо" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Локален терминал" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Скрипт при вход" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Продължително натискане за контекстно меню" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Управление на профили" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "Максимамален брой проверки на свръзката" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Увеличи максимално активния панел" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "Минимално съотношение на контраста" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Модифицирано на {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "Мишка" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Премести таба наляво" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Премести таба надясно" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Премести в \"Негрупирани\"" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "Преместването на мишката върху неактивен панел ще го активира" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Име" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Име за новата конфигурация" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "Име на новата директория" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Системна" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "Нов" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Нов администраторски таб" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Нова конфигурация на {platform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "Име на нова група" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Нов елемент" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Ново име" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Нов профил" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "Нов профил на групата" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Ново име на профила" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Нов таб" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Нов таб: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Нов терминал" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Нов прозорец" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "Нов прозорец" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Нов с профил" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Следващ таб" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Без цвят" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Без модификатор" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Без" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Нормален" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "Нормална тежест на шрифта" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Не е намерен" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Извести при активност" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Извести като приключиш" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Брой редове за съхранение в буфера" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Изключено" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Официален" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "В GitHub Discussions" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "Затваряне на tab само при изрично прекратяване на сесията" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Непрозрачност" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Отвори DevTools" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Отвори настройки" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Отвори таба настройки: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "Отвори SFTP панел" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "По желание" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Опции" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Оранжев" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "По подразбиране за ОС" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "По подразбиране за ОС ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "Извеждане в шеснайсетичен вид" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "Извеждане в непроменен вид" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Режим на извеждане" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Извеждане на нови редове" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "Отмяна на X11 дисплей" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "Презапиши локалната и синхронизирай" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Презапиши отдалечената и синхронизирай" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "Презаписване на отдалечената конфигурация и стартиране на синхронизация?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "Презаписване на лоцалната конфигурация и стартиране на синхронизация?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "Стъпка за уразмераване на панела" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "Панели" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "Хартия (наследена)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Проверка на четност" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "Частична синхронизация на конфигурацията не е възможна когато конфигурацията е криптирана в хранилището." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "Пропускане" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "Парола за частен ключ с хеш {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Парола" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Вмъкни" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Вмъкни от клипборда" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "\"Paste\", ако няма селекция, иначе \"Copy\"" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Вмъкване на няколко реда?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "Вмъкване със среден клавиш на мишка" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Път или адрес на локалния X11 сокет" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Закрепи" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Плъгини" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Папка за плъгини" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Порт" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Портът е отворен" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Портове" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Натиснете произволен клавиш за повторно свързване" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Натиснете клавиша сега" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Предпазва от инцидентно затваряне" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Предотврати инцидентно изпълнение на вмъкнати команди" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Предходен таб" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Частни ключове" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Процесът е завършен" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Име на профила" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Профили" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Профили и връзки" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Програма" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Прокси команда" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Лилаво" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Поставя всички конфигурации на Tabby в хранилището" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Бързо свързване" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Изход" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Свързване чрез сокет" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "Време за прекъсване на връзката (мс)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Последни" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Повторно свързване" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "Повторно свързване на текущия раздел (Serial/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Червен" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Регулярен израз" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Бележки към тази версия" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "Запомни за {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Отдалечен" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "Премахване на белите интервали и новите редове около копирания текст" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Преименувай" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "Преименуване на таба" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "Рендване" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Отвори отново последния таб" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Замени" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Докладвайте за проблем" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "Изисква клавиш за отваряне на линк" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Възстанови мащаба" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Рестартирай текущата serial сесия" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Рестартирай текущата SSH сесия" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Рестартирай текущата Telnet сесия" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "Рестартиране на таба" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Рестартирайте приложението, за да приложите промените" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "Възстановяване на настройките по подразбиране ?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "Възстановяване на унаследените настройки по подразбиране ?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "Възстанови терминалните табове при стартиране на програмата" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "Повторно използване на сесията за няколко таба" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "Дясно" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "Десен бутон на мишката" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Стартирай като администратор" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Запиши" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Запази паролата в ключодържателя" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Запиши и приложи" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Запази като профил" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Запази оформлението като профил" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Записано" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Запазени оформления" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "Превъртай екрана при въвеждане" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "Превъртете терминала една страница по-надолу" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "Превъртете терминала с една страница нагоре" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Превърти терминала до край" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "Превъртете терминала в началото" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "Буфер за превъртане" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "Превърта терминала до край при въвежнане от потребителя" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Търси" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Търси цветови схеми" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "Търси бързи клавиши" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "Търси плъгини" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Токен за синхронизация" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Избери" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Изберете базов профил, който да се използва за шаблон" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "Изберете всичко" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Изберете къде ще съхранявате файлове" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Изберете профил" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Изберете профил или въведете адрес" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "Изпращане на байтове чрез въвеждане на шестнайсетични стойности" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Изпраща данни по един байт" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Сериен порт" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Свръзка на сериен порт" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Сериен порт: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Създаване на главна парола" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Задай парола" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Създаване на парола" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Задай Tabby като %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "Задайте 0, за да деактивирате последните профили" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "Задава пътя за \"named pipe\" на SSH агента." #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Настройки" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Shell" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Shell не поддържа откриване на текущия път" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Shell интеграция" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "Покажи" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "Покажи {type} на селектора за профил" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "Покажи поле за потвърждение при поставяне на няколко реда" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "Показване на вградените профили в селектора" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "Покажи селектора за команди" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Покажи конфигурационния файл" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Покажи настройките по подразбиране" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Покажи миксер" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "Показване етикетите на панелите (за пренареждане)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Покажи икона на профила на таба" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Покажи избор на профил" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Покажи последни профили при избор" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Покажи бележките към изданието" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Покажи серийните връзки" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "Показване на табове в режим на цял екран" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "Покажи лентата с инструменти" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Покажи съдържанието на хранилището" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Графична поддръжка на Sixel (експериментално)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "Пропусни MoTD/банер" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "Бавно подаване" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "Прилепване на прозореца към страна на екрана" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "SOCKS прокси" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "SOCKS прокси хост" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "SOCKS прокси порт" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "Звук" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Програмен код" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "Пространство" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Раздели" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Раздели надолу" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "Разделяне в посока надолу" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Раздели наляво" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Раздели надясно" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Раздели нагоре" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "Разделяне в посока нагоре" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "SSH свързване" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "Управлението на SSH връзката вече се извършва чрез таба \"Профили и връзки\"" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "SSH парола за {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "Стандартен (наследен)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "При стартиране" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Стоп битове" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Лента" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Абонирайте се за обновления" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Заместванията са разрешени." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "Промяна на цветовата схема" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Смени профил" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Смени профила в активния панел" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Превключва към \"frontend\" реализация на терминала (експериментално)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Синхронизация" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Автоматична синхронизация" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Хост за синхронизация" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Синхронизирай бързи клавиши" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Синхронизирай хранилището" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Синхтонизирай настройки за прозорец" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Таб {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Активност на таба" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby не може да стартира с вашите плъгини, така че всички плъгини на трети страни са деактивирани в тази сесия. Грешката беше:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Новини и актуализации за Tabby в Twitter" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Табове" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Местоположение на табовете" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Ширина на табовете" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Telnet сесия" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Терминал" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Фон на терминала" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Звънец на терминала" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "Идентифициране на терминала" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Благодарим Ви, че изтеглихте Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Тема" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Има активни файлови трансфери" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Има запаметена парола за тази сесия" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Прилага се за всички профили от дадения тип" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "Те се прилагат за всички профили от даден тип в тази група" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Тънка" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Поставете отметката, ако имате визуални проблеми с алиасинг, гостинг или други" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Режим цял екран" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "Последен таб" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Показване/Скриване на терминалния прозорец" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Превключва визуализацията на Tabby прозореца" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "Горе" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "Подрязване на белите интервали и новите редове" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Опитай отново" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Опитвам запазена парола" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "Превръщане на панелите на текущия таб в отделни табове" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Негрупирани" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Деинсталирай" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Неизвестен" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Неизветна тип тайна {type} за {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Откачи" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "Горе" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Актуализирай" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Обнови до {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Качи" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Качи като нова конфигурация" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Използвай {altKeyName} като Meta клавиш" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "Използвай ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "Потребителска настройка" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Потребителско име" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "Използване на CONNECT метод" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Използване на предварително зададена парола" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Хранилище" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Хранилището е постоянно криптиран контейнер за тайни, като SSH пароли и пароли на частни ключове." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Хранилището е празно" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Хранилището е заключено" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "Хранилището не е конфигурирано" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "Необходимо е да зададете главната парола на хранилището, за да съхранявате тайни" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Проверявай ключа на хоста при свръзка" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Версия" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Версия: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Живи цветове" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Визуално" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Предупреждавай при вмъкване на няколко реда" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Предупреждавай при затваряне на активна връзка" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "Предупреждение: ключът на отдалечения хост внезапно се промени!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Ние проследяваме само версиите на Tabby и на ОС." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Добре дошли" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Какво ново" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "Когато дадена сесия приключи" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "Когато е включено, връзките могат да се кликват само при задържане на този клавиш" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "Когато бъде открит WinSCP, можете да стартирате SCP сесия от контекстното меню." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "Дали да се използва потребителски прозорец или да се определи от ОС" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "Ще предотврати появата на SSH поздрава" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Прозорец" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "Размер на прозореца по ръба" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "Размер на прозореца от ръба" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Рамка на прозореца" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "Прозорци" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Windows 10 версия 18309 или по-нова е препоръчителна за ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "Път към WinSCP" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Разделители на думи" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Работна директория" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Откриване на работна директория" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "WSL теминалния звънец може да бъде заглушен само от Volume Mixer" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "WSL терминал подържа само TrueColor с ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "X11 пренасочване" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Жълто" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "Може да я промените по-късно, но не може да бъде възстановена в случай, че я забравите." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "Възможно е в момента да сте обект на атака от типа \"man-in-the-middle\" или ключът на хоста просто да е бил променен." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Увеличи" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Намали" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "Динамичен" ================================================ FILE: locale/cs-CZ.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: cs\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Czech\n" "Language: cs_CZ\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" stále běží. Zavřít?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} kopie" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "Druhá rodina písma používaná k zobrazení chybějících znaků v hlavním písmu" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Zrušit vše" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Přijmout a zapamatovat klíč" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Přijmout pouze tentokrát" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "Přístupnost" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Akrylové pozadí" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Přidat" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Přidat nové přesměrování portů" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Přidat soukromý klíč" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Přidat..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Dodatečný prostor mezi řádky" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Rozšířené" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Agent" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Přeposílání agenta" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Cesta kanálu agenta SSH" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Typ agenta" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Umožňuje otevírat .bat soubory v záložkách, ale rozbíjí některé shelly" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Umožňuje rychlé otevření terminálu ve vybrané složce" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "Vždy tmavý" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Vždy světlý" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Vzhled" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Aplikace" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Nastavení aplikace" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Opravdu chcete zavřít Tabby? Tuto výzvu můžete vypnout v Nastavení -> Okno." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Jste si jisti?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Parametry" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Zeptejte se" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Zeptat se před zavřením karty prohlížeče" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Slyšitelný" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Metoda ověřování" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Autor" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Automaticky" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Automatické otevření terminálu při spuštění aplikace" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Automatický" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Automatické aktualizace" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Automaticky nahrávat změny a kontrolovat aktualizace každou minutu" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "K dispozici" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Typ pozadí" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "Režim klávesy Backspace" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Modulační rychlost" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Začátek čáry" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Blikající kurzor" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Modrá" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Rozostření" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Síla tučného písma" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Dolní" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Vložení bez odřádkování (vyžaduje podporu shellu)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "Režim vysílání. Klikněte kdekoli pro zrušení." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Vestavěný" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Zrušit" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Změna rychlosti přenosu v baudech" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Změnit barvu karty" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Změnit hlavní heslo" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Zkontrolovat aktualizace" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Šifry" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Vyčistit" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Vymazat nedávné profily" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Vyčistit terminál" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "Vymazat terminál po připojení" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Schránka" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Zavřít" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Zavřít a už nikdy nezobrazovat" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Zavřít aktivní okno" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Zavřít ostatní panely" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Zavřít panel" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Zavřít karty vlevo" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Zavřít karty vpravo" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "Zavřít okno po zavření poslední karty" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Barva" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Barevné schéma" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Barevná schémata" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Barvy" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Zkombinovat všechny panely do aktuálního panelu" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Příkazový řádek" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "Stdin/stdout příkazu se používá namísto síťového připojení" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Příkazy" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "Kompaktní (Legacy)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Konfigurace odstraněna" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Konfigurace stažena" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Konfigurační soubor" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Synchronizace konfigurace" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Konfigurace nahrána" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Konfigurace" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Připojit přes proxy server" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "Připojit k \"%s\"..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Nejdříve se připojte k jinému hostiteli a použijte jej jako proxy" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "Připojuji" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Připojení" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "Připojení selhalo: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "Místo toho bude použit název připojení" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Kontextové menu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "Určuje množství prostoru mezi prvky" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Zkopírováno" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Kopírovat" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Kopírovat aktuální cestu" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Kopírovat celou cestu" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Kopírovat při výběru" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Kopírovat do schránky" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Kopírovat s formátováním" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Zprávu se nepodařilo dešifrovat" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Vytvořit" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Vytvořit adresář" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Aktuální" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Aktuální barevné schéma" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Aktuální otisk klíče hostitele" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Aktuální proces: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Tvar kurzoru" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Vlastní" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "Vlastní CSS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "Tmavý režim" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Datové bity" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Ladění" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Snížit vodorovné rozdělení" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Snížit vodorovné rozdělení" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "Výchozí typ připojení" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "Výchozí typ připojení používaný funkcí rychlého připojení (např. SSH, Telnet)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Výchozí profil pro nové karty" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "Výchozí nastavení profilu" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Výchozí nastavení profilu" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "Výchozí" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "Výchozí hodnoty pro {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Smazat" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "Smazat {name}?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "Smazat {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Smazat celý řádek" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Smazat následující" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Smazat předchozí" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "Odstranění konfigurace na dálku?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Smazat profily ve skupině?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Smazat tento skript?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Smazat obsah trezoru?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Mazání" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Zařízení" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Přímé" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Vypnout" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Zakázat dynamický název karty" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "Zakázat plynulé pozadí při přetažení" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Zakázat hardwarovou akceleraci" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Vypnuto" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Odpojit" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "Odpojit aktuální kartu (Serial/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "Odpojit od {host}?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Zobrazit obrázky přes únikové sekvence Sixel" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Zobrazit na" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "Nepřerušovat" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Nezavírat" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Nepamatovat si" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "Vždy nahoře" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "Připevnit terminál" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "Velikost připevněného terminálu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "Místo připevněného terminálu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "Připevnění" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "Výběr dvojitým kliknutím se zastaví na tyto znaky" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "Dolů" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Stáhnout" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Vykreslit tučný text jasnými barvami" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Duplikovat" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Duplikovat jako administrátor" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Duplikovat kartu" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Upravit" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Upravit lokálně" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Povolit" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Povolit analytiky" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "Povolit animace" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Povolit automatickou instalaci aktualizací, jakmile budou dostupné." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "Povolit fluent pozadí" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Povolit svázání znaků" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Povolit globální zkratku (Ctrl-Space)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Povolit experimentální Windows ConPTY API" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Šifrovat konfigurační soubor" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Konec řádku" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Environment" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Smazat konfiguraci" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Vymazat trezor" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Chyba v {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Přesná shoda" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Příklad:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "Experimentální styl pozadí Windowsu 10, je známo že způsobuje problémy" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Export" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Náhradní písmo" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Přenos souborů" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "Soubor: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "Filtr" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Opraveno" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Plynulé pozadí někdy způsobuje lagy při přetažení" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Soustředit všechna okna" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Soustředit všechna okna najednou (broadcast)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "Soustředit všechny karty" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "Soustředit všechny karty najednou (broadcast)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "Zaměřit se na myš" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Soustředit na další okno" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "Soustředit na okno {number}" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Soustředit na předchozí okno" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Soustředit na okno nahoře" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Soustředit na okno dole" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Soustředit na okno vlevo" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Soustředit na okno vpravo" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "Duplikovat barevné schéma" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Písmo" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "Klávesové zkratky" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "Vynutit CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "Vynutit CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "Vynutit LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Vynucuje konkrétní typ připojení SSH agenta." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Zapomenout" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Přesměrovat port" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Přesměrované porty" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "Z barevného schématu" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "Ze systému" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "Z motivu" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Frontend" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Plné" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Obecné" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Generovat předvyplněný GitHub issue" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Získat" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Dostupný v nastavení webové aplikace Tabby" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Dá oknu rozostřené průhledné pozadí" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Přejít nahoru" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Zelená" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Skupina" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "Hacky" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "Pomozte sledovat počet instalací Tabby po celém světě!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Pomozte s překladem Tabby" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Hexadecimální" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "Skrýt" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Skrýt tlačítko zavřít kartu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Skrýt číslo karty" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "Skrýt tlačítko možností karty" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Skrýt neaktivní okno" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "Při kliknutí pryč skryje připnutý terminál." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Domovská stránka" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Host" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Klíč hostitele" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Ověření hostitelského klíče" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Klávesové zkratky" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "Jak se Tabby prezentuje prostřednictvím indikátorů prostředí" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "HTTP proxy" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "HTTP proxy server" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "HTTP proxy port" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Ikona" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "Dynamický" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Pokud je zakázáno, ve výběru profilu se zobrazí pouze vlastní profily" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Okamžitě lokálně vypíše data na vstupu" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "Zvětšit vodorovné odsazení" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "Zvětšit svislé odsazení" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "Příkaz" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "Vstup je odeslán při psaní" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Režim vstupu" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "Vložit nové řádky" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Nainstalované" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "Instalace aktualizace zavře všechny panely a restartuje Tabby." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "Inteligentní Ctrl-C (kopírování/přerušení)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Interaktivní" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Neplatná syntaxe" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "Jump host" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Přeskočit na následující" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Skoč na předchozí slovo" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Ponechat" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Keep Alive Interval (Milisekundy)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "Ponechat připevněný terminál vždy nahoře" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Klíč" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "Výměna klíčů" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Klávesnice" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "Interaktivní ověření klávesnice" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "Vynuceně ukončit" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Jazyk" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "Poslední známý klíč hostitele" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Spustit WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Spustit WinSCP pro aktuální SSH relaci" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Zjistěte, jak povolit Tabby detekovat pracovní adresář vzdáleného shellu." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Vlevo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Nechat shell zpracovat Meta klávesu namísto OS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "Světlý režim" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Řádek po řádku" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Řádkový editor, vstup je odeslán po stisknutí Enter" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Odsazení řádek" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Načítání" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Načítání konfigurací..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Místní" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Lokální echo" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Místní terminál" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Přihlašovací skripty" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Podržte pro zobrazení kontextové nabídky" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Správa profilů" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "Maximální počet zachycení" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Maximalizovat aktivní okno" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "Minimální poměr kontrastu" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Upraveno dne {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "Myš" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Posunout kartu vlevo" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Posunout kartu vpravo" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Přesunout do \"Neseskupené\"" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "Přesun myši nad neaktivní okno ho soustředí" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Jméno" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Název nové konfigurace" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "Název nového adresáře" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Nativní" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "Nový" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Nová admin karta" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Nové nastavení na {platform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "Nové jméno skupiny" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Nová položka" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Nový název" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Nový profil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "Nová profilová skupina" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Název nového profilu" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Nová karta" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Nová karta: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Nový terminál" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Nové okno" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "Nové okno" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Nový s profilem" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Nová karta" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Bez barvy" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Bez modifikátoru" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Žádný" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Normální" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "Síla normálního písma" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Nenalezeno" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Upozornit na aktivitu" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Upozornit po dokončení" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Počet řádků uložených ve vyrovnávací paměti" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Vypnuto" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Oficiální" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "Na GitHub Discussions" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "Karta zůstane otevřená až do konce relace" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Průhlednost" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Otevřít vývojářské nástroje" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Otevřít nastavení" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Otevřít záložku nastavení: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "Otevřít panel SFTP" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "Volitelný" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Možnosti" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Oranžový" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "Výchozí nastavení OS" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "Výchozí nastavení OS ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "Výstup je zobrazen jako hexadecimální výpis" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "Výstup je zobrazen v přijaté podobě" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Režim výstupu" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Výstupní nové řádky" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "Přepsat zobrazení X11" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "Přepsat místní konfiguraci a synchronizovat" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Přepsat vzdálenou konfiguraci a synchronizovat" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "Přepsat konfiguraci na vzdálené straně a začít synchronizovat?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "Přepsat místní konfiguraci a začít synchronizovat?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "krok změny velikosti" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "Panely" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "Papír (Legacy)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Parita" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "Částečná konfigurace není možná, pokud je konfigurace šifrována přes trezor." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "Kapacita" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "Heslo pro privátní klíč s hashem {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Heslo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Vložit" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Vložit ze schránky" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "Vložit, pokud není nic vybráno, jinak zkopírovat" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Vložit více řádků?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "Vložit při kliknutí prostředním tlačítkem" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Cesta nebo adresa lokálního X11 soketu" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Připnout" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Pluginy" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Složka pluginů" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Port" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Port otevřen" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Porty" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Stiskněte libovolnou klávesu pro opětovné připojení" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Stiskněte libovolnou klávesu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Brání nechtěnému zavření" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Brání nechtěnému spuštění vložených příkazů" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Předchozí karta" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Soukromé klíče" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Proces dokončen" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Název profilu" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Profily" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Profily a připojení" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Program" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Příkaz proxy" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Fialová" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Vloží všechny konfigurace Tabby do trezoru" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Rychlé připojení" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Odejít" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Připojení přes socket" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "Časový limit pohotovostního režimu (milisekundy)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Poslední" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Obnovit připojení" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "Obnovení připojení aktivní karty (Serial/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Červená" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Regex" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Poznámky k verzi" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "Pamatovat po {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Vzdálený" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "Odstranit mezery a nové řádky kolem zkopírovaného textu" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Přejmenovat" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "Přejmenovat kartu" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "Vykreslování" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Otevřít poslední kartu" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Nahradit" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Nahlásit problém" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "Vyžadovat stisk klávesy pro kliknutí na odkaz" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Resetovat přiblížení" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Restartovat aktuální sériovou relaci" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Restartovat aktuální SSH relaci" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Restartovat aktuální relaci Telnet" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "Restartovat kartu" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Restartujte aplikaci pro zavedení změn" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "Obnovit nastavení na výchozí hodnoty?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "Obnovit nastavení na výchozí hodnoty?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "Obnovit karty při spuštění aplikace" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "Znovu použít relaci pro více karet" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "Vpravo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "Pravé tlačítko myši" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Spustit jako správce" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Uložit" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Uložit heslo" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Uložit a použít" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Uložit jako profil" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Uložit rozložení jako profil" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Uloženo" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Rozložení uloženo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "Posunout na vstup" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "Posunout terminál o jednu stránku dolů" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "Posunout terminál o jednu stránku nahoru" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Posunout dolů" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "Posunout nahoru" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "Posunout zpět" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "Posune při vstupu uživatele terminál dolů" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Hledat" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Hledat barevná témata" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "Hledat klávesové zkratky" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "Hledat pluginy" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Synchronizační token" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Vybrat" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Vyberte základní profil, který chcete použít jako šablonu" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "Vybrat vše" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Vyberte úložiště" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Zvolte profil" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Zvolte profil nebo vložte adresu" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "Poslat bajty zadáním hexadecimálních hodnot" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Odesílá data po 1 bitu" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Sériové číslo" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Sériové připojení" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Sériový: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Nastavit hlavní heslo" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Nastavit přístupovou frázi" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Nastavit heslo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "nastavit Tabby jako %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "Nastavte na 0 pro vypnutí nedávných profilů" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "Nastaví agenta SSH na pojmenovanou cestu potrubí." #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Nastavení" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Shell" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Shell nepodporuje aktuální cestu" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Integrace shellu" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "Ukázat" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "Zobrazit {type} selektor profilu" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "Zobrazit potvrzovací pole při vkládání více řádků" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "Zobrazení vložených profilů ve výběru" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "Zobrazit výběr příkazu" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Zobrazit konfigurační soubor" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Zobrazit výchozí hodnoty" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Zobrazit Mixer" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "Zobrazit popisky tabulek (pro přeuspořádání)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Zobrazit ikonu profilu na kartě" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Zobrazit výběr profilu" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Zobrazit nedávné profily ve výběru" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Zobrazit poznámky k verzi" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Zobrazit sériová připojení" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "Zobrazit panely v režimu celé obrazovky" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "Zobrazit panel nástrojů" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Zobrazit obsah trezoru" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Podpora šestielové grafiky (experimentální)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "Přeskočit MoTD/banner" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "Pomalé odesílání" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "Přichytí okno na stranu obrazovky" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "SOCKS proxy host" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "SOCKS proxy port" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "Zvuk" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Zdrojový kód" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "Prostor" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Rozdělit" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Rozdělit do spodu" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "rozdělit dolů" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Rozdělit vlevo" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Rozdělit vpravo" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Rozdělení nahoře" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "Rozdělit nahoru" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "Připojení SSH" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "Správa SSH připojení se nyní provádí přes záložku \"Profily a připojení\"" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "SSH heslo pro {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "Standardní (Legacy)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "Spuštění" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Stop bity" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Proužek" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Přihlásit k odběru novinek" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Povolené náhrady." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "Přepnout barevné schéma" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Přepnout profil" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Přepnout profil v aktivním panelu" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Přepíná implementaci terminálu (experimentální)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Synchronizace" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Synchronizovat automaticky" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Hostitel synchronizace" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Synchronizovat klávesové zkratky" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Synchronizovat trezor" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Synchronizovat nastavení okna" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Karta {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Aktivita záložek" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby nemohl začít s vašimi pluginy, takže všechny pluginy třetích stran byly v této relaci zakázány. Došlo k chybě:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Novinky a aktualizace Tabby na Twitteru" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Karty" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Umístění záložek" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Šířka panelu" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Telnet relace" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Terminál" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Pozadí terminálu" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Terminální zvonek" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "Identifikace terminálu" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Děkujeme vám za stažení Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Téma" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Existují aktivní přenosy souborů" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Pro toto připojení existuje uložené heslo" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Ty se vztahují na všechny profily daného typu" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "Ty se vztahují na všechny profily daného typu v této skupině" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Tenké" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Zaškrtněte, pokud máte aliasing, ghosting nebo jiné vizuální problémy" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Přepnout režim celé obrazovky" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "Přepnout na poslední kartu" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Přepnout okno terminálu" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Přepíná viditelnost okna Tabby" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "Vrchní" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "Oříznout mezery a nové linie" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Zkuste to znovu" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Pokus o uložení hesla" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "Změní panely aktuálního panelu v samostatné panely" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Bez zařazení" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Odinstalovat" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Neznámý" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Neznámý typ tejemství typu {type} pro {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Odepnout" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "Nahoru" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Aktualizovat" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Aktualizace na {verzi}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Nahrát" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Nahrát jako novou konfiguraci" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Použít {altKeyName} jako Meta klíč" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "Použít ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "Výchozí nastavení uživatele" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Uživatelské jméno" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "Použití metody CONNECT" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Použití přednastaveného hesla" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Trezor" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Trezor je vždy šifrovaný kontejner pro tajné objekty jako jsou SSH klíče nebo hesla privátních klíčů." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Trezor je prázdný" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Trezor je uzamčený" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "Trezor není nakonfigurován" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "Hlavní heslo pro trezor musí být nastaveno pro ukládání tajných objektů" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Ověřit klíče hostitele při připojení" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Verze" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Verze: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Vibrace" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Vizuální" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Upozornit na vícevrstvé vložení" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Upozornit při zavírání aktivních připojení" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "Varování: klíč vzdáleného hostitele se náhle změnil!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Sledujeme pouze verzi Tabby a OS." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Vítejte" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Co je nového" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "Když skončí relace" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "Na odkazy lze kliknout pouze při stisku této klávesy" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "Když je WinSCP detekován, můžete spustit relaci SCP z kontextového menu." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "Slouží k výběru vlastního nebo nativního vzhledu okna terminálu" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "Zabránit zobrazování SSH" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Okno" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "Rozměr okna podél okraje" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "Rozměry okna od okraje" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Rám okna" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "Windows" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Pro ConPTY je doporučeno sestavení Windows 10 18309 nebo vyšší" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "Cesta k WinSCP" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Oddělovače slov" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Pracovní adresář" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Detekce pracovního adresáře" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "Zvonek terminálu WSL lze ztlumit pouze pomocí směšovače hlasitosti" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "WSL terminál podporuje pouze TrueColor s ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "X11 Přesměrování" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Žlutá" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "Můžeš to změnit později, ale je to nevratné, pokud je zapomenuto." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "Může se jednat o útok typu \"man-in-the-middle\" nebo byl právě změněn klíč hostitele." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Přiblížit" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Oddálit" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "Dynamické" ================================================ FILE: locale/da-DK.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: da\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Danish\n" "Language: da_DK\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" kører stadig. Luk?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} kopi" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "En anden skrifttypefamilie, der bruges til at vise tegn, der mangler i hovedskrifttypen" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Afbryd alle" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Accepter og husk nøgle" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Accepter kun dette én gang" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Akryl baggrund" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Tilføj" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Tilføj en port-videresendelse" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Tilføj en privat nøgle" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Tilføj..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Yderligere mellemrum mellem linjer" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Avanceret" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Agent" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Agent-videresendelse" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Agent pipe-sti" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Agent type" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Giver mulighed for at åbne .bat filer i faner, men virker ikke med nogle shell's" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Tillader hurtigt at åbne en terminal i den valgte mappe" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "Altid mørk" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Altid lys" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Udseende" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Applikation" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Applikationsindstillinger" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Er du sikker på, at du vil lukke Tabby? Du kan deaktivere denne prompt i Indstillinger -> Vindue." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Er du sikker?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Argumenter" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Stil et spørgsmål" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Spørg før du lukker browserfanen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Hørbar" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Godkendelsesmetode" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Forfatter" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Auto" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Åbn automatisk en terminal ved appstart" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Automatisk" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Automatiske opdateringer" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Upload automatisk ændringer og tjek for opdateringer hvert minut" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Tilgængelig" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Baggrundstype" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Baud-rate (hastighed)" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Begyndelse af linjen" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Blinkende markør" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Blå" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Sløring" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Fed skriftvægt" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Bunden" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Indbygget" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Annullér" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Ændre baud-rate (hastighed)" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Ændr hovedadgangskoden" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Kontrollér for opdateringer" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Ciphers" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Ryd" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Ryd seneste profiler" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Ryd terminal" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Udklipsholder" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Luk" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Luk og vis aldrig igen" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Luk fokuseret rude" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Luk andre faner" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Luk fane" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Luk faner til venstre" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Luk faner til højre" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "Luk vinduet efter lukningen af den sidste fane" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Farve" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Farvetema" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Farveskemaer" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Farver" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Kombinér alle faner til den aktuelle fane" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Kommandolinje" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "Kommandoens stdin/stdout bruges i stedet for en netværksforbindelse" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Kommandoer" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "Kompakt (ældre)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Konfig slettet" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Konfiguration downloadet" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Konfigurationsfil" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Konfigurationssynkronisering" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Konfiguration uploadet" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Konfigurationer" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Forbind via en proxyserver" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "Forbind til \"%s\"..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Opret forbindelse til en anden vært først og brug den som en proxy" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "Tilslutter" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Forbindelse" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "Forbindelse fejlede: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "Forbindelsens navn vil blive brugt i stedet" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Kontekstmenu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "Styrer mængden af mellemrum mellem elementer" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Kopieret" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Kopiér" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Kopiér nuværende sti" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Kopiér hele stien" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Kopiér ved markering" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Kopiér til udklipsholder" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Kopiér med formatering" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Kunne ikke dekryptere konfiguration" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Opret" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Opret mappe" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Nuværende" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Nuværende farvetema" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Nuværende værtsnøgle fingeraftryk" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Nuværende proces: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Markørens form" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Tilpasset" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "Brugerdefineret CSS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "Mørk tilstand" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Databits" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Fejlfinding" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Reducér den vandrette splitstørrelse" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Reducér den lodrette splitstørrelse" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "Standard \"Forbind til\"-type" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Standard profil for nye faner" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Standard profilindstillinger" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "Standardindstillinger" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "Standard for {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Slet" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "Slet \"{name}\"?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "Slet {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Slet hele linjen" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Slet næste ord" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Slet forrige ord" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "Slet konfigurationen på fjernsiden?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Slet gruppens profiler?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Slet dette script?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Slet indholdet i boksen?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Sletter" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Enhed" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Direkte" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Deaktivér" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Deaktiver dynamisk fanetitel" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Deaktivér GPU acceleration" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Deaktiveret" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Afbryd" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "Afbryd forbindelsen til {host}?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Vis på" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "Afbryd ikke" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Luk ikke" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Husk ikke" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "Markering med dobbeltklik vil stoppe ved disse tegn" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "Ned" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Download" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Duplikér" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Duplikér som administrator" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Duplikér fane" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Redigér" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Aktivér" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Aktivér automatisk installation af opdateringer, når de bliver tilgængelige." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Aktivér skrifttype ligaturer" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Aktivér global genvejstast (Ctrl-Space)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Aktiverer den eksperimentelle Windows ConPTY API" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Kryptér konfigurationsfil" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Slut på linjen" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Miljø" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Slet konfiguration" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Slet Boksen" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Fejl i {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Præcis match" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Eksempel:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Eksportér" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Skrifttype at falde tilbage på" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Filoverførsler" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "Fil: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Fast" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Fokusér alle ruder" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Fokusér alle ruder på én gang (broadcast)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Fokusér næste rude" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Fokusér forrige rude" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Fokusér ruden ovenover" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Fokusér ruden nedenfor" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Fokusér ruden til venstre" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Fokusér ruden til højre" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Skrifttype" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "Gennemtving CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "Gennemtving CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "Gennemtving LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Tvinger en specifik SSH agent forbindelsestype." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Glem" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Videresend port" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Videresendte porte" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "Fra farvetema" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "Fra tema" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Frontend" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Fuld" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Generel" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Hent" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Gå op" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Grøn" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Gruppe" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Hexadecimal" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Skjul lukkeknap for fane" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Skjul faneindeks" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Skjul vindue ved fokustab" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Hjemmeside" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Vært" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Værtsnøgle" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Verifikation af værtsnøgle" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Genvejstaster" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Ikon" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Hvis deaktiveret, vil kun brugerdefinerede profiler vises i profilvælgeren" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Ekkoer straks dit input lokalt" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "Input sendes mens du skriver" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Inputtilstand" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Installeret" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "Installation af opdateringen vil lukke alle faner og genstarte Tabby." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Interaktiv" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Ugyldig syntaks" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "Jump host" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Hop til næste ord" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Hop til forrige ord" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Behold" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Keep Alive interval (Millisekunder)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Nøgle" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Sprog" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "Sidste kendte fingeraftryk for værtsnøgle" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Start WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Start WinSCP for den aktuelle SSH-session" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Lær, hvordan du tillader Tabby at registrere ekstern shell's arbejdsmappe." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Venstre" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Lader shell'et håndtere Meta taster i stedet for operativsystemet" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Linje for linje" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Indlæser" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Indlæser konfigurationer..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Lokal" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Lokalt ekko" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Lokal terminal" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Login scripts" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Administrér profiler" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "Maks Keep Alive antal" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Maksimér den aktive rude" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Ændret den {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Flyt fane til venstre" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Flyt fane til højre" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Flyt til \"Ugrupperet\"" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Navn" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Navn på den nye konfiguration" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Indbygget" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Ny admin fane" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Ny konfiguration på {platform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Nyt element" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Nyt navn" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Ny profil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Nyt profilnavn" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Ny fane" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Ny fane: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Ny terminal" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Nyt vindue" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Ny med profil" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Næste fane" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Ingen farve" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Ingen modifikator" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Ingen" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Normal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Ikke fundet" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Underret ved aktivitet" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Underret ved afslutning" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Antal linjer i bufferen" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Slået fra" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Officiel" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "På GitHub Diskussioner" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Gennemsigtighed" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Åbn udviklingsværktøjer" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Åbn indstillinger" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Åbn indstillingsfane: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "Åbn SFTP-panel" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "Valgfri" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Indstillinger" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Orange" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "OS standard" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "OS standard ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "Output vises som hexdump" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "Output er vist som det er modtaget" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Outputtilstand" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Output nye linjer" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "Tilsidesæt X11-visning" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Overskriv ekstern og synkroniser" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "Overskriv konfigurationen på den eksterne side og start synkronisering?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "Overskriv den lokale konfiguration og start synkronisering?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Paritet" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "Delvis konfigurationssynkronisering er ikke muligt, når konfigurationen krypteres via Boksen." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "Adgangskode for en privat nøgle med hash {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Adgangskode" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Indsæt" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Indsæt fra udklipsholder" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Indsæt flere linjer?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Sti eller adresse på den lokale X11-socket" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Fastgør" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Plugins" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Pluginmappe" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Port" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Port åbnet" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Porte" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Tryk på en vilkårlig tast for at forbinde igen" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Tryk på tasten nu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Forhindrer utilsigtet lukning" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Forhindrer utilsigtet udførelse af indsatte kommandoer" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Forrige fane" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Private nøgler" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Proces fuldført" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Profilnavn" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Profiler" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Profiler og forbindelser" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Program" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Proxy kommando" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Lilla" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Placerer alle Tabby's konfiguration i boksen" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Hurtig tilslutning" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Afslut" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Rå socket forbindelse" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Seneste" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Genopret forbindelse" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Rød" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Regex" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Udgivelsesnoter" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "Husk i {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Ekstern" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Omdøb" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Genåben sidste fane" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Erstat" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Rapportér et problem" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Nulstil zoom" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Genstart nuværende seriel session" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Genstart nuværende SSH-session" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Genstart nuværende Telnet session" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Genstart app'en for at anvende ændringer" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "Højre" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "Højreklik" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Kør som administrator" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Gem" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Gem en adgangskode i nøgleringen" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Gem og anvend" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Gem som profil" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Gem layout som profil" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Gemt" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Gemt layout" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Rul terminal til bunden" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Søg" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Hemmelig synkroniseringstoken" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Vælg" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Vælg en basisprofil, der skal bruges som skabelon" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Vælg lagerplads" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Vælg profil" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Vælg profil eller indtast en adresse" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "Send bytes ved at skrive i hex-værdier" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Sender data en byte ad gangen" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Seriel" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Seriel forbindelse" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Seriel: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Opsæt hovedadgangskode" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Indstil adgangskode" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Angiv adgangskode" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Sæt Tabby som %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "Sæt til 0 for at deaktivere seneste profiler" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "" #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Indstillinger" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Shell" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Shell understøtter ikke detektion af aktuel sti" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Shell integration" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "Vis {type} profilvælger" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "Vis indbyggede profiler i vælgeren" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Vis konfigurationsfil" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Vis standardindstillinger" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "Vis rudeetiketter (til omarrangering)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Vis profilvælger" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Vis seneste profiler i vælgeren" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Vis udgivelsesnoter" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Vis serielle forbindelser" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Vis indhold i boksen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "Spring over MoTD/banner" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "Langsom feed" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "Snap'er vinduet til en side af skærmen" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "SOCKS proxy vært" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "SOCKS proxy port" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Kildekode" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Opdel" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Opdel i bunden" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Opdel til venstre" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Opdel til højre" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Opdel til toppen" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "SSH forbindelse" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "SSH forbindelsesstyring udføres nu gennem fanen \"Profiler og forbindelser\"" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "SSH adgangskode for {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "Opstart" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Stopbits" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Fjern" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Abonnér på opdateringer" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Skift profil" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Skift profil i den aktive rude" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Skifter terminal frontend implementering (eksperimentel)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Synkronisering" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Synkroniser automatisk" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Synkroniseringsvært" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Synkroniser genvejstaster" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Synkronisér Boksen" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Synkroniser vinduesindstillinger" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Fane {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Fane aktivitet" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby kunne ikke starte med dine plugins, så alle tredjeparts-plugins er blevet deaktiveret i denne session. Fejlen var:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Nyheder og opdateringer fra Tabby på Twitter" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Faner" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Placering af faner" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Fanebredde" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Telnet session" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Terminal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Terminalbaggrund" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Terminalklokke" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Tak fordi du har downloadet Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Tema" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Der er aktive filoverførsler" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Der er en gemt adgangskode til denne forbindelse" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Disse gælder for alle profiler af en given type" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Tynd" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Markér dette, hvis du oplever aliasing, ghosting eller andre visuelle problemer" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Skift fuldskærmstilstand" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "Toppen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Prøv igen" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Prøver gemt adgangskode" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Ugrupperet" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Afinstallér" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Ukendt" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Ukendt hemmelighed for typen {type} for {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Frigør" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "Op" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Opdatér" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Opgradér til {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Upload" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Upload som ny konfiguration" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Brug {altKeyName} som Meta tasten" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "Brug ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "Brugerstandard" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Brugernavn" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Brug forudindstillede adgangskode" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Boksen" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Boksen er en altid-krypteret beholder til hemmeligheder, såsom SSH-adgangskoder og private nøgleadgangskoder." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Boksen er tom" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Boksen er låst" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "Boksen er ikke konfigureret" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "Boksens master adgangskode skal indstilles for at tillade lagring af hemmeligheder" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Verificér værtsnøgler ved tilslutning" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Version" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Version: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Vibrancy" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Visuel" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Advar ved lukning af aktive forbindelser" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "Advarsel: Den eksterne værtsnøgle er pludselig ændret!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Vi indsamler kun dine Tabby og OS versioner." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Velkommen" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Nyheder" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "Når aktiveret, er links kun klikbare mens du holder denne tast nede" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Vindue" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Vinduesramme" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Windows 10 build 18309 eller derover anbefales til ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "WinSCP sti" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Ordseparatorer" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Arbejdsmappe" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Detektering af arbejdsmappe" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "WSL terminal understøtter kun TrueColor med ConPTY slået til" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "X11 videresendelse" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Gul" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "Du kan ændre det senere, men det er uopretteligt, hvis det glemmes." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "Du kunne være under et man-in-the-middle angreb lige nu, eller værtsnøglen kunne lige være blevet ændret." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Zoom ind" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Zoom ud" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "" ================================================ FILE: locale/de-DE.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: de\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: German\n" "Language: de_DE\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" läuft noch. Schließen?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} Kopie" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "Eine zweite Schriftart, die zur Darstellung von Zeichen verwendet wird, wenn in der Hauptschriftart Zeichen fehlen" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Alles abbrechen" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Schlüssel akzeptieren und merken" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Nur diesmal akzeptieren" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "Bedienungshilfen" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Acryl-Hintergrund" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Hinzufügen" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Port-Weiterleitung hinzufügen" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Privaten Schlüssel importieren" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Hinzufügen..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Zusätzlicher Abstand zwischen den Zeilen" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Erweitert" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Agent" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Agent-Weiterleitung" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Agent Pipe-Pfad" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Agenttyp" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Ermöglicht das Öffnen von .bat Dateien in Tabs, es kann Shells zum abstürzen führen" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Ermöglicht das schnelle Öffnen eines Terminals im ausgewählten Ordner" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "Immer dunkel" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Immer hell" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Darstellung" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Anwendung" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Programmeinstellungen" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Sind Sie sicher, dass Sie Tabby schließen möchten? Sie können diese Abfrage unter Einstellungen -> Fenster deaktivieren." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Sind Sie sicher?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Argumente" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Eine Frage stellen" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Vor dem Schließen des Browser-Tabs fragen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Hörbar" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Authentifizierungsmethode" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Autor" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Automatisch" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Ein Terminal beim Anwendungs-Start automatisch öffnen" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Automatisch" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Automatische Updates" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Änderungen automatisch hochladen und jede Minute nach Updates suchen" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Verfügbar" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Hintergrundtyp" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "Backspace-Tastenmodus" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Baudrate" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Beginn der Zeile" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Blinkender Cursor" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Blau" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Unschärfeeffekt" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Strichstärke Fettschrift" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Unten" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Sicheres einfügen (erfordert Shellunterstützung)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "Broadcast-Modus. Klicken Sie irgendwo zum Abbrechen." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Integriert" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Abbrechen" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Baudrate ändern" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Tab-Farbe ändern" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Hauptpasswort ändern" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Auf Aktualisierungen prüfen" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Verschlüsselungsverfahren" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Leeren" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Zuletzt benutzte Profile leeren" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Terminal leeren" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "Terminal nach Verbindung leeren" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Zwischenablage" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Schließen" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Schließen und nicht mehr anzeigen" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Fokussierten Bereich schließen" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Alle anderen Tabs schließen" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Tab schließen" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Alle linken Tabs schließen" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Alle rechten Tabs schließen" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "Fenster schließen, nachdem der letzte Tab geschlossen wurde" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Farbe" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Farbschema" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Farbschema" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Farben" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Alle Tabs in den aktuellen Tab kombinieren" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Kommandozeile" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "Die stdin/stdout des Kommandos wird anstelle einer Netzwerkverbindung verwendet" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Befehle" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "Kompakt (alte Version)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Konfiguration gelöscht" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Konfigurationsdatei heruntergeladen" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Konfigurationsdatei" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Konfiguration synchronisieren" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Konfiguration hochgeladen" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Konfigurationen" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Über einen Proxy-Server verbinden" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "Mit \"%s\" verbinden..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Zuerst mit einem anderen Host verbinden, um diesen als Proxy zu nutzen" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "Verbinde" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Verbindung" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "Verbindung fehlgeschlagen: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "Stattdessen wird der Verbindungsname verwendet" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Kontextmenü" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "Legt den Abstand zwischen den Elementen fest" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Kopiert" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Kopieren" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Aktuellen Pfad kopieren" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Vollständigen Pfad kopieren" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Bei Auswahl kopieren" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "In die Zwischenablage kopieren" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Mit Formatierung kopieren" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Konfiguration konnte nicht entschlüsselt werden" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Erstellen" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Verzeichnis erstellen" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Aktuell" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Aktuelles Farbschema" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Aktueller Host-Schlüssel-Fingerabdruck" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Aktueller Prozess: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Cursorform" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Benutzerdefiniert" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "Benutzerdefiniertes CSS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "Dunkler Modus" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Datenbits" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Fehlersuche" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Größe der horizontalen Teilung verringern" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Größe der vertikalen Teilung verringern" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "Standards Verbindungstyp" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "Standard Verbindung für Schnellverbanbindungen (z.B. SSH, Telnet)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Standardprofil für neue Tabs" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "Sandart Profil Gruppeneinstellungen" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Standard-Profileinstellungen" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "Standardwerte" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "Standardwerte für {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Löschen" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "\"{name}\" löschen?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "{fullPath} löschen?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Gesamte Zeile löschen" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Nächstes Wort löschen" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Vorheriges Wort löschen" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "Die Konfiguration auf der entfernten Seite löschen?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Profile der Gruppe löschen?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Dieses Skript löschen?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Tresor Inhalt löschen?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Lösche" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Gerät" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Direkt" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Deaktivieren" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Dynamischen Tab-Titel deaktivieren" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "Transparenten Hintergrund beim Ziehen des Fensters deaktivieren" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Grafikkarten-Beschleunigung deaktivieren" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Deaktiviert" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Verbindung trennen" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "Aktuelle Tab Verbindung trennen (Serial/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "Von {host} trennen?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Grafiken mittels Sixel Escape-Sequenzen anzeigen" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Anzeigen auf" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "Nicht abbrechen" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Nicht schließen" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Nicht merken" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "Immer oben andocken" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "Terminal andocken" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "Größe des angedockten Terminals" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "Breite des angedockten Terminals" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "Andocken" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "Doppelklick-Auswahl wird bei diesen Zeichen beendet" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "Unten" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Herunterladen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Zeige fett geschriebenen Text in hellen Farben" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Duplizieren" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Als Administrator duplizieren" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Tab duplizieren" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Bearbeiten" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Lokal bearbeiten" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Aktivieren" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Anonyme Nutzungsdaten senden" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "Animationen aktivieren" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Automatische Installation von Updates aktivieren, wenn diese verfügbar sind." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "Fluent Hintergrund-Option aktivieren" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Schrift-Ligaturen aktivieren" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Globale Tastenkombination aktivieren (Ctrl-Leerzeichen)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Aktiviert die experimentelle Windows ConPTY API" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Konfigurationsdatei verschlüsseln" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Ende der Zeile" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Umgebung" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Konfiguration löschen" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Tresor leeren" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Fehler in {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Genaue Übereinstimmung" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Beispiel:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "Experimenteller Windows 10 Hintergrund-Stil (bekannt für Probleme)" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Exportieren" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Alternative Schriftart" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Dateiübertragung" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "Datei: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "Filter" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Fest" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Der transparente Hintergrund führt manchmal zum Stottern" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Alle Bereiche fokussieren" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Alle Bereiche gleichzeitig fokussieren (Broadcast)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "Alle Tabs fokussieren" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "Alle Tabs gleichzeitig fokussieren (Broadcast)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "Fokus folgt der Maus" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Nächsten Bereich fokussieren" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "Fokusbereich {number}" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Vorherigen Bereich fokussieren" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Den darüberliegenden Bereich fokussieren" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Den darunterliegenden Bereich fokussieren" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Fokussiere den Bereich links" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Fokussiere den Bereich rechts" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "An Farbschema halten" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Schriftart" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "Für Tastenkombinationen" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "CR erzwingen" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "CRLF erzwingen" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "LF erzwingen" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Erzwingt einen bestimmten SSH-Agenten-Verbindungstyp." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Löschen" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Port weiterleiten" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Weitergeleitete Ports" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "Aus dem Farbschema" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "Vom System" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "Aus dem Theme" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Frontend" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Alle" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Allgemein" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Ein vorausgefülltes GitHub Ticket erzeugen" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Herunterladen" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Holen Sie es sich aus dem Einstellungen-Fenster der Tabby-Web-App" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Gibt dem Fenster einen verschwommenen transparenten Hintergrund" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Nach oben" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Grün" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Gruppe" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "Problembehandlung" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "Hilf dabei, die Anzahl der Tabby-Installationen auf der ganzen Welt zu verfolgen!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Hilf Tabby zu übersetzen" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Hexadezimal" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "Verbergen" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Tab Schließen verbergen" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Tab-Nummer ausblenden" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "Tab Optionen ausblenden" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Fenster beim Fokusverlust ausblenden" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "Versteckt das angedockte Terminal, wenn Sie woanders klicken." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Homepage" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Host" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Hostschlüssel" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Hostschlüssel Verifizierung" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Tastenkombinationen" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "Wie sich Tabby durch Umgebungsvarianten präsentiert" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "HTTP-Proxy" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "HTTP-Proxy-Host" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "HTTP-Proxy-Port" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Symbol" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "Dynamisch" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Wenn deaktiviert, werden nur benutzerdefinierte Profile in der Profilauswahl angezeigt" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Gibt die Eingabe sofort lokal wieder" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "Größe der horizontalen Teilung vergrößern" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "Größe der vertikalen Teilung vergrößern" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "Eingabe" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "Eingabe wird beim Tippen gesendet" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Eingabemodus" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "Eingehende Zeilenumbrüche" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Installiert" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "Das Installieren des Updates schließt alle Tabs und startet Tabby neu." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "Intelligente Strg-C (Kopieren/Abbrechen)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Interaktiv" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Ungültige Syntax" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "Jump-Host" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Zum nächsten Wort springen" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Zum vorherigen Wort springen" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Behalten" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Aktivitäts Intervall (Millisekunden)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "Angedocktes Terminal immer oben halten" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Schlüssel" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "Schlüsselaustausch" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Tastatur" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "Tastatur-interaktive Authentifizierung" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "Beenden erzwingen" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Sprache" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "Letzter bekannter Host-Schlüssel-Fingerabdruck" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Starte WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Starte WinSCP für die aktuelle SSH-Sitzung" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Erfahren Sie, wie Sie Tabby das Arbeitsverzeichnis von Remote Sitzung erkennen lassen können." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Links" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Ermöglicht der Shell das reagieren auf die Meta-Taste statt des Betriebssystems" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "Heller Modus" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Zeile für Zeile" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Zeileneditor, Eingabe wird nach Drücken der Eingabetaste gesendet" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Zeilenabstand" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Wird geladen" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Lade Konfigurationen..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Lokal" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Lokales Echo" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Lokales Terminal" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Login-Skripte" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Langer-Klick für Kontextmenü" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Profile verwalten" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "Maximale Anzahl der Aktivitätsintervallen" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Aktiven Bereich maximieren" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "Minimales Kontrastverhältnis" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Geändert am {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "Maus" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Tab nach links verschieben" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Tab nach rechts verschieben" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Nach \"Ungruppiert\" verschieben" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "Wenn Sie die Maus über ein inaktives Fenster bewegen, wird es aktiviert" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Name" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Name für die neue Konfiguration" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "Name des neuen Verzeichnis" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Nativ" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "Neu" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Neues Admin Tab" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Neue Konfiguration auf {platform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "Neuer Gruppenname" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Neuer Eintrag" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Neuer Name" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Neues Profil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "Neues Gruppenprofil" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Neuer Profilname" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Neuer Tab" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Neues Tab: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Neues Terminal" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Neues Fenster" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "Neues Fenster" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Neu mit Profil" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Nächster Tab" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Keine Farbe" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Kein Modifikator" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Keine" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Normal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "Strichstärke Normalschrift" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Nicht gefunden" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Bei Aktivität benachrichtigen" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Benachrichtigen, wenn erledigt" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Anzahl der Zeilen im Puffer" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Aus" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Offiziell" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "Auf GitHub Discussions" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "Tab nur schließen, wenn die Sitzung beendet wird" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Transparenz" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Entwicklerwerkzeuge öffnen" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Einstellungen öffnen" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Einstellungen öffnen: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "SFTP-Panel öffnen" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "Optional" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Optionen" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Orange" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "Betriebssystem-Standard" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "Betriebssystem-Standard ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "Ausgabe wird als Hexdump angezeigt" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "Ausgabe wird angezeigt, wie sie empfangen wird" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Ausgabemodus" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Ausgehende Zeilenumbrüche" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "X11-Display überschreiben" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "Lokal überschreiben und synchronisieren" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Remote überschreiben und synchronisieren" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "Die Remote Konfiguration überschreiben und mit der Synchronisierung beginnen?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "Die lokale Konfiguration überschreiben und mit der Synchronisierung beginnen?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "Bereichsgrößenveränderungsschritt" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "Bereiche" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "Paper (Vorgängerversion)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Parität" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "Teilweise Konfigurations-Synchronisation ist nicht möglich, wenn die Konfiguration verschlüsselt ist." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "Pass-through" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "Passwort für einen privaten Schlüssel mit Hash {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Passwort" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Einfügen" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Aus Zwischenablage einfügen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "Einfügen, wenn keine Auswahl, sonst kopieren" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Mehrere Zeilen einfügen?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "Beim Mittel-Klick einfügen" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Pfad oder Adresse des lokalen X11-Sockets" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Anheften" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Erweiterungen" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Ordner der Erweiterungen öffnen" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Port" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Port geöffnet" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Ports" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Drücken Sie eine Taste zum erneuten Verbinden" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Drücken Sie jetzt die Taste" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Verhindert versehentliches Schließen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Verhindert versehentliche Ausführung von eingefügten Befehlen" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Vorheriger Tab" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Privater Schlüssel" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Prozess abgeschlossen" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Profilname" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Profile" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Profile & Verbindungen" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Programm" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Proxy-Befehl" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Lila" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Die gesamte Tabby-Konfiguration in den Tresor speichern" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Schnellverbindung" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Beenden" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Raw Socket-Verbindung" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "Timeout (Millisekunden)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Neueste" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Neu verbinden" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "Verbindung zum aktuellen Tab wiederaufnehmen (Serial/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Rot" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Regex" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Versionshinweise" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "{time} lang merken" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Remote" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "Leerzeichen und Zeilenumbrüche um den kopierten Text entfernen" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Umbenennen" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "Tab umbenennen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "Darstellung" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Letzten Tab neu öffnen" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Ersetzen" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Ein Problem melden" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "Eine Taste zum öffnen von Links benötigen" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Vergrößerung zurücksetzen" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Aktuelle serielle Sitzung neu starten" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Aktuelle SSH-Sitzung neu starten" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Aktuelle Telnet-Sitzung neu starten" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "Tab neu starten" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Anwendung neu starten, um Änderungen zu übernehmen" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "Standard Einstellungen wiederherstellen?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "Standard Einstellungen wiederherstellen?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "Terminal-Tabs beim Anwendungs-Start wiederherstellen" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "Sitzung für mehrere Tabs wiederverwenden" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "Rechts" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "Rechtsklick" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Als Administrator ausführen" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Speichern" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Passwort im Schlüsselbund sichern" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Speichern und anwenden" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Als Profil speichern" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Layout als Profil speichern" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Gespeichert" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Gespeichertes Layout" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "Scrollen bei Eingabe" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "Scrolle Terminal eine Seite nach unten" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "Scrolle Terminal eine Seite nach oben" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Terminal nach unten scrollen" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "Terminal zum Anfang scrollen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "Scrollback" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "Scrollt das Terminal bei Benutzereingabe nach unten" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Suche" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Farbschemen durchsuchen" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "Tastenkombinationen durchsuchen" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "Plugins durchsuchen" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Geheimes Sync-Token" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Auswählen" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Wählen Sie ein Basis-Profil als Vorlage" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "Alle auswählen" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Verzeichnis auswählen" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Profil auswählen" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Profil auswählen oder Adresse eingeben" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "Sende Bytes durch Eingabe von Hex-Werten" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Sendet Daten Byte für Byte" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Seriell" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Serielle Verbindung" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Serielle Verbindung: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Hauptpasswort festlegen" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Passwort festlegen" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Passwort festlegen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Tabby als %COMSPEC% setzen" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "Auf 0 setzen, um die zuletzt benutzten Profile zu deaktivieren" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "Legt den Pfad des SSH-Agenten-Pipes fest." #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Einstellungen" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Shell" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Shell unterstützt keine aktuelle Pfaderkennung" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Shell-Integration" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "Anzeigen" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "Zeige {type} Profilauswahl" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "Beim Einfügen mehrerer Zeilen eine Bestätigungsbox anzeigen" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "Integrierte Profile im Selektor anzeigen" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "Befehlsauswahl anzeigen" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Konfigurationsdatei im Dateibrowser anzeigen" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Standardwerte anzeigen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Mixer anzeigen" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "Bereichnamen anzeigen (für Neuanordnung)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Profilsymbol im Tab anzeigen" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Profilauswahl anzeigen" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Zuletzt benutzte Profile im Selektor anzeigen" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Versionshinweise anzeigen" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Serielle Verbindungen anzeigen" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "Tabs im Vollbildmodus anzeigen" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "Symbolleiste anzeigen" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Tresor Inhalt anzeigen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Sixel Grafikunterstützung (experimentell)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "MoTD/Banner überspringen" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "Langsamer Feed" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "Einrasten des Fensters an einer Seite des Bildschirms" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "SOCKS-Proxy" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "SOCKS-Proxy-Host" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "SOCKS-Proxy-Port" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "Töne" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Quellcode" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "Platzhalter" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Teilen" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Nach unten teilen" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "Nach unten teilen" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Nach links teilen" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Nach rechts teilen" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Nach oben teilen" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "Nach oben teilen" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "SSH-Verbindung" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "SSH-Verbindungsverwaltung erfolgt nun über die Registerkarte \"Profile & Verbindungen\"" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "SSH-Passwort für {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "Standard (alte Version)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "Beim Start" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Stoppbits" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Entfernen" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Updates abonnieren" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Ersetzungen erlaubt." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "Farbschema wechseln" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Profil wechseln" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Profil im aktiven Bereich wechseln" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Umschaltung der Frontend-Implementierung (experimentell)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Synchronisierung" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Automatisch synchronisieren" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Synchronisiere Host" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Tastenkombination synchronisieren" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Tresor synchronisieren" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Fenster Einstellungen synchronisieren" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Tab {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Tab Aktivität" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby konnte nicht mit deinen Plugins starten, so dass alle Plugins von Dritten in dieser Sitzung deaktiviert wurden. Der Fehler war:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Nachrichten und Updates von Tabby auf Twitter" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Tabs" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Tab Position " #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Tab Breite" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Telnet-Sitzung" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Terminal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Terminal-Hintergrund" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Terminal Glocke" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "Terminal-Identifikation" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Vielen Dank, dass Sie Tabby heruntergeladen haben!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Theme" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Es gibt aktive Dateiübertragungen" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Es gibt ein gespeichertes Passwort für diese Verbindung" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Diese gelten für alle Profile eines bestimmten Typs" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "Diese gelten für alle Profile eines bestimmten Typs in dieser Gruppe" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Dünn" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Aktivieren Sie dies, wenn Sie visuelle Probleme haben" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Vollbildmodus umschalten" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "Zum letzten Tab wechseln" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Terminalfenster umschalten" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Schaltet die Sichtbarkeit des Tabby-Fensters um" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "Oben" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "Leerzeichen und Zeilenumbrüche kürzen" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Erneut versuchen" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Versuche gespeichertes Passwort" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "Aktuelle Teilbereiche in separate Tabs verwandeln" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Nicht gruppiert" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Deinstallieren" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Unbekannt" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Unbekanntes Geheimnis des Typs {type} für {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Lösen" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "Hoch" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Aktualisieren" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Aktualisieren auf Version {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Hochladen" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Als neue Konfiguration hochladen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "{altKeyName} als Meta-Taste verwenden" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "ConPTY verwenden" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "Benutzer Standard" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Benutzername" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "Mit der CONNECT-Methode" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Vorgegebenes Passwort wird verwendet" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Tresor" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Der Tresor ist ein immer verschlüsselter Container für SSH-Passwörter und private Schlüssel." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Tresor ist leer" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Tresor ist gesperrt" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "Tresor ist nicht konfiguriert" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "Tresor Hauptpasswort muss gesetzt werden, um Einträge speichern zu können" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Hostschlüssel bei Verbindung überprüfen" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Version" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Version: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Vibrancy" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Optisch" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Beim mehrzeiligen Einfügen warnen" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Warnung beim Schließen aktiver Verbindungen" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "Warnung: Der Schlüssel des entfernten Hosts hat sich plötzlich geändert!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Wir analysieren nur Ihre Tabby- und Betriebssystem-Versionen." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Willkommen" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Was gibt's Neues?" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "Wenn eine Sitzung endet" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "Wenn aktiviert, sind Links nur anklickbar, während Sie diese Taste gedrückt halten" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "Wenn WinSCP erkannt wird, können Sie eine SCP-Sitzung aus dem Kontextmenü starten." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "Ob ein benutzerdefiniertes Fenster- oder das Fenster Layout des Betriebssystems verwendet werden soll" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "Verhindert, dass die SSH-Begrüßung angezeigt wird" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Fenster" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "Fenstergröße entlang am Rand" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "Fenstergröße weg vom Rand" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Fensterrahmen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "Windows" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Windows 10 Build 18309 oder höher wird für ConPTY empfohlen" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "WinSCP-Pfad" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Worttrennzeichen" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Arbeitsverzeichnis" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Arbeitsverzeichniserkennung" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "WSL-Terminal Glocke kann nur über Lautstärkeregler abgeschaltet werden" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "WSL-Terminal unterstützt TrueColor nur mit ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "X11-Weiterleitung" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Gelb" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "Du kannst es später ändern, aber es lässt sich nicht wiederherstellen wenn vergessen." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "Sie könnten gerade Opfer eines Man-in-the-Middle-Angriffs sein oder der Host-Schlüssel könnte gerade geändert worden sein." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Hineinzoomen" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Herauszoomen" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "Dynamisch" ================================================ FILE: locale/en-GB.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: en-GB\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: English, United Kingdom\n" "Language: en_GB\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "" #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Change tab colour" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Colour" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Colour scheme" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Colour schemes" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Colours" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Current colour scheme" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Draw bold text in bright colours" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "Follow the colour scheme" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "From colour scheme" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "Dynamic" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "" #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Maximise the active pane" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "No colour" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "Pane resize step" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "" #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Search colour schemes" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "" #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "Switch colour scheme" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "" #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "" #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "Dynamic" ================================================ FILE: locale/en-US.po ================================================ msgid "id.port-forwarding.dynamic" msgstr "Dynamic" msgid "id.tab-width.dynamic" msgstr "Dynamic" ================================================ FILE: locale/es-ES.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: es-ES\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Spanish\n" "Language: es_ES\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" se sigue ejecutando. ¿Cerrar?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} copiar" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "Una familia tipográfica secundaria usada para mostrar los caracteres faltantes en la principal" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Abortar todo" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Aceptar y recordar clave" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Aceptar solo esta vez" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "Accesibilidad" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Fondo acrílico" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Añadir" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Agregar un puerto de reenvío" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Añadir una clave privada" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Añadir..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Espacio adicional entre líneas" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Avanzado" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Agente" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Reenvío del agente" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Ruta de la tubería del agente" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Tipo de agente" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Permite abrir archivos .bat en pestañas, pero rompe algunas shells" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Permite abrir rápidamente un terminal en la carpeta seleccionada" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "Siempre a oscuras" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Siempre ligero" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Apariencia" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Aplicación" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Ajustes de la aplicación" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "¿Está seguro de que desea cerrar Tabby? Puede desactivar este mensaje en Ajustes -> Ventana." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "¿Estás seguro?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Argumentos" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Hacer una pregunta" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Preguntar antes de cerrar la pestaña del navegador" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Audible" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Método de autenticación" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Autor" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Auto" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Autoabrir un terminal al iniciar la aplicación" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Automático" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Actualizaciones automáticas" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Cargar automáticamente los cambios y comprobar si hay actualizaciones cada minuto" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Disponible" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Tipo de fondo" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "Modo de tecla de retroceso" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Velocidad en baudios" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Inicio de la línea" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Parpadear cursor" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Azul" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Desenfoque" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Peso de la fuente en negrita" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Inferior" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Pegar con corchetes (requiere soporte de shell)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "Modo de transmisión. Haga clic en cualquier lugar para cancelar." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Integrado" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Cancelar" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Cambiar la velocidad en baudios" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Cambiar color de pestaña" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Cambiar la contraseña maestra" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Buscar actualizaciones" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Cifrados" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Limpiar" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Limpiar los perfiles recientes" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Limpiar terminal" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "Limpiar el terminal al cerrar la conexión" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Portapapeles" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Cerrar" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Cerrar y no mostrar de nuevo" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Cerrar el panel enfocado" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Cerrar el resto de pestañas" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Cerrar pestaña" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Cerrar las pestañas de la izquierda" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Cerrar las pestañas de la derecha" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "Cerrar la ventana después de cerrar la última pestaña" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Color" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Esquema de color" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Esquemas de color" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Colores" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Combinar todas las pestañas en la pestaña actual" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Línea de comandos" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "El stdin/stdout del comando se utiliza en lugar de una conexión de red" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Comandos" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "Compacto (heredado)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Configuración eliminada" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Configuración descargada" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Archivo de configuración" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Sincronizar configuración" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Configuración subida" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Configuraciones" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Conectar a través de un servidor proxy" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "Conectarse a %s..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Conectarse primero a un host diferente y utilizarlo como proxy" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "Conectando" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Conexión" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "Conexión fallida: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "El nombre de la conexión se utilizará en su lugar" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Menú contextual" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "Controla la cantidad de espacio entre los elementos" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Copiado" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Copiar" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Copiar la ruta actual" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Copiar ruta completa" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Copiar al seleccionar" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Copiar al portapapeles" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Copiar con formato" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "No se ha podido descifrar la configuración" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Crear" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Crear directorio" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Actual" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Esquema de color actual" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Huella actual de la clave de host" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Proceso actual: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Forma del cursor" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Personalizado" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "CSS personalizado" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "Modo oscuro" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Bits de datos" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Depuración" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Reducir tamaño de división horizontal" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Reducir tamaño de división vertical" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "Tipo predeterminado \"Conectar a\"" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "Tipo de conexión predeterminado utilizado por la función de conexión rápida (por ejemplo, SSH, Telnet)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Perfil predeterminado para nuevas pestañas" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "Configuración predeterminada del grupo de perfiles" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Configuración de perfil predeterminada" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "Valores predeterminados" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "Valores predeterminados para {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Borrar" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "¿Eliminar \"{name}\"?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "¿Eliminar la ruta {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Borrar toda la línea" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Eliminar la siguiente palabra" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Eliminar palabra anterior" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "¿Eliminar la configuración del lado remoto?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "¿Eliminar los perfiles del grupo?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "¿Eliminar este código?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "¿Eliminar el contenido de vault?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Eliminando" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Dispositivo" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Directo" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Deshabilitar" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Deshabilitar el título de la pestaña dinámica" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "Desactivar el fondo de fluidez mientras arrastra" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Deshabilitar la aceleración de GPU" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Deshabilitado" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Desconectar" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "Desconectar pestaña actual (Serial/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "¿Desconectarse desde {host}?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Mostrar imágenes a través de secuencias de escape Sixel" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Mostrar en pantalla" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "No abortar" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "No cerrar" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "No recordar" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "Acoplar siempre en la parte superior" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "Acoplar la terminal" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "Tamaño de la terminal acoplada" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "Espacio de la terminal acoplada" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "Acoplamiento" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "La selección con doble clic se detendrá en estos caracteres" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "Abajo" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Descargar" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Mostrar texto en negrita en colores brillantes" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Duplicar" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Duplicar como administrador" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Duplicar pestaña" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Editar" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Editar localmente" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Habilitar" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Habilitar analíticas" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "Activar animaciones" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Habilitar la instalación automática de actualizaciones cuando estén disponibles." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "Activar la opción de fondo de fluido" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Habilitar ligaduras de fuentes" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Habilitar tecla de acceso rápido (Ctrl-Space)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Habilitar la API experimental de Windows ConPTY" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Cifrar el archivo de configuración" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Fin de la línea" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Entorno" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Borrar configuración" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Borrar la Vault" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Error en {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Coincidencia exacta" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Ejemplo:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "Se sabe que el estilo de fondo experimental de Windows 10 causa problemas" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Exportar" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Fuente alternativa" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Transferencias de archivos" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "Archivo: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "Filtro" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Solucionado" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Fondo fluido a veces causa retraso de arrastre" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Enfocar todos los paneles" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Enfocar todos los paneles a la vez (transmitir)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "Enfocar todas las pestañas" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "Enfocar todas las pestañas a la vez (transmisión)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "El foco sigue al ratón" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Enfocar el siguiente panel" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "Panel de enfoque {number}" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Enfocar el panel anterior" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Enfocar el panel de arriba" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Enfocar el panel de abajo" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Central el panel de la izquierda" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Central el panel de la derecha" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "Seguir el esquema de colores" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Fuente" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "Para atajos de teclado" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "Forzar CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "Forzar CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "Forzar LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Forzar un tipo de conexión de agente SSH específico." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Olvidar" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Puerto de reenvío" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Puertos reenviados" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "Desde un color de esquema" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "Del sistema" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "Desde el tema" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Interfaz" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Completo" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "General" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Generar un problema de GitHub precargado" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Obtener" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Obtenerlo desde la ventana de configuración de Tabby" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Le da a la ventana un fondo transparente borroso" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Ir arriba" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Verde" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Grupo" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "Hacks" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "¡Ayuda a rastrear la cantidad de instalaciones de Tabby en todo el mundo!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Ayuda a traducir Tabby" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Hexadecimal" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "Ocultar" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Ocultar botón de cierre de pestaña" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Ocultar índice de pestaña" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "Ocultar botón de opciones de pestaña" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Ocultar ventana al perder enfoque" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "Oculta la terminal acoplada cuando hagas clic fuera." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Página de inicio" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Anfitrión" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Clave de anfitrión" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Verificación de clave de host" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Teclas de acceso rápido" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "Cómo Tabby se presenta a través de las variables de entorno" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "Proxy HTTP" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "Host proxy HTTP" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "Puerto de proxy HTTP" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Ícono" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "id.tab-width.dynamic" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Si está deshabilitado, solo se mostrarán perfiles personalizados en el selector de perfil" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Inmediatamente hace echo de tu entrada localmente" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "Aumentar tamaño de división horizontal" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "Aumentar tamaño de división vertical" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "Entrada" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "La entrada se envía mientras escribes" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Modo de entrada" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "Entrada de nuevas líneas" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Instalado" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "La instalación de la actualización cerrará todas las pestañas y reiniciará Tabby." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "Ctrl-C inteligente (copiar/abortar)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Interactivo" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Sintáxis inválida" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "Saltar host" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Saltar a la siguiente palabra" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Saltar a la palabra anterior" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Mantener" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Mantener vivo el intervalo (Milisegundos)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "Mantener la terminal acoplada siempre encima" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Clave" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "Intercambio de llaves" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Teclado" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "Autenticación interactiva con teclado" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "Terminar" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Idioma" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "Última huella de clave de host conocida" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Iniciar WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Iniciar WinSCP para la sesión SSH actual" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Aprende cómo permitir que Tabby detecte el directorio de trabajo remoto de la shell." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Izquierda" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Permita que la shell maneje la tecla Meta en lugar del sistema operativo" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "Modo claro" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Línea por línea" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Editor de línea, la entrada se envía después de pulsar Enter" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Relleno de línea" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Cargando" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Cargando configuraciones..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Local" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Eco local" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Terminal local" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Código de acceso" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Clic extendido para el menú contextual" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Administrar perfiles" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "Cantidad máxima de mantenimiento vivo" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Maximiza el panel activo" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "Ratio de contraste mínimo" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Modificado el {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "Ratón" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Mover pestaña a la izquierda" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Mover pestaña a la derecha" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Mover a \"Desagrupado\"" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "Al mover el ratón sobre un panel inactivo se activará" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Nombre" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Nombre para la nueva configuración" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "Nombre para el nuevo directorio" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Nativo" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "Nuevo" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Nueva pestaña de administración" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Nueva configuración en {platform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "Nuevo nombre del grupo" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Nuevo elemento" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Nuevo nombre" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Nuevo perfil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "Nuevo grupo de perfiles" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Nuevo nombre de perfil" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Nueva pestaña" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Nueva pestaña: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Nuevo terminal" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Nueva ventana" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "Nueva ventana" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Nuevo con perfil" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Siguiente pestaña" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Sin color" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Sin modificador" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Ninguno" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Normal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "Peso de fuente normal" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "No encontrado" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Notificar sobre la actividad" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Notificar cuando termine" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Número de líneas guardadas en el búfer" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Apagado" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Oficial" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "En discusiones de GitHub" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "Cierre la pestaña solo cuando la sesión finalice explícitamente" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Opacidad" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Abrir Herramientas de Desarrollo" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Abrir Ajustes" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Abrir pestaña de ajustes: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "Abrir panel SFTP" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "Opcional" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Opciones" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Naranja" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "SO predeterminado" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "SO predeterminado ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "La salida se muestra como un volcado hexadecimal" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "La salida se muestra tal como se recibe" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Modo de salida" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Salida de nuevas líneas" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "Reemplazar pantalla X11" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "Sobrescribir local y sincronizar" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Sobrescribir remoto y sincronizar" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "¿Sobrescribir la configuración en el lado remoto y empezar a sincronizar?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "¿Sobrescribir la configuración local y empezar a sincronizar?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "Paso de redimensionado del panel" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "Paneles" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "Papel (heredado)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Paridad" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "La sincronización parcial de configuración no es posible cuando la configuración es cifrada a través de Vault." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "Pasado-por-clave" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "Contraseña para una clave privada con hash {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Contraseña" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Pegar" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Pegar desde el portapapeles" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "Pegar si no hay selección, sino copiar" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "¿Pegar múltiples líneas?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "Pegar con clic central" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Ruta o dirección del socket local X11" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Fijar" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Complementos" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Carpeta de complementos" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Puerto" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Puerto abierto" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Puertos" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Pulse cualquier tecla para reconectar" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Presiona la tecla ahora" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Previene cierre accidental" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Previene la ejecución de comandos pegados" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Pestaña anterior" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Claves privadas" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Proceso completado" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Nombre de perfil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Perfiles" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Perfiles y conexiones" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Programa" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Comando proxy" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Morado" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Poner toda la configuración de Tabby en la vault" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Conexión rápida" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Salir" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Conexión de socket sin procesar" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "Tiempo de espera listo (Milisegundos)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Reciente" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Reconectar" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "Reconecta la pestaña actual (Serial/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Rojo" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Regex" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Notas de lanzamiento" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "Recordar por {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Remoto" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "Eliminar espacios en blanco y nuevas líneas alrededor del texto copiado" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Renombrar" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "Renombrar pestaña" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "Renderizando" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Reabrir última pestaña" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Reemplazar" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Reportar un problema" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "Requerir una clave para hacer clic en enlaces" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Restablecer zoom" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Reiniciar la sesión en serie actual" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Reiniciar sesión SSH actual" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Reiniciar sesión Telnet actual" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "Reiniciar pestaña" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Reiniciar la aplicación para aplicar cambios" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "¿Restaurar los ajustes de fábrica?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "¿Restaurar los ajustes a los heredados por defecto?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "Restaurar pestañas de la terminar al iniciar la aplicación" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "Reutilizar sesión para múltiples pestañas" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "Derecha" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "Clic derecho" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Ejecutar como administrador" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Guardar" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Guardar una contraseña en el llavero" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Guardar y aplicar" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Guardar como perfil" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Guardar diseño como perfil" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Guardado" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Diseño guardado" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "Desplazarse al entrar" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "Desplazar terminal una página hacia abajo" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "Desplazar terminal una página arriba" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Desplazar terminal hacia abajo" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "Desplazar terminal hasta arriba" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "Retroceso" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "Desplaza el terminal hasta la parte inferior de la entrada del usuario" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Buscar" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Buscar esquemas de color" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "Buscar atajos" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "Buscar plugins" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Token secreto de sincronización" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Seleccionar" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Seleccione un perfil base para usar como plantilla" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "Seleccionar todo" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Seleccionar archivo de almacenamiento" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Seleccionar perfil" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Seleccionar perfil o introducir una dirección" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "Enviar bytes escribiendo en valores hexadecimales" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Envía datos de un byte a la vez" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Serial" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Conexión serial" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Serial: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Establecer contraseña maestra" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Establecer contraseña" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Establecer contraseña" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Establecer Tabby como %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "Establecer en 0 para desactivar perfiles recientes" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "Establece la ruta de la tubería nombrada por el agente SSH." #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Ajustes" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Escudo" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Shell no soporta la detección actual de rutas" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Integración con la Shell" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "Mostrar" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "Mostrar {type} selector de perfil" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "Mostrar un cuadro de confirmación al pegar múltiples líneas" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "Mostrar perfiles incorporados en el selector" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "Mostrar selector de comando" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Mostrar archivo de configuración" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Mostrar valores predeterminados" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Mostrar Mixer" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "Mostrar etiquetas de panel (para reordenar)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Mostrar icono de perfil en pestaña" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Mostrar selector de perfil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Mostrar perfiles recientes en el selector" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Mostrar notas del lanzamiento" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Mostrar conexiones Serial" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "Mostrar pestañas en modo de pantalla completa" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "Mostrar barra de herramientas" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Mostrar contenido de vault" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Soporte gráfico Sixel (experimental)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "Omitir MoTD/banner" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "Fuente lenta" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "Adherir la ventana a un lado de la pantalla" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "Servidor proxy SOCKS" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "Puerto proxy SOCKS" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "Sonido" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Código fuente" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "Espaciado" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Dividir" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Dividir en la parte inferior" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "Dividir hacia abajo" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Dividir a la izquierda" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Dividir a la derecha" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Dividir en la parte superior" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "Dividir hacia arriba" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "Conexión SSH" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "La gestión de conexiones SSH ahora se realiza a través de la pestaña \"Perfiles y conexiones\"" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "Contraseña SSH para {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "Estándar (heredado)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "Inicialización" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Bits de parada" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Franja" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Suscribirse a actualizaciones" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Sustituciones permitidas." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "Cambiar esquema de colores" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Cambiar perfil" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Cambiar perfil en panel activo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Cambia la implementación de interfaz de la terminal (experimental)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Sincronizar" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Sincronizar automáticamente" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Sincronizar host" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Sincronizar atajos" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Sincronizar Vault" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Sincronizar la configuración de la ventana" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Pestaña {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Actividad de la pestaña" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby no pudo iniciar con tus complementos, por lo que todos los complementos de terceros han sido deshabilitados en esta sesión. El error fue:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Noticias de Tabby y actualizaciones en Twitter" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Pestañas" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Ubicación de las pestañas" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Ancho de pestañas" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Sesión de Telnet" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Terminal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Fondo de la terminal" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Campana de la terminal" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "Identificación del Terminal" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "¡Gracias por descargar Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Tema" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Hay transferencias de archivos activas" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Hay una contraseña guardada para esta conexión" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Estos se aplican a todos los perfiles de un tipo determinado" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "Estos aplican a todos los perfiles de un tipo en este grupo" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Estrecho" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Marque esto si está experimentando aliasing, efecto fantasma u otros problemas visuales" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Alternar modo de pantalla completa" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "Alternar última pestaña" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Alternar ventana de la terminal" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Alterna la visibilidad de la ventana de Tabby" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "Top" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "Recortar espacios en blanco y nuevas líneas" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Reintentar" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Reintentar contraseña guardada" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "Convierte los paneles de pestañas actuales en pestañas separadas" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Desagrupado" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Desinstalar" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Desconocido" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Secreto desconocido de tipo {type} para {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Quitar fijado" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "Arriba" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Actualizar" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Actualizar a {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Cargar" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Subir como una nueva configuración" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Usar {altKeyName} como la tecla Meta" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "Usar ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "Usuario predeterminado" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Nombre de usuario" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "Usando método CONNECT" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Usando la contraseña preestablecida" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Caja fuerte" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Vault es un contenedor siempre cifrado para secretos tales como contraseñas SSH y contraseñas de clave privada." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Vault está vacio" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Vault está bloqueado" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "Vault no está configurado" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "La contraseña maestra de Vault debe estar establecida para permitir secretos" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Verificar las claves del host al conectar" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Versión" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Versión: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Vibración" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Visual" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Advertir al pegar múltiples líneas" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Advertir al cerrar conexiones activas" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "Advertencia: ¡la clave del host remoto ha cambiado repentinamente!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Solo estamos rastreando sus versiones de Tabby y SO." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Bienvenido" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Qué hay de nuevo" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "Cuando una sesión finalice" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "Cuando está habilitado, los enlaces sólo se pueden hacer clic mientras se mantiene presionada esta tecla" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "Cuando se detecta WinSCP, puede iniciar una sesión SCP desde el menú contextual." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "Si se debe usar una ventana personalizada o una ventana nativa del sistema operativo" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "Evitar que aparezca el mensaje de bienvenida SSH" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Ventana" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "Dimensión de la ventana a lo largo del borde" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "Dimensión de la ventana lejos del borde" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Marco de ventana" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "Ventanas" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Se recomienda Windows 10 build 18309 o superior para ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "Ruta WinSCP" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Separadores de palabra" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Directorio de trabajo" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Detección de directorio de trabajo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "La campana de la terminal WSL sólo puede silenciarse a través del Mezclador del Volumen" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "La terminal WSL sólo soporta TrueColor con ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "Reenvío X11" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Amarillo" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "Puedes cambiarlo más tarde, pero es irrecuperable si lo olvidas." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "Podría estar bajo un ataque de intermediario en este momento, o la clave de host podría haber sido cambiada." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Ampliar" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Alejar vista" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "id.port-forwarding.dynamic" ================================================ FILE: locale/fr-FR.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: fr\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: French\n" "Language: fr_FR\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" est toujours en cours d'exécution. Fermer ?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} - Copie" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "Second type de polices à utiliser pour afficher les caractères absents de la police principale" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Annuler tout" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Accepter et mémoriser la clé" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Accepter uniquement cette fois" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "Accessibilité" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Arrière-plan acrylique" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Ajouter" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Ajouter un transfert de port" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Ajouter une clé privée" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Ajouter ..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Espace additionnel entre les lignes" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Avancé" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Agent" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Transfert d'agent" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Chemin vers l'agent SSH" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Type d'agent" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Permet l'ouverture des fichiers .bat dans les onglets, mais brise certains terminaux" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Permet d'ouvrir rapidement un terminal dans le dossier sélectionné" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "Toujours sombre" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Toujours clair" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Apparence" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Application" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Paramètres de l'application" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Êtes-vous sûr de vouloir fermer Tabby ? Vous pouvez désactiver cette invite dans Paramètres -> Fenêtre." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Êtes-vous sûr(e) ?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Arguments" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Poser une question" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Demander avant de fermer l'onglet du navigateur" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Audible" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Méthode d'authentification" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Auteur" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Automatique" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Ouvrir automatiquement un terminal au démarrage de l'application" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Automatique" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Mettre à jour automatiquement" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Envoyer automatiquement les modifications et vérifier les mises à jour toutes les minutes" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Disponible" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Type d'arrière-plan" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "Mode de la touche Retour arrière" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Vitesse en bauds" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Début de la ligne" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Faire clignoter le curseur" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Bleu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Flouté" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Épaisseur de police en gras" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Bas" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Coller avec des parenthèses (l'interpréteur de commande doit le supporter)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "Mode diffusion. Cliquez n'importe où pour annuler." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Intégré" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Annuler" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Changer le débit en bauds" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Changer la couleur de l'onglet" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Changer le mot de passe maître" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Vérifier les mises à jour" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Chiffrements" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Effacer" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Effacer les profils récents" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Effacer le terminal" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "Effacer le terminal après la connexion" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Presse-papier" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Fermer" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Fermer et ne plus afficher" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Fermer le panneau actif" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Fermer les autres onglets" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Fermer l'onglet" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Fermer les onglets à gauche" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Fermer les onglets à droite" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "Fermer la fenêtre après la fermeture du dernier onglet" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Couleur" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Schéma de couleurs" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Modèles de couleur" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Couleurs" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Combiner tous les onglets dans l'onglet actuel" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Ligne de commande" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "L'entrée et la sortie standards sont utilisées à la place d'une connexion réseau" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Commandes" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "Compact (hérité)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Configuration supprimée" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Configuration téléchargée" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Fichier de configuration" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Synchronisation de la configuration" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Configuration téléversée" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Configurations" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Se connecter via un serveur proxy" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "Se connecter à \"%s\"..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Se connecte d'abord à un hôte différent et l'utilise comme proxy" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "Connexion en cours" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Connexion" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "Échec de la connexion : {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "Le nom de connexion sera utilisé à la place" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Menu contextuel" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "Contrôle la quantité d'espace entre les éléments" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Copié" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Copier" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Copier le chemin actuel" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Copier le chemin complet" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Copier lors de la sélection" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Copier dans le presse-papier" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Copier avec mise en forme" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Impossible de déchiffrer la configuration" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Créer" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Créer un répertoire" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Actif" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Schéma de couleurs actuel" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Empreinte de la clé de l'hôte courant" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Processus actuel : {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Forme du curseur" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Personnalisé" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "CSS personnalisé" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "Mode sombre" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Bits de données" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Débogage" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Diminuer la taille de la séparation horizontale" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Diminuer la taille de la séparation verticale" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "Type de connexion par défaut" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "Type de connexion par défaut utilisé par la fonction de connexion rapide (ex. SSH, Telnet)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Profil par défaut pour les nouveaux onglets" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "Paramètres par défaut du groupe de profil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Paramètres de profil par défaut" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "Par défaut" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "Par défaut pour {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Supprimer" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "Supprimer \"{name} \" ?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "Supprimer {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Supprimer toute la ligne" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Supprimer le mot suivant" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Supprimer le mot précédent" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "Supprimer la configuration du côté distant ?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Supprimer les profils du groupe ?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Supprimer ce script ?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Supprimer le contenu du coffre ?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Suppression en cours" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Périphérique" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Directe" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Désactiver" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Désactiver le titre dynamique des onglets" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "Désactiver l'arrière-plan fluide lors du déplacement" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Désactiver l'accélération GPU" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Désactivé" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Déconnecter" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "Déconnecter l'onglet actuel (Serial/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "Se déconnecter de {host}?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Affiche les images en mode Sixel" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Afficher sur" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "Ne pas interrompre" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Ne pas fermer" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Ne pas mémoriser" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "Toujours garder au premier plan" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "Ancrer le terminal" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "Taille du terminal ancré" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "Espace du terminal ancré" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "Ancrage" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "La sélection par double-clic s'arrêtera à ces caractères" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "Bas" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Télécharger" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Afficher le texte en gras avec des couleurs vives" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Dupliquer" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Dupliquer en tant qu'administrateur" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Dupliquer l'onglet" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Éditer" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Éditer en local" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Activer" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Activer la télémétrie" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "Activer les animations" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Activer l'installation automatique des mises à jour dès qu'elles sont disponibles." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "Activer l'option d'arrière-plan fluide" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Activer les ligatures de police" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Activer le raccourci clavier global (Ctrl-Space)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Active l'API expérimentale Windows ConPTY" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Chiffrer le fichier de configuration" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Fin de la ligne" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Environnement" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Effacer la configuration" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Effacer le coffre" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Erreur dans {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Correspondance exacte" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Exemple:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "Style d'arrière-plan expérimental de Windows 10 connu pour causer des problèmes" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Exporter" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Police de substitution" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Transferts de fichiers" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "Fichier : {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "Filtre" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Fixe" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "L'arrière-plan fluide provoque parfois des problèmes d'affichage" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Cibler tous les volets" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Cibler tous les volets à la fois (diffusion)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "Cibler tous les onglets" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "Cibler tous les onglets à la fois (diffusion)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "Le curseur suit la souris" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Focus sur le volet suivant" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "Sélectionner le volet {number}" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Focus sur le volet précédent" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Focus sur le volet au-dessus" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Focus sur le volet au-dessous" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Focus sur le volet à gauche" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Focus sur le volet à droite" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "Suivre le schéma de couleurs" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Police" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "Pour les raccourcis clavier" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "Forcer CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "Forcer CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "Forcer LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Force un type spécifique de connexion à l'agent SSH." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Oublier" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Transfert de port" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Ports transférés" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "Celui du schéma de couleurs" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "Depuis le système" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "Celui du thème" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Interface Utilisateur" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Complet" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Général" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Générer une issue GitHub pré-remplie" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Obtenir" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Obtenir depuis la fenêtre des paramètres Tabby Web" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Donne à la fenêtre un fond à la fois transparent et flouté" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Remonter" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Vert" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Groupe" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "Hacks" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "Aidez à suivre le nombre d'installations de Tabby à travers le monde !" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Aidez à traduire Tabby" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Hexadécimal" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "Masquer" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Masquer le bouton de fermeture de l'onglet" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Masquer la numérotation des onglets" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "Masquer le bouton d'options d'onglet" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Masquer la fenêtre en cas de perte de focus" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "Masque le terminal arrimé lorsque vous cliquez en dehors." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Page d'accueil" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Hôte" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Clé de l'hôte" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Vérification de la clé de l'hôte" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Raccourcis clavier" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "Comment Tabby se présente à travers les variables d'environnement" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "Proxy HTTP" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "Hôte proxy HTTP" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "Port du proxy HTTP" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Icône" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "Dynamique" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Si désactivé, seuls les profils personnalisés apparaîtront dans le sélecteur de profil" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Echo local immédiat des saisies clavier" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "Augmenter la taille de la séparation horizontale" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "Augmenter la taille de la séparation verticale" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "Saisir" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "La saisie est envoyée pendant la frappe" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Mode de saisie" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "Entrée de nouvelles lignes" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Installé" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "L'installation de la mise à jour fermera tous les onglets et redémarrera Tabby." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "Ctrl-C intelligent (copier/annuler)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Interactif" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Syntaxe non valide" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "Hôte de rebond" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Aller au mot suivant" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Aller au mot précédent" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Conserver" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Intervalle de signal de vie (millisecondes)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "Toujours garder au premier plan le terminal arrimé" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Clé" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "Échange de clés" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Clavier" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "Authentification interactive au clavier" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "Fermer" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Langue" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "Dernière empreinte de la clé d'hôte connue" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Lancer WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Lancer WinSCP pour la session SSH actuelle" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Apprenez comment permettre à Tabby de détecter le répertoire de travail distant." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Gauche" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Laisser le shell gérer la Méta Key à la place de l'OS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "Mode clair" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Ligne par ligne" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Éditeur de ligne, l'entrée est envoyée après avoir appuyé sur Entrée" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Interligne" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Chargement" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Chargement des configurations ..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Local" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Écho local" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Terminal local" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Scripts de connexion" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Clic long pour le menu contextuel" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Gérer les profils" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "Nombre maximum de signaux de vie" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Maximiser le volet actif" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "Ratio de contraste minimum" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Modifié le {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "Souris" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Déplacer l'onglet vers la gauche" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Déplacer l'onglet vers la droite" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Déplacer vers \"Dégroupé\"" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "Faire glisser la souris sur un volet inactif pour l'activer" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Nom" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Nom de la nouvelle configuration" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "Nom du nouveau répertoire" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Natif" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "Nouveau" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Nouvel onglet admin" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Nouvelle configuration sur {platform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "Nouveau nom de groupe" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Nouvel élément" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Nouveau nom" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Nouveau profil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "Nouveau groupe de profil" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Nom du nouveau profil" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Nouvel onglet" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Nouvel onglet: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Nouveau terminal" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Nouvelle fenêtre" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "Nouvelle fenêtre" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Nouveau avec profil" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Onglet suivant" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Aucune couleur" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Aucun modificateur" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Aucun" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Normal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "Épaisseur de police normale" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Non trouvé" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Notifier en cas d'activité" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Notifier une fois terminé" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Nombre de lignes conservées dans le tampon" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Désactivé" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Officiel" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "Sur les discussions GitHub" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "Fermer l'onglet uniquement lorsque la session est explicitement terminée" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Opacité" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Ouvrir les Outils Développeur" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Ouvrir les paramètres" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Ouvrir l'onglet Paramètres: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "Ouvrir le panneau SFTP" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "Optionnel" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Options" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Orange" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "Valeur par défaut de l'OS" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "Valeur par défaut de l'OS ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "La sortie est affichée comme un dump hexadécimal" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "La sortie est affichée telle qu'elle est reçue" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Mode de sortie" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Sortie des nouvelles lignes" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "Remplacer l'affichage X11" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "Écraser la configuration locale et synchroniser" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Écraser la configuration distante et synchroniser" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "Écraser la configuration distante et démarrer la synchronisation ?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "Écraser la configuration locale et démarrer la synchronisation ?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "Redimensionner le panneau avec ce pas" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "Panneaux" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "Papier (héritage)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Parité" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "La synchronisation partielle de la configuration n'est pas possible lorsque la configuration est dans le coffre chiffré." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "Passage à travers" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "Phrase de passe pour une clé privée avec le hachage {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Mot de passe" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Coller" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Coller depuis le presse-papier" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "Coller si rien n'est sélectionné, sinon copier" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Coller plusieurs lignes ?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "Coller avec le clic du milieu" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Chemin ou adresse du socket X11 local" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Épingler" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Extensions" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Dossier des extensions" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Port" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Port ouvert" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Ports" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Appuyez sur n'importe quelle touche pour vous reconnecter" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Appuyez sur la touche maintenant" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Empêche la fermeture accidentelle" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Empêche l'exécution accidentelle de commandes collées" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Onglet précédent" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Clés privées" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Processus terminé" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Nom du profil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Profils" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Profils et connexions" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Application" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Commande du proxy" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Violet" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Place toute la configuration de Tabby dans le coffre" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Connexion Rapide" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Quitter" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Connexion socket Raw" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "Délai d'attente (Millisecondes)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Récent" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Reconnecter" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "Reconnecter l'onglet actuel (Serial/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Rouge" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Expression régulière" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Notes de version" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "S'en souvenir pendant {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Distant" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "Supprimer les espaces et les sauts de lignes autour du texte copié" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Renommer" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "Renommer l’onglet" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "Rendu" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Rouvrir le dernier onglet" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Remplacer" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Signaler un problème" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "Presser une touche pour rendre les liens cliquables" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Réinitialiser le zoom" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Redémarrer la session série actuelle" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Redémarrer la session SSH actuelle" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Redémarrer la session Telnet actuelle" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "Redémarrer l'onglet" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Redémarrez l'application pour appliquer les modifications" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "Restaurer les paramètres par défaut ?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "Restaurer les paramètres par défaut hérités ?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "Restaurer les onglets ouverts au démarrage de l'application" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "Réutiliser la session pour plusieurs onglets" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "Droite" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "Clic droit" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Exécuter en tant qu'administrateur" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Enregistrer" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Enregistrer le mot de passe dans le coffre" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Enregistrer et appliquer" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Enregistrer en tant que profil" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Enregistrer la disposition en tant que profil" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Enregistré" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Disposition enregistrée" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "Défiler lors de la frappe" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "Défiler le terminal une page vers le bas" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "Défiler terminal une page vers le haut" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Défiler le terminal vers le bas" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "Défiler le terminal vers le haut" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "Tampon de défilement arrière" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "Descend en bas du terminal lors de la saisie utilisateur" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Rechercher" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Rechercher un schéma de couleurs" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "Rechercher dans les raccourcis" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "Rechercher dans les extensions" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Jeton secret de synchronisation" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Sélectionner" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Sélectionnez un profil de base à utiliser comme modèle" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "Tout sélectionner" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Sélectionner le stockage de fichiers" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Sélectionner un profil" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Sélectionnez un profil ou entrez une adresse" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "Envoyer des octets en tapant des valeurs hexadécimales" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Envoie des données un octet à la fois" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Port Série" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Connexion via Port Série" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Port Série: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Définir le mot de passe maître" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Définir la phrase secrète" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Définir le mot de passe" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Définir Tabby comme %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "Indiquer 0 pour désactiver les profils récents" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "Définit le chemin du named pipe de l'agent SSH." #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Paramètres" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Shell" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "L'interpréteur de commandes ne prend pas en charge la détection du chemin courant" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Intégration au menu contextuel" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "Afficher" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "Afficher le sélecteur de profil {type}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "Afficher une boîte de confirmation lors du collage de plusieurs lignes" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "Afficher les profils intégrés dans le sélecteur" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "Afficher le sélecteur de commande" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Ouvrir l'emplacement du fichier de configuration" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Afficher les valeurs par défaut" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Afficher le mixeur" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "Afficher les libellés du panneau (pour réorganiser)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Afficher l'icône de profil sur l'onglet" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Afficher le sélecteur de profil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Afficher les profils récents dans le sélecteur" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Afficher les notes de version" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Afficher les connexions série" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "Afficher les onglets en mode plein écran" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "Afficher la barre d'outils" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Afficher le contenu du coffre" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Mode Sixel supporté (expérimental)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "Ne pas afficher le message du jour (MoTD) ni la bannière" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "Avance lente" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "Colle la fenêtre sur un côté de l'écran" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "Hôte proxy SOCKS" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "Port proxy SOCKS" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "Son" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Code source" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "Espacement" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Diviser" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Diviser vers le bas" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "Diviser vers le bas" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Diviser vers la gauche" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Diviser vers la droite" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Diviser vers le haut" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "Diviser vers le haut" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "Connexion SSH" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "La gestion des connexions SSH se fait maintenant via l'onglet \"Profils et connexions\"" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "Mot de passe SSH pour {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "Standard (hérité)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "Démarrage" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Bits d'arrêt" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Retirer" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Souscrire aux mises à jour" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Substitutions autorisées." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "Changer le mode de couleur" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Changer de profil" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Changer de profil dans le volet actif" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Remplacer l'implémentation du terminal utilisateur (expérimental)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Synchroniser" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Synchroniser automatiquement" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Hôte de synchronisation" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Synchroniser les raccourcis clavier" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Synchroniser le coffre" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Synchroniser les réglages de fenêtres" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Onglet {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Activité de l'onglet" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby n'a pas pu démarrer avec vos extensions, tous les plugins tiers ont été désactivés dans cette session. L'erreur était :" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Actualités et mises à jour de Tabby sur Twitter" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Onglets" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Emplacement des onglets" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Largeur des onglets" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Session Telnet" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Terminal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Arrière-plan du terminal" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Bip du terminal" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "Identification du terminal" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Merci d'avoir téléchargé Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Thème" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Il y a des transferts de fichiers actifs" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Il y a un mot de passe enregistré pour cette connexion" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Ceci s'applique à tous les profils d'un type donné" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "Ceci s'applique à tous les profils d'un type donné dans ce groupe" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Compact" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Cochez cette case si vous rencontrez des problèmes d'aliasing, de dédoublement ou d'autres problèmes visuels" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Entrer ou sortir du mode plein écran" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "Activer/désactiver le dernier onglet" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Basculer avec le dernier onglet" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Afficher ou masquer la fenêtre de Tabby" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "En haut" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "Retirer les blancs et les nouvelles lignes" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Réessayer" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Tente d'utiliser le mot de passe enregistré" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "Transformer les panneaux de l'onglet actuel en autant d'onglets séparés" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Sans groupe" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Désinstaller" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Inconnu" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Secret inconnu de type {type} pour {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Désépingler" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "Haut" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Mise à jour" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Mise à jour vers {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Envoyer" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Envoyer en tant que nouvelle configuration" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Utiliser {altKeyName} comme clé Meta" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "Utiliser ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "Valeurs utilisateur par défaut" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Nom d'utilisateur" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "Utiliser la méthode CONNECT" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Utiliser le mot de passe prédéfini" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Coffre-fort" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Le coffre-fort est un conteneur chiffré en permanence contenant des secrets tels que des mots de passe SSH et une phrase de passe de clé privée." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Le coffre est vide" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Le coffre est verrouillé" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "Le coffre n'est pas configuré" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "Un mot de passe maître doit être défini pour permettre le stockage de secrets dans le coffre" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Vérifier les clés d'hôte lors de la connexion" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Version" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Version : {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Couleurs vives" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Visuel" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Avertir en cas de collage de plusieurs lignes" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Avertir lors de la fermeture de connexions actives" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "Attention : la clé de l'hôte distant a soudainement changé !" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Nous ne collectons que la version de Tabby et celle de l'OS." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Bienvenue" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Quoi de neuf" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "Quand une session se termine" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "Lorsque cette option est activée, les liens ne sont cliquables que lorsque vous maintenez cette touche enfoncée" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "Lorsque WinSCP est détecté, vous pouvez lancer une session SCP à partir du menu contextuel." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "Indique si une fenêtre personnalisée ou une fenêtre native de l'OS doit être utilisée" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "Empêchera l'affichage du message de salutation SSH" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Fenêtre" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "Dimension de la fenêtre le long du bord" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "Dimension de la fenêtre loin du bord" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Cadre de fenêtre" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "Fenêtres" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Windows 10 version 18309 ou supérieure est recommandé pour ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "Chemin vers WinSCP" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Séparateurs de mots" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Répertoire courant" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Détection du répertoire courant" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "Le son du terminal WSL ne peut être mise en sourdine que via le mixeur de volume" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "Le terminal WSL ne prend en charge que TrueColor avec ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "Transfert X11" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Jaune" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "Vous pouvez le changer plus tard, mais il n'est pas récupérable s'il est oublié." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "Vous pourriez être actuellement sous le coup d'une attaque de type man-in-the-middle ou bien la clé de l'hôte pourrait avoir été modifiée." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Zoom avant" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Zoom arrière" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "Dynamique" ================================================ FILE: locale/hr-HR.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: hr\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Croatian\n" "Language: hr_HR\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "„{command}” se još uvijek u izvodi. Zatvoriti?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "kopija {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "Obitelj fontova za prikaz nedostajućih znakova u glavnom fontu" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Prekini sve" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Prihvati i zapamti ključ" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Prihvati samo ovaj put" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "Pristupačnost" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Pozadina u boji akrila" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Dodaj" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Dodaj prosljeđujući priključak" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Dodaj privatni ključ" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Dodaj …" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Dodatni razmak između redaka" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Napredno" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Agent" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Proslijeđivanje agenta" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Staza procesa agenta" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Vrsta agenta" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Omogućuje otvaranje .bat datoteka u karticama, ali kvari neke ljuske" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Omogućuje brzo otvaranje terminala u odabranoj mapi" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "Uvijek tamno" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Uvijek svijetlo" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Izgled" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Program" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Postavke programa" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Stvarno želiš zatvoriti Tabby? Ovaj upit možeš deaktivirati u Postavke -> Prozor." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Sigurno?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Argumenti" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Postavi pitanje" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Pitaj prije zatvaranja kartice preglednika" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Zvukovi" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Način autentifikacije" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Autor" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Automatski" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Automatski otvori terminal tijekom pokretanja programa" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Automatski" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Automatska aktualiziranja" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Automatski prenesi promjene i traži nove verzije svake minute" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Dostupno" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Vrsta pozadine" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Brzina prijenosa" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Početak retka" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Titranje kursora" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Plava" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Zamuti" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Podebljani font" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Dolje" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Umetanje sadržaja u uglatim zagradama (zahtijeva podršku školjke)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "Broadcast-Modus. Za prekid pritisni bilo gdje." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Ugrađeno" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Odustani" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Promijeni brzinu prijenosa" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Promijeni boju kartice" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Promijeni tekstualnu master lozinku" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Traži nove verzije" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Šifre" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Isprazni" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Isprazni popis nedavnih profila" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Isprazni terminal" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "Isprazni terminal nakon povezivanja" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Međuspremnik" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Zatvori" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Zatvori i više nemoj prikazati" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Zatvori aktivnu ploču" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Zatvori druge kartice" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Zatvori karticu" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Zatvori kartice prema lijevo" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Zatvori kartice prema desno" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "Zatvori prozor nakon zatvaranja zadnje kartice" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Boja" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Shema boja" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Sheme boja" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Boje" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Sjedini sve karticu u trenutačno aktivnu karticu" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Naredbeni redak" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "Umjesto mrežne veze koriste se standardni unos/sandardni rezultat (stdin/stdout) naredbe" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Naredbe" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "Kompaktno (zastarjelo)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Konfiguracija je izbrisana" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Konfiguracija preuzeta" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Datoteka konfiguracije" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Sinkronizacija konfiguracije" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Konfiguracija prenesena" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Konfiguracije" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Poveži se putem proxy poslužitelja" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "Poveži se na „%s” …" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Najprije se poveži s jednim drugim host računalom i koristi ga kao proxy" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "Povezivanje" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Veza" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "Veza neuspjela: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "Umjesto toga će se koristiti ime veze" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Kontekstni izbornik" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "Kontrolira količinu prostora između elemenata" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Kopirano" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Kopiraj" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Kopiraj trenutačnu stazu" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Kopiraj potpunu stazu" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Kopiraj nakon odabiranja" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Kopiraj u međuspremnik" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Kopiraj s formatiranjem" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Neuspjelo dešifriranje konfiguracije" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Stvori" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Stvori mapu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Trenutačno" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Trenutačna shema boja" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Trenutačna šifra ključa host računala" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Tenutačni postupak: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Oblik kursora" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Prilagođeno" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "Prilagođeni CSS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "Tamni modus" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Bitovi podataka" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Otklanjanje grešaka" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Smanji veličinu vodoravne podjele" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Smanji veličinu okomite podjele" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Standardni profil za nove kartice" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "Postavke standardnog profila grupe" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Postavke standardnog profila" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "Standardne vrijednosti" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "Standardne vrijednosti za {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Izbriši" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "Izbrisati „{name}”?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "Izbrisati {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Izbriši cijeli redak" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Izbriši sljedeću riječ" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Izbriši prethodnu riječ" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "Izbrisati konfiguraciju na udaljenom uređaju?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Izbrisati profile ove grupe?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Ukloniti ovu skriptu?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Izbrisati sadržaj trezora?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Briše se" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Uređaj" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Direktno" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Deaktiviraj" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Deaktiviraj dinamički naslov kartice" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "Deaktiviraj transparentnu pozadinu prilikom povlačenja prozora" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Deativiraj ubrzanje grafičkog procesora" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Deaktivirano" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Odspoji" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "Odspoji trenutačnu karticu (Serial/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "Odspojiti se od računala {host}?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Prikaži slike putem Sixel escape sekvenci" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Ekran uključen" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "Nemoj prekinuti" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Nemoj zatvoriti" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Nemoj zapamtiti" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "Prikvači uvijek gore" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "Prikvači terminal" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "Veličina prikvačenog terminala" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "Područje prikvačenog terminala" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "Prikvačivanje" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "Označavanje teksta dvostrukim pritiskom miša zaustavit će se pri ovim znakovima" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "Dolje" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Preuzmi" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Crtaj podebljani tekst svijetlim bojama" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Dupliciraj" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Dupliciraj kao administratora" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Dupliciraj karticu" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Uredi" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Uredi lokalno" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Aktiviraj" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Aktiviraj analitikčke podatke" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "Aktiviraj animacije" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Akiviraj automatsko instaliranje novih verzija kad postanu dostupne." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "Omogući opciju tečne pozadine" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Aktiviraj ligature fontova" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Aktiviraj globalne prečace (Ctrl-razmaknica)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Aktiviraj eksperimentalni Windows ConPTY API" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Šifriraj datoteku konfiguracije" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Kraj retka" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Okruženje" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Izbriši konfiguraciju" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Izbriši trezor" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Greška u {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Točno podudaranje" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Primjer:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "Eksperimentalni stil pozadine sustava Windows 10 je poznat da uzrokuje probleme" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Izvezi" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Rezervni font" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Prijenosi datoteka" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "Datoteka: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "Filtar" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Fiksno" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Transparentna pozadina ponekad uzrokuje kašnjenje iscrtavanja prilikom povlačenja prozora" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Postavi sve ploče kao aktivne" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Postavi sve ploče kao aktivne odjednom (broadcast)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "Postavi sve kartice kao aktivne" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "Postavi sve kartice kao aktivne odjednom (broadcast)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "Fokusiranje prati miša" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Postavi sljedeću ploču kao aktivnu" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "Postavi ploču {number} kao aktivnu" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Postavi prethodnu ploču kao aktivnu" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Postavi gornju ploču kao aktivnu" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Postavi donju ploču kao aktivnu" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Postavi lijevu ploču kao aktivnu" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Postavi desnu ploču kao aktivnu" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "Slijedi shemu boja" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Font" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "Za tipkovne prečace" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "Prisili CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "Prisili CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "Prisili LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Forsira određenu vrstu veze SSH agenta." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Zaboravi" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Proslijedi priključak" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Proslijeđeni priključci" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "Iz sheme boja" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "Od sustava" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "Iz teme" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Sučelje" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Potpuno" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Opće" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Generiraj unaprijed ispunjeni GitHub problem" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Preuzmi" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Preuzmi iz prozora Tabby-web postavki" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Daje prozoru zamućenu prozirnu pozadinu" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Idi gore" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Zelena" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Grupa" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "Hacks" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "Pomogni pratiti broj Tabby instalacija diljem svijeta!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Pomogni prevoditi Tabby" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Heksadecimalni" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "Sakrij" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Sakrij gumb za zatvaranje kartice" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Sakrij indeks kartice" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "Sakrij gumb za opcije kartice" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Sakrij prozor kad nije aktivan" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "Skriva prikvačeni terminal kad pritisneš negdje drugdje." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Naslovnica" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Host računalo" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Ključ host računala" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Provjera ključa host računala" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Tipkovni prečaci" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "Kako se Tabby predstavlja kroz različita okruženja" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "HTTP proxy" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "HTTP proxy host" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "HTTP proxy priključak" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Ikona" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "Dynamic" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Ako je deaktivirano, u biraču profila prikazat će se samo prilagođeni profili" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Odmah lokalno odgovara tvoj unos" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "Povećaj veličinu vodoravne podjele" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "Povećaj veličinu okomite podjele" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "Unos" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "Unos se šalje tijekom tipkanja" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Modus unosa" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "Upiši nove retke" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Instalirano" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "Instaliranjem nove verzije zatvorit će se sve kartice i Tabby će se ponovo pokrenuti." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "Inteligenti Ctrl-C (kopiraj/prekini)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Interaktivno" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Neispravna sintaksa" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "„Jump” host računalo" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Skoči na sljedeću riječ" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Skoči na prethodnu riječ" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Zadrži" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Interval održavanja (milisekunde)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "Zadrži prikvačeni terminal uvijek ispred ostalih prozora" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Tipka" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "Zamjena tipki" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Tipkovnica" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "Autentifikacija interaktivnom tipkovnicom" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "Prekini naredbu" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Jezik" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "Zadnja poznata šifra ključa host računala" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Pokreni WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Pokreni WinSCP za trenutačnu SSH sesiju" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Saznaj kako dopustiti Tabbyju da otkrije radnu mapu udaljene ljuske." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Lijevo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Omogućuje ljusci baratanje meta-tipkom umjesto OS-a" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "Svijetli modus" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Redak po redak" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Uređivač redaka, unos se šalje nakon što pritisneš tipku Enter" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Odmaci redaka" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Učitavanje" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Učitavanje konfiguracija …" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Lokalno" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Lokalni odgovor" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Lokalni terminal" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Skripta za prijavu" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Pritisni dugo za kontekstni izbornik" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Upravljaj profilima" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "Maksimalni broj intervala održavanja" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Maksimalno proširi aktivnu ploču" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "Najmanji omjer kontrasta" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Promijenjeno {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "Miš" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Premjesti karticu lijevo" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Premjesti karticu desno" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Premjesti u „Negrupirani”" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "Pomicanje miša preko neaktivne ploče aktivirat će ju" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Ime" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Ime nove konfiguracije" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "Ime nove mape" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Izvorni" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "Nova" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Kartica za novog administratora" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Nova konfiguracija na {platform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "Novo ime grupe" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Novi element" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Novo ime" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Novi profil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Ime novog profila" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Nova kartica" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Nova kartica: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Novi terminal" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Novi prozor" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "Novi prozor" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Novi s profilom" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Sljedeća kartica" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Bez boje" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Bez modifikatora" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Ništa" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Normalno" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "Normalna debljina fonta" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Nije nađeno" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Obavijesti prilikom aktivnosti" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Obavijesti kad ja gotovo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Broj redaka zadržanih u predmemoriji" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Isključi" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Službeno" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "Na GitHub diskusijama" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Neprozirnost" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Otvori alate za razvoj" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Otvori postavke" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Otvori karticu postavki: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "Otvori SFTP ploču" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "Opcionalno" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Opcije" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Narančasta" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "Standard sustava" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "Standard sustava ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "Rezultat se prikazuje u heksadecimalnom obliku" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "Rezultat se prikazuje po primanju" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Modus rezultata" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Ispiši nove retke" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "Prepiši X11 ekran" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "Prepiši lokalnu konfiguraciju i sinkroniziraj" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Prepiši udaljenu konfiguraciju i sinkroniziraj" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "Prepisati konfiguraciju na udaljenoj strani i započeti sinkronizaciju?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "Prepisati lokalnu konfiguraciju i započeti sinkronizaciju?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "Korak mijenjanja veličine ploče" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "Ploče" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "Papir (zastarjelo)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Paritet" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "Djelomično sinkroniziranje konfiguracije nije moguće kad je konfiguracija šifrirana putem trezora." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "Tekstualna lozinka za privatni ključ s hashem {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Lozinka" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Umetni" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Umetni iz međuspremnika" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "Umetni ako ništa nije odabrano, inače kopiraj" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Umetnuti višestruke retke?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "Umetni pritiskom srednjeg gumba miša" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Staza ili adresa lokalne X11 utičnice" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Prikvači" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Dodaci" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Mapa dodataka" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Priključak" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Priključak otvoren" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Priključci" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Pritisni bilo koju tipku za ponovno povezivanje" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Pritisni tipku sada" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Sprečava slučajno zatvaranje" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Sprečava slučajno izvršavanje umetnutih naredbi" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Prethodna kartica" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Privatni ključevi" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Postupak završen" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Ime profila" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Profili" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Profili i veze" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Program" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Proxy naredba" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Ljubičasta" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Stavlja svu konfiguraciju programa Tabby u trezor" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Brzo povezivanje" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Zatvori program" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Veza raw utičnice" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "Istek vremena spremnosti (milisekunde)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Nedavni" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Ponovo spoji" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "Ponovo poveži trenutačnu karticu (Serial/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Crvena" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Regularni izraz" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Napomene uz izdanje" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "Zapamti {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Udaljeni repozitorij" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "Ukloni razmake/tabulatore i nove retke okolo kopiranog teksta" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Preimenuj" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "Preimenuj karticu" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "Iscrtavanje" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Ponovo otvori zadnju karticu" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Zamijeni" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Prijavi problem" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "Zatraži tipku za pritiskanje poveznica" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Izvorno uvećanje" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Ponovo pokreni sesiju serijske veze" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Ponovo pokreni SSH sesiju" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Ponovo pokreni Telnet sesiju" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "Ponovo pokreni karticu" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Za primjenu promjena ponovo pokreni program" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "Obnoviti na standardne postavke?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "Obnoviti postavke na naslijeđene standardne vrijednosti?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "Obnovi kartice terminala tijekom pokretanja programa" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "Ponovo koristi sesiju za više kartica" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "Desno" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "Pritiskanje desne tipke miša" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Pokreni kao administrator" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Spremi" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Spremi lozinku u privjesak ključeva" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Spremi i primijeni" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Spremi kao profil" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Spremi raspored kao profil" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Spremljeno" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Spremljeni raspored" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "Pomakni nakon unosa" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "Pomakni terminal jednu stranicu prema dolje" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "Pomakni terminal jednu stranicu prema gore" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Pomakni terminal na kraj" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "Pomakni terminal na početak" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "Pomicanje unatrag" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "Pomiče terminal na kraj nakon unosa korisnika" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Pretraga" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Pretraži sheme boja" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "Pretraži tipkovne prečace" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "Pretraži dodatke" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Tajni token za sinkronizaciju" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Odaberi" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Odaberi osnovni profil koji će se koristiti kao predložak" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "Odaberi sve" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Odaberi spremište datoteka" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Odaberi profil" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Odaberi profil ili upiši e-mail adresu" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "Šalji bajtove upisivanjem heksadecimalnih vrijednosti" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Šalje podatke bajt po bajt" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Serijska veza" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Serijska veza" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Serijska veza: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Postavi tekstualnu master lozinku" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Postavi tekstualnu lozinku" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Postavi lozinku" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Postavi Tabby kao %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "Postavi na 0 za dekativiranje nedavnih profila" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "Postavlja imenovanu stazu procesa SSH agenta." #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Postavke" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Ljuska" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Ljuska ne podržava trenutačno otkrivanje staze" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Integracija ljuske" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "Prikaži" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "Prikaži selektor profila „{type}”" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "Prikaži prozor za potvrdu prilikom umetanja više redaka" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "Prikaži ugrađene profile u selektoru" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "Prikaži selektor naredbe" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Prikaži datoteku konfiguracije" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Prikaži standardne vrijednosti" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Prikaži mikser" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "Prikaži oznake prozora (za preuređivanje)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Prikaži ikonu profila na kartici" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Prikaži selektora profila" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Prikaži nedavne profile u selektoru" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Prikaži napomene uz izdanje" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Prikaži serijske veze" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "Prikaži kartice u cjeloekranskom prikazu" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "Prikaži alatnu traku" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Prikaži sadržaj trezora" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Podrška za Sixel slike (eksperimentalno)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "Preskoči MoTD/banner" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "Slow feed" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "Privlači prozor na jednu stranu ekrana" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "SOCKS proxy host računalo" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "SOCKS proxy priključak" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "Zvuk" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Izvorni kod" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "Razmak" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Podijeli" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Podijeli prema dolje" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "Podijeli prema dolje" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Podijeli na lijevo" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Podijeli na desno" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Podijeli prema gore" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "Podijeli prema gore" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "SSH veza" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "SSH vezom se sada upravlja u kartici „Profili i veze”" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "SSH lozinka za {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "Standardno (zastarjelo)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "Pokretanje" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Bitovi prekida" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Ukloni" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Pretplati se na nove verzije" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Zamjene su dozvoljene." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "Promijeni shemu boja" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Zamijeni profil" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Zamijeni profil u trenutačnoj ploči" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Zamjenjuje implementaciju sučelja terminala (eksperimentalno)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Sinkronizraj" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Sinkronizraj automatski" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Sinkronizraj host računalo" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Sinkronizraj tipkovne prečace" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Sinkronizraj trezor" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Sinkronizraj postavke prozora" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Kartica {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Aktivnost kartice" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby se nije mogao pokrenuti s tvojim dodacima, stoga su svi strani dodaci deaktivirani u ovoj sesiji. Greška je bila:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Tabby novosti i nove verzje na Twitteru" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Kartice" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Mjesto kartica" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Širina kartica" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Telnet sesija" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Terminal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Pozadina terminala" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Zvono terminala" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "Identifikacija terminala" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Zahvaljujemo na preuzimanju programa Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Tema" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Postoje aktivni prijenosi datoteka" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Postoji spremljena lozinka za ovu vezu" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Primjenjuju se na sve profile zadane vrste" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "Primjenjuju se na sve profile zadane vrste u ovoj grupi" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Tanko" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Označi ovo ako se pojave vizualni problemi" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Uključi/isključi cjeloekranski prikaz" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "Uključi/isključi zadnju karticu" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Uključi/isključi prozor terminala" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Uključuje/isključuje vidljivosti Tabby prozora" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "Gore" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "Ukloni razmake/tabulatore i nove retke" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Pokušaj ponovo" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Pokušaj spremljene lozinke" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "Pretvori ploče trenutačne kartice u zasebne kartice" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Negrupirani" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Deinstaliraj" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Nepoznato" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Nepoznata tajna vrste {type} za {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Otkvači" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "Gore" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Aktualiziraj" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Nadogradi na {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Prenesi" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Prenesi kao novu konfiguraciju" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Koristi {altKeyName} kao meta-tipku" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "Koristi ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "Korisnički standard" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Korisničko ime" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "Koristi CONNECT metodu" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Korištenje predodređene lozinke" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Trezor" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Trezor je uvijek šifrirani spremnik za tajne kao što su SSH lozinke i tekstualne lozinke privatnog ključa." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Trezor je prazan" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Trezor je zaključan" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "Trezor nije konfiguriran" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "Za spremanje tajni, tekstualna master lozinka trezora mora biti postavljena" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Provjeri ključeve host računala prilikom povezivanja" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Verzija" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Verzija: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Svjetlost" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Prikaz" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Upozori prilikom umetanja više redaka" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Upozori pri zatvaranju aktivnih veza" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "Upozorenje: ključ udaljenog host računala iznenada se promijenio!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Pratimo samo tvoje verzije Tabbyja i OS-a." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Dobrodošlica" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Novosti" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "Kada sesija završi" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "Kad je aktivirano, veze se mogu pritisnuti samo dok držiš ovu tipku" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "Kad se otkrije WinSCP, SCP sesiju možeš prekinuti iz kontekstualnog izbornika." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "Da li koristiti prilagođeni prozor ili izvorni prozor OS-a" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "Spriječit će pojavljivanje SSH pozdrava" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Prozor" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "Dimenzija prozora uz rub" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "Dimenzija prozora od ruba" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Okvir prozora" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "Windows" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Za ConPTY se preporučuje Windows 10 gradnja 18309 ili novija" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "WinSCP staza" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Znakovi razdvajanja riječi" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Radna mapa" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Otkrivanje radne mape" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "Zvono WSL terminala može se isključiti samo putem miksera glasnoće" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "WSL terminal podržava samo TrueColor s ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "Proslijeđivanje X11" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Žuta" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "Može se kasnije promijeniti, ali ne ne može obnoviti ako se zaboravi." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "Možda se veza trenutačno nalazi pod napadom (man-in-the-middle attack) ili je ključ host računala jednostavno promijenjen." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Uvećaj prikaz" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Umanji prikaz" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "Dynamic" ================================================ FILE: locale/id-ID.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: id\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Indonesian\n" "Language: id_ID\n" "PO-Revision-Date: 2025-01-22 22:02\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" masih berjalan. Tutup?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} salin" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "Keluarga huruf kedua digunakan untuk menampilkan karakter yang hilang di huruf utama" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Batalkan semua" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Terima dan ingat kunci" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Terima kali ini saja" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "Aksesbilitas" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Latar belakang akrilik" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Tambah" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Tambah port forward" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Tambah kunci pribadi" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Tambah..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Ruang tambahan antar baris" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Lanjutan" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Agen" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Penerusan agen" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Jalur pipa agen" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Jenis agen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Izinkan membuka berkas .bat di tab, tapi memecahkan beberapa shell" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Izinkan buka dengan cepat terminal di direktori terpilih" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "Selalu gelap" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Selalu terang" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Tampilan" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Aplikasi" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Pengaturan aplikasi" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Anda yakin ingin menutup Tabby? Anda bisa menonaktifkan prompt ini di Pengaturan -> Jendela." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Anda yakin?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Argumen" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Berikan pertanyaan" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Tanya sebelum tutup tab peramban" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Terdengar" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Metode otentikasi" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Pencipta" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Otomatis" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Otomatis buka terminal saat memulai aplikasi" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Otomatis" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Pembaruan Otomatis" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Otomatis unggah perubahan dan cek pembaruan setiap menit" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Tersedia" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Jenis latar belakang" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Baud rate" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Awal baris" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Kursor berkedip" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Biru" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Buram" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Ukuran ketebalan huruf" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Bawah" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Tempel tanda kurung (butuh dukungan shell)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Bawaan" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Batal" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Ubah baud rate" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Rubah warna label" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Ubah frasa sandi utama" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Cek pembaruan" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Sandi" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Bersihkan" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Bersihkan profil terbaru" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Bersihkan terminal" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "Bershikan terminal setelah koneksi" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Papan clip" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Tutup" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Tutup dan jangan tampilkan lagi" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Tutup panel fokus" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Tutup tab lain" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Tutup tab" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Tutup tab ke kiri" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Tutup tab ke kanan" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Warna" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Skema warna" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Warna Skema" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Warna-warna" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Gabungkan semua tab ke tab saat ini" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Baris perintah" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "Perintah stdin/stdout digunakan sebagai pengganti koneksi jaringan" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Perintah-perintah" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "Padat (tua)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Konfigurasi telah dihapus" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Konfigurasi diunduh" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Berkas konfigurasi" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Sinkronisasi konfigurasi" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Konfigurasi diunggah" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Konfigurasi" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Terhubung melalui server proxy" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "Hubungkan ke \"%s\"..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Hubungkan ke host yang berbeda terlebih dahulu dan gunakan sebagai proxy" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "Menghubungkan" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Koneksi" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "Koneksi gagal: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "Nama koneksi akan digunakan sebagai gantinya" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Menu konteks" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Disalin" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Salin" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Salin jalur saat ini" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Salin alamat lengkap" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Salin pada saat pilih" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Salin ke papan klip" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Salin dengan formatting" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Tidak bisa mendekripsi konfigurasi" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Buat" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Buat direktori" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Saat ini" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Skema warna saat ini" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Sidik jari kunci host saat ini" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Proses saat ini: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Bentuk kursor" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Kustom" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "CSS khusus" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Data bits" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Men-debug" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Kurangi ukuran pemisahan horizontal" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Kurangi ukuran pemisahan vertical" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Profil bawaan untuk tab baru" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Pengaturan profil bawaan" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "Bawaan" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "Bawaan untuk {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Hapus" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "Hapus \"{name}\"?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "Hapus {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Hapus seluruh baris" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Hapus kata selanjutnya" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Hapus kata sebelumnya" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Hapus profil grup?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Hapus skrip ini?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Hapus konten vault?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Menghapus" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Perangkat" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Langsung" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Matikan" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Matikan judul tab dinamis" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "Nonaktifkan latar belakang yang lancar saat menyeret" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Matikan akselerasi GPU" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Dinonaktifkan" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Putuskan" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "Putuskan dari {host}?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Tampil pada" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "Jangan dibatalkan" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Jangan tutup" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Jangan ingat" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "Kait selalu diatas" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "Kaitkan terminal" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "Kaitkan ukuran terminal" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "Kaitkan ruang terminal" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "Mengaitkan" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "Pilihan klik dua kali akan berhenti di karakter ini" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "Turun" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Unduh" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Menampilkan teks tebal dalam warna cerah" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Duplikasi" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Duplikat sebagai administrator" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Duplikat tab" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Sunting" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Sunting Lokal" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Izinkan" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Izinkan analitik" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "Aktifkan animasi" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Aktifkan penginstalan pembaruan otomatis saat tersedia." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Aktifkan ligatur font" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Aktifkan hotkey global (Ctrl-Space)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Mengaktifkan Windows ConPTY API eksperimental" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Enkripsi berkas konfigurasi" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Baris akhir" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Lingkungan" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Hapus konfigurasi" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Hapus vault" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Eror di {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Paling cocok" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Contoh:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Ekspor" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Font cadangan" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Transfer berkas" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "Berkas: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "Saring" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Tetap" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Latar belakang yang lancar terkadang menyebabkan kelambatan seret" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Fokuskan semua panel" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Fokuskan semua panel sekaligus (siaran)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Fokuskan panel berikutnya" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Fokuskan panel sebelumnya" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Fokuskan panel di atas" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Fokuskan panel di bawah" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Fokuskan panel di kiri" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Fokuskan panel di kanan" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "Ikuti Sekema Warna" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Font" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "Untuk pintasan keyboard" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "Paksakan CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "Paksakan CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "Paksakan LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Memaksa jenis koneksi agen SSH tertentu." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Lupakan" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Port penerusan" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Port diteruskan" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "Dari skema warna" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "Dari tema" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Tampilan Depan" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Penuh" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Umum" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Buat pra-diisi isu di GitHub" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Dapatkan" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Dapatkan dari jendela pengaturan Web Tabby" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Beri jendela latar belakang transparan buram" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Naik" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Hijau" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Grup" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "Peretasan" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "Bantu lacak jumlah pemasangan Tabby di seluruh dunia!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Bantu terjemahkan Tabby" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Heksadesimal" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Sembunyikan tombol tutup tab" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Sembunyikan indeks tab" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "Sembunyikan tombol opsi tab" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Sembunyikan jendela saat kehilangan fokus" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "Sembunyikan terminal yang terkait saat Anda mengklik." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Beranda" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Host" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Kunci host" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Kunci verifikasi host" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Pintasan" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "HTTP proxy" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "Host HTTP proxy" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "Port HTTP proxy" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Ikon" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "id.lebar-tab.dinamis" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Jika dimatikan, hanya profil khusus yang akan tampil di pemilhan profil" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Segera menggemakan masukan Anda secara lokal" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "Tingkatkan ukuran pemisahan horizontal" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "Tingkatkan ukuran pemisahan vertikal" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "Masukan dikirim saat Anda mengetik" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Modus masukan" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "Masukan garis baru" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Terpasang" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "Pemasangan pembaruan akan menutup semua tab dan mengulang kembali Tabby." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "Ctrl-C cerdas (salin/batal)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Interaktif" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Sintaks tidak sah" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "Lompat host" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Lompat ke kata berikutnya" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Lompat ke kata sebelumnya" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Tetap" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Interval Tetap Hidup (Milidetik)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "Terminal tetap selalu diatas" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Kunci" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "Bertukar kunci" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Papan ketik" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "Otentikasi keyboard-interaktif" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "Matikan" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Bahasa" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Buka WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Buka WinSCP untuk sesi SSH saat ini" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Pelajari cara mengizinkan Tabby mendeteksi direktori kerja shell jarak jauh." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Kiri" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Biarkan shell menangani kunci Meta daripada OS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Baris per baris" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Editor baris, masukkan dikirim setelah Anda tekan Enter" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Bantalan garis" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Memuat" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Memuat konfigurasi..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Lokal" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Echo Lokal" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Terminal lokal" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Skrip masuk" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Klik lama untuk menu konteks" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Kelola profil" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Diubah pada {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "Kursor" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Geser tab ke kiri" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Geser tab ke kanan" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Pindahkan ke \"Tanpa Group\"" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Nama" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Nama untuk konfigurasi baru" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "Nama untuk direktori baru" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Asli" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Tab admin baru" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Pengaturan baru di {platform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Item baru" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Nama baru" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Profil baru" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Nama profil baru" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Tab Baru" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Tab baru: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Terminal Baru" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Jendela baru" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "Jendela Baru" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Buka baru dengan profil tertentu" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Tab selanjutnya" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Tidak berwarna" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Tidak ada modifier" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Tidak ada" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Normal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "Ketebalan font normal" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Tidak ditemukan" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Beri tahu tentang aktivitas" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Beri tahu saat selesai" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Jumlah baris yang disimpan dalam buffer" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Mati" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Resmi" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "Di Diskusi GitHub" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Keburaman" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Buka DevTools" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Buka Pengaturan" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Buka pengaturan tab: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "Buka panel SFTP" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "Opsional" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Pilihan" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Oranye" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "Default OS" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "Default OS ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "Output ditampilkan sebagai hexdump" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "Luaran ditampilkan layaknya saat diterima" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Mode luaran" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Baris baru luaran" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "Ganti tampilan X11" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "Timpa lokal dan sinkronkan" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Timpa jarak jauh dan sinkronkan" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "Timpa konfigurasi di sisi jarak jauh dan mulai menyinkronkan?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "Timpa konfigurasi lokal dan mulai menyinkronkan?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "Langkah mengubah ukuran panel" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "Panel" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Keseimbangan" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "Sinkronisasi konfigurasi parsial tidak dimungkinkan saat konfigurasi dienkripsi melalui Vault." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "Frasa sandi untuk kunci pribadi dengan hash {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Kata sandi" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Tempel" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Tempel dari papanklip" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Tempel beberapa baris?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "Tempel di klik tengah" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Jalur atau alamat soket X11 lokal" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Pin" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Plugin" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Folder plugin" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Port" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Port dibuka" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Port" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Tekan tombol apa saja untuk menghubungkan ulang" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Tekan tombol sekarang" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Cegah keluar tak disengaja" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Mencegah eksekusi tidak sengaja dari perintah yang ditempel" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Tab sebelumnya" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Proses selesai" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Nama profil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Profil" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Profil & koneksi" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Program" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Ungu" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Sambung Cepat" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Keluar" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Terbaru" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Sambungkan Kembali" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Merah" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Ekspresi reguler" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Catatan Rilis" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "Ingat untuk {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Jarak Jauh" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Ganti Nama" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "Ganti nama label" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "Rendering" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Buka Kembali Tab Terakhir" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Menggantikan" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Laporkan Masalah" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "Perlukan tombol khusus untuk membuka tautan" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Ukuran Semula" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Mulai ulang sesi serial saat ini" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Mulai ulang sesi SSH saat ini" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Mulai ulang sesi Telnet saat ini" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "Muat ulang tab" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Mulai ulang aplikasi untuk menerapkan perubahan" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "Kembali ke settingan sebelumnya ?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "Gunakan sesi untuk banyak tab" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "Kanan" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "Klik kanan" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Jalan sebagai administrator" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Simpan" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Simpan password di keychain" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Simpan dan terapkan" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Simpan sebagai profil" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Simpan tata letak sebagai profil" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Disimpan" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Tata letak tersimpan" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "Gulir saat input" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Gulir terminal ke bawah" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "Gulir kembali" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "Gulir terminal ke bawah saat pengguna meng-input" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Cari" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Cari skema warna" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "Cari hotkey" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "Cari pluggin" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Token sinkronisasi rahasia" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Pilih" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Pilih profil utama sebagai template" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "Pilih semua" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Pilih penyimpanan file" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Pilih profile" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Pilih profile atau masukkan alamat" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "Kirim byte dengan mengetik nilai hex" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Kirim data satu byte pada suatu waktu" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Serial" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Koneksi serial" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Serial: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Buat kata sandi utama" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Buat kata sandi" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Buat kata sandi" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Atur Tabby sebagai %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "Atur ke 0 untuk men-disable profile saat ini" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "" #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Pengaturan" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Shell" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Shell tidak mendukung deteksi path saat ini" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Integrasi Shell" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "Tampilkan {type} selector profile" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "Tampilkan dialog konfirmasi ketika menempel banyak baris" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "Tampilkan built-in profile di selector" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "Tampilkan pemilihan perintah" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Tampilkan file konfigurasi" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Tampilkan bawaan" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Tampilkan Mixer" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Tampilkan ikon profile di tab" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Tampilkan selector profil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Tampilkan profil terbaru di selector" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Tampilkan catatan pembaruan" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "Bunyi" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Kode Sumber" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Bagi" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Membelah ke bawah" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Membelah ke kiri" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Membelah ke kanan" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Membelah ke atas" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "Koneksi SSH" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "Koneksi SSH sekarang dapat dilakukan melalui Tab \"Profil&Koneksi\"" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "Password SSH untuk {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "Permulaan" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Berhentikan Bit" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Strip" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Berlangganan untuk memperbarui" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Pergantian diperbolehkan." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Beralih Profil" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Beralih profil di panel yang aktif" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Gantikan terminal implementasi frontend (Experimetal)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Sinkronisasi" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Sinkron dengan Otomatis" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Sinkron Host" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Sinkron Hotkeys" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Sinkron Brankas" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Sinkron Penganturan Jendela" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Tab {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Aktifitas tab" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby tidak bisa memulai dengan plugin anda, sehingga plugin pihak ketiga telah di nonaktifkan untuk sesi ini. Errornya adalah:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Berita dan Pembaharuan Tabby di Twitter" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Tabs" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Lokasi Tabs" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Panjang Tab" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Sesi Telnet" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Terminal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Background Terminal" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Bell Terminal" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Terima Kasih telah mengunduh Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Tema" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Sedang ada transfer file aktif" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Ada password tersimpan untuk koneksi ini" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Ini diterapkan ke seluruh profile dari tipe tersebut" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Tipis" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Centang ini jika anda mengalami aliasing, ghosting atau isu visual lainnya" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Beralih ke mode layar penuh" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "aktifkan tab terakhir" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Aktifkan jendela terminal" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Alihkan visibilitas jendela Tabby" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "Atas" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Coba Kembali" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Mencoba dengan kata sandi yang tersimpan" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "Ubah tab sekarang menjadi tab terpisah" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Bubarkan Grup" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Hapus Aplikasi" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Tidak Diketahui" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Tidak Diketahui tipe secret {type} untuk {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Lepas Sematan" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Perbarui" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Pemutahiran ke {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Unggah" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Unggah sebagai pengaturan baru" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Gunakan {altKeyName} sebagai tombol Meta" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "Gunakan ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Gunakan kata sandi yang telah disetel sebelumnya" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Brankas" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Brankas adalah kotak penyimpanan yang selalu dienkripsi, berisi sandi rahasia seperti sandi SSH dan passphrase private key." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Brankas kosong" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Brankas terkunci" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Versi" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Versi: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Peringatkan ketika menempel lebih dari satu baris" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Peringatkan ketika menutup sambungan yang masih aktif" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Kami hanya mencatat versi Tabby dan sistem operasi Anda." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Selamat datang" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "Jika diaktifkan, tautan hanya bisa diklik bila tombol ini sedang ditekan" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "Windows" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Windows 10 build 18309 atau lebih baru disarankan untuk ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Pemisah kata" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Direktori kerja" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Kuning" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "" #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Perbesar" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Perkecil" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "" ================================================ FILE: locale/it-IT.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: it\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Italian\n" "Language: it_IT\n" "PO-Revision-Date: 2025-01-22 22:02\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" è ancora in esecuzione. Chiudere?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} copia" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "Un set di caratteri secondario usato per mostrare quelli mancanti del font principale" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Annulla tutto" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Accetta e ricorda chiave" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Accetta solo questa volta" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "Accessibilità" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Sfondo acrilico" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Aggiungi" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Configura un inoltro di porta" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Aggiungi una chiave privata" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Aggiungi..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Spazio aggiuntivo tra le righe" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Avanzate" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Agente" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Inoltro dell'agente" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Percorso pipe agente" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Tipo di agente" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Permetti l'apertura di file .bat nelle schede, potrebbe bloccare alcune shell" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Permetti l'apertura rapida di un terminale nella cartella selezionata" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "Sempre scuro" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Sempre chiaro" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Aspetto" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Applicazione" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Impostazioni applicazione" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Sei sicuro di voler chiudere Tabby? \n" "Puoi disabilitare questo avviso in Impostazioni -> Finestra." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Sei sicuro?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Argomenti" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Fai una domanda" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Chiedi conferma prima di chiudere una scheda" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Sonore" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Metodo di autenticazione" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Autore" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Automatico" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Apertura automatica di un terminale all'avvio dell'app" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Automatico" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Aggiornamenti automatici" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Carica automaticamente le modifiche e controlla gli aggiornamenti ogni minuto" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Disponibile" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Tipo di sfondo" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "Modalità tasto backspace" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Velocità trasmissione" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Inizio della riga" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Cursore lampeggiante" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Blu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Sfocatura" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Peso del carattere in grassetto" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "In basso" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Incolla tra parentesi (richiede una shell che lo supporti)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "Modalità broadcast. Fai clic ovunque per disabilitare." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Integrato" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Annulla" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Modifica velocità di trasmissione" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Modifica il colore della scheda" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Modifica la frase segreta principale" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Verifica aggiornamenti" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Crittografie" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Azzera" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Cancella profili recenti" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Azzera contenuto terminale" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "Azzera contenuto terminale dopo la connessione" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Appunti" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Chiudi" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Chiudi e non visualizzare più" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Chiudi riquadro in evidenza" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Chiudi le altre schede" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Chiudi scheda" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Chiudi schede a sinistra" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Chiudi schede a destra" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "Chiude la finestra dopo aver chiuso l'ultima scheda" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Colore" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Tema terminale" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Schemi colore" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Colori" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Unisci tutte le schede all'interno della scheda attuale" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Riga di comando" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "Viene usato lo stdin/stdout invece di una connessione di rete" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Comandi" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "Compatto (legacy)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Configurazione eliminata" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Configurazione scaricata" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "File configurazione" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Backup configurazione" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Configurazione caricata" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Configurazioni" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Connetti tramite un server proxy" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "Connessione a \"%s\"..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Connettiti prima ad un altro host e usalo come proxy" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "In connessione" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Connessione" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "Connessione fallita: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "Verrà usato il nome della connessione" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Menu contestuale" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "Controlla la quantità di spazio tra gli elementi" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Copiato" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Copia" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Copia percorso attuale" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Copia percorso completo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Copia sulla selezione" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Copia negli appunti" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Copia formattazione" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Impossibile decifrare la configurazione" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Crea" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Crea cartella" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Attuale" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Tema in uso" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Firma chiave host attuale" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Processo attuale: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Forma cursore" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Personalizzato" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "CSS personalizzato" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "Tema scuro" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Bit di dati" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Debugging" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Riduci la divisione orizzontale" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Riduci la divisione verticale" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "\"Connetti a\" predefinito" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "Tipo di connessione predefinita usato dalla funzione di connessione rapida (es. SSH, Telnet)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Profilo predefinito per le nuove schede" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "Impostazioni predefinite profilo di gruppo" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Impostazioni del profilo predefinito" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "PredefinitI" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "Predefiniti per {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Elimina" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "Vuoi eliminare \"{name}\"?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "Vuoi eliminare {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Elimina tutta la riga" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Elimina parola successiva" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Elimina parola precedente" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "Vuoi eliminare la configurazione sul dispositivo remoto?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Vuoi eliminare i profili del gruppo?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Vuoi eliminare questo script?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Vuoi eliminare il contenuto della cassaforte?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Eliminazione" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Dispositivo" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Diretto" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Disabilita" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Disabilita il titolo dinamico per la scheda" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "Disabilita lo sfondo fluente durante il trascinamento" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Disabilita accelerazione GPU" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Disabilitato" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Disconnetti" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "Disconnetti la scheda attuale (serial/telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "Vuoi disconnetti da {host}?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Visualizza le immagini tramite sequenze di escape di Sixel" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Visualizza in" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "Non interrompere" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Non chiudere" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Non ricordare" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "Visualizza sempre in primo piano" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "Aggancia il terminale" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "Dimensione del terminale agganciato" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "Margine del terminale agganciato" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "Aggancia" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "La selezione con doppio clic si fermerà a questi caratteri" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "In basso" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Scarica" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Evidenzia il testo in grassetto con colori chiari" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Duplica" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Duplica come amministratore" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Duplica la scheda" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Modifica" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Modifica in locale" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Abilita" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Abilita dati analitici" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "Abilita animazioni" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Abilita l'installazione automatica degli aggiornamenti quando disponibili." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "Abilita opzione di sfondo fluente" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Abilita le legature tra font" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Abilita tasto di scelta rapida globale (Ctrl-Space)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Abilita l'API sperimentale di Windows ConPTY" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Cifra il file di configurazione" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Fine della riga" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Ambiente" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Cancella configurazione" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Cancella cassaforte" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Errore in {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Corrispondenza esatta" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Esempio:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "Sfondo sperimentale basati sullo stile di Windows 10, sono noti dei problemi" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Esporta" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Carattere sostitutivo" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Trasferimento file" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "File: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "Filtra" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Fissa" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Lo sfondo fluente può causare ritardo nel trascinamento" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Evidenzia tutti i riquadri" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Evidenzia tutti i riquadri contemporaneamente (scrivi su tutti)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "Utilizza tutte le schede" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "Attiva tutte le schede contemporaneamente (broadcast)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "Il fuoco segue il mouse" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Evidenzia riquadro successivo" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "Metti a fuoco il pannello {number}" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Evidenzia riquadro precedente" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Evidenzia il riquadro sopra" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Evidenzia il riquadro sotto" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Evidenzia il riquadro a sinistra" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Evidenzia il riquadro a destra" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "Segui il tema di sistema" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Carattere" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "Per le scorciatoie da tastiera" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "Forza CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "Forza CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "Forza LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Per la connessione SSH forza un tipo specifico di agente ." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Dimentica" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Inoltra porta" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Porte inoltrate" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "Dal tema in uso" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "Di sistema" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "Dal tema" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Frontend" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Piena" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Generale" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Genera una segnalazione GitHub pre-compilata" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Ottieni" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Ottienilo dalla finestra delle impostazioni Web di Tabby" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Dona alla finestra una trasparenza sfocata per lo sfondo" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Livello superiore" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Verde" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Gruppo" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "Hack" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "Aiuta a tenere traccia del numero di installazioni di Tabby nel mondo!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Partecipa alla traduzione di Tabby" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Esadecimale" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "Nascondi" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Nascondi pulsante di chiusura schede" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Nascondi numerazione delle schede" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "Pulsante per nascondere scheda opzioni" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Nascondi la finestra quando in secondo piano" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "Nasconde il terminale agganciato quando si fa click fuori." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Pagina home" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Host" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Chiave host" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Verifica della chiave host" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Tasti scelta rapida" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "Come Tabby si presenta attraverso le variabili dell'ambiente" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "Proxy HTTP" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "Host proxy HTTP" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "Porta proxy HTTP" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Icona" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "Dinamica" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Se disabilitato, solo i profili personalizzati verranno visualizzati nel selettore dei profili" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Riporta immediatamente gli input locali" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "Aumenta la divisione orizzontale" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "Aumenta la divisione verticale" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "Input" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "L'input è inviato mentre digiti" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Modalità di inserimento" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "Input ritorni a capo" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Installato" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "L'installazione dell'aggiornamento chiuderà tutte le schede e riavvierà Tabby." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "Ctrl-C intelligente (copia/annulla)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Interattivo" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Sintassi non valida" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "Salta host" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Vai alla parola successiva" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Vai alla parola precedente" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Mantieni" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Intervallo keep alive (Millisecondi)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "Mantieni il terminale agganciato sempre in primo piano" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Chiave" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "Scambio chiavi" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Tastiera" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "Autenticazione interattiva da tastiera" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "Forza chiusura" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Lingua" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "Ultima firma nota chiave host" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Avvia WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Avvia WinSCP per la sessione SSH attuale" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Scopri come consentire a Tabby di rilevare la cartella di lavoro della shell remota." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "A sinistra" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Consenti alla shell di definire il tasto Meta al posto del sistema operativo" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "Modalità chiara" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Riga per riga" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Editor in linea, l'input viene inviato dopo aver premuto Invio" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Riempimento riga" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Caricamento" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Caricamento configurazioni..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Locale" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Eco locale" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Terminale locale" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Script di accesso" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Clic prolungato per il menu contestuale" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Gestione profili" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "Numero massimo keep Alive" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Massimizza il riquadro attivo" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "Rapporto minimo di contrasto" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Modificato il {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "Mouse" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Sposta scheda a sinistra" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Sposta scheda a destra" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Sposta in \"Non raggruppate\"" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "Spostare il mouse su un riquadro inattivo lo farà attivare" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Nome" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Nome per la nuova configurazione" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "Nome della nuova cartella" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Nativa" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "Nuovo" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Nuova scheda amministratore" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Nuova configurazione IN {platform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "Nome nuovo gruppo" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Nuovo elemento" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Nuovo nome" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Nuovo profilo" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "Nome del nuovo profilo di gruppo" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Nuovo nome profilo" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Nuova scheda" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Nuova scheda: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Nuovo terminale" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Nuova finestra" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "Nuova Finestra" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Nuovo terminale con" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Scheda successiva" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Nessun colore" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Nessun modificatore" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Nessuno" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Normale" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "Peso font normale" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Non trovato" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Notifica sull'attività" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Notifica quando terminato" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Numero di righe conservate nel buffer" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Disattivo" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Ufficiale" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "Nelle discussioni di GitHub" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "Chiudi la scheda solo quando la sessione è esplicitamente terminata" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Opacità" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Apri strumenti di sviluppo" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Apri Impostazioni" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Apri scheda impostazioni: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "Apri pannello SFTP" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "Opzionale" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Opzioni" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Arancione" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "Predefinito S.O." #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "Predefinito S.O. ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "L'output è visualizzato come un dump esadecimale" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "L'output è visualizzato come viene ricevuto" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Modalità di output" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Output ritorni a capo" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "Sovrascrivi il display X11" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "Sovrascrivi locale e sincronizza" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Sovrascrivi remoto e sincronizza" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "Sovrascrivere la configurazione remota e iniziare la sincronizzazione?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "Sovrascrivere la configurazione locale e iniziare la sincronizzazione?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "Progressi di ridimensionamento" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "Riquadri" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "Carta (legacy)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Parità" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "La sincronizzazione parziale della configurazione non è possibile quando questa è cifrata all'interno della cassaforte." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "Pass-through" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "Frase segreta per la chiave privata con hash {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Password" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Incolla" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Incolla dagli appunti" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "Incolla quando non selezionato, altrimenti copia" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Vuoi incollare righe multiple?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "Incolla con il tasto centrale" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Percorso o indirizzo del socket locale X11" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Fissa" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Plugin" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Cartella plugin" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Porta" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Porta aperta" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Porte" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Premi un tasto per riconnetterti" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Premi un tasto adesso" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Previene la chiusura accidentale" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Impedisci l'esecuzione accidentale di comandi incollati" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Scheda precedente" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Chiavi private" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Processo completato" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Nome profilo" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Profili" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Profili e connessioni" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Programma" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Comando proxy" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Viola" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Trasferisci tutta la configurazione di Tabby all'interno della cassaforte" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Connessione rapida" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Esci" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Connessione raw socket" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "Tempo stato pronto (millisecondi)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Recente" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Riconnetti" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "Riconnetti la scheda attuale (serial/telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Rosso" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Espressione regolare" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Note di rilascio" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "Ricorda per {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Remoto" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "Rimuovi spazi bianchi e a ritorni a capo dal testo copiato" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Rinomina" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "Rinomina scheda" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "Rendering" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Riapri l'ultima scheda" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Sostituisci" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Segnala un problema" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "Richiedi una chiave per fare clic sui collegamenti" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Reimposta zoom" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Riavvia la sessione seriale attuale" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Riavvia la sessione SSH attuale" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Riavvia la sessione telnet attuale" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "Riavvia scheda" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Riavvia l'app per applicare le modifiche" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "Vuoi ripristinare le impostazioni predefinite?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "Vuoi ripristinare le impostazioni predefinite ereditate?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "Ripristina le schede del terminale all'avvio dell'app" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "Riusa la sessione per più schede" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "A destra" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "Clic destro" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Esegui come amministratore" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Salva" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Salva una password nel portachiavi" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Salva e applica" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Salva come profilo" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Salva layout come profilo" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Salvato" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Layout salvato" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "Scorri durante la digitazione" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "Scorri il terminale di una pagina verso il basso" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "Scorri il terminale di una pagina verso l'alto" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Scorri il terminale fino in fondo" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "Scorri il terminale fino in cima" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "Scorrimento" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "Scorri il terminale in basso durante l'input utente" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Cerca" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Cerca tema terminale" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "Cerca combinazioni" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "Cerca plugin" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Token di sincronizzazione segreto" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Seleziona" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Seleziona un profilo di base da usare come modello" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "Seleziona tutto" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Seleziona archiviazione" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Seleziona profilo" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Seleziona profilo o inserisci indirizzo" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "Invia byte digitando valori esadecimali" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Invia dati un byte alla volta" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Seriale" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Connessione seriale" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Seriale: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Imposta la frase segreta principale" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Imposta frase segreta" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Imposta password" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Imposta Tabby come %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "Impostare a 0 per disabilitare i profili recenti" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "Imposta il percorso named pipe dell'agente SSH." #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Impostazioni" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Shell" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "La shell non supporta il rilevamento del percorso attuale" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Integrazione shell" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "Visualizza" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "Visualizza il selettore profilo {type}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "Visualizza una casella di conferma quando incolli più righe" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "Visualizza profili integrati nel selettore" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "Visualizza selettore comandi" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Visualizza file di configurazione" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Visualizza predefiniti" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Visualizza mixer" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "Visualizza etichette riquadro (per riorganizzare)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Visualizza l'icona del profilo nella scheda" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Visualizza selettore profilo" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Visualizza i profili recenti nel selettore" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Visualizza note di rilascio" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Visualizza connessioni seriali" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "Visualizza schede in modalità schermo intero" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "Visualizza barra degli strumenti" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Visualizza contenuto della cassaforte" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Supporto grafico Sixel (sperimentale)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "Salta MoTD/banner" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "Avanzamento lento" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "Aggancia la finestra su un lato dello schermo" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "Host proxy SOCKS" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "Porta proxy SOCKS" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "Notifiche" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Codice sorgente" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "Vuoto" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Dividi" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Dividi in basso" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "Dividi in basso" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Dividi a sinistra" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Dividi a destra" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Dividi in alto" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "Dividi in alto" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "Connessione SSH" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "La gestione della connessione SSH è ora fatta attraverso la scheda \"Profili e connessioni\"" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "Password SSH per {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "Standard (legacy)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "Avvio" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Bit stop" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Striscia" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Iscriviti agli aggiornamenti" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Sostituzioni consentite." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "Cambia schema colore" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Cambia profilo" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Cambia profilo nel riquadro attivo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Cambia l'implementazione del frontend del terminale (sperimentale)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Sincronizzazione" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Sincronizza automaticamente" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Host di sincronizzazione" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Sincronizza tasti di scelta rapida" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Sincronizza cassaforte" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Sincronizza impostazioni finestra" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Tab {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Attività della scheda" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby non può avviarsi con i plugin, quindi tutti i plugin di terze parti sono stati disabilitati in questa sessione. \n" "L'errore era:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Notizie e aggiornamenti di Tabby su Twitter" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Schede" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Posizione delle schede" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Larghezza schede" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Sessione telnet" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Terminale" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Sfondo del terminale" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Notifiche del terminale" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "Identificazione del terminale" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Grazie per aver scaricato Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Tema" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Ci sono trasferimenti di file attivi" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Per questa connessione è presente una password salvata" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Questi si applicano a tutti i profili di un dato tipo" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "Questa modifica si applica a tutti i profili di un dato tipo in questo gruppo" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Sottile" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Seleziona se stai sperimentando aliasing, ghosting o altri problemi visivi" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Attiva/disattiva schermo intero" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "Attiva/disattiva ultima scheda" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Attiva/disattiva finestra terminale" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Attiva/disattiva visibilità della finestra di Tabby" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "In alto" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "Riduci spazi bianchi e a capo" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Prova di nuovo" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Prova la password salvata" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "Separa i pannelli della tab selezionata in nuovi pannelli" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Non raggruppate" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Disinstalla" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Sconosciuto" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Codice segreto sconosciuto di tipo {type} per {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Sgancia" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "In alto" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Aggiorna" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Aggiorna alla {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Carica" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Carica come nuova configurazione" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Come chiave meta usa {altKeyName} " #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "Usa ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "Predefinito" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Nome utente" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "Attraverso il metodo CONNECT" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Usa password preimpostata" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Cassaforte" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "La cassaforte è un contenitore protetto da cifratura per proteggere password SSH e frasi segrete delle chiavi private." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "La cassaforte è vuota" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Cassaforte bloccata" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "La cassaforte non è configurata" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "Per consentire la memorizzazione di dati cifrati deve essere impostata la frase segreta principale della cassaforte" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Verifica le chiavi host durante la connessione" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Versione" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Versione: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Trasparenza" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Visive" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Avvisa prima di incollare righe multiple" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Avvisa quando chiudi le connessioni attive" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "Attenzione: la chiave dell'host remoto è improvvisamente cambiata!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Monitoreremo soltanto le versioni di Tabby e del Sistema Operativo." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Benvenuto" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Novità" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "Quando termina una sessione" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "Quando abilitato, i collegamentisono cliccabili solo tenendo premuto questo tasto" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "Quando viene rilevato WinSCP, è possibile avviare una sessione SCP dal menu contestuale." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "Indica se usare una cornice personalizzata o nativa del sistema operativo" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "Impedirà l'apparizione dei Greeting SSH" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Finestra" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "Dimensione finestra lungo il bordo" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "Dimensione finestra fuori dal bordo" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Cornice della finestra" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "Windows" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Windows 10 build 18309 o superiore è raccomandato per ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "Percorso WinSCP" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Separatori di parole" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Cartella di lavoro" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Rilevamento cartella di lavoro" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "Gli avvisi del terminale WSL possono essere silenziati soltanto tramite il regolatore di volume" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "Il terminale WSL supporta solo TrueColor con ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "Inoltro X11" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Giallo" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "Si può modificare più tardi, ma è irrecuperabile se dimenticata." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "In questo momento potresti essere sotto un attacco man-in-the-middle, o la chiave dell'host potrebbe essere stata appena cambiata." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Zoom avanti" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Zoom indietro" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "Dinamico" ================================================ FILE: locale/ja-JP.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: ja\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Japanese\n" "Language: ja_JP\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\"が実行中です。閉じてもよろしいですか?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} コピー" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "メインフォントに不足している文字を表示する際に使用されます" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "すべて中止" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "承認してキーを記憶" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "一度だけ" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "アクセシビリティ" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "アクリル風ウィンドウ" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "追加" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "ポート転送を追加" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "秘密鍵を追加" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "追加..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "行と行の間隔を広げます" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "詳細" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "SSHエージェント" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "SSHエージェント転送" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "SSHエージェントのパイプ名" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "SSHエージェントの指定" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr ".batファイルを開くことを許可 (シェルが正常に動作しない可能性があります)" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "フォルダから端末を素早く開けるようになります" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "常にダーク" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "常にライト" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "外観" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "アプリ" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "アプリケーションの設定" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Tabbyを閉じてもよろしいですか?この画面は設定 -> ウィンドウから無効にすることができます。" #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "本当によろしいですか?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "引数" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "質問する" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "ブラウザタブを閉じる前に確認する" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "サウンド再生" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "認証方法" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "作者" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "自動" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "起動時に新しい端末を自動で開く" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "自動" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "自動アップデート" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "変更を自動的にアップロードし、一分ごとに更新を確認します。" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "利用可能" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "透過の種類" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "Backspaceキー" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "伝送速度" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "行頭に移動" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "カーソルの点滅" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "青色" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "ぼかし" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "太字フォントの太さ" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "下部" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "ブラケットペースト (シェルが対応している必要があります)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "ブロードキャストモードです。中断するにはクリックしてください。" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "標準" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "キャンセル" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "転送速度の変更" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "タブの色を変更" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "マスターパスフレーズを変更" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "アップデートを確認" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "暗号方式" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "クリア" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "最近使用したプロファイルをクリア" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "端末をクリア" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "接続後に端末をクリア" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "クリップボード" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "閉じる" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "閉じて今後表示しない" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "フォーカスしているペインを閉じる" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "他のタブを閉じる" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "タブを閉じる" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "左のタブを閉じる" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "右のタブを閉じる" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "最後のタブを閉じた時にウィンドウも閉じる" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "色" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "配色" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "配色" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "配色" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "すべてのタブを現在開いているタブに統合" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "コマンドライン" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "ネットワーク接続の代わりにコマンドの stdin/stdout を使用します" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "コマンド" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "コンパクト (非推奨)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "設定が消去されました" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "設定をダウンロードしました" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "設定ファイル" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "設定の同期" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "設定をアップロードしました" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "設定" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "プロキシサーバー経由で接続" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "'%s' に接続中..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "最初に別のホストに接続し、プロキシとして使用します" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "接続中" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "接続" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "接続に失敗しました: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "代わりに接続名が使用されます" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "コンテキストメニュー" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "UI要素間の間隔を変更します" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "コピーしました" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "コピー" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "カレントパスをコピー" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "フルパスをコピー" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "選択時にコピー" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "クリップボードにコピー" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "書式付きコピー" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "設定を復号できませんでした" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "新規作成" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "新規ディレクトリを作成" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "現在" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "使用中の配色" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "現在のホスト鍵のフィンガープリント" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "現在のプロセス: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "カーソルの形状" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "カスタム" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "カスタムCSS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "ダークモード" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "データ長" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "デバッグ" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "水平方向の分割サイズを縮小" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "垂直方向の分割サイズを縮小" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "既定の接続方式" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "クイック接続時にデフォルトで使用する接続の種類 (SSH、Telnetなど)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "新しいタブの既定プロファイル" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "既定のグループ設定" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "既定プロファイルの設定" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "既定" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "{type} の既定値" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "削除" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "{name} を削除しますか?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "{fullPath} を削除しますか?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "行全体を削除" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "次の単語を削除" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "前の単語を削除" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "リモート上の設定を消去しますか?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "グループのプロファイルを削除しますか?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "このスクリプトを削除しますか?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Vaultのデータを削除しますか?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "削除中" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "デバイス" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "直接接続" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "無効" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "動的なタブ名を無効にする" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "ドラッグ中はFluent背景を無効化する" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "GPUアクセラレーションを無効にする" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "無効化" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "切断" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "現在のタブを切断する (Serial/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "{host} から切断しますか?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Sixelエスケープシーケンスによって画像を表示します" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "表示" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "中止しない" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "閉じない" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "常にパスワードを要求" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "ドックを常に最前面表示" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "端末をドック表示する" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "ドック時の端末のサイズ" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "ドック時の端末のスペース" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "ドック表示" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "ダブルクリックによるテキスト選択時に区切りとなる文字を設定できます" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "下へ" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "ダウンロード" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "太字のテキストを明るい色で表示" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "複製" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "管理者として複製" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "タブを複製" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "編集" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "ローカル上で編集する" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "有効" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "統計情報を有効化" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "アニメーションを有効化" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "アップデートが利用可能になったら自動的にインストールを開始します。" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "Fluent背景オプションを有効にする" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "合字フォントを有効化" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "グローバルホットキーを有効にする (Ctrl+Space)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "実験的な Windows ConPTY API を有効にする" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "設定ファイルを暗号化する" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "行末に移動" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "環境" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "設定を消去" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Vaultを消去" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "{plugin} のエラー:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "完全一致" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "例:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "不具合が報告されているWindows10風の実験的な背景" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "エクスポート" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "フォールバックフォント" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "ファイル転送" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "ファイル: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "フィルター" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "固定" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Fluent背景はドラッグ中にラグを発生させることがあります" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "すべてのペインにフォーカス" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "一度にすべてのペインをフォーカス (ブロードキャスト)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "すべてのタブにフォーカスする" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "一度にすべてのタブにフォーカス (ブロードキャスト)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "マウスに合わせてフォーカス" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "次のペインにフォーカス" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "ペイン {number} にフォーカス" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "前のペインにフォーカス" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "上のペインにフォーカス" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "下のペインにフォーカス" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "左側のペインにフォーカス" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "右側のペインにフォーカス" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "配色設定に合わせる" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "フォント" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "キーボードショートカット利用時に反映されます" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "強制 CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "強制 CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "強制 LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "指定されたSSHエージェントを強制的に使用します。" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "破棄" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "ポート転送" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "転送済みポート" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "使用中の配色から" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "システムに従う" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "使用中のテーマから" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "フロントエンド" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "フル" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "全般" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Githubに新しいissueを投稿" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "インストール" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Tabby Web版の設定画面から確認することができます" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "ぼかしの入った透過ウィンドウに変更します" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "上へ" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "緑色" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "グループ" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "詳細" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "世界中のTabbyのインストール数の調査にご協力ください!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Tabbyの翻訳に参加する" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "16進数" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "非表示" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "タブの閉じるボタンを非表示" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "タブのインデックスを非表示" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "タブの詳細設定ボタンを非表示" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "フォーカスが外れた時にウィンドウを非表示にする" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "画面外をクリックするとドックした端末が非表示になります" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "ホームページ" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "ホスト" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "ホスト鍵" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "ホスト鍵の検証" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "ホットキー" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "環境変数を利用して、Tabbyを他の端末として認識させます" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "HTTPプロキシ" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "HTTPプロキシホスト" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "HTTPプロキシポート" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "アイコン" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "可変" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "無効にした場合、プロファイルセレクターにカスタムプロファイルのみが表示されます" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "送信した入力をローカル上で直ちに表示します" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "水平方向の分割サイズを拡大" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "垂直方向の分割サイズを拡大" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "入力" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "入力する度に入力が送信されます" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "入力モード" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "入力の改行" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "インストール済み" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "アップデートをインストールすると、すべてのタブが閉じられ、Tabbyを再起動します。" #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "スマートなCtrl+C (コピー/中止)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "インタラクティブ" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "無効な構文" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "踏み台サーバー" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "次の単語に移動" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "前の単語に移動" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "維持" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Keep-Alive 間隔 (ミリ秒)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "ドックされた端末を常に最前面に表示" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "キー" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "鍵交換" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "キーボード" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "キーボードインタラクティブ認証" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "強制終了" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "言語" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "最後に使われたホスト鍵のフィンガープリント" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "WinSCPを起動" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "現在のSSHセッションでWinSCPを起動" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "リモート上の作業ディレクトリを自動検出する方法をご紹介します。" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "左側" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "OSの代わりにシェルにメタキーを処理させます" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "ライトモード" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "一行ごとに" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Enterキーを押すと入力が送信されます" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "行間" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "読み込み中" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "設定を読み込み中..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "ローカル" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "ローカルエコー" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "ローカル端末" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "ログインスクリプト" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "長押しするとコンテキストメニューが表示されます" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "プロファイルの管理" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "最大Keep-Alive" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "アクティブなペインを最大化" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "最小コントラスト比" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "更新日 {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "マウス" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "タブを左に移動" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "タブを右に移動" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "\"未分類\" に移動" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "マウスの移動に合わせてアクティブなペインを切り替えます。" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "名前" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "新しい設定の名前" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "新しいディレクトリの名前" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "標準" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "新規" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "新しい管理者権限タブ" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "{platform} の新しい設定" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "新しいグループ名" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "新しい項目" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "新しい名前" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "新規プロファイル" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "新規グループ" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "新しいプロファイル名" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "新しいタブを開く" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "新しいタブ: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "新しい端末" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "新しいウィンドウを開く" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "新しいウィンドウ" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "新しいプロファイルを追加" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "次のタブ" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "色指定なし" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "変更しない" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "なし" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "標準" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "標準フォントの太さ" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "見つかりませんでした" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "アクティビティを通知する" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "完了時に通知する" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "バッファに保持される行数" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "オフ" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "公式" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "GitHub Discussions" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "セッションが明確に終了した場合のみタブを閉じます" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "不透明度" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "DevToolsを開く" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "設定を開く" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "設定タブを開く: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "SFTP パネルを開く" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "オプション" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "設定" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "橙色" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "OSの既定" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "OSの既定 ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "16進ダンプとして出力されます" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "受信したデータがそのまま出力されます" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "出力モード" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "出力の改行" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "X11ディスプレイを上書きする" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "ローカルを上書きして同期" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "リモートを上書きして同期" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "リモート上の設定を上書きして、同期を開始しますか?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "現在のローカル上の設定を上書きして、同期を開始しますか?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "ペインサイズの変更幅" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "ペイン" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "ペーパー (非推奨)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "パリティ" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "Vaultによって設定ファイルを暗号化した場合、設定の一部だけを同期から外すことはできません。" #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "パススルー" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "秘密鍵のパスフレーズ ハッシュ値 {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "パスワード" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "貼り付け" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "クリップボードから貼り付け" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "通常は貼り付け、テキスト選択時のみコピー" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "複数行貼り付けを実行してもよろしいですか?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "中クリックで貼り付け" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "ローカル上のX11ソケットのパスまたはアドレス" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "ピン留めする" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "プラグイン" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "プラグインのフォルダー" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "ポート" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "ポートが開いています" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "ポート" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "再接続するには何かキーを押してください" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "キーを押してください" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "偶発的な終了を防止" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "貼り付けたコマンドの偶発的な実行を防止することができます" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "前のタブ" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "秘密鍵" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "処理完了" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "プロファイル名" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "プロファイル" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "プロファイルと接続" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "プログラム" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "プロキシコマンド" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "紫色" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Tabbyの設定をすべてVaultに保存します" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "クイック接続" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "終了" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Rawソケット接続" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "タイムアウト (ミリ秒)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "最近" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "再接続" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "現在のタブを再接続する (Serial/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "赤色" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "正規表現(Regex)" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "リリースノート" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "{time} 後に再認証" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "リモート" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "コピーしたテキストに含まれる前後の余分なスペースや改行を除去します" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "名前を変更" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "タブの名前を変更" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "レンダリング" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "最後に閉じたタブを開く" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "置換" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "問題を報告" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "特定のキーを使用してリンクを開く" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "拡大/縮小をリセット" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "現在のシリアルセッションを再起動" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "現在のSSHセッションを再起動" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "現在のTelnetセッションを再起動" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "タブを再起動" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "変更を反映するには再起動が必要です" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "設定を既定に戻してもよろしいですか?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "設定を継承元の既定に戻してもよろしいですか?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "起動時に以前開いていたタブを復元する" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "複数のタブでセッションを再利用する" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "右側" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "右クリック" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "管理者として実行" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "保存" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "キーチェーンにパスワードを保存する" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "保存して反映" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "プロファイルとして保存" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "プロファイルとしてレイアウトを保存" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "保存しました" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "保存されたレイアウト" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "入力時にスクロール" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "1ページ分下にスクロール" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "1ページ分上にスクロール" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "端末を最下部までスクロール" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "端末を最上部までスクロール" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "バックスクロール" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "入力時に端末を最下部にスクロールします" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "検索" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "配色を検索" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "ホットキーを検索" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "プラグインを検索" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "シークレット同期トークン" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "選択" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "テンプレートとして使用する基本プロファイルを選択" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "すべて選択" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "ファイルストレージを選択" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "プロファイルを選択" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "プロファイルの選択、またはアドレスを入力" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "16進数で入力したバイトを送信" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "1バイトごとにデータを送信します" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "シリアル" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "シリアル接続" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "シリアル: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "マスターパスフレーズを設定" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "パスフレーズを設定" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "パスワードを設定" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Tabbyを %COMSPEC% に設定" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "セレクターに最近使用したプロファイルを表示したくない場合は、0に設定してください" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "SSHエージェントの名前付きパイプのパスを指定します。" #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "設定" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "シェル" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "シェルがカレントパスの検出に対応していません" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "シェル統合" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "表示" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "{type} プロファイルセレクターを表示" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "複数行の貼り付けをする際に確認画面を表示します" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "標準プロファイルをセレクターに表示" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "コマンドセレクターを表示" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "設定ファイルを表示" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "既定を表示" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "ミキサーを表示" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "ペインラベルを表示 (再配置向け)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "タブにプロファイルアイコンを表示" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "プロファイルセレクターを表示" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "最近使用したプロファイルの表示数" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "リリースノートを表示" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "シリアル接続を表示" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "全画面表示時にタブを表示" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "ツールバーを表示" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Vaultのデータを表示" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Sixel Graphicsのサポート (実験的)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "MoTD/バナーをスキップ" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "低速送信" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "画面の端にウィンドウをスナップします" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "SOCKSプロキシ" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "SOCKSプロキシホスト" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "SOCKSプロキシポート" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "サウンド" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "ソースコード" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "UI間隔" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "分割" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "下部に分割" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "下部に分割" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "左側に分割" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "右側に分割" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "上部に分割" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "上部に分割" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "SSH接続" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "SSH接続の管理は「プロファイルと接続」からできるようになりました。" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "{user}@{host}:{port} のSSHパスワード" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "標準 (非推奨)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "起動時" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "ストップビット" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "ストリップ" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "最新情報を受け取る" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "置き換えに対応しています" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "配色切り替え" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "プロファイルを切り替える" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "アクティブなペインのプロファイルを切り替える" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "端末のフロントエンド実装を切り替える (実験的)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "同期" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "自動同期" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "同期サーバー" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "ホットキーの同期" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Vaultの同期" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "ウィンドウ設定の同期" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "タブ {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "タブのアクティビティ" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "プラグインが原因でTabbyの起動に失敗しました。このセッションではすべてのサードパーティ製のプラグインが無効になっています。エラー:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "TwitterでTabbyの最新情報やアップデートを配信中" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "タブ" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "タブの位置" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "タブの幅" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Telnetセッション" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "端末" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "端末の背景" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "端末音" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "端末の識別情報" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Tabbyをダウンロードしてくださり、ありがとうございます!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "テーマ" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "ファイル転送を使用中" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "この接続に使用するパスワードを保存しています。" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "すべての同一プロファイルに反映されます" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "グループ内のすべての同一プロファイルに反映されます" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "スリム" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "画像のギザギザやずれて見えるなど表示の乱れが軽減される場合があります" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "全画面表示に切り替え" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "最後のタブに切り替え" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "端末ウィンドウの切り替え" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Tabbyウィンドウの表示を切り替え" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "上部" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "スペースや改行を取り除く" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "再試行" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "保存されたパスワードを試みています" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "現在のタブペインを分割" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "未分類" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "アンインストール" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "不明" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "タイプ {type} の {key} の不明なシークレット" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "ピン留めを外す" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "上へ" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "アップデート" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "{version} にアップグレード" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "アップロード" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "新しい設定としてアップロード" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "メタキーとして {altKeyName} を使用する" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "ConPTYを使用する" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "ユーザーの既定" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "ユーザー名" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "CONNECTメソッドを使用します" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "プリセットパスワードの使用" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Vault" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "VaultはSSHパスワードや秘密鍵パスフレーズなどの機密性の高い情報を保存するための常時暗号化されたコンテナです。" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Vaultにデータは保存されていません" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Vaultはロックされています" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "Vaultが設定されていません" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "機密性の高い情報を保存するには、Vaultにマスターパスフレーズを設定する必要があります" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "接続時にホスト鍵を検証" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "バージョン" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "バージョン: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "磨りガラス" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "グラフィック表示" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "複数行貼り付け時に警告" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "使用中の接続を閉じる際に警告" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "警告: リモートホストのキーが突然変更されました!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "TabbyとOSのバージョンのみを収集しています。" #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "ようこそ" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "最新情報" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "セッション終了時" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "有効にすると、特定のキーを押しながらクリックした時のみリンクを開きます" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "WinSCPが検出されると、コンテキストメニューからSCPセッションを起動することができます。" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "カスタムウィンドウを使用するか、OSの標準ウィンドウを使用するかを選択できます。" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "SSH接続時のメッセージが表示されなくなります" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "ウィンドウ" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "画面の端から平行方向の幅" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "画面の端から垂直方向の幅" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "ウィンドウのフレーム" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "ウィンドウ" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "ConPTYにはWindows 10ビルド18309以上を推奨します" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "WinSCPのパス" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "区切り文字" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "作業ディレクトリ" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "作業ディレクトリの検出" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "WSLによる端末ベルは音量ミキサーでのみミュートすることができます" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "WSL端末はConPTYによるTrueColorのみをサポートしています" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "X11転送" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "黄色" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "後から変更できますが、忘れた場合復元することはできません。" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "現在中間者攻撃を受けているか、もしくはホスト鍵が変更された可能性があります。" #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "拡大" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "縮小" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "ダイナミック" ================================================ FILE: locale/ko-KR.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: ko\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Korean\n" "Language: ko_KR\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" 명령어가 동작중입니다. 창을 닫으시겠습니까?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} 복사" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "설정된 폰트 누락시 대체하기 위한 폰트" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "모두 중지" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "허용 후 키 저장" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "지금만 허용하기" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "접근성" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "아크릴 스타일의 배경" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "추가" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "포트 포워딩 추가" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "개인 키(Private key) 추가" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "추가..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "행간 간격" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "고급" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "에이전트" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "에이전트 포워딩" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "에이전트 연계 경로" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "에이전트 유형" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "탭에 .bat 파일 열기를 허용합니다. 몇몇 쉘 환경에서 동작하지 않을 수 있습니다." #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "일부 폴더에서 터미널을 빨리 열 수 있도록 합니다" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "다크 모드" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "라이트 모드" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "모양" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "응용 프로그램" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "응용 프로그램 설정" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Tabby를 정말로 닫으시겠습니까? 더 이상 이 질문을 보지 않으려면 설정 -> 창 에서 변경할 수 있습니다." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "확실한가요?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "매개 변수" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "질문하기" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "브라우저 탭을 닫기 전에 물어보기" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "소리" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "인증 방법" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "만든 사람" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "자동" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "앱 시작 시 터미널을 자동으로 열기" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "자동" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "자동 업데이트" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "자동으로 변경사항 업로드 후 매 분마다 갱신 확인" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "사용 가능" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "배경 유형" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "백스페이스 키 동작" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "전송 속도" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "행 시작 부분" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "커서 깜박임" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "파란색" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "흐림 효과" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "굵은 글꼴 두께" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "아래" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "괄호(Bracketed)식 붙여넣기 (쉘 지원 필요)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "브로드캐스트 모드. 취소하려면 아무 곳이나 클릭하세요." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "빌트인" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "취소" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "baud rate 속도를 변경합니다" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "탭 색상 변경" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "마스터 비밀번호 변경" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "업데이트 확인" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "암호화" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "지우기" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "최근 프로필 삭제" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "터미널 비우기" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "연결 후 터미널 지우기" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "클립보드" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "닫기" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "닫고 다시 보여주지 않음" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "보고 있는 항목 닫기" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "다른 탭 닫기" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "탭 닫기" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "왼쪽 탭들 모두 닫기" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "오른쪽 탭들 모두 닫기" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "마지막 탭을 닫은 후 창 닫기" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "색상" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "색상 구성" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "색상 구성" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "색상" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "모든 탭을 현재 탭으로 합치기" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "명령줄" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "명령어의 네트워크 연결 대신 표준 입출력이 사용됩니다." #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "명령어" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "컴팩트 (레거시)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "설정 삭제됨" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "설정 다운로드됨" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "설정 파일" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "설정 동기화" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "설정 업로드됨" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "설정" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "프록시 서버를 통해 연결하기" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "\"%s\"에 연결하기" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "다른 호스트에 먼저 연결 후 프록시로 사용" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "연결 중" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "연결" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "연결 실패: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "연결 이름이 대신 사용됩니다." #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "컨텍스트 메뉴" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "UI 요소 간 간격을 변경합니다" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "복사됨" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "복사" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "현재 경로 복사" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "전체 경로 복사" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "선택 영역 복사" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "클립보드에 복사" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "포맷과 함께 복사" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "설정 해독에 실패했습니다." #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "생성" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "디렉토리 생성" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "현재" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "현재 색상 구성" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "현재 호스트 키 핑거프린트" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "현재 프로세스: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "커서 모양" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "사용자 정의" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "사용자 정의 CSS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "다크 모드" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "데이터 비트" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "디버깅" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "가로 분할 크기 작게" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "세로 분할 크기 작게" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "기본 연결 타입" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "빠른 연결에서 사용될 기본 연결 타입을 지정합니다. (ex. SSH, Telnet)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "새 탭의 기본 프로필" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "기본 프로필 그룹 설정" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "기본 프로필 설정" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "기본값" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "{type} 의 기본값" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "삭제" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "{name} 을/를 삭제하시겠습니까?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "{fullPath} 를 삭제할까요?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "전체 라인 삭제" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "다음 단어 삭제" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "이전 단어 삭제" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "리모트 설정을 삭제하시겠습니까?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "그룹의 프로필을 삭제하시겠습니까?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "이 스크립트를 삭제하시겠습니까?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Vault 내용을 삭제하시겠습니까?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "삭제 중" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "장치" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "직접 연결" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "비활성화" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "동적 탭 제목 비활성화" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "창 이동하는 동안 반투명 배경 끄기" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "GPU 가속 비활성화" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "비활성화됨" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "연결 끊기" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "현재 탭 연결 해제 (Serial/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "{host} 로부터 연결을 끊으시겠습니까?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Sixel 이스케이프 시퀀스로 이미지 표시" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "표시할 곳" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "중단하지 않음" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "닫지 않음" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "기억하지 않기" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "독을 항상 맨 위에" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "터미널 도킹" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "도킹된 터미널 크기" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "도킹된 터미널 공간" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "도킹" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "더블 클릭으로 선택하여 해당 문자 끝에 중단" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "아래" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "다운로드" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "밝은 색으로 굵은 글꼴 채우기" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "복제" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "관리자에서 복제" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "탭 복제" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "편집" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "로컬 편집" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "활성화" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "통계 전송 허용" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "애니메이션 활성화" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "업데이트 가능할 때 자동으로 설치하도록 활성" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "fluent 배경 활성화" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "합자(ligature) 활성화" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "전역 단축키 활성 (Ctrl-Space)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "실험적인 Windows ConPTY API 사용" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "설정 파일 암호화" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "줄 끝" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "환경" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "설정 지우기" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Vault 지우기" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "{plugin} 오류:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "완전 일치" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "예시:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "실험 버전의 Windows 10에서 배경 스타일이 충돌할 수 있습니다" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "내보내기" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "대체 글꼴" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "파일 전송" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "파일: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "필터" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "고정" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "반투명 배경으로 인해 창 이동 지연이 발생할 수도 있습니다" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "모든 항목 포커스" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "모든 항목을 한번에 포커스 (방영)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "모든 탭 포커스" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "모든 탭을 한번에 포커스 (브로드캐스트)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "마우스를 따라 포커스" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "다음 항목 포커스" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "창 {number} 포커스" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "이전 항목 포커스" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "위 항목 포커스" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "아래 항목 포커스" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "왼쪽 항목 포커스" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "오른쪽 항목 포커스" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "색상표 설정을 따릅니다" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "글꼴" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "키보드 단축키 사용시" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "CR 강제" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "CRLF 강제" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "LF 강제" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "특정 SSH 에이전트로 연결 유형 강제" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "소거" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "포트 포워딩" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "포워딩된 포트" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "색상 구성에서" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "시스템에 따름" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "테마에서" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "프론트앤드" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "전체" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "일반" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "미리 지정된 양식을 생성하여 Github 이슈 작성" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "받기" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Tabby 웹 설정 창에서 받기" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "배경을 투명하고 흐릿하게 표시합니다." #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "상위 폴더로" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "녹색" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "그룹" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "핵" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "전 세계적으로 Tabby 가 설치되어 어떻게 사용하는지 추적을 도와주세요!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Tabby 번역 돕기" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "16진수" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "숨기기" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "탭 닫기 버튼 숨기기" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "탭 번호 숨기기" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "탭 옵션 버튼 숨기기" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "포커스 해제 시 창 숨기기" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "터미널 밖으로 클릭 시 도킹된 터미널 숨기기" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "홈페이지" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "호스트" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "호스트 키" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "호스트 키 확인" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "단축키" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "Tabby가 환경 변수에서 표시되는 방식" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "HTTP 프록시" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "HTTP 프록시 호스트" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "HTTP 프록시 포트" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "아이콘" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "가변" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "비활성화 시, 사용자 지정 프로필만 표시됩니다" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "로컬 입력 란에 즉시 출력" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "가로 분할 크기 크게" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "세로 분할 크기 크게" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "입력" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "입력한 그대로 입력" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "입력 모드" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "개행 입력" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "설치됨" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "업데이트 설치 시 모든 탭이 닫히고 Tabby 가 재시작됩니다." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "지능적인 Ctrl-C (복사/중단)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "상호작용" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "올바르지 않은 구문입니다." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "점프 호스트" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "다음 단어로 이동" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "이전 단어로 이동" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "유지" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "유지 주기 (밀리초)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "도킹된 터미널을 항상 위로 유지" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "키" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "키 교환" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "키보드" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "키보드 상호작용 인증" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "종료" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "언어" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "최근 알려진 호스트 키 지문" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "WinSCP 실행" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "현재 SSH 세션용으로 WinSCP 실행" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Tabby가 원격 쉘에서 작업 디렉토리 감지를 허용하는 방법 알아보기" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "왼쪽" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "메타 키 입력을 OS 대신 쉘에서 결정" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "라이트 모드" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "라인별" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "줄 편집기, 입력한 내용을 Enter 키 누른 후 전송" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "줄 간격" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "불러오는 중" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "설정을 불러오는 중..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "로컬" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "로컬 echo" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "로컬 터미널" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "로그인 스크립트" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "길게 클릭하여 메뉴 표시" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "프로필 관리" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "최대 유지 횟수" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "활성 항목 최대화" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "최소 명암비" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "{date} 에 수정" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "마우스" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "탭을 왼쪽으로 이동" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "탭을 오른쪽으로 이동" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "\"그룹화되지 않음\"으로 이동" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "마우스를 비활성 창 위로 이동하면 창이 활성화됩니다" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "이름" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "새 설정 이름" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "새 디렉토리 이름" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "네이티브" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "추가" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "새 관리자 탭" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "{platform} 새 구성" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "새 그룹 이름" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "새 아이템" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "새 이름" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "새 프로필" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "새 프로필 그룹" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "새 프로필 이름" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "새 탭" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "새 탭: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "새 터미널" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "새 창" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "새 윈도우" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "기본 프로필로 새로 만들기" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "다음 탭" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "색 없음" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "키 조합 없음" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "없음" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "일반" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "일반 글꼴 두께" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "검색된 결과 없음" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "활동 알림" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "완료되면 알림" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "버퍼에 유지할 라인 수" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "끄기" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "공식" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "GitHub 토론에서" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "세션이 명확하게 종료된 경우에만 탭을 닫습니다." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "불투명도" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "DevTools 열기" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "설정 열기" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "설정 탭 열기: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "SFTP 패널 열기" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "선택사항" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "옵션" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "주황색" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "OS 기본값" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "OS 기본값 ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "16진수 덤프로 출력이 표시됩니다" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "수신되는 대로 출력이 표시됩니다" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "출력 모드" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "개행 출력" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "X11 디스플레이 오버라이드" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "로컬 덮어쓰기 및 동기화" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "원격 덮어쓰기 및 동기화" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "원격 구성을 덮어쓰고 동기화를 시작할까요?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "로컬 구성을 덮어쓰고 동기화를 시작할까요?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "창 크기 조절 단계" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "패널" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "종이 (레거시)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "패리티" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "구성이 Vault를 통해 암호화된 경우 부분 구성 동기화를 수행할 수 없습니다." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "왼쪽 글자 삭제" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "해시 {hash} 의 개인 키(Private key) 암호..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "비밀번호" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "붙여넣기" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "클립보드에서 붙여넣기" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "선택 항목이 없으면 붙여넣기, 있으면 복사" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "여러 줄을 붙여 넣을까요?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "가운데 클릭으로 붙여넣기" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "로컬 X11 소켓의 경로 혹은 주소" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "고정" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "플러그인" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "플러그인 폴더" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "포트" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "포트 열림" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "포트" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "다시 연결하려면 아무 키나 누르세요" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "지금 키를 누르세요" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "실수로 창을 닫는 것을 방지합니다" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "붙여넣은 명령이 실수로 실행되는 것을 방지합니다" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "이전 탭" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "비밀 키" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "처리 완료" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "프로필 이름" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "프로필" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "프로필 및 연결" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "프로그램" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "프록시 명령어" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "보라" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Tabby의 모든 설정을 vault에 기록합니다" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "빠른 연결" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "끝내기" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Raw 소켓 연결" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "타임아웃 (밀리초)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "최근" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "재접속" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "현재 탭 재연결 (Serial/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "빨강" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "정규식" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "릴리스 노트" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "{time} 동안 기억" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "원격" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "복사된 텍스트 양 끝의 공백과 줄바꿈을 제거합니다" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "이름 바꾸기" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "탭 이름 수정" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "렌더링" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "마지막 탭 다시 열기" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "덮어쓰기" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "문제 신고하기" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "링크를 클릭할 때 필요한 키 조합" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "확대/축소 초기화" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "현재 Serial 세션 재시작" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "현재 SSH 세션 재시작" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "현재 텔넷 세션 재시작" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "탭 다시시작" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "변경 사항을 적용하려면 앱을 다시 시작하세요" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "기본 설정으로 복원할까요?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "기본 프로필 설정으로 복원할까요?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "앱 시작 시 터미널 탭 복원" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "여러 탭에 세션 재사용" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "오른쪽" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "오른쪽 클릭" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "관리자 권한으로 실행" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "저장하기" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "비밀번호를 키체인에 저장" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "저장 및 적용" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "프로필로 저장" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "프로파일로 레이아웃 저장" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "저장됨" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "저장된 레이아웃" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "입력 시 스크롤" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "한 페이지 아래로 스크롤" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "한 페이지 위로 스크롤" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "맨 아래로 스크롤" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "맨 위로 스크롤" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "스크롤백" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "사용자 입력 시 터미널을 맨 아래로 스크롤 합니다" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "검색" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "색상 구성 검색" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "단축키 검색" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "플러그인 검색" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "비밀 동기화 토큰" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "선택" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "템플릿으로 사용할 프로필 선택" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "전체 선택" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "저장소에서 파일 선택" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "프로필 선택" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "프로필 선택 또는 주소 입력" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "16진수 값을 입력하여 바이트 전송" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "데이터를 한 번에 한 바이트씩 전송합니다" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Serial" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Serial 연결" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Serial: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "마스터 암호 설정" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "암호 설정" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "비밀번호 설정" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Tabby를 %COMSPEC%로 설정" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "최근 프로필 목록을 숨기려면 0을 입력하세요" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "SSH 에이전트의 명명된 파이프 경로를 설정합니다." #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "설정" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "셸" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Shell이 현재 경로 감지를 지원하지 않습니다." #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "셸 통합" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "보이기" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "{type} 프로필 선택창 열기" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "여러 줄을 붙여넣을 때 확인 상자 표시" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "프로필 선택창에 기본 프로필 표시" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "명령 선택창 열기" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "구성 파일 보기" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "기본값 표시" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "믹서 표시" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "항목 라벨 표시 (재배열 용도)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "탭에 프로필 아이콘 표시" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "프로필 선택창 열기" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "프로필 선택창에 최근 프로필 표시" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "릴리스 노트 보기" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Serial 연결 보기" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "전체화면 모드에서 탭 보이기" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "도구모음 표시" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Vault 내용 확인" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Sixel 그래픽 지원 (실험)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "MoTD/banner 무시" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "저속 전송" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "화면 가장자리에 창을 스냅합니다." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "SOCKS 프록시" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "SOCKS 프록시 호스트" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "SOCKS 프록시 포트" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "사운드" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "소스 코드" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "UI 간격" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "분할" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "아래쪽으로 분할" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "아래쪽으로 분할" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "왼쪽으로 분할" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "오른쪽으로 분할" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "위쪽으로 분할" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "위쪽으로 분할" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "SSH 연결" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "이제 \"프로필 및 연결\" 탭을 통해 SSH 연결 관리가 수행됩니다." #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "{user}@{host}:{port} 의 SSH 비밀번호" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "기본 (레거시)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "시작" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "정지 비트" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "스트립(Strip)" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "새로운 소식 구독하기" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "대체를 허용합니다." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "색상 구성 전환" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "프로필 전환" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "활성화된 패널의 프로파일을 전환" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "터미널 프론트엔드 구현 변경 (실험적)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "동기화" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "자동으로 동기화" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "호스트 동기화" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "단축키 동기화" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Vault 동기화" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "창 구성 동기화" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "탭 {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "탭 활동" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby가 플러그인과 함께 시작할 수 없으므로, 이 세션에서 모든 타사 플러그인이 비활성화되었습니다. 오류는 다음과 같습니다:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Twitter에서 Tabby의 최신 정보를 받을 수 있습니다" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "탭" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "탭 위치" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "탭 너비" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "텔넷 세션" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "터미널" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "터미널 배경색" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "터미널 벨" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "터미널 식별 방식" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Tabby를 다운로드 해주셔서 감사합니다!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "테마" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "활성화된 파일 전송이 있습니다" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "이 연결에 대해 저장된 비밀번호가 있습니다." #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "이와 같은 유형의 모든 프로필에 적용됩니다." #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "이 그룹의 해당 유형을 가진 모든 프로필에 적용됩니다" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "얇게" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "계단 현상이나 고스팅 현상 등, 시각적 문제가 있을 경우 이 옵션을 활성화하세요." #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "전체화면 전환" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "마지막 탭 전환" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "터미널 창 전환" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Tabby 창 표시 전환" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "위" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "공백 및 개행문자 제거" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "다시 시도" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "저장된 비밀번호로 시도 중" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "현재 탭의 창을 별도의 탭으로 전환" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "그룹 해제됨" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "설치 제거" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "알 수 없음" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "{key} 에 대한 알 수 없는 타입 {type}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "고정 해제" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "위" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "업데이트" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "{version} 로 업그레이드" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "업로드" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "새로운 설정으로 업로드" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "{altKeyName} 을 메타 키로 사용" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "ConPTY 사용" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "사용자 기본값" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "사용자 이름" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "CONNECT 메서드 사용" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "사전 설정된 비밀번호 사용" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Vault" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Vault는 SSH 암호 및 개인 키 암호와 같은 비밀을 위한 항상 암호화된 컨테이너입니다." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Vault가 비어있음" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Vault가 잠겨 있음" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "Vault가 설정되어 있지 않습니다." #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "비밀 저장을 허용하려면 Vault 마스터 암호를 설정해야 합니다" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "연결 시 호스트 키 확인" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "버전" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "버전: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "생동감" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "시각 효과" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "여러 줄을 붙여넣을 때 경고" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "활성 연결을 종료할 때 경고" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "경고: 원격 호스트의 키가 갑자기 변경되었습니다!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "귀하의 Tabby 및 OS 버전만 추적합니다." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "환영합니다" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "새로운 기능" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "세션이 종료될 때" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "활성화되면 키 조합을 누른 상태에서만 링크를 클릭할 수 있습니다" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "WinSCP가 발견되면 컨텍스트 메뉴에서 SCP 세션을 시작할 수 있습니다." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "사용자 지정 창 또는 OS 기본 창 사용 여부" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "SSH 연결 시 메세지 표시하지 않음" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "창" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "화면 가장자리부터 수평 너비" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "화면 가장자리부터 수직 너비" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "창 프레임" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "창" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "ConPTY를 위해서는 Windows 10 빌드 18309 이상이 권장됩니다" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "WinSCP 경로" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "단어 구분 기호" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "작업 폴더" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "작업 디렉토리 감지" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "WSL 터미널의 벨은 오직 볼륨 믹서를 통해서만 음소거할 수 있습니다." #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "WSL terminal의 TrueColor는 ConPTY가 활성화 되어있을 때만 지원됨" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "X11 포워딩" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "노랑" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "나중에 변경할 수 있으나, 비밀번호를 잊으면 복구할 수 없습니다." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "지금 중간자 공격을 받고 있거나 호스트 키가 방금 변경되었을 수도 있습니다." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "확대" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "축소" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "동적" ================================================ FILE: locale/pl-PL.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: pl\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Polish\n" "Language: pl_PL\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" jest nadal uruchomiony. Zamknąć?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "Kopia {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "Druga rodzina czcionek używana do wyświetlania brakujących znaków w głównym foncie" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Przerwij wszystkie" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Akceptuj i zapamiętaj klucz" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Zaakceptuj tylko tym razem" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "Dostępność" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Akrylowe tło" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Dodaj" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Dodaj przekierowanie portów" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Dodaj klucz prywatny" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Dodaj..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Dodatkowy odstęp między liniami" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Zaawansowane" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Agent" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Przekierowanie Agenta" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Ścieżka potoku Agenta" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Typ agenta" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Pozwala na otwieranie plików .bat w zakładkach, ale psuje niektóre powłoki" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Pozwala na szybkie otwarcie terminalu w wybranym folderze" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "Zawsze ciemny" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Zawsze jasny" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Wygląd" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Aplikacja" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Ustawienia aplikacji" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Czy na pewno chcesz zamknąć Tabby? Możesz wyłączyć ten monit w Ustawienia -> Okno." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Czy jesteś pewien?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Argumenty" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Zadaj pytanie" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Zapytaj przed zamknięciem karty przeglądarki" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Dźwiękowy" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Metoda uwierzytelniania" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Autor" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Auto" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Automatycznie otwórz terminal przy starcie aplikacji" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Automatycznie" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Automatyczne aktualizacje" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Automatycznie wysyłaj zmiany i sprawdzaj aktualizacje co minutę" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Dostępne" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Typ tła" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "Tryb klawisza Backspace" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Prędkość transmisji szeregowej (boud)" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Początek wiersza" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Migający kursor" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Niebieski" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Rozmycie" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Rozmiar pogrubionej czcionki" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Dół" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Wklejanie cudzysłowu (wymaga wsparcia powłoki)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "Broadcast mode. Kliknij gdziekolwiek, aby anulować." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Wbudowane" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Anuluj" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Zmień współczynnik baud" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Zmień kolor zakładki" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Zmień hasło główne" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Sprawdź dostępność aktualizacji" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Szyfry" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Wyczyść" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Wyczyść ostatnie profile" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Wyczyść terminal" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "Wyczyść terminal po nawiązaniu połączenia" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Schowek" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Zamknij" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Zamknij i nie pokazuj ponownie" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Zamknij wyróżniony panel" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Zamknij inne karty" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Zamknij kartę" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Zamknij karty na lewo" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Zamknij karty na prawo" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "Zamknij okno po zamknięciu ostatniej zakładki" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Kolor" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Schemat kolorów" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Schematy kolorów" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Kolory" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Scal wszystkie inne karty z aktywną kartą" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Wiersz poleceń" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "Zamiast połączenia sieciowego użyto komendy stdin/stdout" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Polecenia" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "Compact (legacy)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Konfiguracja usunięta" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Konfiguracja pobrana" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Plik konfiguracyjny" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Synchronizacja konfiguracji" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Konfiguracja przesłana" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Konfiguracje" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Połącz się przez serwer proxy" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "Połącz z \"%s\"..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Połącz się najpierw z innym hostem i użyj go jako proxy" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "Łączenie" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Połączenie" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "Połączenie nie powiodło się: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "Zamiast tego użyta zostanie nazwa połączenia" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Menu kontekstowe" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "Kontroluje odstępy między elementami" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Skopiowano" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Kopiuj" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Skopiuj bieżącą ścieżkę" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Kopiuj pełną ścieżkę" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Kopiuj przy wybraniu" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Skopiuj do schowka" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Kopiuj wraz z formatowaniem" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Nie można odszyfrować konfiguracji" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Stwórz" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Stwórz folder" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Aktualny" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Aktualny schemat kolorów" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Odcisk klucza bieżącego hosta" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Bieżący proces: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Kształt kursora" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Własny" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "Niestandardowy CSS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "Tryb ciemny" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Bity danych" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Debugowanie" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Zmniejsz rozmiar poziomego rozkładu" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Zmniejsz rozmiar pionowego podziału" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "Domyślny typ połączeń" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "Domyślny typ łączności używany przez funkcję \"szybkie połączenie\" (np. SSH, Telnet)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Domyślny profil dla nowych kart" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "Domyślne ustawienia profilu grupy" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Domyślne ustawienia profilu" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "Domyślne" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "Domyślne dla {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Usuń" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "Usunąć {name}?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "Usuń {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Usuń całą linijkę" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Usuń następne słowo" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Usuń poprzednie słowo" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "Usunąć konfigurację po stronie zdalnej?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Usunąć profile grupy?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Usunąć ten skrypt?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Usunąć zawartość sejfu?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Usuwanie" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Urządzenie" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Bezpośrednio" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Wyłącz" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Wyłącz dynamiczny tytuł karty" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "Wyłącz płynne tło podczas przeciągania" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Wyłącz przyspieszenie GPU" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Wyłączone" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Rozłącz" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "Rozłącz aktywną kartę (Serial/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "Odłączyć od {host}?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Wyświetlaj grafiki w sekwencjach wyjściowych Sixeli" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Wyświetl na" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "Nie przerywaj" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Nie zamykaj" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Nie zapamiętuj" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "Okno zawsze na wierzchu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "Dokuj terminal" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "Rozmiar zadokowanego terminalu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "Zadokowane miejsce w terminalu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "Dokowanie" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "Zaznaczenie podwójnego kliknięcia zatrzyma się na tych znakach" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "W dół" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Pobierz" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Rysuj pogrubiony tekst w jasnych kolorach" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Duplikuj" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Duplikuj jako administrator" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Duplikuj kartę" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Edytuj" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Edytuj lokalnie" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Włącz" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Włącz Analitykę" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "Włącz animacje" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Włącz automatyczną instalację aktualizacji, gdy będą dostępne." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "Włącz opcję płynnego tła" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Włącz ligaturę czcionek" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Włącz globalny skrót klawiszowy (Ctrl-Space)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Włącza eksperymentalne API ConPTY Windows" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Szyfruj plik konfiguracyjny" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Koniec linii" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Środowisko" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Usuń konfigurację" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Wyczyść sejf" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Błąd w {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Dokładne dopasowanie" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Przykład:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "Eksperymentalny styl tła Windows 10 mogący powodować problemy" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Exportuj" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Awaryjna czcionka" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Przesyłanie plików" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "Plik: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "Filtruj" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Poprawiony" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Płynne tło czasami powoduje opóźnienie przeciągnięcia" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Podświetl wszystkie panele" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Wyróżnij wszystkie panele jednocześnie (broadcast)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "Podświetl wszystkie zakładki" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "Podświetl wszystkie zakładki na raz (Broadcast)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "Fokus podąża za myszą" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Wyróżnij następny panel" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "Skup widok na panel {number}" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Wyróżnij poprzedni panel" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Wyróżnij panel powyżej" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Wyróżnij panel poniżej" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Wyróżnij panel po lewej stronie" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Wyróżnij panel na prawej" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "Powiel schemat kolorów" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Czcionka" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "Dla skrótów klawiszowych" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "Wymuś CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "Wymuś CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "Wymuś LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Wymusza określony typ połączenia agenta SSH." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Zapomnij" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Przekierowanie portu" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Przekierowane porty" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "Ze schematu kolorów" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "Z systemu" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "Z motywu" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Strona" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Gruba" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Ogólne" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Wygeneruj wstepnie opisany problem na GitHub" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Pobierz" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Pobierz z okna ustawień zakładki" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Ustawia w oknie rozmyte przezroczyste tło" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Idź w górę" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Zielony" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Grupa" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "Haki" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "Pomóż śledzić liczbę instalacji Tabby na całym świecie!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Pomóż przetłumaczyć Tabby" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Heksadecymalny" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "Ukryj" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Ukryj przycisk zamykania karty" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Ukryj numerację kart" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "Ukryj przycisk z opcjami karty" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Ukryj okno po utracie wyróżnienia" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "Ukrywa zadokowany terminal, gdy klikniesz obok." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Strona główna" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Gospodarz" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Klucz hosta" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Weryfikacja klucza hosta" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Klawisze skrótów" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "W jaki sposób Tabby prezentuje się w zmiennych środowiskach" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "HTTP proxy" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "HTTP proxy host" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "HTTP proxy port" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Ikona" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "Dynamiczny" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Jeśli wyłączone, tylko niestandardowe profile pojawią się w selektorze profilu" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Natychmiastowo wywołuje echo dla Twoich danych wejściowych lokalnie" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "Zwiększ rozmiar poziomego podziału" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "Zwiększ rozmiar pionowego podziału" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "Polecenie" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "Dane wejściowe są wysyłane podczas pisania" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Tryb wejścia" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "Nowe linie wejściowe" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Zainstalowane" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "Instalacja aktualizacji zamknie wszystkie karty i zrestartuje Tabby." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "Inteligentne Ctrl-C (kopiuj/przerwij)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Interaktywny" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Nieprawidłowa składnia" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "Przeskocz host" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Przejdź do następnego słowa" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Przejdź do poprzedniego słowa" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Zachowaj" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Interwał podtrzymania aktywności (Milisekundy)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "Trzymaj zadokowany terminal zawsze na górze" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Klucz" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "Wymiana kluczy" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Klawiatura" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "Autoryzacja przy pomocy interaktywnej klawiatury" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "Zabij" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Język" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "Ostatni znany odcisk klucza hosta" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Uruchom WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Uruchom WinSCP dla bieżącej sesji SSH" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Dowiedz się, jak zezwolić Tabby na wykrycie katalogu roboczego zdalnej powłoki." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Lewy" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Pozwala, aby powłoka obsługiwała klawisz Meta zamiast systemu operacyjnego" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "Tryb jasny" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Linia po linii" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Edytor linii, dane wejściowe są wysyłane po naciśnięciu Enter" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Wypełnienie linii" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Ładowanie" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Ładowanie konfiguracji..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Lokalny" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Lokalne echo" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Lokalny terminal" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Skrypty logowania" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Długie kliknięcie, aby uzyskać menu kontekstowe" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Zarządzaj profilami" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "Max Keep Alive Count" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Maksymalizuj aktywny panel" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "Minimalny stosunek kontrastu" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Zmodyfikowano {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "Mysz" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Przenieś kartę w lewo" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Przenieś kartę w prawo" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Przenieś do \"Bez grupowania\"" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "Najechanie myszy na nieaktywny panel spowoduje jego aktywacje" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Nazwa" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Nazwa nowej konfiguracji" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "Nazwa nowego folderu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Natywna" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "Nowy" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Nowa karta admina" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Nowa konfiguracja na {platform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "Nazwa nowej grupy" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Nowa pozycja" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Nowa nazwa" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Nowy profil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "Nowy grupa profili" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Nowa nazwa profilu" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Nowa karta" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Nowa karta: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Nowy terminal" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Nowe okno" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "Nowe okno" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Nowy z profilem" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Następna karta" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Brak koloru" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Brak Modyfikatora" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Żaden" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Normalny" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "Normalny rozmiar czcionki" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Nie znaleziono" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Powiadom o aktywności" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Powiadom o zakończeniu" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Ilość linijek utrzymywanych w buforze" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Wyłączony" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Oficjalny" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "Dyskusje na GitHubie" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "Karta pozostanie otwarta aż zakończysz sesję" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Przezroczystość" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Otwórz narzędzia deweloperskie" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Otwórz Ustawienia" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Otwórz kartę ustawień: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "Otwórz panel SFTP" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "Opcjonalnie" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Opcje" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Pomarańczowy" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "Domyślny system operacyjny" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "Domyślny system operacyjny ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "Dane wyjściowe są pokazane jako hexdump" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "Dane wyjściowe są wyświetlane w momencie otrzymania" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Tryb wyjścia" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Nowe linie wyjściowe" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "Zastąp wyświetlacz X11" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "Nadpisz lokalnie i synchronizuj" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Nadpisz zdalnie i synchronizuj" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "Zastąpić konfigurację zdalną i rozpocząć synchronizację?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "Zastąpić konfigurację lokalną i rozpocząć synchronizację?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "Etap zmiany rozmiaru panelu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "Panele" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "Papier (legacy)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Parzystość" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "Częściowa synchronizacja konfiguracji nie jest możliwa, gdy konfiguracja jest zaszyfrowana przez Vault." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "Przepustowość" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "Hasło do klucza prywatnego z hash'em {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Hasło" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Wklej" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Wklej ze schowka" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "Wklej jeśli nie wybrano, w przeciwnym razie skopiuj" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Wkleić wiele linii?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "Wklej po kliknięciu środkowym przyciskiem myszy" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Ścieżka lub adres lokalnego gniazda X11" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Pin" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Rozszerzenia" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Folder wtyczek" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Port" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Port otwarty" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Porty" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Naciśnij dowolny klawisz, aby ponownie połączyć" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Naciśnij wybrany klawisz" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Zapobiega przypadkowemu zamknięciu" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Zapobiega przypadkowemu wykonaniu wklejonych poleceń" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Poprzednia karta" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Klucze prywatne" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Proces zakończony" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Nazwa profilu" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Profile" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Profile i połączenia" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Program" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Polecenie proxy" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Fioletowy" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Wstawia całą konfigurację Tabby do sejfu" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Szybkie połączenie" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Wyjdź" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Raw socket connection" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "Limit czasu gotowości (Milisekundy)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Ostatnie" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Połącz ponownie" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "Odnów połączenie aktywnej karty (Serial/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Czerwony" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Regex" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Lista zmian" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "Zapamiętaj na {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Zdalny" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "Usuń spacje i nowe linie wokół skopiowanego tekstu" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Zmień nazwę" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "Zmień nazwę zakładki" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "Renderowanie" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Otwórz ostatnią kartę" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Zastąp" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Zgłoś Problem" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "Wymagaj dodatkowego klawisza, aby otworzyć link" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Zresetuj powiększenie" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Uruchom ponownie bieżącą sesję szeregową" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Uruchom ponownie bieżącą sesję SSH" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Uruchom ponownie bieżącą sesję Telnet" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "Zrestartuj kartę" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Zresetuj aplikację, aby zastosować zmiany" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "Przywrócić ustawienia domyślne?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "Przywrócić ustawienia do odziedziczonych domyślnych?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "Przywróć karty terminali przy starcie aplikacji" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "Ponownie użyj sesji dla wielu kart" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "Prawa" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "Prawy przycisk myszy" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Uruchom jako administrator" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Zapisz" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Zapisz hasło w pęku kluczy (keychain)" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Zapisz i zastosuj" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Zapisz jako profil" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Zapisz układ jako profil" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Zapisane" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Zapisany układ" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "Przewiń przy wprowadzaniu poleceń" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "Przewiń terminal w dół o jedną stronę" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "Przewiń terminal w górę o jedną stronę" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Przewiń terminal do samego dołu" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "Przewiń terminal do samej góry" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "Przewijanie wstecz" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "Przewiń terminal do dołu, kiedy wprowadzane jest polecenie" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Szukaj" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Szukaj schematów kolorów" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "Szukaj skrótów klawiszy" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "Szukaj wtyczek" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Sekretny token synchronizacji" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Wybierz" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Wybierz profil podstawowy do użycia jako szablon" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "Zaznacz wszystko" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Wybierz miejsce przechowywania plików" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Wybierz profil" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Wybierz profil lub wprowadź adres" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "Wyślij bajty wpisując wartości szesnastkowe" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Wysyła dane jeden bajt na raz" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Szeregowy" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Połączenie szeregowe" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Szeregowy: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Ustaw hasło główne" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Ustaw hasło" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Ustaw hasło" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Ustaw Tabby jako %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "Ustaw 0 aby wyłączyć ostatnie profile" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "Ustawia agentowi SSH nazwaną ścieżkę potoku." #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Ustawienia" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Powłoka" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Powłoka nie obsługuje wykrywania bieżącej ścieżki" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Integracja powłoki" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "Wyświetl" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "Pokaż selektor profilu {type}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "Pokaż pole potwierdzenia podczas wklejania wielu linii" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "Pokaż wbudowane profile w selektorze" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "Pokaż selektor poleceń" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Pokaż plik konfiguracyjny" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Pokaż domyślne" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Pokaż mikser" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "Pokaż etykiety (aby zmienić kolejność)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Pokaż ikonę profilu na karcie" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Pokaż selektor profilu" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Pokaż ostatnie profile w selektorze" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Pokaż informacje o wydaniu" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Pokaż połączenia szeregowe" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "Pokaż karty w trybie pełnoekranowym" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "Pokaż pasek narzędzi" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Pokaż zawartość sejfu" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Wsparcie dla grafiki sixelowej (eksperymentalne)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "Pomiń MoTD/baner" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "Powolne przesyłanie (bit po bicie)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "Przyciąga okno w wybrane miejsce ekranu" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "SOCKS proxy host" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "SOCKS proxy port" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "Dźwięk" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Kod źródłowy" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "Przestrzeń" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Podziel" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Podziel na dół" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "Podziel na dół" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Podziel na lewo" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Podziel na prawo" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Podziel na górę" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "Podziel na górę" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "Połączenie SSH" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "Zarządzanie połączeniami SSH odbywa się teraz za pomocą zakładki \"Profile i połączenia\"" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "Hasło SSH dla {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "Standardowe (legacy)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "Uruchamianie" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Bity stopu" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Pasek" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Subskrybuj aktualizacje" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Zastępstwa dozwolone." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "Zmień schemat kolorów" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Zmień profil" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Przełącz profil w aktywnym panelu" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Przełącza warstwę graficzną terminali (eksperymentalne)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Synchronizacja" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Synchronizuj automatycznie" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Synchronizuj host" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Synchronizuj klawisze skrótów" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Synchronizuj sejf" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Synchronizuj ustawienia okna" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Karta {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Aktywność zakładki" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby nie mógł rozpocząć z zainstalowanymi wtyczkami, więc wtyczki firm trzecich zostały wyłączone w tej sesji. Błąd:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Nowości i aktualizacje Tabby na Twitterze" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Karty" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Położenie kart" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Szerokość karty" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Sesja Telnet" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Terminal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Tło Terminala" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Dzwonek Terminalu" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "Identyfikacja terminala" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Dziękujemy za pobranie Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Motyw" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Istnieją aktywne transfery plików" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Istnieje zapisane hasło dla tego połączenia" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Dotyczy to wszystkich profili danego typu" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Cienka" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Zaznacz to, jeśli doświadczasz aliasingu, ghostingu lub innych problemów wizualnych" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Przełącza na pełny ekran" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "Przełącz ostatnią kartę" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Przełącz okno terminala" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Przełącza widoczność okna Tabby" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "Góra" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "Przytnij białą przestrzeń i nowe linie" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Spróbuj ponownie" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Próba zapisanego hasła" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "Zamień panele bieżącej karty w oddzielne karty" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Bez grupy" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Odinstaluj" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Nieznane" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Nieznane dane poufne typu {type} dla {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Odepnij" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "Góra" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Aktualizacja" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Uaktualnij do {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Prześlij" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Prześlij jako nową konfigurację" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Użyj {altKeyName} jako klawisza Meta" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "Użyj ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "Domyślny użytkownik" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Nazwa Użytkownika" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "Użycie metody CONNECT" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Używanie ustawionego hasła" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Sejf" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Sejf jest szyfrowanym kontenerem dla danych poufnych, takich jak hasła SSH i hasła klucza prywatnego." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Sejf jest pusty" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Sejf jest zablokowany" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "Sejf nie jest skonfigurowany" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "Hasło główne sejfu musi być ustawione, aby umożliwić przechowywanie danych poufnych" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Sprawdź klucze hosta podczas łączenia" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Wersja" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Wersja: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Transparentne tło" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Wizualny" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Ostrzegaj przy wklejaniu wieloliniowym" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Ostrzegaj przy zamykaniu aktywnych połączeń" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "Ostrzeżenie: klucz zdalnego hosta został nagle zmieniony!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Śledzimy tylko wersje Tabby i Twojego systemu operacyjnego." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Witaj" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Nowości" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "Kończąc sesję" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "Po włączeniu, linki można klikać tylko podczas przytrzymania tego klawisza" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "Po wykryciu WinSCP możesz uruchomić sesję SCP z menu kontekstowego." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "Użyj do wyboru niestandardowego lub natywnego wyglądu dla okna terminalu" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "Zapobiegnie pokazywaniu powitania SSH" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Okno" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "Wymiar okna wzdłuż krawędzi" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "Wymiar okna z dala od krawędzi" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Ramka okna" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "Windows" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Windows 10 build 18309 lub nowszy jest zalecany dla ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "Ścieżka WinSCP" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Separatory słów" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Katalog roboczy" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Wykrywanie katalogu roboczego" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "Dzwonek terminala WSL może być wyciszony tylko przez miksera głośności" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "Terminal WSL obsługuje tylko TrueColor z włączonym ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "Przekazywanie X11" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Żółty" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "Możesz zmienić to hasło poźniej, ale jeśli je zgubisz/zapomnisz, to nie będzie możliwości jego odzyskania." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "Możesz być w trakcie ataku \"człowiek w środku\" lub klucz hosta mógł właśnie zostać zmieniony." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Powiększ" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Pomniejsz" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "Dynamiczny" ================================================ FILE: locale/pt-BR.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: pt-BR\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Portuguese, Brazilian\n" "Language: pt_BR\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" ainda está em execução. Fechar?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} Copiar" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "Uma segunda família de fontes usada para exibir caracteres faltando na fonte principal" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Abortar tudo" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Aceitar e salvar a tecla" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Aceitar apenas desta vez" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "Acessibilidade" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Fundo acrílico" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Adicionar" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Adicionar um redirecionamento de porta" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Adicionar uma chave privada" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Adicionar..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Espaço adicional entre as linhas" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "\"Avançado\"" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Agente" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Encaminhamento de agente" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Caminho do agente pipe" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Tipo de agente" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Permite abrir arquivos .bat em abas, mas quebra em alguns shells" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Permite abrir rapidamente um terminal na pasta selecionada" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "Sempre escuro" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Sempre claro" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Aparência" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Aplicação" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Configurações do aplicativo" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Tem certeza que deseja fechar a \"Tabby\"? Você pode desativar essa mensagem em Configurações -> Janela." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Você tem certeza?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Argumentos" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Faça uma pergunta" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Perguntar antes de fechar a aba do navegador" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Audível" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Método de autenticação" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Autor" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Automático" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Abrir automaticamente um terminal no início da aplicação" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Automático" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Atualizações automáticas" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Carregar automaticamente alterações e procurar por atualizações a cada minuto" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Disponível" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Tipo de fundo" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "Modo botão Backspace" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Taxa de dados (Baud Rate)" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Começo da linha" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Piscar cursor" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Azul" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Desfocar" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Peso da fonte em negrito" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Inferior" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Colar entre colchetes (requer suporte ao \"shell\")" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "Modo de transmissão. Clique em qualquer lugar para cancelar." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Embutido" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Cancelar" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Alterar taxa de dados" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Mudar cor da aba" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Alterar a senha mestra" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Buscar atualizações" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Cifras" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Limpar" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Limpar perfis recentes" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Limpar terminal" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "Limpar terminal após conexão" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Área de Transferência" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Fechar" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Fechar e nunca mais mostrar novamente" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Fechar o painel em foco" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Fechar as outras abas" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Fechar aba" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Fechar abas à esquerda" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Fechar abas à direita" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "Fechar a janela depois de fechar a última aba" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Cor" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Esquema de cores" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Esquema de cores" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Cores" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Combinar todas as abas na aba atual" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Linha de comando" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "stdin/stdout do comando é usado ao invés de uma conexão de rede" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Comandos" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "Compactado (legado)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Configuração excluída" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Configuração baixada" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Arquivo de configuração" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Configurar sincronização" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Configuração carregada" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Configurações" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Conectar-se através de um servidor proxy" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "Conectando a %s..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Conecte-se a um host diferente primeiro e use-o como um proxy" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "Conectando" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Conexão" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "A conexão falhou: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "O nome da conexão será usado no lugar" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Menu de contexto" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "Controla a quantidade de espaço entre elementos" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Copiado" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Copiar" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Copiar o caminho atual" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Copiar caminho completo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Copiar a seleção" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Copiar para área de transferência" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Copiar com formatação" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Não foi possível descriptografar a configuração" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Criar" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Criar diretório" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Atual" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Esquema de cores atual" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Impressão digital da chave do host atual" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Processo atual: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Formato do cursor" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Personalizado" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "CSS Personalizado" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "Modo escuro" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Bits de dados" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Depurando" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Diminuir tamanho de divisão horizontal" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Diminuir tamanho de divisão horizontal" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "Tipo de \"Conectar a \" padrão" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "Tipo de conexão padrão usado pelo recurso de conexão rápida (ex. SSH, Telnet)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Perfil padrão para novas abas" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "Configurações de grupo de perfil padrão" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Configurações do perfil padrão" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "Padrões" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "Padrões para {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Excluir" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "Excluir {name}?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "Excluir {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Apagar linha inteira" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Excluir a próxima palavra" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Excluir palavra anterior" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "Excluir a configuração do lado remoto?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Excluir os perfis do grupo?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Excluir esse script?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Excluir conteúdo do vault?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Apagando" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Dispositivo" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Direto" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Desabilitar" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Desativar título da aba dinâmica" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "Desativar fundo fluente enquanto arrasta" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Desativar aceleração de GPU" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Desabilitado" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Desconectar" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "Desconectar aba atual (Serial/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "Desconectar de {host}?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Exibir imagens através de sequências de escape Sixel" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Exibir em" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "Não abortar" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Não feche" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Não me lembre" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "Janela sempre no topo" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "Encaixe o terminal" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "Tamanho do terminal encaixado" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "Espaço do terminal encaixado" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "Encaixando" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "A seleção com clique duplo irá parar nesses caracteres" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "Abaixo" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Download" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Desenhar texto em negrito em cores brilhantes" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Duplicar" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Duplicar como administrador" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Duplicar Aba" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Editar" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Editar localmente" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Habilitar" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Habilitar análises" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "Permitir animações" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Permite a instalação automática de atualizações quando elas estiverem disponíveis." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "Habilitar opção de fundo fluente" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Habilitar ligaduras de fonte" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Ativar atalho global (Ctrl-Espaço)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Habilita a API \"ConPTY\" experimental do Windows" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Criptografar arquivo de configuração" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Fim da linha" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Ambiente" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Apagar configuração" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Apagar o Cofre" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Erro em {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Correspondência exata" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Exemplo:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "Estilo experimental do Windows 10 conhecido por causar problemas" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Exportar" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Fonte alternativa" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Transferências de arquivos" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "Arquivo: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "Filtro" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Corrigido" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Fundo fluente às vezes causa atraso de arrastar" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Focar todos os painéis" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Focar todos os painéis de uma vez (Transmissão)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "Focar todas as abas" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "Focar todos os painéis de uma vez (broadcast)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "O foco segue o mouse" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Focar próximo painel" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "Foco do painel {number}" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Focar no painel anterior" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Focar no painel acima" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Focar no painel abaixo" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Concentre no painel à esquerda" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Focar no painel à direita" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "Seguir o esquema de cores" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Fonte" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "Para atalhos de teclado" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "Forçar CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "Forçar CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "Forçar LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Força um tipo de conexão com agente SSH específico." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Esquecer" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Encaminhar porta" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Portas encaminhadas" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "Do esquema de cores" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "Do sistema" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "Do tema" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Interface" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Preencher" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Geral" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Gerar uma issue pré-preenchida no GitHub" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Obter" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Obtenha-o na janela de configurações da Tabby Web" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Dá à janela um fundo transparente borrado" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Ir para cima" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Verde" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Grupo" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "Hacks" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "Ajude a acompanhar o número de instalações do Tabby pelo mundo!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Ajude a traduzir o tabby" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Hexadecimal" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "Ocultar" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Ocultar botão de fechar aba" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Ocultar índice da aba" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "Ocultar botão de opções de aba" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Ocultar janela em perda de foco" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "Oculta o terminal quando você clica longe." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Página Inicial" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Host" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Chave do host" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Verificação da chave do host" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Teclas de atalho" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "Como Tabby se apresenta através de variáveis de ambiente" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "Proxy HTTP" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "Host do proxy HTTP" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "Porta do Proxy HTTP" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Ícone" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "Dinâmico" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Se desativado, somente perfis personalizados aparecerão no seletor de perfil" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Imediatamente repete sua entrada localmente" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "Aumentar tamanho de divisão horizontal" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "Aumentar o tamanho da divisão vertical" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "Entrada" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "O texto é enviado enquanto você digita" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Modo de entrada" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "Novas linhas de entrada" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Instalado" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "Ao instalar a atualização, todas as abas serão fechadas e o Tabby reiniciará." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "Ctrl-C Inteligente (copiar/cancelar)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Interativo" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Sintaxe inválida" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "Servidor de Pulo" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Pular para a próxima palavra" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Pular para a palavra anterior" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Manter" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Manter o intervalo vivo (milissegundos)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "Mantenha o terminal encaixado sempre no topo" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Chave" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "Troca de chaves" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Teclado" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "Autenticação interativa do teclado" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "Finalizar" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Idioma" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "Última impressão digital da chave de host é conhecida" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Abrir \"WinSCP\"" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Inicie o \"WinSCP\" na sessão SSH atual" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Aprenda como permitir que o \"Tabby\" detecte o diretório de trabalho da \"Shell\" remota." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Esquerda" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Permite que o shell manipule Meta key em vez de S.O" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "Modo claro" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Linha por linha" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Editor de linha, a entrada é enviada depois que você pressionar Enter" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Linha de preenchimento" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Carregando" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Carregando configurações..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Local" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Efeito local" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Terminal local" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Scripts de login" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Clique longo para menu de contexto" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Gerenciar perfil" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "Manter a contagem máxima viva" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Maximizar o painel ativo" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "Relação de contraste mínima" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Modificado em {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "mouse" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Mover a aba para a esquerda" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Mover a aba para a direita" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Mover para \"Desagrupado\"" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "Mover o mouse sobre um painel inativo fará com que ele seja ativado" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Nome" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Nome para a nova configuração" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "Nome para o novo diretório" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Nativo" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "Novo" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Nova aba admin" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Nova configuração em {platform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "Nome do novo grupo" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Novo item" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Novo nome" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Novo perfil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "Novo Grupo de Perfil" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Novo nome do perfil" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Nova aba" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Nova aba: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Novo terminal" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Nova janela" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "Nova Janela" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Novo com perfil" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Próxima aba" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Sem cor" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Não modificar" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Nenhum" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Normal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "Peso da fonte normal" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Não encontrado" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Notificar sobre a atividade" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Notificar quando terminar" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Número de linhas contidas no buffer" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Desligado" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Oficial" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "Nas discussões no GitHub" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "Só fechar a aba quando a sessão for terminada explicitamente" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Opacidade" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Abrir ferramentas de desenvolvimento" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Abrir configurações" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Abrir guia de configurações: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "Abrir painel SFTP" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "Opcional" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Opções" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Laranja" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "Padrão do sistema" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "Padrão do sistema ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "A saída é mostrada como um hexadecimal" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "A saída é mostrada como é recebida" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Mode de saída" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Novas linhas de saída" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "Sobrepor a tela X11" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "Sobrescrever local e sincronizar" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Sobrescrever local e sincronizar" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "Substituir as configurações no lado remoto e começar a sincronizar?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "Sobrescrever as configurações locais e começar a sincronizar?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "Passo de redimensionamento" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "Painéis" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "Papel (legado)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Paridade" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "Sincronização parcial de configuração não é possível quando a configuração é criptografada pelo Cofre." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "Passar" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "Frase de senha para uma chave privada com hash {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Senha" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Colar" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Colar da área de transferência" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "Cola se não selecionado, senão copia selecionado" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Colar várias linhas?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "Colar com clique central" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Caminho ou endereço do soquete X11 local" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Pin" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Plugins" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Pasta de plugins" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Porta" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Porta aberta" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Portas" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Pressione qualquer tecla para reconectar" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Pressione a tecla agora" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Impede fechamento acidental" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Prevenir a execução acidental de comandos colados" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Aba anterior" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Chaves privadas" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Processo concluído" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Nome do Perfil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Perfils" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Perfis e conexões" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Programa" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Comando do proxy" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Roxo" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Coloca todas as configurações da Tabby no cofre" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Conexão rápida" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Sair" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Conexão de soquete pura" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "Tempo limite em(milissegundos)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Récente" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Reconectar" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "Reconectar a aba atual (Serial/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Vermelho" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Regex" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Notas da versão" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "Lembrar do {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Remoto" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "Remover espaços em branco e novas linhas em torno do texto copiado" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Renomear" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "Renomear aba" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "Renderização" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Reabrir ultima aba" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Substituir" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Reportar um problema" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "Exigir uma tecla para clicar em links" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Redefinir Zoom" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Reiniciar a sessão serial atual" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Reiniciar a sessão SSH atual" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Reiniciar sessão de Telnet atual" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "Reiniciar aba" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Reinicie o aplicativo para aplicar as alterações" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "Restaurar as configurações para o padrão?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "Restaurar configurações para padrões herdados ?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "Restaurar abas de terminal na inicialização do aplicativo" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "Reutilizar a sessão para multiplas abas" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "Direita" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "Clique direito" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Executar como administrador" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Salvar" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Salvar uma senha no teclado" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Salvar e aplicar" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Salvar como perfil" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Salvar layout como perfil" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Salvo" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Layout salvo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "Rolar na entrada" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "Rolar terminal uma página para baixo" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "Rolar o terminal uma página para cima" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Rolar terminal para baixo" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "Rolar o terminal para o topo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "Reverter" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "Rola o terminal para a parte inferior na entrada do usuário" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Pesquisar" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Pesquisar esquemas de cores" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "Procurar atalhos" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "Buscar plugins" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Token de sincronização secreta" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Selecionar" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Selecione um perfil base para usar como um modelo" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "Selecionar tudo" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Selecionar armazenamento de arquivos" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Selecione o perfil" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Selecione o perfil ou insira um endereço" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "Enviar bytes digitando em valores hexadecimais" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Envia dados um byte por vez" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Série" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Conexão Serial" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Série: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Definir senha mestre" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Definir senha" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Definir senha" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Definir Tabby como %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "Defina 0 para desativar os perfis recentes" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "Define o caminho de tubo do agente SSH." #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Configurações" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Shell" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Shell não suporta a detecção de caminho atual" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Integração com o Shell" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "Mostrar" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "Exibir seletor de perfil {type}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "Mostrar uma caixa de confirmação quando colar várias linhas" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "Mostrar perfis integrados no seletor" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "Mostrar seletor de comandos" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Mostrar arquivo de configuração" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Mostrar padrões" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Mostrar Mixer" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "Mostrar etiquetas do painel (para reorganização)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Mostrar ícone do perfil na aba" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Mostrar seletor de perfil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Mostrar perfis recentes no seletor" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Mostrar notas de lançamento" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Mostrar conexões em série" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "Mostrar abas no modo de tela cheia" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "Mostrar barra de ferramentas" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Mostrar conteúdo do cofre" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Suporte gráfico Sixel (experimental)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "Pular banner do MoTD/" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "Feed lento" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "Toca a janela em um lado da tela" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "Usar proxy SOCKS" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "Host do proxy SOCKS" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "Porta do proxy SOCKS" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "Som" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Código-fonte" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "Espaçamento" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Dividir" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Dividir para baixo" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "Dividir para baixo" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Dividir para a esquerda" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Dividir para a direita" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Rolar para o topo" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "Dividir para cima" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "Conexão SSH" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "O gerenciamento de conexões SSH é feito através da aba \"Perfis e Conexões\"" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "Senha SSH para {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "Padrão (legado)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "Startup" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Pare os bits" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Tirar" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Inscrever-se para atualizações" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Substituições permitidas." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "Alternar esquema de cores" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Alternar perfil" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Trocar perfil no painel ativo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Alterna a implementação do terminal frontend (experimental)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Sincronizar" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Sincronizar automaticamente" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Sincronizar host" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Sincronizar atalhos" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Sincronizar Cofre" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Sincronizar configurações de janela" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Aba {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Atividade da aba" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby não pôde iniciar com seus plugins, então todos os plugins de terceiros foram desativados nesta sessão. O erro foi:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Notícias e atualizações do Tabby no Twitter" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Abas" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Localização das abas" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Largura da aba" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Sessão telefônica" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Terminal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Fundo do terminal" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Aviso do terminal" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "Identificação do terminal" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Obrigado por baixar Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Tema" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Existem transferências de arquivos ativas" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Existe uma senha salva para esta conexão" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Estas se aplicam a todos os perfis de um determinado tipo" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "Estas se aplicam a todos os perfis de um determinado tipo neste grupo" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Fina" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Marque isto se estiver enfrentando problemas visuais, como aliasing, fantasmas ou outros problemas visuais" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Ativar/desativar modo tela cheia" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "Alternar última aba" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Alternar janela do terminal" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Alterna a visibilidade da janela da aba" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "Topo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "Aparar espaços em branco e linhas novas" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Tentar novamente" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Tentando salvar a senha" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "Transformar painéis da aba atual em abas separadas" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Desagrupado" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Desinstalar" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Desconhecido" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Chave desconhecida do tipo {type} para {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Liberar guia" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "Para cima" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Atualizar" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Fazer upgrade para {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Transferir" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Fazer upload como uma nova configuração" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Use {altKeyName} como Meta key" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "Usar ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "Usuário padrão" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Nome de usuário" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "Usando o método CONNECT" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Usando a senha predefinida" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Cofre" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "O Cofre é um contêiner sempre criptografado para segredos, como senhas de SSH e senhas de chave privada." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "O cofre está vazio" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "O cofre está trancado" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "O cofre não está configurado" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "A senha mestre do cofre precisa ser definida para permitir armazenamento" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Verificar as chaves do host ao conectar" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Versão" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Versão: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Vibração" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Visual" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Avisar ao colar multi-linha" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Avisar ao fechar conexões ativas" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "Aviso: a chave do host remoto mudou repentinamente!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Estamos rastreando apenas as versões de Tabby e OS." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Bem-vindo" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Novidades" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "Quando uma sessão termina" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "Quando ativado, os links só são clicáveis enquanto segura esta chave" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "Quando o WinSCP é detectado, você pode iniciar uma sessão SCP no menu de contexto." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "Se uma janela personalizada ou uma janela nativa do sistema deve ser usada" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "Impede que a saudação por SSH apareça" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Janela" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "Dimensão da janela ao longo da borda" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "Dimensão da janela fora da borda" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Quadro de janela" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "Janelas" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Windows 10 Compilação 18309 ou superior é recomendada para ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "Caminho do WinSCP" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Separadores de palavra" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Diretório de trabalho" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Detectar de diretório de trabalho" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "O terminal WSL só pode ser silenciado pelo volume do mixer" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "O terminal WSL só suporta TrueColor com ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "Encaminhamento X11" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Amarelo" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "Você pode mudá-lo mais tarde, mas é inrecuperável se esquecido." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "Você pode estar sob um ataque no meio agora mesmo, ou a chave do anfitrião poderia ter sido alterada." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Aumentar zoom" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Diminuir zoom" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "Dinâmico" ================================================ FILE: locale/pt-PT.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: pt-PT\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Portuguese\n" "Language: pt_PT\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" ainda está em execução. Fechar?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} cópia" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "एक दूसरा फ़ॉन्ट परिवार मुख्य फ़ॉन्ट में लापता वर्णों को प्रदर्शित करता था" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Abortar tudo" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Aceitar e lembrar a chave" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Aceitar apenas desta vez" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "acessibilidade" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Fundo acrítico" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Adicionar" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Adicionar uma porta de encaminhamento" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Adicionar uma chave privada" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Adicionar..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Espaço adicional entre linhas" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Avançado" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Agente" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Agente de encaminhamento" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Tipo de agente" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Permite abrir ficheiros .bat em separadores, mas parte algumas linhas de comando" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Permite abrir um terminal rapidamente na pasta selecionada" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "sempre escuro" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Sempre luminoso" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Aparência" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Aplicação" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Definições da aplicação" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Tem a certeza que quer fechar o Tabby? Pode desativar este aviso em Configurações -> Janela." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Tens a certeza?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Argumentos" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Faça uma pergunta" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Perguntar antes de fechar o separador do browser" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Audível" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Método de autenticação" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Autor" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Automático" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Abrir automaticamente um terminal no início da aplicação" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Automático" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Atualizações automáticas" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Enviar alterações automaticamente e procurar por atualizações a cada minuto" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Disponível" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Tipo de fundo" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Taxa de transmissão" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Início de linha" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Piscar cursor" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Azul" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Desfocar" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Baixo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Embutido" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Cancelar" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Alterar taxa de transmissão" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Alterar a senha mestra" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Verificar atualizações" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Cifras" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Limpar perfis recentes" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Limpar terminal" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Área de Transferência" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Fechar" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Fechar e não mostrar novamente" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Fechar o painel ativo" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Fechar os outros separadores" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Fechar separador" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Fechar os separadores à esquerda" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Fechar os separadores à direita" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Cor" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Esquema de cores" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Combinar todas as abas na aba atual" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Linha de comandos" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Configuração transferida" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Ficheiro de configuração" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Configurar sincronização" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Configuração enviada" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Configuração" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Conectar através de um servidor proxy" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "A ligar a %s..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Conectar a um anfitrião diferente primeiro e use-o como um proxy" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "A ligar" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Ligação" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "A ligação falhou: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Menu de contexto" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Copiado" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Copiar" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Copiar o caminho atual" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Copiar ao selecionar" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Copiar para área de transferência" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Não foi possível desencriptar a configuração" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Atual" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Esquema de cores atual" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Processo atual: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Formato do cursor" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Personalizado" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "CSS Personalizado" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Bits de dados" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Perfil padrão para novas abas" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "Parâmetros do grupo de perfis por defeito" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Configurações de perfil padrão" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "Predefinições" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "Padrões para {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Apagar" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "Apagar \"{name}\"?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "Apagar {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Apagar palavra seguinte" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Apagar palavra anterior" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Eliminar os perfis do grupo?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Eliminar este script?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Apagar conteúdo do cofre?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "A apagar" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Dispositivo" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Direto" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Desativar" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Desativar titulo dinâmico do separador" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Desativar acelerador GPU" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Inativo" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Desligar" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "Desligar {host}?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Ecrã ligado" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "Não abortar" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Não fechar" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Não lembrar" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "Ancorar sempre no topo" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "Ancorar o terminal" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "Tamanho do terminal ancorado" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "Espaço do terminal ancorado" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "A ancorar" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "A seleção com clique duplo irá parar nesses caracteres" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "Baixo" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Descarregar" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Duplicar" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Duplicar como administrador" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Duplicar separador" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Editar" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Editar localmente" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Ativar" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Ativar recolha de dados" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Ativar instalação automática de atualizações quando estiverem disponíveis." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Ativar ligaduras de fonte tipográfica" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Ativar atalho global (Ctrl + Espaço)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Ativar a API ConPTY experimental do Windows" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Encriptar ficheiro de configuração" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Fim de linha" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Ambiente" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Apagar configuração" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Eliminar o cofre" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Erro em {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Correspondência exata" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Exemplo:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Exportar" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Fonte de reserva" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Transferências de ficheiros" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "Ficheiro: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Fixado" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Focar todos os painéis" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Focar todos os painéis de uma vez (broadcast)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Focar no painel seguinte" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Focar no painel anterior" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Focar o painel acima" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Focar o painel abaixo" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Focar o painel à esquerda" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Focar o painel à direita" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Fonte" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "Forçar CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "Forçar CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "Forçar LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Forçar um agente específico para a ligação SSH." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Esquecer" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Encaminhar porta" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Portas encaminhadas" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "A partir do esquema de cores" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "A partir do tema" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Frontend" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Completo" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Geral" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Gerar uma issue pré-preenchida no GitHub" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Obter" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Obtenha-o da janela de configurações da Tabby Web" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Dá à janela um fundo transparente desfocado" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Subir" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Verde" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Grupo" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "Ajude a seguir o número de instalações do Tabby pelo mundo!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Hexadecimal" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Esconder o botão para fechar o separador" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Ocultar índice do separador" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Ocultar janela quando perde o foco" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Página inicial" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Servidor" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Chave do servidor" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Verificação da chave do servidor" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Teclas de atalho" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "Proxy HTTP" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "Proxy HTTP - Servidor" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "Proxy HTTP - Porta" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Ícone" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "Dinâmico" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "O texto é enviado enquanto digitas" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Modo de Entrada" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Instalado" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "Ao instalar a atualização, todos os separadores serão fechadas e o Tabby reiniciará." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Interactivo" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Sintaxe inválida" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Saltar para a palavra seguinte" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Saltar para a palavra anterior" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Manter" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Chave" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "Troca de chaves" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Teclado" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "Autenticação do teclado interativa" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "Terminar" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Idioma" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "Última impressão digital da chave de anfitrião conhecida" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Abrir WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Iniciar o WinSCP para a sessão SSH atual" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Aprenda a permitir que o Tabby detecte o diretório de trabalho da shell remota." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Esquerda" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Linha por linha" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Espaçamento entre linhas" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "A carregar" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "A carregar configurações..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Terminal local" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Scripts de login" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Clique longo para menu de contexto" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Gerir perfis" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Maximizar o painel ativo" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Modificado em {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "Rato" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Mover separador para a esquerda" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Mover separador para a direita" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Mover para \"Desagrupado\"" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Nome" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Nome para a nova configuração" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Nativo" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Novo separador de administração" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Nova configuração em {platform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Novo item" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Novo nome" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Novo perfil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Nome do novo perfil" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Novo separador" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Novo separador: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Novo terminal" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Nova janela" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Novo com perfil" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Separador seguinte" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Sem cor" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Nenhum Modificador" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Nenhum" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Normal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Não encontrado" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Notificar quando houver atividade" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Notificar quando terminar" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Número de linhas mantidas no buffer" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Desligado" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Oficial" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "Nas discussões no GitHub" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Opacidade" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Abrir ferramentas de programador" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Abrir Configurações" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Abrir separador de configurações: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "Abrir separador de SFTP" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "Opcional" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Opções" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Cor de laranja" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "Padrão do SO" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "Padrão do SO ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "A visualização é mostrada em hexadecimal" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "A visualização é mostrada tal como é recebida" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Modo de saída" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Novas linhas da visualização" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "Sobrepor o ecrã X11" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "Sobrescrever local e sincronizar" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Sobrescrever remoto e sincronizar" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "Rescrever as configurações do lado remoto e começar a sincronizar?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "Rescrever as configurações locais e começar a sincronizar?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Paridade" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "Sincronização parcial de configuração não é possível quando a configuração é criptografada pelo Cofre." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "Palavra-passe para uma chave privada com hash {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Palavra-Passe" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Colar" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Colar da área de transferência" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Colar várias linhas?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "Colar com botão do meio do rato" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Caminho ou endereço do socket X11 local" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Afixar" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Extensões" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Pasta de extensões" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Porto" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Porto aberto" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Portos" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Pressione qualquer tecla para reconectar" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Pressione a tecla agora" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Impede o fecho acidental" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Impede a execução acidental de comandos colados" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Separador anterior" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Chaves privadas" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Processo concluído" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Nome do perfil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Perfis" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Perfis e ligações" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Programa" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Comando do proxy" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Roxo" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Colocar todas as configurações do Tabby no cofre" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Ligação rápida" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Sair" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Ligação por socket" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "Tempo limite (milissegundos)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Recente" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Voltar a ligar" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Vermelho" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Expressão Regular" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Notas de lançamento" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "Lembrar durante {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Remoto" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Renomear" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Guardar e aplicar" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Guardar como perfil" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Salvo" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Layout salvo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Procurar" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Selecionar" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Selecionar armazenamento" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Selecionar perfil" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Selecionar perfil ou introduza um endereço" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Envia um byte de dados de cada vez" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Serial" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Conexão Serial" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Serial: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Definir palavra-passe" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Definir Tabby como %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "Defina o valor 0 para desativar perfis recentes" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "" #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Configurações" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Linha de Comando" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "A linha de comandos não suporta a deteção do caminho atual" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Integração da linha de comandos" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Mostra o ficheiro de configuração" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Mostrar valores por defeito" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Mostrar Mixer" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Mostrar ícone do perfil no separador" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Mostrar conteúdo do cofre" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "Proxy SOCKS - Servidor" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "Proxy SOCKS - Porto" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "Iniciar" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Substituições permitidas." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Mudar de perfil" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Sincronizar" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Sincronizar automaticamente" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Sincronizar Cofre" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Sincronizar configurações da janela" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Separador {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Atividade do separador" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Separadores" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Localização do separador" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Largura do separador" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Sessão telnet" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Terminal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Fundo do terminal" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Campainha do terminal" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Obrigado por descarregar o Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Tema" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Existem transferências de ficheiros ativas" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Existe uma senha guardada para esta conexão" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Estas aplicam-se a todos os perfis de um determinado tipo" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Fino" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Marque isto se tiver problemas visuais, como aliasing, ghosting ou outros problemas visuais" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Ativar/desativar o modo ecrã inteiro" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "Ativar/desativar o último separador" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Ativar/desativar a janela" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Ativa/desativa a visibilidade da janela" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "Topo" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Tente novamente" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Tentando senha guardada" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Desagrupado" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Desinstalar" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Desconhecido" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Segredo desconhecido do tipo {type} para {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Desafixar" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "Cima" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Atualizar" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Atualizar para {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Carregar (upload)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Fazer upload como uma nova configuração" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Use {altKeyName} como chave Meta" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "Usar ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "Utilizador Padrão" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Nome de utilizador" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "A usar o método CONNECT" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Usando a senha predefinida" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Cofre" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "O Cofre é um contentor sempre encriptado para segredos como senhas de SSH e frases de chave privada." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "O cofre está vazio" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "O cofre está trancado" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "O cofre não está configurado" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "A senha mestra do cofre precisa de ser definida para permitir o armazenamento de segredos" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Verificar as chaves do host ao conectar" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Versão" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Versão: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Cores vibrantes" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Visual" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Avisar ao colar várias linhas" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Avisar ao fechar conexões ativas" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "Aviso: a chave do host remoto mudou repentinamente!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Estamos rastreando apenas as suas versões de Tabby e de sistema operativo." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Bem-vindo" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Novidades" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "Quando ativado, as ligações só são clicáveis enquanto prime esta tecla" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "Quando o WinSCP é detectado, você pode iniciar uma sessão SCP no menu de contexto." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "Se uma janela personalizada ou uma janela nativa do sistema operativo deve ser usada" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Janela" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "Dimensão da janela ao longo da borda" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "Dimensão da janela fora da borda" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Quadro da janela" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "Windows" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Versão 18309 ou superior do Windows 10 é recomendada para ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "Caminho WinSCP" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Separadores de palavras" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Diretório atual" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Detecção do diretório atual" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "O terminal WSL só pode ser silenciado pelo misturador de volume" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "O terminal WSL só suporta TrueColor com ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "Encaminhamento X11" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Amarelo" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "Você poderá mudá-lo mais tarde, mas é irrecuperável se esquecido." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "Você pode estar sob um ataque man-in-the-middle agora mesmo, ou a chave do anfitrião pode ter sido alterada." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Aumentar zoom" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Diminuir zoom" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "Dinâmico" ================================================ FILE: locale/ru-RU.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: ru\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Russian\n" "Language: ru_RU\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" всё ещё выполняется. Желаете закрыть?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "Копия {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "Семейство шрифтов, используемое для отображения символов, отсутствующих в основном шрифте" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Прервать все" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Принять и запомнить ключ" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Принять только в этот раз" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "Специальные возможности" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Акриловый фон" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Добавить" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Добавить перенаправление порта" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Добавить приватный ключ" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Добавить..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Доп. пространство между строками" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Расширенные" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Агент" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Перенаправление агента" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Путь к pipe SSH-агента" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Тип агента" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Позволяет открывать .bat файлы во вкладках, но ломает некоторые оболочки" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Позволяет быстро открыть терминал в выбранной папке" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "Всегда тёмная" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Всегда светлая" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Внешний вид" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Приложение" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Настройки приложения" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Вы уверены, что хотите закрыть Tabby? Это предупреждение можно отключить в Настройках -> Окно." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Вы уверены?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Аргументы" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Задать вопрос" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Спрашивать перед закрытием вкладки" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Звук" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Метод аутентификации" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Автор" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Автоматически" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Автооткрытие терминала при запуске приложения" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Автоматически" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Обновлять автоматически" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Автоматически загружать изменения и проверять наличие обновлений каждую минуту" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Доступно" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Тип фона" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "Режим работы клавиши Backspace" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Скорость передачи" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Начало строки" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Мигающий курсор" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Синий" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Размытие" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Величина жирности шрифта" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Снизу" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Bracketed-вставка (требует поддержки оболочки)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "Широковещательный режим. Нажмите в любом месте для отмены." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Встроенные" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Отмена" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Изменить скорость передачи" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Изменить цвет вкладки" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Изменить мастер-пароль" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Проверить обновления" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Шифры" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Очистить" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Очистить недавние профили" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Очистить терминал" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "Очистить терминал после подключения" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Буфер обмена" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Закрыть" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Закрыть и не показывать снова" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Закрыть активную панель" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Закрыть другие вкладки" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Закрыть вкладку" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Закрыть вкладки слева" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Закрыть вкладки справа" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "Закрывать окно после закрытия последней вкладки" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Цвет" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Цветовая схема" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Цветовая схема" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Стиль" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Объединить все вкладки в текущую" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Командная строка" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "Вместо сетевого соединения используется stdin/stdout команды" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Команды" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "Компактная (legacy)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Настройка удалена" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Конфигурация скачана" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Файл настроек" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Синхронизация конфигурации" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Конфигурация загружена" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Конфигурации" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Подключиться через прокси-сервер" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "Подключиться к \"%s\"..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Подключиться к другому хосту и использовать его как прокси" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "Соединение" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Соединение" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "Ошибка соединения: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "Вместо этого будет использоваться имя соединения" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Контекстное меню" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "Управляет расстоянием между элементами" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Скопировано" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Копировать" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Копировать текущий путь" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Копировать полный путь" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Копировать при выделении" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Копировать в буфер обмена" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Копировать с форматированием" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Не удалось расшифровать конфигурацию" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Создать" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Создать каталог" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Текущий" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Текущая цветовая схема" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Отпечаток ключа текущего хоста" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Текущий процесс: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Форма курсора" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Пользовательская" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "Пользовательский CSS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "Тёмная тема" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Биты данных" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Отладка" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Уменьшить размер разделения по горизонтали" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Уменьшить размер разделения по вертикали" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "«Подключиться к» по умолчанию" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "Подключение по умолчанию, используемое быстрым подключением (например, SSH, Telnet)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Профиль по умолчанию для новых вкладок" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "Настройки группы профилей по умолчанию" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Настройки профилей по умолчанию" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "Значения по умолчанию" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "По умолчанию для {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Удалить" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "Удалить \"{name}\"?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "Удалить {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Удалить всю строку" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Удалить следующее слово" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Удалить предыдущее слово" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "Удалить конфигурацию с удаленной стороны?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Удалить профили этой группы?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Удалить этот скрипт?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Удалить содержимое хранилища?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Удаление" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Устройство" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Напрямую" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Отключить" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Отключить динамический заголовок вкладки" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "Отключить прозрачный фон на время перетаскивания окна" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Отключить GPU-ускорение" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Отключено" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Отсоединиться" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "Отключиться в текущей вкладке (Serial/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "Отключиться от {host}?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Отображать изображения при помощи управляющей последовательности Sixel" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Отобразить на" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "Не прерывать" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Не закрывать" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Не запоминать" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "Закрепить поверх всех окон" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "Закрепить терминал" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "Размер закреплённого терминала" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "Отступы закреплённого терминала" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "Закрепление" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "Выделение по двойному щелчку остановится на этих символах" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "Вниз" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Скачать" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Выделять полужирный текст ярким цветом" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Дублировать" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Дублировать как администратор" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Дублировать вкладку" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Изменить" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Изменить локально" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Включить" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Включить аналитику" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "Включить анимацию" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Включить автоматическую установку обновлений, когда они доступны." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "Включить опцию свободного фона" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Включить лигатуры шрифтов" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Включить глобальную горячую клавишу (Ctrl-Space)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Включить экспериментальный API Windows ConPTY" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Зашифровать файл конфигурации" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Конец строки" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Окружение" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Очистить конфигурацию" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Очистить хранилище" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Ошибка в {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Точное совпадение" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Например:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "Экспериментальный стиль фона Windows 10 вызывает проблемы" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Экспорт" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Запасной шрифт" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Передача файлов" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "Файл: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "Фильтр" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Фиксированная" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Иногда прозрачный фон вызывает лаги при перетаскивании" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Фокус на все панелях" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Фокус на все панели сразу (broadcast)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "Фокус на всех панелях" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "Фокус на всех панелях сразу (broadcast)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "Фокус следует за курсором" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Фокус на следующей панели" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "Фокус на панели {number}" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Фокус на предыдущей панели" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Фокус на панели сверху" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Фокус на панели снизу" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Фокус на панели слева" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Фокус на панели справа" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "Следовать цветовой схеме" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Шрифт" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "Для сочетаний клавиш" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "Изменить на CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "Изменить на CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "Изменить на LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Принудительно устанавливает определенный тип подключения к SSH-агенту." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Забыть" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Перенаправить порт" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Перенаправленные порты" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "Из цветовой схемы" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "Системная" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "Из темы" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Фронтенд" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Полный" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Общие" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Открыть пред-заполненный отчет на GitHub" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Получить" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Скопируйте его из окна настроек web-версии Tabby" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Придает окну размытый прозрачный фон" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Вверх" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Зелёный" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Группа" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "Проблемы" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "Помогите отслеживать количество установок Tabby по всему миру!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Помогите с переводом Tabby" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Шестнадцатеричный" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "Скрыть" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Скрыть кнопку закрытия вкладки" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Скрыть нумерацию вкладок" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "Скрыть параметры вкладки" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Скрыть окно при потере фокуса" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "Скрывает закреплённый терминал при нажатии вне его." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Главная страница" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Хост" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Ключ хоста" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Проверка ключа хоста" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Горячие клавиши" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "Как Tabby обозначает себя в глобальных переменных" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "HTTP-прокси" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "Хост HTTP-прокси" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "Порт HTTP-прокси" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Иконка" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "Динамическая" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Если отключено, при выборе профиля будут отображаться только пользовательские профили" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Мгновенно локально отображает ваш ввод" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "Увеличить размер разделения по горизонтали" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "Увеличить размер разделения по вертикали" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "Ввод" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "Введённые данные передаются во время ввода" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Режим ввода" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "Переносы строк во вводе" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Установлено" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "Установка обновления приведет к закрытию всех вкладок и перезапуску Tabby." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "Умный Ctrl-C (копировать/отменить)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Интерактивная" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Неверный синтаксис" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "Промежуточный хост" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Перейти к следующему слову" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Перейти к предыдущему слову" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Оставить" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Интервал проверки соединения (мс)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "Отображать закреплённый терминал всегда поверх всех окон" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Ключ" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "Обмен ключами" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Клавиатура" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "Интерактивная аутентификация" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "Завершить принудительно" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Язык" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "Последний известный отпечаток ключа хоста" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Запустить WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Запустить WinSCP для текущей SSH сессии" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Узнайте, как разрешить Tabby определять рабочий каталог удалённой оболочки." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Слева" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Позволяет оболочке обрабатывать клавишу Meta вместо ОС" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "Светлая тема" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Построчно" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Редактор строк, ввод отправляется после нажатия Enter" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Междустрочный интервал" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Загрузка" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Загрузка конфигураций..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Локальное" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Локальное эхо" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Локальный терминал" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Скрипты входа" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Долгое нажатие для контекстного меню" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Управление профилями" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "Максимальное количество проверок соединения" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Развернуть активную панель" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "Минимальное контрастное соотношение" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Изменено {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "Мышь" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Переместить вкладку влево" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Переместить вкладку вправо" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Переместить в «Без группы»" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "Наведение мыши на неактивную панель приведёт к её активации" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Имя" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Имя для новой конфигурации" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "Имя для новой папки" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Системная" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "Новый" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Новый как администратор" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Новая конфигурация на {platform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "Имя новой группы" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Новый элемент" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Новое имя" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Новый профиль" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "Новая группа профилей" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Новое имя профиля" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Новая вкладка" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Новая вкладка: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Новый терминал" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Новое окно" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "Новое окно" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Новый с профилем" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Следующая вкладка" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Без цвета" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Без модификатора" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Нет" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Нормальный" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "Нормальный размер шрифта" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Не найдено" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Уведомить об активности" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Уведомить о завершении" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Количество строк, сохраняемых в буфере" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Выкл." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Официальный" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "На GitHub Discussions" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "Закрывать вкладки только при явном закрытии сеанса" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Прозрачность" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Открыть DevTools" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Открыть настройки" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Открыть вкладку настроек: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "Открыть панель SFTP" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "Опциональный" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Параметры" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Оранжевый" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "По умолчанию для ОС" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "По умолчанию для ОС ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "Вывод показан в шестнадцатеричном виде" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "Вывод показан в изначальном виде" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Режим вывода" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Переносы строк в выводе" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "Переопределить дисплей X11" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "Перезаписать локальную конфигурацию и синхронизировать" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Перезаписать удаленную конфигурацию и синхронизировать" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "Перезаписать удаленную конфигурацию и начать синхронизацию?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "Перезаписать локальную конфигурацию и начать синхронизацию?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "Шаг изменения размера панели" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "Панели" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "Бумага (legacy)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Контроль чётности" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "Частичная синхронизация конфигурации невозможна, если конфигурация зашифрована с помощью хранилища." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "Пропускать насквозь" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "Парольная фраза для приватного ключа с хэшем {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Пароль" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Вставить" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Вставить из буфера обмена" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "Вставить, если нет выделения, иначе скопировать" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Вставить несколько строк?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "Вставить средней кнопкой мыши" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Путь или адрес локального сокета X11" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Закрепить" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Плагины" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Папка с плагинами" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Порт" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Порт открыт" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Порты" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Нажмите любую клавишу для переподключения" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Нажмите клавишу" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Предотвращает случайное закрытие" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Предотвращает случайное выполнение вставленных команд" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Предыдущая вкладка" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Приватные ключи" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Процесс завершён" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Название профиля" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Профили" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Профили и соединения" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Программа" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Прокси-команда" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Фиолетовый" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Помещает всю конфигурацию Tabby в зашифрованное хранилище" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Быстрое подключение" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Выйти" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Подключение через сокет" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "Таймаут подключения (мс)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Недавние" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Переподключение" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "Переподключиться в текущей вкладке (Serial/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Красный" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Regex" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Список изменений" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "Запомнить на {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Удаленное" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "Удалить пробелы и новые строки вокруг скопированного текста" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Переименовать" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "Переименовать вкладку" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "Отображение" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Восстановить последнюю вкладку" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Заменить" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Сообщить о проблеме" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "Требовать зажатие клавишы для перехода по ссылкам" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Сбросить масштабирование" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Перезапустить текущую последовательную сессию" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Перезапустить текущую SSH сессию" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Перезапустить текущую сессию Telnet" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "Перезапуск вкладки" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Перезапустите приложение, чтобы применить изменения" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "Восстановить настройки по умолчанию?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "Восстановить унаследованные настройки по умолчанию?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "Восстанавливать вкладки терминала при запуске приложения" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "Повторное использование сессии для нескольких вкладок" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "Справа" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "Правый клик" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Запустить от имени администратора" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Сохранить" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Сохранение пароля в связке ключей" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Сохранить и применить" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Сохранить как профиль" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Сохранить как профиль" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Сохранено" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Сохранённое расположение" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "Прокручивать при вводе" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "Прокрутить терминал на одну страницу вниз" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "Прокрутить терминал на одну страницу вверх" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Прокрутить терминал вниз" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "Прокрутить терминал до верха" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "Буфер обратной прокрутки" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "Прокручивает терминал вниз при вводе" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Поиск" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Поиск цветовых схем" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "Поиск горячих клавиш" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "Поиск плагинов" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Секретный токен синхронизации" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Выбрать" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Выберите базовый профиль для использования в качестве шаблона" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "Выбрать всё" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Выберите хранилище файлов" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Выбрать профиль" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Выберите профиль или введите адрес" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "Отправлять байты, вводя шестнадцатеричные значения" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Отправляет данные по одному байту за раз" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Последовательный порт" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Соединение по последовательному порту" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Последовательный порт: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Установить мастер-пароль" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Установить мастер-пароль" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Установить пароль" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Установить Tabby как %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "0 отключает последние профили" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "Установка пути для named pipe SSH-агента." #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Настройки" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Shell" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Shell не поддерживает обнаружение текущего пути" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Интеграция в систему" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "Показать" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "Показать селектор профиля {type}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "Показывать окно подтверждения при вставке нескольких строк" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "Показывать встроенные профили при выборе" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "Показать справку команды" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Показать файл настроек" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Показать значения по умолчанию" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Показать микшер" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "Показать названия панелей (для перестановки)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Показать значок профиля на вкладке" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Показать выбор профиля" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Показать последние профили при выборе" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Посмотреть изменения в релизе" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Показать соединения по последовательному порту" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "Показывать вкладки в полноэкранном режиме" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "Показать панель инструментов" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Показать содержимое хранилища" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Поддержка Sixel графики (экспериментальная)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "Пропустить MoTD/баннер" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "Медленная отсылка" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "Закрепляет окно к выбранному краю экрана" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "SOCKS прокси" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "Хост SOCKS прокси" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "Порт SOCKS прокси" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "Звук" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Исходный код" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "Расстояние между элементами" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Разделить" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Разделить снизу" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "Разделить снизу" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Разделить слева" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Разделить справа" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Разделить сверху" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "Разделить сверху" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "SSH-соединение" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "Управление SSH-подключениями теперь производится во вкладке «Профили и подключения»" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "Пароль SSH для {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "Стандартная (legacy)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "При запуске" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Стоп-биты" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Удалить" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Подпишитесь на обновления" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Допускаются подстановки." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "Переключить цветовую схему" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Сменить профиль" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Сменить профиль в активной панели" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Переключение реализации frontend для терминала (экспериментально)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Синхронизация" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Автоматическая синхронизация" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Хост синхронизации" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Синхронизация горячих клавиш" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Синхронизация хранилища" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Синхронизация настроек окна" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Вкладка {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Активность во вкладке" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby не смог запуститься с вашими плагинами, поэтому все сторонние плагины были отключены в этой сессии. Ошибка в следующем:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Новости и обновления Tabby в Twitter" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Вкладки" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Расположение вкладок" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Ширина вкладки" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Telnet сессия" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Терминал" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Фон терминала" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Звуковой сигнал терминала" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "Идентификация терминала" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Благодарим за загрузку Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Тема" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Есть активные передачи файлов" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Для этого соединения сохранён пароль" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Применяются для всех профилей данного типа" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "Они применяются ко всем профилям данного типа в группе" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Тонкая" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Включите, если испытываете алиасинг, гостинг или иные проблемы с отображением" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Переход в полноэкранный режим и обратно" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "Переключиться на последнюю вкладку" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Скрыть/показать окно терминала" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Переключает видимость окна Tabby" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "Сверху" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "Обрезать пробелы и новые строки" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Повторить" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Пробуем сохранённый пароль" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "Превратить панели текущей вкладки в отдельные вкладки" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Без группы" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Удалить" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Неизвестно" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Неизвестный тип секретных данных {type} для {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Открепить" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "Вверх" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Обновить" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Обновить до {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Загрузить" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Загрузить как новую конфигурацию" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Использовать {altKeyName} в качестве клавиши Meta" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "Использовать ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "По умолчанию для пользователя" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Имя пользователя" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "Использовать метод CONNECT" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Используем предустановленный пароль" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Хранилище" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Хранилище представляет собой постоянно зашифрованный контейнер, содержащий такие секретные данные, как SSH-пароли и парольные фразы приватных ключей." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Хранилище пусто" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Хранилище закрыто" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "Хранилище не настроено" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "Для сохранения секретных данных должен быть задан мастер-пароль хранилища" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Проверять ключ хоста при подключении" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Версия" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Версия: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Размытый фон" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Визуально" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Предупреждать при многострочной вставке" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Предупреждать при закрытии активных соединений" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "Предупреждение: ключ удалённого хоста неожиданно изменился!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Отслеживается только версия ОС и приложения." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Добро пожаловать" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Что нового" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "При завершении сеанса" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "Когда включено, ссылки можно нажимать, только удерживая эту клавишу" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "Если WinSCP обнаружен, можно запускать SCP-сессии из контекстного меню." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "Должно ли использоваться кастомное оформление окна или системное" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "Запретит отправку SSH-приветствия" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Окно" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "Размеры окна вдоль края" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "Размеры окна от края" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Рамка окна" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "Windows" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Для ConPTY рекомендуется Windows 10 build 18309 или выше" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "Путь к WinSCP" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Разделители слов" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Рабочий каталог" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Определение рабочего каталога" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "Колокольчик терминала WSL может быть заглушён только при помощи микшера громкости" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "Терминал WSL поддерживает TrueColor только с ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "Перенаправление X11" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Жёлтый" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "Вы можете изменить его позже, но, если забудете, восстановить будет невозможно." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "Возможно, прямо сейчас вы подвергаетесь атаке посредника (man-in-the-middle), или ключ хоста мог быть просто изменён." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Приблизить" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Отдалить" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "Динамическое" ================================================ FILE: locale/sr-SP.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: sr\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Serbian (Cyrillic)\n" "Language: sr_SP\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" је и даље покренута. Затворити?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "копирај {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "Друга породица фонта се користи за приказивање карактера који недостају у главном фонту" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Откажи све" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Прихвати и запамти кључ" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Прихвати га само једном" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "Приступачност" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Акрилична позадина" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Додај" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Додај прослеђивање порта" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Додај приватни кључ" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Додај..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Додатни размак између линија" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Напредно" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Агент" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Прослеђивање агента" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Путања агента" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Тип агента" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Омогућава отварање .bat у картицама, али квари неке шкољке" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Омогућава брзо отварање терминала у изабраном директоријуму" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Изглед" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Апликација" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Поставке апликације" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Да ли сте сигурни да желите да затворите Tabby? Можете онемогућити овај упит у Подешавања -> Прозор." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Да ли сте сигурни?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Аргументи" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Поставите питање" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Питајте пре затварања картица претраживача" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Чијно" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Метода аутентификације" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Аутор" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Аутоматски" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Аутоматски отвори терминал приликом покретања апликације" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Аутоматско" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Аутоматска ажурирања" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Аутоматски отпреми промене и провери ажурирања сваког минута" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Доступно" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Тип позадине" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Број бауда" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Почетак линије" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Трепћући курсор" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Плава" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Замагљено" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Јачина подебљања фонта" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Дно" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Лепљење са заградама (захтева подршку за шкољку)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "Режим емитовања. Кликните било где да откажете." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Уграђено" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Откажи" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Измени број бауда" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Промени боју картице" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Промени мастер фразу" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Провери ажурирања" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Шифре" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Очисти" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Очисти недавне профиле" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Очисти терминал" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "Очисти терминал након конектовања" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Привремена меморија" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Затвори" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Затвори и не приказуј више" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Затвори фокусирано окно" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Затвори друге картице" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Затвори картицу" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Затвори картице са леве стране" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Затвори картице са десне стране" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "Затвори прозор после затварања последње картице" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Боја" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Шема боја" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Боје" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Комбинуј све картице у тренутну картицу" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Командна линија" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Команде" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Конфигурација је обрисана" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Конфигурација је преузета" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Конфигурациона датотека" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Синхронизовање конфигурације" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Конфигурација је отпремљена" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Конфигурације" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Повежи се кроз прокси сервер" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "Повежи се на \"%s\"..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Повежи се на различитог домаћина прво и користи га као прокси" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "Повезивање" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Повезивање" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "Повезивање није успело: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "Име конекције ће бити коришћено уместо" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Контекстни мени" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Копирано" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Копирај" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Копирај тренутну путању" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Копирај целу путању" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Копирај приликом селектовања" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Копирај у привремену меморију" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Копирај са форматирањем" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Немогуће је дешифровати конфигурацију" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Направи" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Направи директоријум" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Тренутно" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Тренутна шема боја" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Тренутни кључ отиска домаћина" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Тренутни процес: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Облик курсора" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Прилагођено" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "Прилагођени CSS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Битови података" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Отклањање грешака" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Смањите величину хоризонталне поделе" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Смањите величину хоризонталне поделе" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Подразумевани профил за нове картице" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Подрзумевана подешавања профила" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "Подразумевано" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "Подразумевано за {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Обриши" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "Обриши {name}\"?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "Обриши {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Обриши целу линију" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Обриши следећу реч" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Обриши претходну реч" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "Обрисати конфигурацију на удаљеном делу?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Обрисати профиле група?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Обрисати ову скрипту?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Обрисати садржај трезора?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Брисање" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Уређај" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Директно" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Онемогући" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Онемогући динамички наслов картице" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "Онемогући течну позадину приликом превлачења" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Онемогући убрзање графичке јединице" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Онемогућено" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Прекини везу" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "Прекинути везу са {host}?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Прикажи слике преко Sixel излазних секвенци" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Прикажи на" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "Не отказуј" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Не затварај" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Не памти" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "На врху осталих прозора" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "Избор двоструким кликом ће се зауставити на овим карактерима" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "Доле" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Преузми" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Нацртај подебљани текст јарким бојама" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Умножи" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Умножи као администратор" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Умножи картицу" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Уреди" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Уреди локално" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Омогући" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Омогући аналитику" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "Омогући анимације" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Омогући аутоматско инсталирање надоградњи када постану доступна." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "Омогући опцију течне позадине" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Омогући лигатуре фонта" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Омогући глобалну пречицу (Ctrl-Space)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Омогући експерименталан Windows ConPTY API" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Шифруј конфигурациону датотеку" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Крај линије" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Окружење" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Обриши конфигурацију" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Обриши трезор" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Грешка у {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Тачно подударање" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Пример:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "Експерименталан стил позадине за Windows 10 уме да проузрокује проблеме" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Извези" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Резервни фонт" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Преноси датотека" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "Датотека: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "Филтер" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Фиксно" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Течна позадина понекад узрокује кашњење у повлачењу" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Фокусирај сва окна" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Фокусирај сва окна одједном (емитовање)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "Фокусирај све картице" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "Фокусирај све картице одједном (емитовање)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "Фокусирај праћење миша" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Фокусирај следеће окно" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "Фокусирај окно {number}" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Фокусирај претходно окно" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Фокусирај окно изнад" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Фокусирај окно испод" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Фокусирај окно са леве стране" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Фокусирај окно на десну страну" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Фонт" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "За тастерске пречице" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "Форсирај CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "Форсирај CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "Форсирај LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Форсира специфичан тип конекције SSH агента." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Заборави" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Проследи порт" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Прослеђени портови" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "Из шеме боја" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "Из теме" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Предњи крај" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Цео" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Опште" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Преузми" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Преузми из подешавања прозора за Tabby Web" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Даје прозору замућену провидну позадину" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "На врх" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Зелено" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Група" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "Хакови" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "Помози праћењу броја инсталација Tabby-ја у целом свету!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Помози у превођењу Tabby-ја" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Хексадецимални" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Сакриј дугме за затварање картице" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Сакриј индекс картице" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "Сакриј дугме за опције картице" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Сакриј прозор приликом губитка фокуса" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Почетна страна" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Домаћин" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Кључ домаћина" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Верификација кључа домаћина" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Тастерске пречице" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "HTTP прокси" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "Домаћин HTTP прокси-ја" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "Порт HTTP прокси-ја" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Икона" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Уколико је онемогућено, само прилагођени профили ће се приказати у одабиру профила" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Одмах локално одзвања ваш унос" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "Повећај величину хоризонталне поделе" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "Повећај величину хоризонталне поделе" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "Унос се шаље како куцате" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Режим уноса" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "Унос нових линија" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Инсталирано" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "Инсталирање надоградње ће затворити све картице и поново покренути Tabby." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Интерактивно" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Неисправна синтакса" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Кључ" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Тастатура" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Језик" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Покрени WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Покрени WinSCP за тренутну SSH сесију" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Лево" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Дозвољава љусци да рукује Мета кључем уместо ОС-а" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Линија по линију" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Уређивач линија, унос се шаље након што притиснете ентер" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Водећи размак линије" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Учитавање" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Учитавање конфигурација..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Локално" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Локални ехо" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Локални терминал" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Скрипте за учитавање" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Дуги клик за контекстни мени" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Управљање профилима" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "Максималан Keep Alive Count" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Максимизирај активно окно" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "Минимални однос контраста" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Измењено у {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "Миш" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Помери картицу лево" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Помери картицу десно" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Помери у ”Негруписано”" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "Померање миша преко неактивног окна ће га активирати" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Име" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Име нове конфигурације" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "Име новог директоријума" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Изворно" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Нова администраторска картица" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Нова конфигурација на {platform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Нова ставка" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Ново име" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Нови профил" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Ново име профила" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Нова картица" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Нова картица: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Нови терминал" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Нови прозор" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "Нови прозор" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Ново са профилом" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Следећа картица" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Без боје" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Без модификатора" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Ништа" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Нормално" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "Нормално подебљање фонта" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Није пронађено" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Обавести приликом активности" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Обавести када је завршено" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Број битова остављених у баферу" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Искључено" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Званично" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Непрозирност" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Отвори алатке за развој" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Отвори подешавања" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Отвори картицу подешавања: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "Отвори SFTP панел" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "Опцинално" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Опције" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Наранџастo" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "Подразумевано за ОС" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "Подразумевано за ОС ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Режим излаза" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Излаз нових линија" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "Окна" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Паритет" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "" #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Лозинка" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Налепи" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Налепи из оставе" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "Налепи ако нема избора, иначе копирај" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Налепи више линија?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Закачи" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Додаци" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Директоријум са додацима" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Порт" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Отворен порт" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Портови" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Притисните било који тастер да би сте се поново повезали" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Притисните било који тастер сада" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Спречава случајно затварање" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Спречава случајно покретање налепљених команда" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Претходна картица" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Приватни кључеви" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Процес је завршен" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Име профила" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Профили" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Профили и конекције" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Програм" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Команда за прокси" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Љубичасто" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Ставља сву Tabby-јеву конфигурацију у трезор" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Брзо повезивање" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Изађи" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Необрађена конекција сокетом" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "Време спремности (милисекунде)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Недавно" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Повежи се поново" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Црвено" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Регуларни израз" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Белешке о издању" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "Запамти за {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Удаљено" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "Уклони размаке и празне линије око копираног текста" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Преименуј" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "Преименуј картицу" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "Рендеровање" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Поново отвори последњу картицу" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Замени" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Пријави проблем" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "Захтевај кључ како би кликнули на везе" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Ресетуј зумирање" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Поново покрени тренутну серијску сесију" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Поново покрени тренутну SSH сесију" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Поново покрени тренутну Telnet сесију" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "Поново покрени картицу" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Поново покрените апликацију да се примене промене" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "Поврати картице терминала приликом покретања апликације" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "Поново користи сесију за више картица" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "Десно" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "Десни клик" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Покрени као администратор" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Сачувај" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Сачувај лозинку у keychain-у" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Сачувај и примени" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Сачувај као профил" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Сачувај изглед као профил" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Сачувано" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Сачуван распоред" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "Помери на унос" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "Помери терминал једну страницу доле" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "Помери терминал једну страницу горе" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Помери терминал на дно" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "Помери терминал на врх" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "Померање уназад" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "Помера терминал на дно корисничког уноса" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Претрага" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Претражи шеме боја" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "Претражи тастерске пречице" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "Претражи додатке" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Тајни токен за синхронизацију" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Изабери" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Изаберите основни профил који ћете користити као шаблон" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "Изабери све" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Избор складишта датотека" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Избор профила" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Изаберите профил или унесите адресу" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Серијски" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Серијска конекција" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Серијски: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Постави мастер фразу" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Постави фразу" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Постави лозинку" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Постави Tabby као %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "Поставите на 0 да би сте онемогућили скорашње профиле" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "" #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Подешавања" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Шкољка" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Шкољка не подржава детекцију тренутне путање" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Интеграција шкољке" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "Прикажи прозор за потврду приликом лепљења више линија" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Прикажи конфигурациону датотеку" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Прикажи подразумевана" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Прикажи миксер" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Прикажи иконицу профила у картици" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Прикажи одабирач профила" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Прикажи скорашње профиле у одабирачу" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Прикажи белешке о издању" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Прикажи серијске конекције" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "Прикажи траку са алаткама" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Прикажи садржаје сефа" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Графичка подршка за Sixel (експериментално)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "Звук" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Изворни код" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Подели" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Подели на дно" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "Подели на доле" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Подели на лево" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Подели на десно" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Подели на врх" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "Подели на дно" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "SSH конекција" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "Управљање SSH конекцијом се сада врши кроз картицу ”Профили и конекције”" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "SSH лозинка за {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "Покретање" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Заустави битове" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Трака" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Претплатите се на ажурирања" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Замене су дозвољене." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Пребаци профил" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Пребаци профил у активном окну" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Пребацује спољну имплементацију терминала (експериментално)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Синхронизација" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Синхронизуј аутоматски" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Синхронизуј домаћина" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Синхронизуј тастерске пречице" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Синхронизуј сеф" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Синхронизуј подешавања прозора" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Картица {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Активност картице" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby није могао да се покрене са вашим додацима, тако да су сви додаци треће стране онемогућеи у овој сесији. Грешка је:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Вести и ажурирања на Твитеру за Tabby" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Картице" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Локација картица" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Ширина картица" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Telnet сесија" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Терминал" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Позадина терминала" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Звоно терминала" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "Идентификација терминала" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Хвала вам што сте преузели Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Изглед" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "У току су активни преноси датотека" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Постоји сачувана лозинка за ову конекцију" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Ово се односи на све профиле датог типа" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Танко" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Пребаци се на режим приказа на целом екрану" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "Пребаци се на последњу картицу" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Пребаци се на прозор терминала" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Пребацује се на видљивост Tabby-јевог прозора" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "Врх" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "Скрати размак и нове редове" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Покушајте поново" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Покушавам са сачуваном лозинком" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "Претвори окна тренутне картице у засебне картице" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Негруписано" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Деинсталирај" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Непознато" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Непозната тајта типа {type} за {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Откачи" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "Горе" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Ажурирање" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Ажурирај на {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Отпремање" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Отпреми као нову конфигурацију" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Користи {altKeyName} као Мета кључ" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "Користи ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "Подразумевано за корисника" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Корисничко име" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "Коришћење CONNECT методе" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Коришћење унапред постављене лозинке" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Трезор" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Трезор је увек-енкриптован контејнер за тајне попут лозинки за SSH и приступне фазе за приватни кључ." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Трезор је празан" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Трезор је закључан" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "Трезор није конфигурисан" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "Мастер приступна фаза за трезор мора да буде постављена коришћењем тајни за чување" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Верификуј кључеве домаћина приликом повезивања" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Верзија" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Верзија: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Вибрантност" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Визуелно" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Упозори приликом лепљења више линија" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "" #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Добро дошли" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Шта је ново" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Прозор" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Оквир прозора" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "Путања за WinSCP" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Одвајачи речи" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Радни директоријум" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Детекција радног директоријума" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Жуто" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "" #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Увећај" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Умањи" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "" ================================================ FILE: locale/sv-SE.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: sv-SE\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Swedish\n" "Language: sv_SE\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" körs fortfarande. Stäng?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} kopia" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "En andra typsnittsfamilj som används för att visa tecken som saknas i huvudtypsnittet" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Avbryt alla" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Acceptera och kom ihåg nyckel" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Acceptera bara den här gången" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "Tillgänglighet" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Akryl bakgrund" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Lägg till" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Lägg till en vidarebefordrad port" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Lägg till en privat nyckel" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Lägg till..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Ytterligare utrymme mellan raderna" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Avancerat" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Agent" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Agent vidarebefordran" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Agent processökväg" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Agent typ" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Tillåter att öppna .bat-filer i flikar, men kraschar några skal" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Tillåter att snabbt öppna en terminal i den valda mappen" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "Alltid mörk" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Alltid ljus" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Utseende" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Applikation" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Applikationsinställningar" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Är du säker på att du vill stänga Tabby? Du kan inaktivera denna prompt i Inställningar -> Fönster." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Är du säker?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Argument" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Ställ en fråga" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Fråga innan webbläsarfliken stängs" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Hörbar" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Autentiseringsmetod" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Författare" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Auto" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Öppna en terminal automatiskt vid appstart" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Automatisk" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Automatiska uppdateringar" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Ladda automatiskt upp ändringar och sök efter uppdateringar varje minut" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Tillgänglig" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Bakgrundstyp" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "Tangentläge för backsteg" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Baudhastighet" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Början av raden" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Blinkande markör" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Blå" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Oskärpa" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Fet teckensnittsvikt" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Botten" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Inklistring inom parentes (kräver stöd för skal)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "Sändningsläge. Klicka var som helst för att avbryta." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Inbyggt" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Avbryt" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Ändra baudhastighet" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Ändra flikfärg" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Ändra huvudlösenordsfrasen" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Sök efter uppdateringar" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Chiffer" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Rensa" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Rensa senaste profilerna" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Rensa terminal" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "Rensa terminal efter anslutning" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Urklipp" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Stäng" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Stäng och visa aldrig igen" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Stäng fokuserad panel" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Stäng andra flikar" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Stäng flik" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Stäng flikar till vänster" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Stäng flikar till höger" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "Stäng fönstret efter att ha stängt den sista fliken" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Färg" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Färgschema" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Färgschema" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Färger" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Kombinera alla flikar till den aktuella fliken" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Kommandorad" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "Kommandot stdin/stdout används istället för en nätverksanslutning" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Kommandon" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "Kompakt (legacy)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Konfiguration borttagen" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Konfiguration nerladdad" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Konfigurationsfil" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Konfigurationssynkronisering" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Konfiguration uppladdad" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Konfigurationer" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Anslut via en proxyserver" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "Anslut till \"%s\"..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Anslut först till en annan värd och använd den som proxy" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "Ansluter" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Anslutning" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "Anslutning misslyckades: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "Anslutningsnamn kommer att användas istället" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Snabbmeny" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "Styr mängden utrymme mellan element" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Kopierad" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Kopiera" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Kopiera aktuell sökväg" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Kopiera fullständig sökväg" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Kopiera vid val" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Kopiera till urklipp" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Kopiera med formatering" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Kunde inte dekryptera konfigurationen" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Skapa" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Skapa mapp" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Nuvarande" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Nuvarande färgschema" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Aktuell värdnyckels fingeravtryck" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Aktuell process: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Markörens form" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Anpassad" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "Anpassad CSS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "Mörkt läge" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Databitar" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Felsökning" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Minska storlek på horisontellt delad vy" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Minska storlek på vertikalt delad vy" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "Standardtyp \"Anslut till\"" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "Standard anslutningstyp som används av snabbanslutningsfunktionen (ex. SSH, Telnet)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Standardprofil för nya flikar" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "Inställningar för standardprofil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Inställningar för standardprofil" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "Standardvärden" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "Standardvärden för {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Radera" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "Radera \"{name}\"?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "Radera {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Radera hela raden" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Radera nästa ord" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Radera föregående ord" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "Ta bort konfigurationen på fjärrsidan?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Radera gruppens profiler?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Radera det här skriptet?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Radera innehållet i valvet?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Raderar" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Enhet" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Direkt" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Inaktivera" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Inaktivera dynamisk fliktitel" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "Inaktivera flytande bakgrund medan du drar" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Inaktivera GPU-acceleration" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Inaktiverad" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Koppla ifrån" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "Koppla från aktuell flik (Serial/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "Koppla bort från {host}?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Visa bilder via Sixel escape-sekvenser" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Display på" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "Avbryt inte" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Stäng inte" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Kom inte ihåg" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "Dock alltid på toppen" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "Docka terminalen" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "Dockad terminalstorlek" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "Dockat terminalutrymme" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "Dockning" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "Dubbelklicka val kommer att stanna vid dessa tecken" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "Ner" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Ladda ner" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Rita fet text i ljusa färger" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Duplicera" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Duplicera som administratör" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Duplicera flik" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Redigera" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Redigera lokalt" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Aktivera" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Aktivera analyser" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "Aktivera animationer" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Aktivera automatisk installation av uppdateringar när de blir tillgängliga." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "Aktivera flytande bakgrundsalternativ" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Aktivera teckensnittsligaturer" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Aktivera global snabbtangent (Ctrl-Mellanslag)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Aktiverar det experimentella Windows ConPTY API" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Kryptera konfigurationsfil" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Slutet av raden" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Miljö" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Radera konfiguration" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Radera valvet" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Fel i {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Exakt matchning" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Exempel:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "Experimentella Windows 10 bakgrundsstilar som är kända för att orsaka problem" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Exportera" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Reservtypsnitt" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Filöverföringar" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "Fil: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "Filtrera" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Fast" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Flytande bakgrund orsakar ibland draglag" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Fokusera alla paneler" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Fokusera alla paneler samtidigt (sändning)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "Fokusera alla flikar" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "Fokusera alla flikar samtidigt (sändning)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "Fokus följer mus" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Fokusera nästa panel" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "Fokusera panel {nummer}" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Fokusera föregående panel" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Fokusera panelen ovan" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Fokusera panelen under" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Fokusera panelen till vänster" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Fokusera panelen till höger" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "Följ färgschemat" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Typsnitt" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "För kortkommandon" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "Tvinga CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "Tvinga CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "Tvinga LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Framtvingar en specifik SSH-agentanslutningstyp." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Glöm bort" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Vidarebefordra port" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Vidarebefordrade portar" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "Från färgschema" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "Från systemet" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "Från tema" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Frontend" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Full" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Allmän" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Generera ett förifyllt GitHub-problem" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Hämta" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Hämta det från fönstret Tabby Web-inställningar" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Ger fönstret en suddig transparent bakgrund" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Gå upp" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Grön" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Grupp" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "Hacks" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "Hjälp till att spåra antalet Tabby-installationer över hela världen!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Hjälp till att översätta Tabby" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Hexadecimal" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "Dölj" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Dölj flikstängningsknappen" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Dölj flikindex" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "Dölj flikalternativsknappen" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Dölj fönstret vid fokusförlust" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "Döljer den dockade terminalen när du klickar bort." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Hemsida" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Värd" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Värdnyckel" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Värdnyckelverifiering" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Snabbtangenter" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "Hur Tabby presenterar sig genom miljövariabler" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "HTTP-proxy" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "HTTP-proxy-värd" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "HTTP-proxyport" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Ikon" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "Dynamic" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Om inaktiverad, kommer endast anpassade profiler att visas i profilväljaren" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Ekar omedelbart din inmatning lokalt" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "Öka storlek på horisontellt delad vy" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "Öka storlek på vertikalt delad vy" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "Inmatning" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "Inmatning skickas när du skriver" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Inmatningsläge" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "Inmatningsradbrytning" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Installerad" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "Om du installerar uppdateringen stängs alla flikar och Tabby startas om." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "Intelligent Ctrl-C (kopiera/avbryt)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Interaktiv" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Felaktig syntax" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "Mellanvärd" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Hoppa till nästa ord" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Hoppa till föregående ord" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Behåll" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Håll-vid-liv-intervall (millisekunder)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "Håll dockad terminal alltid överst" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Nyckel" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "Nyckelbyte" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Tangentbord" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "Tangentbordsinteraktiv autentisering" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "Döda" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Språk" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "Senast kända värdnyckelfingeravtryck" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Starta WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Starta WinSCP för aktuell SSH-session" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Lär dig hur du tillåter Tabby att upptäcka fjärrskalets arbetskatalog." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Vänster" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Låter skalet hantera Meta-nyckeln istället för OS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "Ljust läge" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Rad för rad" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Radredigerare, inmatning skickas efter att du tryckt på Enter" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Linjestoppning" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Laddar" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Läser in konfigurationer..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Lokal" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Lokalt eko" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Lokal terminal" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Inloggningsskript" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Långklicka för snabbmeny" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Hantera profiler" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "Max Håll-vid-liv-antal" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Maximera den aktiva panelen" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "Minsta kontrastförhållande" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Ändrad den {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "Mus" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Flytta fliken till vänster" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Flytta fliken till höger" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Flytta till \"Ogrupperad\"" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "Om du flyttar musen över en inaktiv panel kommer den att aktiveras" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Namn" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Namn på den nya konfigurationen" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "Namn på den nya mappen" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Inbyggd" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "Ny" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Ny adminflik" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Ny konfiguration på {plattform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "Nytt gruppnamn" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Nytt objekt" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Nytt namn" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Ny profil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "Ny profilgrupp" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Nytt profilnamn" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Ny flik" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Ny flik: {profil}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Ny terminal" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Nytt fönster" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "Nytt fönster" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Nytt med profil" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Nästa flik" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Ingen färg" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Ingen modifierare" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Ingen" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Normal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "Normal teckensnittsvikt" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Hittades inte" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Meddela om aktivitet" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Meddela när du är klar" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Antal rader i bufferten" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Av" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Officiell" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "På GitHub-diskussioner" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "Stäng bara fliken när sessionen uttryckligen avslutas" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Opacitet" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Öppna DevTools" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Öppna Inställningar" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Öppna fliken Inställningar: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "Öppna SFTP-panelen" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "Frivillig" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Alternativ" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Orange" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "OS standard" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "OS standard ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "Utdata visas som en hexdump" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "Utdata visas när den tas emot" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Utgångsläge" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Utgångsradbrytningar" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "Åsidosätt X11-skärm" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "Skriv över lokal och synkronisera" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Skriv över fjärr och synkronisera" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "Skriv över konfigurationen på fjärrsidan och börja synkronisera?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "Vill du skriva över den lokala konfigurationen och börja synkronisera?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "Panelomskalningssteg" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "Paneler" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "Papper (legacy)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Paritet" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "Delvis konfigurationssynkronisering är inte möjlig när konfigurationen är krypterad via Valvet." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "Genomgång" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "Lösenfras för en privat nyckel med hash {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Lösenord" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Klistra in" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Klistra in från urklipp" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "Klistra in om inget val, annars kopiera" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Klistra in flera rader?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "Klistra in vid mittenklick" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Sökväg eller adress till det lokala X11-uttaget" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Fäst" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Plugins" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Plugins-mappen" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Port" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Port öppnad" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Portar" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Tryck på valfri tangent för att återansluta" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Tryck på knappen nu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Förhindrar oavsiktlig stängning" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Förhindrar oavsiktlig exekvering av inklistrade kommandon" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Föregående flik" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Privata nycklar" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Processen avslutad" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Profilnamn" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Profiler" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Profiler & anslutningar" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Program" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Proxy kommando" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Lila" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Lägger in hela Tabbys konfiguration i valvet" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Snabbanslutning" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Avsluta" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Raw socket anslutning" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "Klar timeout (millisekunder)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Nyligen" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Återanslut" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "Återanslut aktuell flik (Serial/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Röd" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Regex" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Versionsinformation" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "Kom ihåg för {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Fjärr" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "Ta bort blanksteg och radbrytningar runt den kopierade texten" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Döp om" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "Byt namn på fliken" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "Rendering" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Öppna senast stängda flik" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Byta ut" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Rapportera ett problem" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "Kräv en nyckel för att klicka på länkar" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Återställ zoom" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Starta om aktuell seriell session" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Starta om aktuell SSH-session" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Starta om aktuell Telnet-session" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "Starta om fliken" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Starta om appen för att tillämpa ändringar" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "Återställ inställningar till standard?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "Återställ inställningar till ärvda standardinställningar?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "Återställ terminalflikar vid appstart" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "Återanvänd session för flera flikar" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "Höger" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "Högerklicka" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Kör som administratör" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Spara" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Spara ett lösenord i nyckelringen" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Spara och tillämpa" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Spara som profil" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Spara layout som profil" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Sparad" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Sparad layout" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "Bläddra vid inmatning" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "Skrolla terminalen en sida ner" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "Skrolla terminalen en sida upp" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Skrolla terminalen till botten" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "Skrolla terminalen till toppen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "Historik" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "Skrollar terminalen till botten vid användarinmatning" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Sök" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Sök efter färgscheman" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "Sök snabbtangenter" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "Sök plugins" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Hemligt synkroniseringstoken" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Välj" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Välj en basprofil att använda som mall" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "Välj alla" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Välj fillagring" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Välj profil" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Välj profil eller ange en adress" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "Skicka byte genom att skriva in hexadecimala värden" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Skickar data en byte i taget" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Serie" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Seriell anslutning" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Serienummer: {beskrivning}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Ställ in huvudlösenfras" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Ställ in lösenordsfras" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Välj lösenord" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Ställ in Tabby som %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "Ställ in 0 för att inaktivera senaste profiler" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "Ställer in SSH-agentens namngivna processökväg." #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Inställningar" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Skal" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Skalet stöder inte detektering av strömväg" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Skalintegration" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "Visa" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "Visa profilväljaren {typ}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "Visa en bekräftelseruta när du klistrar in flera rader" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "Visa inbyggda profiler i väljaren" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "Visa kommandoväljare" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Visa konfigurationsfil" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Visa standardinställningar" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Visa mixer" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "Visa paneletiketter (för att ordna om)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Visa profilikon på fliken" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Visa profilväljare" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Visa senaste profiler i väljaren" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Visa release notes" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Visa seriella anslutningar" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "Visa flikar i helskärmsläge" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "Visa verktygsfält" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Visa valvets innehåll" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Stöd för Sixel-grafik (experimentellt)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "Hoppa över MoTD/banner" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "Långsam matning" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "Fäster fönstret mot en sida av skärmen" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "SOCKS proxy värd" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "SOCKS proxyport" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "Ljud" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Källkod" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "Rymlighet" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Dela" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Dela till botten" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "Dela till nedåt" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Dela åt vänster" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Dela till höger" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Dela till toppen" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "Dela uppåt" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "SSH-anslutning" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "SSH-anslutningshantering görs nu via fliken \"Profiler & anslutningar\"." #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "SSH-lösenord för {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "Standard (legacy)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "Börja" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Stoppa bitar" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Remsa" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Prenumerera på uppdateringar" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Byten tillåtna." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "Byt färgschema" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Byt profil" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Byt profil i den aktiva panelen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Switchar terminal frontend implementering (experimentell)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Synkronisera" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Synkronisera automatiskt" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Synkronisera värd" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Synkronisera snabbtangenter" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Synkronisera valv" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Synkronisera fönsterinställningar" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Flik {nummer}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Flikaktivitet" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby kunde inte starta med dina plugins, så alla tredjeparts plugins har inaktiverats i den här sessionen. Felet var:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Tabby nyheter och uppdateringar på Twitter" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Flikar" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Flikplacering" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Flikarnas bredd" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Telnet-session" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Terminal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Terminal bakgrund" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Terminalklocka" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "Terminal identifiering" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Tack för att du laddade ner Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Tema" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Det finns aktiva filöverföringar" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Det finns ett sparat lösenord för denna anslutning" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Dessa gäller alla profiler av en angiven typ" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "Dessa gäller alla profiler av en angiven typ" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Tunn" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Kryssa för detta om du upplever aliaseffekt, spökbilder eller andra visuella problem" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Växla helskärmsläge" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "Växla sista fliken" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Växla terminalfönster" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Växlar synlighet för Tabby-fönstret" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "Toppen" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "Trimma blanksteg och radbrytningar" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Försök igen" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Försöker sparat lösenord" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "Förvandla nuvarande fliks paneler till separata flikar" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Ogrupperad" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Avinstallera" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Okänd" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Okänd hemlighet av typen {type} för {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Lossa" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "Upp" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Uppdatera" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Uppgradera till {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Ladda upp" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Ladda upp som en ny konfiguration" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Använd {altKeyName} som Meta-nyckel" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "Använd ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "Användarstandard" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Användarnamn" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "Använder CONNECT-metoden" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Använder förinställt lösenord" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Valv" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Valvet är en alltid-krypterad behållare för hemligheter så som SSH-lösenord och privata nyckellösenfraser." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Valvet är tomt" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Valvet är låst" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "Valvet är inte konfigurerat" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "Valv-huvudlösenord måste ställas in för att tillåta lagring av hemligheter" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Verifiera värdnycklar när du ansluter" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Version" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Version: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Vibrans" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Visuell" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Varna för flerraders inklistring" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Varna när aktiva anslutningar stängs" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "Varning: fjärrvärdens nyckel har plötsligt ändrats!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Vi spårar bara dina Tabby- och OS-versioner." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Välkommen" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Vad är nytt" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "När en session slutar" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "När aktiverad, är länkar endast klickbara medans du håller ned denna tangent" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "När WinSCP upptäcks kan du starta en SCP-session från snabbmenyn." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "Om ett anpassat fönster eller ett OS-inbyggt fönster ska användas" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "Kommer att förhindra att SSH-hälsning visas" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Fönster" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "Fönstermått längs kanten" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "Fönstermått bort från kanten" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Fönsterram" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "Fönster" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Windows 10 build 18309 eller högre rekommenderas för ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "WinSCP sökväg" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Ordavgränsare" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Arbetskatalog" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Detektering av arbetskatalog" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "WSL-terminalklockan kan endast stängas av via Ljudmixeralternativ" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "WSL-terminalen stöder endast TrueColor med ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "X11 vidarebefordran" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Gul" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "Du kan ändra det senare, men det går inte att återställa om det glöms bort." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "Du kan vara under en man-in-the-middle-attack just nu, eller så kan värdnyckeln bara ha ändrats." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Zooma in" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Zooma ut" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "Dynamic" ================================================ FILE: locale/tr-TR.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: tr\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Turkish\n" "Language: tr_TR\n" "PO-Revision-Date: 2025-01-22 22:02\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" halen çalışıyor. Kapatılsın mı?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} kopyalandı" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "Varsayılan yazı tipinde eksik karakterleri görüntülemek için kullanılan ikinci yazı tipi" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Tümünü iptal et" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Kabul et ve hatırla" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Yalnızca bu seferlik" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "Erişilebilirlik" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Saydam arkaplan" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Ekle" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Yeni port yönlendirmesi ekle" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Özel anahtar ekle" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Ekle..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Satırlar arasındaki ek boşluk" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Gelişmiş" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Anonim" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Anonim yönlendirme" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Anonim ayar dosyası" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Gizlilik Türü" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr ".bat dosyalarının yeni sekmelerde açılmasına izin verir, ancak bazı Terminallerde çalışmayabilir" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Seçilen klasörde hızlı bir şekilde bir terminal açılmasına izin verir" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Daima Aydınlık" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Görünüm / Kişileştirme" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Uygulama" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Uygulama ayarları" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Tabby'i kapatmak istediğinizden emin misiniz? \n" "Bu işlemi Ayarlar -> Pencere'den devre dışı bırakabilirsiniz." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Emin misiniz?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Değişkenler" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Soru sorun" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Tarayıcı sekmesini kapatmadan önce sor" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Sesli" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Kimlik doğrulama yöntemi" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Sahibi" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Otomatik" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Uygulama başlangıcında bir terminali otomatik aç" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Otomatik" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Otomatik güncellemeler" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Değişiklikleri otomatik olarak yükleyin ve güncellemeleri her dakika kontrol edin" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Mevcut" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Arkaplan Türü" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "Backspace tuşu modu" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Bit hızı" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Satır başlangıcı" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Yanıp sönen imleç" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Mavi" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Bulanık" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Kalın harf genişliği" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Alt" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Köşe Parantezli yapıştırma(kabuk desteği gerektirir)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "Yayın modundasınız. İptal etmek için herhangi bir yere tıklayın." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Dahili" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "İptal" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Baud hızını değiştir" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Sekme renklerini değiştir" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Ana parolayı değiştirin" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Güncellemeleri kontrol et" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "şifreler" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Temizle" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Son profilleri temizle" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Terminali Temizle" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "Bağlantıdan sonra terminali temizle" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Pano" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Kapat" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Kapat ve tekrar gösterme" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Bu ekranı kapat" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Diğer sekmeleri kapat" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Sekmeyi kapat" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Soldaki sekmeleri kapat" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Sağdaki sekmeleri kapat" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "Son sekmeyi kapattıktan sonra pencereyi de kapat" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Renk" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Renk düzeni" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Renk şemaları" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Renkler" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Tüm sekmeleri geçerli sekmede birleştir" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Komut satırı" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "Ağ bağlantısı yerine komutun standart giriş/çıkışı kullanılıyor" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Komutlar" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "Sıkı (eski)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Yapılandırma silindi" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Yapılandırma indirildi" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Yapılandırma dosyası" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Yapılandırma senkronize" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Yapılandırma yüklendi" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Yapılandırmalar" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Bağlanırken vekil sunucu kullan" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "\"%s\" bağlan..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Önce farklı bir ana bilgisayara bağlanın ve onu vekil olarak kullanın" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "Bağlanıyor" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Bağlantı" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "Bağlantı başarısız: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "Bunun yerine bağlantı adı kullanılacak" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "İçerik Menüsü" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "Elementler arasındaki mesafeyi kontrol eder" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Kopyalandı" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Kopyala" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Şu anki yolu kopyala" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Dosya yolunu kopyala" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Seçileni kopyala" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Panoya Kopyala" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Biçimlendirme ile kopyalayın" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Yapılandırma dosyasının şifresi çözülemedi" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Oluştur" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Dizin oluştur" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Geçerli" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Mevcut renk şeması" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Geçerli ana bilgisayar anahtarı parmak izi" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Mevcut işlem :{name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "İmleç şekli" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Özel" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "Özel CSS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "Koyu mod" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Veri Biti" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Hata ayıklama" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Yatay bölme boyutunu küçült" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Dikey bölme boyutunu küçült" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "Varsayılan \"Bağlan\" tipi" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "Hızlı bağlanma özelliği için varsayılan bağlantı türü (örn. SSH, Telnet)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Yeni sekmeler için varsayılan profil" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "Varsayılan profil grup ayarları" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Varsayılan Profil Ayarları" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "Varsayılanlar" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "{type} için varsayılanlar" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Sil" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "Sil {name}?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "{fullPath} sil?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Bütün satırı sil" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Sonraki sözcüğü sil" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Önceki sözlüğü sil" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "Sunucudaki yapılandırma silinsin mi?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Grubun profillerini sil?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Bu komut dosyası silinsin mi?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "İçeriği sil?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Siliniyor" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Aygıt" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Direk" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Devre Dışı Bırak" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Dinamik sekme başlığını devre dışı bırak" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "Sürüklerken akıcı arka planı devre dışı bırak" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "GPU hızlandırmasını devre dışı bırak" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Devre dışı" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Bağlantıyı Kes" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "Geçerli sekmenin bağlantısını kes (Serial/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "{host} bağlantısı kesilsin mi?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Fotoğrafları Sixel yoluyla görüntüleyin" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Ekran açık" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "İptal etme" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Kapatma" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Beni hatırlama" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "Dock her zaman üstte" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "Terminali kenetle" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "Kenetlenmiş terminal yüksekliği" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "Kenetlenmiş terminal genişliği" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "Kenetlenme" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "Çift tıklama seçimi bu karakterlerde duracak" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "Aşağı" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "İndir" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Kalın metinleri parlak renkler ile göster" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Kopyasını oluştur" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Yönetici olarak çoğalt" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Sekmeyi çoğalt" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Düzenle" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Yerel olarak düzenle" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Etkinleştir" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Analizleri aktifleştir" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "Animasyonları etkinleştir" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Güncellemeler kullanıma sunulduğunda otomatik olarak yüklenmesini etkinleştirin." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "Akıcı arka plan seçeneğini etkinleştir" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Yazı tipi bağlamayı etkinleştir" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Evrensel kısayol tuşunu etkinleştir (Ctrl-Boşluk)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Deneysel Windows ConPTY API'ı etkinleştir" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Konfigürasyon dosyasını şifrele" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Satır sonu" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Ortam" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Konfigürasyonu sil" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Şifreleri Sil" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Eklenti hatası \" {plugin} \":" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Tam eşleşme" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Örnek:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "Sorunlara neden olduğu bilinen deneysel Windows 10 arka plan stili" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Dışa Aktar" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Yedek yazı tipi" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Dosya aktarımları" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "{description}: Dosyası" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "Filtre" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Sabit" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Akışkan arkaplan bazen kasmalara sebep olabilir" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Tüm bölmelere odaklan" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Tüm bölmelere aynı anda odaklanın (yayın)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "Tüm sekmelere odaklan" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "Tüm sekmeler aynı anda odaklanın (yayın)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "Odak imleci takip eder" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Sonraki bölmeye odaklan" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "Odak bölmesi {number}" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Önceki bölmeye odaklan" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Yukarıdaki bölmeye odaklanın" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Aşağıdaki bölmeye odaklan" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Soldaki bölmeye odaklan" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Sağdaki bölmeye odaklan" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "Renk düzenini takip et" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Yazı tipi" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "Klavye kısayolları için" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "CR'yi zorla" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "CRLF'i zorla" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "LF'yi zorla" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Belirli bir SSH Doğrulama türünü zorlar." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Unut" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "bağlantı noktası Yönlendirme" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Yönlendirilen bağlantı noktaları" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "Renk şemasından" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "Sistemden" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "Temadan" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Ön yüz" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Tam" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Genel" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Hazır bir GitHub sorunu oluşturun" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Yükle" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Tabby Web ayarları penceresinden alın" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Pencereye bulanık şeffaf bir arka plan verir" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Yukarı çık" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Yeşil" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Grup" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "Özel bilgiler" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "Dünya çapında Tabby yüklemelerinin sayısını takip etmeye yardımcı olun!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Çeviriye yardım et" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "onaltılık" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "Gizle" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Sekmeyi kapat düğmesini gizle" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Sekme dizinini gizle" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "Sekmeyi kapat düğmesini gizle" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Odaklanma kaybolduğunda pencereyi gizle" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "Uzakta tıkladığınızda yerleşik terminali gizler." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Anasayfa" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Sunucu" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "sunucu anahtarı" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Sunucu anahtarı doğrulaması" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Kısayol tuşları" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "Tabby kendisini ortam değişkenleri aracılığıyla nasıl sunar" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "Vekil Sunucu" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "HTTP proxy sunucu" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "HTTP proxy portu" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Simge" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "id.sekme-genişliği.dinamik" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Devre dışı bırakılırsa, profil seçicide yalnızca özel profiller görünür" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Girişinizi hemen yerel olarak yankılar" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "Yatay bölme boyutunu büyüt" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "Dikey bölme boyutunu büyüt" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "Girdi" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "Siz yazarken girdi gönder" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Giriş modu" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "Yeni satırları girin" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Yüklendi" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "Güncellemeyi yüklemek tüm sekmeleri kapatacak ve Tabby'yi yeniden başlatacaktır." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "Akıllı Ctrl-C (kopyala/iptal)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Etkişimli" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Geçersiz komut" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "Ev sahibine atla" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Sonraki kelimeye atla" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Önceki kelimeye atla" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Tut" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Canlı Tutma Aralığı (Milisaniye)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "Yerleşik terminali her zaman üstte tutun" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Anahtar" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "Anahtar değişimi" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Klavye" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "Klavye etkileşimli kimlik doğrulama" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "Öldür" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Dil" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "Son bilinen ana bilgisayar anahtarı parmak izi" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "WinSCP'yi Başlat" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Şu andaki SSH oturumu için WinSCP'yi Başlatın" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Tabby'nin uzak kabuğun çalışma dizinini algılamasına nasıl izin verileceğini öğrenin." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Sol" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Shell Kabuğa Meta anahtarını işlemesine izin verir" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "Aydınlık mod" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Satır satır" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Satır düzenleyicisi, Enter tuşuna bastıktan sonra gönderilir" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Sıra Öteleme" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Yükleniyor" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Ayarlar Yükleniyor..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Yerel" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Yerel yankı" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Yerel terminal" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Oturum açma betikleri" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Bağlam menüsü için uzun tıklama" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Profilleri yönet" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "Maksimum Canlı Tutma Sayısı" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Aktif bölmeyi büyüt" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "Minimum kontrast oranı" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Değiştirme tarihi {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "Fare" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Soldaki sekmeye geç" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Sağdaki sekmeye geç" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "\"Ungrouped\"a taşı" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "Fareyi etkin olmayan bir bölmenin üzerine getirmek bölmenin etkinleşmesine neden olur" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "İsim" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Yeni yapılandırmanızın adı" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "Yeni klasörün adı" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Yerel" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "Yeni" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Yeni yönetici sekmesi" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "{platform} üzerinde yeni konfigürasyon" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "Yeni Grup Adı" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Yeni öge" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Yeni isim" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Yeni profil" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "Yeni profil grubu" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Yeni profil adı" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Yeni sekme" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Yeni sekme: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Yeni terminal" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Yeni pencere" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "Yeni Pencere" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Profil ile yeni" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Sonraki sekme" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Renk yok" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Değiştirici yok" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Hiçbiri" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Normal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "Normal yazı tipi kalınlığı" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Bulunamadı" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Etkinlik anında bilgilendir" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Tamamlandığında bildir" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Tamponda tutulan satır sayısı" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Kapalı" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Resmi" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "GitHub tartışmalarında üzerinde" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "Sekmeyi yalnızca oturum sonlandırıldığında kapatın" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Saydamlık" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Geliştirici araçlarını aç" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Ayarları Aç" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Ayarlar sekmesini aç: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "SFTP panelini aç" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "İsteğe bağlı" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Seçenekler" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Turuncu" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "İşletim sistemi varsayılanı" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "İşletim sistemi varsayılanı ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "Çıktı hexdump olarak gösterilir" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "Çıktı alındığı gibi gösterilir" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Çıkış modu" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Çıktı yeni satırları" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "X11 görüntüsünü bastır" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "Yerelin üzerine yaz ve senkronize et" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Uzak dosyanın üzerine yaz ve senkronize et" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "Uzak taraftaki yapılandırmanın üzerine yazılsın ve senkronizasyon başlatılsın mı?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "Yerel yapılandırmanın üzerine yazılsın ve senkronizasyon başlatılsın mı?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "Bölmeyi yeniden boyutlandırma adımı" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "Bölmeler" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "Kağıt (eski)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Parite" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "Yapılandırma Vault aracılığıyla şifrelendiğinde kısmi yapılandırma senkronizasyonu mümkün değildir." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "Doğrudan geçiş(Pass-through)" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "{hash} hash'li özel anahtar için parola ifadesi..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Şifre" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Yapıştır" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Panodan yapıştır" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "Seçim yoksa yapıştır, aksi durumda kopyala" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Birden çok satır yapıştırılsın mı?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "Orta tıklamayla yapıştır" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Yerel X11 soketinin yolu veya adresi" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Sabitle" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Eklentiler" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Eklenti Klasörü" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Port" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Port açıldı" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Bağlantı noktaları" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Tekrar bağlanmak için bir tuşa basın" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Şimdi tuşa basın" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Yanlışlıkla kapanmayı önle" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Yapıştırılan komutların yanlışlıkla çalıştırılmasını önler" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Önceki sekme" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Özel anahtarlar" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "İşlem tamamlandı" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Profil adı" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Profiller" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Profiller ve bağlantılar" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Program" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Proxy komutu" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Mor" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Tabby'nin tüm konfigürasyonunu kasaya koy" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Hızlı bağlan" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Çık" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Yerel soket bağlantısını kullan" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "Hazır Zaman Aşımı (Milisaniye)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "En Son" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Tekrar bağlan" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "Geçerli sekmeye yeniden bağlan (Serial/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Kırmızı" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Regex" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Sürüm notları" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "{time} için hatırla" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Uzak Bağlantı" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "Kopyalanan metnin etrafındaki boşlukları ve yeni satırları kaldırın" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Yeniden adlandır" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "Sekmeyi yeniden adlandır" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "İşleniyor" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Son sekmeyi yeniden aç" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Değiştir" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Sorun Bildir" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "Bağlantıları tıklamak için bir anahtar gerekir" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Yakınlaştırmayı sıfırla" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Mevcut seri bağlantısını yeniden başlat" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Mevcut SSH oturumunu yeniden başlat" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Mevcut Telnet oturumunu yeniden başlat" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "Sekmeyi yeniden başlat" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Değişiklikleri uygulamak için uygulamayı yeniden başlatın" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "Ayarları varsayılanlara geri yükle?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "Ayarları önceki varsayılan değerlere geri yükle?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "Uygulama başlangıcında terminal sekmelerini geri yükle" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "Oturumu birden fazla sekme için yeniden kullanma" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "Sağ" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "Sağ tık" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Yönetici olarak çalıştır" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Kaydet" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Anahtar zincirine bir parola kaydedin" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Kaydet ve uygula" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Profil olarak kaydet" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Düzeni profil olarak kaydet" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Kaydedildi" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Düzeni kaydet" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "Girdide kaydır" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "Terminali bir sayfa aşağı kaydır" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "Terminali bir sayfa yukarı kaydır" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Terminali en alta kaydır" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "Terminali en üste kaydır" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "Geriye kaydır" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "Kullanıcı girdisinde terminali en alta kaydır" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Ara" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Renk şemalarını ara" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "Kısayolları ara" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "Eklenti ara" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Gizli senkronizasyon anahtarı" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Seç" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Kalıp olarak kullanmak için temel bir profil seç" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "Tümünü Seç" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Depolama seç" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Profil seçin" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Profil seçin ya da bir adres girin" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "Hex değerleri yazarak bayt gönderme" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Her seferinde bir bayt veri gönderir" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Seri" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "Seri bağlantı" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Seri: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Ana parolayı ayarla" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Parolayı ayarla" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Şifreyi ayarla" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Tabby'yi %COMSPEC% olarak ayarla" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "Son profilleri devre dışı bırakmak için 0'a ayarlayın" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "SSH aracısının adlandırılmış yöneltme yolunu ayarlar." #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Ayarlar" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Kabuk" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Shell geçerli yol algılamayı desteklemiyor" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Kabuk bütünleşmesi" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "Göster" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "Profil {type} seçiciyi göster" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "Birden fazla satır yapıştırırken onay kutusu göster" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "Yerleşik profilleri seçicide göster" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "Komut seçiciyi göster" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Yapılandırma dosyasını aç" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Varsayılanları göster" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Mikseri Göster" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "Bölme etiketlerini göster (yeniden düzenlemek için)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Profil ikonunu sekmede göster" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Profil seçiciyi göster" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Son profilleri seçicide göster" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Sürüm notlarını göster" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Seri bağlantıları göster" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "Tam ekran modunda sekmeleri göster" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "Araç Çubuğunu Göster" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Kasa içeriğini göster" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Sixel grafik desteği (deneysel)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "MoTD/banner'ı atla" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "Yavaş besleme" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "Pencereyi ekranın bir tarafına yaslar" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "SOCKS Proxy" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "SOCKS proxy host" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "SOCKS proxy port" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "Ses" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Kaynak kodu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "Uzaklık" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Ayır" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Ekranı alta ayır" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "Aşağı doğru böl" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Ekranı sola ayır" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Ekranı sağa ayır" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Ekranı üste ayır" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "Yukarı doğru böl" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "SSH bağlantısı" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "SSH bağlantı yönetimi artık \"Profiller ve bağlantılar\" sekmesinden yapılıyor" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "SSH şifresi için {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "Standart (eski)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "Başlangıç" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Durdurma Biti" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Şerit" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Güncellemeler için abone ol" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Değiştirmeye izin verildi." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "Renk şemasını değiştir" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Profili değiştirin" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Etkin bölmede profil değiştirme" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Switchler Terminal Frontend implementasyonu (deneysel)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Eşitle" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Otomatik eşitle" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Ana bilgisayarı senkronize et" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Kısayolları Eşitle" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Kasayı eşitle" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Pencere ayarlarını eşitle" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Tab {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Sekme aktivitesi" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby, eklentilerinizle başlatılamadı, bu nedenle bu oturumda tüm üçüncü taraf eklentileri devre dışı bırakıldı. Hata:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Twitter'da Tabby haberleri ve güncellemeleri" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Sekmeler" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Sekme konumu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Sekme genişliği" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Telnet oturumu" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Terminal" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Terminal arka planı" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Terminal zili" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "Terminal tanımlama" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Tabby'i indirdiğiniz için teşekkür ederiz!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Tema" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Aktif dosya transferleri var" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Bu bağlantı için kaydedilmiş parola mevcut" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Bunlar, seçilen türdeki tüm profiller için geçerlidir" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "Bunlar, bu gruptaki verilen türdeki tüm profiller için geçerlidir" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "İnce" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Örtüşme, gölgelenme veya diğer görsel sorunlar yaşıyorsanız bunu işaretleyin" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Tam Ekran Kipini Aç/Kapat" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "Son sekmeyi değiştir" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Terminal penceresini aç/kapat" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Sekmeli pencere görünürlüğünü değiştirir" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "Üst" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "Boşlukları ve yeni satırları kaldırın" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Tekrar deneyin" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Kaydedilmiş parolayı deniyor" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "Geçerli sekmenin bölmelerini ayrı sekmelere dönüştür" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Gruplandırılmamış" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Yüklemeyi Kaldır" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Bilinmeyen" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "{key} için {type} türünde bilinmeyen mutabakat" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Sabitlemeyi kaldır" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "Yukarı" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Güncelle" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "{version} sürümüne yükselt" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Yükle" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Yeni bir konfigürasyon olarak yükle" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Meta anahtarı olarak {altKeyName} kullanın" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "ConPTY kullan" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "Kullanıcı Varsayılanları" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Kullanıcı Adı" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "CONNECT yöntemini kullanma" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Önceden ayarlanmış parolayı kullanma" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Kasa" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Vault, SSH şifreleri ve özel anahtar parolaları gibi gizli içerikler için her zaman şifrelenmiş bir alandır." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Kasa boş" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Kasa kilitli" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "Kasa yapılandırılmamış" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "Gizli dizilerin saklanmasına izin vermek için kasa ana parolasının ayarlanması gerekir" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Bağlanırken ana bilgisayar anahtarlarını doğrulayın" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Sürüm" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Sürüm: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Titreşim" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Görsel" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Çok satırlı yapıştırmada uyar" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Aktif bağlantıları kapatırken uyar" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "Uyarı: Uzak ana bilgisayarın anahtarı aniden değişti!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Yalnızca Tabby ve İşletim Sistemi sürümlerinizi izliyoruz." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Hoşgeldiniz" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Yenilikler" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "Oturum sona erdiğinde" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "Etkinleştirildiğinde, bağlantılar yalnızca bu tuş basılıyken tıklanabilir" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "WinSCP algılandığında, içerik menüsünden bir SCP oturumu başlatabilirsiniz." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "Özel bir pencerenin mi yoksa bir İşletim Sistemi yerel penceresinin mi kullanılması gerektiği" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "SSH selamlamasının görünmesini engelleyecek" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Pencere" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "Kenar boyunca pencere boyutu" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "Pencere boyutu kenardan uzakta" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Pencere çerçevesi" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "Pencere" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "ConPTY için Windows 10 build 18309 veya üstü önerilir" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "WinSCP yolu" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Kelime ayracı" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Çalışma dizini" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Çalışma dizini tespiti" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "WSL terminal zili yalnızca Volume Mixer aracılığıyla kapatılabilir" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "WSL terminali yalnızca ConPTY ile TrueColor'u destekler" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "X11 yönlendirme" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Sarı" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "Daha sonra değiştirebilirsiniz, ancak unutulursa kurtarılamaz." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "Şu anda bir man-in-the-middle saldırısı altında olabilirsiniz veya ana bilgisayar anahtarı yeni değiştirilmiş olabilir." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Yakınlaştır" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Uzaklaştır" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "id.port-forwarding.dynamic" ================================================ FILE: locale/uk-UA.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: uk\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" "PO-Revision-Date: 2024-12-24 22:58\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" все ще запущено. Закрити?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} копія" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "Друге сімейство шрифтів, для відображення символів, відсутніх в основному шрифті" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "Скасувати все" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "Прийняти і запам'ятати ключ" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "Прийняти лише один раз" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "Спеціальні можливості" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "Акриловий фон" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "Додати" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "Додати перенаправлення порту" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "Додати приватний ключ" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "Додати..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "Додатковий простір між рядками" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "Додатково" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "Агент" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Перенаправлення агента" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Шлях до pipe SSH-агента" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Тип агента" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "Дозволяє відкривати файли .bat у вкладках, але ламає деякі оболонки" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "Дозволяє швидко відкрити термінал у вибраній папці" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "Завжди темна" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "Завжди світла" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "Відображення" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "Додаток" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "Налаштування" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "Ви впевнені, що хочете закрити Tabby? Це попередження можна вимкнути в Налаштування -> Вікно." #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "Ви впевнені?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "Аргументи" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "Задати питання" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "Запитати перед закриттям вкладки" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "Звук" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "Метод автентифікації" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "Автор" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "Авто" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "Автоматично відкривати термінал при запуску програми" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "Автоматично" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "Оновлювати автоматично" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "Автоматично завантажувати зміни і перевіряти оновлення щохвилини" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "Доступно" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "Тип фону" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "Режим клавіші Backspace" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "Швидкість передачі даних" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "Початок рядка" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "Миготливий курсор" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "Синій" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "Розмиття" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "Жирний шрифт" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "Знизу" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Bracketed вставка (потрібна підтримка оболонки)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "Режим трансляції. Натисніть будь-де, щоб скасувати." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "Вбудовані" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "Скасувати" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "Змінити швидкість передачі" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "Змінити колір вкладки" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "Змінити майстер-пароль" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "Перевірити оновлення" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "Шифри" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "Очистити" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "Очистити останні профілі" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "Очистити термінал" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "Очистити термінал після підключення" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "Буфер обміну" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "Закрити" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "Закрити і більше не показувати" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "Закрити активну панель" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "Закрити інші вкладки" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "Закрити вкладку" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "Закрити вкладки ліворуч" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "Закрити вкладки праворуч" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "Закрити вікно після закриття останньої вкладки" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "Колір" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "Кольорова схема" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "Кольорові схеми" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "Кольори" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "Об'єднати всі вкладки в поточну" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "Командний рядок" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "Замість мережного з'єднання використовується stdin/stdout команди" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "Команди" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "Компактний (застаріло)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "Конфігурацію видалено" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "Конфігурацію завантажено" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "Файл конфігурації" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "Синхронізація конфігурації" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "Конфігурацію завантажено" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "Конфігурація" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "Підключення через проксі-сервер" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "З’єднання з \"%s\"..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "Підключитися до іншого хосту та використовувати його як проксі" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "З'єднання" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "Підключення" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "Помилка підключення: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "Замість цього буде використовуватися ім'я з'єднання" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "Контекстне меню" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "Контролює відстань між елементами" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "Скопійовано" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "Копіювати" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "Копіювати поточний шлях" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "Копіювати повний шлях" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "Копіювати при виділенні" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "Копіювати в буфер обміну" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "Копіювати з форматуванням" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "Не вдалося розшифрувати конфігурацію" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "Створити" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "Створити директорію" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "Поточний" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "Поточна схема оформлення" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "Відбиток ключа поточного хоста" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "Поточний процес: {name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "Форма курсору" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "Користувацька" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "Користувацький CSS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "Темна тема" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "Біти даних" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "Дебаг" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "Зменшити розмір поділу по горизонталі" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "Зменшити розмір поділу по вертикалі" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "За замовчуванням \"Під'єднатись до\" тип" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "Тип підключення за замовчуванням використовується для швидкого з'єднання (напр., SSH, Telnet)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "Зменшити розмір поділу по вертикалі" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "Налаштування групи за замовчуванням" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "Налаштування профілів за замовчуванням" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "За замовчуванням" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "За замовчуванням для {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "Видалити" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "Видалити {name}?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "Видалити {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "Видалити увесь рядок" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "Видалити наступне слово" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "Видалити попереднє слово" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "Видалити конфіг на віддаленій стороні?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "Видалити профілі цієї групи?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "Видалити цей скрипт?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "Видалити вміст сховища?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "Видалення" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "Пристрій" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "Безпосередньо" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "Вимкнути" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "Вимкнути динамічний заголовок вкладки" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "Вимкнути прозорий фон під час перетягування вікна" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "Вимкнути апаратне прискорення" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "Вимкнено" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "Від'єднатися" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "Відключити поточну вкладку (Serial/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "Від'єднатися від {host}?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "Показувати зображення з допомогою послідовності Sixel" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "Відобразити на" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "Не перервати" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "Не закривати" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "Не запам'ятовувати" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "Закріпити поверх усіх вікон" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "Закріпити термінал" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "Розмір закріпленого терміналу" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "Відступи закріпленого терміналу" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "Закріплення" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "Виділення за подвійним клацанням зупиниться на цих символах" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "Вниз" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "Завантажити" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "Малює жирний текст яскравими кольорами" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "Дублювати" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "Дублювати як адміністратор" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "Дублювати вкладку" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "Редагувати" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "Редагувати локально" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "Увімкнути" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "Увімкнути аналітику" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "Увімкнути анімації" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "Увімкнути автоматичне встановлення оновлень, коли вони стануть доступними." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "Увімкнути опцію вільного фону" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "Увімкнути лігатури шрифтів" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "Увімкнути глобальні сполучення клавіш (Ctrl-Space)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "Вмикає експериментальне API ConPTY Windows" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "Шифрувати файл конфігурації" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "Кінець рядка" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "Середовище" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "Очистити конфігурацію" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "Очистити сховище" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "Помилка в {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "Точна відповідність" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "Наприклад:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "Експериментальний стиль фону Windows 10 (може працювати не стабільно)" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "Експорт" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "Запасний шрифт" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "Передача файлів" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "Файл: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "Фільтр" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "Фіксований" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Іноді прозорий фон викликає лаги під час перетягування" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "Сфокусуватися на всіх панелях" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "Фокус на всі панелі одразу (broadcast)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "Сфокусуватися на всіх вкладках" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "Фокус на всіх вкладках одночасно (трансляція)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "Фокус слідує за курсором" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "Фокус на наступній панелі" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "Фокус на панелі {number}" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "Фокус на попередній панелі" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "Фокус на панелі вище" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "Фокус на панелі нижче" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "Фокус на панелі ліворуч" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "Фокус на панелі праворуч" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "Дотримуватись колірної схеми" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "Шрифт" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "Комбінації клавіш" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "Змінити на CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "Змінити на CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "Змінити на LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "Примусово встановлює певний тип підключення до агента SSH." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "Забути" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "Перенаправити порт" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "Перенаправлені порти" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "З колірної схеми" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "З системи" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "З теми" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "Фронтенд" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "Повний" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "Загальні" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "Відкрити попередньо заповнений звіт на GitHub" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "Отримати" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "Скопіюйте з вікна налаштувань web-версії Tabby" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "Надає вікну розмитий прозорий фон" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "Вгору" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "Зелений" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "Група" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "Проблеми" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "Допоможіть відстежувати скільки встановлено Tabby по всьому світу!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "Допоможіть перекласти Tabby" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "Шістнадцятковий" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "Приховати" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "Приховати кнопку закриття вкладки" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "Приховати нумерацію вкладок" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "Приховати кнопку опцій вкладки" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "Приховати вікно під час втрати фокусу" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "Приховує закріплений термінал при натисканні поза ним." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "Домашня сторінка" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "Хост" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "Ключ хоста" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "Перевірка ключа хоста" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "Гарячі клавіші" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "Як Tabby представляє себе за допомогою змінних оточення" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "HTTP-проксі" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "Хост HTTP-проксі" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "Порт HTTP-проксі" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "Іконка" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "Динамічна" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "Якщо вимкнено, у селекторі профілю відображатимуться лише користувацькі профілі" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "Миттєво локально відображає ваше введення" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "Збільшити розмір поділу по горизонталі" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "Збільшити розмір поділу по вертикалі" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "Input" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "Введені дані передаються під час введення" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "Режим введення" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "Перенесення рядків у введенні" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "Встановлено" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "Встановлення оновлення закриє всі вкладки й перезавантажить Tabby." #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "Інтелектуальний Ctrl-C (копіювати/скасувати)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "Інтерактивний" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "Некоректний синтаксис" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "Проміжний хост" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "Перейти до наступного слова" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "Перейти до попереднього слова" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "Залишити" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Інтервал перевірки з'єднання (мс)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "Відображати закріплений термінал завжди поверх усіх вікон" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "Ключ" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "Обмін ключами" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "Клавіатура" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "Інтерактивна автентифікація" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "Закінчити примусово" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "Мова" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "Останній відомий відбиток ключа хоста" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "Запустити WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "Запустити WinSCP для поточної SSH сесії" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "Дізнайтеся, як дозволити Tabby визначати робочий каталог віддаленої оболонки." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "Ліворуч" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "Дозволяє оболонці обробляти клавішу Meta замість ОС" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "Світла тема" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "Рядок до рядка" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "Редактор рядків, введення надсилається після натискання Enter" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "Міжстроковий інтервал" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "Завантаження" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "Завантаження налаштувань..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "Локальний" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "Локальне ехо" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "Локальний термінал" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "Скрипти входу" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "Довге натискання для контекстного меню" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "Керування профілями" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "Максимальна кількість перевірок з'єднання" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "Розгорнути активну панель" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "Мінімальний контрастність" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "Змінено {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "Миша" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "Перенести вкладку ліворуч" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "Перенести вкладку праворуч" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "Перемістити до «Без групи»" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "Наведення курсора на неактивну панель зробить її активною" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "Ім’я" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "Ім'я для нової конфігурації" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "Ім'я для нового каталогу" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "Рідний" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "Новий" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "Нова вкладка від імені адміністратора" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "Нова конфігурація на {platform}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "Нова назва групи" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "Новий елемент" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "Нове ім'я" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "Новий профіль" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "Нова група профілів" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "Нове ім'я профілю" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "Нова вкладка" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "Нова вкладка: {profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "Новий термінал" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "Нове вікно" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "Нове Вікно" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "Новий з профілем" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "Наступна вкладка" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "Без кольору" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "Без модифікатора" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "Ні" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "Нормальний" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "Стандартний розмір шрифта" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "Не знайдено" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "Повідомляти про активність" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "Повідомити про завершення" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "Кількість рядків, що зберігаються в буфері" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "Вимк." #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "Офіційний" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "На GitHub Discussions" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "Закривати вкладку при явному припиненні сеансу" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "Прозорість" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "Відкрити DevTools" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "Відкрити налаштування" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "Відкрити вкладку параметрів: {tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "Відкрити панель SFTP" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "Опціональний" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "Параметри" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "Помаранчевий" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "За замовчуванням для ОС" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "За замовчуванням для ОС ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "Вивід показується у шістнадцятковому вигляді" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "Висновок показаний у первісному вигляді" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "Режим виводу" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "Перенесення рядків у виводі" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "Перевизначити дисплей X11" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "Перезаписати локальну конфігурацію та синхронізувати" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "Перезаписати віддалену конфігурацію та синхронізувати" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "Перезаписати віддалену конфігурацію та почати синхронізацію?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "Перезаписати локальну конфігурацію та розпочати синхронізацію?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "Крок зміни розміру панелі" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "Панелі" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "Папір (застаріло)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "Контроль парності" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "Часткова синхронізація конфігурації неможлива, якщо конфігурація зашифрована за допомогою сховища." #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "Дохід" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "Парольна фраза для приватного ключа з хешем {hash}..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "Пароль" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "Вставити" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "Вставити з буферу обміну" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "Вставити якщо немає виділення, інакше копіювати" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "Вставити кілька рядків?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "Вставити середньою кнопкою миші" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "Шлях або адреса локального сокету X11" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "Закріпити" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "Плагіни" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "Папка з плагінами" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "Порт" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "Порт відкрито" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "Порти" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "Натисніть будь-яку клавішу, щоб повторно підключитися" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "Натисніть кнопку" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "Запобігає випадковому закриттю" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "Запобігає випадковому виконанню вставлених команд" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "Попередня вкладка" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "Приватні ключі" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "Процес завершено" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "Ім'я профілю" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "Профілі" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "Профілі й підключення" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "Програма" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "Команда проксі" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "Фіолетовий" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "Поміщає конфігурацію Tabby у зашифроване сховище" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "Швидке з'єднання" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "Вихід" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "Підключення через сокет" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "Таймаут підключення (мс)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "Останні" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "Відновити з'єднання" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "Повторне підключення поточної вкладки (Serial/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "Червоний" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "Regex" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "Замітки до випуску" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "Запам'ятати на {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "Дистанційне" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "Видалити пробіли і нові рядки навколо скопійованого тексту" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "Перейменувати" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "Перейменувати вкладку" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "Відображення" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "Відновити останню вкладку" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "Замінити" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "Повідомити про проблему" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "Вимагати натискання кнопки для переходу за посиланнями" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "Скинути масштаб" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "Перезапустити поточний послідовний сеанс" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "Перезапустити поточну SSH сесію" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "Перезапустити поточну сесію Telnet" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "Перезапуск вкладки" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "Перезапустіть програму, щоб застосувати зміни" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "Відновити налаштування за замовчуванням?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "Відновити параметри до типових значень?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "Відновлювати вкладки терміналу під час запуску програми" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "Повторне використання сесії для кількох вкладок" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "Праворуч" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "ПКМ" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "Запустити від імені адміністратора" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "Зберегти" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "Збережіть пароль у зв'язку ключів" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "Зберегти та застосувати" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "Зберегти як профіль" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "Зберегти макет як профіль" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "Збережено" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "Збережений макет" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "Прокручувати під час введення" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "Прокрутити на одну сторінку донизу" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "Прокрутити на одну сторінку вгору" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "Прокрутка терміналу донизу" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "Прокрутка терміналу вгору" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "Буфер зворотного прокручування" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "Прокручує термінал вниз під час введення" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "Пошук" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "Пошук кольорових схем" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "Пошук гарячих клавіш" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "Пошук плагінів" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "Секретний токен синхронізації" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "Обрати" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "Виберіть базовий профіль для використання в якості шаблону" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "Вибрати всі" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "Виберіть сховище файлів" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "Вибрати профіль" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "Виберіть профіль або введіть адресу" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "Відправляти байти, вводячи шістнадцяткові значення" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "Відправляє дані по одному байту за раз" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "Послідовний порт" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "З'єднання по послідовному порту" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "Послідовний порт: {description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "Встановити майстер-пароль" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "Встановити парольну фразу" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "Встановити пароль" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "Встановити Tabby як %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "0 вимикає останні профілі" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "Встановити шлях для named pipe SSH-агента." #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "Налаштування" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Shell" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Shell не підтримує виявлення поточного шляху" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Інтеграція в систему" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "Показати" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "Показати селектор профілю {type}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "Підтвердження при вставці кількох рядків" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "Показувати вбудовані профілі під час вибору" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "Показати селектор команди" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "Показати файл конфігурації" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "Показувати за замовчуванням" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "Показати Мікшер" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "Показати назви панелей (для перестановки)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "Показувати іконку профілю на вкладці" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "Показати вибір профілю" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "Показати останні профілі під час вибору" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "Показати замітки до випуску" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "Показати з'єднання по послідовному порту" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "Відображати вкладки в повноекранному режимі" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "Показати панель інструментів" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "Показати вміст сховища" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "Підтримка графіки Sixel (експериментальна)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "Пропустити MoTD/банер" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "Повільна стрічка" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "Закріплює вікно до вибраного краю екрана" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "SOCKS проксі" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "Хост SOCKS проксі" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "Порт SOCKS проксі" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "Звук" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "Вихідний код" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "Простір" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "Розділити" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "Розділити знизу" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "Розділити вниз" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "Розділити ліворуч" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "Розділити праворуч" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "Розділити зверху" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "Розділити вверх" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "SSH зʼєднання" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "Управління SSH-підключеннями тепер здійснюється у вкладці «Профілі та підключення»" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "Пароль SSH для {user}@{host}:{port}" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "Стандартний (застаріло)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "При запуску" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "Стоп-біти" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "Видалити" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "Підписатись на оновлення" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "Допускаються заміни." #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "Переключити колірну схему" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "Змінити профіль" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "Переключити профіль на активній панелі" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "Переключення реалізації frontend для терміналу (експериментально)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "Синхронізація" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "Автоматична синхронізація" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "Хост синхронізації" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "Синхронізувати гарячі клавіші" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "Синхронізувати сховище" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "Синхронізувати налаштування вікна" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "Вкладка {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "Активність вкладки" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby не зміг запуститися з вашими плагінами, тому всі сторонні плагіни були відключені у цій сесії. Помилка:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Новини та оновлення Tabby у Twitter" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "Вкладки" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "Розташування вкладок" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "Ширина вкладки" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Telnet сесія" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "Термінал" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "Фон терміналу" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "Звуковий сигнал терміналу" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "Ідентифікація терміналу" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "Дякуємо що завантажили Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "Тема" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "Є активні передачі файлів" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "Для цього з'єднання збережено пароль" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "Це застосовується до всіх профілів заданого типу" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "До всіх профілів даного типу в цій групі" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "Тонкий" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "Увімкніть, якщо бачите aliasing, ghosting або інші проблеми з відображенням" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "Перехід у повноекранний режим та назад" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "Перемкнути на останню вкладку" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "Приховати/показати вікно терміналу" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "Перемикає видимість вікна Tabby" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "Зверху" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "Обрізати пробіли і нові рядки" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "Повторити" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "Пробуємо збережений пароль" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "Перетворити панелі поточної вкладки на окремі вкладки" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "Без групи" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "Видалити" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "Невідомо" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "Невідомий тип секретних даних {type} для {key}" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "Відкріпити" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "Вгору" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "Оновити" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "Оновити до {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "Завантажити" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "Завантажити як нову конфігурацію" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "Використовувати {altKeyName} як клавішу Meta" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "Використовувати ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "За замовчуванням для користувача" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "Ім'я користувача" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "Використовувати метод CONNECT" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "Використовуємо встановлений пароль" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "Сховище" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Сховище є постійно зашифрованим контейнером, що містить такі секретні дані, як SSH-паролі та парольні фрази приватних ключів." #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "Сховище пусте" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "Сховище закрите" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "Сховище не налаштоване" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "Для збереження секретних даних має бути заданий майстер-пароль сховища" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "Перевірка ключів хоста при підключенні" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "Версія" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "Версія: {version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Розмитий фон" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "Візуально" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "Попереджати при багаторядковій вставці" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "Попереджати при закритті активних з'єднань" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "Попередження: ключ віддаленого хоста раптом змінився!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "Відстежується лише версія ОС і Tabby." #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "Вітаємо" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "Що нового" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "Коли сесія закінчиться" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "Коли увімкнено, посилання можна натискати, утримуючи цю клавішу" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "Якщо WinSCP виявлено, можна запускати SCP-сесії з контекстного меню." #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "Чи має використовуватися кастомне оформлення вікна чи системне" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "Не показувати привітання SSH" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "Вікно" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "Розміри вікна вздовж краю" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "Розмір вікна від краю" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "Рамка вікна" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "Вікна" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Для ConPTY рекомендується Windows 10 build 18309 або вище" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "Шлях до WinSCP" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "Розділювачі слів" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "Робочий каталог" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "Визначення робочого каталогу" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "Дзвінок терміналу WSL може бути заглушений тільки за допомогою мікшера гучності" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "Термінал WSL підтримує TrueColor лише з ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "Переспрямування X11" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "Жовтий" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "Ви можете змінити його пізніше, але якщо забудете, відновити буде неможливо." #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "Можливо, зараз ви перебуваєте під атакою «man-in-the-middle», або ключ хоста міг бути змінений." #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "Збільшити" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "Зменшити" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "Динамічне" ================================================ FILE: locale/zh-CN.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: zh-CN\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" "PO-Revision-Date: 2025-01-22 22:02\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" 仍在运行。是否需要关闭?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} 副本" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "首选字体缺失时使用备选字体显示字符" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "中止全部" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "接受并记住密钥" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "只接受本次" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "辅助功能" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "毛玻璃背景" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "添加" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "添加端口转发" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "添加私钥" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "添加…" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "行间距" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "高级设置" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "代理" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "Agent 转发" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Agent pipe 路径" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "Agent 类型" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "允许在标签页中打开.bat文件,但会中断某些shell" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "允许在选定的文件夹中快速打开终端" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "始终使用暗色" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "始终使用亮色" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "外观" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "应用" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "应用程序设置" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "您确定要关闭 Tabby 吗?您可以在 设置 -> 窗口 中关闭此提示。" #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "您确定吗?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "参数" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "提出问题" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "关闭标签页前询问" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "有声" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "身份验证方法" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "作者" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "自动" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "在应用程序启动时自动打开一个终端窗口" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "自动" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "自动更新" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "每分钟自动上传更改,并自动检查更新" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "可用" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "背景类型" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "背空键模式" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "波特率" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "行首" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "光标闪烁" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "蓝色" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "模糊" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "粗体字体粗细" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "底部" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Bracketed 粘贴(需要 Shell 支持)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "广播模式。点击任意位置取消。" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "内置" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "取消" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "更改波特率" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "更改标签颜色" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "更改主密码" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "检查更新" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "加密方法" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "清除" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "清除最近使用的配置" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "清空终端内容" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "连接后清空终端" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "剪贴板" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "关闭" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "关闭且不再提示" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "关闭已聚焦窗格" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "关闭其它标签页" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "关闭标签页" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "关闭左侧标签页" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "关闭右侧标签页" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "所有标签都关闭时关闭主窗口" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "颜色" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "配色方案" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "配色方案" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "色彩" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "将所有标签页合并到当前页" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "命令行" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "使用命令的 stdin/stdout,而不是网络连接。" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "命令" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "紧凑模式(旧版)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "配置已删除" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "配置已下载" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "配置文件" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "配置同步" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "配置已上传" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "配置" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "通过代理服务器连接" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "正在连接到 \"%s\"…" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "首先连接至另一主机,并将其作为代理" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "正在连接" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "连接" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "连接失败: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "将使用连接名称代替" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "右键菜单" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "控制元素之间的间隔" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "已复制" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "复制" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "复制当前路径" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "复制完整路径" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "选中时复制" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "复制到剪贴板" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "复制带格式" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "无法解密配置" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "创建" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "创建文件夹" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "当前" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "当前配色方案" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "当前主机密钥指纹" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "当前进程:{name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "光标形状" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "自定义" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "自定义 CSS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "夜间模式" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "数据位数" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "调试" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "减少水平分割大小" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "减少垂直分割大小" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "默认“连接到”类型" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "快速连接功能使用的默认连接类型 (例如SSH, Telnet)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "新标签页的默认配置" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "默认配置设置" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "默认配置设置" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "默认值" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "{type} 的默认值" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "删除" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "删除\"{name}\"?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "是否删除 {fullPath} ?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "删除整行" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "删除下一个单词" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "删除上一个单词" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "是否删除远程配置?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "删除此分组所有配置?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "删除此脚本?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "删除保险库内容?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "正在删除" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "设备" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "直连" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "禁用" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "禁用动态标签页标题" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "拖动时禁用 Fluent 背景" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "禁用 GPU 加速" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "已禁用" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "断开连接" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "重新连接当前标签页 (Serial/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "断开与 {host} 的连接?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "由六像素转义序列显示图像" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "显示于" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "不要中止" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "不要关闭" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "不记住" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "窗口保持置顶" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "停靠终端" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "停靠的终端大小" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "停靠的终端空间" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "停靠" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "双击选择将在这些字符处停止" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "向下" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "下载" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "以亮色显示粗体" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "克隆" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "以管理员身份克隆" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "克隆标签页" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "编辑" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "本地编辑" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "启用" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "启用分析" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "开启动画效果" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "当更新可用时,启用自动安装" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "启用Fluent背景" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "启用连结字" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "启用全局快捷键 (Ctrl-Space)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "启用实验性 Windows ConPTY API" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "加密配置文件" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "行尾" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "环境变量" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "擦除配置" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "擦除保险库" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "{plugin} 中的错误:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "完全匹配" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "示例:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "实验性Windows 10 背景风格已知会导致问题" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "导出" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "备用字体" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "文件传输" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "文件: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "筛选" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "固定" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Fluent 背景有时会导致拖动延迟" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "聚焦所有窗格" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "同时聚焦所有窗格 (广播)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "聚焦所有标签页" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "同时聚焦所有标签页 (广播)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "焦点跟随鼠标" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "聚焦下一个窗格" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "焦点窗格 {number}" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "聚焦上一个窗格" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "聚焦上面的窗格" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "聚焦下面的窗格" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "聚焦左方的窗格" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "聚焦右方的窗格" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "依照配色方案" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "字体" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "对于键盘快捷键" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "强制使用 CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "强制使用 CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "强制使用 LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "强制特定的 SSH Agent 连接类型" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "忘记" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "转发端口" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "已转发端口" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "取自配色方案" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "来自系统" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "取自主题" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "前端" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "完整" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "通用" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "生成一个预填写的 GitHub 问题" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "获取" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "从 Tabby 网页设置窗口获取" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "使窗口具有模糊透明的背景" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "上一级" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "绿色" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "分组" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "调整" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "帮助追踪 Tabby 在世界各地的安装次数!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "帮助翻译Tabby" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "十六进制" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "隐藏" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "隐藏标签页关闭按钮" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "隐藏标签页索引" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "隐藏标签页选项按钮" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "失去聚焦时隐藏窗口" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "点击别处时隐藏停靠的终端" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "主页" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "主机" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "主机密钥" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "主机密钥校验" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "快捷键" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "Tabby如何通过环境变量呈现自己" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "HTTP 代理" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "HTTP 代理主机" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "HTTP 代理端口" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "图标" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "动态" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "如果禁用,则只在配置选择器中显示自定义配置" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "立刻在本地回显您的输入" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "增加水平分割大小" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "增加垂直分割大小" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "输入" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "按您输入时发送" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "输入模式" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "输入换行符" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "已安装" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "安装更新将关闭全部标签页并重启 Tabby。" #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "智能 Ctrl-C (复制/中止)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "交互式" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "无效的语法" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "跳板机" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "跳到下一个单词" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "跳到上一个单词" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "保留" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "保活间隔(毫秒)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "保持停靠终端置顶" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "密钥" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "密钥交换" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "键盘" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "键盘交互认证" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "结束进程" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "语言" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "最后已知的主机密钥指纹" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "启动 WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "为当前的 SSH 会话启动 WinSCP" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "了解如何让 Tabby 检测远程 shell 的工作目录。" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "左侧" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "使用 Shell 替代操作系统处理 Meta 键" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "亮色主题" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "逐行" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "行编辑器,按回车后发送输入的内容" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "行间距" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "加载中" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "正在加载配置..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "本地" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "本地回显" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "本地终端" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "登录脚本" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "长按右键菜单" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "管理配置" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "最大保活次数" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "最大化活动窗格" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "最低对比度" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "修改于 {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "鼠标" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "将标签页移至左侧" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "将标签页移至右侧" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "移动到 “未分组”" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "鼠标移到非活动窗格时会激活它" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "名称" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "新配置名称" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "为新文件夹命名" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "原生" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "新建" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "新的管理标签页" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "{platform} 上的新配置" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "新建群组名称" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "新建项" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "新名称" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "新配置" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "新建配置文件组" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "新配置名称" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "新标签页" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "新标签页:{profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "新终端" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "新窗口" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "新建窗口" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "依据配置新建" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "下一个标签页" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "无色" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "关闭" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "无" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "一般" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "正常字体粗细" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "未找到" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "活动时通知" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "完成时通知" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "保存在缓冲区的行数" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "关闭" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "官方" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "在 GitHub 讨论" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "仅当会话被明确终止时关闭标签" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "不透明度" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "开启开发者工具" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "打开设置" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "打开设置标签页:{tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "打开 SFTP 面板" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "选填" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "选项" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "橙色" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "系统默认" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "系统默认 ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "输出显示为十六进制转储" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "按收到的原有样式显示输出" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "输出模式" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "输出换行符" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "覆盖 X11 显示" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "覆盖本地并同步" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "覆盖远程并同步" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "覆盖远程的配置并开始同步?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "覆盖本地配置并开始同步?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "窗格大小调整阶梯" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "窗格" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "纸张(旧版)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "奇偶校验" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "当配置通过保险库加密时,部分配置同步不可用" #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "穿透模式" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "带哈希值 {hash} 的私钥口令..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "密码" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "粘贴" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "从剪贴板中粘贴" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "未选择内容时粘贴,否则复制" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "粘贴多行?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "按下鼠标滚轮(或中间按键)时粘贴" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "本地 X11 socket 的路径或地址" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "固定" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "插件" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "插件目录" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "端口" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "端口已打开" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "端口" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "按任意键重新连接" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "请输入按键" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "防止意外关闭" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "防止意外执行粘贴的命令" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "上一个标签页" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "私钥" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "处理完成" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "配置名称" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "配置" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "配置和连接" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "程序" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "代理命令" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "紫色" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "将 Tabby 的所有配置放入保险库" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "快速连接" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "退出" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "原始套接字连接" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "准备超时(毫秒)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "最近" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "重新连接" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "重新连接当前标签页 (Serial/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "红色" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "正则表达式" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "更新日志" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "记住密码 {time}" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "远程" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "删除复制文本周围的空格和换行" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "重命名" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "重命名标签" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "渲染" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "重新打开最后的标签页" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "替换" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "报告问题" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "需要同时按下按键来点击链接" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "重置缩放" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "重启当前串口会话" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "重启当前 SSH 会话" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "重启当前的 Telnet 会话" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "重启标签页" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "重新启动应用以使更改生效" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "还原为默认设置" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "还原为默认设置" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "应用程序启动时恢复终端标签页" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "为多个标签页重用会话" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "右侧" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "右键点击" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "以管理员身份运行" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "保存" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "在钥匙串中保存密码" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "保存并应用" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "另存为配置" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "保存布局为配置" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "已保存" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "已保存的布局" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "输入时滚动" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "向下滑动终端一页" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "向上滑动终端一页" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "滚动终端到底部" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "滑动终端到顶端" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "回滚" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "在用户输入时,将终端滚动至底部" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "搜索" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "搜索配色方案" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "搜索快捷键" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "搜索插件" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "加密同步令牌" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "选择" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "选择一个基本配置作为模板" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "全选" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "选择文件存储" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "选择配置" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "选择配置或输入地址" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "通过输入十六进制值发送字节" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "一次发送一个字节数据" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "串口" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "串口连接" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "串口:{description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "设置主密码" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "设置密码" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "设置密码" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "将 Tabby 设置为 %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "设置为 0 以禁用最近的配置" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "设置 SSH agent 的命名 pipe 路径" #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "设置" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Shell" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Shell 不支持当前路径检测" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Shell 集成" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "显示" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "显示 {type} 配置选择器" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "当粘贴多行时,显示确认对话框" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "在选择器中显示内置配置" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "显示命令选择器" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "显示配置文件" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "显示默认值" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "显示音量合成器" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "显示窗格标签(用于重新排列)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "在标签上显示配置文件图标" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "显示配置选择器" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "在选择器中显示最近的配置" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "显示更新日志" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "显示串口连接" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "全屏模式下显示标签栏" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "显示工具栏" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "显示保险库内容" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "六像素图形支持 (实验)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "跳过 MoTD/横幅消息" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "逐字节接收" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "将窗口贴靠至屏幕的一侧" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "SOCKS 代理" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "SOCKS 代理主机" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "SOCKS 代理端口" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "声音" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "源码" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "间隔" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "拆分" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "向下拆分" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "向下拆分" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "向左拆分" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "向右拆分" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "向上拆分" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "向上拆分" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "SSH 连接" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "现在,通过“配置和连接”选项对 SSH 连接进行管理" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "{user}@{host}:{port} 的 SSH 密码" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "标准模式(旧版)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "启动时" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "停止位" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "过滤" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "订阅更新" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "允许替换" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "切换配色方案" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "切换配置" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "在活动窗格中切换配置" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "切换终端前端实现(实验性)" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "同步" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "自动同步" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "同步主机" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "同步快捷键" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "同步保险库" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "同步窗口设置" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "标签页 {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "标签页活动" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby 不能使用您的插件启动,因此本次会话中禁用了所有第三方插件。错误信息:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Tabby 在 Twitter 的新闻和更新" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "标签页" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "标签页位置" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "标签页宽度" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Telnet 会话" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "终端" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "终端背景" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "终端提示音" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "终端标识" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "感谢您下载 Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "主题" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "当前有活动的文件传输" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "此连接已保存密码" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "应用于给定类型的所有配置文件" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "这些适用于此组中给定类型的所有配置文件" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "简约" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "如果您遇到锯齿、重影或其他视觉问题,请打开此选项" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "切换全屏模式" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "切换到最后一个标签页" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "切换终端窗口" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "切换 Tabby 显示或隐藏" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "顶部" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "缩减空格和换行" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "再试一次" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "尝试已保存的密码" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "将当前标签所在的窗格更改为单独的标签页" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "未分组" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "卸载" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "未知" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "{key} 的 {type} 类型的未知密钥" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "取消固定" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "向上" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "更新" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "升级至 {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "上传" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "上传为新配置" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "使用 {altKeyName} 作为 Meta 键" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "使用 ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "用户默认" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "用户名" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "使用 CONNECT 方法" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "使用预设密码" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "保险库" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "保险库是一个始终加密的容器,用于存放SSH密码和私钥。" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "保险库为空" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "保险库已锁定" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "保险库未配置" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "为允许存储密钥,您必须设置保险库的主密码" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "连接时校验主机密钥" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "版本" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "版本:{version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "鲜明" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "可视化" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "多行粘贴时显示警告" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "当关闭活动连接时,显示警告" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "警告:远程主机密钥突然改变!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "我们只获取您的 Tabby 和操作系统版本信息。" #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "欢迎" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "最近更新" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "在会话结束时" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "如果启用,链接只有在按住此键时可被点击" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "检测到 WinSCP 时,您可以从右键菜单中启动一个 SCP 会话。" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "使用自定义窗口或操作系统原生窗口" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "不显示 SSH 问候语" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "窗口" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "沿边缘的窗口尺寸" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "远离边缘的窗口尺寸" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "窗口框架样式" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "窗口" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "Windows 10 版本 18309 以上推荐 ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "WinSCP 路径" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "单词分隔符" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "工作目录" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "查找工作目录" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "WSL 终端提示音只能通过音量混合器关闭" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "WSL 终端仅支持 ConPTY 真彩" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "X11 转发" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "黄色" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "您可以稍后更改,但在忘记时无法恢复" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "您可能正在遭受中间人攻击,或您的主机密钥已经被更改。" #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "放大" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "缩小" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "动态端口转发" ================================================ FILE: locale/zh-TW.po ================================================ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Crowdin-Project: tabby\n" "X-Crowdin-Project-ID: 493349\n" "X-Crowdin-Language: zh-TW\n" "X-Crowdin-File: /locale/app.pot\n" "X-Crowdin-File-ID: 75\n" "Project-Id-Version: tabby\n" "Language-Team: Chinese Traditional\n" "Language: zh_TW\n" "PO-Revision-Date: 2025-01-22 22:02\n" #: tabby-local/src/components/terminalTab.component.ts:113 msgid "\"{command}\" is still running. Close?" msgstr "\"{command}\" 正在執行。是否結束?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:78 #: tabby-settings/src/components/profilesSettingsTab.component.ts:88 msgid "{name} copy" msgstr "{name} 複製" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77 msgid "A second font family used to display characters missing in the main font" msgstr "備用字型用於顯示主字型中缺少的字元" #: tabby-core/src/components/transfersMenu.component.ts:49 msgid "Abort all" msgstr "全部中止" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24 msgid "Accept and remember key" msgstr "接受並記住金鑰" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25 msgid "Accept just this once" msgstr "只接受一次" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84 msgid "Accessibility" msgstr "輔助" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27 msgid "Acrylic background" msgstr "壓克力背景" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24 #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11 msgid "Add" msgstr "新增" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:16 msgid "Add a port forward" msgstr "新增通訊埠轉送" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:115 msgid "Add a private key" msgstr "新增私鑰" #: locale/tmp-html/tabby-settings/src/components/multiHotkeyInput.component.html:8 msgid "Add..." msgstr "新增..." #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84 msgid "Additional space between lines" msgstr "行與行之間的額外空間" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22 #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:64 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:124 msgid "Advanced" msgstr "進階" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:90 msgid "Agent" msgstr "代理" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134 msgid "Agent forwarding" msgstr "代理轉送" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35 msgid "Agent pipe path" msgstr "Agent Pipe 路徑" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24 msgid "Agent type" msgstr "代理類型" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169 msgid "Allows opening .bat files in tabs, but breaks some shells" msgstr "允許在分頁中打開 bat 檔案,但會打斷一些 Shell" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60 msgid "Allows quickly opening a terminal in the selected folder" msgstr "允許在所選資料夾中快速打開終端" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11 msgid "Always dark" msgstr "永久深色" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13 msgid "Always light" msgstr "永久明亮" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2 #: tabby-terminal/src/settings.ts:14 msgid "Appearance" msgstr "外觀設定" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:4 msgid "Application" msgstr "應用程式" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:47 msgid "Application settings" msgstr "應用程式設定" #: tabby-web/src/services/hostWindow.service.ts:19 msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window." msgstr "你確定要關閉 Tabby 嗎?您可以在設定 -> 視窗中停用此提示。" #: tabby-core/src/services/config.service.ts:440 msgid "Are you sure?" msgstr "您確定嗎?" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:18 msgid "Arguments" msgstr "參數" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "Ask a question" msgstr "提出問題" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:20 msgid "Ask before closing the browser tab" msgstr "在關閉分頁之前詢問" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:141 msgid "Audible" msgstr "音效" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:74 msgid "Authentication method" msgstr "認證方法" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:79 msgid "Author" msgstr "作者" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:50 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:78 msgid "Auto" msgstr "自動" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:153 msgid "Auto-open a terminal on app start" msgstr "在應用程式啟動時自動打開終端" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:13 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:53 #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:28 msgid "Automatic" msgstr "自動" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:73 msgid "Automatic Updates" msgstr "自動更新" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:54 msgid "Automatically upload changes and check for updates every minute" msgstr "每分鐘自動上傳更變並檢查更新" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:10 msgid "Available" msgstr "可用" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:35 msgid "Background type" msgstr "背景類別" #: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4 msgid "Backspace key mode" msgstr "Backspace鍵模式" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14 #: tabby-serial/src/components/serialTab.component.ts:93 #: tabby-serial/src/profiles.ts:88 msgid "Baud rate" msgstr "串列傳輸速率" #: tabby-terminal/src/hotkeys.ts:22 msgid "Beginning of the line" msgstr "行首" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:64 msgid "Blink cursor" msgstr "閃爍游標" #: tabby-core/src/utils.ts:60 msgid "Blue" msgstr "藍色" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:39 msgid "Blur" msgstr "模糊" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:28 msgid "Bold font weight" msgstr "粗體文字寬度" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:132 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:80 msgid "Bottom" msgstr "底部" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:109 msgid "Bracketed paste (requires shell support)" msgstr "Bracketed 貼上(需要 Shell 支援)" #: tabby-terminal/src/services/multifocus.service.ts:19 msgid "Broadcast mode. Click anywhere to cancel." msgstr "廣播模式。點擊任何位置以取消。" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 #: tabby-core/src/services/profiles.service.ts:411 msgid "Built-in" msgstr "內建" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:28 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:71 #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:14 #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:12 #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:10 #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:7 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:31 #: tabby-electron/src/services/updater.service.ts:134 #: tabby-local/src/components/terminalTab.component.ts:118 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:117 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:79 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:99 #: tabby-ssh/src/sftpContextMenu.ts:40 #: tabby-terminal/src/api/baseTerminalTab.component.ts:522 msgid "Cancel" msgstr "取消" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:4 msgid "Change baud rate" msgstr "更改傳輸速率" #: tabby-core/src/tabContextMenu.ts:133 msgid "Change tab color" msgstr "改變分頁標籤顏色" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Change the master passphrase" msgstr "更改主密碼" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:13 msgid "Check for updates" msgstr "檢查更新" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:172 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:176 msgid "Ciphers" msgstr "密碼(Cipher)" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5 msgid "Clear" msgstr "清除" #: tabby-core/src/services/profiles.service.ts:248 msgid "Clear recent profiles" msgstr "清除最近的設定檔" #: tabby-terminal/src/hotkeys.ts:50 msgid "Clear terminal" msgstr "清除終端內容" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58 msgid "Clear terminal after connection" msgstr "連線後清除終端畫面" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94 msgid "Clipboard" msgstr "剪貼簿" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:7 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:53 #: locale/tmp-html/tabby-settings/src/components/showSecretModal.component.html:10 #: tabby-core/src/tabContextMenu.ts:33 msgid "Close" msgstr "關閉" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45 msgid "Close and never show again" msgstr "關閉並不再顯示" #: tabby-core/src/hotkeys.ts:240 msgid "Close focused pane" msgstr "關閉聚焦窗格" #: tabby-core/src/tabContextMenu.ts:48 msgid "Close other tabs" msgstr "關閉其他標籤" #: tabby-core/src/hotkeys.ts:28 #: tabby-core/src/tabContextMenu.ts:34 msgid "Close tab" msgstr "關閉標籤" #: tabby-core/src/tabContextMenu.ts:64 msgid "Close tabs to the left" msgstr "關閉左側標籤" #: tabby-core/src/tabContextMenu.ts:56 msgid "Close tabs to the right" msgstr "關閉右側標籤" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182 msgid "Close the window after closing the last tab" msgstr "在關閉最後標籤頁後關閉視窗" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33 #: tabby-core/src/tabContextMenu.ts:132 msgid "Color" msgstr "顏色" #: tabby-terminal/src/settings.ts:29 msgid "Color scheme" msgstr "顏色機制" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2 msgid "Color schemes" msgstr "配色方案" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216 msgid "Colors" msgstr "顏色" #: tabby-core/src/hotkeys.ts:72 msgid "Combine all tabs into the current tab" msgstr "整合所有分頁到目前的分頁" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4 msgid "Command line" msgstr "指令行" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13 msgid "Command's stdin/stdout is used instead of a network connection" msgstr "使用 stdin/stdout 指令代替網絡連線" #: tabby-core/src/services/commands.service.ts:105 msgid "Commands" msgstr "指令" #: tabby-core/src/theme.ts:16 msgid "Compact (legacy)" msgstr "緊湊 (舊版)" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:126 msgid "Config deleted" msgstr "設定檔已刪除" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:108 msgid "Config downloaded" msgstr "設定檔已下載" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120 msgid "Config file" msgstr "設定檔" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:73 msgid "Config sync" msgstr "同步設定檔" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:90 msgid "Config uploaded" msgstr "設定檔已上傳" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:31 msgid "Configs" msgstr "設定" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:21 msgid "Connect through a proxy server" msgstr "通過代理伺服器連線" #: tabby-core/src/index.ts:220 #: tabby-core/src/services/profiles.service.ts:296 msgid "Connect to \"%s\"..." msgstr "正在連線到 \"%s\"..." #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:17 msgid "Connect to a different host first and use it as a proxy" msgstr "先連線到其它主機並將其作為代理伺服器" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:19 #: tabby-serial/src/components/serialTab.component.ts:60 #: tabby-ssh/src/components/sshTab.component.ts:130 #: tabby-telnet/src/components/telnetTab.component.ts:54 msgid "Connecting" msgstr "正在連線" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:7 msgid "Connection" msgstr "連線" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:26 msgid "Connection failed: {error}" msgstr "連線失敗: {error}" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:40 msgid "Connection name will be used instead" msgstr "連線名稱將被使用" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:61 msgid "Context menu" msgstr "快顯功能表" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14 msgid "Controls the amount of space between elements" msgstr "調整各元件之間的間距" #: tabby-terminal/src/api/baseTerminalTab.component.ts:240 #: tabby-terminal/src/api/baseTerminalTab.component.ts:248 #: tabby-terminal/src/api/baseTerminalTab.component.ts:591 #: tabby-terminal/src/api/baseTerminalTab.component.ts:811 #: tabby-terminal/src/tabContextMenu.ts:34 msgid "Copied" msgstr "已複製" #: tabby-terminal/src/tabContextMenu.ts:30 msgid "Copy" msgstr "複製" #: tabby-terminal/src/hotkeys.ts:70 #: tabby-terminal/src/tabContextMenu.ts:70 msgid "Copy current path" msgstr "複製目前路徑" #: tabby-electron/src/sftpContextMenu.ts:29 msgid "Copy full path" msgstr "複製完整路徑" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97 msgid "Copy on select" msgstr "選取時即複製" #: tabby-terminal/src/hotkeys.ts:10 msgid "Copy to clipboard" msgstr "複製到剪貼簿" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103 msgid "Copy with formatting" msgstr "複製文字格式" #: tabby-core/src/services/config.service.ts:425 msgid "Could not decrypt config" msgstr "無法解密設定檔" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9 msgid "Create" msgstr "建立" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7 #: tabby-ssh/src/sftpContextMenu.ts:29 msgid "Create directory" msgstr "建立資料夾" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90 msgid "Current" msgstr "目前" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:3 msgid "Current color scheme" msgstr "目前配色方案" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17 msgid "Current host key fingerprint" msgstr "目前主機金輪指紋" #: tabby-core/src/tabContextMenu.ts:184 msgid "Current process: {name}" msgstr "目前的處理程序:{name}" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51 msgid "Cursor shape" msgstr "游標形狀" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46 msgid "Custom" msgstr "自訂" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90 msgid "Custom CSS" msgstr "自訂 CSS" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17 msgid "Dark mode" msgstr "深色模式" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26 msgid "Data bits" msgstr "資料位元" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:80 msgid "Debugging" msgstr "除錯" #: tabby-core/src/hotkeys.ts:256 msgid "Decrease horizontal split size" msgstr "縮小水平分割大小" #: tabby-core/src/hotkeys.ts:248 msgid "Decrease vertical split size" msgstr "縮小垂直分割大小" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92 msgid "Default \"Connect to\" type" msgstr "預設的 \"連線到\" 類型" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93 msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)" msgstr "預設的快速連線功能類型 (ex. SSH, Telnet)" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8 msgid "Default profile for new tabs" msgstr "新分頁的預設設定檔" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16 msgid "Default profile group settings" msgstr "預設設定檔群組設定" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101 msgid "Default profile settings" msgstr "預設設定檔設定" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:124 msgid "Defaults" msgstr "預設" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:6 msgid "Defaults for {type}" msgstr "預設為 {type}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:44 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:51 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:29 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:8 #: tabby-settings/src/components/configSyncSettingsTab.component.ts:116 #: tabby-settings/src/components/editProfileGroupModal.component.ts:38 #: tabby-settings/src/components/profilesSettingsTab.component.ts:130 #: tabby-settings/src/components/profilesSettingsTab.component.ts:215 #: tabby-settings/src/components/profilesSettingsTab.component.ts:229 #: tabby-settings/src/components/profilesSettingsTab.component.ts:318 #: tabby-settings/src/components/vaultSettingsTab.component.ts:52 #: tabby-ssh/src/sftpContextMenu.ts:39 #: tabby-ssh/src/sftpContextMenu.ts:47 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:92 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:32 msgid "Delete" msgstr "刪除" #: tabby-settings/src/components/profilesSettingsTab.component.ts:128 #: tabby-settings/src/components/profilesSettingsTab.component.ts:213 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90 msgid "Delete \"{name}\"?" msgstr "刪除 “{name}”?" #: tabby-ssh/src/sftpContextMenu.ts:35 msgid "Delete {fullPath}?" msgstr "刪除 {fullPath}?" #: tabby-terminal/src/hotkeys.ts:42 msgid "Delete entire line" msgstr "刪除整行" #: tabby-terminal/src/hotkeys.ts:46 msgid "Delete next word" msgstr "刪除下一個單字" #: tabby-terminal/src/hotkeys.ts:38 msgid "Delete previous word" msgstr "刪除上一個單字" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:114 msgid "Delete the config on the remote side?" msgstr "是否刪除遠端設定檔?" #: tabby-settings/src/components/profilesSettingsTab.component.ts:226 msgid "Delete the group's profiles?" msgstr "是否刪除群組内所有設定檔?" #: tabby-terminal/src/components/loginScriptsSettings.component.ts:29 msgid "Delete this script?" msgstr "刪除此腳本?" #: tabby-settings/src/components/vaultSettingsTab.component.ts:50 msgid "Delete vault contents?" msgstr "删除金鑰庫中的所有內容?" #: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3 msgid "Deleting" msgstr "正在刪除" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:8 msgid "Device" msgstr "裝置" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10 msgid "Direct" msgstr "直接連線" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57 msgid "Disable" msgstr "停用" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:39 msgid "Disable dynamic tab title" msgstr "停用動態分頁標題" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:218 msgid "Disable fluent background while dragging" msgstr "拖曳時停用 fluent 背景" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:204 msgid "Disable GPU acceleration" msgstr "停用顯示卡(GPU)加速" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50 msgid "Disabled" msgstr "已停用" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:26 #: tabby-ssh/src/components/sshTab.component.ts:200 #: tabby-telnet/src/components/telnetTab.component.ts:83 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:36 #: tabby-terminal/src/tabContextMenu.ts:106 #: tabby-terminal/src/tabContextMenu.ts:110 msgid "Disconnect" msgstr "中斷連線" #: tabby-terminal/src/hotkeys.ts:106 msgid "Disconnect current tab (Serial/Telnet/SSH)" msgstr "中斷目前分頁的連線 (Serial/Telnet/SSH)" #: tabby-ssh/src/components/sshTab.component.ts:198 #: tabby-telnet/src/components/telnetTab.component.ts:81 msgid "Disconnect from {host}?" msgstr "與 {host} 中斷連線嗎?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30 msgid "Display images via Sixel escape sequences" msgstr "透過Sixel跳脫序列顯示圖片" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85 msgid "Display on" msgstr "顯示在" #: tabby-core/src/components/transfersMenu.component.ts:50 msgid "Do not abort" msgstr "不要中止" #: tabby-ssh/src/components/sshTab.component.ts:201 #: tabby-telnet/src/components/telnetTab.component.ts:84 msgid "Do not close" msgstr "不要關閉" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:8 msgid "Do not remember" msgstr "不要記住" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97 msgid "Dock always on top" msgstr "永遠貼齊在最上方" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67 msgid "Dock the terminal" msgstr "貼齊終端機" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:104 msgid "Docked terminal size" msgstr "已貼齊終端機大小" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:111 msgid "Docked terminal space" msgstr "已貼齊終端機空間" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:64 msgid "Docking" msgstr "貼齊" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:75 msgid "Double-click selection will stop at these characters" msgstr "點兩下選擇將停在該字元處" #: tabby-core/src/tabContextMenu.ts:79 msgid "Down" msgstr "下方" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43 msgid "Download" msgstr "下載" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:23 msgid "Draw bold text in bright colors" msgstr "用亮色繪製粗體" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:48 #: tabby-core/src/tabContextMenu.ts:127 msgid "Duplicate" msgstr "複製" #: tabby-local/src/tabContextMenu.ts:72 msgid "Duplicate as administrator" msgstr "以管理員權限複製" #: tabby-core/src/hotkeys.ts:60 #: tabby-core/src/tabContextMenu.ts:128 msgid "Duplicate tab" msgstr "複製分頁" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:6 msgid "Edit" msgstr "編輯" #: tabby-electron/src/sftpContextMenu.ts:35 msgid "Edit locally" msgstr "在本機編輯" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58 msgid "Enable" msgstr "啟用" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66 msgid "Enable analytics" msgstr "啟用統計資料" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87 msgid "Enable animations" msgstr "啟用動畫" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74 msgid "Enable automatic installation of updates when they become available." msgstr "啟用當有新的版本可使用時自動安裝更新" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211 msgid "Enable fluent background option" msgstr "啟用 fluent 背景" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16 msgid "Enable font ligatures" msgstr "啟用合字" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39 msgid "Enable global hotkey (Ctrl-Space)" msgstr "啟用全域快速鍵 (Ctrl+Space)" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:6 msgid "Enables the experimental Windows ConPTY API" msgstr "啟用實驗性 Windows ConPTY API" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:37 msgid "Encrypt config file" msgstr "加密設定檔" #: tabby-terminal/src/hotkeys.ts:26 msgid "End of the line" msgstr "行尾" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:17 msgid "Environment" msgstr "環境" #: tabby-core/src/services/config.service.ts:429 #: tabby-core/src/services/config.service.ts:443 msgid "Erase config" msgstr "清除設定" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12 msgid "Erase the Vault" msgstr "清除金鑰庫" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6 msgid "Error in {plugin}:" msgstr "套件中的錯誤 {plugin}:" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Exact match" msgstr "完全符合" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:15 msgid "Example:" msgstr "範例:" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212 msgid "Experimental Windows 10 background style known to cause issues" msgstr "已知會導致問題的實驗性Windows 10背景樣式" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28 msgid "Export" msgstr "匯出" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:76 msgid "Fallback font" msgstr "備用字型" #: locale/tmp-html/tabby-core/src/components/transfersMenu.component.html:3 msgid "File transfers" msgstr "檔案傳輸" #: tabby-settings/src/components/vaultSettingsTab.component.ts:96 msgid "File: {description}" msgstr "檔案描述: {description}" #: tabby-settings/src/components/profilesSettingsTab.component.ts:9 msgid "Filter" msgstr "篩選器" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:147 msgid "Fixed" msgstr "固定寬度" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:219 msgid "Fluent background sometimes causes drag lag" msgstr "Fluent 背景有時會導致拖曳延遲" #: tabby-terminal/src/tabContextMenu.ts:82 msgid "Focus all panes" msgstr "聚焦所有窗格" #: tabby-terminal/src/hotkeys.ts:78 msgid "Focus all panes at once (broadcast)" msgstr "同時聚焦所有窗格(廣播)" #: tabby-terminal/src/tabContextMenu.ts:75 msgid "Focus all tabs" msgstr "聚焦所有分頁" #: tabby-terminal/src/hotkeys.ts:82 msgid "Focus all tabs at once (broadcast)" msgstr "同時聚焦所有分頁 (廣播)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:196 msgid "Focus follows mouse" msgstr "焦點隨滑鼠移動" #: tabby-core/src/hotkeys.ts:196 msgid "Focus next pane" msgstr "聚焦至下一個窗格" #: tabby-core/src/hotkeys.ts:200 #: tabby-core/src/hotkeys.ts:204 #: tabby-core/src/hotkeys.ts:208 #: tabby-core/src/hotkeys.ts:212 #: tabby-core/src/hotkeys.ts:216 #: tabby-core/src/hotkeys.ts:220 #: tabby-core/src/hotkeys.ts:224 #: tabby-core/src/hotkeys.ts:228 #: tabby-core/src/hotkeys.ts:232 msgid "Focus pane {number}" msgstr "聚焦{number}號窗格" #: tabby-core/src/hotkeys.ts:192 msgid "Focus previous pane" msgstr "聚焦前一個窗格" #: tabby-core/src/hotkeys.ts:176 msgid "Focus the pane above" msgstr "聚焦上方的窗格" #: tabby-core/src/hotkeys.ts:180 msgid "Focus the pane below" msgstr "聚焦下方的窗格" #: tabby-core/src/hotkeys.ts:184 msgid "Focus the pane on the left" msgstr "聚焦左邊的窗格" #: tabby-core/src/hotkeys.ts:188 msgid "Focus the pane on the right" msgstr "聚焦右邊的窗格" #: tabby-core/src/theme.ts:34 msgid "Follow the color scheme" msgstr "遵循色彩搭配方案" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5 msgid "Font" msgstr "字型" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:190 msgid "For keyboard shortcuts" msgstr "對於鍵盤快速鍵" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:53 msgid "Force CR" msgstr "強制使用 CR" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:55 msgid "Force CRLF" msgstr "強制使用 CRLF" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:54 msgid "Force LF" msgstr "強制使用 LF" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25 msgid "Forces a specific SSH agent connection type." msgstr "強制 SSH使用特定的連線類型" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105 msgid "Forget" msgstr "清除" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:45 msgid "Forward port" msgstr "通訊埠轉發" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingModal.component.html:3 msgid "Forwarded ports" msgstr "已轉發通訊埠" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:46 msgid "From color scheme" msgstr "從配色方案" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9 msgid "From system" msgstr "跟隨系統" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44 msgid "From theme" msgstr "從佈景風格" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:6 msgid "Frontend" msgstr "前端" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:61 msgid "Full" msgstr "全寬" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:3 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:3 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:3 msgid "General" msgstr "一般設定" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Generate a pre-filled GitHub issue" msgstr "產成一個預填寫的 GitHub 問題" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:25 msgid "Get" msgstr "取得" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:18 msgid "Get it from the Tabby Web settings window" msgstr "從 Tabby 網頁設定視窗獲取" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:29 msgid "Gives the window a blurred transparent background" msgstr "使視窗具有模糊透明的背景" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24 msgid "Go up" msgstr "往上" #: tabby-core/src/utils.ts:61 msgid "Green" msgstr "綠色" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:16 msgid "Group" msgstr "群組" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:201 msgid "Hacks" msgstr "修正" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:33 msgid "Help track the number of Tabby installs across the world!" msgstr "協助追蹤 Tabby 在全球的安裝數量!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Help translate Tabby" msgstr "協助我們翻譯 Tabby" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:32 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:45 msgid "Hexadecimal" msgstr "十六進制" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49 msgid "Hide" msgstr "隱藏" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176 msgid "Hide tab close button" msgstr "隱藏關閉分頁按鈕" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:158 msgid "Hide tab index" msgstr "隱藏分頁索引" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:170 msgid "Hide tab options button" msgstr "隱藏分頁設定按鈕" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:118 msgid "Hide window on focus loss" msgstr "非聚焦時隱藏視窗" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:119 msgid "Hides the docked terminal when you click away." msgstr "點擊別處時隱藏停靠的終端" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26 msgid "Homepage" msgstr "首頁" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6 msgid "Host" msgstr "主機" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206 msgid "Host key" msgstr "主機金鑰" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3 msgid "Host key verification" msgstr "主機金鑰驗證" #: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2 #: tabby-settings/src/settings.ts:15 msgid "Hotkeys" msgstr "快速鍵" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83 msgid "How Tabby presents itself through environment vars" msgstr "Tabby 如何透過環境變數呈現" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24 msgid "HTTP proxy" msgstr "HTTP 代理伺服器" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:61 msgid "HTTP proxy host" msgstr "HTTP 代理主機位址" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:65 msgid "HTTP proxy port" msgstr "HTTP 代理通訊埠" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:20 msgid "Icon" msgstr "圖示" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:145 msgid "id.tab-width.dynamic" msgstr "動態調整" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:76 msgid "If disabled, only custom profiles will show up in the profile selector" msgstr "如果關閉,只有自訂設定檔會被顯示在設定檔選擇器" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:23 msgid "Immediately echoes your input locally" msgstr "立刻在本機顯示您的輸入" #: tabby-core/src/hotkeys.ts:252 msgid "Increase horizontal split size" msgstr "增加水平分割大小" #: tabby-core/src/hotkeys.ts:244 msgid "Increase vertical split size" msgstr "增加垂直分割大小" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21 msgid "Input" msgstr "輸入" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:18 msgid "Input is sent as you type" msgstr "輸入在您鍵入時傳送" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:4 msgid "Input mode" msgstr "輸入模式" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15 msgid "Input newlines" msgstr "換行" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39 msgid "Installed" msgstr "已安裝" #: tabby-electron/src/services/updater.service.ts:131 msgid "Installing the update will close all tabs and restart Tabby." msgstr "安裝更新將關閉所有分頁並重新啟動 Tabby。" #: tabby-terminal/src/hotkeys.ts:66 msgid "Intelligent Ctrl-C (copy/abort)" msgstr "智慧 Ctrl-C (複製/中止)" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94 msgid "Interactive" msgstr "互動式" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:130 msgid "Invalid syntax" msgstr "無效語法" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43 msgid "Jump host" msgstr "跳轉伺服器" #: tabby-terminal/src/hotkeys.ts:34 msgid "Jump to next word" msgstr "跳轉至下個關鍵字" #: tabby-terminal/src/hotkeys.ts:30 msgid "Jump to previous word" msgstr "跳轉至上個關鍵字" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:51 #: tabby-settings/src/components/editProfileGroupModal.component.ts:39 #: tabby-settings/src/components/profilesSettingsTab.component.ts:131 #: tabby-settings/src/components/profilesSettingsTab.component.ts:216 #: tabby-settings/src/components/profilesSettingsTab.component.ts:319 #: tabby-settings/src/components/vaultSettingsTab.component.ts:53 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:93 #: tabby-terminal/src/components/loginScriptsSettings.component.ts:33 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:51 msgid "Keep" msgstr "維持現狀" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154 msgid "Keep Alive Interval (Milliseconds)" msgstr "Keep-Alive 間隔(毫秒)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98 msgid "Keep docked terminal always on top" msgstr "保持已貼齊終端機永遠在最上方" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:86 msgid "Key" msgstr "金鑰" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:186 msgid "Key exchange" msgstr "金鑰交換" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:36 msgid "Keyboard" msgstr "鍵盤" #: locale/tmp-html/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.html:2 msgid "Keyboard-interactive auth" msgstr "鍵盤交互認證" #: tabby-local/src/components/terminalTab.component.ts:117 msgid "Kill" msgstr "終止" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:10 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:50 msgid "Language" msgstr "語言" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11 msgid "Last known host key fingerprint" msgstr "最後已知主機金輪指紋" #: tabby-ssh/src/tabContextMenu.ts:32 msgid "Launch WinSCP" msgstr "啟動 WinSCP" #: tabby-ssh/src/hotkeys.ts:14 msgid "Launch WinSCP for current SSH session" msgstr "為目前 SSH 階段啟動 WinSCP" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7 msgid "Learn how to allow Tabby to detect remote shell's working directory." msgstr "得知如何讓 Tabby 偵測遠端工作目錄" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76 #: tabby-core/src/tabContextMenu.ts:80 msgid "Left" msgstr "左側" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40 msgid "Lets the shell handle Meta key instead of OS" msgstr "使用 Shell 替代作業系統處理 Meta 鍵" #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22 msgid "Light mode" msgstr "淺色模式" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:27 msgid "Line by line" msgstr "逐行" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:28 msgid "Line editor, input is sent after you press Enter" msgstr "行編輯器,按Enter後傳送輸入" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83 msgid "Line padding" msgstr "行距" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21 msgid "Loading" msgstr "載入中" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:34 msgid "Loading configs..." msgstr "載入設定檔中..." #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:39 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Local" msgstr "本機" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:22 msgid "Local echo" msgstr "本機回覆" #: tabby-local/src/profiles.ts:12 msgid "Local terminal" msgstr "本機終端機" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:86 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16 msgid "Login scripts" msgstr "登入執行腳本" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57 msgid "Long-click for context menu" msgstr "長按以叫出選單" #: tabby-core/src/services/profiles.service.ts:279 msgid "Manage profiles" msgstr "管理設定檔" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160 msgid "Max Keep Alive Count" msgstr "最大 Keep-Alive 次數" #: tabby-core/src/hotkeys.ts:172 msgid "Maximize the active pane" msgstr "最大化目前窗格" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:93 #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:70 msgid "Minimum contrast ratio" msgstr "最低對比度" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:39 msgid "Modified on {date}" msgstr "修改於 {date}" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:53 msgid "Mouse" msgstr "滑鼠" #: tabby-core/src/hotkeys.ts:48 msgid "Move tab to the left" msgstr "將分頁左移" #: tabby-core/src/hotkeys.ts:52 msgid "Move tab to the right" msgstr "將分頁右移" #: tabby-settings/src/components/profilesSettingsTab.component.ts:228 msgid "Move to \"Ungrouped\"" msgstr "移至未分類" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:197 msgid "Moving the mouse over an inactive pane will cause it to activate" msgstr "自動聚焦於滑鼠游標所在的窗格" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:9 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:12 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:13 msgid "Name" msgstr "名稱" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:60 msgid "Name for the new config" msgstr "新設定的名稱" #: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:3 msgid "Name for the new directory" msgstr "新目錄的名稱" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:57 msgid "Native" msgstr "原生" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21 msgid "New" msgstr "新增" #: tabby-local/src/tabContextMenu.ts:53 msgid "New admin tab" msgstr "新的管理員分頁" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:58 msgid "New config on {platform}" msgstr "{platform} 上的新設定" #: tabby-settings/src/components/profilesSettingsTab.component.ts:144 msgid "New group name" msgstr "新增群組名稱" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16 msgid "New item" msgstr "新增項目" #: tabby-settings/src/components/vaultSettingsTab.component.ts:133 msgid "New name" msgstr "新增名稱" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:23 msgid "New profile" msgstr "新設定檔" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24 msgid "New profile Group" msgstr "新增設定檔群組" #: tabby-terminal/src/tabContextMenu.ts:176 msgid "New profile name" msgstr "新設定檔名稱" #: tabby-local/src/hotkeys.ts:10 msgid "New tab" msgstr "新增分頁" #: tabby-core/src/hotkeys.ts:271 msgid "New tab: {profile}" msgstr "新分頁:{profile}" #: tabby-local/src/buttonProvider.ts:20 #: tabby-local/src/tabContextMenu.ts:27 msgid "New terminal" msgstr "新終端機" #: tabby-electron/src/hotkeys.ts:10 msgid "New window" msgstr "新視窗" #: tabby-electron/src/services/dockMenu.service.ts:62 msgid "New Window" msgstr "新視窗" #: tabby-local/src/tabContextMenu.ts:37 msgid "New with profile" msgstr "新的設定檔" #: tabby-core/src/hotkeys.ts:40 msgid "Next tab" msgstr "下一個分頁" #: tabby-core/src/utils.ts:59 msgid "No color" msgstr "無色彩" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:85 msgid "No modifier" msgstr "無修飾鍵" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:41 msgid "None" msgstr "無" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:17 #: tabby-terminal/src/components/streamProcessingSettings.component.ts:40 msgid "Normal" msgstr "普通" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22 msgid "Normal font weight" msgstr "普通字型寬度" #: tabby-terminal/src/components/searchPanel.component.ts:54 #: tabby-terminal/src/components/searchPanel.component.ts:64 msgid "Not found" msgstr "找不到項目" #: tabby-core/src/tabContextMenu.ts:209 msgid "Notify on activity" msgstr "有動作時通知" #: tabby-core/src/tabContextMenu.ts:187 msgid "Notify when done" msgstr "完成後通知" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:17 msgid "Number of lines kept in the buffer" msgstr "有幾行被存進緩衝區" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:72 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:137 #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:60 msgid "Off" msgstr "關閉" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:81 msgid "Official" msgstr "官方" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:26 msgid "On GitHub Discussions" msgstr "GitHub 討論" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47 msgid "Only close the tab when session is explicitly terminated" msgstr "只有在連線階段確定終止後才關閉分頁" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46 msgid "Opacity" msgstr "不透明度" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82 msgid "Open DevTools" msgstr "開啟開發者工具" #: tabby-settings/src/hotkeys.ts:11 msgid "Open Settings" msgstr "開啟設定" #: tabby-settings/src/hotkeys.ts:25 msgid "Open settings tab: {tab}" msgstr "打開設定分頁:{tab}" #: tabby-ssh/src/tabContextMenu.ts:25 msgid "Open SFTP panel" msgstr "開啟 SFTP 面板" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Optional" msgstr "選用" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:11 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:34 msgid "Options" msgstr "選項" #: tabby-core/src/utils.ts:62 msgid "Orange" msgstr "橘色" #: tabby-electron/src/shells/macDefault.ts:25 msgid "OS default" msgstr "系統預設" #: tabby-electron/src/shells/winDefault.ts:43 msgid "OS default ({name})" msgstr "系統預設 ({name})" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:46 msgid "Output is shown as a hexdump" msgstr "以16進位顯示輸出" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:41 msgid "Output is shown as it is received" msgstr "照原樣顯示輸出" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23 msgid "Output mode" msgstr "輸出模式" #: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34 msgid "Output newlines" msgstr "換行輸出" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42 msgid "Override X11 display" msgstr "覆蓋 X11 顯示" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:98 msgid "Overwrite local and sync" msgstr "覆寫本機並同步" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:78 msgid "Overwrite remote and sync" msgstr "覆寫遠端並同步" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:76 msgid "Overwrite the config on the remote side and start syncing?" msgstr "覆寫遠端設定檔並開始同步?" #: tabby-settings/src/components/configSyncSettingsTab.component.ts:96 msgid "Overwrite the local config and start syncing?" msgstr "覆寫本機設定檔並開始同步?" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189 msgid "Pane resize step" msgstr "窗格大小調整級距" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:186 msgid "Panes" msgstr "窗格" #: tabby-core/src/theme.ts:26 msgid "Paper (legacy)" msgstr "紙張 (舊版)" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38 msgid "Parity" msgstr "同位元" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64 msgid "Partial config sync is not possible when the config is encrypted via Vault." msgstr "部分設定檔無法同步,因為已被金鑰庫加密" #: tabby-terminal/src/components/inputProcessingSettings.component.ts:17 msgid "Pass-through" msgstr "直通" #: tabby-settings/src/components/vaultSettingsTab.component.ts:92 msgid "Passphrase for a private key with hash {hash}..." msgstr "一個雜湊私鑰的密碼{hash}" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82 msgid "Password" msgstr "密碼" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:62 #: tabby-terminal/src/api/baseTerminalTab.component.ts:521 #: tabby-terminal/src/tabContextMenu.ts:39 msgid "Paste" msgstr "貼上" #: tabby-terminal/src/hotkeys.ts:14 msgid "Paste from clipboard" msgstr "從剪貼簿貼上" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63 msgid "Paste if no selection, else copy" msgstr "未選擇內容時貼上,否則複製" #: tabby-terminal/src/api/baseTerminalTab.component.ts:528 msgid "Paste multiple lines?" msgstr "貼上多行?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68 msgid "Paste on middle-click" msgstr "按滑鼠中鍵時貼上" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:43 msgid "Path or address of the local X11 socket" msgstr "本機 X11 socket 的路徑或位址" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Pin" msgstr "釘選" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:3 msgid "Plugins" msgstr "擴充功能" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4 msgid "Plugins folder" msgstr "擴充功能資料夾" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38 #: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10 msgid "Port" msgstr "通訊埠" #: tabby-serial/src/components/serialTab.component.ts:65 msgid "Port opened" msgstr "通訊埠已打開" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:119 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:12 msgid "Ports" msgstr "通訊埠" #: tabby-terminal/src/api/connectableTerminalTab.component.ts:87 msgid "Press any key to reconnect" msgstr "按下任意鍵以重新連線" #: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3 msgid "Press the key now" msgstr "現在按下按鍵" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:21 msgid "Prevents accidental closing" msgstr "防止意外關閉" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110 msgid "Prevents accidental execution of pasted commands" msgstr "防止意外貼上的指令執行" #: tabby-core/src/hotkeys.ts:44 msgid "Previous tab" msgstr "上一個分頁" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:108 msgid "Private keys" msgstr "私鑰" #: tabby-core/src/tabContextMenu.ts:195 msgid "Process completed" msgstr "處理完成" #: tabby-core/src/tabContextMenu.ts:151 msgid "Profile name" msgstr "設定檔名稱" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:2 #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:4 #: tabby-electron/src/services/dockMenu.service.ts:40 msgid "Profiles" msgstr "設定檔" #: tabby-core/src/commands.ts:32 #: tabby-settings/src/settings.ts:58 msgid "Profiles & connections" msgstr "設定檔與連線" #: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:12 msgid "Program" msgstr "程式" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:30 msgid "Proxy command" msgstr "代理指令" #: tabby-core/src/utils.ts:63 msgid "Purple" msgstr "紫色" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38 msgid "Puts all of Tabby's configuration into the vault" msgstr "將所有 Tabby 設定檔放入金鑰庫" #: tabby-core/src/index.ts:219 #: tabby-core/src/services/profiles.service.ts:295 msgid "Quick connect" msgstr "快速連線" #: tabby-core/src/services/config.service.ts:430 #: tabby-core/src/services/config.service.ts:444 msgid "Quit" msgstr "退出" #: tabby-telnet/src/profiles.ts:50 msgid "Raw socket connection" msgstr "原始 socket 連線" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:166 msgid "Ready Timeout (Milliseconds)" msgstr "就緒超時(毫秒)" #: tabby-core/src/services/profiles.service.ts:235 #: tabby-core/src/services/profiles.service.ts:249 #: tabby-electron/src/services/dockMenu.service.ts:28 msgid "Recent" msgstr "最近" #: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:10 #: locale/tmp-html/tabby-telnet/src/components/telnetTab.component.html:3 #: tabby-terminal/src/api/connectableTerminalTab.component.ts:32 #: tabby-terminal/src/tabContextMenu.ts:115 #: tabby-terminal/src/tabContextMenu.ts:119 msgid "Reconnect" msgstr "重新連線" #: tabby-terminal/src/hotkeys.ts:102 msgid "Reconnect current tab (Serial/Telnet/SSH)" msgstr "重新連線目前的分頁 (Serial/Telnet/SSH)" #: tabby-core/src/utils.ts:64 msgid "Red" msgstr "紅色" #: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:10 msgid "Regex" msgstr "正規表示式" #: tabby-settings/src/components/releaseNotesTab.component.ts:27 msgid "Release notes" msgstr "發行紀錄" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:6 msgid "Remember for {time}" msgstr "在 {time} 內記住" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:41 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgid "Remote" msgstr "遠端" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124 msgid "Remove whitespace and newlines around the copied text" msgstr "刪除複製文字周圍的空格和換行" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26 #: tabby-core/src/tabContextMenu.ts:120 msgid "Rename" msgstr "重新命名" #: tabby-core/src/hotkeys.ts:24 #: tabby-core/src/tabContextMenu.ts:121 msgid "Rename tab" msgstr "重新命名分頁" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:3 msgid "Rendering" msgstr "彩現" #: tabby-core/src/hotkeys.ts:32 msgid "Reopen last tab" msgstr "開啟最後關閉的分頁" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:27 msgid "Replace" msgstr "取代" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:11 #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:21 msgid "Report a problem" msgstr "回報問題" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81 msgid "Require a key to click links" msgstr "需要按鍵以打開連結" #: tabby-terminal/src/hotkeys.ts:62 msgid "Reset zoom" msgstr "重設縮放比" #: tabby-serial/src/hotkeys.ts:14 msgid "Restart current serial session" msgstr "重啟目前的序列階段" #: tabby-ssh/src/hotkeys.ts:10 msgid "Restart current SSH session" msgstr "重啟目前的 SSH 階段" #: tabby-telnet/src/hotkeys.ts:10 msgid "Restart current Telnet session" msgstr "重啟目前的 Telnet 階段" #: tabby-core/src/hotkeys.ts:64 msgid "Restart tab" msgstr "重新啟動分頁" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:140 msgid "Restart the app to apply changes" msgstr "重新啟動應用程式以套用變更" #: tabby-settings/src/components/profilesSettingsTab.component.ts:316 msgid "Restore settings to defaults ?" msgstr "將設定還原為預設值?" #: tabby-settings/src/components/editProfileGroupModal.component.ts:36 msgid "Restore settings to inherited defaults ?" msgstr "將設定還原為繼承的預設值 ?" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159 msgid "Restore terminal tabs on app start" msgstr "應用程式啟動時回復先前的終端機分頁" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147 msgid "Reuse session for multiple tabs" msgstr "回復多個分頁的狀態" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78 #: tabby-core/src/tabContextMenu.ts:78 msgid "Right" msgstr "右側" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56 msgid "Right click" msgstr "按下滑鼠右鍵" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5 msgid "Run as administrator" msgstr "以系統管理員身分執行" #: locale/tmp-html/tabby-core/src/components/renameTabModal.component.html:6 #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:27 #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:70 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:29 msgid "Save" msgstr "儲存" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:101 msgid "Save a password in the keychain" msgstr "將密碼儲存至鑰匙圈" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:129 msgid "Save and apply" msgstr "儲存並套用" #: tabby-terminal/src/tabContextMenu.ts:173 msgid "Save as profile" msgstr "另存設定檔" #: tabby-core/src/tabContextMenu.ts:148 msgid "Save layout as profile" msgstr "將排版儲存為設定檔" #: tabby-terminal/src/tabContextMenu.ts:210 msgid "Saved" msgstr "已儲存" #: tabby-core/src/profiles.ts:19 msgid "Saved layout" msgstr "已儲存排版" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:46 msgid "Scroll on input" msgstr "輸入時自動捲動至底部" #: tabby-terminal/src/hotkeys.ts:94 msgid "Scroll terminal one page down" msgstr "終端機向下捲動一頁" #: tabby-terminal/src/hotkeys.ts:90 msgid "Scroll terminal one page up" msgstr "終端機向上捲動一頁" #: tabby-terminal/src/hotkeys.ts:98 msgid "Scroll terminal to bottom" msgstr "捲動到終端機底部" #: tabby-terminal/src/hotkeys.ts:86 msgid "Scroll terminal to top" msgstr "捲動到終端機頂部" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:16 msgid "Scrollback" msgstr "回捲" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47 msgid "Scrolls the terminal to the bottom on user input" msgstr "在用戶輸入時將終端捲動到底部" #: tabby-terminal/src/hotkeys.ts:74 msgid "Search" msgstr "搜尋" #: tabby-terminal/src/components/colorSchemeSelector.component.ts:9 #: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10 msgid "Search color schemes" msgstr "搜尋配色方案" #: tabby-settings/src/components/hotkeySettingsTab.component.ts:12 msgid "Search hotkeys" msgstr "搜尋快速鍵" #: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts:14 msgid "Search plugins" msgstr "搜尋套件" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:17 msgid "Secret sync token" msgstr "同步密鑰" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:45 #: tabby-electron/src/services/platform.service.ts:200 msgid "Select" msgstr "選擇" #: tabby-settings/src/components/profilesSettingsTab.component.ts:61 msgid "Select a base profile to use as a template" msgstr "選擇設定檔作為範本" #: tabby-terminal/src/hotkeys.ts:18 msgid "Select all" msgstr "選取全部" #: tabby-core/src/services/fileProviders.service.ts:47 msgid "Select file storage" msgstr "選取儲存位置" #: tabby-core/src/index.ts:232 msgid "Select profile" msgstr "選擇設定檔" #: tabby-core/src/services/profiles.service.ts:308 msgid "Select profile or enter an address" msgstr "選擇設定檔或輸入位址" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:33 msgid "Send bytes by typing in hex values" msgstr "傳輸以十六進位輸入的位元組" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:75 msgid "Sends data one byte at a time" msgstr "資料每次只傳送一個位元組" #: tabby-serial/src/profiles.ts:14 #: tabby-serial/src/profiles.ts:74 msgid "Serial" msgstr "序列" #: tabby-serial/src/profiles.ts:53 #: tabby-serial/src/profiles.ts:64 msgid "Serial connection" msgstr "序列埠連線" #: tabby-serial/src/profiles.ts:73 msgid "Serial: {description}" msgstr "序列:{description}" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5 msgid "Set master passphrase" msgstr "設定主密碼" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:11 msgid "Set passphrase" msgstr "設定密碼" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:104 msgid "Set password" msgstr "設定密碼" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:168 msgid "Set Tabby as %COMSPEC%" msgstr "設定 Tabby 為 %COMSPEC%" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:69 msgid "Set to 0 to disable recent profiles" msgstr "設為 0 時停用顯示最近的設定檔" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36 msgid "Sets the SSH agent's named pipe path." msgstr "設定 SSH 代理的命名管道路徑" #: tabby-settings/src/buttonProvider.ts:28 #: tabby-settings/src/components/settingsTab.component.ts:57 msgid "Settings" msgstr "設定" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:2 msgid "Shell" msgstr "Shell" #: tabby-terminal/src/api/baseTerminalTab.component.ts:593 msgid "Shell does not support current path detection" msgstr "Shell 不支援目前路徑偵測" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59 msgid "Shell integration" msgstr "Shell 整合" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25 msgid "Show" msgstr "顯示" #: tabby-core/src/hotkeys.ts:275 msgid "Show {type} profile selector" msgstr "顯示 {type} 設定檔選擇器" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117 msgid "Show a confirmation box when pasting multiple lines" msgstr "當貼上多行內容時顯示確認視窗" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75 msgid "Show built-in profiles in selector" msgstr "在選擇器中顯示內建設定" #: tabby-core/src/hotkeys.ts:12 msgid "Show command selector" msgstr "顯示指令選擇器" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132 msgid "Show config file" msgstr "顯示設定檔" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131 msgid "Show defaults" msgstr "顯示預設檔" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146 msgid "Show Mixer" msgstr "顯示混和器" #: tabby-core/src/hotkeys.ts:56 msgid "Show pane labels (for rearranging)" msgstr "顯示窗格標籤(重新排列時)" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164 msgid "Show profile icon on tab" msgstr "在分頁上顯示設定檔圖示" #: tabby-core/src/hotkeys.ts:16 msgid "Show profile selector" msgstr "顯示設定選擇器" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68 msgid "Show recent profiles in selector" msgstr "在選擇器中顯示最近使用的設定" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "Show release notes" msgstr "顯示發行紀錄" #: tabby-serial/src/hotkeys.ts:10 msgid "Show Serial connections" msgstr "顯示序列連線" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152 msgid "Show tabs in fullscreen mode" msgstr "在全螢幕下顯示分頁" #: tabby-terminal/src/tabContextMenu.ts:62 msgid "Show toolbar" msgstr "顯示工具列" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45 msgid "Show vault contents" msgstr "顯示金鑰庫的內容" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29 msgid "Sixel graphics support (experimental)" msgstr "(實驗性) Sixel圖形支援" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:140 msgid "Skip MoTD/banner" msgstr "跳過MoTD" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:74 msgid "Slow feed" msgstr "逐字節接收" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:68 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:86 msgid "Snaps the window to a side of the screen" msgstr "將視窗貼齊螢幕的其中一邊" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:22 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:9 #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:20 msgid "SOCKS proxy" msgstr "SOCKS 代理" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:51 msgid "SOCKS proxy host" msgstr "SOCKS 代理主機" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:55 msgid "SOCKS proxy port" msgstr "SOCKS 代理埠" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:130 msgid "Sound" msgstr "音效" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:31 msgid "Source code" msgstr "原始碼" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13 msgid "Spaciness" msgstr "空間感" #: tabby-core/src/tabContextMenu.ts:75 msgid "Split" msgstr "新增分割視窗於" #: tabby-core/src/hotkeys.ts:160 msgid "Split to the bottom" msgstr "分離至底部" #: tabby-core/src/tabContextMenu.ts:85 msgid "Split to the down" msgstr "分離至下方" #: tabby-core/src/hotkeys.ts:164 #: tabby-core/src/tabContextMenu.ts:86 msgid "Split to the left" msgstr "分離至左方" #: tabby-core/src/hotkeys.ts:156 #: tabby-core/src/tabContextMenu.ts:84 msgid "Split to the right" msgstr "分離至右方" #: tabby-core/src/hotkeys.ts:168 msgid "Split to the top" msgstr "分離至上方" #: tabby-core/src/tabContextMenu.ts:87 msgid "Split to the up" msgstr "分離至上方" #: tabby-ssh/src/profiles.ts:82 msgid "SSH connection" msgstr "SSH 連線" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:47 msgid "SSH connection management is now done through the \"Profiles & connections\" tab" msgstr "SSH連線管理現在位於「設定檔與連線」分頁下" #: tabby-settings/src/components/vaultSettingsTab.component.ts:89 msgid "SSH password for {user}@{host}:{port}" msgstr "{user}@{host}:{port} 的 SSH 密碼" #: tabby-core/src/theme.ts:8 msgid "Standard (legacy)" msgstr "標準 (舊版)" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150 msgid "Startup" msgstr "啟動" #: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32 msgid "Stop bits" msgstr "停止位元" #: tabby-terminal/src/components/streamProcessingSettings.component.ts:52 msgid "Strip" msgstr "條" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Subscribe to updates" msgstr "訂閱更新" #: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:13 msgid "Substitutions allowed." msgstr "允許替換" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19 #: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5 msgid "Switch color scheme" msgstr "切換配色方案" #: tabby-core/src/tabContextMenu.ts:290 msgid "Switch profile" msgstr "切換設定檔" #: tabby-core/src/hotkeys.ts:236 msgid "Switch profile in the active pane" msgstr "切換活動中分頁的設定檔" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:7 msgid "Switches terminal frontend implementation (experimental)" msgstr "(實驗性)更換終端機前端" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:4 msgid "Sync" msgstr "同步" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:53 msgid "Sync automatically" msgstr "自動同步" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:8 msgid "Sync host" msgstr "同步主機" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:68 msgid "Sync hotkeys" msgstr "同步快速鍵" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80 msgid "Sync Vault" msgstr "同步金鑰庫" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74 msgid "Sync window settings" msgstr "同步視窗設定" #: tabby-core/src/hotkeys.ts:100 #: tabby-core/src/hotkeys.ts:104 #: tabby-core/src/hotkeys.ts:108 #: tabby-core/src/hotkeys.ts:112 #: tabby-core/src/hotkeys.ts:116 #: tabby-core/src/hotkeys.ts:120 #: tabby-core/src/hotkeys.ts:124 #: tabby-core/src/hotkeys.ts:128 #: tabby-core/src/hotkeys.ts:132 #: tabby-core/src/hotkeys.ts:136 #: tabby-core/src/hotkeys.ts:140 #: tabby-core/src/hotkeys.ts:144 #: tabby-core/src/hotkeys.ts:148 #: tabby-core/src/hotkeys.ts:152 #: tabby-core/src/hotkeys.ts:76 #: tabby-core/src/hotkeys.ts:80 #: tabby-core/src/hotkeys.ts:84 #: tabby-core/src/hotkeys.ts:88 #: tabby-core/src/hotkeys.ts:92 #: tabby-core/src/hotkeys.ts:96 msgid "Tab {number}" msgstr "分頁 {number}" #: tabby-core/src/tabContextMenu.ts:223 msgid "Tab activity" msgstr "分頁活動" #: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3 msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:" msgstr "Tabby無法載入您的擴充套件,所以在所有第三方擴充套件已被停用。錯誤是:" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41 msgid "Tabby news and updates on Twitter" msgstr "Tabby 在 Twitter 上的新消息與更新" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:123 msgid "Tabs" msgstr "分頁" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:126 msgid "Tabs location" msgstr "分頁位置" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:141 msgid "Tabs width" msgstr "標籤頁寬度" #: tabby-telnet/src/profiles.ts:34 msgid "Telnet session" msgstr "Telnet 階段" #: tabby-terminal/src/api/baseTerminalTab.component.ts:210 #: tabby-terminal/src/settings.ts:43 msgid "Terminal" msgstr "終端機" #: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:40 msgid "Terminal background" msgstr "終端機背景" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:133 msgid "Terminal bell" msgstr "終端鈴聲" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82 msgid "Terminal identification" msgstr "終端標示" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7 msgid "Thank you for downloading Tabby!" msgstr "感謝您下載 Tabby!" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5 msgid "Theme" msgstr "風格" #: tabby-core/src/components/transfersMenu.component.ts:47 msgid "There are active file transfers" msgstr "正在進行檔案傳輸" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102 msgid "There is a saved password for this connection" msgstr "此次連線可使用已儲存密碼" #: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102 msgid "These apply to all profiles of a given type" msgstr "這些影響所有給定類型的設定檔" #: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17 msgid "These apply to all profiles of a given type in this group" msgstr "這些將套用於此群組中所有具有特定類型的設定檔" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59 msgid "Thin" msgstr "窄邊" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:205 msgid "Tick this if you're experiencing aliasing, ghosting or other visual issues" msgstr "如果您看到鋸齒或鬼影,請勾選此選項" #: tabby-core/src/hotkeys.ts:20 msgid "Toggle fullscreen mode" msgstr "全螢幕模式切換" #: tabby-core/src/hotkeys.ts:36 msgid "Toggle last tab" msgstr "切換至最後一個分頁" #: tabby-electron/src/hotkeys.ts:14 msgid "Toggle terminal window" msgstr "切換終端機視窗" #: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40 msgid "Toggles the Tabby window visibility" msgstr "切換Tabby視窗的可見度" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130 #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74 msgid "Top" msgstr "頂部" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:123 msgid "Trim whitespace and newlines" msgstr "去除空白和空行" #: tabby-core/src/services/config.service.ts:428 msgid "Try again" msgstr "重試" #: tabby-ssh/src/session/ssh.ts:476 msgid "Trying saved password" msgstr "以儲存的密碼嘗試" #: tabby-core/src/hotkeys.ts:68 msgid "Turn current tab's panes into separate tabs" msgstr "把當前分頁的窗格轉換為分頁" #: tabby-core/src/services/profiles.service.ts:418 #: tabby-settings/src/components/profilesSettingsTab.component.ts:10 msgid "Ungrouped" msgstr "未分類的" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:59 msgid "Uninstall" msgstr "解除安裝" #: tabby-settings/src/components/profilesSettingsTab.component.ts:269 msgid "Unknown" msgstr "未知的" #: tabby-settings/src/components/vaultSettingsTab.component.ts:98 msgid "Unknown secret of type {type} for {key}" msgstr "密鑰{key}的密鑰類型{type}未知" #: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4 msgid "Unpin" msgstr "取消釘選" #: tabby-core/src/tabContextMenu.ts:81 msgid "Up" msgstr "上方" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14 #: tabby-electron/src/services/updater.service.ts:133 msgid "Update" msgstr "更新" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52 msgid "Upgrade to {version}" msgstr "升級至版本 {version}" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42 #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10 msgid "Upload" msgstr "上傳" #: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:46 msgid "Upload as a new config" msgstr "以新的設定檔上傳" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:39 msgid "Use {altKeyName} as the Meta key" msgstr "使用{altKeyName}為Meta鍵" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:5 msgid "Use ConPTY" msgstr "使用 ConPTY" #: tabby-electron/src/shells/linuxDefault.ts:31 #: tabby-electron/src/shells/linuxDefault.ts:38 msgid "User default" msgstr "使用者預設" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:70 msgid "Username" msgstr "使用者名稱:" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25 msgid "Using CONNECT method" msgstr "連線方式" #: tabby-ssh/src/session/ssh.ts:465 msgid "Using preset password" msgstr "使用預設密碼" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9 msgid "Vault" msgstr "金鑰庫" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4 msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases." msgstr "Vault是一個永遠加密的存儲空間,用來存放SSH密碼和私鑰的密碼。" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17 msgid "Vault is empty" msgstr "金鑰庫是空的" #: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4 #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44 msgid "Vault is locked" msgstr "金鑰庫已被鎖定" #: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3 msgid "Vault is not configured" msgstr "金鑰庫未設定" #: tabby-core/src/services/fileProviders.service.ts:40 msgid "Vault master passphrase needs to be set to allow storing secrets" msgstr "須設定Vault的主密碼以存儲密鑰" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11 msgid "Verify host keys when connecting" msgstr "連線時驗證主機金鑰" #: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75 msgid "Version" msgstr "版本" #: locale/tmp-html/tabby-core/src/components/startPage.component.html:13 msgid "Version: {version}" msgstr "版本:{version}" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:28 msgid "Vibrancy" msgstr "Vibrancy" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:139 msgid "Visual" msgstr "視覺" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116 msgid "Warn on multi-line paste" msgstr "貼上多行時警告" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5 msgid "Warn when closing active connections" msgstr "關閉連線中的視窗時警告" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6 msgid "Warning: remote host's key has suddenly changed!" msgstr "警告:遠端主機金鑰突然改變!" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:67 msgid "We're only tracking your Tabby and OS versions." msgstr "我們只會記錄Tabby和作業系統版本。" #: tabby-core/src/components/welcomeTab.component.ts:25 msgid "Welcome" msgstr "歡迎使用" #: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36 msgid "What's new" msgstr "最新消息" #: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46 msgid "When a session ends" msgstr "當連線階段結束" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82 msgid "When enabled, links are only clickable while holding this key" msgstr "啟用後,需按著此鍵才可打開連結" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18 msgid "When WinSCP is detected, you can launch an SCP session from the context menu." msgstr "當偵測到WinSCP時,您可以通過快顯功能表開啟SCP階段" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53 msgid "Whether a custom window or an OS native window should be used" msgstr "使用自訂視窗或是使用作業系統視窗" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141 msgid "Will prevent the SSH greeting from showing up" msgstr "將防止顯示 SSH 問候語。" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2 #: tabby-settings/src/settings.ts:30 msgid "Window" msgstr "視窗" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:112 msgid "Window dimension along the edge" msgstr "沿著邊緣的視窗尺寸" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105 msgid "Window dimension away from the edge" msgstr "距離邊緣的視窗尺寸" #: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52 msgid "Window frame" msgstr "視窗邊框" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:165 msgid "Windows" msgstr "視窗" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:11 msgid "Windows 10 build 18309 or above is recommended for ConPTY" msgstr "推薦在 Windows 10 版本 18309 或以上使用 ConPTY" #: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17 msgid "WinSCP path" msgstr "WinSCP 路徑" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74 msgid "Word separators" msgstr "分隔字元" #: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:10 msgid "Working directory" msgstr "工作目錄" #: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:15 #: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:6 msgid "Working directory detection" msgstr "偵測工作目錄" #: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:145 msgid "WSL terminal bell can only be muted via Volume Mixer" msgstr "WSL終端機鈴聲只能通過混音器靜音" #: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14 msgid "WSL terminal only supports TrueColor with ConPTY" msgstr "WSL終端機只支援ConPTY真彩色" #: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128 msgid "X11 forwarding" msgstr "X11 轉發" #: tabby-core/src/utils.ts:65 msgid "Yellow" msgstr "黃色" #: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4 msgid "You can change it later, but it's unrecoverable if forgotten." msgstr "您可以稍後修改,但如果忘了就沒了" #: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7 msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed." msgstr "您可能正受到中間人攻擊,或是主機金鑰可能已經改變" #: tabby-terminal/src/hotkeys.ts:54 msgid "Zoom in" msgstr "放大" #: tabby-terminal/src/hotkeys.ts:58 msgid "Zoom out" msgstr "縮小" #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:43 #: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5 msgctxt "[Dynamic] port forwarding" msgid "id.port-forwarding.dynamic" msgstr "動態通訊埠轉發" ================================================ FILE: package.json ================================================ { "devDependencies": { "@angular/animations": "^15.2.6", "@angular/cdk": "^15.2.6", "@angular/common": "^15.2.6", "@angular/compiler": "^15.2.6", "@angular/compiler-cli": "^15.2.6", "@angular/core": "^15.2.6", "@angular/forms": "^15.2.6", "@angular/localize": "^15.2.9", "@angular/platform-browser": "^15.2.6", "@angular/platform-browser-dynamic": "^15.2.6", "@biesbjerg/ngx-translate-extract-marker": "^1.0.0", "@electron/notarize": "^1.2.3", "@electron/rebuild": "^4", "@fortawesome/fontawesome-free": "^6.4.0", "@ng-bootstrap/ng-bootstrap": "^14.1.0", "@ngtools/webpack": "^15.2.5", "@popperjs/core": "^2.11.6", "@sentry/cli": "^2.18.1", "@sentry/electron": "^2.5.4", "@tabby-gang/to-string-loader": "^1.1.7-beta.2", "@types/deep-equal": "1.0.1", "@types/electron-debug": "^2.1.0", "@types/fs-extra": "^9.0.13", "@types/js-yaml": "^4.0.5", "@types/node": "^20.3.1", "@typescript-eslint/eslint-plugin": "^6.4.1", "@typescript-eslint/parser": "^6.4.1", "apply-loader": "2.0.0", "axios": "^1.4.0", "babel-loader": "^9.1.2", "browserify-sign": "^4.2.1", "clone-deep": "^4.0.1", "compare-versions": "^5", "core-js": "^3.31.0", "core-js-pure": "^3.21.1", "cross-env": "7.0.3", "css-loader": "^6.7.3", "deep-equal": "2.0.5", "electron": "38", "electron-builder": "^26.0", "electron-download": "^4.1.1", "electron-installer-snap": "^5.1.0", "eslint": "^8.48.0", "eslint-import-resolver-typescript": "^3.6.0", "eslint-plugin-import": "^2.28.1", "filesize": "^9", "file-loader": "^6.2.0", "gettext-extractor": "^3.8.0", "graceful-fs": "^4.2.10", "html-loader": "4.2.0", "json-loader": "^0.5.7", "lru-cache": "^6.0.0", "macos-release": "^3.3.0", "ngx-toastr": "^16.0.2", "ngx-filesize": "^3.0.2", "node-abi": "^4", "npmlog": "6.0.2", "npx": "^10.2.2", "patch-package": "^6.4.7", "po-gettext-loader": "^1.0.0", "pug": "3", "pug-cli": "^1.0.0-alpha6", "pug-html-loader": "1.1.5", "pug-lint": "^2.6.0", "pug-loader": "^2.4.0", "pug-static-loader": "2.0.0", "raw-loader": "4.0.2", "rxjs": "^7.5.7", "sass": "^1.63.4", "sass-loader": "^13.2.0", "shell-quote": "^1.7.4", "shelljs": "0.8.5", "slugify": "^1.6.5", "source-code-pro": "^2.38.0", "source-map-loader": "^4.0.1", "source-sans-pro": "3.6.0", "style-loader": "^3.3.1", "svg-inline-loader": "^0.8.2", "thenby": "^1.3.4", "ts-loader": "^9.4.2", "tsimportlib": "^0.0.3", "tslib": "^2.5.0", "typedoc": "^0.22.18", "typescript": "^4.9.5", "utils-decorators": "^2.0.6", "val-loader": "5.0.1", "webpack": "^5.90.0", "webpack-bundle-analyzer": "^4.7.0", "webpack-cli": "^5.0.1", "yaml-loader": "0.8.0", "zone.js": "^0.13.0" }, "resolutions": { "*/pug": "^3", "lzma-native": "^8.0.6", "**/graceful-fs": "^4.2.4", "nan": "2.22.2", "node-abi": "^4", "node-gyp": "^10.0.0" }, "scripts": { "build": "npm run build:typings && node scripts/build-modules.mjs", "build:typings": "node scripts/build-typings.mjs", "watch": "cross-env TABBY_DEV=1 webpack --progress --color --watch", "start": "cross-env TABBY_DEV=1 electron app -d --inspect", "start:prod": "electron app --debug", "prod": "cross-env TABBY_DEV=1 electron app", "docs": "node scripts/build-docs.mjs", "lint": "eslint --ext ts */src */lib", "postinstall": "patch-package && node ./scripts/install-deps.mjs && node ./scripts/build-native.mjs", "i18n:pull": "crowdin pull --skip-untranslated-strings", "i18n:extract": "node scripts/i18n-extract.mjs", "i18n:push": "crowdin push" }, "type": "module", "private": true, "dependencies": { "dotenv": "^16.3.1" } } ================================================ FILE: patches/app-builder-lib+26.0.12.patch ================================================ diff --git a/node_modules/app-builder-lib/out/appInfo.js b/node_modules/app-builder-lib/out/appInfo.js index d159c17..eb48466 100644 --- a/node_modules/app-builder-lib/out/appInfo.js +++ b/node_modules/app-builder-lib/out/appInfo.js @@ -116,9 +116,7 @@ class AppInfo { return this.info.metadata.name; } get linuxPackageName() { - const name = this.name; - // https://github.com/electron-userland/electron-builder/issues/2963 - return name.startsWith("@") ? this.sanitizedProductName : name; + return 'tabby-terminal'; } get sanitizedName() { return (0, filename_1.sanitizeFileName)(this.name); ================================================ FILE: scripts/build-docs.mjs ================================================ #!/usr/bin/env node import sh from 'shelljs' import * as vars from './vars.mjs' import log from 'npmlog' vars.packagesWithDocs.forEach(([dest, src]) => { log.info('docs', src) sh.exec(`yarn typedoc --out docs/api/${dest} --tsconfig ${src}/tsconfig.typings.json ${src}/src/index.ts`, { fatal: true }) }) ================================================ FILE: scripts/build-linux.mjs ================================================ #!/usr/bin/env node /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ import { build as builder } from 'electron-builder' import * as vars from './vars.mjs' const isTag = (process.env.GITHUB_REF || '').startsWith('refs/tags/') process.env.ARCH = (process.env.ARCH || process.arch) === 'arm' ? 'armv7l' : process.env.ARCH || process.arch builder({ dir: true, linux: ['deb', 'tar.gz', 'rpm', 'pacman', 'appimage'], armv7l: process.env.ARCH === 'armv7l', arm64: process.env.ARCH === 'arm64', config: { npmRebuild: false, extraMetadata: { version: vars.version, }, publish: process.env.KEYGEN_TOKEN ? [ vars.keygenConfig, { provider: 'github', channel: `latest-${process.env.ARCH}`, }, ] : undefined, }, publish: (process.env.KEYGEN_TOKEN && isTag) ? 'always' : 'never', }).catch(e => { console.error(e) process.exit(1) }) ================================================ FILE: scripts/build-macos.mjs ================================================ #!/usr/bin/env node /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ import { build as builder } from 'electron-builder' import * as vars from './vars.mjs' const isTag = (process.env.GITHUB_REF || '').startsWith('refs/tags/') process.env.ARCH = process.env.ARCH || process.arch if (process.env.GITHUB_HEAD_REF) { delete process.env.CSC_LINK delete process.env.CSC_KEY_PASSWORD process.env.CSC_IDENTITY_AUTO_DISCOVERY = 'false' } process.env.APPLE_ID ??= process.env.APPSTORE_USERNAME process.env.APPLE_APP_SPECIFIC_PASSWORD ??= process.env.APPSTORE_PASSWORD builder({ dir: true, mac: ['dmg', 'zip'], x64: process.env.ARCH === 'x86_64', arm64: process.env.ARCH === 'arm64', config: { extraMetadata: { version: vars.version, teamId: process.env.APPLE_TEAM_ID, }, mac: { identity: !process.env.CI || process.env.CSC_LINK ? undefined : null, notarize: !!process.env.APPLE_TEAM_ID, }, npmRebuild: process.env.ARCH !== 'arm64', publish: process.env.KEYGEN_TOKEN ? [ vars.keygenConfig, { provider: 'github', channel: `latest-${process.env.ARCH}`, }, ] : undefined, }, publish: (process.env.KEYGEN_TOKEN && isTag) ? 'always' : 'never', }).catch(e => { console.error(e) process.exit(1) }) ================================================ FILE: scripts/build-modules.mjs ================================================ #!/usr/bin/env node import * as vars from './vars.mjs' import log from 'npmlog' import webpack from 'webpack' import { promisify } from 'node:util' const configs = [ '../app/webpack.config.main.mjs', '../app/webpack.config.mjs', ...vars.allPackages.map(x => `../${x}/webpack.config.mjs`), ] ;(async () => { for (const c of configs) { log.info('build', c) const stats = await promisify(webpack)((await import(c)).default()) console.log(stats.toString({ colors: true })) if (stats.hasErrors()) { process.exit(1) } } })() ================================================ FILE: scripts/build-native.mjs ================================================ #!/usr/bin/env node import { rebuild } from '@electron/rebuild' import * as path from 'path' import * as vars from './vars.mjs' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) if (process.platform === 'win32' || process.platform === 'linux') { process.env.ARCH = ((process.env.ARCH || process.arch) === 'arm') ? 'armv7l' : process.env.ARCH || process.arch } else { process.env.ARCH ??= process.arch } let lifecycles = [] for (let dir of ['app', 'tabby-core', 'tabby-local', 'tabby-ssh', 'tabby-terminal']) { const build = rebuild({ buildPath: path.resolve(__dirname, '../' + dir), electronVersion: vars.electronVersion, arch: process.env.ARCH, force: true, }) build.catch(e => { console.error(e) process.exit(1) }) lifecycles.push([build.lifecycle, dir]) } console.info('Building against Electron', vars.electronVersion) for (let [lc, dir] of lifecycles) { lc.on('module-found', name => { console.info('Rebuilding', dir + '/' + name) }) } ================================================ FILE: scripts/build-typings.mjs ================================================ #!/usr/bin/env node import sh from 'shelljs' import * as vars from './vars.mjs' import log from 'npmlog' vars.builtinPlugins.forEach(plugin => { log.info('typings', plugin) sh.exec(`yarn tsc --project ${plugin}/tsconfig.typings.json`, { fatal: true }) }) ================================================ FILE: scripts/build-windows.mjs ================================================ #!/usr/bin/env node /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ import { build as builder } from 'electron-builder' import * as vars from './vars.mjs' import { execSync } from 'child_process' const isTag = (process.env.GITHUB_REF || process.env.BUILD_SOURCEBRANCH || '').startsWith('refs/tags/') const keypair = process.env.SM_KEYPAIR_ALIAS process.env.ARCH = process.env.ARCH || process.arch console.log('Signing enabled:', !!keypair) builder({ dir: true, win: ['nsis', 'zip'], arm64: process.env.ARCH === 'arm64', config: { extraMetadata: { version: vars.version, }, publish: process.env.KEYGEN_TOKEN ? [ vars.keygenConfig, { provider: 'github', channel: `latest-${process.env.ARCH}`, }, ] : undefined, forceCodeSigning: !!keypair, win: { signtoolOptions: { certificateSha1: process.env.SM_CODE_SIGNING_CERT_SHA1_HASH, publisherName: process.env.SM_PUBLISHER_NAME, signingHashAlgorithms: ['sha256'], sign: keypair ? async function (configuration) { console.log('Signing', configuration) if (configuration.path) { try { const cmd = `smctl sign --keypair-alias=${keypair} --input "${String(configuration.path)}"` console.log(cmd) const out = execSync(cmd) if (out.toString().includes('FAILED')) { throw new Error(out.toString()) } console.log(out.toString()) } catch (e) { console.error(`Failed to sign ${configuration.path}`) if (e.stdout) { console.error('stdout:', e.stdout.toString()) } if (e.stderr) { console.error('stderr:', e.stderr.toString()) } console.error(e) process.exit(1) } } } : undefined, }, }, }, publish: (process.env.KEYGEN_TOKEN && isTag) ? 'always' : 'never', }).catch(e => { console.error(e) process.exit(1) }) ================================================ FILE: scripts/generate-icon-metadata.mjs ================================================ #!/usr/bin/env node import jsYaml from 'js-yaml' import fs from 'node:fs' import path from 'node:path' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) const metadata = jsYaml.load(fs.readFileSync(path.resolve(__dirname, '../node_modules/@fortawesome/fontawesome-free/metadata/icons.yml'))) let result = {} for (let key in metadata) { result[key] = metadata[key].styles.map(x => x[0]) } fs.writeFileSync(path.resolve(__dirname, '../tabby-core/src/icons.json'), JSON.stringify(result)) ================================================ FILE: scripts/i18n-extract.mjs ================================================ #!/usr/bin/env node import sh from 'shelljs' import fs from 'node:fs/promises' import * as vars from './vars.mjs' import log from 'npmlog' import { GettextExtractor, JsExtractors, HtmlExtractors } from 'gettext-extractor' let extractor = new GettextExtractor() const tempOutput = 'locale/app.new.pot' const pot = 'locale/app.pot' const tempHtml = 'locale/tmp-html' ;(async () => { sh.mkdir('-p', tempHtml) for (const plugin of vars.builtinPlugins) { log.info('compile-pug', plugin) sh.exec(`yarn pug --doctype html -s --pretty -O '{require: function(){}}' -o ${tempHtml}/${plugin} ${plugin}`, { fatal: true }) } log.info('extract-ts') extractor.createJsParser([ JsExtractors.callExpression('this.translate.instant', { arguments: { text: 0 }, }), JsExtractors.callExpression('translate.instant', { arguments: { text: 0 }, }), JsExtractors.callExpression('_', { arguments: { text: 0 }, }), ]).parseFilesGlob('./tabby-*/src/**/*.ts') log.info('extract-pug') const options = { attributes: { context: 'translatecontext', }, } extractor.createHtmlParser([ HtmlExtractors.elementContent('translate, [translate=""]', options), HtmlExtractors.elementAttribute('[translate*=" "]', 'translate', options), ]).parseFilesGlob(`${tempHtml}/**/*.html`) extractor.savePotFile(tempOutput) extractor.printStats() sh.rm('-r', tempHtml) sh.exec(`msgcat -s ${tempOutput} > ${pot}`, { fatal: true }) await fs.rename(tempOutput, pot) })() ================================================ FILE: scripts/install-deps.mjs ================================================ #!/usr/bin/env node import sh from 'shelljs' import * as vars from './vars.mjs' import log from 'npmlog' log.info('patch') sh.exec(`yarn patch-package`, { fatal: true }) log.info('deps', 'app') sh.cd('app') sh.exec(`yarn install --force --network-timeout 1000000`, { fatal: true }) // Some native packages might fail to build before patch-package gets a chance to run via postinstall sh.exec(`yarn postinstall`, { fatal: false }) sh.cd('..') sh.cd('web') sh.exec(`yarn install --force --network-timeout 1000000`, { fatal: true }) sh.exec(`yarn patch-package`, { fatal: true }) sh.cd('..') vars.allPackages.forEach(plugin => { log.info('deps', plugin) sh.cd(plugin) sh.exec(`yarn install --force --network-timeout 1000000`, { fatal: true }) sh.cd('..') }) if (['darwin', 'linux'].includes(process.platform)) { sh.cd('node_modules') for (let x of vars.builtinPlugins) { sh.ln('-fs', '../' + x, x) } sh.cd('..') } ================================================ FILE: scripts/prepackage-plugins.mjs ================================================ #!/usr/bin/env node import { rebuild } from '@electron/rebuild' import sh from 'shelljs' import path from 'node:path' import fs from 'node:fs' import * as vars from './vars.mjs' import log from 'npmlog' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) let target = path.resolve(__dirname, '../builtin-plugins') sh.mkdir('-p', target) fs.writeFileSync(path.join(target, 'package.json'), '{}') sh.cd(target) vars.builtinPlugins.forEach(plugin => { if (plugin === 'tabby-web') { return } log.info('install', plugin) sh.cp('-r', path.join('..', plugin), '.') sh.rm('-rf', path.join(plugin, 'node_modules')) sh.cd(plugin) sh.exec(`yarn install --force --production`, { fatal: true }) log.info('rebuild', 'native') if (fs.existsSync('node_modules')) { rebuild({ buildPath: path.resolve('.'), electronVersion: vars.electronVersion, arch: process.env.ARCH ?? process.arch, force: true, useCache: false, }) } sh.cd('..') }) fs.unlinkSync(path.join(target, 'package.json'), '{}') ================================================ FILE: scripts/publish-plugins.mjs ================================================ #!/usr/bin/env node import sh from 'shelljs' import * as vars from './vars.mjs' import log from 'npmlog' import { execSync } from 'child_process' vars.allPackages.forEach(plugin => { log.info('bump', plugin) sh.cd(plugin) sh.exec('npm --no-git-tag-version version ' + vars.version, { fatal: true }) execSync('npm publish --tag latest', { stdio: 'inherit' }) sh.cd('..') }) ================================================ FILE: scripts/sentry-upload.mjs ================================================ #!/usr/bin/env node import sh from 'shelljs' import * as vars from './vars.mjs' const sentryCli = process.platform === 'win32' ? 'node_modules\\.bin\\sentry-cli.cmd' : 'sentry-cli' sh.exec(`${sentryCli} releases new ${vars.version}`) if (process.platform === 'darwin') { for (const path of [ 'app/node_modules/@serialport/bindings/build/Release/bindings.node', 'app/node_modules/node-pty/build/Release/pty.node', 'app/node_modules/fontmanager-redux/build/Release/fontmanager.node', 'app/node_modules/macos-native-processlist/build/Release/native.node', ]) { sh.exec('dsymutil ' + path) } } sh.exec(`${sentryCli} upload-dif app/node_modules`) sh.exec(`${sentryCli} releases set-commits --auto ${vars.version}`) for (const p of vars.builtinPlugins) { sh.exec(`${sentryCli} releases files ${vars.version} upload-sourcemaps ${p}/dist -u ${p}/dist/ -d ${process.platform}-${p}`) } ================================================ FILE: scripts/vars.mjs ================================================ import * as path from 'path' import * as fs from 'fs' import * as semver from 'semver' import * as childProcess from 'child_process' process.env.ARCH = ((process.env.ARCH || process.arch) === 'arm') ? 'armv7l' : (process.env.ARCH || process.arch) import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) const electronInfo = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../node_modules/electron/package.json'))) export let version = childProcess.execSync('git describe --tags', { encoding:'utf-8' }) version = version.substring(1).trim() version = version.replace('-', '-c') if (version.includes('-c')) { version = semver.inc(version, 'prepatch').replace('-0', `-nightly.${process.env.REV ?? 0}`) } export const builtinPlugins = [ 'tabby-core', 'tabby-settings', 'tabby-terminal', 'tabby-web', 'tabby-community-color-schemes', 'tabby-ssh', 'tabby-serial', 'tabby-telnet', 'tabby-local', 'tabby-electron', 'tabby-plugin-manager', 'tabby-linkifier', 'tabby-auto-sudo-password', ] export const packagesWithDocs = [ ['.', 'tabby-core'], ['terminal', 'tabby-terminal'], ['local', 'tabby-local'], ['settings', 'tabby-settings'], ] export const allPackages = [ ...builtinPlugins, 'web', 'tabby-web-demo', ] export const bundledModules = [ '@angular', '@ng-bootstrap', ] export const electronVersion = electronInfo.version export const keygenConfig = { provider: 'keygen', account: 'a06315f2-1031-47c6-9181-e92a20ec815e', channel: 'stable', product: { win32: { x64: 'f481b9d6-d5da-4970-b926-f515373e986f', arm64: '950999b9-371c-419b-b291-938c5e4d364c', }[process.env.ARCH], darwin: { arm64: '98fbadee-c707-4cd6-9d99-56683595a846', x86_64: 'f5a48841-d5b8-4b7b-aaa7-cf5bffd36461', x64: 'f5a48841-d5b8-4b7b-aaa7-cf5bffd36461', }[process.env.ARCH], linux: { x64: '7bf45071-3031-4a26-9f2e-72604308313e', arm64: '39e3c736-d4d4-4fbf-a201-324b7bab0d17', armv7l: '50ae0a82-7f47-4fa4-b0a8-b0d575ce9409', armhf: '7df5aa12-04ab-4075-a0fe-93b0bbea9643', }[process.env.ARCH], }[process.platform], } if (!keygenConfig.product) { throw new Error(`Unrecognized platform ${process.platform}/${process.env.ARCH}`) } ================================================ FILE: snap/snapcraft.yaml ================================================ name: tabby version: '1.0.0' summary: A terminal for a modern age description: | Tabby is a local, SSH and serial terminal heavily inspired by Hyper. grade: devel confinement: devmode apps: tabby: command: opt/tabby/tabby parts: app: plugin: nodejs source: . build-packages: - libfontconfig-dev override-build: | yarn yarn run build ./scripts/build-linux.js mkdir -p $SNAPCRAFT_PART_INSTALL/opt/tabby || true cp -ar dist/linux-unpacked/* $SNAPCRAFT_PART_INSTALL/opt/tabby/ ================================================ FILE: tabby-auto-sudo-password/package.json ================================================ { "name": "tabby-auto-sudo-password", "version": "1.0.231-nightly.0", "description": "Offers to automatically paste saved sudo password in SSH sessions", "keywords": [ "tabby-builtin-plugin" ], "main": "dist/index.js", "typings": "typings/index.d.ts", "scripts": { "build": "webpack --progress --color --display-modules", "watch": "webpack --progress --color --watch" }, "files": [ "dist", "typings" ], "devDependencies": { "ansi-colors": "^4.1.1" }, "author": "Tabby Developers", "license": "MIT" } ================================================ FILE: tabby-auto-sudo-password/src/decorator.ts ================================================ import colors from 'ansi-colors' import { Injectable } from '@angular/core' import { TerminalDecorator, BaseTerminalTabComponent, XTermFrontend, SessionMiddleware } from 'tabby-terminal' import { SSHProfile, SSHTabComponent, PasswordStorageService } from 'tabby-ssh' const SUDO_PROMPT_REGEX = /^\[sudo\] password for ([^:]+):\s*$/im export class AutoSudoPasswordMiddleware extends SessionMiddleware { private pendingPasswordToPaste: string | null = null private pasteHint = `${colors.black.bgBlackBright(' Tabby ')} ${colors.gray('Press Enter to paste saved password')}` private pasteHintLength = colors.stripColor(this.pasteHint).length constructor ( private profile: SSHProfile, private ps: PasswordStorageService, ) { super() } feedFromSession (data: Buffer): void { const text = data.toString('utf-8') const match = SUDO_PROMPT_REGEX.exec(text) if (match) { const username = match[1] this.handlePrompt(username) } this.outputToTerminal.next(data) } feedFromTerminal (data: Buffer): void { if (this.pendingPasswordToPaste) { const backspaces = Buffer.alloc(this.pasteHintLength, 8) // backspace const spaces = Buffer.alloc(this.pasteHintLength, 32) // space const clear = Buffer.concat([backspaces, spaces, backspaces]) this.outputToTerminal.next(clear) if (data.length === 1 && data[0] === 13) { // Enter key this.outputToSession.next(Buffer.from(this.pendingPasswordToPaste + '\n')) this.pendingPasswordToPaste = null return } else { this.pendingPasswordToPaste = null } } this.outputToSession.next(data) } async handlePrompt (username: string): Promise { console.log(`Detected sudo prompt for user: ${username}`) const pw = await this.ps.loadPassword(this.profile, username) if (pw) { this.outputToTerminal.next(Buffer.from(this.pasteHint)) this.pendingPasswordToPaste = pw } } async loadPassword (username: string): Promise { if (this.profile.options.user !== username) { return null } return this.ps.loadPassword(this.profile, username) } } @Injectable() export class AutoSudoPasswordDecorator extends TerminalDecorator { constructor ( private ps: PasswordStorageService, ) { super() } private attachToSession (tab: SSHTabComponent) { if (!tab.session) { return } tab.session.middleware.unshift(new AutoSudoPasswordMiddleware(tab.profile, this.ps)) } attach (tab: BaseTerminalTabComponent): void { if (!(tab.frontend instanceof XTermFrontend) || !(tab instanceof SSHTabComponent)) { return } setTimeout(() => { this.attachToSession(tab) this.subscribeUntilDetached(tab, tab.sessionChanged$.subscribe(() => { this.attachToSession(tab) })) }) } } ================================================ FILE: tabby-auto-sudo-password/src/index.ts ================================================ /* eslint-disable @typescript-eslint/no-extraneous-class */ import { NgModule } from '@angular/core' import { ToastrModule } from 'ngx-toastr' import { TerminalDecorator } from 'tabby-terminal' import { AutoSudoPasswordDecorator } from './decorator' @NgModule({ imports: [ ToastrModule, ], providers: [ { provide: TerminalDecorator, useClass: AutoSudoPasswordDecorator, multi: true }, ], }) export default class AutoSudoPasswordModule { } ================================================ FILE: tabby-auto-sudo-password/tsconfig.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist"], "compilerOptions": { "baseUrl": "src", } } ================================================ FILE: tabby-auto-sudo-password/tsconfig.typings.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "compilerOptions": { "baseUrl": "src", "emitDeclarationOnly": true, "declaration": true, "declarationDir": "./typings", "paths": { "tabby-*": ["../../tabby-*"], "*": ["../../app/node_modules/*"] } } } ================================================ FILE: tabby-auto-sudo-password/webpack.config.mjs ================================================ import * as path from 'path' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) import config from '../webpack.plugin.config.mjs' export default () => config({ name: 'auto-sudo-password', dirname: __dirname, }) ================================================ FILE: tabby-community-color-schemes/.editorconfig ================================================ [schemes/*] indent_style = space indent_size = 15 ================================================ FILE: tabby-community-color-schemes/package.json ================================================ { "name": "tabby-community-color-schemes", "version": "1.0.231-nightly.0", "description": "Community color schemes for Tabby", "keywords": [ "tabby-builtin-plugin" ], "main": "dist/index.js", "typings": "typings/index.d.ts", "scripts": { "build": "webpack --progress --color", "watch": "webpack --progress --color --watch" }, "files": [ "dist" ], "author": "Tabby Developers", "license": "MIT", "peerDependencies": { "@angular/core": "^15", "tabby-core": "*", "tabby-terminal": "*" } } ================================================ FILE: tabby-community-color-schemes/schemes/3024 Day ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #4a4543 *.background: #f7f7f7 *.cursorColor: #4a4543 ! ! Black *.color0: #090300 *.color8: #5c5855 ! ! Red *.color1: #db2d20 *.color9: #e8bbd0 ! ! Green *.color2: #01a252 *.color10: #3a3432 ! ! Yellow *.color3: #fded02 *.color11: #4a4543 ! ! Blue *.color4: #01a0e4 *.color12: #807d7c ! ! Magenta *.color5: #a16a94 *.color13: #d6d5d4 ! ! Cyan *.color6: #b5e4f4 *.color14: #cdab53 ! ! White *.color7: #a5a2a2 *.color15: #f7f7f7 ! ! Bold, Italic, Underline *.colorBD: #4a4543 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/3024 Night ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #a5a2a2 *.background: #090300 *.cursorColor: #a5a2a2 ! ! Black *.color0: #090300 *.color8: #5c5855 ! ! Red *.color1: #db2d20 *.color9: #e8bbd0 ! ! Green *.color2: #01a252 *.color10: #3a3432 ! ! Yellow *.color3: #fded02 *.color11: #4a4543 ! ! Blue *.color4: #01a0e4 *.color12: #807d7c ! ! Magenta *.color5: #a16a94 *.color13: #d6d5d4 ! ! Cyan *.color6: #b5e4f4 *.color14: #cdab53 ! ! White *.color7: #a5a2a2 *.color15: #f7f7f7 ! ! Bold, Italic, Underline *.colorBD: #a5a2a2 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/AdventureTime ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #f8dcc0 *.background: #1f1d45 *.cursorColor: #efbf38 ! ! Black *.color0: #050404 *.color8: #4e7cbf ! ! Red *.color1: #bd0013 *.color9: #fc5f5a ! ! Green *.color2: #4ab118 *.color10: #9eff6e ! ! Yellow *.color3: #e7741e *.color11: #efc11a ! ! Blue *.color4: #0f4ac6 *.color12: #1997c6 ! ! Magenta *.color5: #665993 *.color13: #9b5953 ! ! Cyan *.color6: #70a598 *.color14: #c8faf4 ! ! White *.color7: #f8dcc0 *.color15: #f6f5fb ! ! Bold, Italic, Underline *.colorBD: #bd0013 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Afterglow ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #d0d0d0 *.background: #212121 *.cursorColor: #d0d0d0 ! ! Black *.color0: #151515 *.color8: #505050 ! ! Red *.color1: #ac4142 *.color9: #ac4142 ! ! Green *.color2: #7e8e50 *.color10: #7e8e50 ! ! Yellow *.color3: #e5b567 *.color11: #e5b567 ! ! Blue *.color4: #6c99bb *.color12: #6c99bb ! ! Magenta *.color5: #9f4e85 *.color13: #9f4e85 ! ! Cyan *.color6: #7dd6cf *.color14: #7dd6cf ! ! White *.color7: #d0d0d0 *.color15: #f5f5f5 ! ! Bold, Italic, Underline *.colorBD: #d0d0d0 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/AlienBlood ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #637d75 *.background: #0f1610 *.cursorColor: #73fa91 ! ! Black *.color0: #112616 *.color8: #3c4812 ! ! Red *.color1: #7f2b27 *.color9: #e08009 ! ! Green *.color2: #2f7e25 *.color10: #18e000 ! ! Yellow *.color3: #717f24 *.color11: #bde000 ! ! Blue *.color4: #2f6a7f *.color12: #00aae0 ! ! Magenta *.color5: #47587f *.color13: #0058e0 ! ! Cyan *.color6: #327f77 *.color14: #00e0c4 ! ! White *.color7: #647d75 *.color15: #73fa91 ! ! Bold, Italic, Underline *.colorBD: #7afa87 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Argonaut ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #fffaf4 *.background: #0e1019 *.cursorColor: #ff0018 ! ! Black *.color0: #232323 *.color8: #444444 ! ! Red *.color1: #ff000f *.color9: #ff2740 ! ! Green *.color2: #8ce10b *.color10: #abe15b ! ! Yellow *.color3: #ffb900 *.color11: #ffd242 ! ! Blue *.color4: #008df8 *.color12: #0092ff ! ! Magenta *.color5: #6d43a6 *.color13: #9a5feb ! ! Cyan *.color6: #00d8eb *.color14: #67fff0 ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #9e9c9a !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Arthur ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ddeedd *.background: #1c1c1c *.cursorColor: #e2bbef ! ! Black *.color0: #3d352a *.color8: #554444 ! ! Red *.color1: #cd5c5c *.color9: #cc5533 ! ! Green *.color2: #86af80 *.color10: #88aa22 ! ! Yellow *.color3: #e8ae5b *.color11: #ffa75d ! ! Blue *.color4: #6495ed *.color12: #87ceeb ! ! Magenta *.color5: #deb887 *.color13: #996600 ! ! Cyan *.color6: #b0c4de *.color14: #b0c4de ! ! White *.color7: #bbaa99 *.color15: #ddccbb ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/AtelierSulphurpool ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #979db4 *.background: #202746 *.cursorColor: #979db4 ! ! Black *.color0: #202746 *.color8: #6b7394 ! ! Red *.color1: #c94922 *.color9: #c76b29 ! ! Green *.color2: #ac9739 *.color10: #293256 ! ! Yellow *.color3: #c08b30 *.color11: #5e6687 ! ! Blue *.color4: #3d8fd1 *.color12: #898ea4 ! ! Magenta *.color5: #6679cc *.color13: #dfe2f1 ! ! Cyan *.color6: #22a2c9 *.color14: #9c637a ! ! White *.color7: #979db4 *.color15: #f5f7ff ! ! Bold, Italic, Underline *.colorBD: #979db4 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Atom ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #c5c8c6 *.background: #161719 *.cursorColor: #d0d0d0 ! ! Black *.color0: #000000 *.color8: #000000 ! ! Red *.color1: #fd5ff1 *.color9: #fd5ff1 ! ! Green *.color2: #87c38a *.color10: #94fa36 ! ! Yellow *.color3: #ffd7b1 *.color11: #f5ffa8 ! ! Blue *.color4: #85befd *.color12: #96cbfe ! ! Magenta *.color5: #b9b6fc *.color13: #b9b6fc ! ! Cyan *.color6: #85befd *.color14: #85befd ! ! White *.color7: #e0e0e0 *.color15: #e0e0e0 ! ! Bold, Italic, Underline *.colorBD: #c5c8c6 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/AtomOneLight ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #2a2c33 *.background: #f9f9f9 *.cursorColor: #bbbbbb ! ! Black *.color0: #000000 *.color8: #000000 ! ! Red *.color1: #de3e35 *.color9: #de3e35 ! ! Green *.color2: #3f953a *.color10: #3f953a ! ! Yellow *.color3: #d2b67c *.color11: #d2b67c ! ! Blue *.color4: #2f5af3 *.color12: #2f5af3 ! ! Magenta *.color5: #950095 *.color13: #a00095 ! ! Cyan *.color6: #3f953a *.color14: #3f953a ! ! White *.color7: #bbbbbb *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #000000 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Base16 Default Dark ================================================ ! Base16 Default Dark ! Scheme: Chris Kempson (http://chriskempson.com) #define base00 #181818 #define base01 #282828 #define base02 #383838 #define base03 #585858 #define base04 #b8b8b8 #define base05 #d8d8d8 #define base06 #e8e8e8 #define base07 #f8f8f8 #define base08 #ab4642 #define base09 #dc9656 #define base0A #f7ca88 #define base0B #a1b56c #define base0C #86c1b9 #define base0D #7cafc2 #define base0E #ba8baf #define base0F #a16946 *.foreground: base05 #ifdef background_opacity *.background: [background_opacity]base00 #else *.background: base00 #endif *.cursorColor: base05 *.color0: base00 *.color1: base08 *.color2: base0B *.color3: base0A *.color4: base0D *.color5: base0E *.color6: base0C *.color7: base05 *.color8: base03 *.color9: base08 *.color10: base0B *.color11: base0A *.color12: base0D *.color13: base0E *.color14: base0C *.color15: base07 ! Note: colors beyond 15 might not be loaded (e.g., xterm, urxvt), ! use 'shell' template to set these if necessary *.color16: base09 *.color17: base0F *.color18: base01 *.color19: base02 *.color20: base04 *.color21: base06 ================================================ FILE: tabby-community-color-schemes/schemes/Batman ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #6f6f6f *.background: #1b1d1e *.cursorColor: #fcef0c ! ! Black *.color0: #1b1d1e *.color8: #505354 ! ! Red *.color1: #e6dc44 *.color9: #fff78e ! ! Green *.color2: #c8be46 *.color10: #fff27d ! ! Yellow *.color3: #f4fd22 *.color11: #feed6c ! ! Blue *.color4: #737174 *.color12: #919495 ! ! Magenta *.color5: #747271 *.color13: #9a9a9d ! ! Cyan *.color6: #62605f *.color14: #a3a3a6 ! ! White *.color7: #c6c5bf *.color15: #dadbd6 ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Belafonte Day ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #45373c *.background: #d5ccba *.cursorColor: #45373c ! ! Black *.color0: #20111b *.color8: #5e5252 ! ! Red *.color1: #be100e *.color9: #be100e ! ! Green *.color2: #858162 *.color10: #858162 ! ! Yellow *.color3: #eaa549 *.color11: #eaa549 ! ! Blue *.color4: #426a79 *.color12: #426a79 ! ! Magenta *.color5: #97522c *.color13: #97522c ! ! Cyan *.color6: #989a9c *.color14: #989a9c ! ! White *.color7: #968c83 *.color15: #d5ccba ! ! Bold, Italic, Underline *.colorBD: #45373c !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Belafonte Night ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #968c83 *.background: #20111b *.cursorColor: #968c83 ! ! Black *.color0: #20111b *.color8: #5e5252 ! ! Red *.color1: #be100e *.color9: #be100e ! ! Green *.color2: #858162 *.color10: #858162 ! ! Yellow *.color3: #eaa549 *.color11: #eaa549 ! ! Blue *.color4: #426a79 *.color12: #426a79 ! ! Magenta *.color5: #97522c *.color13: #97522c ! ! Cyan *.color6: #989a9c *.color14: #989a9c ! ! White *.color7: #968c83 *.color15: #d5ccba ! ! Bold, Italic, Underline *.colorBD: #968c83 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/BirdsOfParadise ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #e0dbb7 *.background: #2a1f1d *.cursorColor: #573d26 ! ! Black *.color0: #573d26 *.color8: #9b6c4a ! ! Red *.color1: #be2d26 *.color9: #e84627 ! ! Green *.color2: #6ba18a *.color10: #95d8ba ! ! Yellow *.color3: #e99d2a *.color11: #d0d150 ! ! Blue *.color4: #5a86ad *.color12: #b8d3ed ! ! Magenta *.color5: #ac80a6 *.color13: #d19ecb ! ! Cyan *.color6: #74a6ad *.color14: #93cfd7 ! ! White *.color7: #e0dbb7 *.color15: #fff9d5 ! ! Bold, Italic, Underline *.colorBD: #fff8d8 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Blazer ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #d9e6f2 *.background: #0d1926 *.cursorColor: #d9e6f2 ! ! Black *.color0: #000000 *.color8: #262626 ! ! Red *.color1: #b87a7a *.color9: #dbbdbd ! ! Green *.color2: #7ab87a *.color10: #bddbbd ! ! Yellow *.color3: #b8b87a *.color11: #dbdbbd ! ! Blue *.color4: #7a7ab8 *.color12: #bdbddb ! ! Magenta *.color5: #b87ab8 *.color13: #dbbddb ! ! Cyan *.color6: #7ab8b8 *.color14: #bddbdb ! ! White *.color7: #d9d9d9 *.color15: #ffffff ! ! Bold, Italic, Underline !*.colorBD: !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Borland ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffff4e *.background: #0000a4 *.cursorColor: #ffa560 ! ! Black *.color0: #4f4f4f *.color8: #7c7c7c ! ! Red *.color1: #ff6c60 *.color9: #ffb6b0 ! ! Green *.color2: #a8ff60 *.color10: #ceffac ! ! Yellow *.color3: #ffffb6 *.color11: #ffffcc ! ! Blue *.color4: #96cbfe *.color12: #b5dcff ! ! Magenta *.color5: #ff73fd *.color13: #ff9cfe ! ! Cyan *.color6: #c6c5fe *.color14: #dfdffe ! ! White *.color7: #eeeeee *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffff4e !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Bright Lights ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #b3c9d7 *.background: #191919 *.cursorColor: #f34b00 ! ! Black *.color0: #191919 *.color8: #191919 ! ! Red *.color1: #ff355b *.color9: #ff355b ! ! Green *.color2: #b7e876 *.color10: #b7e876 ! ! Yellow *.color3: #ffc251 *.color11: #ffc251 ! ! Blue *.color4: #76d4ff *.color12: #76d5ff ! ! Magenta *.color5: #ba76e7 *.color13: #ba76e7 ! ! Cyan *.color6: #6cbfb5 *.color14: #6cbfb5 ! ! White *.color7: #c2c8d7 *.color15: #c2c8d7 ! ! Bold, Italic, Underline *.colorBD: #9fb3c1 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Broadcast ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #e6e1dc *.background: #2b2b2b *.cursorColor: #ffffff ! ! Black *.color0: #000000 *.color8: #323232 ! ! Red *.color1: #da4939 *.color9: #ff7b6b ! ! Green *.color2: #519f50 *.color10: #83d182 ! ! Yellow *.color3: #ffd24a *.color11: #ffff7c ! ! Blue *.color4: #6d9cbe *.color12: #9fcef0 ! ! Magenta *.color5: #d0d0ff *.color13: #ffffff ! ! Cyan *.color6: #6e9cbe *.color14: #a0cef0 ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #e6e1dc !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Brogrammer ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #d6dbe5 *.background: #131313 *.cursorColor: #b9b9b9 ! ! Black *.color0: #1f1f1f *.color8: #d6dbe5 ! ! Red *.color1: #f81118 *.color9: #de352e ! ! Green *.color2: #2dc55e *.color10: #1dd361 ! ! Yellow *.color3: #ecba0f *.color11: #f3bd09 ! ! Blue *.color4: #2a84d2 *.color12: #1081d6 ! ! Magenta *.color5: #4e5ab7 *.color13: #5350b9 ! ! Cyan *.color6: #1081d6 *.color14: #0f7ddb ! ! White *.color7: #d6dbe5 *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #d6dbe5 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/C64 ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #7869c4 *.background: #40318d *.cursorColor: #7869c4 ! ! Black *.color0: #090300 *.color8: #000000 ! ! Red *.color1: #883932 *.color9: #883932 ! ! Green *.color2: #55a049 *.color10: #55a049 ! ! Yellow *.color3: #bfce72 *.color11: #bfce72 ! ! Blue *.color4: #40318d *.color12: #40318d ! ! Magenta *.color5: #8b3f96 *.color13: #8b3f96 ! ! Cyan *.color6: #67b6bd *.color14: #67b6bd ! ! White *.color7: #ffffff *.color15: #f7f7f7 ! ! Bold, Italic, Underline *.colorBD: #a5a2a2 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/CLRS ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #262626 *.background: #ffffff *.cursorColor: #6fd3fc ! ! Black *.color0: #000000 *.color8: #555753 ! ! Red *.color1: #f8282a *.color9: #fb0416 ! ! Green *.color2: #328a5d *.color10: #2cc631 ! ! Yellow *.color3: #fa701d *.color11: #fdd727 ! ! Blue *.color4: #135cd0 *.color12: #1670ff ! ! Magenta *.color5: #9f00bd *.color13: #e900b0 ! ! Cyan *.color6: #33c3c1 *.color14: #3ad5ce ! ! White *.color7: #b3b3b3 *.color15: #eeeeec ! ! Bold, Italic, Underline *.colorBD: #1a1a1a !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Chalk ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #d2d8d9 *.background: #2b2d2e *.cursorColor: #708284 ! ! Black *.color0: #7d8b8f *.color8: #888888 ! ! Red *.color1: #b23a52 *.color9: #f24840 ! ! Green *.color2: #789b6a *.color10: #80c470 ! ! Yellow *.color3: #b9ac4a *.color11: #ffeb62 ! ! Blue *.color4: #2a7fac *.color12: #4196ff ! ! Magenta *.color5: #bd4f5a *.color13: #fc5275 ! ! Cyan *.color6: #44a799 *.color14: #53cdbd ! ! White *.color7: #d2d8d9 *.color15: #d2d8d9 ! ! Bold, Italic, Underline *.colorBD: #ececec !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Chalkboard ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #d9e6f2 *.background: #29262f *.cursorColor: #d9e6f2 ! ! Black *.color0: #000000 *.color8: #323232 ! ! Red *.color1: #c37372 *.color9: #dbaaaa ! ! Green *.color2: #72c373 *.color10: #aadbaa ! ! Yellow *.color3: #c2c372 *.color11: #dadbaa ! ! Blue *.color4: #7372c3 *.color12: #aaaadb ! ! Magenta *.color5: #c372c2 *.color13: #dbaada ! ! Cyan *.color6: #72c2c3 *.color14: #aadadb ! ! White *.color7: #d9d9d9 *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #d96f5f !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Ciapre ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #aea47a *.background: #191c27 *.cursorColor: #92805b ! ! Black *.color0: #181818 *.color8: #555555 ! ! Red *.color1: #810009 *.color9: #ac3835 ! ! Green *.color2: #48513b *.color10: #a6a75d ! ! Yellow *.color3: #cc8b3f *.color11: #dcdf7c ! ! Blue *.color4: #576d8c *.color12: #3097c6 ! ! Magenta *.color5: #724d7c *.color13: #d33061 ! ! Cyan *.color6: #5c4f4b *.color14: #f3dbb2 ! ! White *.color7: #aea47f *.color15: #f4f4f4 ! ! Bold, Italic, Underline *.colorBD: #f4f4f4 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Cobalt Neon ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #8ff586 *.background: #142838 *.cursorColor: #c4206f ! ! Black *.color0: #142631 *.color8: #fff688 ! ! Red *.color1: #ff2320 *.color9: #d4312e ! ! Green *.color2: #3ba5ff *.color10: #8ff586 ! ! Yellow *.color3: #e9e75c *.color11: #e9f06d ! ! Blue *.color4: #8ff586 *.color12: #3c7dd2 ! ! Magenta *.color5: #781aa0 *.color13: #8230a7 ! ! Cyan *.color6: #8ff586 *.color14: #6cbc67 ! ! White *.color7: #ba46b2 *.color15: #8ff586 ! ! Bold, Italic, Underline *.colorBD: #248b70 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Cobalt2 ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffffff *.background: #132738 *.cursorColor: #f0cc09 ! ! Black *.color0: #000000 *.color8: #555555 ! ! Red *.color1: #ff0000 *.color9: #f40e17 ! ! Green *.color2: #38de21 *.color10: #3bd01d ! ! Yellow *.color3: #ffe50a *.color11: #edc809 ! ! Blue *.color4: #1460d2 *.color12: #5555ff ! ! Magenta *.color5: #ff005d *.color13: #ff55ff ! ! Cyan *.color6: #00bbbb *.color14: #6ae3fa ! ! White *.color7: #bbbbbb *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #f7fcff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/CrayonPonyFish ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #68525a *.background: #150707 *.cursorColor: #68525a ! ! Black *.color0: #2b1b1d *.color8: #3d2b2e ! ! Red *.color1: #91002b *.color9: #c5255d ! ! Green *.color2: #579524 *.color10: #8dff57 ! ! Yellow *.color3: #ab311b *.color11: #c8381d ! ! Blue *.color4: #8c87b0 *.color12: #cfc9ff ! ! Magenta *.color5: #692f50 *.color13: #fc6cba ! ! Cyan *.color6: #e8a866 *.color14: #ffceaf ! ! White *.color7: #68525a *.color15: #b0949d ! ! Bold, Italic, Underline *.colorBD: #c8381d !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Dark Pastel ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffffff *.background: #000000 *.cursorColor: #bbbbbb ! ! Black *.color0: #000000 *.color8: #555555 ! ! Red *.color1: #ff5555 *.color9: #ff5555 ! ! Green *.color2: #55ff55 *.color10: #55ff55 ! ! Yellow *.color3: #ffff55 *.color11: #ffff55 ! ! Blue *.color4: #5555ff *.color12: #5555ff ! ! Magenta *.color5: #ff55ff *.color13: #ff55ff ! ! Cyan *.color6: #55ffff *.color14: #55ffff ! ! White *.color7: #bbbbbb *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ff5e7d !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Darkside ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #bababa *.background: #222324 *.cursorColor: #bbbbbb ! ! Black *.color0: #000000 *.color8: #000000 ! ! Red *.color1: #e8341c *.color9: #e05a4f ! ! Green *.color2: #68c256 *.color10: #77b869 ! ! Yellow *.color3: #f2d42c *.color11: #efd64b ! ! Blue *.color4: #1c98e8 *.color12: #387cd3 ! ! Magenta *.color5: #8e69c9 *.color13: #957bbe ! ! Cyan *.color6: #1c98e8 *.color14: #3d97e2 ! ! White *.color7: #bababa *.color15: #bababa ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Desert ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffffff *.background: #333333 *.cursorColor: #00ff00 ! ! Black *.color0: #4d4d4d *.color8: #555555 ! ! Red *.color1: #ff2b2b *.color9: #ff5555 ! ! Green *.color2: #98fb98 *.color10: #55ff55 ! ! Yellow *.color3: #f0e68c *.color11: #ffff55 ! ! Blue *.color4: #cd853f *.color12: #87ceff ! ! Magenta *.color5: #ffdead *.color13: #ff55ff ! ! Cyan *.color6: #ffa0a0 *.color14: #ffd700 ! ! White *.color7: #f5deb3 *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffd700 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/DimmedMonokai ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #b9bcba *.background: #1f1f1f *.cursorColor: #f83e19 ! ! Black *.color0: #3a3d43 *.color8: #888987 ! ! Red *.color1: #be3f48 *.color9: #fb001f ! ! Green *.color2: #879a3b *.color10: #0f722f ! ! Yellow *.color3: #c5a635 *.color11: #c47033 ! ! Blue *.color4: #4f76a1 *.color12: #186de3 ! ! Magenta *.color5: #855c8d *.color13: #fb0067 ! ! Cyan *.color6: #578fa4 *.color14: #2e706d ! ! White *.color7: #b9bcba *.color15: #fdffb9 ! ! Bold, Italic, Underline *.colorBD: #feffb2 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/DotGov ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ebebeb *.background: #262c35 *.cursorColor: #d9002f ! ! Black *.color0: #191919 *.color8: #191919 ! ! Red *.color1: #bf091d *.color9: #bf091d ! ! Green *.color2: #3d9751 *.color10: #3d9751 ! ! Yellow *.color3: #f6bb34 *.color11: #f6bb34 ! ! Blue *.color4: #17b2e0 *.color12: #17b2e0 ! ! Magenta *.color5: #7830b0 *.color13: #7830b0 ! ! Cyan *.color6: #8bd2ed *.color14: #8bd2ed ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #fbab19 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Dracula ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #f8f8f2 *.background: #1e1f29 *.cursorColor: #bbbbbb ! ! Black *.color0: #000000 *.color8: #555555 ! ! Red *.color1: #ff5555 *.color9: #ff5555 ! ! Green *.color2: #50fa7b *.color10: #50fa7b ! ! Yellow *.color3: #f1fa8c *.color11: #f1fa8c ! ! Blue *.color4: #bd93f9 *.color12: #bd93f9 ! ! Magenta *.color5: #ff79c6 *.color13: #ff79c6 ! ! Cyan *.color6: #8be9fd *.color14: #8be9fd ! ! White *.color7: #bbbbbb *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Duotone Dark ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #b7a1ff *.background: #1f1d27 *.cursorColor: #ff9839 ! ! Black *.color0: #1f1d27 *.color8: #353147 ! ! Red *.color1: #d9393e *.color9: #d9393e ! ! Green *.color2: #2dcd73 *.color10: #2dcd73 ! ! Yellow *.color3: #d9b76e *.color11: #d9b76e ! ! Blue *.color4: #ffc284 *.color12: #ffc284 ! ! Magenta *.color5: #de8d40 *.color13: #de8d40 ! ! Cyan *.color6: #2488ff *.color14: #2488ff ! ! White *.color7: #b7a1ff *.color15: #eae5ff ! ! Bold, Italic, Underline *.colorBD: #b7a2ff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/ENCOM ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #00a595 *.background: #000000 *.cursorColor: #bbbbbb ! ! Black *.color0: #000000 *.color8: #555555 ! ! Red *.color1: #9f0000 *.color9: #ff0000 ! ! Green *.color2: #008b00 *.color10: #00ee00 ! ! Yellow *.color3: #ffd000 *.color11: #ffff00 ! ! Blue *.color4: #0081ff *.color12: #0000ff ! ! Magenta *.color5: #bc00ca *.color13: #ff00ff ! ! Cyan *.color6: #008b8b *.color14: #00cdcd ! ! White *.color7: #bbbbbb *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #4cf1e1 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Earthsong ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #e5c7a9 *.background: #292520 *.cursorColor: #f6f7ec ! ! Black *.color0: #121418 *.color8: #675f54 ! ! Red *.color1: #c94234 *.color9: #ff645a ! ! Green *.color2: #85c54c *.color10: #98e036 ! ! Yellow *.color3: #f5ae2e *.color11: #e0d561 ! ! Blue *.color4: #1398b9 *.color12: #5fdaff ! ! Magenta *.color5: #d0633d *.color13: #ff9269 ! ! Cyan *.color6: #509552 *.color14: #84f088 ! ! White *.color7: #e5c6aa *.color15: #f6f7ec ! ! Bold, Italic, Underline *.colorBD: #f6f7ec !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Elemental ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #807a74 *.background: #22211d *.cursorColor: #facb80 ! ! Black *.color0: #3c3c30 *.color8: #555445 ! ! Red *.color1: #98290f *.color9: #e0502a ! ! Green *.color2: #479a43 *.color10: #61e070 ! ! Yellow *.color3: #7f7111 *.color11: #d69927 ! ! Blue *.color4: #497f7d *.color12: #79d9d9 ! ! Magenta *.color5: #7f4e2f *.color13: #cd7c54 ! ! Cyan *.color6: #387f58 *.color14: #59d599 ! ! White *.color7: #807974 *.color15: #fff1e9 ! ! Bold, Italic, Underline *.colorBD: #fae679 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Elementary ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #efefef *.background: #181818 *.cursorColor: #bbbbbb ! ! Black *.color0: #242424 *.color8: #4b4b4b ! ! Red *.color1: #d71c15 *.color9: #fc1c18 ! ! Green *.color2: #5aa513 *.color10: #6bc219 ! ! Yellow *.color3: #fdb40c *.color11: #fec80e ! ! Blue *.color4: #063b8c *.color12: #0955ff ! ! Magenta *.color5: #e40038 *.color13: #fb0050 ! ! Cyan *.color6: #2595e1 *.color14: #3ea8fc ! ! White *.color7: #efefef *.color15: #8c00ec ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Espresso ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffffff *.background: #323232 *.cursorColor: #d6d6d6 ! ! Black *.color0: #353535 *.color8: #535353 ! ! Red *.color1: #d25252 *.color9: #f00c0c ! ! Green *.color2: #a5c261 *.color10: #c2e075 ! ! Yellow *.color3: #ffc66d *.color11: #e1e48b ! ! Blue *.color4: #6c99bb *.color12: #8ab7d9 ! ! Magenta *.color5: #d197d9 *.color13: #efb5f7 ! ! Cyan *.color6: #bed6ff *.color14: #dcf4ff ! ! White *.color7: #eeeeec *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Espresso Libre ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #b8a898 *.background: #2a211c *.cursorColor: #ffffff ! ! Black *.color0: #000000 *.color8: #555753 ! ! Red *.color1: #cc0000 *.color9: #ef2929 ! ! Green *.color2: #1a921c *.color10: #9aff87 ! ! Yellow *.color3: #f0e53a *.color11: #fffb5c ! ! Blue *.color4: #0066ff *.color12: #43a8ed ! ! Magenta *.color5: #c5656b *.color13: #ff818a ! ! Cyan *.color6: #06989a *.color14: #34e2e2 ! ! White *.color7: #d3d7cf *.color15: #eeeeec ! ! Bold, Italic, Underline *.colorBD: #d3c1af !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Fideloper ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #dbdae0 *.background: #292f33 *.cursorColor: #d4605a ! ! Black *.color0: #292f33 *.color8: #092028 ! ! Red *.color1: #cb1e2d *.color9: #d4605a ! ! Green *.color2: #edb8ac *.color10: #d4605a ! ! Yellow *.color3: #b7ab9b *.color11: #a86671 ! ! Blue *.color4: #2e78c2 *.color12: #7c85c4 ! ! Magenta *.color5: #c0236f *.color13: #5c5db2 ! ! Cyan *.color6: #309186 *.color14: #819090 ! ! White *.color7: #eae3ce *.color15: #fcf4df ! ! Bold, Italic, Underline *.colorBD: #6b7c7c !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/FirefoxDev ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #7c8fa4 *.background: #0e1011 *.cursorColor: #708284 ! ! Black *.color0: #002831 *.color8: #001e27 ! ! Red *.color1: #e63853 *.color9: #e1003f ! ! Green *.color2: #5eb83c *.color10: #1d9000 ! ! Yellow *.color3: #a57706 *.color11: #cd9409 ! ! Blue *.color4: #359ddf *.color12: #006fc0 ! ! Magenta *.color5: #d75cff *.color13: #a200da ! ! Cyan *.color6: #4b73a2 *.color14: #005794 ! ! White *.color7: #dcdcdc *.color15: #e2e2e2 ! ! Bold, Italic, Underline *.colorBD: #a7acb2 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Firewatch ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #9ba2b2 *.background: #1e2027 *.cursorColor: #f6f7ec ! ! Black *.color0: #585f6d *.color8: #585f6d ! ! Red *.color1: #d95360 *.color9: #d95360 ! ! Green *.color2: #5ab977 *.color10: #5ab977 ! ! Yellow *.color3: #dfb563 *.color11: #dfb563 ! ! Blue *.color4: #4d89c4 *.color12: #4c89c5 ! ! Magenta *.color5: #d55119 *.color13: #d55119 ! ! Cyan *.color6: #44a8b6 *.color14: #44a8b6 ! ! White *.color7: #e6e5ff *.color15: #e6e5ff ! ! Bold, Italic, Underline *.colorBD: #e6e5ff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/FishTank ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ecf0fe *.background: #232537 *.cursorColor: #fecd5e ! ! Black *.color0: #03073c *.color8: #6c5b30 ! ! Red *.color1: #c6004a *.color9: #da4b8a ! ! Green *.color2: #acf157 *.color10: #dbffa9 ! ! Yellow *.color3: #fecd5e *.color11: #fee6a9 ! ! Blue *.color4: #525fb8 *.color12: #b2befa ! ! Magenta *.color5: #986f82 *.color13: #fda5cd ! ! Cyan *.color6: #968763 *.color14: #a5bd86 ! ! White *.color7: #ecf0fc *.color15: #f6ffec ! ! Bold, Italic, Underline *.colorBD: #f6ffeb !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Flat ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #2cc55d *.background: #002240 *.cursorColor: #e5be0c ! ! Black *.color0: #222d3f *.color8: #212c3c ! ! Red *.color1: #a82320 *.color9: #d4312e ! ! Green *.color2: #32a548 *.color10: #2d9440 ! ! Yellow *.color3: #e58d11 *.color11: #e5be0c ! ! Blue *.color4: #3167ac *.color12: #3c7dd2 ! ! Magenta *.color5: #781aa0 *.color13: #8230a7 ! ! Cyan *.color6: #2c9370 *.color14: #35b387 ! ! White *.color7: #b0b6ba *.color15: #e7eced ! ! Bold, Italic, Underline *.colorBD: #e7eced !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Flatland ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #b8dbef *.background: #1d1f21 *.cursorColor: #708284 ! ! Black *.color0: #1d1d19 *.color8: #1d1d19 ! ! Red *.color1: #f18339 *.color9: #d22a24 ! ! Green *.color2: #9fd364 *.color10: #a7d42c ! ! Yellow *.color3: #f4ef6d *.color11: #ff8949 ! ! Blue *.color4: #5096be *.color12: #61b9d0 ! ! Magenta *.color5: #695abc *.color13: #695abc ! ! Cyan *.color6: #d63865 *.color14: #d63865 ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Floraverse ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #dbd1b9 *.background: #0e0d15 *.cursorColor: #bbbbbb ! ! Black *.color0: #08002e *.color8: #331e4d ! ! Red *.color1: #64002c *.color9: #d02063 ! ! Green *.color2: #5d731a *.color10: #b4ce59 ! ! Yellow *.color3: #cd751c *.color11: #fac357 ! ! Blue *.color4: #1d6da1 *.color12: #40a4cf ! ! Magenta *.color5: #b7077e *.color13: #f12aae ! ! Cyan *.color6: #42a38c *.color14: #62caa8 ! ! White *.color7: #f3e0b8 *.color15: #fff5db ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/ForestBlue ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #e2d8cd *.background: #051519 *.cursorColor: #9e9ecb ! ! Black *.color0: #333333 *.color8: #3d3d3d ! ! Red *.color1: #f8818e *.color9: #fb3d66 ! ! Green *.color2: #92d3a2 *.color10: #6bb48d ! ! Yellow *.color3: #1a8e63 *.color11: #30c85a ! ! Blue *.color4: #8ed0ce *.color12: #39a7a2 ! ! Magenta *.color5: #5e468c *.color13: #7e62b3 ! ! Cyan *.color6: #31658c *.color14: #6096bf ! ! White *.color7: #e2d8cd *.color15: #e2d8cd ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/FrontEndDelight ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #adadad *.background: #1b1c1d *.cursorColor: #cdcdcd ! ! Black *.color0: #242526 *.color8: #5fac6d ! ! Red *.color1: #f8511b *.color9: #f74319 ! ! Green *.color2: #565747 *.color10: #74ec4c ! ! Yellow *.color3: #fa771d *.color11: #fdc325 ! ! Blue *.color4: #2c70b7 *.color12: #3393ca ! ! Magenta *.color5: #f02e4f *.color13: #e75e4f ! ! Cyan *.color6: #3ca1a6 *.color14: #4fbce6 ! ! White *.color7: #adadad *.color15: #8c735b ! ! Bold, Italic, Underline *.colorBD: #cdcdcd !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/FunForrest ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #dec165 *.background: #251200 *.cursorColor: #e5591c ! ! Black *.color0: #000000 *.color8: #7f6a55 ! ! Red *.color1: #d6262b *.color9: #e55a1c ! ! Green *.color2: #919c00 *.color10: #bfc65a ! ! Yellow *.color3: #be8a13 *.color11: #ffcb1b ! ! Blue *.color4: #4699a3 *.color12: #7cc9cf ! ! Magenta *.color5: #8d4331 *.color13: #d26349 ! ! Cyan *.color6: #da8213 *.color14: #e6a96b ! ! White *.color7: #ddc265 *.color15: #ffeaa3 ! ! Bold, Italic, Underline *.colorBD: #ffeaa3 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Galaxy ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffffff *.background: #1d2837 *.cursorColor: #bbbbbb ! ! Black *.color0: #000000 *.color8: #555555 ! ! Red *.color1: #f9555f *.color9: #fa8c8f ! ! Green *.color2: #21b089 *.color10: #35bb9a ! ! Yellow *.color3: #fef02a *.color11: #ffff55 ! ! Blue *.color4: #589df6 *.color12: #589df6 ! ! Magenta *.color5: #944d95 *.color13: #e75699 ! ! Cyan *.color6: #1f9ee7 *.color14: #3979bc ! ! White *.color7: #bbbbbb *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Github ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #3e3e3e *.background: #f4f4f4 *.cursorColor: #3f3f3f ! ! Black *.color0: #3e3e3e *.color8: #666666 ! ! Red *.color1: #970b16 *.color9: #de0000 ! ! Green *.color2: #07962a *.color10: #87d5a2 ! ! Yellow *.color3: #f8eec7 *.color11: #f1d007 ! ! Blue *.color4: #003e8a *.color12: #2e6cba ! ! Magenta *.color5: #e94691 *.color13: #ffa29f ! ! Cyan *.color6: #89d1ec *.color14: #1cfafe ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #c95500 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Glacier ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffffff *.background: #0c1115 *.cursorColor: #6c6c6c ! ! Black *.color0: #2e343c *.color8: #404a55 ! ! Red *.color1: #bd0f2f *.color9: #bd0f2f ! ! Green *.color2: #35a770 *.color10: #49e998 ! ! Yellow *.color3: #fb9435 *.color11: #fddf6e ! ! Blue *.color4: #1f5872 *.color12: #2a8bc1 ! ! Magenta *.color5: #bd2523 *.color13: #ea4727 ! ! Cyan *.color6: #778397 *.color14: #a0b6d3 ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Grape ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #9f9fa1 *.background: #171423 *.cursorColor: #a288f7 ! ! Black *.color0: #2d283f *.color8: #59516a ! ! Red *.color1: #ed2261 *.color9: #f0729a ! ! Green *.color2: #1fa91b *.color10: #53aa5e ! ! Yellow *.color3: #8ddc20 *.color11: #b2dc87 ! ! Blue *.color4: #487df4 *.color12: #a9bcec ! ! Magenta *.color5: #8d35c9 *.color13: #ad81c2 ! ! Cyan *.color6: #3bdeed *.color14: #9de3eb ! ! White *.color7: #9e9ea0 *.color15: #a288f7 ! ! Bold, Italic, Underline *.colorBD: #9f87ff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Grass ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #fff0a5 *.background: #13773d *.cursorColor: #8c2800 ! ! Black *.color0: #000000 *.color8: #555555 ! ! Red *.color1: #bb0000 *.color9: #bb0000 ! ! Green *.color2: #00bb00 *.color10: #00bb00 ! ! Yellow *.color3: #e7b000 *.color11: #e7b000 ! ! Blue *.color4: #0000a3 *.color12: #0000bb ! ! Magenta *.color5: #950062 *.color13: #ff55ff ! ! Cyan *.color6: #00bbbb *.color14: #55ffff ! ! White *.color7: #bbbbbb *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffb03b !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Gruvbox Dark ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #e6d4a3 *.background: #1e1e1e *.cursorColor: #bbbbbb ! ! Black *.color0: #161819 *.color8: #7f7061 ! ! Red *.color1: #f73028 *.color9: #be0f17 ! ! Green *.color2: #aab01e *.color10: #868715 ! ! Yellow *.color3: #f7b125 *.color11: #cc881a ! ! Blue *.color4: #719586 *.color12: #377375 ! ! Magenta *.color5: #c77089 *.color13: #a04b73 ! ! Cyan *.color6: #7db669 *.color14: #578e57 ! ! White *.color7: #faefbb *.color15: #e6d4a3 ! ! Bold, Italic, Underline *.colorBD: #978771 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Hardcore ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #a0a0a0 *.background: #121212 *.cursorColor: #bbbbbb ! ! Black *.color0: #1b1d1e *.color8: #505354 ! ! Red *.color1: #f92672 *.color9: #ff669d ! ! Green *.color2: #a6e22e *.color10: #beed5f ! ! Yellow *.color3: #fd971f *.color11: #e6db74 ! ! Blue *.color4: #66d9ef *.color12: #66d9ef ! ! Magenta *.color5: #9e6ffe *.color13: #9e6ffe ! ! Cyan *.color6: #5e7175 *.color14: #a3babf ! ! White *.color7: #ccccc6 *.color15: #f8f8f2 ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Harper ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #a8a49d *.background: #010101 *.cursorColor: #a8a49d ! ! Black *.color0: #010101 *.color8: #726e6a ! ! Red *.color1: #f8b63f *.color9: #f8b63f ! ! Green *.color2: #7fb5e1 *.color10: #7fb5e1 ! ! Yellow *.color3: #d6da25 *.color11: #d6da25 ! ! Blue *.color4: #489e48 *.color12: #489e48 ! ! Magenta *.color5: #b296c6 *.color13: #b296c6 ! ! Cyan *.color6: #f5bfd7 *.color14: #f5bfd7 ! ! White *.color7: #a8a49d *.color15: #fefbea ! ! Bold, Italic, Underline *.colorBD: #a8a49d !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Highway ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ededed *.background: #222225 *.cursorColor: #e0d9b9 ! ! Black *.color0: #000000 *.color8: #5d504a ! ! Red *.color1: #d00e18 *.color9: #f07e18 ! ! Green *.color2: #138034 *.color10: #b1d130 ! ! Yellow *.color3: #ffcb3e *.color11: #fff120 ! ! Blue *.color4: #006bb3 *.color12: #4fc2fd ! ! Magenta *.color5: #6b2775 *.color13: #de0071 ! ! Cyan *.color6: #384564 *.color14: #5d504a ! ! White *.color7: #ededed *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #fff8d8 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Hipster Green ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #84c138 *.background: #100b05 *.cursorColor: #23ff18 ! ! Black *.color0: #000000 *.color8: #666666 ! ! Red *.color1: #b6214a *.color9: #e50000 ! ! Green *.color2: #00a600 *.color10: #86a93e ! ! Yellow *.color3: #bfbf00 *.color11: #e5e500 ! ! Blue *.color4: #246eb2 *.color12: #0000ff ! ! Magenta *.color5: #b200b2 *.color13: #e500e5 ! ! Cyan *.color6: #00a6b2 *.color14: #00e5e5 ! ! White *.color7: #bfbfbf *.color15: #e5e5e5 ! ! Bold, Italic, Underline *.colorBD: #00db00 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Homebrew ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #00ff00 *.background: #000000 *.cursorColor: #23ff18 ! ! Black *.color0: #000000 *.color8: #666666 ! ! Red *.color1: #990000 *.color9: #e50000 ! ! Green *.color2: #00a600 *.color10: #00d900 ! ! Yellow *.color3: #999900 *.color11: #e5e500 ! ! Blue *.color4: #0000b2 *.color12: #0000ff ! ! Magenta *.color5: #b200b2 *.color13: #e500e5 ! ! Cyan *.color6: #00a6b2 *.color14: #00e5e5 ! ! White *.color7: #bfbfbf *.color15: #e5e5e5 ! ! Bold, Italic, Underline *.colorBD: #00ff00 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Hurtado ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #dbdbdb *.background: #000000 *.cursorColor: #bbbbbb ! ! Black *.color0: #575757 *.color8: #262626 ! ! Red *.color1: #ff1b00 *.color9: #d51d00 ! ! Green *.color2: #a5e055 *.color10: #a5df55 ! ! Yellow *.color3: #fbe74a *.color11: #fbe84a ! ! Blue *.color4: #496487 *.color12: #89beff ! ! Magenta *.color5: #fd5ff1 *.color13: #c001c1 ! ! Cyan *.color6: #86e9fe *.color14: #86eafe ! ! White *.color7: #cbcccb *.color15: #dbdbdb ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Hybrid ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #b7bcba *.background: #161719 *.cursorColor: #b7bcba ! ! Black *.color0: #2a2e33 *.color8: #1d1f22 ! ! Red *.color1: #b84d51 *.color9: #8d2e32 ! ! Green *.color2: #b3bf5a *.color10: #798431 ! ! Yellow *.color3: #e4b55e *.color11: #e58a50 ! ! Blue *.color4: #6e90b0 *.color12: #4b6b88 ! ! Magenta *.color5: #a17eac *.color13: #6e5079 ! ! Cyan *.color6: #7fbfb4 *.color14: #4d7b74 ! ! White *.color7: #b5b9b6 *.color15: #5a626a ! ! Bold, Italic, Underline *.colorBD: #b7bcba !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/IC_Green_PPL ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #d9efd3 *.background: #3a3d3f *.cursorColor: #42ff58 ! ! Black *.color0: #1f1f1f *.color8: #032710 ! ! Red *.color1: #fb002a *.color9: #a7ff3f ! ! Green *.color2: #339c24 *.color10: #9fff6d ! ! Yellow *.color3: #659b25 *.color11: #d2ff6d ! ! Blue *.color4: #149b45 *.color12: #72ffb5 ! ! Magenta *.color5: #53b82c *.color13: #50ff3e ! ! Cyan *.color6: #2cb868 *.color14: #22ff71 ! ! White *.color7: #e0ffef *.color15: #daefd0 ! ! Bold, Italic, Underline *.colorBD: #9fff6d !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/IC_Orange_PPL ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffcb83 *.background: #262626 *.cursorColor: #fc531d ! ! Black *.color0: #000000 *.color8: #6a4f2a ! ! Red *.color1: #c13900 *.color9: #ff8c68 ! ! Green *.color2: #a4a900 *.color10: #f6ff40 ! ! Yellow *.color3: #caaf00 *.color11: #ffe36e ! ! Blue *.color4: #bd6d00 *.color12: #ffbe55 ! ! Magenta *.color5: #fc5e00 *.color13: #fc874f ! ! Cyan *.color6: #f79500 *.color14: #c69752 ! ! White *.color7: #ffc88a *.color15: #fafaff ! ! Bold, Italic, Underline *.colorBD: #fafaff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/IR_Black ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #f1f1f1 *.background: #000000 *.cursorColor: #808080 ! ! Black *.color0: #4f4f4f *.color8: #7b7b7b ! ! Red *.color1: #fa6c60 *.color9: #fcb6b0 ! ! Green *.color2: #a8ff60 *.color10: #cfffab ! ! Yellow *.color3: #fffeb7 *.color11: #ffffcc ! ! Blue *.color4: #96cafe *.color12: #b5dcff ! ! Magenta *.color5: #fa73fd *.color13: #fb9cfe ! ! Cyan *.color6: #c6c5fe *.color14: #e0e0fe ! ! White *.color7: #efedef *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Iceberg ================================================ ! Iceberg ! https://cocopon.github.io/iceberg.vim/ *.foreground: #c6c8d1 *.background: #161821 *.cursorColor: #c6c8d1 ! ! Black *.color0: #1e2132 *.color8: #6b7089 ! ! Red *.color1: #e27878 *.color9: #e98989 ! ! Green *.color2: #b4be82 *.color10: #c0ca8e ! ! Yellow *.color3: #e2a478 *.color11: #e9b189 ! ! Blue *.color4: #84a0c6 *.color12: #91acd1 ! ! Magenta *.color5: #a093c7 *.color13: #ada0d3 ! ! Cyan *.color6: #89b8c2 *.color14: #95c4ce ! ! White *.color7: #c6c8d1 *.color15: #d2d4de ! ! Bold, Italic, Underline *.colorBD: #c6c8d1 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Jackie Brown ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffcc2f *.background: #2c1d16 *.cursorColor: #23ff18 ! ! Black *.color0: #2c1d16 *.color8: #666666 ! ! Red *.color1: #ef5734 *.color9: #e50000 ! ! Green *.color2: #2baf2b *.color10: #86a93e ! ! Yellow *.color3: #bebf00 *.color11: #e5e500 ! ! Blue *.color4: #246eb2 *.color12: #0000ff ! ! Magenta *.color5: #d05ec1 *.color13: #e500e5 ! ! Cyan *.color6: #00acee *.color14: #00e5e5 ! ! White *.color7: #bfbfbf *.color15: #e5e5e5 ! ! Bold, Italic, Underline *.colorBD: #ffcc2f !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Japanesque ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #f7f6ec *.background: #1e1e1e *.cursorColor: #edcf4f ! ! Black *.color0: #343935 *.color8: #595b59 ! ! Red *.color1: #cf3f61 *.color9: #d18fa6 ! ! Green *.color2: #7bb75b *.color10: #767f2c ! ! Yellow *.color3: #e9b32a *.color11: #78592f ! ! Blue *.color4: #4c9ad4 *.color12: #135979 ! ! Magenta *.color5: #a57fc4 *.color13: #604291 ! ! Cyan *.color6: #389aad *.color14: #76bbca ! ! White *.color7: #fafaf6 *.color15: #b2b5ae ! ! Bold, Italic, Underline *.colorBD: #fffffa !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Jazz ================================================ ! ! Generated with : ! XRDB2Xresources.py ! *.foreground: #3f3f3f *.background: #f3f2f1 *.cursorColor: #9acf9f ! ! Black *.color0: #282c34 *.color8: #548962 ! ! Red *.color1: #e06c75 *.color9: #d19a66 ! ! Green *.color2: #668e3d *.color10: #668e3d ! ! Yellow *.color3: #c49041 *.color11: #c49041 ! ! Blue *.color4: #8c71bf *.color12: #8c71bf ! ! Magenta *.color5: #c678dd *.color13: #c678dd ! ! Cyan *.color6: #878b91 *.color14: #5e6091 ! ! White *.color7: #abb2bf *.color15: #f2f7ff ! ! Bold, Italic, Underline *.colorBD: #33374c !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Jellybeans ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #dedede *.background: #121212 *.cursorColor: #ffa560 ! ! Black *.color0: #929292 *.color8: #bdbdbd ! ! Red *.color1: #e27373 *.color9: #ffa1a1 ! ! Green *.color2: #94b979 *.color10: #bddeab ! ! Yellow *.color3: #ffba7b *.color11: #ffdca0 ! ! Blue *.color4: #97bedc *.color12: #b1d8f6 ! ! Magenta *.color5: #e1c0fa *.color13: #fbdaff ! ! Cyan *.color6: #00988e *.color14: #1ab2a8 ! ! White *.color7: #dedede *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/JetBrains Darcula ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #adadad *.background: #202020 *.cursorColor: #ffffff ! ! Black *.color0: #000000 *.color8: #555555 ! ! Red *.color1: #fa5355 *.color9: #fb7172 ! ! Green *.color2: #126e00 *.color10: #67ff4f ! ! Yellow *.color3: #c2c300 *.color11: #ffff00 ! ! Blue *.color4: #4581eb *.color12: #6d9df1 ! ! Magenta *.color5: #fa54ff *.color13: #fb82ff ! ! Cyan *.color6: #33c2c1 *.color14: #60d3d1 ! ! White *.color7: #adadad *.color15: #eeeeee ! ! Bold, Italic, Underline *.colorBD: #eeeeee !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Kibble ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #f7f7f7 *.background: #0e100a *.cursorColor: #9fda9c ! ! Black *.color0: #4d4d4d *.color8: #5a5a5a ! ! Red *.color1: #c70031 *.color9: #f01578 ! ! Green *.color2: #29cf13 *.color10: #6ce05c ! ! Yellow *.color3: #d8e30e *.color11: #f3f79e ! ! Blue *.color4: #3449d1 *.color12: #97a4f7 ! ! Magenta *.color5: #8400ff *.color13: #c495f0 ! ! Cyan *.color6: #0798ab *.color14: #68f2e0 ! ! White *.color7: #e2d1e3 *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ca631e !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Later This Evening ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #959595 *.background: #222222 *.cursorColor: #424242 ! ! Black *.color0: #2b2b2b *.color8: #454747 ! ! Red *.color1: #d45a60 *.color9: #d3232f ! ! Green *.color2: #afba67 *.color10: #aabb39 ! ! Yellow *.color3: #e5d289 *.color11: #e5be39 ! ! Blue *.color4: #a0bad6 *.color12: #6699d6 ! ! Magenta *.color5: #c092d6 *.color13: #ab53d6 ! ! Cyan *.color6: #91bfb7 *.color14: #5fc0ae ! ! White *.color7: #3c3d3d *.color15: #c1c2c2 ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Lavandula ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #736e7d *.background: #050014 *.cursorColor: #8c91fa ! ! Black *.color0: #230046 *.color8: #372d46 ! ! Red *.color1: #7d1625 *.color9: #e05167 ! ! Green *.color2: #337e6f *.color10: #52e0c4 ! ! Yellow *.color3: #7f6f49 *.color11: #e0c386 ! ! Blue *.color4: #4f4a7f *.color12: #8e87e0 ! ! Magenta *.color5: #5a3f7f *.color13: #a776e0 ! ! Cyan *.color6: #58777f *.color14: #9ad4e0 ! ! White *.color7: #736e7d *.color15: #8c91fa ! ! Bold, Italic, Underline *.colorBD: #8c91fa !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Light Owl ================================================ ! ! Light Owl ! https://github.com/sdras/night-owl-vscode-theme ! *.foreground: #403f53 *.background: #fbfbfb *.cursorColor: #90a7b2 ! ! Black *.color0: #403f53 *.color8: #403f53 ! ! Red *.color1: #de3d3b *.color9: #de3d3b ! ! Green *.color2: #08916a *.color10: #08916a ! ! Yellow *.color3: #e0af02 *.color11: #daaa01 ! ! Blue *.color4: #288ed7 *.color12: #288ed7 ! ! Magenta *.color5: #d6438a *.color13: #d6438a ! ! Cyan *.color6: #2aa298 *.color14: #2aa298 ! ! White *.color7: #f0f0f0 *.color15: #979797 ! ! Bold, Italic, Underline !*.colorBD: !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/LiquidCarbon ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #afc2c2 *.background: #303030 *.cursorColor: #ffffff ! ! Black *.color0: #000000 *.color8: #000000 ! ! Red *.color1: #ff3030 *.color9: #ff3030 ! ! Green *.color2: #559a70 *.color10: #559a70 ! ! Yellow *.color3: #ccac00 *.color11: #ccac00 ! ! Blue *.color4: #0099cc *.color12: #0099cc ! ! Magenta *.color5: #cc69c8 *.color13: #cc69c8 ! ! Cyan *.color6: #7ac4cc *.color14: #7ac4cc ! ! White *.color7: #bccccc *.color15: #bccccc ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/LiquidCarbonTransparent ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #afc2c2 *.background: #000000 *.cursorColor: #ffffff ! ! Black *.color0: #000000 *.color8: #000000 ! ! Red *.color1: #ff3030 *.color9: #ff3030 ! ! Green *.color2: #559a70 *.color10: #559a70 ! ! Yellow *.color3: #ccac00 *.color11: #ccac00 ! ! Blue *.color4: #0099cc *.color12: #0099cc ! ! Magenta *.color5: #cc69c8 *.color13: #cc69c8 ! ! Cyan *.color6: #7ac4cc *.color14: #7ac4cc ! ! White *.color7: #bccccc *.color15: #bccccc ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/LiquidCarbonTransparentInverse ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #afc2c2 *.background: #000000 *.cursorColor: #ffffff ! ! Black *.color0: #bccccd *.color8: #ffffff ! ! Red *.color1: #ff3030 *.color9: #ff3030 ! ! Green *.color2: #559a70 *.color10: #559a70 ! ! Yellow *.color3: #ccac00 *.color11: #ccac00 ! ! Blue *.color4: #0099cc *.color12: #0099cc ! ! Magenta *.color5: #cc69c8 *.color13: #cc69c8 ! ! Cyan *.color6: #7ac4cc *.color14: #7ac4cc ! ! White *.color7: #000000 *.color15: #000000 ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Man Page ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #000000 *.background: #fef49c *.cursorColor: #7f7f7f ! ! Black *.color0: #000000 *.color8: #666666 ! ! Red *.color1: #cc0000 *.color9: #e50000 ! ! Green *.color2: #00a600 *.color10: #00d900 ! ! Yellow *.color3: #999900 *.color11: #e5e500 ! ! Blue *.color4: #0000b2 *.color12: #0000ff ! ! Magenta *.color5: #b200b2 *.color13: #e500e5 ! ! Cyan *.color6: #00a6b2 *.color14: #00e5e5 ! ! White *.color7: #cccccc *.color15: #e5e5e5 ! ! Bold, Italic, Underline *.colorBD: #000000 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Material ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #232322 *.background: #eaeaea *.cursorColor: #16afca ! ! Black *.color0: #212121 *.color8: #424242 ! ! Red *.color1: #b7141f *.color9: #e83b3f ! ! Green *.color2: #457b24 *.color10: #7aba3a ! ! Yellow *.color3: #f6981e *.color11: #ffea2e ! ! Blue *.color4: #134eb2 *.color12: #54a4f3 ! ! Magenta *.color5: #560088 *.color13: #aa4dbc ! ! Cyan *.color6: #0e717c *.color14: #26bbd1 ! ! White *.color7: #efefef *.color15: #d9d9d9 ! ! Bold, Italic, Underline *.colorBD: #b7141f !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/MaterialDark ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #e5e5e5 *.background: #232322 *.cursorColor: #16afca ! ! Black *.color0: #212121 *.color8: #424242 ! ! Red *.color1: #b7141f *.color9: #e83b3f ! ! Green *.color2: #457b24 *.color10: #7aba3a ! ! Yellow *.color3: #f6981e *.color11: #ffea2e ! ! Blue *.color4: #134eb2 *.color12: #54a4f3 ! ! Magenta *.color5: #560088 *.color13: #aa4dbc ! ! Cyan *.color6: #0e717c *.color14: #26bbd1 ! ! White *.color7: #efefef *.color15: #d9d9d9 ! ! Bold, Italic, Underline *.colorBD: #b7141f !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Mathias ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #bbbbbb *.background: #000000 *.cursorColor: #bbbbbb ! ! Black *.color0: #000000 *.color8: #555555 ! ! Red *.color1: #e52222 *.color9: #ff5555 ! ! Green *.color2: #a6e32d *.color10: #55ff55 ! ! Yellow *.color3: #fc951e *.color11: #ffff55 ! ! Blue *.color4: #c48dff *.color12: #5555ff ! ! Magenta *.color5: #fa2573 *.color13: #ff55ff ! ! Cyan *.color6: #67d9f0 *.color14: #55ffff ! ! White *.color7: #f2f2f2 *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Medallion ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #cac296 *.background: #1d1908 *.cursorColor: #d3ba30 ! ! Black *.color0: #000000 *.color8: #5e5219 ! ! Red *.color1: #b64c00 *.color9: #ff9149 ! ! Green *.color2: #7c8b16 *.color10: #b2ca3b ! ! Yellow *.color3: #d3bd26 *.color11: #ffe54a ! ! Blue *.color4: #616bb0 *.color12: #acb8ff ! ! Magenta *.color5: #8c5a90 *.color13: #ffa0ff ! ! Cyan *.color6: #916c25 *.color14: #ffbc51 ! ! White *.color7: #cac29a *.color15: #fed698 ! ! Bold, Italic, Underline *.colorBD: #ffd890 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Melange Dark ================================================ ! ! Melange Dark ! https://github.com/savq/melange ! *.foreground: #ece1d7 *.background: #2a2520 *.cursorColor: #ece1d7 ! ! Black *.color0: #352f2a *.color8: #4d453e ! ! Red *.color1 #b65c60 *.color9 #f17c64 ! ! Green *.color2 #78997a *.color10 #99d59d ! ! Yellow *.color3 #ebc06d *.color11 #ebc06d ! ! Blue *.color4 #9aacce *.color12 #9aacce ! ! Magenta *.color5 #b380b0 *.color13 #ce9bcb ! ! Cyan *.color6 #86a3a3 *.color14 #88b3b2 ! ! White *.color7 #a38d78 *.color15 #c1a78e ! ! Bold, Italic, Underline *.colorBD: #fff4ea !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Misterioso ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #e1e1e0 *.background: #2d3743 *.cursorColor: #000000 ! ! Black *.color0: #000000 *.color8: #555555 ! ! Red *.color1: #ff4242 *.color9: #ff3242 ! ! Green *.color2: #74af68 *.color10: #74cd68 ! ! Yellow *.color3: #ffad29 *.color11: #ffb929 ! ! Blue *.color4: #338f86 *.color12: #23d7d7 ! ! Magenta *.color5: #9414e6 *.color13: #ff37ff ! ! Cyan *.color6: #23d7d7 *.color14: #00ede1 ! ! White *.color7: #e1e1e0 *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #000000 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Molokai ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #bbbbbb *.background: #121212 *.cursorColor: #bbbbbb ! ! Black *.color0: #121212 *.color8: #555555 ! ! Red *.color1: #fa2573 *.color9: #f6669d ! ! Green *.color2: #98e123 *.color10: #b1e05f ! ! Yellow *.color3: #dfd460 *.color11: #fff26d ! ! Blue *.color4: #1080d0 *.color12: #00afff ! ! Magenta *.color5: #8700ff *.color13: #af87ff ! ! Cyan *.color6: #43a8d0 *.color14: #51ceff ! ! White *.color7: #bbbbbb *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/MonaLisa ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #f7d66a *.background: #120b0d *.cursorColor: #c46c32 ! ! Black *.color0: #351b0e *.color8: #874228 ! ! Red *.color1: #9b291c *.color9: #ff4331 ! ! Green *.color2: #636232 *.color10: #b4b264 ! ! Yellow *.color3: #c36e28 *.color11: #ff9566 ! ! Blue *.color4: #515c5d *.color12: #9eb2b4 ! ! Magenta *.color5: #9b1d29 *.color13: #ff5b6a ! ! Cyan *.color6: #588056 *.color14: #8acd8f ! ! White *.color7: #f7d75c *.color15: #ffe598 ! ! Bold, Italic, Underline *.colorBD: #fee4a0 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Monokai Soda ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #c4c5b5 *.background: #1a1a1a *.cursorColor: #f6f7ec ! ! Black *.color0: #1a1a1a *.color8: #625e4c ! ! Red *.color1: #f4005f *.color9: #f4005f ! ! Green *.color2: #98e024 *.color10: #98e024 ! ! Yellow *.color3: #fa8419 *.color11: #e0d561 ! ! Blue *.color4: #9d65ff *.color12: #9d65ff ! ! Magenta *.color5: #f4005f *.color13: #f4005f ! ! Cyan *.color6: #58d1eb *.color14: #58d1eb ! ! White *.color7: #c4c5b5 *.color15: #f6f6ef ! ! Bold, Italic, Underline *.colorBD: #c4c5b5 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Monokai Vivid ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #f9f9f9 *.background: #121212 *.cursorColor: #fb0007 ! ! Black *.color0: #121212 *.color8: #838383 ! ! Red *.color1: #fa2934 *.color9: #f6669d ! ! Green *.color2: #98e123 *.color10: #b1e05f ! ! Yellow *.color3: #fff30a *.color11: #fff26d ! ! Blue *.color4: #0443ff *.color12: #0443ff ! ! Magenta *.color5: #f800f8 *.color13: #f200f6 ! ! Cyan *.color6: #01b6ed *.color14: #51ceff ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/N0tch2k ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #a0a0a0 *.background: #222222 *.cursorColor: #aa9175 ! ! Black *.color0: #383838 *.color8: #474747 ! ! Red *.color1: #a95551 *.color9: #a97775 ! ! Green *.color2: #666666 *.color10: #8c8c8c ! ! Yellow *.color3: #a98051 *.color11: #a99175 ! ! Blue *.color4: #657d3e *.color12: #98bd5e ! ! Magenta *.color5: #767676 *.color13: #a3a3a3 ! ! Cyan *.color6: #c9c9c9 *.color14: #dcdcdc ! ! White *.color7: #d0b8a3 *.color15: #d8c8bb ! ! Bold, Italic, Underline *.colorBD: #e5e5e5 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Neopolitan ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffffff *.background: #271f19 *.cursorColor: #ffffff ! ! Black *.color0: #000000 *.color8: #000000 ! ! Red *.color1: #800000 *.color9: #800000 ! ! Green *.color2: #61ce3c *.color10: #61ce3c ! ! Yellow *.color3: #fbde2d *.color11: #fbde2d ! ! Blue *.color4: #253b76 *.color12: #253b76 ! ! Magenta *.color5: #ff0080 *.color13: #ff0080 ! ! Cyan *.color6: #8da6ce *.color14: #8da6ce ! ! White *.color7: #f8f8f8 *.color15: #f8f8f8 ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Neutron ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #e6e8ef *.background: #1c1e22 *.cursorColor: #f6f7ec ! ! Black *.color0: #23252b *.color8: #23252b ! ! Red *.color1: #b54036 *.color9: #b54036 ! ! Green *.color2: #5ab977 *.color10: #5ab977 ! ! Yellow *.color3: #deb566 *.color11: #deb566 ! ! Blue *.color4: #6a7c93 *.color12: #6a7c93 ! ! Magenta *.color5: #a4799d *.color13: #a4799d ! ! Cyan *.color6: #3f94a8 *.color14: #3f94a8 ! ! White *.color7: #e6e8ef *.color15: #ebedf2 ! ! Bold, Italic, Underline *.colorBD: #52606b !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Night Owl ================================================ ! ! Night Owl ! https://github.com/sdras/night-owl-vscode-theme ! *.foreground: #d6deeb *.background: #011627 *.cursorColor: #80a4c2 ! ! Black *.color0: #011627 *.color8: #969696 ! ! Red *.color1: #ef5350 *.color9: #ef5350 ! ! Green *.color2: #22da6e *.color10: #22da6e ! ! Yellow *.color3: #addb67 *.color11: #ffeb95 ! ! Blue *.color4: #82aaff *.color12: #82aaff ! ! Magenta *.color5: #c792ea *.color13: #c792ea ! ! Cyan *.color6: #21c7a8 *.color14: #7fdbca ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline !*.colorBD: !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/NightLion v1 ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #bbbbbb *.background: #000000 *.cursorColor: #bbbbbb ! ! Black *.color0: #4c4c4c *.color8: #555555 ! ! Red *.color1: #bb0000 *.color9: #ff5555 ! ! Green *.color2: #5fde8f *.color10: #55ff55 ! ! Yellow *.color3: #f3f167 *.color11: #ffff55 ! ! Blue *.color4: #276bd8 *.color12: #5555ff ! ! Magenta *.color5: #bb00bb *.color13: #ff55ff ! ! Cyan *.color6: #00dadf *.color14: #55ffff ! ! White *.color7: #bbbbbb *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #e3e3e3 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/NightLion v2 ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #bbbbbb *.background: #171717 *.cursorColor: #bbbbbb ! ! Black *.color0: #4c4c4c *.color8: #555555 ! ! Red *.color1: #bb0000 *.color9: #ff5555 ! ! Green *.color2: #04f623 *.color10: #7df71d ! ! Yellow *.color3: #f3f167 *.color11: #ffff55 ! ! Blue *.color4: #64d0f0 *.color12: #62cbe8 ! ! Magenta *.color5: #ce6fdb *.color13: #ff9bf5 ! ! Cyan *.color6: #00dadf *.color14: #00ccd8 ! ! White *.color7: #bbbbbb *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #e3e3e3 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Nord ================================================ ! ! *.foreground: #d8dee9 *.background: #2e3440 *.cursorColor: #d8dee9 ! ! Black *.color0: #3b4252 *.color8: #373e4d ! ! Red *.color1: #bf616a *.color9: #94545d ! ! Green *.color2: #a3be8c *.color10: #809575 ! ! Yellow *.color3: #ebcb8b *.color11: #b29e75 ! ! Blue *.color4: #81a1c1 *.color12: #68809a ! ! Magenta *.color5: #b48ead *.color13: #8c738c ! ! Cyan *.color6: #88c0d0 *.color14: #6d96a5 ! ! White *.color7: #e5e9f0 *.color15: #aeb3bb ! ! Bold, Italic, Underline *.colorBD: #a5abb6 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Novel ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #3b2322 *.background: #dfdbc3 *.cursorColor: #73635a ! ! Black *.color0: #000000 *.color8: #808080 ! ! Red *.color1: #cc0000 *.color9: #cc0000 ! ! Green *.color2: #009600 *.color10: #009600 ! ! Yellow *.color3: #d06b00 *.color11: #d06b00 ! ! Blue *.color4: #0000cc *.color12: #0000cc ! ! Magenta *.color5: #cc00cc *.color13: #cc00cc ! ! Cyan *.color6: #0087cc *.color14: #0087cc ! ! White *.color7: #cccccc *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #8e2a19 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Obsidian ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #cdcdcd *.background: #283033 *.cursorColor: #c0cad0 ! ! Black *.color0: #000000 *.color8: #555555 ! ! Red *.color1: #a60001 *.color9: #ff0003 ! ! Green *.color2: #00bb00 *.color10: #93c863 ! ! Yellow *.color3: #fecd22 *.color11: #fef874 ! ! Blue *.color4: #3a9bdb *.color12: #a1d7ff ! ! Magenta *.color5: #bb00bb *.color13: #ff55ff ! ! Cyan *.color6: #00bbbb *.color14: #55ffff ! ! White *.color7: #bbbbbb *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Ocean ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffffff *.background: #224fbc *.cursorColor: #7f7f7f ! ! Black *.color0: #000000 *.color8: #666666 ! ! Red *.color1: #990000 *.color9: #e50000 ! ! Green *.color2: #00a600 *.color10: #00d900 ! ! Yellow *.color3: #999900 *.color11: #e5e500 ! ! Blue *.color4: #0000b2 *.color12: #0000ff ! ! Magenta *.color5: #b200b2 *.color13: #e500e5 ! ! Cyan *.color6: #00a6b2 *.color14: #00e5e5 ! ! White *.color7: #bfbfbf *.color15: #e5e5e5 ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/OceanicMaterial ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #c2c8d7 *.background: #1c262b *.cursorColor: #b3b8c3 ! ! Black *.color0: #000000 *.color8: #777777 ! ! Red *.color1: #ee2b2a *.color9: #dc5c60 ! ! Green *.color2: #40a33f *.color10: #70be71 ! ! Yellow *.color3: #ffea2e *.color11: #fff163 ! ! Blue *.color4: #1e80f0 *.color12: #54a4f3 ! ! Magenta *.color5: #8800a0 *.color13: #aa4dbc ! ! Cyan *.color6: #16afca *.color14: #42c7da ! ! White *.color7: #a4a4a4 *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Ollie ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #8a8dae *.background: #222125 *.cursorColor: #5b6ea7 ! ! Black *.color0: #000000 *.color8: #5b3725 ! ! Red *.color1: #ac2e31 *.color9: #ff3d48 ! ! Green *.color2: #31ac61 *.color10: #3bff99 ! ! Yellow *.color3: #ac4300 *.color11: #ff5e1e ! ! Blue *.color4: #2d57ac *.color12: #4488ff ! ! Magenta *.color5: #b08528 *.color13: #ffc21d ! ! Cyan *.color6: #1fa6ac *.color14: #1ffaff ! ! White *.color7: #8a8eac *.color15: #5b6ea7 ! ! Bold, Italic, Underline *.colorBD: #5c6dac !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/OneHalfDark ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #dcdfe4 *.background: #282c34 *.cursorColor: #a3b3cc ! ! Black *.color0: #282c34 *.color8: #282c34 ! ! Red *.color1: #e06c75 *.color9: #e06c75 ! ! Green *.color2: #98c379 *.color10: #98c379 ! ! Yellow *.color3: #e5c07b *.color11: #e5c07b ! ! Blue *.color4: #61afef *.color12: #61afef ! ! Magenta *.color5: #c678dd *.color13: #c678dd ! ! Cyan *.color6: #56b6c2 *.color14: #56b6c2 ! ! White *.color7: #dcdfe4 *.color15: #dcdfe4 ! ! Bold, Italic, Underline *.colorBD: #abb2bf !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/OneHalfLight ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #383a42 *.background: #fafafa *.cursorColor: #bfceff ! ! Black *.color0: #383a42 *.color8: #4f525e ! ! Red *.color1: #e45649 *.color9: #e06c75 ! ! Green *.color2: #50a14f *.color10: #98c379 ! ! Yellow *.color3: #c18401 *.color11: #e5c07b ! ! Blue *.color4: #0184bc *.color12: #61afef ! ! Magenta *.color5: #a626a4 *.color13: #c678dd ! ! Cyan *.color6: #0997b3 *.color14: #56b6c2 ! ! White *.color7: #fafafa *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #abb2bf !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Pandora ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #e1e1e1 *.background: #141e43 *.cursorColor: #43d58e ! ! Black *.color0: #000000 *.color8: #3f5648 ! ! Red *.color1: #ff4242 *.color9: #ff3242 ! ! Green *.color2: #74af68 *.color10: #74cd68 ! ! Yellow *.color3: #ffad29 *.color11: #ffb929 ! ! Blue *.color4: #338f86 *.color12: #23d7d7 ! ! Magenta *.color5: #9414e6 *.color13: #ff37ff ! ! Cyan *.color6: #23d7d7 *.color14: #00ede1 ! ! White *.color7: #e2e2e2 *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #67a672 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Paraiso Dark ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #a39e9b *.background: #2f1e2e *.cursorColor: #a39e9b ! ! Black *.color0: #2f1e2e *.color8: #776e71 ! ! Red *.color1: #ef6155 *.color9: #ef6155 ! ! Green *.color2: #48b685 *.color10: #48b685 ! ! Yellow *.color3: #fec418 *.color11: #fec418 ! ! Blue *.color4: #06b6ef *.color12: #06b6ef ! ! Magenta *.color5: #815ba4 *.color13: #815ba4 ! ! Cyan *.color6: #5bc4bf *.color14: #5bc4bf ! ! White *.color7: #a39e9b *.color15: #e7e9db ! ! Bold, Italic, Underline *.colorBD: #a39e9b !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Parasio Dark ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #a39e9b *.background: #2f1e2e *.cursorColor: #a39e9b ! ! Black *.color0: #2f1e2e *.color8: #776e71 ! ! Red *.color1: #ef6155 *.color9: #ef6155 ! ! Green *.color2: #48b685 *.color10: #48b685 ! ! Yellow *.color3: #fec418 *.color11: #fec418 ! ! Blue *.color4: #06b6ef *.color12: #06b6ef ! ! Magenta *.color5: #815ba4 *.color13: #815ba4 ! ! Cyan *.color6: #5bc4bf *.color14: #5bc4bf ! ! White *.color7: #a39e9b *.color15: #e7e9db ! ! Bold, Italic, Underline *.colorBD: #a39e9b !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/PaulMillr ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #f2f2f2 *.background: #000000 *.cursorColor: #4d4d4d ! ! Black *.color0: #2a2a2a *.color8: #666666 ! ! Red *.color1: #ff0000 *.color9: #ff0080 ! ! Green *.color2: #79ff0f *.color10: #66ff66 ! ! Yellow *.color3: #e7bf00 *.color11: #f3d64e ! ! Blue *.color4: #396bd7 *.color12: #709aed ! ! Magenta *.color5: #b449be *.color13: #db67e6 ! ! Cyan *.color6: #66ccff *.color14: #7adff2 ! ! White *.color7: #bbbbbb *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/PencilDark ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #f1f1f1 *.background: #212121 *.cursorColor: #20bbfc ! ! Black *.color0: #212121 *.color8: #424242 ! ! Red *.color1: #c30771 *.color9: #fb007a ! ! Green *.color2: #10a778 *.color10: #5fd7af ! ! Yellow *.color3: #a89c14 *.color11: #f3e430 ! ! Blue *.color4: #008ec4 *.color12: #20bbfc ! ! Magenta *.color5: #523c79 *.color13: #6855de ! ! Cyan *.color6: #20a5ba *.color14: #4fb8cc ! ! White *.color7: #d9d9d9 *.color15: #f1f1f1 ! ! Bold, Italic, Underline *.colorBD: #fb007a !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/PencilLight ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #424242 *.background: #f1f1f1 *.cursorColor: #20bbfc ! ! Black *.color0: #212121 *.color8: #424242 ! ! Red *.color1: #c30771 *.color9: #fb007a ! ! Green *.color2: #10a778 *.color10: #5fd7af ! ! Yellow *.color3: #a89c14 *.color11: #f3e430 ! ! Blue *.color4: #008ec4 *.color12: #20bbfc ! ! Magenta *.color5: #523c79 *.color13: #6855de ! ! Cyan *.color6: #20a5ba *.color14: #4fb8cc ! ! White *.color7: #d9d9d9 *.color15: #f1f1f1 ! ! Bold, Italic, Underline *.colorBD: #fb007a !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Piatto Light ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #414141 *.background: #ffffff *.cursorColor: #5e77c8 ! ! Black *.color0: #414141 *.color8: #3f3f3f ! ! Red *.color1: #b23771 *.color9: #db3365 ! ! Green *.color2: #66781e *.color10: #829429 ! ! Yellow *.color3: #cd6f34 *.color11: #cd6f34 ! ! Blue *.color4: #3c5ea8 *.color12: #3c5ea8 ! ! Magenta *.color5: #a454b2 *.color13: #a454b2 ! ! Cyan *.color6: #66781e *.color14: #829429 ! ! White *.color7: #ffffff *.color15: #f2f2f2 ! ! Bold, Italic, Underline *.colorBD: #323232 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Pnevma ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #d0d0d0 *.background: #1c1c1c *.cursorColor: #e4c9af ! ! Black *.color0: #2f2e2d *.color8: #4a4845 ! ! Red *.color1: #a36666 *.color9: #d78787 ! ! Green *.color2: #90a57d *.color10: #afbea2 ! ! Yellow *.color3: #d7af87 *.color11: #e4c9af ! ! Blue *.color4: #7fa5bd *.color12: #a1bdce ! ! Magenta *.color5: #c79ec4 *.color13: #d7beda ! ! Cyan *.color6: #8adbb4 *.color14: #b1e7dd ! ! White *.color7: #d0d0d0 *.color15: #efefef ! ! Bold, Italic, Underline *.colorBD: #e5e5e5 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Pro ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #f2f2f2 *.background: #000000 *.cursorColor: #4d4d4d ! ! Black *.color0: #000000 *.color8: #666666 ! ! Red *.color1: #990000 *.color9: #e50000 ! ! Green *.color2: #00a600 *.color10: #00d900 ! ! Yellow *.color3: #999900 *.color11: #e5e500 ! ! Blue *.color4: #2009db *.color12: #0000ff ! ! Magenta *.color5: #b200b2 *.color13: #e500e5 ! ! Cyan *.color6: #00a6b2 *.color14: #00e5e5 ! ! White *.color7: #bfbfbf *.color15: #e5e5e5 ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Red Alert ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffffff *.background: #762423 *.cursorColor: #ffffff ! ! Black *.color0: #000000 *.color8: #262626 ! ! Red *.color1: #d62e4e *.color9: #e02553 ! ! Green *.color2: #71be6b *.color10: #aff08c ! ! Yellow *.color3: #beb86b *.color11: #dfddb7 ! ! Blue *.color4: #489bee *.color12: #65aaf1 ! ! Magenta *.color5: #e979d7 *.color13: #ddb7df ! ! Cyan *.color6: #6bbeb8 *.color14: #b7dfdd ! ! White *.color7: #d6d6d6 *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ff9c44 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Red Sands ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #d7c9a7 *.background: #7a251e *.cursorColor: #ffffff ! ! Black *.color0: #000000 *.color8: #555555 ! ! Red *.color1: #ff3f00 *.color9: #bb0000 ! ! Green *.color2: #00bb00 *.color10: #00bb00 ! ! Yellow *.color3: #e7b000 *.color11: #e7b000 ! ! Blue *.color4: #0072ff *.color12: #0072ae ! ! Magenta *.color5: #bb00bb *.color13: #ff55ff ! ! Cyan *.color6: #00bbbb *.color14: #55ffff ! ! White *.color7: #bbbbbb *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #dfbd22 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Relaxed ================================================ ! special *.foreground: #d8d8d8 *.background: #343a43 *.cursorColor: #d8d8d8 ! black *.color0: #2c3037 *.color8: #626262 ! red *.color1: #bb5653 *.color9: #c35956 ! green *.color2: #909d62 *.color10: #9fab76 ! yellow *.color3: #eac179 *.color11: #ecc179 ! blue *.color4: #698698 *.color12: #7da9c7 ! magenta *.color5: #b06597 *.color13: #ba6ca0 ! cyan *.color6: #c9dfff *.color14: #abbacf ! white *.color7: #d8d8d8 *.color15: #f7f7f7 ================================================ FILE: tabby-community-color-schemes/schemes/Rippedcasts ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffffff *.background: #2b2b2b *.cursorColor: #7f7f7f ! ! Black *.color0: #000000 *.color8: #666666 ! ! Red *.color1: #cdaf95 *.color9: #eecbad ! ! Green *.color2: #a8ff60 *.color10: #bcee68 ! ! Yellow *.color3: #bfbb1f *.color11: #e5e500 ! ! Blue *.color4: #75a5b0 *.color12: #86bdc9 ! ! Magenta *.color5: #ff73fd *.color13: #e500e5 ! ! Cyan *.color6: #5a647e *.color14: #8c9bc4 ! ! White *.color7: #bfbfbf *.color15: #e5e5e5 ! ! Bold, Italic, Underline *.colorBD: #d0f367 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Rose Pine ================================================ ! ! Rosé Pine ! https://rosepinetheme.com/ ! *.foreground: #e0def4 *.background: #191724 *.cursorColor: #555169 ! ! Black *.color0: #26233a *.color8: #6e6a86 ! ! Red *.color1: #eb6f92 *.color9: #eb6f92 ! ! Green *.color2: #31748f *.color10: #31748f ! ! Yellow *.color3: #f6c177 *.color11: #f6c177 ! ! Blue *.color4: #9ccfd8 *.color12: #9ccfd8 ! Magenta *.color5: #c4a7e7 *.color13: #c4a7e7 ! ! Cyan *.color6: #ebbcba *.color14: #ebbcba ! ! White *.color7: #e0def4 *.color15: #e0def4 ! ! Bold, Italic, Underline !*.colorBD: !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Rose Pine Dawn ================================================ ! ! Rosé Pine Dawn ! https://rosepinetheme.com/ ! *.foreground: #575279 *.background: #faf4ed *.cursorColor: #9893a5 ! ! Black *.color0: #f2e9de *.color8: #6e6a86 ! ! Red *.color1: #b4637a *.color9: #b4637a ! ! Green *.color2: #286983 *.color10: #286983 ! ! Yellow *.color3: #ea9d34 *.color11: #ea9d34 ! ! Blue *.color4: #56949f *.color12: #56949f ! ! Magenta *.color5: #907aa9 *.color13: #907aa9 ! ! Cyan *.color6: #d7827e *.color14: #d7827e ! ! White *.color7: #575279 *.color15: #575279 ! ! Bold, Italic, Underline !*.colorBD: !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Rose Pine Moon ================================================ ! ! Rosé Pine Moon ! https://rosepinetheme.com/ ! *.foreground: #e0def4 *.background: #232136 *.cursorColor: #59546d ! ! Black *.color0: #393552 *.color8: #817c9c ! ! Red *.color1: #eb6f92 *.color9: #eb6f92 ! ! Green *.color2: #3e8fb0 *.color10: #3e8fb0 ! ! Yellow *.color3: #f6c177 *.color11: #f6c177 ! ! Blue *.color4: #9ccfd8 *.color12: #9ccfd8 ! ! Magenta *.color5: #c4a7e7 *.color13: #c4a7e7 ! ! Cyan *.color6: #ea9a97 *.color14: #ea9a97 ! ! White *.color7: #e0def4 *.color15: #e0def4 ! ! Bold, Italic, Underline !*.colorBD: !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Royal ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #514968 *.background: #100815 *.cursorColor: #524966 ! ! Black *.color0: #241f2b *.color8: #312d3d ! ! Red *.color1: #91284c *.color9: #d5356c ! ! Green *.color2: #23801c *.color10: #2cd946 ! ! Yellow *.color3: #b49d27 *.color11: #fde83b ! ! Blue *.color4: #6580b0 *.color12: #90baf9 ! ! Magenta *.color5: #674d96 *.color13: #a479e3 ! ! Cyan *.color6: #8aaabe *.color14: #acd4eb ! ! White *.color7: #524966 *.color15: #9e8cbd ! ! Bold, Italic, Underline *.colorBD: #c8bd1d !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Ryuuko ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ececec *.background: #2c3941 *.cursorColor: #ececec ! ! Black *.color0: #2c3941 *.color8: #5d7079 ! ! Red *.color1: #865f5b *.color9: #865f5b ! ! Green *.color2: #66907d *.color10: #66907d ! ! Yellow *.color3: #b1a990 *.color11: #b1a990 ! ! Blue *.color4: #6a8e95 *.color12: #6a8e95 ! ! Magenta *.color5: #b18a73 *.color13: #b18a73 ! ! Cyan *.color6: #88b2ac *.color14: #88b2ac ! ! White *.color7: #ececec *.color15: #ececec ! ! Bold, Italic, Underline *.colorBD: #819090 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/SeaShells ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #deb88d *.background: #09141b *.cursorColor: #fca02f ! ! Black *.color0: #17384c *.color8: #434b53 ! ! Red *.color1: #d15123 *.color9: #d48678 ! ! Green *.color2: #027c9b *.color10: #628d98 ! ! Yellow *.color3: #fca02f *.color11: #fdd39f ! ! Blue *.color4: #1e4950 *.color12: #1bbcdd ! ! Magenta *.color5: #68d4f1 *.color13: #bbe3ee ! ! Cyan *.color6: #50a3b5 *.color14: #87acb4 ! ! White *.color7: #deb88d *.color15: #fee4ce ! ! Bold, Italic, Underline *.colorBD: #ffe4cc !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Seafoam Pastel ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #d4e7d4 *.background: #243435 *.cursorColor: #57647a ! ! Black *.color0: #757575 *.color8: #8a8a8a ! ! Red *.color1: #825d4d *.color9: #cf937a ! ! Green *.color2: #728c62 *.color10: #98d9aa ! ! Yellow *.color3: #ada16d *.color11: #fae79d ! ! Blue *.color4: #4d7b82 *.color12: #7ac3cf ! ! Magenta *.color5: #8a7267 *.color13: #d6b2a1 ! ! Cyan *.color6: #729494 *.color14: #ade0e0 ! ! White *.color7: #e0e0e0 *.color15: #e0e0e0 ! ! Bold, Italic, Underline *.colorBD: #648890 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Seti ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #cacecd *.background: #111213 *.cursorColor: #e3bf21 ! ! Black *.color0: #323232 *.color8: #323232 ! ! Red *.color1: #c22832 *.color9: #c22832 ! ! Green *.color2: #8ec43d *.color10: #8ec43d ! ! Yellow *.color3: #e0c64f *.color11: #e0c64f ! ! Blue *.color4: #43a5d5 *.color12: #43a5d5 ! ! Magenta *.color5: #8b57b5 *.color13: #8b57b5 ! ! Cyan *.color6: #8ec43d *.color14: #8ec43d ! ! White *.color7: #eeeeee *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #cacecd !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Shaman ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #405555 *.background: #001015 *.cursorColor: #4afcd6 ! ! Black *.color0: #012026 *.color8: #384451 ! ! Red *.color1: #b2302d *.color9: #ff4242 ! ! Green *.color2: #00a941 *.color10: #2aea5e ! ! Yellow *.color3: #5e8baa *.color11: #8ed4fd ! ! Blue *.color4: #449a86 *.color12: #61d5ba ! ! Magenta *.color5: #00599d *.color13: #1298ff ! ! Cyan *.color6: #5d7e19 *.color14: #98d028 ! ! White *.color7: #405555 *.color15: #58fbd6 ! ! Bold, Italic, Underline *.colorBD: #53fbd6 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Slate ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #35b1d2 *.background: #222222 *.cursorColor: #87d3c4 ! ! Black *.color0: #222222 *.color8: #ffffff ! ! Red *.color1: #e2a8bf *.color9: #ffcdd9 ! ! Green *.color2: #81d778 *.color10: #beffa8 ! ! Yellow *.color3: #c4c9c0 *.color11: #d0ccca ! ! Blue *.color4: #264b49 *.color12: #7ab0d2 ! ! Magenta *.color5: #a481d3 *.color13: #c5a7d9 ! ! Cyan *.color6: #15ab9c *.color14: #8cdfe0 ! ! White *.color7: #02c5e0 *.color15: #e0e0e0 ! ! Bold, Italic, Underline *.colorBD: #648890 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Smyck ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #f7f7f7 *.background: #1b1b1b *.cursorColor: #bbbbbb ! ! Black *.color0: #000000 *.color8: #7a7a7a ! ! Red *.color1: #b84131 *.color9: #d6837c ! ! Green *.color2: #7da900 *.color10: #c4f137 ! ! Yellow *.color3: #c4a500 *.color11: #fee14d ! ! Blue *.color4: #62a3c4 *.color12: #8dcff0 ! ! Magenta *.color5: #ba8acc *.color13: #f79aff ! ! Cyan *.color6: #207383 *.color14: #6ad9cf ! ! White *.color7: #a1a1a1 *.color15: #f7f7f7 ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/SoftServer ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #99a3a2 *.background: #242626 *.cursorColor: #d2e0de ! ! Black *.color0: #000000 *.color8: #666c6c ! ! Red *.color1: #a2686a *.color9: #dd5c60 ! ! Green *.color2: #9aa56a *.color10: #bfdf55 ! ! Yellow *.color3: #a3906a *.color11: #deb360 ! ! Blue *.color4: #6b8fa3 *.color12: #62b1df ! ! Magenta *.color5: #6a71a3 *.color13: #606edf ! ! Cyan *.color6: #6ba58f *.color14: #64e39c ! ! White *.color7: #99a3a2 *.color15: #d2e0de ! ! Bold, Italic, Underline *.colorBD: #d2e0de !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Solarized Darcula ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #d2d8d9 *.background: #3d3f41 *.cursorColor: #708284 ! ! Black *.color0: #25292a *.color8: #25292a ! ! Red *.color1: #f24840 *.color9: #f24840 ! ! Green *.color2: #629655 *.color10: #629655 ! ! Yellow *.color3: #b68800 *.color11: #b68800 ! ! Blue *.color4: #2075c7 *.color12: #2075c7 ! ! Magenta *.color5: #797fd4 *.color13: #797fd4 ! ! Cyan *.color6: #15968d *.color14: #15968d ! ! White *.color7: #d2d8d9 *.color15: #d2d8d9 ! ! Bold, Italic, Underline *.colorBD: #ececec !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Solarized Dark ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #708284 *.background: #001e27 *.cursorColor: #708284 ! ! Black *.color0: #002831 *.color8: #001e27 ! ! Red *.color1: #d11c24 *.color9: #bd3613 ! ! Green *.color2: #738a05 *.color10: #475b62 ! ! Yellow *.color3: #a57706 *.color11: #536870 ! ! Blue *.color4: #2176c7 *.color12: #708284 ! ! Magenta *.color5: #c61c6f *.color13: #5956ba ! ! Cyan *.color6: #259286 *.color14: #819090 ! ! White *.color7: #eae3cb *.color15: #fcf4dc ! ! Bold, Italic, Underline *.colorBD: #819090 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Solarized Dark - Patched ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #708284 *.background: #001e27 *.cursorColor: #708284 ! ! Black *.color0: #002831 *.color8: #475b62 ! ! Red *.color1: #d11c24 *.color9: #bd3613 ! ! Green *.color2: #738a05 *.color10: #475b62 ! ! Yellow *.color3: #a57706 *.color11: #536870 ! ! Blue *.color4: #2176c7 *.color12: #708284 ! ! Magenta *.color5: #c61c6f *.color13: #5956ba ! ! Cyan *.color6: #259286 *.color14: #819090 ! ! White *.color7: #eae3cb *.color15: #fcf4dc ! ! Bold, Italic, Underline *.colorBD: #819090 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Solarized Dark Higher Contrast ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #9cc2c3 *.background: #001e27 *.cursorColor: #f34b00 ! ! Black *.color0: #002831 *.color8: #006488 ! ! Red *.color1: #d11c24 *.color9: #f5163b ! ! Green *.color2: #6cbe6c *.color10: #51ef84 ! ! Yellow *.color3: #a57706 *.color11: #b27e28 ! ! Blue *.color4: #2176c7 *.color12: #178ec8 ! ! Magenta *.color5: #c61c6f *.color13: #e24d8e ! ! Cyan *.color6: #259286 *.color14: #00b39e ! ! White *.color7: #eae3cb *.color15: #fcf4dc ! ! Bold, Italic, Underline *.colorBD: #b5d5d3 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Solarized Light ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #536870 *.background: #fcf4dc *.cursorColor: #536870 ! ! Black *.color0: #002831 *.color8: #001e27 ! ! Red *.color1: #d11c24 *.color9: #bd3613 ! ! Green *.color2: #738a05 *.color10: #475b62 ! ! Yellow *.color3: #a57706 *.color11: #536870 ! ! Blue *.color4: #2176c7 *.color12: #708284 ! ! Magenta *.color5: #c61c6f *.color13: #5956ba ! ! Cyan *.color6: #259286 *.color14: #819090 ! ! White *.color7: #eae3cb *.color15: #fcf4dc ! ! Bold, Italic, Underline *.colorBD: #475b62 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/SpaceGray ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #b3b8c3 *.background: #20242d *.cursorColor: #b3b8c3 ! ! Black *.color0: #000000 *.color8: #000000 ! ! Red *.color1: #b04b57 *.color9: #b04b57 ! ! Green *.color2: #87b379 *.color10: #87b379 ! ! Yellow *.color3: #e5c179 *.color11: #e5c179 ! ! Blue *.color4: #7d8fa4 *.color12: #7d8fa4 ! ! Magenta *.color5: #a47996 *.color13: #a47996 ! ! Cyan *.color6: #85a7a5 *.color14: #85a7a5 ! ! White *.color7: #b3b8c3 *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #b3b8c3 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/SpaceGray Eighties ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #bdbaae *.background: #222222 *.cursorColor: #bbbbbb ! ! Black *.color0: #15171c *.color8: #555555 ! ! Red *.color1: #ec5f67 *.color9: #ff6973 ! ! Green *.color2: #81a764 *.color10: #93d493 ! ! Yellow *.color3: #fec254 *.color11: #ffd256 ! ! Blue *.color4: #5486c0 *.color12: #4d84d1 ! ! Magenta *.color5: #bf83c1 *.color13: #ff55ff ! ! Cyan *.color6: #57c2c1 *.color14: #83e9e4 ! ! White *.color7: #efece7 *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/SpaceGray Eighties Dull ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #c9c6bc *.background: #222222 *.cursorColor: #bbbbbb ! ! Black *.color0: #15171c *.color8: #555555 ! ! Red *.color1: #b24a56 *.color9: #ec5f67 ! ! Green *.color2: #92b477 *.color10: #89e986 ! ! Yellow *.color3: #c6735a *.color11: #fec254 ! ! Blue *.color4: #7c8fa5 *.color12: #5486c0 ! ! Magenta *.color5: #a5789e *.color13: #bf83c1 ! ! Cyan *.color6: #80cdcb *.color14: #58c2c1 ! ! White *.color7: #b3b8c3 *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Spacedust ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ecf0c1 *.background: #0a1e24 *.cursorColor: #708284 ! ! Black *.color0: #6e5346 *.color8: #684c31 ! ! Red *.color1: #e35b00 *.color9: #ff8a3a ! ! Green *.color2: #5cab96 *.color10: #aecab8 ! ! Yellow *.color3: #e3cd7b *.color11: #ffc878 ! ! Blue *.color4: #0f548b *.color12: #67a0ce ! ! Magenta *.color5: #e35b00 *.color13: #ff8a3a ! ! Cyan *.color6: #06afc7 *.color14: #83a7b4 ! ! White *.color7: #f0f1ce *.color15: #fefff1 ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Spiderman ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #e3e3e3 *.background: #1b1d1e *.cursorColor: #2c3fff ! ! Black *.color0: #1b1d1e *.color8: #505354 ! ! Red *.color1: #e60813 *.color9: #ff0325 ! ! Green *.color2: #e22928 *.color10: #ff3338 ! ! Yellow *.color3: #e24756 *.color11: #fe3a35 ! ! Blue *.color4: #2c3fff *.color12: #1d50ff ! ! Magenta *.color5: #2435db *.color13: #747cff ! ! Cyan *.color6: #3256ff *.color14: #6184ff ! ! White *.color7: #fffef6 *.color15: #fffff9 ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Spring ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #4d4d4c *.background: #ffffff *.cursorColor: #4d4d4c ! ! Black *.color0: #000000 *.color8: #000000 ! ! Red *.color1: #ff4d83 *.color9: #ff0021 ! ! Green *.color2: #1f8c3b *.color10: #1fc231 ! ! Yellow *.color3: #1fc95b *.color11: #d5b807 ! ! Blue *.color4: #1dd3ee *.color12: #15a9fd ! ! Magenta *.color5: #8959a8 *.color13: #8959a8 ! ! Cyan *.color6: #3e999f *.color14: #3e999f ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #4d4d4c !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Square ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #acacab *.background: #1a1a1a *.cursorColor: #fcfbcc ! ! Black *.color0: #050505 *.color8: #141414 ! ! Red *.color1: #e9897c *.color9: #f99286 ! ! Green *.color2: #b6377d *.color10: #c3f786 ! ! Yellow *.color3: #ecebbe *.color11: #fcfbcc ! ! Blue *.color4: #a9cdeb *.color12: #b6defb ! ! Magenta *.color5: #75507b *.color13: #ad7fa8 ! ! Cyan *.color6: #c9caec *.color14: #d7d9fc ! ! White *.color7: #f2f2f2 *.color15: #e2e2e2 ! ! Bold, Italic, Underline *.colorBD: #e5e5e5 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Sundried ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #c9c9c9 *.background: #1a1818 *.cursorColor: #ffffff ! ! Black *.color0: #302b2a *.color8: #4d4e48 ! ! Red *.color1: #a7463d *.color9: #aa000c ! ! Green *.color2: #587744 *.color10: #128c21 ! ! Yellow *.color3: #9d602a *.color11: #fc6a21 ! ! Blue *.color4: #485b98 *.color12: #7999f7 ! ! Magenta *.color5: #864651 *.color13: #fd8aa1 ! ! Cyan *.color6: #9c814f *.color14: #fad484 ! ! White *.color7: #c9c9c9 *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Symfonic ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffffff *.background: #000000 *.cursorColor: #dc322f ! ! Black *.color0: #000000 *.color8: #1b1d21 ! ! Red *.color1: #dc322f *.color9: #dc322f ! ! Green *.color2: #56db3a *.color10: #56db3a ! ! Yellow *.color3: #ff8400 *.color11: #ff8400 ! ! Blue *.color4: #0084d4 *.color12: #0084d4 ! ! Magenta *.color5: #b729d9 *.color13: #b729d9 ! ! Cyan *.color6: #ccccff *.color14: #ccccff ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ff8400 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Tango ================================================ ! special *.foreground: #babdb6 *.background: #000000 *.cursorColor: #babdb6 ! black *.color0: #2e3436 *.color8: #555753 ! red *.color1: #cc0000 *.color9: #ef2929 ! green *.color2: #4e9a06 *.color10: #8ae234 ! yellow *.color3: #c4a000 *.color11: #fce94f ! blue *.color4: #3465a4 *.color12: #729fcf ! magenta *.color5: #75507b *.color13: #ad7fa8 ! cyan *.color6: #06989a *.color14: #34e2e2 ! white *.color7: #d3d7cf *.color15: #eeeeec ================================================ FILE: tabby-community-color-schemes/schemes/Teerb ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #d0d0d0 *.background: #262626 *.cursorColor: #e4c9af ! ! Black *.color0: #1c1c1c *.color8: #1c1c1c ! ! Red *.color1: #d68686 *.color9: #d68686 ! ! Green *.color2: #aed686 *.color10: #aed686 ! ! Yellow *.color3: #d7af87 *.color11: #e4c9af ! ! Blue *.color4: #86aed6 *.color12: #86aed6 ! ! Magenta *.color5: #d6aed6 *.color13: #d6aed6 ! ! Cyan *.color6: #8adbb4 *.color14: #b1e7dd ! ! White *.color7: #d0d0d0 *.color15: #efefef ! ! Bold, Italic, Underline *.colorBD: #e5e5e5 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Terminal Basic ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #000000 *.background: #ffffff *.cursorColor: #7f7f7f ! ! Black *.color0: #000000 *.color8: #666666 ! ! Red *.color1: #990000 *.color9: #e50000 ! ! Green *.color2: #00a600 *.color10: #00d900 ! ! Yellow *.color3: #999900 *.color11: #e5e500 ! ! Blue *.color4: #0000b2 *.color12: #0000ff ! ! Magenta *.color5: #b200b2 *.color13: #e500e5 ! ! Cyan *.color6: #00a6b2 *.color14: #00e5e5 ! ! White *.color7: #bfbfbf *.color15: #e5e5e5 ! ! Bold, Italic, Underline *.colorBD: #000000 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Thayer Bright ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #f8f8f8 *.background: #1b1d1e *.cursorColor: #fc971f ! ! Black *.color0: #1b1d1e *.color8: #505354 ! ! Red *.color1: #f92672 *.color9: #ff5995 ! ! Green *.color2: #4df840 *.color10: #b6e354 ! ! Yellow *.color3: #f4fd22 *.color11: #feed6c ! ! Blue *.color4: #2757d6 *.color12: #3f78ff ! ! Magenta *.color5: #8c54fe *.color13: #9e6ffe ! ! Cyan *.color6: #38c8b5 *.color14: #23cfd5 ! ! White *.color7: #ccccc6 *.color15: #f8f8f2 ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/The Hulk ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #b5b5b5 *.background: #1b1d1e *.cursorColor: #16b61b ! ! Black *.color0: #1b1d1e *.color8: #505354 ! ! Red *.color1: #269d1b *.color9: #8dff2a ! ! Green *.color2: #13ce30 *.color10: #48ff77 ! ! Yellow *.color3: #63e457 *.color11: #3afe16 ! ! Blue *.color4: #2525f5 *.color12: #506b95 ! ! Magenta *.color5: #641f74 *.color13: #72589d ! ! Cyan *.color6: #378ca9 *.color14: #4085a6 ! ! White *.color7: #d9d8d1 *.color15: #e5e6e1 ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/TokyoNight ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #c0caf5 *.background: #1a1b26 *.cursorColor: #c0caf5 ! ! Black *.color0: #15161e *.color8: #414868 ! ! Red *.color1: #f7768e *.color9: #f7768e ! ! Green *.color2: #9ece6a *.color10: #9ece6a ! ! Yellow *.color3: #e0af68 *.color11: #e0af68 ! ! Blue *.color4: #7aa2f7 *.color12: #7aa2f7 ! ! Magenta *.color5: #bb9af7 *.color13: #bb9af7 ! ! Cyan *.color6: #7dcfff *.color14: #7dcfff ! ! White *.color7: #a9b1d6 *.color15: #c0caf5 ! ! Bold, Italic, Underline *.colorBD: #eeeeee !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/TokyoNight Day ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #3760bf *.background: #e1e2e7 *.cursorColor: #3760bf ! ! Black *.color0: #e9e9ed *.color8: #a1a6c5 ! ! Red *.color1: #f52a65 *.color9: #f52a65 ! ! Green *.color2: #587539 *.color10: #587539 ! ! Yellow *.color3: #8c6c3e *.color11: #8c6c3e ! ! Blue *.color4: #2e7de9 *.color12: #2e7de9 ! ! Magenta *.color5: #9854f1 *.color13: #9854f1 ! ! Cyan *.color6: #007197 *.color14: #007197 ! ! White *.color7: #6172b0 *.color15: #3760bf ! ! Bold, Italic, Underline *.colorBD: #eeeeee !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/TokyoNight Storm ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #c0caf5 *.background: #24283b *.cursorColor: #c0caf5 ! ! Black *.color0: #1d202f *.color8: #414868 ! ! Red *.color1: #f7768e *.color9: #f7768e ! ! Green *.color2: #9ece6a *.color10: #9ece6a ! ! Yellow *.color3: #e0af68 *.color11: #e0af68 ! ! Blue *.color4: #7aa2f7 *.color12: #7aa2f7 ! ! Magenta *.color5: #bb9af7 *.color13: #bb9af7 ! ! Cyan *.color6: #7dcfff *.color14: #7dcfff ! ! White *.color7: #a9b1d6 *.color15: #c0caf5 ! ! Bold, Italic, Underline *.colorBD: #eeeeee !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Tomorrow ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #4d4d4c *.background: #ffffff *.cursorColor: #4d4d4c ! ! Black *.color0: #000000 *.color8: #000000 ! ! Red *.color1: #c82829 *.color9: #c82829 ! ! Green *.color2: #718c00 *.color10: #718c00 ! ! Yellow *.color3: #eab700 *.color11: #eab700 ! ! Blue *.color4: #4271ae *.color12: #4271ae ! ! Magenta *.color5: #8959a8 *.color13: #8959a8 ! ! Cyan *.color6: #3e999f *.color14: #3e999f ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #4d4d4c !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Tomorrow Night ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #c5c8c6 *.background: #1d1f21 *.cursorColor: #c5c8c6 ! ! Black *.color0: #000000 *.color8: #000000 ! ! Red *.color1: #cc6666 *.color9: #cc6666 ! ! Green *.color2: #b5bd68 *.color10: #b5bd68 ! ! Yellow *.color3: #f0c674 *.color11: #f0c674 ! ! Blue *.color4: #81a2be *.color12: #81a2be ! ! Magenta *.color5: #b294bb *.color13: #b294bb ! ! Cyan *.color6: #8abeb7 *.color14: #8abeb7 ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #c5c8c6 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Tomorrow Night Blue ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffffff *.background: #002451 *.cursorColor: #ffffff ! ! Black *.color0: #000000 *.color8: #000000 ! ! Red *.color1: #ff9da4 *.color9: #ff9da4 ! ! Green *.color2: #d1f1a9 *.color10: #d1f1a9 ! ! Yellow *.color3: #ffeead *.color11: #ffeead ! ! Blue *.color4: #bbdaff *.color12: #bbdaff ! ! Magenta *.color5: #ebbbff *.color13: #ebbbff ! ! Cyan *.color6: #99ffff *.color14: #99ffff ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Tomorrow Night Bright ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #eaeaea *.background: #000000 *.cursorColor: #eaeaea ! ! Black *.color0: #000000 *.color8: #000000 ! ! Red *.color1: #d54e53 *.color9: #d54e53 ! ! Green *.color2: #b9ca4a *.color10: #b9ca4a ! ! Yellow *.color3: #e7c547 *.color11: #e7c547 ! ! Blue *.color4: #7aa6da *.color12: #7aa6da ! ! Magenta *.color5: #c397d8 *.color13: #c397d8 ! ! Cyan *.color6: #70c0b1 *.color14: #70c0b1 ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #eaeaea !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Tomorrow Night Eighties ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #cccccc *.background: #2d2d2d *.cursorColor: #cccccc ! ! Black *.color0: #000000 *.color8: #000000 ! ! Red *.color1: #f2777a *.color9: #f2777a ! ! Green *.color2: #99cc99 *.color10: #99cc99 ! ! Yellow *.color3: #ffcc66 *.color11: #ffcc66 ! ! Blue *.color4: #6699cc *.color12: #6699cc ! ! Magenta *.color5: #cc99cc *.color13: #cc99cc ! ! Cyan *.color6: #66cccc *.color14: #66cccc ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #cccccc !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/ToyChest ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #31d07b *.background: #24364b *.cursorColor: #d5d5d5 ! ! Black *.color0: #2c3f58 *.color8: #336889 ! ! Red *.color1: #be2d26 *.color9: #dd5944 ! ! Green *.color2: #1a9172 *.color10: #31d07b ! ! Yellow *.color3: #db8e27 *.color11: #e7d84b ! ! Blue *.color4: #325d96 *.color12: #34a6da ! ! Magenta *.color5: #8a5edc *.color13: #ae6bdc ! ! Cyan *.color6: #35a08f *.color14: #42c3ae ! ! White *.color7: #23d183 *.color15: #d5d5d5 ! ! Bold, Italic, Underline *.colorBD: #2bff9f !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Treehouse ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #786b53 *.background: #191919 *.cursorColor: #fac814 ! ! Black *.color0: #321300 *.color8: #433626 ! ! Red *.color1: #b2270e *.color9: #ed5d20 ! ! Green *.color2: #44a900 *.color10: #55f238 ! ! Yellow *.color3: #aa820c *.color11: #f2b732 ! ! Blue *.color4: #58859a *.color12: #85cfed ! ! Magenta *.color5: #97363d *.color13: #e14c5a ! ! Cyan *.color6: #b25a1e *.color14: #f07d14 ! ! White *.color7: #786b53 *.color15: #ffc800 ! ! Bold, Italic, Underline *.colorBD: #fac800 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Twilight ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffffd4 *.background: #141414 *.cursorColor: #ffffff ! ! Black *.color0: #141414 *.color8: #262626 ! ! Red *.color1: #c06d44 *.color9: #de7c4c ! ! Green *.color2: #afb97a *.color10: #ccd88c ! ! Yellow *.color3: #c2a86c *.color11: #e2c47e ! ! Blue *.color4: #44474a *.color12: #5a5e62 ! ! Magenta *.color5: #b4be7c *.color13: #d0dc8e ! ! Cyan *.color6: #778385 *.color14: #8a989b ! ! White *.color7: #ffffd4 *.color15: #ffffd4 ! ! Bold, Italic, Underline *.colorBD: #ffffd4 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Ubuntu ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #eeeeec *.background: #300a24 *.cursorColor: #bbbbbb ! ! Black *.color0: #2e3436 *.color8: #555753 ! ! Red *.color1: #cc0000 *.color9: #ef2929 ! ! Green *.color2: #4e9a06 *.color10: #8ae234 ! ! Yellow *.color3: #c4a000 *.color11: #fce94f ! ! Blue *.color4: #3465a4 *.color12: #729fcf ! ! Magenta *.color5: #75507b *.color13: #ad7fa8 ! ! Cyan *.color6: #06989a *.color14: #34e2e2 ! ! White *.color7: #d3d7cf *.color15: #eeeeec ! ! Bold, Italic, Underline *.colorBD: #eeeeec !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/UnderTheSea ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffffff *.background: #011116 *.cursorColor: #4afcd6 ! ! Black *.color0: #022026 *.color8: #384451 ! ! Red *.color1: #b2302d *.color9: #ff4242 ! ! Green *.color2: #00a941 *.color10: #2aea5e ! ! Yellow *.color3: #59819c *.color11: #8ed4fd ! ! Blue *.color4: #459a86 *.color12: #61d5ba ! ! Magenta *.color5: #00599d *.color13: #1298ff ! ! Cyan *.color6: #5d7e19 *.color14: #98d028 ! ! White *.color7: #405555 *.color15: #58fbd6 ! ! Bold, Italic, Underline *.colorBD: #2bffd2 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Urple ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #877a9b *.background: #1b1b23 *.cursorColor: #a063eb ! ! Black *.color0: #000000 *.color8: #5d3225 ! ! Red *.color1: #b0425b *.color9: #ff6388 ! ! Green *.color2: #37a415 *.color10: #29e620 ! ! Yellow *.color3: #ad5c42 *.color11: #f08161 ! ! Blue *.color4: #564d9b *.color12: #867aed ! ! Magenta *.color5: #6c3ca1 *.color13: #a05eee ! ! Cyan *.color6: #808080 *.color14: #eaeaea ! ! White *.color7: #87799c *.color15: #bfa3ff ! ! Bold, Italic, Underline *.colorBD: #a063eb !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Vaughn ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #dcdccc *.background: #25234f *.cursorColor: #ff5555 ! ! Black *.color0: #25234f *.color8: #709080 ! ! Red *.color1: #705050 *.color9: #dca3a3 ! ! Green *.color2: #60b48a *.color10: #60b48a ! ! Yellow *.color3: #dfaf8f *.color11: #f0dfaf ! ! Blue *.color4: #5555ff *.color12: #5555ff ! ! Magenta *.color5: #f08cc3 *.color13: #ec93d3 ! ! Cyan *.color6: #8cd0d3 *.color14: #93e0e3 ! ! White *.color7: #709080 *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ff5e7d !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/VibrantInk ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffffff *.background: #000000 *.cursorColor: #ffffff ! ! Black *.color0: #878787 *.color8: #555555 ! ! Red *.color1: #ff6600 *.color9: #ff0000 ! ! Green *.color2: #ccff04 *.color10: #00ff00 ! ! Yellow *.color3: #ffcc00 *.color11: #ffff00 ! ! Blue *.color4: #44b4cc *.color12: #0000ff ! ! Magenta *.color5: #9933cc *.color13: #ff00ff ! ! Cyan *.color6: #44b4cc *.color14: #00ffff ! ! White *.color7: #f5f5f5 *.color15: #e5e5e5 ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Violet Dark ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #708284 *.background: #1c1d1f *.cursorColor: #708284 ! ! Black *.color0: #56595c *.color8: #45484b ! ! Red *.color1: #c94c22 *.color9: #bd3613 ! ! Green *.color2: #85981c *.color10: #738a04 ! ! Yellow *.color3: #b4881d *.color11: #a57705 ! ! Blue *.color4: #2e8bce *.color12: #2176c7 ! ! Magenta *.color5: #d13a82 *.color13: #c61c6f ! ! Cyan *.color6: #32a198 *.color14: #259286 ! ! White *.color7: #c9c6bd *.color15: #c9c6bd ! ! Bold, Italic, Underline *.colorBD: #475b62 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Violet Light ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #536870 *.background: #fcf4dc *.cursorColor: #536870 ! ! Black *.color0: #56595c *.color8: #45484b ! ! Red *.color1: #c94c22 *.color9: #bd3613 ! ! Green *.color2: #85981c *.color10: #738a04 ! ! Yellow *.color3: #b4881d *.color11: #a57705 ! ! Blue *.color4: #2e8bce *.color12: #2176c7 ! ! Magenta *.color5: #d13a82 *.color13: #c61c6f ! ! Cyan *.color6: #32a198 *.color14: #259286 ! ! White *.color7: #d3d0c9 *.color15: #c9c6bd ! ! Bold, Italic, Underline *.colorBD: #475b62 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/WarmNeon ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #afdab6 *.background: #404040 *.cursorColor: #30ff24 ! ! Black *.color0: #000000 *.color8: #fefcfc ! ! Red *.color1: #e24346 *.color9: #e97071 ! ! Green *.color2: #39b13a *.color10: #9cc090 ! ! Yellow *.color3: #dae145 *.color11: #ddda7a ! ! Blue *.color4: #4261c5 *.color12: #7b91d6 ! ! Magenta *.color5: #f920fb *.color13: #f674ba ! ! Cyan *.color6: #2abbd4 *.color14: #5ed1e5 ! ! White *.color7: #d0b8a3 *.color15: #d8c8bb ! ! Bold, Italic, Underline *.colorBD: #22ff0c !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Wez ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #b3b3b3 *.background: #000000 *.cursorColor: #53ae71 ! ! Black *.color0: #000000 *.color8: #555555 ! ! Red *.color1: #cc5555 *.color9: #ff5555 ! ! Green *.color2: #55cc55 *.color10: #55ff55 ! ! Yellow *.color3: #cdcd55 *.color11: #ffff55 ! ! Blue *.color4: #5555cc *.color12: #5555ff ! ! Magenta *.color5: #cc55cc *.color13: #ff55ff ! ! Cyan *.color6: #7acaca *.color14: #55ffff ! ! White *.color7: #cccccc *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ff6347 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/WildCherry ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #dafaff *.background: #1f1726 *.cursorColor: #dd00ff ! ! Black *.color0: #000507 *.color8: #009cc9 ! ! Red *.color1: #d94085 *.color9: #da6bac ! ! Green *.color2: #2ab250 *.color10: #f4dca5 ! ! Yellow *.color3: #ffd16f *.color11: #eac066 ! ! Blue *.color4: #883cdc *.color12: #308cba ! ! Magenta *.color5: #ececec *.color13: #ae636b ! ! Cyan *.color6: #c1b8b7 *.color14: #ff919d ! ! White *.color7: #fff8de *.color15: #e4838d ! ! Bold, Italic, Underline *.colorBD: #819090 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Wombat ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #dedacf *.background: #171717 *.cursorColor: #bbbbbb ! ! Black *.color0: #000000 *.color8: #313131 ! ! Red *.color1: #ff615a *.color9: #f58c80 ! ! Green *.color2: #b1e969 *.color10: #ddf88f ! ! Yellow *.color3: #ebd99c *.color11: #eee5b2 ! ! Blue *.color4: #5da9f6 *.color12: #a5c7ff ! ! Magenta *.color5: #e86aff *.color13: #ddaaff ! ! Cyan *.color6: #82fff7 *.color14: #b7fff9 ! ! White *.color7: #dedacf *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Wryan ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #999993 *.background: #101010 *.cursorColor: #9e9ecb ! ! Black *.color0: #333333 *.color8: #3d3d3d ! ! Red *.color1: #8c4665 *.color9: #bf4d80 ! ! Green *.color2: #287373 *.color10: #53a6a6 ! ! Yellow *.color3: #7c7c99 *.color11: #9e9ecb ! ! Blue *.color4: #395573 *.color12: #477ab3 ! ! Magenta *.color5: #5e468c *.color13: #7e62b3 ! ! Cyan *.color6: #31658c *.color14: #6096bf ! ! White *.color7: #899ca1 *.color15: #c0c0c0 ! ! Bold, Italic, Underline *.colorBD: #ffffff !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/Zenburn ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #dcdccc *.background: #3f3f3f *.cursorColor: #73635a ! ! Black *.color0: #4d4d4d *.color8: #709080 ! ! Red *.color1: #705050 *.color9: #dca3a3 ! ! Green *.color2: #60b48a *.color10: #c3bf9f ! ! Yellow *.color3: #f0dfaf *.color11: #e0cf9f ! ! Blue *.color4: #506070 *.color12: #94bff3 ! ! Magenta *.color5: #dc8cc3 *.color13: #ec93d3 ! ! Cyan *.color6: #8cd0d3 *.color14: #93e0e3 ! ! White *.color7: #dcdccc *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #dcdccc !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/ayu ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #e6e1cf *.background: #0f1419 *.cursorColor: #f29718 ! ! Black *.color0: #000000 *.color8: #323232 ! ! Red *.color1: #ff3333 *.color9: #ff6565 ! ! Green *.color2: #b8cc52 *.color10: #eafe84 ! ! Yellow *.color3: #e7c547 *.color11: #fff779 ! ! Blue *.color4: #36a3d9 *.color12: #68d5ff ! ! Magenta *.color5: #f07178 *.color13: #ffa3aa ! ! Cyan *.color6: #95e6cb *.color14: #c7fffd ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #e6e1cf !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/ayu_light ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #5c6773 *.background: #fafafa *.cursorColor: #ff6a00 ! ! Black *.color0: #000000 *.color8: #323232 ! ! Red *.color1: #ff3333 *.color9: #ff6565 ! ! Green *.color2: #86b300 *.color10: #b8e532 ! ! Yellow *.color3: #f29718 *.color11: #ffc94a ! ! Blue *.color4: #41a6d9 *.color12: #73d8ff ! ! Magenta *.color5: #f07178 *.color13: #ffa3aa ! ! Cyan *.color6: #4dbf99 *.color14: #7ff1cb ! ! White *.color7: #ffffff *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #5c6773 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/base2tone-cave-dark ================================================ ! ! Generated with : ! XRDB2Xrecources.py ! *.foreground: #9f999b *.background: #222021 *.cursorColor: #996e00 ! ! Black *.color0: #222021 *.color8: #635f60 ! ! Red *.color1: #936c7a *.color9: #ddaf3c ! ! Green *.color2: #cca133 *.color10: #2f2d2e ! ! Yellow *.color3: #ffcc4d *.color11: #565254 ! ! Blue *.color4: #9c818b *.color12: #706b6d ! ! Magenta *.color5: #cca133 *.color13: #f0a8c1 ! ! Cyan *.color6: #d27998 *.color14: #c39622 ! ! White *.color7: #9f999b *.color15: #ffebf2 ! ! Bold, Italic, Underline *.colorBD: #9f999b !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/base2tone-desert-dark ================================================ ! ! Generated with : ! XRDB2Xrecources.py ! *.foreground: #ada594 *.background: #292724 *.cursorColor: #bc672f ! ! Black *.color0: #292724 *.color8: #7e7767 ! ! Red *.color1: #816f4b *.color9: #f29d63 ! ! Green *.color2: #ec9255 *.color10: #3d3a34 ! ! Yellow *.color3: #ffb380 *.color11: #615c51 ! ! Blue *.color4: #957e50 *.color12: #908774 ! ! Magenta *.color5: #ec9255 *.color13: #ddcba6 ! ! Cyan *.color6: #ac8e53 *.color14: #e58748 ! ! White *.color7: #ada594 *.color15: #f2ead9 ! ! Bold, Italic, Underline *.colorBD: #ada594 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/base2tone-drawbridge-dark ================================================ ! ! Generated with : ! XRDB2Xrecources.py ! *.foreground: #9094a7 *.background: #1b1f32 *.cursorColor: #289dbd ! ! Black *.color0: #1b1f32 *.color8: #51587b ! ! Red *.color1: #627af4 *.color9: #75d5f0 ! ! Green *.color2: #67c9e4 *.color10: #252a41 ! ! Yellow *.color3: #99e9ff *.color11: #444b6f ! ! Blue *.color4: #7289fd *.color12: #5e6587 ! ! Magenta *.color5: #67c9e4 *.color13: #c3cdfe ! ! Cyan *.color6: #8b9efd *.color14: #5cbcd6 ! ! White *.color7: #9094a7 *.color15: #e1e6ff ! ! Bold, Italic, Underline *.colorBD: #9094a7 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/base2tone-evening-dark ================================================ ! ! Generated with : ! XRDB2Xrecources.py ! *.foreground: #a4a1b5 *.background: #2a2734 *.cursorColor: #b37537 ! ! Black *.color0: #2a2734 *.color8: #6c6783 ! ! Red *.color1: #8a75f5 *.color9: #ffb870 ! ! Green *.color2: #ffad5c *.color10: #363342 ! ! Yellow *.color3: #ffcc99 *.color11: #545167 ! ! Blue *.color4: #9a86fd *.color12: #787391 ! ! Magenta *.color5: #ffad5c *.color13: #d9d2fe ! ! Cyan *.color6: #afa0fe *.color14: #ffa142 ! ! White *.color7: #a4a1b5 *.color15: #eeebff ! ! Bold, Italic, Underline *.colorBD: #a4a1b5 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/base2tone-forest-dark ================================================ ! ! Generated with : ! XRDB2Xrecources.py ! *.foreground: #a1b5a1 *.background: #2a2d2a *.cursorColor: #656b47 ! ! Black *.color0: #2a2d2a *.color8: #535f53 ! ! Red *.color1: #5c705c *.color9: #cbe25a ! ! Green *.color2: #bfd454 *.color10: #353b35 ! ! Yellow *.color3: #e5fb79 *.color11: #485148 ! ! Blue *.color4: #687d68 *.color12: #5e6e5e ! ! Magenta *.color5: #bfd454 *.color13: #c8e4c8 ! ! Cyan *.color6: #8fae8f *.color14: #b1c44f ! ! White *.color7: #a1b5a1 *.color15: #f0fff0 ! ! Bold, Italic, Underline *.colorBD: #a1b5a1 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/base2tone-heath-dark ================================================ ! ! Generated with : ! XRDB2Xrecources.py ! *.foreground: #9e999f *.background: #222022 *.cursorColor: #995900 ! ! Black *.color0: #222022 *.color8: #635f63 ! ! Red *.color1: #8f6c93 *.color9: #d9b98c ! ! Green *.color2: #cc8c33 *.color10: #2f2d2f ! ! Yellow *.color3: #ffd599 *.color11: #575158 ! ! Blue *.color4: #9a819c *.color12: #6f6b70 ! ! Magenta *.color5: #cc8c33 *.color13: #eaa8f0 ! ! Cyan *.color6: #cb79d2 *.color14: #c38022 ! ! White *.color7: #9e999f *.color15: #fdebff ! ! Bold, Italic, Underline *.colorBD: #9e999f !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/base2tone-heath-light ================================================ ! ! Generated with : ! XRDB2Xrecources.py ! *.foreground: #575158 *.background: #fbfaf9 *.cursorColor: #eaa8f0 ! ! Black *.color0: #222022 *.color8: #635f63 ! ! Red *.color1: #8f6c93 *.color9: #d9b98c ! ! Green *.color2: #cc8c33 *.color10: #2f2d2f ! ! Yellow *.color3: #ffd599 *.color11: #575158 ! ! Blue *.color4: #9a819c *.color12: #6f6b70 ! ! Magenta *.color5: #b87414 *.color13: #eaa8f0 ! ! Cyan *.color6: #cb79d2 *.color14: #c38022 ! ! White *.color7: #9e999f *.color15: #fbfaf9 ! ! Bold, Italic, Underline *.colorBD: #575158 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/base2tone-lake-dark ================================================ ! ! Generated with : ! XRDB2Xrecources.py ! *.foreground: #7ba8b7 *.background: #192d34 *.cursorColor: #84740b ! ! Black *.color0: #192d34 *.color8: #3d6876 ! ! Red *.color1: #3e91ac *.color9: #d6c65c ! ! Green *.color2: #cbbb4d *.color10: #223c44 ! ! Yellow *.color3: #ffeb66 *.color11: #335966 ! ! Blue *.color4: #499fbc *.color12: #467686 ! ! Magenta *.color5: #cbbb4d *.color13: #a5d8e9 ! ! Cyan *.color6: #62b1cb *.color14: #c4b031 ! ! White *.color7: #7ba8b7 *.color15: #e1f7ff ! ! Bold, Italic, Underline *.colorBD: #7ba8b7 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/base2tone-meadow-dark ================================================ ! ! Generated with : ! XRDB2Xrecources.py ! *.foreground: #7b9eb7 *.background: #192834 *.cursorColor: #4d8217 ! ! Black *.color0: #192834 *.color8: #3d5e76 ! ! Red *.color1: #277fbe *.color9: #8cdd3c ! ! Green *.color2: #80bf40 *.color10: #223644 ! ! Yellow *.color3: #a6f655 *.color11: #335166 ! ! Blue *.color4: #4299d7 *.color12: #466b86 ! ! Magenta *.color5: #80bf40 *.color13: #afddfe ! ! Cyan *.color6: #47adf5 *.color14: #73b234 ! ! White *.color7: #7b9eb7 *.color15: #d1ecff ! ! Bold, Italic, Underline *.colorBD: #7b9eb7 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/base2tone-morning-light ================================================ ! ! Generated with : ! XRDB2Xrecources.py ! *.foreground: #4f5664 *.background: #faf8f5 *.cursorColor: #b7c9eb ! ! Black *.color0: #232834 *.color8: #656e81 ! ! Red *.color1: #1659df *.color9: #c6b28b ! ! Green *.color2: #b29762 *.color10: #31363f ! ! Yellow *.color3: #e5ddcd *.color11: #4f5664 ! ! Blue *.color4: #3d75e6 *.color12: #707a8f ! ! Magenta *.color5: #896724 *.color13: #b7c9eb ! ! Cyan *.color6: #728fcb *.color14: #9a7c42 ! ! White *.color7: #8d95a5 *.color15: #faf8f5 ! ! Bold, Italic, Underline *.colorBD: #4f5664 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/base2tone-pool-dark ================================================ ! ! Generated with : ! XRDB2Xrecources.py ! *.foreground: #9a90a7 *.background: #2a2433 *.cursorColor: #cf504a ! ! Black *.color0: #2a2433 *.color8: #635775 ! ! Red *.color1: #aa75f5 *.color9: #fc8983 ! ! Green *.color2: #f87972 *.color10: #372f42 ! ! Yellow *.color3: #ffb6b3 *.color11: #574b68 ! ! Blue *.color4: #b886fd *.color12: #706383 ! ! Magenta *.color5: #f87972 *.color13: #e4d2fe ! ! Cyan *.color6: #c7a0fe *.color14: #f36f68 ! ! White *.color7: #9a90a7 *.color15: #f3ebff ! ! Bold, Italic, Underline *.colorBD: #9a90a7 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/base2tone-sea-dark ================================================ ! ! Generated with : ! XRDB2Xrecources.py ! *.foreground: #a1aab5 *.background: #1d262f *.cursorColor: #067953 ! ! Black *.color0: #1d262f *.color8: #4a5f78 ! ! Red *.color1: #34659d *.color9: #14e19d ! ! Green *.color2: #0fc78a *.color10: #27323f ! ! Yellow *.color3: #47ebb4 *.color11: #405368 ! ! Blue *.color4: #57718e *.color12: #738191 ! ! Magenta *.color5: #0fc78a *.color13: #afd4fe ! ! Cyan *.color6: #6e9bcf *.color14: #0db57d ! ! White *.color7: #a1aab5 *.color15: #ebf4ff ! ! Bold, Italic, Underline *.colorBD: #a1aab5 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/base2tone-space-dark ================================================ ! ! Generated with : ! XRDB2Xrecources.py ! *.foreground: #a1a1b5 *.background: #24242e *.cursorColor: #b25424 ! ! Black *.color0: #24242e *.color8: #5b5b76 ! ! Red *.color1: #7676f4 *.color9: #f37b3f ! ! Green *.color2: #ec7336 *.color10: #333342 ! ! Yellow *.color3: #fe8c52 *.color11: #515167 ! ! Blue *.color4: #767693 *.color12: #737391 ! ! Magenta *.color5: #ec7336 *.color13: #cecee3 ! ! Cyan *.color6: #8a8aad *.color14: #e66e33 ! ! White *.color7: #a1a1b5 *.color15: #ebebff ! ! Bold, Italic, Underline *.colorBD: #a1a1b5 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/deep ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #cdcdcd *.background: #000000 *.cursorColor: #d0d0d0 ! ! Black *.color0: #000000 *.color8: #535353 ! ! Red *.color1: #d11600 *.color9: #f4152c ! ! Green *.color2: #37c32c *.color10: #01ea10 ! ! Yellow *.color3: #e3c421 *.color11: #ffee1d ! ! Blue *.color4: #5c6bfd *.color12: #8cb0f8 ! ! Magenta *.color5: #dd5be5 *.color13: #e056f5 ! ! Cyan *.color6: #6eb4f2 *.color14: #67ecff ! ! White *.color7: #e0e0e0 *.color15: #f4f4f4 ! ! Bold, Italic, Underline *.colorBD: #eeeeee !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/schemes/idleToes ================================================ ! ! Generated with : ! XRDB2Xreources.py ! *.foreground: #ffffff *.background: #323232 *.cursorColor: #d6d6d6 ! ! Black *.color0: #323232 *.color8: #535353 ! ! Red *.color1: #d25252 *.color9: #f07070 ! ! Green *.color2: #7fe173 *.color10: #9dff91 ! ! Yellow *.color3: #ffc66d *.color11: #ffe48b ! ! Blue *.color4: #4099ff *.color12: #5eb7f7 ! ! Magenta *.color5: #f680ff *.color13: #ff9dff ! ! Cyan *.color6: #bed6ff *.color14: #dcf4ff ! ! White *.color7: #eeeeec *.color15: #ffffff ! ! Bold, Italic, Underline *.colorBD: #ffffa9 !*.colorIT: !*.colorUL: ================================================ FILE: tabby-community-color-schemes/src/colorSchemes.ts ================================================ import { Injectable } from '@angular/core' import { TerminalColorSchemeProvider, TerminalColorScheme } from 'tabby-terminal' const schemeContents = (require as any).context('../schemes/', false, /.*/) @Injectable() export class ColorSchemes extends TerminalColorSchemeProvider { async getSchemes (): Promise { const schemes: TerminalColorScheme[] = [] schemeContents.keys().filter(x => !x.startsWith('./')).forEach(schemeFile => { const lines = (schemeContents(schemeFile).default as string).split('\n') // process #define variables const variables: any = {} lines .filter(x => x.startsWith('#define')) .map(x => x.split(' ').map(v => v.trim())) .forEach(([_, variableName, variableValue]) => { variables[variableName] = variableValue }) const values: any = {} lines .filter(x => x.startsWith('*.')) .map(x => x.substring(2)) .map(x => x.split(':').map(v => v.trim())) .forEach(([key, value]) => { values[key] = variables[value] ? variables[value] : value }) const colors: string[] = [] let colorIndex = 0 while (values[`color${colorIndex}`]) { colors.push(values[`color${colorIndex}`]) colorIndex++ } schemes.push({ name: schemeFile.split('/')[1].trim(), foreground: values.foreground, background: values.background, cursor: values.cursorColor, colors, }) }) return schemes } } ================================================ FILE: tabby-community-color-schemes/src/index.ts ================================================ import { NgModule } from '@angular/core' import { TerminalColorSchemeProvider } from 'tabby-terminal' import { ColorSchemes } from './colorSchemes' @NgModule({ providers: [ { provide: TerminalColorSchemeProvider, useClass: ColorSchemes, multi: true }, ], }) export default class PopularThemesModule { } // eslint-disable-line @typescript-eslint/no-extraneous-class ================================================ FILE: tabby-community-color-schemes/tsconfig.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist"], "compilerOptions": { "baseUrl": "src" } } ================================================ FILE: tabby-community-color-schemes/tsconfig.typings.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "compilerOptions": { "baseUrl": "src", "emitDeclarationOnly": true, "declaration": true, "declarationDir": "./typings", "paths": { "tabby-*": ["../../tabby-*"], "*": ["../../app/node_modules/*"] } } } ================================================ FILE: tabby-community-color-schemes/webpack.config.mjs ================================================ import * as path from 'path' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) import config from '../webpack.plugin.config.mjs' export default () => { const cfg = config({ name: 'community-color-schemes', dirname: __dirname, }) cfg.module.rules.push({ test: /[\\\/]schemes[\\\/]/, use: 'raw-loader' }) return cfg } ================================================ FILE: tabby-core/README.md ================================================ # Tabby Core Plugin See also: * [Settings plugin API](./settings/) * [Terminal plugin API](./terminal/) * [Local terminal API](./local/) * [Linkifier plugin API](./linkifier/) This module provides: * tabbed interface services * toolbar UI * config file management * hotkeys * tab recovery * logging * theming Using the API: ```ts import { AppService, TabContextMenuItemProvider } from 'tabby-core' ``` Exporting your subclasses: ```ts @NgModule({ ... providers: [ ... { provide: TabContextMenuItemProvider, useClass: MyContextMenu, multi: true }, ... ] }) ``` ================================================ FILE: tabby-core/package.json ================================================ { "name": "tabby-core", "version": "1.0.231-nightly.0", "description": "Tabby core", "keywords": [ "tabby-builtin-plugin" ], "main": "dist/index.js", "typings": "typings/index.d.ts", "scripts": { "build": "webpack --progress --color --display-modules", "watch": "webpack --progress --color --watch" }, "files": [ "dist", "typings" ], "author": "Tabby Developers", "license": "MIT", "devDependencies": { "bootstrap": "^5.3.0-alpha.1", "color": "^4.2.3", "deepmerge": "^4.1.1", "fuzzy-search": "^3.2.1", "js-yaml": "^4.0.0", "messageformat": "^2.3.0", "mixpanel": "^0.17.0", "ngx-translate-messageformat-compiler": "^4.11.0", "readable-stream": "4.4.0", "uuid": "^9.0.0" }, "peerDependencies": { "@angular/animations": "^15", "@angular/common": "^15", "@angular/core": "^15", "@angular/forms": "^15", "@angular/platform-browser": "^15", "@angular/platform-browser-dynamic": "^15", "rxjs": "^7" } } ================================================ FILE: tabby-core/src/api/cli.ts ================================================ export interface CLIEvent { argv: { _: string[], // Commands are hardcoded for now directory?: string, command?: string[], profileName?: string, text?: string, escape?: boolean, providerId?: string, query?: string, debug?: boolean, hidden?: boolean, profileNumber?: number, } cwd: string secondInstance: boolean } export abstract class CLIHandler { priority: number firstMatchOnly: boolean abstract handle (event: CLIEvent): Promise } ================================================ FILE: tabby-core/src/api/commands.ts ================================================ import { BaseTabComponent } from '../components/baseTab.component' import { MenuItemOptions } from './menu' import { ToolbarButton } from './toolbarButtonProvider' export enum CommandLocation { LeftToolbar = 'left-toolbar', RightToolbar = 'right-toolbar', StartPage = 'start-page', } export class Command { id?: string label: string sublabel?: string locations?: CommandLocation[] run: () => Promise /** * Raw SVG icon code */ icon?: string /** * Optional Touch Bar icon ID */ touchBarNSImage?: string /** * Optional Touch Bar button label */ touchBarTitle?: string weight?: number static fromToolbarButton (button: ToolbarButton): Command { const command = new Command() command.label = button.title command.run = async () => button.click?.() command.icon = button.icon command.locations = [CommandLocation.StartPage] if ((button.weight ?? 0) <= 0) { command.locations.push(CommandLocation.LeftToolbar) } if ((button.weight ?? 0) > 0) { command.locations.push(CommandLocation.RightToolbar) } command.touchBarNSImage = button.touchBarNSImage command.touchBarTitle = button.touchBarTitle command.weight = button.weight return command } static fromMenuItem (item: MenuItemOptions): Command { const command = new Command() command.label = item.commandLabel ?? item.label ?? '' command.sublabel = item.sublabel command.run = async () => item.click?.() return command } } export interface CommandContext { tab?: BaseTabComponent, } /** * Extend to add commands */ export abstract class CommandProvider { abstract provide (context: CommandContext): Promise } ================================================ FILE: tabby-core/src/api/configProvider.ts ================================================ /** * Extend to add your own config options */ export abstract class ConfigProvider { /** * Default values, e.g. * * ```ts * defaults = { * myPlugin: { * foo: 1 * } * } * ``` */ defaults: any = {} /** * [[Platform]] specific defaults, e.g. * * ```ts * platformDefaults = { * [Platform.Windows]: { * myPlugin: { * bar: true * } * }, * [Platform.macOS]: { * myPlugin: { * bar: false * } * }, * } * ``` */ platformDefaults: Record = {} } ================================================ FILE: tabby-core/src/api/fileProvider.ts ================================================ import { Injectable } from '@angular/core' @Injectable({ providedIn: 'root' }) export abstract class FileProvider { name: string async isAvailable (): Promise { return true } abstract selectAndStoreFile (description: string): Promise abstract retrieveFile (key: string): Promise } ================================================ FILE: tabby-core/src/api/hostApp.ts ================================================ import { Observable, Subject } from 'rxjs' import { Injector } from '@angular/core' import { Logger, LogService } from '../services/log.service' export enum Platform { Linux = 'Linux', macOS = 'macOS', Windows = 'Windows', Web = 'Web', } /** * Provides interaction with the main process */ export abstract class HostAppService { abstract get platform (): Platform abstract get configPlatform (): Platform protected settingsUIRequest = new Subject() protected configChangeBroadcast = new Subject() protected logger: Logger /** * Fired when Preferences is selected in the macOS menu */ get settingsUIRequest$ (): Observable { return this.settingsUIRequest } /** * Fired when another window modified the config file */ get configChangeBroadcast$ (): Observable { return this.configChangeBroadcast } constructor ( injector: Injector, ) { this.logger = injector.get(LogService).create('hostApp') } abstract newWindow (): void // eslint-disable-next-line @typescript-eslint/no-empty-function emitReady (): void { } abstract relaunch (): void abstract quit (): void } ================================================ FILE: tabby-core/src/api/hostWindow.ts ================================================ import { Observable, Subject } from 'rxjs' export abstract class HostWindowService { /** * Fired once the window is visible */ get windowShown$ (): Observable { return this.windowShown } /** * Fired when the window close button is pressed */ get windowCloseRequest$ (): Observable { return this.windowCloseRequest } get windowMoved$ (): Observable { return this.windowMoved } get windowFocused$ (): Observable { return this.windowFocused } protected windowShown = new Subject() protected windowCloseRequest = new Subject() protected windowMoved = new Subject() protected windowFocused = new Subject() abstract readonly isFullscreen: boolean abstract reload (): void abstract setTitle (title?: string): void abstract toggleFullscreen (): void abstract minimize (): void abstract isMaximized (): boolean abstract toggleMaximize (): void abstract close (): void // eslint-disable-next-line @typescript-eslint/no-empty-function openDevTools (): void { } // eslint-disable-next-line @typescript-eslint/no-empty-function bringToFront (): void { } } ================================================ FILE: tabby-core/src/api/hotkeyProvider.ts ================================================ export interface HotkeyDescription { id: string name: string } export interface Hotkey { strokes: string[] | string; // may be a sequence of strokes isDuplicate: boolean; } /** * Extend to provide your own hotkeys. A corresponding [[ConfigProvider]] * must also provide the `hotkeys.foo` config options with the default values */ export abstract class HotkeyProvider { abstract provide (): Promise } ================================================ FILE: tabby-core/src/api/index.ts ================================================ export { BaseComponent, SubscriptionContainer } from '../components/base.component' export { BaseTabComponent, BaseTabProcess, GetRecoveryTokenOptions } from '../components/baseTab.component' export { TabHeaderComponent } from '../components/tabHeader.component' export { SplitTabComponent, SplitContainer, SplitDirection, SplitOrientation } from '../components/splitTab.component' export { TabRecoveryProvider, RecoveryToken } from './tabRecovery' export { ToolbarButtonProvider, ToolbarButton } from './toolbarButtonProvider' export { ConfigProvider } from './configProvider' export { HotkeyProvider, HotkeyDescription, Hotkey } from './hotkeyProvider' export { Theme } from './theme' export { TabContextMenuItemProvider } from './tabContextMenuProvider' export { SelectorOption } from './selector' export { CLIHandler, CLIEvent } from './cli' export { PlatformService, ClipboardContent, MessageBoxResult, MessageBoxOptions, FileDownload, FileUpload, FileTransfer, HTMLFileUpload, FileUploadOptions, DirectoryUpload, DirectoryDownload, PlatformTheme } from './platform' export { MenuItemOptions } from './menu' export { BootstrapData, PluginInfo, BOOTSTRAP_DATA } from './mainProcess' export { HostWindowService } from './hostWindow' export { HostAppService, Platform } from './hostApp' export { FileProvider } from './fileProvider' export { ProfileProvider, ConnectableProfileProvider, QuickConnectProfileProvider, Profile, ConnectableProfile, PartialProfile, ProfileSettingsComponent, ProfileGroup, PartialProfileGroup } from './profileProvider' export { PromptModalComponent } from '../components/promptModal.component' export * from './commands' export { AppService } from '../services/app.service' export { ConfigService, configMerge, ConfigProxy, ProxifiedConfig, FullyDefined } from '../services/config.service' export { DockingService, Screen } from '../services/docking.service' export { Logger, ConsoleLogger, LogService } from '../services/log.service' export { HomeBaseService } from '../services/homeBase.service' export { HotkeysService } from '../services/hotkeys.service' export { KeyEventData, KeyName, Keystroke, altKeyName, metaKeyName } from '../services/hotkeys.util' export { NotificationsService } from '../services/notifications.service' export { ThemesService } from '../services/themes.service' export { ProfilesService } from '../services/profiles.service' export { SelectorService } from '../services/selector.service' export { TabRecoveryService } from '../services/tabRecovery.service' export { TabsService, NewTabParameters, TabComponentType } from '../services/tabs.service' export { UpdaterService } from '../services/updater.service' export { VaultService, Vault, VaultSecret, VaultFileSecret, VAULT_SECRET_TYPE_FILE, StoredVault, VaultSecretKey } from '../services/vault.service' export { FileProvidersService } from '../services/fileProviders.service' export { LocaleService, TabbyFormatedDatePipe } from '../services/locale.service' export { TranslateService } from '@ngx-translate/core' export * from '../utils' export { UTF8Splitter } from '../utfSplitter' ================================================ FILE: tabby-core/src/api/mainProcess.ts ================================================ export const BOOTSTRAP_DATA = 'BOOTSTRAP_DATA' export interface PluginInfo { name: string description: string packageName: string isBuiltin: boolean isLegacy: boolean version: string author: string homepage?: string path?: string info?: any } export interface BootstrapData { config: Record executable: string isMainWindow: boolean windowID: number installedPlugins: PluginInfo[] userPluginsPath: string } ================================================ FILE: tabby-core/src/api/menu.ts ================================================ export interface MenuItemOptions { type?: 'normal' | 'separator' | 'submenu' | 'checkbox' | 'radio' label?: string sublabel?: string enabled?: boolean checked?: boolean submenu?: MenuItemOptions[] click?: () => void /** @hidden */ commandLabel?: string } ================================================ FILE: tabby-core/src/api/platform.ts ================================================ import { MenuItemOptions } from './menu' import { Subject, Observable } from 'rxjs' /* eslint-disable @typescript-eslint/no-unused-vars */ export interface ClipboardContent { text: string html?: string } export interface MessageBoxOptions { type: 'warning'|'error' message: string detail?: string buttons: string[] defaultId?: number cancelId?: number } export interface MessageBoxResult { response: number } export abstract class FileTransfer { abstract getName (): string abstract getSize (): number abstract close (): void getSpeed (): number { return this.lastChunkSpeed } getCompletedBytes (): number { return this.completedBytes } getStatus (): string { return this.status } getTotalSize (): number { return this.totalSize } isComplete (): boolean { return this.completed || this.completedBytes >= this.getSize() } isCancelled (): boolean { return this.cancelled } cancel (): void { this.cancelled = true this.close() } setStatus (status: string): void { this.status = status } setTotalSize (size: number): void { this.totalSize = size } setCompleted (completed: boolean): void { this.completed = completed } protected increaseProgress (bytes: number): void { if (!bytes) { return } this.completedBytes += bytes this.lastChunkSpeed = bytes * 1000 / (Date.now() - this.lastChunkStartTime) this.lastChunkStartTime = Date.now() } private completedBytes = 0 private totalSize = 0 private lastChunkStartTime = Date.now() private lastChunkSpeed = 0 private cancelled = false private completed = false private status = '' } export abstract class FileDownload extends FileTransfer { abstract write (buffer: Uint8Array): Promise } export abstract class DirectoryDownload extends FileTransfer { abstract createDirectory (relativePath: string): Promise abstract createFile (relativePath: string, mode: number, size: number): Promise } export abstract class FileUpload extends FileTransfer { abstract getMode (): number abstract read (): Promise async readAll (): Promise { const result = new Uint8Array(this.getSize()) let pos = 0 while (true) { const buf = await this.read() if (!buf.length) { break } result.set(buf, pos) pos += buf.length } return result } } export interface FileUploadOptions { multiple: boolean } export class DirectoryUpload { private childrens: (FileUpload|DirectoryUpload)[] = [] constructor (private name = '') { // Just set name for now. } getName (): string { return this.name } getChildrens (): (FileUpload|DirectoryUpload)[] { return this.childrens } pushChildren (item: FileUpload|DirectoryUpload): void { this.childrens.push(item) } } export type PlatformTheme = 'light'|'dark' export abstract class PlatformService { supportsWindowControls = false get fileTransferStarted$ (): Observable { return this.fileTransferStarted } get displayMetricsChanged$ (): Observable { return this.displayMetricsChanged } get themeChanged$ (): Observable { return this.themeChanged } protected fileTransferStarted = new Subject() protected displayMetricsChanged = new Subject() protected themeChanged = new Subject() abstract readClipboard (): string abstract setClipboard (content: ClipboardContent): void abstract loadConfig (): Promise abstract saveConfig (content: string): Promise abstract startDownload (name: string, mode: number, size: number): Promise abstract startDownloadDirectory (name: string, estimatedSize?: number): Promise abstract startUpload (options?: FileUploadOptions): Promise abstract startUploadDirectory (paths?: string[]): Promise async startUploadFromDragEvent (event: DragEvent, multiple = false): Promise { const result = new DirectoryUpload() if (!event.dataTransfer) { return Promise.resolve(result) } const traverseFileTree = (item: any, root: DirectoryUpload = result): Promise => { return new Promise((resolve) => { if (item.isFile) { item.file((file: File) => { const transfer = new HTMLFileUpload(file) this.fileTransferStarted.next(transfer) root.pushChildren(transfer) resolve() }) } else if (item.isDirectory) { const dirReader = item.createReader() const childrenFolder = new DirectoryUpload(item.name) dirReader.readEntries(async (entries: any[]) => { for (const entry of entries) { await traverseFileTree(entry, childrenFolder) } resolve() }) root.pushChildren(childrenFolder) } else { resolve() } }) } const promises: Promise[] = [] const items = event.dataTransfer.items // eslint-disable-next-line @typescript-eslint/prefer-for-of for (let i = 0; i < items.length; i++) { const item = items[i].webkitGetAsEntry() if (item) { promises.push(traverseFileTree(item)) if (!multiple) { break } } } return Promise.all(promises).then(() => result) } getConfigPath (): string|null { return null } showItemInFolder (path: string): void { throw new Error('Not implemented') } async isProcessRunning (name: string): Promise { return false } async installPlugin (name: string, version: string): Promise { throw new Error('Not implemented') } async uninstallPlugin (name: string): Promise { throw new Error('Not implemented') } getWinSCPPath (): string|null { throw new Error('Not implemented') } async exec (app: string, argv: string[]): Promise { throw new Error('Not implemented') } isShellIntegrationSupported (): boolean { return false } async isShellIntegrationInstalled (): Promise { return false } async installShellIntegration (): Promise { throw new Error('Not implemented') } async uninstallShellIntegration (): Promise { throw new Error('Not implemented') } openPath (path: string): void { throw new Error('Not implemented') } getTheme (): PlatformTheme { return 'dark' } abstract getOSRelease (): string abstract getAppVersion (): string abstract openExternal (url: string): void abstract listFonts (): Promise abstract setErrorHandler (handler: (_: any) => void): void abstract popupContextMenu (menu: MenuItemOptions[], event?: MouseEvent): void abstract showMessageBox (options: MessageBoxOptions): Promise abstract pickDirectory (): Promise abstract quit (): void } export class HTMLFileUpload extends FileUpload { private stream: ReadableStream private reader: ReadableStreamDefaultReader constructor (private file: File) { super() this.stream = this.file.stream() this.reader = this.stream.getReader() } getName (): string { return this.file.name } getMode (): number { return 0o644 } getSize (): number { return this.file.size } async read (): Promise { const result: any = await this.reader.read() if (result.done || !result.value) { return new Uint8Array(0) } const chunk = new Uint8Array(result.value) this.increaseProgress(chunk.length) return chunk } // eslint-disable-next-line @typescript-eslint/no-empty-function bringToFront (): void { } // eslint-disable-next-line @typescript-eslint/no-empty-function close (): void { } } ================================================ FILE: tabby-core/src/api/profileProvider.ts ================================================ /* eslint-disable @typescript-eslint/no-type-alias */ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @typescript-eslint/no-empty-function */ import { BaseTabComponent } from '../components/baseTab.component' import { NewTabParameters } from '../services/tabs.service' import { FullyDefined } from '../services/config.service' export interface Profile { id: string type: string name: string group: string options: any icon: string | null color: string | null disableDynamicTitle: boolean behaviorOnSessionEnd: 'auto'|'keep'|'reconnect'|'close' weight: number isBuiltin: boolean isTemplate: boolean } export interface ConnectableProfile extends Profile { clearServiceMessagesOnConnect: boolean } export type PartialProfile = Omit, 'type'>, 'name'> & { type: string name: string options?: { [K in keyof T['options']]?: T['options'][K] } } export interface ProfileGroup { id: string name: string profiles: PartialProfile[] defaults: any editable: boolean } export type PartialProfileGroup = Omit, 'name'> & { id: string name: string } export interface ProfileSettingsComponent

> { profile: FullyDefined

save?: () => void } export abstract class ProfileProvider

{ id: string name: string settingsComponent?: new (...args: any[]) => ProfileSettingsComponent> configDefaults: Pick abstract getBuiltinProfiles (): Promise[]> abstract getNewTabParameters (profile: P): Promise> getSuggestedName (profile: PartialProfile

): string|null { return null } abstract getDescription (profile: PartialProfile

): string deleteProfile (profile: P): void { } } export abstract class ConnectableProfileProvider

extends ProfileProvider

{} export abstract class QuickConnectProfileProvider

extends ConnectableProfileProvider

{ abstract quickConnect (query: string): PartialProfile

|null abstract intoQuickConnectString (profile: P): string|null } ================================================ FILE: tabby-core/src/api/selector.ts ================================================ export interface SelectorOption { name: string description?: string group?: string result?: T icon?: string freeInputPattern?: string freeInputEquivalent?: string color?: string weight?: number callback?: (string?) => void } ================================================ FILE: tabby-core/src/api/tabContextMenuProvider.ts ================================================ import { BaseTabComponent } from '../components/baseTab.component' import { MenuItemOptions } from './menu' /** * Extend to add items to the tab header's context menu */ export abstract class TabContextMenuItemProvider { weight = 0 abstract getItems (tab: BaseTabComponent, tabHeader?: boolean): Promise } ================================================ FILE: tabby-core/src/api/tabRecovery.ts ================================================ import { BaseTabComponent } from '../components/baseTab.component' import { NewTabParameters } from '../services/tabs.service' export interface RecoveryToken { [_: string]: any type: string tabIcon?: string|null tabColor?: string|null } /** * Extend to enable recovery for your custom tab. * This works in conjunction with [[getRecoveryToken()]] * * Tabby will try to find any [[TabRecoveryProvider]] that is able to process * the recovery token previously returned by [[getRecoveryToken]]. * * Recommended token format: * * ```json * { * type: 'my-tab-type', * foo: 'bar', * } * ``` */ export abstract class TabRecoveryProvider { /** * @param recoveryToken a recovery token found in the saved tabs list * @returns [[boolean]] whether this [[TabRecoveryProvider]] can recover a tab from this token */ abstract applicableTo (recoveryToken: RecoveryToken): Promise /** * @param recoveryToken a recovery token found in the saved tabs list * @returns [[NewTabParameters]] descriptor containing tab type and component inputs * or `null` if this token is from a different tab type or is not supported */ abstract recover (recoveryToken: RecoveryToken): Promise> } ================================================ FILE: tabby-core/src/api/theme.ts ================================================ /** * Extend to add a custom CSS theme */ export abstract class Theme { name: string /** * Complete CSS stylesheet */ css: string terminalBackground: string macOSWindowButtonsInsetX?: number macOSWindowButtonsInsetY?: number followsColorScheme?: boolean } ================================================ FILE: tabby-core/src/api/toolbarButtonProvider.ts ================================================ /** * See [[ToolbarButtonProvider]] */ export interface ToolbarButton { /** * Raw SVG icon code */ icon?: string title: string /** * Optional Touch Bar icon ID */ touchBarNSImage?: string /** * Optional Touch Bar button label */ touchBarTitle?: string weight?: number click?: () => void submenu?: () => Promise /** @hidden */ submenuItems?: ToolbarButton[] } /** * Extend to add buttons to the toolbar */ export abstract class ToolbarButtonProvider { abstract provide (): ToolbarButton[] } ================================================ FILE: tabby-core/src/cli.ts ================================================ import { Injectable } from '@angular/core' import { HostAppService } from './api/hostApp' import { CLIHandler, CLIEvent } from './api/cli' import { HostWindowService } from './api/hostWindow' import { QuickConnectProfileProvider } from './api/profileProvider' import { ProfilesService } from './services/profiles.service' @Injectable() export class ProfileCLIHandler extends CLIHandler { firstMatchOnly = true priority = 0 constructor ( private profiles: ProfilesService, private hostWindow: HostWindowService, ) { super() } async handle (event: CLIEvent): Promise { const op = event.argv._[0] if (op === 'profile') { this.handleOpenProfile(event.argv.profileName!) return true } if (op === 'recent') { this.handleOpenRecentProfile(event.argv.profileNumber!) return true } if (op === 'quickConnect') { this.handleOpenQuickConnect(event.argv.providerId!, event.argv.query!) return true } return false } private async handleOpenProfile (profileName: string) { const profile = (await this.profiles.getProfiles()).find(x => x.name === profileName) if (!profile) { console.error('Requested profile', profileName, 'not found') return } this.profiles.openNewTabForProfile(profile) this.hostWindow.bringToFront() } private async handleOpenRecentProfile (profileNumber: number) { const profiles = this.profiles.getRecentProfiles() if (profileNumber >= profiles.length) { return } this.profiles.openNewTabForProfile(profiles[profileNumber]) this.hostWindow.bringToFront() } private async handleOpenQuickConnect (providerId: string, query: string) { const quickConnectProviders = this.profiles.getProviders() .filter((x): x is QuickConnectProfileProvider => x instanceof QuickConnectProfileProvider) const provider = quickConnectProviders.find(x => x.id === providerId) if(!provider) { const available = quickConnectProviders.map(x => x.id).join(', ') console.error(`Requested provider "${providerId}" not found. Available providers: ${available}`) return } const profile = provider.quickConnect(query) if(!profile) { console.error(`Could not parse quick connect query "${query}"`) return } this.profiles.openNewTabForProfile(profile) this.hostWindow.bringToFront() } } @Injectable() export class LastCLIHandler extends CLIHandler { firstMatchOnly = true priority = -999 constructor (private hostApp: HostAppService) { super() } async handle (event: CLIEvent): Promise { if (event.secondInstance) { this.hostApp.newWindow() return true } return false } } ================================================ FILE: tabby-core/src/commands.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Injectable } from '@angular/core' import { TranslateService } from '@ngx-translate/core' import { HostAppService, Platform } from './api/hostApp' import { ProfilesService } from './services/profiles.service' import { CommandProvider, Command, CommandLocation } from './api/commands' /** @hidden */ @Injectable({ providedIn: 'root' }) export class CoreCommandProvider extends CommandProvider { constructor ( private hostApp: HostAppService, private profilesService: ProfilesService, private translate: TranslateService, ) { super() } async activate () { const profile = await this.profilesService.showProfileSelector().catch(() => null) if (profile) { this.profilesService.launchProfile(profile) } } async provide (): Promise { return [ { id: 'core:profile-selector', locations: [CommandLocation.LeftToolbar, CommandLocation.StartPage], label: this.translate.instant('Profiles & connections'), icon: this.hostApp.platform === Platform.Web ? require('./icons/plus.svg') : require('./icons/profiles.svg'), run: async () => this.activate(), }, ...this.profilesService.getRecentProfiles().map((profile, index) => ({ id: `core:recent-profile-${index}`, label: profile.name, locations: [CommandLocation.StartPage], icon: require('./icons/history.svg'), run: async () => { const p = (await this.profilesService.getProfiles()).find(x => x.id === profile.id) ?? profile this.profilesService.launchProfile(p) }, })), ] } } ================================================ FILE: tabby-core/src/components/appRoot.component.pug ================================================ title-bar( *ngIf='ready && !hostWindow.isFullscreen && config.store.appearance.dock == "off" && isTitleBarNeeded()', (dblclick)='toggleMaximize()', [hideControls]='hostApp.platform !== Platform.Linux && !hostWindow.isFullscreen', [class.inset]='hostApp.platform == Platform.macOS && !hostWindow.isFullscreen' ) .content( *ngIf='ready', [class.tabs-on-top]='config.store.appearance.tabsLocation == "top" || config.store.appearance.tabsLocation == "left" || config.store.appearance.tabsLocation == "right"', [class.tabs-on-left]='hasVerticalTabs() && config.store.appearance.tabsLocation == "left"', [class.tabs-titlebar-enabled]='isTitleBarNeeded()', [class.tabs-on-right]='hasVerticalTabs() && config.store.appearance.tabsLocation == "right"', ) .tab-bar( *ngIf='!hostWindow.isFullscreen || config.store.appearance.tabsInFullscreen', [class.tab-bar-no-controls-overlay]='hostApp.platform == Platform.macOS', (dblclick)='!isTitleBarNeeded() && toggleMaximize()' ) .inset.background(*ngIf='hostApp.platform == Platform.macOS \ && !hostWindow.isFullscreen \ && config.store.appearance.frame == "thin" \ && (config.store.appearance.tabsLocation == "top" || config.store.appearance.tabsLocation == "left")') .tabs( cdkDropList, [cdkDropListOrientation]='(config.store.appearance.tabsLocation == "top" || config.store.appearance.tabsLocation == "bottom") ? "horizontal" : "vertical"', (cdkDropListDropped)='onTabsReordered($event)', cdkAutoDropGroup='app-tabs' ) tab-header( *ngFor='let tab of app.tabs; let idx = index', [index]='idx', [tab]='tab', [active]='tab == app.activeTab', [@animateTab]='{value: "in", params: {size: targetTabSize}}', [@.disabled]='hasVerticalTabs() || !config.store.accessibility.animations', (click)='app.selectTab(tab)', [class.fully-draggable]='hostApp.platform !== Platform.macOS', [ngbTooltip]='tab.customTitle || tab.title' ) .btn-group.background .d-flex( *ngFor='let button of leftToolbarButtons' ) button.btn.btn-secondary.btn-tab-bar( [ngbTooltip]='button.label', (click)='button.run && button.run()', [fastHtmlBind]='button.icon' ) .d-flex( ngbDropdown, container='body', #activeTransfersDropdown='ngbDropdown' ) button.btn.btn-secondary.btn-tab-bar( [hidden]='activeTransfers.length == 0', [ngbTooltip]='"File transfers"|translate', ngbDropdownToggle ) !{require('../icons/transfers.svg')} transfers-menu( ngbDropdownMenu, [(transfers)]='activeTransfers', (transfersChange)='onTransfersChange()' ) .btn-space.background( [class.persistent]='config.store.appearance.frame == "thin"', [class.drag]='config.store.appearance.frame == "thin" \ && ((config.store.appearance.tabsLocation !== "left" && config.store.appearance.tabsLocation !== "right") || hostApp.platform !== Platform.macOS)' ) .btn-group.background .d-flex( *ngFor='let button of rightToolbarButtons' ) button.btn.btn-secondary.btn-tab-bar( [ngbTooltip]='button.label', (click)='button.run && button.run()', [fastHtmlBind]='button.icon' ) button.btn.btn-secondary.btn-tab-bar.btn-update( *ngIf='updatesAvailable', [ngbTooltip]='"Update available - Click to install"|translate', (click)='updater.update()' ) !{require('../icons/gift.svg')} window-controls.background( *ngIf='config.store.appearance.frame == "thin" \ && config.store.appearance.tabsLocation !== "left" \ && config.store.appearance.tabsLocation !== "right" \ && hostApp.platform == Platform.Linux', ) div.window-controls-spacer( *ngIf='config.store.appearance.frame == "thin" && (hostApp.platform == Platform.Windows) && (config.store.appearance.tabsLocation == "top")', ) .content start-page.content-tab.content-tab-active(*ngIf='ready && app.tabs.length == 0') tab-body.content-tab( #tabBodies, *ngFor='let tab of unsortedTabs', [class.content-tab-active]='tab == app.activeTab', [active]='tab == app.activeTab', [tab]='tab', ) ng-template(ngbModalContainer) ================================================ FILE: tabby-core/src/components/appRoot.component.scss ================================================ :host { display: flex; width: 100vw; height: 100vh; flex-direction: column; overflow: hidden; user-select: none; -webkit-user-drag: none; will-change: transform; cursor: default; animation: 0.5s ease-out fadeIn; transition: 0.25s background; --tabs-height: calc(38px * var(--spaciness)); --side-tab-width: calc(200px * var(--spaciness)); } $tab-border-radius: 4px; .wrap { display: flex; width: 100vw; height: 100vh; flex-direction: row; } .content { width: 100vw; flex: 1 1 0; min-height: 0; display: flex; flex-direction: column-reverse; &.tabs-on-top { flex-direction: column; } &.tabs-on-right { flex-direction: row-reverse; } &.tabs-on-left { flex-direction: row; } } .content.tabs-on-left > .tab-bar, .content.tabs-on-right > .tab-bar { height: 100%; width: var(--side-tab-width); overflow-y: auto; overflow-x: hidden; flex-direction: column; background: rgba(0, 0, 0, 0.25); .tabs { width: var(--side-tab-width); flex: none; flex-direction: column; tab-header { flex: 0 0 var(--tabs-height); } } .btn-space { flex: auto; } &>.inset { opacity: 0; width: 100%; } ::ng-deep tab-header { width: 100% !important; } } .content.tabs-on-left > .tab-bar.tab-bar-no-controls-overlay, .content.tabs-titlebar-enabled { .tabs { padding-top: 0 !important; } } .content.tabs-on-right > .tab-bar { .tabs { // Account for WCO on Windows. padding-top: 36px; } } .tab-bar { flex: none; height: var(--tabs-height); display: flex; width: 100%; .btn-tab-bar { line-height: calc(var(--tabs-height) + 2px); height: var(--tabs-height); cursor: pointer; display: flex; align-items: center; padding: 0 12px; flex: 0 0 auto; border-bottom: 2px solid transparent; transition: 0.125s all ease-out; font-size: 12px; text-transform: uppercase; font-weight: bold; color: #aaa; border: none; border-radius: 0; align-items: center; &.dropdown-toggle::after { display: none; } } &>.tabs { flex: 0 1 auto; display: flex; min-width: 0; } &>.btn-space { min-width: 1px; flex: 1 0 1%; .tabs-on-top & { margin-top: 2px; // for window resizing } &.drag { -webkit-app-region: drag; } &.persistent { // min-width: 72px; // 2 x 36 px height, ie 2 squares // Given WCO on Windows, the min-width of the window buttons is about 138px. min-width: 138px; } } &>.window-controls-spacer { min-width: 138px; height: 100%; } & > .inset { width: calc(70px + 15px * var(--spaciness)); height: var(--tabs-height); flex: none; -webkit-app-region: drag; } window-controls { padding-left: 10px; } .cdk-drag-animating { transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); } .cdk-drop-list-dragging tab-header:not(.cdk-drag-placeholder) { transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); } } .content { flex: 1 1 0; position: relative; min-height: 0; min-width: 0; > .content-tab { position: absolute; top: 0; width: 100%; height: 100%; left: -1000%; &.content-tab-active { left: 0; } } } hotkey-hint { position: absolute; bottom: 0; right: 0; max-width: 300px; } ::ng-deep .btn-tab-bar svg, ::ng-deep .btn-tab-bar + .dropdown-menu svg { width: calc(22px * var(--spaciness)); height: calc(16px * var(--spaciness)); fill: white; fill-opacity: 0.75; } ::ng-deep .btn-update svg { fill: cyan; } ::ng-deep .broadcast-status-warning { background: red; position: absolute; top: 0; left: 50%; padding: 5px 10px; color: black; border-radius: 0 0 5px 5px; width: 300px; margin-left: -150px; text-align: center; font-weight: bold; } ================================================ FILE: tabby-core/src/components/appRoot.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, Input, HostListener, HostBinding, ViewChildren, ViewChild } from '@angular/core' import { trigger, style, animate, transition, state } from '@angular/animations' import { NgbDropdown, NgbModal } from '@ng-bootstrap/ng-bootstrap' import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop' import { HostAppService, Platform } from '../api/hostApp' import { HotkeysService } from '../services/hotkeys.service' import { Logger, LogService } from '../services/log.service' import { ConfigService } from '../services/config.service' import { ThemesService } from '../services/themes.service' import { UpdaterService } from '../services/updater.service' import { CommandService } from '../services/commands.service' import { BaseTabComponent } from './baseTab.component' import { SafeModeModalComponent } from './safeModeModal.component' import { TabBodyComponent } from './tabBody.component' import { SplitTabComponent } from './splitTab.component' import { AppService, Command, CommandLocation, FileTransfer, HostWindowService, PlatformService } from '../api' function makeTabAnimation (dimension: string, size: number) { return [ state('in', style({ 'flex-basis': '{{size}}', [dimension]: '{{size}}', }), { params: { size: `${size}px` }, }), transition(':enter', [ style({ 'flex-basis': '1px', [dimension]: '1px', }), animate('250ms ease-out', style({ 'flex-basis': '{{size}}', [dimension]: '{{size}}', })), ]), transition(':leave', [ style({ 'flex-basis': 'auto', 'padding-left': '*', 'padding-right': '*', [dimension]: '*', }), animate('250ms ease-in-out', style({ 'padding-left': 0, 'padding-right': 0, [dimension]: '0', })), ]), ] } /** @hidden */ @Component({ selector: 'app-root', templateUrl: './appRoot.component.pug', styleUrls: ['./appRoot.component.scss'], animations: [ trigger('animateTab', makeTabAnimation('width', 200)), ], }) export class AppRootComponent { Platform = Platform @Input() ready = false @Input() leftToolbarButtons: Command[] @Input() rightToolbarButtons: Command[] @HostBinding('class.platform-win32') platformClassWindows = process.platform === 'win32' @HostBinding('class.platform-darwin') platformClassMacOS = process.platform === 'darwin' @HostBinding('class.platform-linux') platformClassLinux = process.platform === 'linux' @HostBinding('class.no-tabs') noTabs = true @ViewChildren(TabBodyComponent) tabBodies: TabBodyComponent[] @ViewChild('activeTransfersDropdown') activeTransfersDropdown: NgbDropdown unsortedTabs: BaseTabComponent[] = [] updatesAvailable = false activeTransfers: FileTransfer[] = [] private logger: Logger constructor ( private hotkeys: HotkeysService, private commands: CommandService, public updater: UpdaterService, public hostWindow: HostWindowService, public hostApp: HostAppService, public config: ConfigService, public app: AppService, platform: PlatformService, log: LogService, ngbModal: NgbModal, _themes: ThemesService, ) { // document.querySelector('app-root')?.remove() this.logger = log.create('main') this.logger.info('v', platform.getAppVersion()) this.hotkeys.hotkey$.subscribe((hotkey: string) => { if (hotkey.startsWith('tab-')) { const index = parseInt(hotkey.split('-')[1]) if (index <= this.app.tabs.length) { this.app.selectTab(this.app.tabs[index - 1]) } } if (this.app.activeTab) { if (hotkey === 'close-tab') { this.app.closeTab(this.app.activeTab, true) } if (hotkey === 'toggle-last-tab') { this.app.toggleLastTab() } if (hotkey === 'next-tab') { this.app.nextTab() } if (hotkey === 'previous-tab') { this.app.previousTab() } if (hotkey === 'move-tab-left') { this.app.moveSelectedTabLeft() } if (hotkey === 'move-tab-right') { this.app.moveSelectedTabRight() } if (hotkey === 'duplicate-tab') { this.app.duplicateTab(this.app.activeTab) } if (hotkey === 'restart-tab') { this.app.duplicateTab(this.app.activeTab) this.app.closeTab(this.app.activeTab, true) } if (hotkey === 'explode-tab' && this.app.activeTab instanceof SplitTabComponent) { this.app.explodeTab(this.app.activeTab) } if (hotkey === 'combine-tabs' && this.app.activeTab instanceof SplitTabComponent) { this.app.combineTabsInto(this.app.activeTab) } } if (hotkey === 'reopen-tab') { this.app.reopenLastTab() } if (hotkey === 'toggle-fullscreen') { hostWindow.toggleFullscreen() } }) this.hostWindow.windowCloseRequest$.subscribe(async () => { this.app.closeWindow() }) if (window['safeModeReason']) { ngbModal.open(SafeModeModalComponent) } this.app.tabOpened$.subscribe(tab => { this.unsortedTabs.push(tab) this.noTabs = false this.app.emitTabDragEnded() }) this.app.tabRemoved$.subscribe(tab => { for (const tabBody of this.tabBodies) { if (tabBody.tab === tab) { tabBody.detach() } } this.unsortedTabs = this.unsortedTabs.filter(x => x !== tab) this.noTabs = app.tabs.length === 0 this.app.emitTabDragEnded() }) platform.fileTransferStarted$.subscribe(transfer => { this.activeTransfers.push(transfer) this.activeTransfersDropdown.open() }) config.ready$.toPromise().then(async () => { this.leftToolbarButtons = await this.getToolbarButtons(false) this.rightToolbarButtons = await this.getToolbarButtons(true) setInterval(() => { if (this.config.store.enableAutomaticUpdates) { this.updater.check().then(available => { this.updatesAvailable = available }) } }, 3600 * 12 * 1000) }) } async ngOnInit () { this.config.ready$.toPromise().then(() => { this.ready = true this.app.emitReady() }) } @HostListener('dragover') onDragOver () { return false } @HostListener('drop') onDrop () { return false } hasVerticalTabs () { return this.config.store.appearance.tabsLocation === 'left' || this.config.store.appearance.tabsLocation === 'right' } get targetTabSize (): any { if (this.hasVerticalTabs()) { return '*' } return this.config.store.appearance.flexTabs ? '*' : '200px' } onTabsReordered (event: CdkDragDrop) { const tab: BaseTabComponent = event.item.data if (!this.app.tabs.includes(tab)) { if (tab.parent instanceof SplitTabComponent) { tab.parent.removeTab(tab) this.app.wrapAndAddTab(tab) } } moveItemInArray(this.app.tabs, event.previousIndex, event.currentIndex) this.app.emitTabsChanged() } onTransfersChange () { if (this.activeTransfers.length === 0) { this.activeTransfersDropdown.close() } } @HostBinding('class.vibrant') get isVibrant () { return this.config.store?.appearance.vibrancy } private async getToolbarButtons (aboveZero: boolean): Promise { return (await this.commands.getCommands({ tab: this.app.activeTab ?? undefined })) .filter(x => x.locations?.includes(aboveZero ? CommandLocation.RightToolbar : CommandLocation.LeftToolbar)) } toggleMaximize (): void { this.hostWindow.toggleMaximize() } protected isTitleBarNeeded (): boolean { return ( this.config.store.appearance.frame === 'full' || this.hostApp.platform !== Platform.macOS && this.config.store.appearance.frame === 'thin' && this.config.store.appearance.tabsLocation !== 'top' && this.config.store.appearance.tabsLocation !== 'bottom' ) } } ================================================ FILE: tabby-core/src/components/base.component.ts ================================================ import { Observable, Subscription, Subject } from 'rxjs' interface CancellableEvent { element: HTMLElement event: string handler: EventListenerOrEventListenerObject options?: boolean|AddEventListenerOptions } export class SubscriptionContainer { private subscriptions: Subscription[] = [] private events: CancellableEvent[] = [] isEmpty (): boolean { return this.events.length === 0 && this.subscriptions.length === 0 } addEventListener (element: HTMLElement, event: string, handler: EventListenerOrEventListenerObject, options?: boolean|AddEventListenerOptions): void { element.addEventListener(event, handler, options) this.events.push({ element, event, handler, options, }) } subscribe (observable: Observable, handler: (v: T) => void): void { this.subscriptions.push(observable.subscribe(handler)) } cancelAll (): void { for (const s of this.subscriptions) { s.unsubscribe() } for (const e of this.events) { e.element.removeEventListener(e.event, e.handler, e.options) } this.subscriptions = [] this.events = [] } } export class BaseComponent { protected get destroyed$ (): Observable { return this._destroyed } private _destroyed = new Subject() private _subscriptionContainer = new SubscriptionContainer() addEventListenerUntilDestroyed (element: HTMLElement, event: string, handler: EventListenerOrEventListenerObject, options?: boolean|AddEventListenerOptions): void { this._subscriptionContainer.addEventListener(element, event, handler, options) } subscribeUntilDestroyed (observable: Observable, handler: (v: T) => void): void { this._subscriptionContainer.subscribe(observable, handler) } ngOnDestroy (): void { this._destroyed.next() this._destroyed.complete() this._subscriptionContainer.cancelAll() } } ================================================ FILE: tabby-core/src/components/baseTab.component.ts ================================================ import { Observable, Subject, BehaviorSubject, distinctUntilChanged, filter, debounceTime } from 'rxjs' import { EmbeddedViewRef, Injector, ViewContainerRef, ViewRef } from '@angular/core' import { RecoveryToken } from '../api/tabRecovery' import { BaseComponent } from './base.component' import { ConfigService } from '../services/config.service' /** * Represents an active "process" inside a tab, * for example, a user process running inside a terminal tab */ export interface BaseTabProcess { name: string } export interface GetRecoveryTokenOptions { includeState: boolean } /** * Abstract base class for custom tab components */ // @Component({ template: '' }) export abstract class BaseTabComponent extends BaseComponent { /** * Parent tab (usually a SplitTabComponent) */ parent: BaseTabComponent|null = null /** * Current tab title */ title: string /** * User-defined title override */ customTitle: string /** * Last tab activity state */ hasActivity = false /** * ViewRef to the tab DOM element */ hostView: ViewRef /** * CSS color override for the tab's header */ get color (): string|null { return this._color } set color (value: string|null) { this._color = value } private _color: string|null = null /** * icon override for the tab's header */ get icon (): string|null { return this._icon } set icon (value: string|null) { this._icon = value } private _icon: string|null = null hasFocus = false /** * Ping this if your recovery state has been changed and you want * your tab state to be saved sooner */ protected recoveryStateChangedHint = new Subject() protected viewContainer?: ViewContainerRef /* @hidden */ viewContainerEmbeddedRef?: EmbeddedViewRef private titleChange = new Subject() private focused = new Subject() private blurred = new Subject() protected visibility = new BehaviorSubject(false) protected progress = new BehaviorSubject(null) protected activity = new BehaviorSubject(false) private destroyed = new Subject() private _destroyCalled = false get focused$ (): Observable { return this.focused } get blurred$ (): Observable { return this.blurred } /* @hidden */ get visibility$ (): Observable { return this.visibility } get titleChange$ (): Observable { return this.titleChange.pipe(distinctUntilChanged()) } get progress$ (): Observable { return this.progress.pipe(distinctUntilChanged()) } get activity$ (): Observable { return this.activity } get destroyed$ (): Observable { return this.destroyed } get recoveryStateChangedHint$ (): Observable { return this.recoveryStateChangedHint } protected config: ConfigService protected constructor (injector: Injector) { super() this.config = injector.get(ConfigService) this.focused$.subscribe(() => { this.hasFocus = true }) this.blurred$.subscribe(() => { this.hasFocus = false }) this.subscribeUntilDestroyed(this.progress.pipe( filter(x => x !== null), debounceTime(5000), ), () => { this.setProgress(null) }) } setTitle (title: string): void { this.title = title if (!this.customTitle) { this.titleChange.next(title) } } /** * Sets visual progressbar on the tab * * @param {type} progress: value between 0 and 1, or `null` to remove */ setProgress (progress: number|null): void { this.progress.next(progress) } /** * Shows the activity marker on the tab header */ displayActivity (): void { if (!this.hasActivity) { this.hasActivity = true this.activity.next(true) } } /** * Removes the activity marker from the tab header */ clearActivity (): void { if (this.hasActivity) { this.hasActivity = false this.activity.next(false) } } /** * Override this and implement a [[TabRecoveryProvider]] to enable recovery * for your custom tab * * @return JSON serializable tab state representation * for your [[TabRecoveryProvider]] to parse */ async getRecoveryToken (options?: GetRecoveryTokenOptions): Promise { // eslint-disable-line @typescript-eslint/no-unused-vars return null } /** * Override this to enable task completion notifications for the tab */ async getCurrentProcess (): Promise { return null } /** * Return false to prevent the tab from being closed */ async canClose (): Promise { return true } emitFocused (): void { this.focused.next() } emitBlurred (): void { this.blurred.next() } /* @hidden */ emitVisibility (visibility: boolean): void { this.visibility.next(visibility) } insertIntoContainer (container: ViewContainerRef): EmbeddedViewRef { this.viewContainerEmbeddedRef = container.insert(this.hostView) as EmbeddedViewRef this.viewContainer = container return this.viewContainerEmbeddedRef } removeFromContainer (): void { if (!this.viewContainer || !this.viewContainerEmbeddedRef) { return } const viewIndex = this.viewContainer.indexOf(this.viewContainerEmbeddedRef) if (viewIndex !== -1) { this.viewContainer.detach(viewIndex) } this.viewContainerEmbeddedRef = undefined this.viewContainer = undefined } get topmostParent (): BaseTabComponent|null { let parent = this.parent while (parent?.parent) { parent = parent.parent } return parent } /** * Called before the tab is closed */ destroy (skipDestroyedEvent = false): void { if (this._destroyCalled) { return } this._destroyCalled = true this.focused.complete() this.blurred.complete() this.titleChange.complete() this.progress.complete() this.activity.complete() this.recoveryStateChangedHint.complete() if (!skipDestroyedEvent) { this.destroyed.next() } this.destroyed.complete() } /** @hidden */ ngOnDestroy (): void { this.destroy() super.ngOnDestroy() } } ================================================ FILE: tabby-core/src/components/checkbox.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { NgZone, Component, Input, HostBinding, HostListener } from '@angular/core' import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms' /** @hidden */ @Component({ selector: 'checkbox', template: `

`, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: CheckboxComponent, multi: true }, ], }) export class CheckboxComponent implements ControlValueAccessor { @HostBinding('class.active') @Input() model: boolean @HostBinding('class.disabled') @Input() disabled: boolean @Input() text: string private changed = new Array<(val: boolean) => void>() @HostListener('click') click () { NgZone.assertInAngularZone() if (this.disabled) { return } this.model = !this.model for (const fx of this.changed) { fx(this.model) } } writeValue (obj: any) { this.model = obj } registerOnChange (fn: any): void { this.changed.push(fn) } registerOnTouched (fn: any): void { this.changed.push(fn) } setDisabledState (isDisabled: boolean) { this.disabled = isDisabled } } ================================================ FILE: tabby-core/src/components/profileIcon.component.pug ================================================ i.icon( class='fa-fw {{icon}}', [style.color]='color', *ngIf='!isHTML' ) .icon( [fastHtmlBind]='icon', *ngIf='isHTML && icon' ) ================================================ FILE: tabby-core/src/components/profileIcon.component.scss ================================================ :host { display: flex; align-items: center; max-width: 1.25rem; } ::ng-deep img { max-width: 100%; max-height: 100%; } ::ng-deep svg { width: 100%; height: 100%; } ================================================ FILE: tabby-core/src/components/profileIcon.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, Input } from '@angular/core' import { BaseComponent } from './base.component' /** @hidden */ @Component({ selector: 'profile-icon', templateUrl: './profileIcon.component.pug', styleUrls: ['./profileIcon.component.scss'], }) export class ProfileIconComponent extends BaseComponent { @Input() icon?: string @Input() color?: string get isHTML (): boolean { return this.icon?.startsWith('<') ?? false } } ================================================ FILE: tabby-core/src/components/promptModal.component.pug ================================================ .modal-body input.form-control( [type]='password ? "password" : "text"', autofocus, [(ngModel)]='value', #input, [placeholder]='prompt', (keyup.enter)='ok()', (keyup.esc)='cancel()', ) .d-flex.align-items-start.mt-2 checkbox( *ngIf='showRememberCheckbox', [(ngModel)]='remember', text='Remember' ) button.btn.btn-primary.ms-auto( (click)='ok()', ) OK ================================================ FILE: tabby-core/src/components/promptModal.component.ts ================================================ import { Component, Input, ViewChild, ElementRef } from '@angular/core' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' /** @hidden */ @Component({ templateUrl: './promptModal.component.pug', }) export class PromptModalComponent { @Input() value: string @Input() prompt: string|undefined @Input() password: boolean @Input() remember: boolean @Input() showRememberCheckbox: boolean @ViewChild('input') input: ElementRef constructor ( private modalInstance: NgbActiveModal, ) { } ngOnInit (): void { setTimeout(() => { this.input.nativeElement.focus() }) } ok (): void { this.modalInstance.close({ value: this.value, remember: this.remember, }) } cancel (): void { this.modalInstance.close(null) } } ================================================ FILE: tabby-core/src/components/renameTabModal.component.pug ================================================ .modal-body input.form-control(type='text', #input, [(ngModel)]='value', (keyup.enter)='save()', autofocus) .modal-footer button.btn.btn-primary((click)='save()', translate) Save button.btn.btn-secondary((click)='close()', translate) Cancel ================================================ FILE: tabby-core/src/components/renameTabModal.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, Input, ElementRef, ViewChild } from '@angular/core' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' /** @hidden */ @Component({ selector: 'rename-tab-modal', templateUrl: './renameTabModal.component.pug', }) export class RenameTabModalComponent { @Input() value: string @ViewChild('input') input: ElementRef constructor ( private modalInstance: NgbActiveModal, ) { } ngOnInit () { setTimeout(() => { this.input.nativeElement.focus() this.input.nativeElement.select() }, 250) } save () { this.modalInstance.close(this.value) } close () { this.modalInstance.dismiss() } } ================================================ FILE: tabby-core/src/components/safeModeModal.component.pug ================================================ .modal-body .alert.alert-danger(translate) Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was: pre {{error}} .modal-footer button.btn.btn-primary((click)='close()', translate) Close ================================================ FILE: tabby-core/src/components/safeModeModal.component.ts ================================================ import { Component, Input } from '@angular/core' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' /** @hidden */ @Component({ templateUrl: './safeModeModal.component.pug', }) export class SafeModeModalComponent { @Input() error: Error constructor ( public modalInstance: NgbActiveModal, ) { this.error = window['safeModeReason'] } close (): void { this.modalInstance.dismiss() } } ================================================ FILE: tabby-core/src/components/selectorModal.component.pug ================================================ .modal-body input.form-control.form-control-lg( type='text', [(ngModel)]='filter', autofocus, [placeholder]='name', (ngModelChange)='onFilterChange()' ) .list-group.list-group-light(*ngIf='filteredOptions.length') ng-container(*ngFor='let option of filteredOptions; let i = index') label.group-header( *ngIf='hasGroups && option.group !== filteredOptions[i - 1]?.group' ) {{option.group}} a.list-group-item.list-group-item-action.d-flex.align-items-center( #item, (click)='selectOption(option)', [class.active]='selectedIndex == i' ) profile-icon( [icon]='option.icon', [color]='option.color' ) .title.me-2 {{getOptionText(option)}} .description.no-wrap.text-muted( *ngIf='option.description !== getOptionText(option)' ) {{option.description}} .ms-auto .no-wrap.badge.text-bg-secondary.ms-2(*ngIf='selectedIndex == i && canEditSelected()') span BACKSPACE i.fas.fa-pencil.ms-1 .no-wrap.badge.text-bg-secondary.ms-2(*ngIf='selectedIndex == i') span ENTER i.fas.fa-arrow-right.ms-1 ================================================ FILE: tabby-core/src/components/selectorModal.component.scss ================================================ .modal-body { padding: 0; } .list-group { max-height: 70vh; overflow: auto; border-top-left-radius: 0; border-top-right-radius: 0; padding: 10px 15px; } .group-header { padding: 0 1rem; margin: 15px 0 10px; font-weight: bold; &:first-child { margin-top: 5px; } } .icon { width: 1.25rem; margin-right: 0.25rem; } .title { margin-left: 10px; flex: none; } .description { flex: 1 1 0; } input { border-radius: 0; border: none; } profile-icon { width: 14px; height: 14px; } ================================================ FILE: tabby-core/src/components/selectorModal.component.ts ================================================ import { firstBy } from 'thenby' import { Component, Input, HostListener, ViewChildren, QueryList, ElementRef } from '@angular/core' // eslint-disable-line @typescript-eslint/no-unused-vars import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import FuzzySearch from 'fuzzy-search' import { SelectorOption } from '../api/selector' /** @hidden */ @Component({ selector: 'selector-modal', templateUrl: './selectorModal.component.pug', styleUrls: ['./selectorModal.component.scss'], }) export class SelectorModalComponent { @Input() options: SelectorOption[] @Input() filteredOptions: SelectorOption[] @Input() filter = '' @Input() name: string @Input() selectedIndex = 0 hasGroups = false @ViewChildren('item') itemChildren: QueryList private preventEdit: boolean constructor (public modalInstance: NgbActiveModal) { this.preventEdit = false } ngOnInit (): void { this.onFilterChange() this.hasGroups = this.options.some(x => x.group) } @HostListener('keydown', ['$event']) onKeyDown (event: KeyboardEvent): void { if (event.key === 'Escape') { this.close() } else if (this.filteredOptions.length > 0) { if (event.key === 'PageUp' || event.key === 'ArrowUp' && event.metaKey) { this.selectedIndex -= Math.min(10, Math.max(1, this.selectedIndex)) event.preventDefault() } else if (event.key === 'PageDown' || event.key === 'ArrowDown' && event.metaKey) { this.selectedIndex += Math.min(10, Math.max(1, this.filteredOptions.length - this.selectedIndex - 1)) event.preventDefault() } else if (event.key === 'ArrowUp') { this.selectedIndex-- event.preventDefault() } else if (event.key === 'ArrowDown') { this.selectedIndex++ event.preventDefault() } else if (event.key === 'Enter') { this.selectOption(this.filteredOptions[this.selectedIndex]) } else if (event.key === 'Backspace' && !this.preventEdit) { if (this.canEditSelected()) { event.preventDefault() this.filter = this.filteredOptions[this.selectedIndex].freeInputEquivalent! this.onFilterChange() } else { this.preventEdit = true } } this.selectedIndex = (this.selectedIndex + this.filteredOptions.length) % this.filteredOptions.length Array.from(this.itemChildren)[this.selectedIndex]?.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'nearest', }) } } @HostListener('keyup', ['$event']) onKeyUp (event: KeyboardEvent): void { if (event.key === 'Backspace' && this.preventEdit) { this.preventEdit = false } } onFilterChange (): void { const f = this.filter.trim().toLowerCase() if (!f) { this.filteredOptions = this.options.slice().sort( firstBy, number>(x => x.weight ?? 0) .thenBy, string>(x => x.group ?? '') .thenBy, string>(x => x.name), ) .filter(x => !x.freeInputPattern) } else { // eslint-disable-next-line @typescript-eslint/restrict-plus-operands this.filteredOptions = new FuzzySearch( this.options, ['name', 'group', 'description'], { sort: true }, ).search(f) this.options.filter(x => x.freeInputPattern).sort(firstBy, number>(x => x.weight ?? 0)).forEach(freeOption => { if (!this.filteredOptions.includes(freeOption)) { this.filteredOptions.push(freeOption) } }) } this.selectedIndex = Math.max(0, this.selectedIndex) this.selectedIndex = Math.min(this.filteredOptions.length - 1, this.selectedIndex) } filterMatches (option: SelectorOption, terms: string[]): boolean { const content = (option.group ?? '') + option.name + (option.description ?? '') return terms.every(term => content.toLowerCase().includes(term)) } getOptionText (option: SelectorOption): string { if (option.freeInputPattern) { return option.freeInputPattern.replace('%s', this.filter) } return option.name } selectOption (option: SelectorOption): void { this.modalInstance.close(option.result) setTimeout(() => option.callback?.(this.filter)) } canEditSelected (): boolean { return !this.filter && !!this.filteredOptions[this.selectedIndex].freeInputEquivalent && this.options.some(x => x.freeInputPattern) } close (): void { this.modalInstance.dismiss() } } ================================================ FILE: tabby-core/src/components/selfPositioning.component.ts ================================================ import { HostBinding, ElementRef, Component } from '@angular/core' import { BaseComponent } from './base.component' @Component({}) export abstract class SelfPositioningComponent extends BaseComponent { @HostBinding('style.left') cssLeft = '' @HostBinding('style.top') cssTop = '' @HostBinding('style.width') cssWidth: string | null = null @HostBinding('style.height') cssHeight: string | null = null constructor (protected element: ElementRef) { super() } protected setDimensions (x: number, y: number, w: number, h: number, unit = '%'): void { this.cssLeft = `${x}${unit}` this.cssTop = `${y}${unit}` this.cssWidth = w ? `${w}${unit}` : null this.cssHeight = h ? `${h}${unit}` : null } } ================================================ FILE: tabby-core/src/components/splitTab.component.scss ================================================ :host { display: block; position: relative; flex: auto; } ::ng-deep split-tab > .child { position: absolute; transition: 0.125s all; opacity: .75; &.focused { opacity: 1; } &.minimized { opacity: .1; } &.maximized { z-index: 6; box-shadow: rgba(0, 0, 0, 0.25) 0px 0px 30px; backdrop-filter: blur(10px); border-radius: 10px; } } ::ng-deep .no-animations split-tab > .child { transition: none; } ================================================ FILE: tabby-core/src/components/splitTab.component.ts ================================================ import { Observable, Subject, takeWhile } from 'rxjs' import { Component, Injectable, ViewChild, ViewContainerRef, EmbeddedViewRef, AfterViewInit, OnDestroy, Injector } from '@angular/core' import { BaseTabComponent, BaseTabProcess, GetRecoveryTokenOptions } from './baseTab.component' import { TabRecoveryProvider, RecoveryToken } from '../api/tabRecovery' import { TabsService, NewTabParameters } from '../services/tabs.service' import { HotkeysService } from '../services/hotkeys.service' import { TabRecoveryService } from '../services/tabRecovery.service' export type SplitOrientation = 'v' | 'h' export type SplitDirection = 'r' | 't' | 'b' | 'l' export type ResizeDirection = 'v' | 'h' | 'dv' | 'dh' /** * Describes a horizontal or vertical split row or column */ export class SplitContainer { orientation: SplitOrientation = 'h' /** * Children could be tabs or other containers */ children: (BaseTabComponent | SplitContainer)[] = [] /** * Relative sizes of children, between 0 and 1. Total sum is 1 */ ratios: number[] = [] x: number y: number w: number h: number /** * @return Flat list of all tabs inside this container */ getAllTabs (): BaseTabComponent[] { let r: BaseTabComponent[] = [] for (const child of this.children) { if (child instanceof SplitContainer) { r = r.concat(child.getAllTabs()) } else { r.push(child) } } return r } /** * Remove unnecessarily nested child containers and renormalizes [[ratios]] */ normalize (): void { for (let i = 0; i < this.children.length; i++) { const child = this.children[i] if (child instanceof SplitContainer) { child.normalize() if (child.children.length === 0) { this.children.splice(i, 1) this.ratios.splice(i, 1) i-- continue } else if (child.children.length === 1) { this.children[i] = child.children[0] } else if (child.orientation === this.orientation) { const ratio = this.ratios[i] this.children.splice(i, 1) this.ratios.splice(i, 1) for (let j = 0; j < child.children.length; j++) { this.children.splice(i, 0, child.children[j]) this.ratios.splice(i, 0, child.ratios[j] * ratio) i++ } } } } let s = 0 for (const x of this.ratios) { s += x } this.ratios = this.ratios.map(x => x / s) } /** * Makes all tabs have the same size */ equalize (): void { for (const child of this.children) { if (child instanceof SplitContainer) { child.equalize() } } this.ratios.fill(1 / this.ratios.length) } /** * Gets the left/top side offset for the given element index (between 0 and 1) */ getOffsetRatio (index: number): number { let s = 0 for (let i = 0; i < index; i++) { s += this.ratios[i] } return s } async serialize (tabsRecovery: TabRecoveryService, options?: GetRecoveryTokenOptions): Promise { const children: any[] = [] for (const child of this.children) { if (child instanceof SplitContainer) { children.push(await child.serialize(tabsRecovery, options)) } else { children.push(await tabsRecovery.getFullRecoveryToken(child, options)) } } return { type: 'app:split-tab', ratios: this.ratios, orientation: this.orientation, children, } } } /** * Represents a spanner (draggable border between two split areas) */ export interface SplitSpannerInfo { container: SplitContainer /** * Number of the right/bottom split in the container */ index: number } /** * Represents a tab drop zone */ export type SplitDropZoneInfo = { x: number y: number w: number h: number } & ({ type: 'absolute' container: SplitContainer position: number } | { type: 'relative' relativeTo?: BaseTabComponent|SplitContainer side: SplitDirection }) /** * Split tab is a tab that contains other tabs and allows further splitting them * You'll mainly encounter it inside [[AppService]].tabs */ @Component({ selector: 'split-tab', template: ` `, styleUrls: ['./splitTab.component.scss'], }) export class SplitTabComponent extends BaseTabComponent implements AfterViewInit, OnDestroy { static DIRECTIONS: SplitDirection[] = ['t', 'r', 'b', 'l'] /** @hidden */ @ViewChild('vc', { read: ViewContainerRef }) viewContainer: ViewContainerRef /** * Top-level split container */ root: SplitContainer /** @hidden */ _recoveredState: any /** @hidden */ _spanners: SplitSpannerInfo[] = [] /** @hidden */ _dropZones: SplitDropZoneInfo[] = [] /** @hidden */ _allFocusMode = false /** @hidden */ _spannerResizing = false /** * Disables display of dynamic window/tab title provided by the shell */ disableDynamicTitle = false /** @hidden */ private focusedTab: BaseTabComponent|null = null private maximizedTab: BaseTabComponent|null = null private viewRefs: Map> = new Map() private tabAdded = new Subject() private tabAdopted = new Subject() private tabRemoved = new Subject() private splitAdjusted = new Subject() private focusChanged = new Subject() private initialized = new Subject() get tabAdded$ (): Observable { return this.tabAdded } /** * Fired when an existing top-level tab is dragged into this tab */ get tabAdopted$ (): Observable { return this.tabAdopted } get tabRemoved$ (): Observable { return this.tabRemoved } /** * Fired when split ratio is changed for a given spanner */ get splitAdjusted$ (): Observable { return this.splitAdjusted } /** * Fired when a different sub-tab gains focus */ get focusChanged$ (): Observable { return this.focusChanged } /** * Fired once tab layout is created and child tabs can be added */ get initialized$ (): Observable { return this.initialized } /** @hidden */ constructor ( private hotkeys: HotkeysService, private tabsService: TabsService, private tabRecovery: TabRecoveryService, injector: Injector, ) { super(injector) this.root = new SplitContainer() this.setTitle('') this.focused$.subscribe(() => { this.getAllTabs().forEach(x => x.emitFocused()) if (this.focusedTab) { this.focus(this.focusedTab) } else { this.focusAnyIn(this.root) } }) this.blurred$.subscribe(() => this.getAllTabs().forEach(x => x.emitBlurred())) this.visibility$.subscribe(visibility => this.getAllTabs().forEach(x => x.emitVisibility(visibility))) this.tabAdded$.subscribe(() => this.updateTitle()) this.tabRemoved$.subscribe(() => this.updateTitle()) this.subscribeUntilDestroyed(this.hotkeys.hotkey$, hotkey => { if (!this.hasFocus || !this.focusedTab) { return } switch (hotkey) { case 'split-right': this.splitTab(this.focusedTab, 'r') break case 'split-bottom': this.splitTab(this.focusedTab, 'b') break case 'split-top': this.splitTab(this.focusedTab, 't') break case 'split-left': this.splitTab(this.focusedTab, 'l') break case 'pane-nav-left': this.navigate('l') break case 'pane-nav-right': this.navigate('r') break case 'pane-nav-up': this.navigate('t') break case 'pane-nav-down': this.navigate('b') break case 'pane-nav-previous': this.navigateLinear(-1) break case 'pane-nav-next': this.navigateLinear(1) break case 'pane-nav-1': this.navigateSpecific(0) break case 'pane-nav-2': this.navigateSpecific(1) break case 'pane-nav-3': this.navigateSpecific(2) break case 'pane-nav-4': this.navigateSpecific(3) break case 'pane-nav-5': this.navigateSpecific(4) break case 'pane-nav-6': this.navigateSpecific(5) break case 'pane-nav-7': this.navigateSpecific(6) break case 'pane-nav-8': this.navigateSpecific(7) break case 'pane-nav-9': this.navigateSpecific(8) break case 'pane-maximize': if (this.maximizedTab) { this.maximize(null) } else if (this.getAllTabs().length > 1) { this.maximize(this.focusedTab) } break case 'close-pane': this.focusedTab.destroy() break case 'pane-increase-vertical': this.resizePane('v') break case 'pane-decrease-vertical': this.resizePane('dv') break case 'pane-increase-horizontal': this.resizePane('h') break case 'pane-decrease-horizontal': this.resizePane('dh') break } }) } /** @hidden */ async ngAfterViewInit (): Promise { if (this._recoveredState) { await this.recoverContainer(this.root, this._recoveredState) this.updateTitle() this.layout() setTimeout(() => { if (this.hasFocus) { for (const tab of this.getAllTabs()) { this.focus(tab) } } }, 100) // Propagate visibility to new children this.emitVisibility(this.visibility.value) } this.initialized.next() this.initialized.complete() } /** @hidden */ ngOnDestroy (): void { this.tabAdded.complete() this.tabRemoved.complete() super.ngOnDestroy() } /** @returns Flat list of all sub-tabs */ getAllTabs (): BaseTabComponent[] { return this.root.getAllTabs() } getFocusedTab (): BaseTabComponent|null { return this.focusedTab } getMaximizedTab (): BaseTabComponent|null { return this.maximizedTab } focus (tab: BaseTabComponent): void { this.focusedTab = tab for (const x of this.getAllTabs()) { if (x !== tab) { x.emitBlurred() } } tab.emitFocused() this.focusChanged.next(tab) if (this.maximizedTab !== tab) { this.maximizedTab = null } this.layout() } maximize (tab: BaseTabComponent|null): void { this.maximizedTab = tab this.layout() } /** * Focuses the first available tab inside the given [[SplitContainer]] */ focusAnyIn (parent?: BaseTabComponent | SplitContainer): void { if (!parent) { return } if (parent instanceof SplitContainer) { this.focusAnyIn(parent.children[0]) } else { this.focus(parent) } } addTab (tab: BaseTabComponent, relative: BaseTabComponent|null, side: SplitDirection): Promise { return this.add(tab, relative, side) } /** * Inserts a new `tab` to the `side` of the `relative` tab */ async add (thing: BaseTabComponent|SplitContainer, relative: BaseTabComponent|SplitContainer|null, side: SplitDirection): Promise { if (thing instanceof SplitTabComponent) { const tab = thing thing = tab.root tab.root = new SplitContainer() for (const child of thing.getAllTabs()) { child.removeFromContainer() } tab.destroy() } let allTabs: BaseTabComponent[] = [] if (thing instanceof BaseTabComponent) { allTabs = [thing] } else if (thing instanceof SplitContainer) { allTabs = thing.getAllTabs() } for (const tab of allTabs) { if (tab.parent instanceof SplitTabComponent) { tab.parent.removeTab(tab) } tab.removeFromContainer() tab.parent = this tab.emitVisibility(this.visibility.value) } let target = relative ? this.getParentOf(relative) : null if (!target) { // Rewrap the root container just in case the orientation isn't compatible target = new SplitContainer() target.orientation = ['l', 'r'].includes(side) ? 'h' : 'v' target.children = [this.root] target.ratios = [1] this.root = target } let insertIndex = relative ? target.children.indexOf(relative) + ('tl'.includes(side) ? 0 : 1) : 'tl'.includes(side) ? 0 : -1 if ( target.orientation === 'v' && ['l', 'r'].includes(side) || target.orientation === 'h' && ['t', 'b'].includes(side) ) { // Inserting into a container but the orientation isn't compatible const newContainer = new SplitContainer() newContainer.orientation = ['l', 'r'].includes(side) ? 'h' : 'v' newContainer.children = relative ? [relative] : [] newContainer.ratios = [1] target.children.splice(relative ? target.children.indexOf(relative) : -1, 1, newContainer) target = newContainer insertIndex = 'tl'.includes(side) ? 0 : 1 } for (let i = 0; i < target.children.length; i++) { target.ratios[i] *= target.children.length / (target.children.length + 1) } if (insertIndex === -1) { insertIndex = target.ratios.length } target.ratios.splice(insertIndex, 0, 1 / (target.children.length + 1)) target.children.splice(insertIndex, 0, thing) this.recoveryStateChangedHint.next() await this.initialized$.toPromise() for (const tab of thing instanceof SplitContainer ? thing.getAllTabs() : [thing]) { this.attachTabView(tab) this.onAfterTabAdded(tab) } this.root.normalize() } removeTab (tab: BaseTabComponent): void { const parent = this.getParentOf(tab) if (!parent) { return } const index = parent.children.indexOf(tab) parent.ratios.splice(index, 1) parent.children.splice(index, 1) tab.removeFromContainer() tab.parent = null this.viewRefs.delete(tab) this.layout() this.tabRemoved.next(tab) if (this.root.children.length === 0) { this.destroy() } else { this.focusAnyIn(parent) } } replaceTab (tab: BaseTabComponent, newTab: BaseTabComponent): void { const parent = this.getParentOf(tab) if (!parent) { return } const position = parent.children.indexOf(tab) parent.children[position] = newTab tab.removeFromContainer() this.attachTabView(newTab) tab.parent = null newTab.parent = this this.recoveryStateChangedHint.next() this.onAfterTabAdded(newTab) this.updateTitle() } /** * Changes the size of the focused pane in the given direction */ resizePane (direction: ResizeDirection): void { const resizeStep = this.config.store.terminal.paneResizeStep // The direction of the resize pane, vertically or horizontally let directionvh: SplitOrientation = 'h' const isDecreasing: boolean = direction === 'dv' || direction === 'dh' if (direction === 'dh') { directionvh = 'h' } if (direction === 'dv') { directionvh = 'v' } if (direction === 'h') { directionvh = 'h' } if (direction === 'v') { directionvh = 'v' } if (!this.focusedTab) { console.debug('No currently focused tab') return } let currentContainer: BaseTabComponent | SplitContainer = this.focusedTab let child: BaseTabComponent | SplitContainer | null = this.focusedTab let curSplitOrientation: SplitOrientation | null = null // Find the first split that is in the orientations that the user chooses to change while (curSplitOrientation !== directionvh) { const parentContainer = this.getParentOf(currentContainer) if (!parentContainer) { return } child = currentContainer currentContainer = parentContainer if (currentContainer instanceof SplitContainer) { curSplitOrientation = currentContainer.orientation } } if (!(currentContainer instanceof SplitContainer)) { return } // Determine which index in the ratios refers to the child that will be modified const currentChildIndex = currentContainer.children.indexOf(child) let updatedRatio = 0 if (isDecreasing) { updatedRatio = currentContainer.ratios[currentChildIndex] - resizeStep if (updatedRatio < 0) { return } } else { updatedRatio = currentContainer.ratios[currentChildIndex] + resizeStep if (updatedRatio > 1) { return } } currentContainer.ratios[currentChildIndex] = updatedRatio this.layout() } private getPaneRect (pane: BaseTabComponent): DOMRect { const viewRef = this.viewRefs.get(pane)! const element = viewRef.rootNodes[0] as HTMLElement return element.getBoundingClientRect() } getNearestPaneInDirection (from: BaseTabComponent, direction: SplitDirection): BaseTabComponent { const rect = this.getPaneRect(from) let nearest: BaseTabComponent | null = null let nearestDistance = Infinity let panes = this.getAllTabs().map(pane => ({ pane, rect: this.getPaneRect(pane) })) if (direction === 'l') { panes = panes.filter(pane => pane.rect.right <= rect.left) } else if (direction === 'r') { panes = panes.filter(pane => pane.rect.left >= rect.right) } else if (direction === 't') { panes = panes.filter(pane => pane.rect.bottom <= rect.top) } else { panes = panes.filter(pane => pane.rect.top >= rect.bottom) } for (const pane of panes) { if (pane.pane === from) { continue } const distance = Math.abs(rect.left + rect.width / 2 - pane.rect.left - pane.rect.width / 2) + Math.abs(rect.top + rect.height / 2 - pane.rect.top - pane.rect.height / 2) if (distance < nearestDistance) { nearest = pane.pane nearestDistance = distance } } return nearest ?? from } /** * Moves focus in the given direction */ navigate (dir: SplitDirection): void { if (!this.focusedTab) { return } this.focus(this.getNearestPaneInDirection(this.focusedTab, dir)) } navigateLinear (delta: number): void { if (!this.focusedTab) { return } const relativeTo: BaseTabComponent = this.focusedTab const all = this.getAllTabs() const target = all[(all.indexOf(relativeTo) + delta + all.length) % all.length] this.focus(target) } navigateSpecific (target: number): void { const all = this.getAllTabs() if (target >= all.length) { return } this.focus(all[target]) } async splitTab (tab: BaseTabComponent, dir: SplitDirection): Promise { const newTab = await this.tabsService.duplicate(tab) if (newTab) { await this.addTab(newTab, tab, dir) } return newTab } /** * @returns the immediate parent of `tab` */ getParentOf (tab: BaseTabComponent | SplitContainer, root?: SplitContainer): SplitContainer|null { root = root ?? this.root for (const child of root.children) { if (child instanceof SplitContainer) { const r = this.getParentOf(tab, child) if (r) { return r } } if (child === tab) { return root } } return null } /** @hidden */ async canClose (): Promise { return !(await Promise.all(this.getAllTabs().map(x => x.canClose()))).some(x => !x) } /** @hidden */ async getRecoveryToken (options?: GetRecoveryTokenOptions): Promise { return this.root.serialize(this.tabRecovery, options) } /** @hidden */ async getCurrentProcess (): Promise { return (await Promise.all(this.getAllTabs().map(x => x.getCurrentProcess()))).find(x => !!x) ?? null } /** @hidden */ onSpannerAdjusted (spanner: SplitSpannerInfo): void { this.layout() this.splitAdjusted.next(spanner) } /** @hidden */ onSpannerResizing (state: boolean): void { this._spannerResizing = state } /** @hidden */ onTabDropped (tab: BaseTabComponent, zone: SplitDropZoneInfo) { // eslint-disable-line @typescript-eslint/explicit-module-boundary-types if (tab === this) { return } if (zone.type === 'relative') { this.add(tab, zone.relativeTo ?? null, zone.side) } else { this.add(tab, zone.container.children[zone.position], zone.container.orientation === 'h' ? 'r' : 'b') } this.tabAdopted.next(tab) } destroy (): void { for (const x of this.getAllTabs()) { x.destroy() } super.destroy() } layout (): void { this.root.normalize() this._spanners = [] this._dropZones = [] this.layoutInternal(this.root, 0, 0, 100, 100) } clearActivity (): void { for (const tab of this.getAllTabs()) { tab.clearActivity() } super.clearActivity() } get icon (): string|null { return this.getFocusedTab()?.icon ?? this.getAllTabs()[0]?.icon ?? null } set icon (icon: string|null) { for (const t of this.getAllTabs()) { t.icon = icon } } get color (): string|null { return this.getFocusedTab()?.color ?? this.getAllTabs()[0]?.color ?? null } set color (color: string|null) { for (const t of this.getAllTabs()) { t.color = color } } equalize (): void { this.root.normalize() this.root.equalize() } private updateTitle (): void { if (this.disableDynamicTitle) { return } const titles = [ this.getFocusedTab()?.title, ...this.getAllTabs() .filter(x => x !== this.getFocusedTab()) .map(x => x.title), ] this.setTitle([...new Set(titles)].join(' | ')) } private attachTabView (tab: BaseTabComponent) { const ref = tab.insertIntoContainer(this.viewContainer) this.viewRefs.set(tab, ref) tab.addEventListenerUntilDestroyed(ref.rootNodes[0], 'click', () => this.focus(tab)) if (this.config.store.terminal.focusFollowsMouse) { tab.addEventListenerUntilDestroyed(ref.rootNodes[0], 'mousemove', () => { if (this._spannerResizing) { return } this.focus(tab) }) } tab.subscribeUntilDestroyed( this.observeUntilChildDetached(tab, tab.focused$), () => this.updateTitle(), ) tab.subscribeUntilDestroyed( this.observeUntilChildDetached(tab, tab.titleChange$), () => this.updateTitle(), ) tab.subscribeUntilDestroyed( this.observeUntilChildDetached(tab, tab.activity$), a => a ? this.displayActivity() : this.clearActivity(), ) tab.subscribeUntilDestroyed( this.observeUntilChildDetached(tab, tab.progress$), p => this.setProgress(p), ) if (tab.title) { this.updateTitle() } tab.subscribeUntilDestroyed( this.observeUntilChildDetached(tab, tab.recoveryStateChangedHint$), () => { this.recoveryStateChangedHint.next() }, ) tab.destroyed$.subscribe(() => { this.removeTab(tab) }) } private observeUntilChildDetached (tab: BaseTabComponent, event: Observable): Observable { return event.pipe(takeWhile(() => { return this.getAllTabs().includes(tab) })) } private onAfterTabAdded (tab: BaseTabComponent) { setImmediate(() => { this.layout() this.tabAdded.next(tab) this.focus(tab) }) } private layoutInternal (root: SplitContainer, x: number, y: number, w: number, h: number) { const size = root.orientation === 'v' ? h : w const sizes = root.ratios.map(ratio => ratio * size) const thickness = 10 if (root === this.root) { this._dropZones.push({ x: x - thickness / 2, y: y + thickness, w: thickness, h: h - thickness * 2, type: 'relative', side: 'l', }) this._dropZones.push({ x, y: y - thickness / 2, w, h: thickness, type: 'relative', side: 't', }) this._dropZones.push({ x: x + w - thickness / 2, y: y + thickness, w: thickness, h: h - thickness * 2, type: 'relative', side: 'r', }) this._dropZones.push({ x, y: y + h - thickness / 2, w, h: thickness, type: 'relative', side: 'b', }) } root.x = x root.y = y root.w = w root.h = h let offset = 0 root.children.forEach((child, i) => { const childX = root.orientation === 'v' ? x : x + offset const childY = root.orientation === 'v' ? y + offset : y const childW = root.orientation === 'v' ? w : sizes[i] const childH = root.orientation === 'v' ? sizes[i] : h if (child instanceof SplitContainer) { this.layoutInternal(child, childX, childY, childW, childH) } else { const viewRef = this.viewRefs.get(child) if (viewRef) { const element = viewRef.rootNodes[0] element.classList.toggle('child', true) element.classList.toggle('maximized', child === this.maximizedTab) element.classList.toggle('minimized', this.maximizedTab && child !== this.maximizedTab) element.classList.toggle('focused', this._allFocusMode || child === this.focusedTab) element.style.left = `${childX}%` element.style.top = `${childY}%` element.style.width = `${childW}%` element.style.height = `${childH}%` if (child === this.maximizedTab) { element.style.left = '5%' element.style.top = '5%' element.style.width = '90%' element.style.height = '90%' } } } offset += sizes[i] if (i !== root.ratios.length - 1) { // Spanner area this._dropZones.push({ type: 'relative', relativeTo: root.children[i], side: root.orientation === 'v' ? 'b': 'r', x: root.orientation === 'v' ? childX + thickness : childX + offset - thickness / 2, y: root.orientation === 'v' ? childY + offset - thickness / 2 : childY + thickness, w: root.orientation === 'v' ? childW - thickness * 2 : thickness, h: root.orientation === 'v' ? thickness : childH - thickness * 2, }) } // Sides if (root.orientation === 'v') { this._dropZones.push({ x: childX, y: childY + thickness, w: thickness, h: childH - thickness * 2, type: 'relative', relativeTo: child, side: 'l', }) this._dropZones.push({ x: childX + w - thickness, y: childY + thickness, w: thickness, h: childH - thickness * 2, type: 'relative', relativeTo: child, side: 'r', }) } else { this._dropZones.push({ x: childX + thickness, y: childY, w: childW - thickness * 2, h: thickness, type: 'relative', relativeTo: child, side: 't', }) this._dropZones.push({ x: childX + thickness, y: childY + childH - thickness, w: childW - thickness * 2, h: thickness, type: 'relative', relativeTo: child, side: 'b', }) } if (i !== 0) { this._spanners.push({ container: root, index: i, }) } }) } private async recoverContainer (root: SplitContainer, state: any) { const children: (SplitContainer | BaseTabComponent)[] = [] root.orientation = state.orientation root.ratios = state.ratios root.children = children for (const childState of state.children) { if (!childState) { continue } if (childState.type === 'app:split-tab') { const child = new SplitContainer() await this.recoverContainer(child, childState) children.push(child) } else { const recovered = await this.tabRecovery.recoverTab(childState) if (recovered) { const tab = this.tabsService.create(recovered) children.push(tab) tab.parent = this this.attachTabView(tab) } else { state.ratios.splice(state.children.indexOf(childState), 0) } } } while (root.ratios.length < root.children.length) { root.ratios.push(1) } root.normalize() } } /** @hidden */ @Injectable({ providedIn: 'root' }) export class SplitTabRecoveryProvider extends TabRecoveryProvider { async applicableTo (recoveryToken: RecoveryToken): Promise { return recoveryToken.type === 'app:split-tab' } async recover (recoveryToken: RecoveryToken): Promise> { return { type: SplitTabComponent, inputs: { _recoveredState: recoveryToken }, } } } ================================================ FILE: tabby-core/src/components/splitTabDropZone.component.scss ================================================ :host { position: absolute; display: flex; z-index: 5; padding: 15px; transition: all 125ms cubic-bezier(0, 0, 0.2, 1); > div { flex: 1 1 0; width: 100%; height: 100%; opacity: 0; background: rgba(255, 255, 255, .125); border-radius: 5px; border: 1px solid rgba(255, 255, 255, .25); transition: all 125ms cubic-bezier(0, 0, 0.2, 1); > ::ng-deep * { display: none !important; } } &.highlighted { padding: 0px; border-radius: 3px; > div { opacity: 1; background: rgba(255, 255, 255, .5); } } &:not(.active) { pointer-events: none; opacity: 0; } ::ng-deep tab-header { // placeholders opacity: 0; } } ================================================ FILE: tabby-core/src/components/splitTabDropZone.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, Input, HostBinding, ElementRef, Output, EventEmitter } from '@angular/core' import { AppService } from '../services/app.service' import { BaseTabComponent } from './baseTab.component' import { SelfPositioningComponent } from './selfPositioning.component' import { SplitDropZoneInfo, SplitTabComponent } from './splitTab.component' /** @hidden */ @Component({ selector: 'split-tab-drop-zone', template: `
`, styleUrls: ['./splitTabDropZone.component.scss'], }) export class SplitTabDropZoneComponent extends SelfPositioningComponent { @Input() dropZone: SplitDropZoneInfo @Input() parent: SplitTabComponent @Output() tabDropped = new EventEmitter() @HostBinding('class.active') isActive = false @HostBinding('class.highlighted') isHighlighted = false // eslint-disable-next-line @typescript-eslint/no-useless-constructor constructor ( element: ElementRef, app: AppService, ) { super(element) this.subscribeUntilDestroyed(app.tabDragActive$, tab => { this.isActive = !!tab && this.canActivateFor(tab) this.layout() }) } canActivateFor (tab: BaseTabComponent): boolean { const allTabs = this.parent.getAllTabs() return !( tab === this.parent || allTabs.length === 1 && allTabs.includes(tab) || this.dropZone.type === 'relative' && tab === this.dropZone.relativeTo || this.dropZone.type === 'absolute' && tab === this.dropZone.container.children[this.dropZone.position] ) } ngOnChanges () { this.layout() } layout () { this.setDimensions( this.dropZone.x, this.dropZone.y, this.dropZone.w, this.dropZone.h, ) } } ================================================ FILE: tabby-core/src/components/splitTabPaneLabel.component.scss ================================================ :host { position: absolute; background: rgba(0, 0, 0, .5); display: flex; align-items: center; justify-content: center; pointer-events: none; z-index: 10; opacity: 0; transition: .125s opacity cubic-bezier(0.86, 0, 0.07, 1); } div { background: rgba(0, 0, 0, .7); padding: 20px 30px; margin: 20px; font-size: 16px; color: #fff; display: flex; align-items: center; border-radius: 5px; cursor: move; } :host.active { opacity: 1; > div { pointer-events: initial; } } label { margin: 0; cursor: move; } ================================================ FILE: tabby-core/src/components/splitTabPaneLabel.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, Input, HostBinding, ElementRef } from '@angular/core' import { HotkeysService } from '../services/hotkeys.service' import { AppService } from '../services/app.service' import { BaseTabComponent } from './baseTab.component' import { SelfPositioningComponent } from './selfPositioning.component' /** @hidden */ @Component({ selector: 'split-tab-pane-label', template: `
`, styleUrls: ['./splitTabPaneLabel.component.scss'], }) export class SplitTabPaneLabelComponent extends SelfPositioningComponent { @Input() tab: BaseTabComponent @Input() parent: BaseTabComponent @HostBinding('class.active') isActive = false // eslint-disable-next-line @typescript-eslint/no-useless-constructor constructor ( element: ElementRef, hotkeys: HotkeysService, private app: AppService, ) { super(element) this.subscribeUntilDestroyed(hotkeys.hotkey$, hk => { if (hk === 'rearrange-panes' && this.parent.hasFocus) { this.isActive = true this.layout() } }) this.subscribeUntilDestroyed(hotkeys.hotkeyOff$, hk => { if (hk === 'rearrange-panes') { this.isActive = false } }) } ngOnChanges () { this.layout() } onTabDragStart (tab: BaseTabComponent): void { this.app.emitTabDragStarted(tab) } onTabDragEnd (): void { setTimeout(() => { this.app.emitTabDragEnded() this.app.emitTabsChanged() }) } layout () { const tabElement: HTMLElement|undefined = this.tab.viewContainerEmbeddedRef?.rootNodes[0] if (!tabElement) { // being destroyed return } this.setDimensions( tabElement.offsetLeft, tabElement.offsetTop, tabElement.clientWidth, tabElement.clientHeight, 'px', ) } } ================================================ FILE: tabby-core/src/components/splitTabSpanner.component.scss ================================================ :host { display: block; position: absolute; z-index: 5; transition: 0.125s background; &.v { cursor: ns-resize; height: 10px; margin-top: -5px; } &.h { cursor: ew-resize; width: 10px; margin-left: -5px; } } ================================================ FILE: tabby-core/src/components/splitTabSpanner.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, Input, HostBinding, ElementRef, Output, EventEmitter } from '@angular/core' import { SelfPositioningComponent } from './selfPositioning.component' import { SplitContainer } from './splitTab.component' /** @hidden */ @Component({ selector: 'split-tab-spanner', template: '', styleUrls: ['./splitTabSpanner.component.scss'], }) export class SplitTabSpannerComponent extends SelfPositioningComponent { @Input() container: SplitContainer @Input() index: number @Output() resizing = new EventEmitter() @Output() change = new EventEmitter() @HostBinding('class.active') isActive = false @HostBinding('class.h') isHorizontal = false @HostBinding('class.v') isVertical = true private marginOffset = -5 // eslint-disable-next-line @typescript-eslint/no-useless-constructor constructor (element: ElementRef) { super(element) } ngAfterViewInit () { this.element.nativeElement.addEventListener('dblclick', () => { this.reset() }) this.element.nativeElement.addEventListener('mousedown', (e: MouseEvent) => { this.isActive = true this.resizing.emit(true) const start = this.isVertical ? e.pageY : e.pageX let current = start const oldPosition: number = this.isVertical ? this.element.nativeElement.offsetTop : this.element.nativeElement.offsetLeft const dragHandler = (dragEvent: MouseEvent) => { current = this.isVertical ? dragEvent.pageY : dragEvent.pageX const newPosition = oldPosition + (current - start) if (this.isVertical) { this.element.nativeElement.style.top = `${newPosition - this.marginOffset}px` } else { this.element.nativeElement.style.left = `${newPosition - this.marginOffset}px` } } const offHandler = () => { this.isActive = false this.resizing.emit(false) document.removeEventListener('mouseup', offHandler) this.element.nativeElement.parentElement.removeEventListener('mousemove', dragHandler) let diff = (current - start) / (this.isVertical ? this.element.nativeElement.parentElement.clientHeight : this.element.nativeElement.parentElement.clientWidth) diff = Math.max(diff, -this.container.ratios[this.index - 1] + 0.1) diff = Math.min(diff, this.container.ratios[this.index] - 0.1) if (diff) { this.container.ratios[this.index - 1] += diff this.container.ratios[this.index] -= diff this.change.emit() } } document.addEventListener('mouseup', offHandler, { passive: true }) this.element.nativeElement.parentElement.addEventListener('mousemove', dragHandler) }, { passive: true }) } ngOnChanges () { this.isHorizontal = this.container.orientation === 'h' this.isVertical = this.container.orientation === 'v' if (this.isVertical) { this.setDimensions( this.container.x, this.container.y + this.container.h * this.container.getOffsetRatio(this.index), this.container.w, 0, ) } else { this.setDimensions( this.container.x + this.container.w * this.container.getOffsetRatio(this.index), this.container.y, 0, this.container.h, ) } } reset () { const ratio = (this.container.ratios[this.index - 1] + this.container.ratios[this.index]) / 2 this.container.ratios[this.index - 1] = ratio this.container.ratios[this.index] = ratio this.change.emit() } } ================================================ FILE: tabby-core/src/components/startPage.component.pug ================================================ .mt-auto.mb-auto .tabby-logo h1.tabby-title Tabby sup α .list-group.mb-4 a.list-group-item.list-group-item-action.d-flex.pt-3.pb-3( *ngFor='let command of commands; trackBy: buttonsTrackBy', (click)='command.run()', ) .d-flex.align-self-center([innerHTML]='sanitizeIcon(command.icon)') span {{command.label}} footer.d-flex.align-items-center .btn-group.me-auto button.btn.btn-link((click)='homeBase.openGitHub()') i.fab.fa-github span GitHub button.btn.btn-link((click)='homeBase.reportBug()') i.fas.fa-bug span(translate) Report a problem .form-control-static.selectable.no-drag( translate='Version: {version}', [translateParams]='{ version: this.homeBase.appVersion }' ) ================================================ FILE: tabby-core/src/components/startPage.component.scss ================================================ :host { display: flex; flex-direction: column; flex: auto; overflow-y: auto; } :host > div { flex: none; margin: auto; width: 300px; max-width: 100vw; display: flex; flex-direction: column; } .tabby-title { margin: 0 0 60px; } footer { flex: none; padding: 20px 30px; background: rgba(0,0,0,.5); } .list-group-item ::ng-deep svg { width: 16px; height: 16px; margin-right: 10px; } ================================================ FILE: tabby-core/src/components/startPage.component.ts ================================================ import { Component } from '@angular/core' import { DomSanitizer } from '@angular/platform-browser' import { HomeBaseService } from '../services/homeBase.service' import { CommandService } from '../services/commands.service' import { Command, CommandLocation } from '../api/commands' /** @hidden */ @Component({ selector: 'start-page', templateUrl: './startPage.component.pug', styleUrls: ['./startPage.component.scss'], }) export class StartPageComponent { version: string commands: Command[] = [] constructor ( private domSanitizer: DomSanitizer, public homeBase: HomeBaseService, commands: CommandService, ) { commands.getCommands({}).then(c => { this.commands = c.filter(x => x.locations?.includes(CommandLocation.StartPage)) }) } sanitizeIcon (icon?: string): any { return this.domSanitizer.bypassSecurityTrustHtml(icon ?? '') } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types buttonsTrackBy (_, btn: Command): any { return btn.label + btn.icon } } ================================================ FILE: tabby-core/src/components/tabBody.component.scss ================================================ :host { display: flex; flex: auto; position: relative; overflow: hidden; >* { flex: auto; } } ================================================ FILE: tabby-core/src/components/tabBody.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, Input, ViewChild, HostBinding, ViewContainerRef, OnChanges } from '@angular/core' import { BaseTabComponent } from '../components/baseTab.component' /** @hidden */ @Component({ selector: 'tab-body', template: ` `, styleUrls: [ './tabBody.component.scss', './tabBody.deep.component.css', ], }) export class TabBodyComponent implements OnChanges { @Input() @HostBinding('class.active') active: boolean @Input() tab: BaseTabComponent @ViewChild('placeholder', { read: ViewContainerRef }) placeholder?: ViewContainerRef ngOnChanges (changes) { if (changes.tab) { this.placeholder?.detach() setImmediate(() => { this.placeholder?.insert(this.tab.hostView) }) } } detach () { this.placeholder?.detach() } ngOnDestroy () { this.placeholder?.detach() } } ================================================ FILE: tabby-core/src/components/tabBody.deep.component.css ================================================ :host /deep/ .ps-content { flex: auto; display: flex; } ================================================ FILE: tabby-core/src/components/tabHeader.component.pug ================================================ .colorbar([style.background-color]='tab.color', *ngIf='tab.color != null') .progressbar([style.width]='progress + "%"', *ngIf='progress != null') .activity-indicator(*ngIf='tab.activity$|async') .current-tab-indicator .index(*ngIf='!config.store.terminal.hideTabIndex && hostApp.platform === Platform.macOS', cdkDragHandle) {{index + 1}} .index(*ngIf='!config.store.terminal.hideTabIndex && hostApp.platform !== Platform.macOS') {{index + 1}} profile-icon( *ngIf='config.store.terminal.showTabProfileIcon && tab.icon', [icon]='tab.icon', [color]='tab.color ?? undefined' ) .name( [class.no-hover]='config.store.terminal.hideCloseButton && config.store.terminal.hideTabOptionsButton' cdkDrag, cdkDragRootElement='tab-header', [cdkDragData]='tab', (cdkDragStarted)='onTabDragStart(tab)', (cdkDragEnded)='onTabDragEnd()', ) {{tab.customTitle || tab.title}} .buttons button(*ngIf='!config.store.terminal.hideTabOptionsButton',(click)='onContextMenu($event)') !{require('../icons/tab-options.svg')} button(*ngIf='!config.store.terminal.hideCloseButton',(click)='app.closeTab(tab, true)') × ng-content ================================================ FILE: tabby-core/src/components/tabHeader.component.scss ================================================ $tabs-height: 38px; :host { position: relative; cursor: pointer; box-sizing: border-box; > * { cursor: pointer; } flex: 1000 1 200px; width: 200px; // flex-basis and width are also set through animation on AppRoot padding: 0 10px; display: flex; flex-direction: row; min-width: 0; overflow: hidden; &.flex-width { flex: 1000 1 auto; width: auto; } &.vertical { flex: none; height: $tabs-height; } .index { flex: none; font-weight: bold; -webkit-app-region: no-drag; cursor: -webkit-grab; width: calc(22px * var(--spaciness)); border-radius: 10px; text-align: center; transition: 0.25s all; align-self: center; margin-top: 1px; } profile-icon { font-size: 13px; margin: 1px 4px 0 0; } .name { flex: auto; margin-top: 1px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; min-width: 0; align-self: center; } .index + .name { margin-left: 10px; } .buttons { display: flex; position: absolute; align-items: center; height: 100%; top: 2px; right: 3px; opacity: 0; button { display: flex; align-items: center; flex: none; justify-content: center; background: transparent; -webkit-app-region: no-drag; $button-size: 26px; width: $button-size; height: $button-size; border-radius: $button-size / 6; line-height: $button-size; align-self: center; text-align: center; font-size: 20px; &:focus { outline: 0; } } } &:hover .name:not(.no-hover) { -webkit-mask-image: linear-gradient(black 0 0), linear-gradient(to left, transparent 0%, transparent 50%, black 100%); -webkit-mask-size: calc(100% - 80px) auto, 80px auto; -webkit-mask-repeat: no-repeat; -webkit-mask-position: left, right; } &:hover .buttons { transition: 0.25s opacity; opacity: 1; } &.drag-region { -webkit-app-region: drag; } &.fully-draggable { cursor: -webkit-grab; } .progressbar { position: absolute; left: 0; top: 0; height: 3px; z-index: 1; transition: 0.25s width; } .colorbar { position: absolute; left: 0; bottom: 0; height: 3px; width: 100%; z-index: 1; } .activity-indicator, .current-tab-indicator { position: absolute; height: 2px; } &.active .activity-indicator { display: none; } .activity-indicator { bottom: 4px; left: 10px; right: 10px; } &.active .current-tab-indicator { display: block; } .current-tab-indicator { display: none; top: 0; left: 0; right: 0; } } ================================================ FILE: tabby-core/src/components/tabHeader.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, Input, Optional, Inject, HostBinding, HostListener, NgZone } from '@angular/core' import { auditTime } from 'rxjs' import { TabContextMenuItemProvider } from '../api/tabContextMenuProvider' import { BaseTabComponent } from './baseTab.component' import { SplitTabComponent } from './splitTab.component' import { HotkeysService } from '../services/hotkeys.service' import { AppService } from '../services/app.service' import { HostAppService, Platform } from '../api/hostApp' import { ConfigService } from '../services/config.service' import { BaseComponent } from './base.component' import { MenuItemOptions } from '../api/menu' import { PlatformService } from '../api/platform' /** @hidden */ @Component({ selector: 'tab-header', templateUrl: './tabHeader.component.pug', styleUrls: ['./tabHeader.component.scss'], }) export class TabHeaderComponent extends BaseComponent { @Input() index: number @Input() @HostBinding('class.active') active: boolean @Input() tab: BaseTabComponent @Input() progress: number|null Platform = Platform constructor ( public app: AppService, public config: ConfigService, public hostApp: HostAppService, private hotkeys: HotkeysService, private platform: PlatformService, private zone: NgZone, @Optional() @Inject(TabContextMenuItemProvider) protected contextMenuProviders: TabContextMenuItemProvider[], ) { super() this.subscribeUntilDestroyed(this.hotkeys.hotkey$, (hotkey) => { if (this.app.activeTab === this.tab) { if (hotkey === 'rename-tab') { this.app.renameTab(this.tab) } } }) this.contextMenuProviders.sort((a, b) => a.weight - b.weight) } ngOnInit () { this.subscribeUntilDestroyed(this.tab.progress$.pipe( auditTime(300), ), progress => { this.zone.run(() => { this.progress = progress }) }) } async buildContextMenu (): Promise { let items: MenuItemOptions[] = [] // Top-level tab menu for (const section of await Promise.all(this.contextMenuProviders.map(x => x.getItems(this.tab, true)))) { items.push({ type: 'separator' }) items = items.concat(section) } if (this.tab instanceof SplitTabComponent) { const tab = this.tab.getFocusedTab() if (tab) { for (let section of await Promise.all(this.contextMenuProviders.map(x => x.getItems(tab, true)))) { // eslint-disable-next-line @typescript-eslint/no-loop-func section = section.filter(item => !items.some(ex => ex.label === item.label)) if (section.length) { items.push({ type: 'separator' }) items = items.concat(section) } } } } return items.slice(1) } onTabDragStart (tab: BaseTabComponent) { this.app.emitTabDragStarted(tab) } onTabDragEnd () { setTimeout(() => { this.app.emitTabDragEnded() this.app.emitTabsChanged() }) } @HostBinding('class.flex-width') get isFlexWidthEnabled (): boolean { return this.config.store.appearance.flexTabs } @HostListener('dblclick', ['$event']) onDoubleClick ($event: MouseEvent): void { this.app.renameTab(this.tab) $event.stopPropagation() } @HostListener('mousedown', ['$event']) async onMouseDown ($event: MouseEvent) { if ($event.which === 2) { $event.preventDefault() } } @HostListener('mouseup', ['$event']) async onMouseUp ($event: MouseEvent) { if ($event.which === 2) { this.app.closeTab(this.tab, true) } } @HostListener('contextmenu', ['$event']) async onContextMenu ($event: MouseEvent) { $event.preventDefault() this.platform.popupContextMenu(await this.buildContextMenu(), $event) } } ================================================ FILE: tabby-core/src/components/titleBar.component.pug ================================================ .title((dblclick)='hostWindow.toggleMaximize()') Tabby window-controls(*ngIf="!hideControls") ================================================ FILE: tabby-core/src/components/titleBar.component.scss ================================================ $titlebar-height: 30px; :host { flex: 0 0 $titlebar-height; display: flex; .title { flex: auto; padding-left: 15px; line-height: $titlebar-height; -webkit-app-region: drag; } &.inset { flex-basis: 36px; .title { padding-left: 80px; line-height: 36px; } window-controls { display: none; } } } ================================================ FILE: tabby-core/src/components/titleBar.component.ts ================================================ import { Component, Input } from '@angular/core' import { HostWindowService } from '../api' /** @hidden */ @Component({ selector: 'title-bar', templateUrl: './titleBar.component.pug', styleUrls: ['./titleBar.component.scss'], }) export class TitleBarComponent { @Input() hideControls: boolean constructor (public hostWindow: HostWindowService) { } } ================================================ FILE: tabby-core/src/components/toggle.component.scss ================================================ :host { flex: none; $toggle-size: 18px; $height: 30px; $padding: 2px; display: inline-flex; border-radius: 3px; line-height: $height; height: $height; transition: 0.25s opacity; align-items: center; padding-right: 10px; padding-left: 10px; margin-left: -10px; .form-check { margin: 0; } &.disabled { opacity: 0.5; } * { cursor: pointer; } label { display: none; } } ================================================ FILE: tabby-core/src/components/toggle.component.ts ================================================ import { Component } from '@angular/core' import { NG_VALUE_ACCESSOR } from '@angular/forms' import { CheckboxComponent } from './checkbox.component' /** @hidden */ @Component({ selector: 'toggle', template: `
`, styleUrls: ['./toggle.component.scss'], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: ToggleComponent, multi: true }, ], }) export class ToggleComponent extends CheckboxComponent { } ================================================ FILE: tabby-core/src/components/transfersMenu.component.pug ================================================ .d-flex.align-items-center .dropdown-header(translate) File transfers button.btn.btn-link.ms-auto((click)='removeAll(); $event.stopPropagation()') !{require('../icons/times.svg')} .transfer(*ngFor='let transfer of transfers', (click)='showTransfer(transfer)') .icon(*ngIf='isDownload(transfer)') !{require('../icons/download.svg')} .icon(*ngIf='!isDownload(transfer)') !{require('../icons/upload.svg')} .main label.no-wrap([ngbTooltip]='transfer.getName()') | {{transfer.getName()}} span.ms-2.text-muted(*ngIf='transfer.getStatus()') ({{transfer.getStatus()}}) ngb-progressbar([type]='transfer.isComplete() ? "success" : transfer.isCancelled() ? "danger" : "info"', [value]='getProgress(transfer)') .metadata .size {{transfer.getSize()|filesize}} .speed(*ngIf='transfer.getSpeed()') {{transfer.getSpeed()|filesize}}/s button.btn.btn-link( *ngIf='!transfer.isComplete()', (click)='removeTransfer(transfer); $event.stopPropagation()' ) !{require('../icons/times.svg')} button.btn.btn-link( *ngIf='transfer.isComplete()', (click)='removeTransfer(transfer); $event.stopPropagation()' ) !{require('../icons/check.svg')} ================================================ FILE: tabby-core/src/components/transfersMenu.component.scss ================================================ :host { min-width: 300px; max-height: 80vh; overflow-y: auto; } .transfer { display: flex; align-items: center; padding: 5px 0 5px 25px; width: 100%; .icon { padding: 4px 7px; width: 36px; height: 32px; background: rgba(0,0,0,.25); margin-right: 12px; } .main { display: flex; flex-direction: column; min-width: 0; margin-right: auto; margin-bottom: 3px; width: 100%; label { margin: 0; max-width: 100%; } } .metadata { font-size: 10px; opacity: .5; display: flex; align-items: center; .speed { margin-left: auto; } } > i { margin-right: 10px; } } button { flex: none; } svg { height: 14px; } ================================================ FILE: tabby-core/src/components/transfersMenu.component.ts ================================================ import { Component, Input, Output, EventEmitter } from '@angular/core' import { TranslateService } from '@ngx-translate/core' import { FileDownload, FileTransfer, PlatformService } from '../api/platform' /** @hidden */ @Component({ selector: 'transfers-menu', templateUrl: './transfersMenu.component.pug', styleUrls: ['./transfersMenu.component.scss'], }) export class TransfersMenuComponent { @Input() transfers: FileTransfer[] @Output() transfersChange = new EventEmitter() constructor ( private platform: PlatformService, private translate: TranslateService, ) { } isDownload (transfer: FileTransfer): boolean { return transfer instanceof FileDownload } getProgress (transfer: FileTransfer): number { return Math.round(100 * transfer.getCompletedBytes() / transfer.getSize()) } showTransfer (transfer: FileTransfer): void { const fp = transfer['filePath'] if (fp) { this.platform.showItemInFolder(fp) } } removeTransfer (transfer: FileTransfer): void { if (!transfer.isComplete()) { transfer.cancel() } this.transfers = this.transfers.filter(x => x !== transfer) this.transfersChange.emit(this.transfers) } async removeAll (): Promise { if (this.transfers.some(x => !x.isComplete())) { if ((await this.platform.showMessageBox({ type: 'warning', message: this.translate.instant('There are active file transfers'), buttons: [ this.translate.instant('Abort all'), this.translate.instant('Do not abort'), ], defaultId: 1, cancelId: 1, })).response === 1) { return } } for (const t of this.transfers) { this.removeTransfer(t) } } } ================================================ FILE: tabby-core/src/components/unlockVaultModal.component.pug ================================================ .modal-body .d-flex.align-items-center.mb-3 h3.m-0(translate) Vault is locked .ms-auto(ngbDropdown, placement='bottom-right') button.btn.btn-link(ngbDropdownToggle, (click)='$event.stopPropagation()') span( *ngIf='rememberFor', translate='Remember for {time}', [translateParams]='{time: getRememberForDisplay(rememberFor)}' ) span(*ngIf='!rememberFor', translate) Do not remember div(ngbDropdownMenu) button.dropdown-item( (click)='rememberFor = 0', translate ) Do not remember button.dropdown-item( *ngFor='let x of rememberOptions', (click)='rememberFor = x', ) {{getRememberForDisplay(x)}} .input-group input.form-control.form-control-lg( type='password', autofocus, [(ngModel)]='passphrase', #input, placeholder='Master passphrase', (keyup.enter)='ok()', (keyup.esc)='cancel()', ) button.btn.btn-secondary((click)='ok()', *ngIf='passphrase') i.fas.fa-check ================================================ FILE: tabby-core/src/components/unlockVaultModal.component.ts ================================================ import { Component, ViewChild, ElementRef } from '@angular/core' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' /** @hidden */ @Component({ templateUrl: './unlockVaultModal.component.pug', }) export class UnlockVaultModalComponent { passphrase: string rememberFor = 1 rememberOptions = [1, 5, 15, 60, 1440, 10080] @ViewChild('input') input: ElementRef constructor ( private modalInstance: NgbActiveModal, ) { } ngOnInit (): void { this.rememberFor = parseInt(window.localStorage.vaultRememberPassphraseFor ?? 0) setTimeout(() => { this.input.nativeElement.focus() }) } ok (): void { window.localStorage.vaultRememberPassphraseFor = this.rememberFor this.modalInstance.close({ passphrase: this.passphrase, rememberFor: this.rememberFor, }) } cancel (): void { this.modalInstance.close(null) } getRememberForDisplay (rememberOption: number): string { if (rememberOption >= 1440) { return `${Math.round(rememberOption/1440*10)/10} day` } else if (rememberOption >= 60) { return `${Math.round(rememberOption/60*10)/10} hour` } else { return `${rememberOption} min` } } } ================================================ FILE: tabby-core/src/components/welcomeTab.component.pug ================================================ .container.mt-3.mb-3 .mb-3 .tabby-logo h1.tabby-title Tabby sup α .text-center.mb-3(translate) Thank you for downloading Tabby! .form-line .header .title(translate) Language select.form-control([(ngModel)]='config.store.language', (ngModelChange)='config.save()') option([ngValue]='null', translate) Automatic option( [value]='lang.code', *ngFor='let lang of allLanguages' ) {{lang.name}} .form-line .header .title(translate) Switch color scheme .btn-group(role='group') input.btn-check( type='radio', name='colorSchemeMode', [(ngModel)]='config.store.appearance.colorSchemeMode', (ngModelChange)='config.save()', id='colorSchemeModeAuto', [value]='"auto"' ) label.btn.btn-secondary( for='colorSchemeModeAuto' ) span(translate) From system input.btn-check( type='radio', name='colorSchemeMode', [(ngModel)]='config.store.appearance.colorSchemeMode', (ngModelChange)='config.save()', id='colorSchemeModeDark', [value]='"dark"' ) label.btn.btn-secondary( for='colorSchemeModeDark' ) span(translate) Always dark input.btn-check( type='radio', name='colorSchemeMode', [(ngModel)]='config.store.appearance.colorSchemeMode', (ngModelChange)='config.save()', id='colorSchemeModeLight', [value]='"light"' ) label.btn.btn-secondary( for='colorSchemeModeLight' ) span(translate) Always light .form-line .header .title(translate) Enable analytics .description(translate) Help track the number of Tabby installs across the world! toggle([(ngModel)]='config.store.enableAnalytics') .form-line .header .title(translate) Enable global hotkey (Ctrl-Space) .description(translate) Toggles the Tabby window visibility toggle([(ngModel)]='enableGlobalHotkey') .text-center.mt-5 button.btn.btn-primary((click)='closeAndDisable()', translate) Close and never show again ================================================ FILE: tabby-core/src/components/welcomeTab.component.scss ================================================ :host { display: flex; flex-direction: column; margin: auto; flex: auto; max-height: 100%; overflow-y: auto; } .tabby-logo { width: 60px; height: 60px; } ================================================ FILE: tabby-core/src/components/welcomeTab.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, Injector } from '@angular/core' import { TranslateService } from '@ngx-translate/core' import { BaseTabComponent } from './baseTab.component' import { ConfigService } from '../services/config.service' import { LocaleService } from '../services/locale.service' /** @hidden */ @Component({ selector: 'welcome-page', templateUrl: './welcomeTab.component.pug', styleUrls: ['./welcomeTab.component.scss'], }) export class WelcomeTabComponent extends BaseTabComponent { enableGlobalHotkey = true allLanguages = LocaleService.allLanguages constructor ( public config: ConfigService, public locale: LocaleService, translate: TranslateService, injector: Injector, ) { super(injector) this.setTitle(translate.instant('Welcome')) } async closeAndDisable () { this.config.store.enableWelcomeTab = false this.config.store.pluginBlacklist = [] if (!this.enableGlobalHotkey) { this.config.store.hotkeys['toggle-window'] = [] } await this.config.save() this.destroy() } } ================================================ FILE: tabby-core/src/components/windowControls.component.pug ================================================ button.btn.btn-dark( (click)='hostWindow.minimize()', ) svg(version='1.1', width='10', height='10') path(d='M 0,5 10,5 10,6 0,6 Z') button.btn.btn-dark((click)='hostWindow.toggleMaximize()', *ngIf='!hostWindow.isMaximized()') svg(version='1.1', width='10', height='10') path(d='M 0,0 0,10 10,10 10,0 Z M 1,1 9,1 9,9 1,9 Z') button.btn.btn-dark((click)='hostWindow.toggleMaximize()', *ngIf='hostWindow.isMaximized()') svg(version='1.1', width='10', height='10', viewBox='0 0 512 512') path(d="M464 0H144c-26.5 0-48 21.5-48 48v48H48c-26.5 0-48 21.5-48 48v320c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h48c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM32 144c0-8.8 7.2-16 16-16h320c8.8 0 16 7.2 16 16v320c0 8.8-7.2 16-16 16H48c-8.8 0-16-7.2-16-16v-80zm448 224c0 8.8-7.2 16-16 16h-48V144c0-26.5-21.5-48-48-48H128V48c0-8.8 7.2-16 16-16h320c8.8 0 16 7.2 16 16v320z") button.btn.btn-danger( (click)='closeWindow()' ) svg(version='1.1', width='10', height='10') path(d='M 0,0 0,0.7 4.3,5 0,9.3 0,10 0.7,10 5,5.7 9.3,10 10,10 10,9.3 5.7,5 10,0.7 10,0 9.3,0 5,4.3 0.7,0 Z') ================================================ FILE: tabby-core/src/components/windowControls.component.scss ================================================ :host { display: flex; } button { flex: none; border: none; box-shadow: none; border-radius: 0; font-size: 8px; width: 40px; padding: 0; line-height: 0; text-align: center; align-items: center; justify-content: center; &:not(:hover):not(:active) { background: transparent; } &:focus { box-shadow: none; } svg { width: 10px; height: 10px; } } ================================================ FILE: tabby-core/src/components/windowControls.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component } from '@angular/core' import { HostWindowService } from '../api/hostWindow' import { AppService } from '../services/app.service' /** @hidden */ @Component({ selector: 'window-controls', templateUrl: './windowControls.component.pug', styleUrls: ['./windowControls.component.scss'], }) export class WindowControlsComponent { constructor (public hostWindow: HostWindowService, public app: AppService) { } async closeWindow () { this.app.closeWindow() } } ================================================ FILE: tabby-core/src/config.ts ================================================ import { ConfigProvider } from './api/configProvider' import { Platform } from './api/hostApp' /** @hidden */ export class CoreConfigProvider extends ConfigProvider { platformDefaults = { [Platform.macOS]: require('./configDefaults.macos.yaml').default, [Platform.Windows]: require('./configDefaults.windows.yaml').default, [Platform.Linux]: require('./configDefaults.linux.yaml').default, [Platform.Web]: require('./configDefaults.web.yaml').default, } defaults = require('./configDefaults.yaml').default } ================================================ FILE: tabby-core/src/configDefaults.linux.yaml ================================================ hotkeys: toggle-fullscreen: - 'F11' close-tab: - 'Ctrl-Shift-W' reopen-tab: - 'Ctrl-Shift-Z' toggle-last-tab: [] rename-tab: - 'Ctrl-Shift-R' next-tab: - 'Ctrl-Shift-Right' - 'Ctrl-Tab' previous-tab: - 'Ctrl-Shift-Left' - 'Ctrl-Shift-Tab' move-tab-left: - 'Ctrl-Shift-PageUp' move-tab-right: - 'Ctrl-Shift-PageDown' rearrange-panes: - 'Ctrl-Shift' duplicate-tab: [] restart-tab: [] reconnect-tab: [] disconnect-tab: [] explode-tab: - 'Ctrl-Shift-.' combine-tabs: - 'Ctrl-Shift-,' tab-1: - 'Alt-1' tab-2: - 'Alt-2' tab-3: - 'Alt-3' tab-4: - 'Alt-4' tab-5: - 'Alt-5' tab-6: - 'Alt-6' tab-7: - 'Alt-7' tab-8: - 'Alt-8' tab-9: - 'Alt-9' tab-10: - 'Alt-0' tab-11: [] tab-12: [] tab-13: [] tab-14: [] tab-15: [] tab-16: [] tab-17: [] tab-18: [] tab-19: [] tab-20: [] split-right: - 'Ctrl-Shift-S' split-bottom: - 'Ctrl-Shift-D' split-left: [] split-top: [] pane-nav-right: - 'Ctrl-Alt-Right' pane-nav-down: - 'Ctrl-Alt-Down' pane-nav-up: - 'Ctrl-Alt-Up' pane-nav-left: - 'Ctrl-Alt-Left' pane-nav-previous: - 'Ctrl-Alt-[' pane-nav-next: - 'Ctrl-Alt-]' pane-nav-1: [] pane-nav-2: [] pane-nav-3: [] pane-nav-4: [] pane-nav-5: [] pane-nav-6: [] pane-nav-7: [] pane-nav-8: [] pane-nav-9: [] pane-maximize: - 'Ctrl-Alt-Enter' pane-increase-vertical: [] pane-decrease-vertical: [] pane-increase-horizontal: [] pane-decrease-horizontal: [] close-pane: [] switch-profile: - 'Ctrl-Alt-T' profile-selector: - 'Ctrl-Shift-E' command-selector: - 'Ctrl-Shift-P' ================================================ FILE: tabby-core/src/configDefaults.macos.yaml ================================================ hotkeys: toggle-fullscreen: - 'Ctrl+⌘+F' close-tab: - '⌘-W' reopen-tab: - '⌘-Shift-T' toggle-last-tab: [] rename-tab: - '⌘-R' next-tab: - 'Ctrl-Tab' previous-tab: - 'Ctrl-Shift-Tab' move-tab-left: - '⌘-Shift-Left' move-tab-right: - '⌘-Shift-Right' rearrange-panes: - 'Ctrl-Shift' tab-1: - '⌘-1' tab-2: - '⌘-2' tab-3: - '⌘-3' tab-4: - '⌘-4' tab-5: - '⌘-5' tab-6: - '⌘-6' tab-7: - '⌘-7' tab-8: - '⌘-8' tab-9: - '⌘-9' tab-10: [] duplicate-tab: [] restart-tab: [] reconnect-tab: [] disconnect-tab: [] explode-tab: - '⌘-Shift-.' combine-tabs: - '⌘-Shift-,' tab-11: [] tab-12: [] tab-13: [] tab-14: [] tab-15: [] tab-16: [] tab-17: [] tab-18: [] tab-19: [] tab-20: [] split-right: - '⌘-Shift-D' split-bottom: - '⌘-D' split-left: [] split-top: [] pane-nav-right: - '⌘-⌥-Right' pane-nav-down: - '⌘-⌥-Down' pane-nav-up: - '⌘-⌥-Up' pane-nav-left: - '⌘-⌥-Left' pane-nav-previous: - '⌘-⌥-[' pane-nav-next: - '⌘-⌥-]' pane-nav-1: [] pane-nav-2: [] pane-nav-3: [] pane-nav-4: [] pane-nav-5: [] pane-nav-6: [] pane-nav-7: [] pane-nav-8: [] pane-nav-9: [] pane-maximize: - '⌘-⌥-Enter' close-pane: - '⌘-Shift-W' pane-increase-vertical: [] pane-decrease-vertical: [] pane-increase-horizontal: [] pane-decrease-horizontal: [] profile-selector: - '⌘-E' switch-profile: - '⌘-Shift-E' command-selector: - '⌘-Shift-P' ================================================ FILE: tabby-core/src/configDefaults.web.yaml ================================================ pluginBlacklist: ['local'] terminal: recoverTabs: false enableAnalytics: false enableWelcomeTab: false enableAutomaticUpdates: false ================================================ FILE: tabby-core/src/configDefaults.windows.yaml ================================================ hotkeys: toggle-fullscreen: - 'F11' - 'Alt-Enter' close-tab: - 'Ctrl-Shift-W' reopen-tab: - 'Ctrl-Shift-Z' toggle-last-tab: [] rename-tab: - 'Ctrl-Shift-R' next-tab: - 'Ctrl-Shift-Right' - 'Ctrl-Tab' previous-tab: - 'Ctrl-Shift-Left' - 'Ctrl-Shift-Tab' move-tab-left: - 'Ctrl-Shift-PageUp' move-tab-right: - 'Ctrl-Shift-PageDown' rearrange-panes: - 'Ctrl-Shift' duplicate-tab: [] restart-tab: [] reconnect-tab: [] disconnect-tab: [] explode-tab: - 'Ctrl-Shift-.' combine-tabs: - 'Ctrl-Shift-,' tab-1: - 'Alt-1' tab-2: - 'Alt-2' tab-3: - 'Alt-3' tab-4: - 'Alt-4' tab-5: - 'Alt-5' tab-6: - 'Alt-6' tab-7: - 'Alt-7' tab-8: - 'Alt-8' tab-9: - 'Alt-9' tab-10: - 'Alt-0' tab-11: [] tab-12: [] tab-13: [] tab-14: [] tab-15: [] tab-16: [] tab-17: [] tab-18: [] tab-19: [] tab-20: [] split-right: - 'Ctrl-Shift-S' split-bottom: - 'Ctrl-Shift-D' split-left: [] split-top: [] pane-nav-right: - 'Ctrl-Alt-Right' pane-nav-down: - 'Ctrl-Alt-Down' pane-nav-up: - 'Ctrl-Alt-Up' pane-nav-left: - 'Ctrl-Alt-Left' pane-nav-previous: - 'Ctrl-Alt-[' pane-nav-next: - 'Ctrl-Alt-]' pane-nav-1: [] pane-nav-2: [] pane-nav-3: [] pane-nav-4: [] pane-nav-5: [] pane-nav-6: [] pane-nav-7: [] pane-nav-8: [] pane-nav-9: [] pane-maximize: - 'Ctrl-Alt-Enter' close-pane: [] pane-increase-vertical: [] pane-decrease-vertical: [] pane-increase-horizontal: [] pane-decrease-horizontal: [] switch-profile: - 'Ctrl-Alt-T' profile-selector: - 'Ctrl-Shift-E' command-selector: - 'Ctrl-Shift-P' terminal: identification: wt ================================================ FILE: tabby-core/src/configDefaults.yaml ================================================ accessibility: animations: true appearance: dock: off dockScreen: current dockFill: 0.5 dockSpace: 1 dockHideOnBlur: false dockAlwaysOnTop: true flexTabs: false tabsLocation: top tabsInFullscreen: false cycleTabs: true theme: Follow the color scheme frame: thin css: '/* * { color: blue !important; } */' opacity: 1.0 vibrancy: false vibrancyType: 'blur' lastTabClosesWindow: false spaciness: 1 colorSchemeMode: 'dark' terminal: showBuiltinProfiles: true showRecentProfiles: 3 paneResizeStep: 0.1 focusFollowsMouse: false identification: null hotkeys: profile: __nonStructural: true profile-selectors: __nonStructural: true group-selectors: __nonStructural: true profiles: [] groups: [] profileDefaults: __nonStructural: true ssh: disableDynamicTitle: true recoverTabs: true enableAnalytics: true enableWelcomeTab: true electronFlags: - ['force_discrete_gpu', '0'] enableAutomaticUpdates: true hideTray: false version: 1 vault: null encrypted: false enableExperimentalFeatures: false pluginBlacklist: [] commandBlacklist: [] providerBlacklist: [] profileBlacklist: [] hacks: disableGPU: false disableVibrancyWhileDragging: false enableFluentBackground: false language: null defaultQuickConnectProvider: "ssh" ================================================ FILE: tabby-core/src/directives/alwaysVisibleTypeahead.directive.ts ================================================ import { Directive, ElementRef, AfterViewInit } from '@angular/core' /** @hidden */ @Directive({ selector: '[alwaysVisibleTypeahead]', }) export class AlwaysVisibleTypeaheadDirective implements AfterViewInit { constructor (private el: ElementRef) { } ngAfterViewInit (): void { this.el.nativeElement.addEventListener('focus', e => { e.stopPropagation() setTimeout(() => { const inputEvent: Event = new Event('input') e.target.dispatchEvent(inputEvent) }, 0) }) } } ================================================ FILE: tabby-core/src/directives/autofocus.directive.ts ================================================ import { Directive, AfterViewInit, ElementRef } from '@angular/core' /** @hidden */ @Directive({ selector: '[autofocus]', }) export class AutofocusDirective implements AfterViewInit { constructor (private el: ElementRef) { } ngAfterViewInit (): void { this.el.nativeElement.blur() setTimeout(() => { this.el.nativeElement.focus() }) } } ================================================ FILE: tabby-core/src/directives/cdkAutoDropGroup.directive.ts ================================================ import { Directive, Input, OnInit } from '@angular/core' import { CdkDropList } from '@angular/cdk/drag-drop' class FakeDropGroup { _items: Set = new Set() } /** @hidden */ @Directive({ selector: '[cdkAutoDropGroup]', }) export class CdkAutoDropGroup implements OnInit { static groups: Record = {} @Input('cdkAutoDropGroup') groupName: string constructor ( private cdkDropList: CdkDropList, ) { } ngOnInit (): void { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition CdkAutoDropGroup.groups[this.groupName] ??= new FakeDropGroup() CdkAutoDropGroup.groups[this.groupName]._items.add(this.cdkDropList) this.cdkDropList['_group'] = CdkAutoDropGroup.groups[this.groupName] } } ================================================ FILE: tabby-core/src/directives/dropZone.directive.pug ================================================ i.fas.fa-upload ================================================ FILE: tabby-core/src/directives/dropZone.directive.scss ================================================ .drop-zone-hint { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, .5); pointer-events: none; z-index: 1; display: flex; transition: .25s opacity ease-out; opacity: 0; &.visible { opacity: 1; } i { font-size: 48px; align-self: center; margin: auto; text-align: center; } } ================================================ FILE: tabby-core/src/directives/dropZone.directive.ts ================================================ import { Directive, Output, ElementRef, EventEmitter, AfterViewInit } from '@angular/core' import { DirectoryUpload, PlatformService } from '../api/platform' import './dropZone.directive.scss' /** @hidden */ @Directive({ selector: '[dropZone]', }) export class DropZoneDirective implements AfterViewInit { @Output() transfer = new EventEmitter() private dropHint?: HTMLElement constructor ( private el: ElementRef, private platform: PlatformService, ) { } ngAfterViewInit (): void { this.el.nativeElement.addEventListener('dragover', () => { if (!this.dropHint) { this.dropHint = document.createElement('div') this.dropHint.className = 'drop-zone-hint' this.dropHint.innerHTML = require('./dropZone.directive.pug') this.el.nativeElement.appendChild(this.dropHint) setTimeout(() => { this.dropHint!.classList.add('visible') }) } }) this.el.nativeElement.addEventListener('drop', async (event: DragEvent) => { this.removeHint() this.transfer.emit(await this.platform.startUploadFromDragEvent(event, true)) }) this.el.nativeElement.addEventListener('dragleave', () => { this.removeHint() }) } private removeHint () { const element = this.dropHint delete this.dropHint element?.classList.remove('visible') setTimeout(() => { element?.remove() }, 500) } } ================================================ FILE: tabby-core/src/directives/fastHtmlBind.directive.ts ================================================ import { Directive, Input, ElementRef, OnChanges } from '@angular/core' import { PlatformService } from '../api/platform' /** @hidden */ @Directive({ selector: '[fastHtmlBind]', }) export class FastHtmlBindDirective implements OnChanges { @Input() fastHtmlBind?: string constructor ( private el: ElementRef, private platform: PlatformService, ) { } ngOnChanges (): void { this.el.nativeElement.innerHTML = this.fastHtmlBind ?? '' for (const link of this.el.nativeElement.querySelectorAll('a')) { link.addEventListener('click', event => { event.preventDefault() this.platform.openExternal(link.href) }) } } } ================================================ FILE: tabby-core/src/hotkeys.ts ================================================ import { Injectable } from '@angular/core' import { TranslateService } from '@ngx-translate/core' import { ProfilesService } from './services/profiles.service' import { HotkeyDescription, HotkeyProvider } from './api/hotkeyProvider' /** @hidden */ @Injectable() export class AppHotkeyProvider extends HotkeyProvider { hotkeys: HotkeyDescription[] = [ { id: 'command-selector', name: this.translate.instant('Show command selector'), }, { id: 'profile-selector', name: this.translate.instant('Show profile selector'), }, { id: 'toggle-fullscreen', name: this.translate.instant('Toggle fullscreen mode'), }, { id: 'rename-tab', name: this.translate.instant('Rename tab'), }, { id: 'close-tab', name: this.translate.instant('Close tab'), }, { id: 'reopen-tab', name: this.translate.instant('Reopen last tab'), }, { id: 'toggle-last-tab', name: this.translate.instant('Toggle last tab'), }, { id: 'next-tab', name: this.translate.instant('Next tab'), }, { id: 'previous-tab', name: this.translate.instant('Previous tab'), }, { id: 'move-tab-left', name: this.translate.instant('Move tab to the left'), }, { id: 'move-tab-right', name: this.translate.instant('Move tab to the right'), }, { id: 'rearrange-panes', name: this.translate.instant('Show pane labels (for rearranging)'), }, { id: 'duplicate-tab', name: this.translate.instant('Duplicate tab'), }, { id: 'restart-tab', name: this.translate.instant('Restart tab'), }, { id: 'explode-tab', name: this.translate.instant('Turn current tab\'s panes into separate tabs'), }, { id: 'combine-tabs', name: this.translate.instant('Combine all tabs into the current tab'), }, { id: 'tab-1', name: this.translate.instant('Tab {number}', { number: 1 }), }, { id: 'tab-2', name: this.translate.instant('Tab {number}', { number: 2 }), }, { id: 'tab-3', name: this.translate.instant('Tab {number}', { number: 3 }), }, { id: 'tab-4', name: this.translate.instant('Tab {number}', { number: 4 }), }, { id: 'tab-5', name: this.translate.instant('Tab {number}', { number: 5 }), }, { id: 'tab-6', name: this.translate.instant('Tab {number}', { number: 6 }), }, { id: 'tab-7', name: this.translate.instant('Tab {number}', { number: 7 }), }, { id: 'tab-8', name: this.translate.instant('Tab {number}', { number: 8 }), }, { id: 'tab-9', name: this.translate.instant('Tab {number}', { number: 9 }), }, { id: 'tab-10', name: this.translate.instant('Tab {number}', { number: 10 }), }, { id: 'tab-11', name: this.translate.instant('Tab {number}', { number: 11 }), }, { id: 'tab-12', name: this.translate.instant('Tab {number}', { number: 12 }), }, { id: 'tab-13', name: this.translate.instant('Tab {number}', { number: 13 }), }, { id: 'tab-14', name: this.translate.instant('Tab {number}', { number: 14 }), }, { id: 'tab-15', name: this.translate.instant('Tab {number}', { number: 15 }), }, { id: 'tab-16', name: this.translate.instant('Tab {number}', { number: 16 }), }, { id: 'tab-17', name: this.translate.instant('Tab {number}', { number: 17 }), }, { id: 'tab-18', name: this.translate.instant('Tab {number}', { number: 18 }), }, { id: 'tab-19', name: this.translate.instant('Tab {number}', { number: 19 }), }, { id: 'tab-20', name: this.translate.instant('Tab {number}', { number: 20 }), }, { id: 'split-right', name: this.translate.instant('Split to the right'), }, { id: 'split-bottom', name: this.translate.instant('Split to the bottom'), }, { id: 'split-left', name: this.translate.instant('Split to the left'), }, { id: 'split-top', name: this.translate.instant('Split to the top'), }, { id: 'pane-maximize', name: this.translate.instant('Maximize the active pane'), }, { id: 'pane-nav-up', name: this.translate.instant('Focus the pane above'), }, { id: 'pane-nav-down', name: this.translate.instant('Focus the pane below'), }, { id: 'pane-nav-left', name: this.translate.instant('Focus the pane on the left'), }, { id: 'pane-nav-right', name: this.translate.instant('Focus the pane on the right'), }, { id: 'pane-nav-previous', name: this.translate.instant('Focus previous pane'), }, { id: 'pane-nav-next', name: this.translate.instant('Focus next pane'), }, { id: 'pane-nav-1', name: this.translate.instant('Focus pane {number}', { number: 1 }), }, { id: 'pane-nav-2', name: this.translate.instant('Focus pane {number}', { number: 2 }), }, { id: 'pane-nav-3', name: this.translate.instant('Focus pane {number}', { number: 3 }), }, { id: 'pane-nav-4', name: this.translate.instant('Focus pane {number}', { number: 4 }), }, { id: 'pane-nav-5', name: this.translate.instant('Focus pane {number}', { number: 5 }), }, { id: 'pane-nav-6', name: this.translate.instant('Focus pane {number}', { number: 6 }), }, { id: 'pane-nav-7', name: this.translate.instant('Focus pane {number}', { number: 7 }), }, { id: 'pane-nav-8', name: this.translate.instant('Focus pane {number}', { number: 8 }), }, { id: 'pane-nav-9', name: this.translate.instant('Focus pane {number}', { number: 9 }), }, { id: 'switch-profile', name: this.translate.instant('Switch profile in the active pane'), }, { id: 'close-pane', name: this.translate.instant('Close focused pane'), }, { id: 'pane-increase-vertical', name: this.translate.instant('Increase vertical split size'), }, { id: 'pane-decrease-vertical', name: this.translate.instant('Decrease vertical split size'), }, { id: 'pane-increase-horizontal', name: this.translate.instant('Increase horizontal split size'), }, { id: 'pane-decrease-horizontal', name: this.translate.instant('Decrease horizontal split size'), }, ] constructor ( private profilesService: ProfilesService, private translate: TranslateService, ) { super() } async provide (): Promise { const profiles = await this.profilesService.getProfiles() const groups = await this.profilesService.getProfileGroups() return [ ...this.hotkeys, ...profiles.map(profile => ({ id: `profile.${ProfilesService.getProfileHotkeyName(profile)}`, name: this.translate.instant('New tab: {profile}', { profile: profile.name }), })), ...this.profilesService.getProviders().map(provider => ({ id: `profile-selectors.${provider.id}`, name: this.translate.instant('Show {type} profile selector', { type: provider.name }), })), ...groups.map(group => ({ id: `group-selectors.${group.id}`, name: this.translate.instant('Show profile selector for group {name}', { name: group.name }), })), ] } } ================================================ FILE: tabby-core/src/icons.json ================================================ {"0":["s"],"1":["s"],"2":["s"],"3":["s"],"4":["s"],"5":["s"],"6":["s"],"7":["s"],"8":["s"],"9":["s"],"42-group":["b"],"500px":["b"],"a":["s"],"accessible-icon":["b"],"accusoft":["b"],"address-book":["s","r"],"address-card":["s","r"],"adn":["b"],"adversal":["b"],"affiliatetheme":["b"],"airbnb":["b"],"algolia":["b"],"align-center":["s"],"align-justify":["s"],"align-left":["s"],"align-right":["s"],"alipay":["b"],"amazon":["b"],"amazon-pay":["b"],"amilia":["b"],"anchor":["s"],"anchor-circle-check":["s"],"anchor-circle-exclamation":["s"],"anchor-circle-xmark":["s"],"anchor-lock":["s"],"android":["b"],"angellist":["b"],"angle-down":["s"],"angle-left":["s"],"angle-right":["s"],"angle-up":["s"],"angles-down":["s"],"angles-left":["s"],"angles-right":["s"],"angles-up":["s"],"angrycreative":["b"],"angular":["b"],"ankh":["s"],"app-store":["b"],"app-store-ios":["b"],"apper":["b"],"apple":["b"],"apple-pay":["b"],"apple-whole":["s"],"archway":["s"],"arrow-down":["s"],"arrow-down-1-9":["s"],"arrow-down-9-1":["s"],"arrow-down-a-z":["s"],"arrow-down-long":["s"],"arrow-down-short-wide":["s"],"arrow-down-up-across-line":["s"],"arrow-down-up-lock":["s"],"arrow-down-wide-short":["s"],"arrow-down-z-a":["s"],"arrow-left":["s"],"arrow-left-long":["s"],"arrow-pointer":["s"],"arrow-right":["s"],"arrow-right-arrow-left":["s"],"arrow-right-from-bracket":["s"],"arrow-right-long":["s"],"arrow-right-to-bracket":["s"],"arrow-right-to-city":["s"],"arrow-rotate-left":["s"],"arrow-rotate-right":["s"],"arrow-trend-down":["s"],"arrow-trend-up":["s"],"arrow-turn-down":["s"],"arrow-turn-up":["s"],"arrow-up":["s"],"arrow-up-1-9":["s"],"arrow-up-9-1":["s"],"arrow-up-a-z":["s"],"arrow-up-from-bracket":["s"],"arrow-up-from-ground-water":["s"],"arrow-up-from-water-pump":["s"],"arrow-up-long":["s"],"arrow-up-right-dots":["s"],"arrow-up-right-from-square":["s"],"arrow-up-short-wide":["s"],"arrow-up-wide-short":["s"],"arrow-up-z-a":["s"],"arrows-down-to-line":["s"],"arrows-down-to-people":["s"],"arrows-left-right":["s"],"arrows-left-right-to-line":["s"],"arrows-rotate":["s"],"arrows-spin":["s"],"arrows-split-up-and-left":["s"],"arrows-to-circle":["s"],"arrows-to-dot":["s"],"arrows-to-eye":["s"],"arrows-turn-right":["s"],"arrows-turn-to-dots":["s"],"arrows-up-down":["s"],"arrows-up-down-left-right":["s"],"arrows-up-to-line":["s"],"artstation":["b"],"asterisk":["s"],"asymmetrik":["b"],"at":["s"],"atlassian":["b"],"atom":["s"],"audible":["b"],"audio-description":["s"],"austral-sign":["s"],"autoprefixer":["b"],"avianex":["b"],"aviato":["b"],"award":["s"],"aws":["b"],"b":["s"],"baby":["s"],"baby-carriage":["s"],"backward":["s"],"backward-fast":["s"],"backward-step":["s"],"bacon":["s"],"bacteria":["s"],"bacterium":["s"],"bag-shopping":["s"],"bahai":["s"],"baht-sign":["s"],"ban":["s"],"ban-smoking":["s"],"bandage":["s"],"bandcamp":["b"],"barcode":["s"],"bars":["s"],"bars-progress":["s"],"bars-staggered":["s"],"baseball":["s"],"baseball-bat-ball":["s"],"basket-shopping":["s"],"basketball":["s"],"bath":["s"],"battery-empty":["s"],"battery-full":["s"],"battery-half":["s"],"battery-quarter":["s"],"battery-three-quarters":["s"],"battle-net":["b"],"bed":["s"],"bed-pulse":["s"],"beer-mug-empty":["s"],"behance":["b"],"bell":["s","r"],"bell-concierge":["s"],"bell-slash":["s","r"],"bezier-curve":["s"],"bicycle":["s"],"bilibili":["b"],"bimobject":["b"],"binoculars":["s"],"biohazard":["s"],"bitbucket":["b"],"bitcoin":["b"],"bitcoin-sign":["s"],"bity":["b"],"black-tie":["b"],"blackberry":["b"],"blender":["s"],"blender-phone":["s"],"blog":["s"],"blogger":["b"],"blogger-b":["b"],"bluetooth":["b"],"bluetooth-b":["b"],"bold":["s"],"bolt":["s"],"bolt-lightning":["s"],"bomb":["s"],"bone":["s"],"bong":["s"],"book":["s"],"book-atlas":["s"],"book-bible":["s"],"book-bookmark":["s"],"book-journal-whills":["s"],"book-medical":["s"],"book-open":["s"],"book-open-reader":["s"],"book-quran":["s"],"book-skull":["s"],"book-tanakh":["s"],"bookmark":["s","r"],"bootstrap":["b"],"border-all":["s"],"border-none":["s"],"border-top-left":["s"],"bore-hole":["s"],"bots":["b"],"bottle-droplet":["s"],"bottle-water":["s"],"bowl-food":["s"],"bowl-rice":["s"],"bowling-ball":["s"],"box":["s"],"box-archive":["s"],"box-open":["s"],"box-tissue":["s"],"boxes-packing":["s"],"boxes-stacked":["s"],"braille":["s"],"brain":["s"],"brazilian-real-sign":["s"],"bread-slice":["s"],"bridge":["s"],"bridge-circle-check":["s"],"bridge-circle-exclamation":["s"],"bridge-circle-xmark":["s"],"bridge-lock":["s"],"bridge-water":["s"],"briefcase":["s"],"briefcase-medical":["s"],"broom":["s"],"broom-ball":["s"],"brush":["s"],"btc":["b"],"bucket":["s"],"buffer":["b"],"bug":["s"],"bug-slash":["s"],"bugs":["s"],"building":["s","r"],"building-circle-arrow-right":["s"],"building-circle-check":["s"],"building-circle-exclamation":["s"],"building-circle-xmark":["s"],"building-columns":["s"],"building-flag":["s"],"building-lock":["s"],"building-ngo":["s"],"building-shield":["s"],"building-un":["s"],"building-user":["s"],"building-wheat":["s"],"bullhorn":["s"],"bullseye":["s"],"burger":["s"],"buromobelexperte":["b"],"burst":["s"],"bus":["s"],"bus-simple":["s"],"business-time":["s"],"buy-n-large":["b"],"buysellads":["b"],"c":["s"],"cable-car":["s"],"cake-candles":["s"],"calculator":["s"],"calendar":["s","r"],"calendar-check":["s","r"],"calendar-day":["s"],"calendar-days":["s","r"],"calendar-minus":["s","r"],"calendar-plus":["s","r"],"calendar-week":["s"],"calendar-xmark":["s","r"],"camera":["s"],"camera-retro":["s"],"camera-rotate":["s"],"campground":["s"],"canadian-maple-leaf":["b"],"candy-cane":["s"],"cannabis":["s"],"capsules":["s"],"car":["s"],"car-battery":["s"],"car-burst":["s"],"car-on":["s"],"car-rear":["s"],"car-side":["s"],"car-tunnel":["s"],"caravan":["s"],"caret-down":["s"],"caret-left":["s"],"caret-right":["s"],"caret-up":["s"],"carrot":["s"],"cart-arrow-down":["s"],"cart-flatbed":["s"],"cart-flatbed-suitcase":["s"],"cart-plus":["s"],"cart-shopping":["s"],"cash-register":["s"],"cat":["s"],"cc-amazon-pay":["b"],"cc-amex":["b"],"cc-apple-pay":["b"],"cc-diners-club":["b"],"cc-discover":["b"],"cc-jcb":["b"],"cc-mastercard":["b"],"cc-paypal":["b"],"cc-stripe":["b"],"cc-visa":["b"],"cedi-sign":["s"],"cent-sign":["s"],"centercode":["b"],"centos":["b"],"certificate":["s"],"chair":["s"],"chalkboard":["s"],"chalkboard-user":["s"],"champagne-glasses":["s"],"charging-station":["s"],"chart-area":["s"],"chart-bar":["s","r"],"chart-column":["s"],"chart-gantt":["s"],"chart-line":["s"],"chart-pie":["s"],"chart-simple":["s"],"check":["s"],"check-double":["s"],"check-to-slot":["s"],"cheese":["s"],"chess":["s"],"chess-bishop":["s","r"],"chess-board":["s"],"chess-king":["s","r"],"chess-knight":["s","r"],"chess-pawn":["s","r"],"chess-queen":["s","r"],"chess-rook":["s","r"],"chevron-down":["s"],"chevron-left":["s"],"chevron-right":["s"],"chevron-up":["s"],"child":["s"],"child-dress":["s"],"child-reaching":["s"],"child-rifle":["s"],"children":["s"],"chrome":["b"],"chromecast":["b"],"church":["s"],"circle":["s","r"],"circle-arrow-down":["s"],"circle-arrow-left":["s"],"circle-arrow-right":["s"],"circle-arrow-up":["s"],"circle-check":["s","r"],"circle-chevron-down":["s"],"circle-chevron-left":["s"],"circle-chevron-right":["s"],"circle-chevron-up":["s"],"circle-dollar-to-slot":["s"],"circle-dot":["s","r"],"circle-down":["s","r"],"circle-exclamation":["s"],"circle-h":["s"],"circle-half-stroke":["s"],"circle-info":["s"],"circle-left":["s","r"],"circle-minus":["s"],"circle-nodes":["s"],"circle-notch":["s"],"circle-pause":["s","r"],"circle-play":["s","r"],"circle-plus":["s"],"circle-question":["s","r"],"circle-radiation":["s"],"circle-right":["s","r"],"circle-stop":["s","r"],"circle-up":["s","r"],"circle-user":["s","r"],"circle-xmark":["s","r"],"city":["s"],"clapperboard":["s"],"clipboard":["s","r"],"clipboard-check":["s"],"clipboard-list":["s"],"clipboard-question":["s"],"clipboard-user":["s"],"clock":["s","r"],"clock-rotate-left":["s"],"clone":["s","r"],"closed-captioning":["s","r"],"cloud":["s"],"cloud-arrow-down":["s"],"cloud-arrow-up":["s"],"cloud-bolt":["s"],"cloud-meatball":["s"],"cloud-moon":["s"],"cloud-moon-rain":["s"],"cloud-rain":["s"],"cloud-showers-heavy":["s"],"cloud-showers-water":["s"],"cloud-sun":["s"],"cloud-sun-rain":["s"],"cloudflare":["b"],"cloudscale":["b"],"cloudsmith":["b"],"cloudversify":["b"],"clover":["s"],"cmplid":["b"],"code":["s"],"code-branch":["s"],"code-commit":["s"],"code-compare":["s"],"code-fork":["s"],"code-merge":["s"],"code-pull-request":["s"],"codepen":["b"],"codiepie":["b"],"coins":["s"],"colon-sign":["s"],"comment":["s","r"],"comment-dollar":["s"],"comment-dots":["s","r"],"comment-medical":["s"],"comment-slash":["s"],"comment-sms":["s"],"comments":["s","r"],"comments-dollar":["s"],"compact-disc":["s"],"compass":["s","r"],"compass-drafting":["s"],"compress":["s"],"computer":["s"],"computer-mouse":["s"],"confluence":["b"],"connectdevelop":["b"],"contao":["b"],"cookie":["s"],"cookie-bite":["s"],"copy":["s","r"],"copyright":["s","r"],"cotton-bureau":["b"],"couch":["s"],"cow":["s"],"cpanel":["b"],"creative-commons":["b"],"creative-commons-by":["b"],"creative-commons-nc":["b"],"creative-commons-nc-eu":["b"],"creative-commons-nc-jp":["b"],"creative-commons-nd":["b"],"creative-commons-pd":["b"],"creative-commons-pd-alt":["b"],"creative-commons-remix":["b"],"creative-commons-sa":["b"],"creative-commons-sampling":["b"],"creative-commons-sampling-plus":["b"],"creative-commons-share":["b"],"creative-commons-zero":["b"],"credit-card":["s","r"],"critical-role":["b"],"crop":["s"],"crop-simple":["s"],"cross":["s"],"crosshairs":["s"],"crow":["s"],"crown":["s"],"crutch":["s"],"cruzeiro-sign":["s"],"css3":["b"],"css3-alt":["b"],"cube":["s"],"cubes":["s"],"cubes-stacked":["s"],"cuttlefish":["b"],"d":["s"],"d-and-d":["b"],"d-and-d-beyond":["b"],"dailymotion":["b"],"dashcube":["b"],"database":["s"],"deezer":["b"],"delete-left":["s"],"delicious":["b"],"democrat":["s"],"deploydog":["b"],"deskpro":["b"],"desktop":["s"],"dev":["b"],"deviantart":["b"],"dharmachakra":["s"],"dhl":["b"],"diagram-next":["s"],"diagram-predecessor":["s"],"diagram-project":["s"],"diagram-successor":["s"],"diamond":["s"],"diamond-turn-right":["s"],"diaspora":["b"],"dice":["s"],"dice-d20":["s"],"dice-d6":["s"],"dice-five":["s"],"dice-four":["s"],"dice-one":["s"],"dice-six":["s"],"dice-three":["s"],"dice-two":["s"],"digg":["b"],"digital-ocean":["b"],"discord":["b"],"discourse":["b"],"disease":["s"],"display":["s"],"divide":["s"],"dna":["s"],"dochub":["b"],"docker":["b"],"dog":["s"],"dollar-sign":["s"],"dolly":["s"],"dong-sign":["s"],"door-closed":["s"],"door-open":["s"],"dove":["s"],"down-left-and-up-right-to-center":["s"],"down-long":["s"],"download":["s"],"draft2digital":["b"],"dragon":["s"],"draw-polygon":["s"],"dribbble":["b"],"dropbox":["b"],"droplet":["s"],"droplet-slash":["s"],"drum":["s"],"drum-steelpan":["s"],"drumstick-bite":["s"],"drupal":["b"],"dumbbell":["s"],"dumpster":["s"],"dumpster-fire":["s"],"dungeon":["s"],"dyalog":["b"],"e":["s"],"ear-deaf":["s"],"ear-listen":["s"],"earlybirds":["b"],"earth-africa":["s"],"earth-americas":["s"],"earth-asia":["s"],"earth-europe":["s"],"earth-oceania":["s"],"ebay":["b"],"edge":["b"],"edge-legacy":["b"],"egg":["s"],"eject":["s"],"elementor":["b"],"elevator":["s"],"ellipsis":["s"],"ellipsis-vertical":["s"],"ello":["b"],"ember":["b"],"empire":["b"],"envelope":["s","r"],"envelope-circle-check":["s"],"envelope-open":["s","r"],"envelope-open-text":["s"],"envelopes-bulk":["s"],"envira":["b"],"equals":["s"],"eraser":["s"],"erlang":["b"],"ethereum":["b"],"ethernet":["s"],"etsy":["b"],"euro-sign":["s"],"evernote":["b"],"exclamation":["s"],"expand":["s"],"expeditedssl":["b"],"explosion":["s"],"eye":["s","r"],"eye-dropper":["s"],"eye-low-vision":["s"],"eye-slash":["s","r"],"f":["s"],"face-angry":["s","r"],"face-dizzy":["s","r"],"face-flushed":["s","r"],"face-frown":["s","r"],"face-frown-open":["s","r"],"face-grimace":["s","r"],"face-grin":["s","r"],"face-grin-beam":["s","r"],"face-grin-beam-sweat":["s","r"],"face-grin-hearts":["s","r"],"face-grin-squint":["s","r"],"face-grin-squint-tears":["s","r"],"face-grin-stars":["s","r"],"face-grin-tears":["s","r"],"face-grin-tongue":["s","r"],"face-grin-tongue-squint":["s","r"],"face-grin-tongue-wink":["s","r"],"face-grin-wide":["s","r"],"face-grin-wink":["s","r"],"face-kiss":["s","r"],"face-kiss-beam":["s","r"],"face-kiss-wink-heart":["s","r"],"face-laugh":["s","r"],"face-laugh-beam":["s","r"],"face-laugh-squint":["s","r"],"face-laugh-wink":["s","r"],"face-meh":["s","r"],"face-meh-blank":["s","r"],"face-rolling-eyes":["s","r"],"face-sad-cry":["s","r"],"face-sad-tear":["s","r"],"face-smile":["s","r"],"face-smile-beam":["s","r"],"face-smile-wink":["s","r"],"face-surprise":["s","r"],"face-tired":["s","r"],"facebook":["b"],"facebook-f":["b"],"facebook-messenger":["b"],"fan":["s"],"fantasy-flight-games":["b"],"faucet":["s"],"faucet-drip":["s"],"fax":["s"],"feather":["s"],"feather-pointed":["s"],"fedex":["b"],"fedora":["b"],"ferry":["s"],"figma":["b"],"file":["s","r"],"file-arrow-down":["s"],"file-arrow-up":["s"],"file-audio":["s","r"],"file-circle-check":["s"],"file-circle-exclamation":["s"],"file-circle-minus":["s"],"file-circle-plus":["s"],"file-circle-question":["s"],"file-circle-xmark":["s"],"file-code":["s","r"],"file-contract":["s"],"file-csv":["s"],"file-excel":["s","r"],"file-export":["s"],"file-image":["s","r"],"file-import":["s"],"file-invoice":["s"],"file-invoice-dollar":["s"],"file-lines":["s","r"],"file-medical":["s"],"file-pdf":["s","r"],"file-pen":["s"],"file-powerpoint":["s","r"],"file-prescription":["s"],"file-shield":["s"],"file-signature":["s"],"file-video":["s","r"],"file-waveform":["s"],"file-word":["s","r"],"file-zipper":["s","r"],"fill":["s"],"fill-drip":["s"],"film":["s"],"filter":["s"],"filter-circle-dollar":["s"],"filter-circle-xmark":["s"],"fingerprint":["s"],"fire":["s"],"fire-burner":["s"],"fire-extinguisher":["s"],"fire-flame-curved":["s"],"fire-flame-simple":["s"],"firefox":["b"],"firefox-browser":["b"],"first-order":["b"],"first-order-alt":["b"],"firstdraft":["b"],"fish":["s"],"fish-fins":["s"],"flag":["s","r"],"flag-checkered":["s"],"flag-usa":["s"],"flask":["s"],"flask-vial":["s"],"flickr":["b"],"flipboard":["b"],"floppy-disk":["s","r"],"florin-sign":["s"],"fly":["b"],"folder":["s","r"],"folder-closed":["s","r"],"folder-minus":["s"],"folder-open":["s","r"],"folder-plus":["s"],"folder-tree":["s"],"font":["s"],"font-awesome":["s","r","b"],"fonticons":["b"],"fonticons-fi":["b"],"football":["s"],"fort-awesome":["b"],"fort-awesome-alt":["b"],"forumbee":["b"],"forward":["s"],"forward-fast":["s"],"forward-step":["s"],"foursquare":["b"],"franc-sign":["s"],"free-code-camp":["b"],"freebsd":["b"],"frog":["s"],"fulcrum":["b"],"futbol":["s","r"],"g":["s"],"galactic-republic":["b"],"galactic-senate":["b"],"gamepad":["s"],"gas-pump":["s"],"gauge":["s"],"gauge-high":["s"],"gauge-simple":["s"],"gauge-simple-high":["s"],"gavel":["s"],"gear":["s"],"gears":["s"],"gem":["s","r"],"genderless":["s"],"get-pocket":["b"],"gg":["b"],"gg-circle":["b"],"ghost":["s"],"gift":["s"],"gifts":["s"],"git":["b"],"git-alt":["b"],"github":["b"],"github-alt":["b"],"gitkraken":["b"],"gitlab":["b"],"gitter":["b"],"glass-water":["s"],"glass-water-droplet":["s"],"glasses":["s"],"glide":["b"],"glide-g":["b"],"globe":["s"],"gofore":["b"],"golang":["b"],"golf-ball-tee":["s"],"goodreads":["b"],"goodreads-g":["b"],"google":["b"],"google-drive":["b"],"google-pay":["b"],"google-play":["b"],"google-plus":["b"],"google-plus-g":["b"],"google-wallet":["b"],"gopuram":["s"],"graduation-cap":["s"],"gratipay":["b"],"grav":["b"],"greater-than":["s"],"greater-than-equal":["s"],"grip":["s"],"grip-lines":["s"],"grip-lines-vertical":["s"],"grip-vertical":["s"],"gripfire":["b"],"group-arrows-rotate":["s"],"grunt":["b"],"guarani-sign":["s"],"guilded":["b"],"guitar":["s"],"gulp":["b"],"gun":["s"],"h":["s"],"hacker-news":["b"],"hackerrank":["b"],"hammer":["s"],"hamsa":["s"],"hand":["s","r"],"hand-back-fist":["s","r"],"hand-dots":["s"],"hand-fist":["s"],"hand-holding":["s"],"hand-holding-dollar":["s"],"hand-holding-droplet":["s"],"hand-holding-hand":["s"],"hand-holding-heart":["s"],"hand-holding-medical":["s"],"hand-lizard":["s","r"],"hand-middle-finger":["s"],"hand-peace":["s","r"],"hand-point-down":["s","r"],"hand-point-left":["s","r"],"hand-point-right":["s","r"],"hand-point-up":["s","r"],"hand-pointer":["s","r"],"hand-scissors":["s","r"],"hand-sparkles":["s"],"hand-spock":["s","r"],"handcuffs":["s"],"hands":["s"],"hands-asl-interpreting":["s"],"hands-bound":["s"],"hands-bubbles":["s"],"hands-clapping":["s"],"hands-holding":["s"],"hands-holding-child":["s"],"hands-holding-circle":["s"],"hands-praying":["s"],"handshake":["s","r"],"handshake-angle":["s"],"handshake-simple":["s"],"handshake-simple-slash":["s"],"handshake-slash":["s"],"hanukiah":["s"],"hard-drive":["s","r"],"hashnode":["b"],"hashtag":["s"],"hat-cowboy":["s"],"hat-cowboy-side":["s"],"hat-wizard":["s"],"head-side-cough":["s"],"head-side-cough-slash":["s"],"head-side-mask":["s"],"head-side-virus":["s"],"heading":["s"],"headphones":["s"],"headphones-simple":["s"],"headset":["s"],"heart":["s","r"],"heart-circle-bolt":["s"],"heart-circle-check":["s"],"heart-circle-exclamation":["s"],"heart-circle-minus":["s"],"heart-circle-plus":["s"],"heart-circle-xmark":["s"],"heart-crack":["s"],"heart-pulse":["s"],"helicopter":["s"],"helicopter-symbol":["s"],"helmet-safety":["s"],"helmet-un":["s"],"highlighter":["s"],"hill-avalanche":["s"],"hill-rockslide":["s"],"hippo":["s"],"hips":["b"],"hire-a-helper":["b"],"hive":["b"],"hockey-puck":["s"],"holly-berry":["s"],"hooli":["b"],"hornbill":["b"],"horse":["s"],"horse-head":["s"],"hospital":["s","r"],"hospital-user":["s"],"hot-tub-person":["s"],"hotdog":["s"],"hotel":["s"],"hotjar":["b"],"hourglass":["s","r"],"hourglass-end":["s"],"hourglass-half":["s","r"],"hourglass-start":["s"],"house":["s"],"house-chimney":["s"],"house-chimney-crack":["s"],"house-chimney-medical":["s"],"house-chimney-user":["s"],"house-chimney-window":["s"],"house-circle-check":["s"],"house-circle-exclamation":["s"],"house-circle-xmark":["s"],"house-crack":["s"],"house-fire":["s"],"house-flag":["s"],"house-flood-water":["s"],"house-flood-water-circle-arrow-right":["s"],"house-laptop":["s"],"house-lock":["s"],"house-medical":["s"],"house-medical-circle-check":["s"],"house-medical-circle-exclamation":["s"],"house-medical-circle-xmark":["s"],"house-medical-flag":["s"],"house-signal":["s"],"house-tsunami":["s"],"house-user":["s"],"houzz":["b"],"hryvnia-sign":["s"],"html5":["b"],"hubspot":["b"],"hurricane":["s"],"i":["s"],"i-cursor":["s"],"ice-cream":["s"],"icicles":["s"],"icons":["s"],"id-badge":["s","r"],"id-card":["s","r"],"id-card-clip":["s"],"ideal":["b"],"igloo":["s"],"image":["s","r"],"image-portrait":["s"],"images":["s","r"],"imdb":["b"],"inbox":["s"],"indent":["s"],"indian-rupee-sign":["s"],"industry":["s"],"infinity":["s"],"info":["s"],"instagram":["b"],"instalod":["b"],"intercom":["b"],"internet-explorer":["b"],"invision":["b"],"ioxhost":["b"],"italic":["s"],"itch-io":["b"],"itunes":["b"],"itunes-note":["b"],"j":["s"],"jar":["s"],"jar-wheat":["s"],"java":["b"],"jedi":["s"],"jedi-order":["b"],"jenkins":["b"],"jet-fighter":["s"],"jet-fighter-up":["s"],"jira":["b"],"joget":["b"],"joint":["s"],"joomla":["b"],"js":["b"],"jsfiddle":["b"],"jug-detergent":["s"],"k":["s"],"kaaba":["s"],"kaggle":["b"],"key":["s"],"keybase":["b"],"keyboard":["s","r"],"keycdn":["b"],"khanda":["s"],"kickstarter":["b"],"kickstarter-k":["b"],"kip-sign":["s"],"kit-medical":["s"],"kitchen-set":["s"],"kiwi-bird":["s"],"korvue":["b"],"l":["s"],"land-mine-on":["s"],"landmark":["s"],"landmark-dome":["s"],"landmark-flag":["s"],"language":["s"],"laptop":["s"],"laptop-code":["s"],"laptop-file":["s"],"laptop-medical":["s"],"laravel":["b"],"lari-sign":["s"],"lastfm":["b"],"layer-group":["s"],"leaf":["s"],"leanpub":["b"],"left-long":["s"],"left-right":["s"],"lemon":["s","r"],"less":["b"],"less-than":["s"],"less-than-equal":["s"],"life-ring":["s","r"],"lightbulb":["s","r"],"line":["b"],"lines-leaning":["s"],"link":["s"],"link-slash":["s"],"linkedin":["b"],"linkedin-in":["b"],"linode":["b"],"linux":["b"],"lira-sign":["s"],"list":["s"],"list-check":["s"],"list-ol":["s"],"list-ul":["s"],"litecoin-sign":["s"],"location-arrow":["s"],"location-crosshairs":["s"],"location-dot":["s"],"location-pin":["s"],"location-pin-lock":["s"],"lock":["s"],"lock-open":["s"],"locust":["s"],"lungs":["s"],"lungs-virus":["s"],"lyft":["b"],"m":["s"],"magento":["b"],"magnet":["s"],"magnifying-glass":["s"],"magnifying-glass-arrow-right":["s"],"magnifying-glass-chart":["s"],"magnifying-glass-dollar":["s"],"magnifying-glass-location":["s"],"magnifying-glass-minus":["s"],"magnifying-glass-plus":["s"],"mailchimp":["b"],"manat-sign":["s"],"mandalorian":["b"],"map":["s","r"],"map-location":["s"],"map-location-dot":["s"],"map-pin":["s"],"markdown":["b"],"marker":["s"],"mars":["s"],"mars-and-venus":["s"],"mars-and-venus-burst":["s"],"mars-double":["s"],"mars-stroke":["s"],"mars-stroke-right":["s"],"mars-stroke-up":["s"],"martini-glass":["s"],"martini-glass-citrus":["s"],"martini-glass-empty":["s"],"mask":["s"],"mask-face":["s"],"mask-ventilator":["s"],"masks-theater":["s"],"mastodon":["b"],"mattress-pillow":["s"],"maxcdn":["b"],"maximize":["s"],"mdb":["b"],"medal":["s"],"medapps":["b"],"medium":["b"],"medrt":["b"],"meetup":["b"],"megaport":["b"],"memory":["s"],"mendeley":["b"],"menorah":["s"],"mercury":["s"],"message":["s","r"],"meta":["b"],"meteor":["s"],"microblog":["b"],"microchip":["s"],"microphone":["s"],"microphone-lines":["s"],"microphone-lines-slash":["s"],"microphone-slash":["s"],"microscope":["s"],"microsoft":["b"],"mill-sign":["s"],"minimize":["s"],"minus":["s"],"mitten":["s"],"mix":["b"],"mixcloud":["b"],"mixer":["b"],"mizuni":["b"],"mobile":["s"],"mobile-button":["s"],"mobile-retro":["s"],"mobile-screen":["s"],"mobile-screen-button":["s"],"modx":["b"],"monero":["b"],"money-bill":["s"],"money-bill-1":["s","r"],"money-bill-1-wave":["s"],"money-bill-transfer":["s"],"money-bill-trend-up":["s"],"money-bill-wave":["s"],"money-bill-wheat":["s"],"money-bills":["s"],"money-check":["s"],"money-check-dollar":["s"],"monument":["s"],"moon":["s","r"],"mortar-pestle":["s"],"mosque":["s"],"mosquito":["s"],"mosquito-net":["s"],"motorcycle":["s"],"mound":["s"],"mountain":["s"],"mountain-city":["s"],"mountain-sun":["s"],"mug-hot":["s"],"mug-saucer":["s"],"music":["s"],"n":["s"],"naira-sign":["s"],"napster":["b"],"neos":["b"],"network-wired":["s"],"neuter":["s"],"newspaper":["s","r"],"nfc-directional":["b"],"nfc-symbol":["b"],"nimblr":["b"],"node":["b"],"node-js":["b"],"not-equal":["s"],"note-sticky":["s","r"],"notes-medical":["s"],"npm":["b"],"ns8":["b"],"nutritionix":["b"],"o":["s"],"object-group":["s","r"],"object-ungroup":["s","r"],"octopus-deploy":["b"],"odnoklassniki":["b"],"oil-can":["s"],"oil-well":["s"],"old-republic":["b"],"om":["s"],"opencart":["b"],"openid":["b"],"opera":["b"],"optin-monster":["b"],"orcid":["b"],"osi":["b"],"otter":["s"],"outdent":["s"],"p":["s"],"padlet":["b"],"page4":["b"],"pagelines":["b"],"pager":["s"],"paint-roller":["s"],"paintbrush":["s"],"palette":["s"],"palfed":["b"],"pallet":["s"],"panorama":["s"],"paper-plane":["s","r"],"paperclip":["s"],"parachute-box":["s"],"paragraph":["s"],"passport":["s"],"paste":["s","r"],"patreon":["b"],"pause":["s"],"paw":["s"],"paypal":["b"],"peace":["s"],"pen":["s"],"pen-clip":["s"],"pen-fancy":["s"],"pen-nib":["s"],"pen-ruler":["s"],"pen-to-square":["s","r"],"pencil":["s"],"people-arrows":["s"],"people-carry-box":["s"],"people-group":["s"],"people-line":["s"],"people-pulling":["s"],"people-robbery":["s"],"people-roof":["s"],"pepper-hot":["s"],"perbyte":["b"],"percent":["s"],"periscope":["b"],"person":["s"],"person-arrow-down-to-line":["s"],"person-arrow-up-from-line":["s"],"person-biking":["s"],"person-booth":["s"],"person-breastfeeding":["s"],"person-burst":["s"],"person-cane":["s"],"person-chalkboard":["s"],"person-circle-check":["s"],"person-circle-exclamation":["s"],"person-circle-minus":["s"],"person-circle-plus":["s"],"person-circle-question":["s"],"person-circle-xmark":["s"],"person-digging":["s"],"person-dots-from-line":["s"],"person-dress":["s"],"person-dress-burst":["s"],"person-drowning":["s"],"person-falling":["s"],"person-falling-burst":["s"],"person-half-dress":["s"],"person-harassing":["s"],"person-hiking":["s"],"person-military-pointing":["s"],"person-military-rifle":["s"],"person-military-to-person":["s"],"person-praying":["s"],"person-pregnant":["s"],"person-rays":["s"],"person-rifle":["s"],"person-running":["s"],"person-shelter":["s"],"person-skating":["s"],"person-skiing":["s"],"person-skiing-nordic":["s"],"person-snowboarding":["s"],"person-swimming":["s"],"person-through-window":["s"],"person-walking":["s"],"person-walking-arrow-loop-left":["s"],"person-walking-arrow-right":["s"],"person-walking-dashed-line-arrow-right":["s"],"person-walking-luggage":["s"],"person-walking-with-cane":["s"],"peseta-sign":["s"],"peso-sign":["s"],"phabricator":["b"],"phoenix-framework":["b"],"phoenix-squadron":["b"],"phone":["s"],"phone-flip":["s"],"phone-slash":["s"],"phone-volume":["s"],"photo-film":["s"],"php":["b"],"pied-piper":["b"],"pied-piper-alt":["b"],"pied-piper-hat":["b"],"pied-piper-pp":["b"],"piggy-bank":["s"],"pills":["s"],"pinterest":["b"],"pinterest-p":["b"],"pix":["b"],"pizza-slice":["s"],"place-of-worship":["s"],"plane":["s"],"plane-arrival":["s"],"plane-circle-check":["s"],"plane-circle-exclamation":["s"],"plane-circle-xmark":["s"],"plane-departure":["s"],"plane-lock":["s"],"plane-slash":["s"],"plane-up":["s"],"plant-wilt":["s"],"plate-wheat":["s"],"play":["s"],"playstation":["b"],"plug":["s"],"plug-circle-bolt":["s"],"plug-circle-check":["s"],"plug-circle-exclamation":["s"],"plug-circle-minus":["s"],"plug-circle-plus":["s"],"plug-circle-xmark":["s"],"plus":["s"],"plus-minus":["s"],"podcast":["s"],"poo":["s"],"poo-storm":["s"],"poop":["s"],"power-off":["s"],"prescription":["s"],"prescription-bottle":["s"],"prescription-bottle-medical":["s"],"print":["s"],"product-hunt":["b"],"pump-medical":["s"],"pump-soap":["s"],"pushed":["b"],"puzzle-piece":["s"],"python":["b"],"q":["s"],"qq":["b"],"qrcode":["s"],"question":["s"],"quinscape":["b"],"quora":["b"],"quote-left":["s"],"quote-right":["s"],"r":["s"],"r-project":["b"],"radiation":["s"],"radio":["s"],"rainbow":["s"],"ranking-star":["s"],"raspberry-pi":["b"],"ravelry":["b"],"react":["b"],"reacteurope":["b"],"readme":["b"],"rebel":["b"],"receipt":["s"],"record-vinyl":["s"],"rectangle-ad":["s"],"rectangle-list":["s","r"],"rectangle-xmark":["s","r"],"recycle":["s"],"red-river":["b"],"reddit":["b"],"reddit-alien":["b"],"redhat":["b"],"registered":["s","r"],"renren":["b"],"repeat":["s"],"reply":["s"],"reply-all":["s"],"replyd":["b"],"republican":["s"],"researchgate":["b"],"resolving":["b"],"restroom":["s"],"retweet":["s"],"rev":["b"],"ribbon":["s"],"right-from-bracket":["s"],"right-left":["s"],"right-long":["s"],"right-to-bracket":["s"],"ring":["s"],"road":["s"],"road-barrier":["s"],"road-bridge":["s"],"road-circle-check":["s"],"road-circle-exclamation":["s"],"road-circle-xmark":["s"],"road-lock":["s"],"road-spikes":["s"],"robot":["s"],"rocket":["s"],"rocketchat":["b"],"rockrms":["b"],"rotate":["s"],"rotate-left":["s"],"rotate-right":["s"],"route":["s"],"rss":["s"],"ruble-sign":["s"],"rug":["s"],"ruler":["s"],"ruler-combined":["s"],"ruler-horizontal":["s"],"ruler-vertical":["s"],"rupee-sign":["s"],"rupiah-sign":["s"],"rust":["b"],"s":["s"],"sack-dollar":["s"],"sack-xmark":["s"],"safari":["b"],"sailboat":["s"],"salesforce":["b"],"sass":["b"],"satellite":["s"],"satellite-dish":["s"],"scale-balanced":["s"],"scale-unbalanced":["s"],"scale-unbalanced-flip":["s"],"schlix":["b"],"school":["s"],"school-circle-check":["s"],"school-circle-exclamation":["s"],"school-circle-xmark":["s"],"school-flag":["s"],"school-lock":["s"],"scissors":["s"],"screenpal":["b"],"screwdriver":["s"],"screwdriver-wrench":["s"],"scribd":["b"],"scroll":["s"],"scroll-torah":["s"],"sd-card":["s"],"searchengin":["b"],"section":["s"],"seedling":["s"],"sellcast":["b"],"sellsy":["b"],"server":["s"],"servicestack":["b"],"shapes":["s"],"share":["s"],"share-from-square":["s","r"],"share-nodes":["s"],"sheet-plastic":["s"],"shekel-sign":["s"],"shield":["s"],"shield-cat":["s"],"shield-dog":["s"],"shield-halved":["s"],"shield-heart":["s"],"shield-virus":["s"],"ship":["s"],"shirt":["s"],"shirtsinbulk":["b"],"shoe-prints":["s"],"shop":["s"],"shop-lock":["s"],"shop-slash":["s"],"shopify":["b"],"shopware":["b"],"shower":["s"],"shrimp":["s"],"shuffle":["s"],"shuttle-space":["s"],"sign-hanging":["s"],"signal":["s"],"signature":["s"],"signs-post":["s"],"sim-card":["s"],"simplybuilt":["b"],"sink":["s"],"sistrix":["b"],"sitemap":["s"],"sith":["b"],"sitrox":["b"],"sketch":["b"],"skull":["s"],"skull-crossbones":["s"],"skyatlas":["b"],"skype":["b"],"slack":["b"],"slash":["s"],"sleigh":["s"],"sliders":["s"],"slideshare":["b"],"smog":["s"],"smoking":["s"],"snapchat":["b"],"snowflake":["s","r"],"snowman":["s"],"snowplow":["s"],"soap":["s"],"socks":["s"],"solar-panel":["s"],"sort":["s"],"sort-down":["s"],"sort-up":["s"],"soundcloud":["b"],"sourcetree":["b"],"spa":["s"],"space-awesome":["b"],"spaghetti-monster-flying":["s"],"speakap":["b"],"speaker-deck":["b"],"spell-check":["s"],"spider":["s"],"spinner":["s"],"splotch":["s"],"spoon":["s"],"spotify":["b"],"spray-can":["s"],"spray-can-sparkles":["s"],"square":["s","r"],"square-arrow-up-right":["s"],"square-behance":["b"],"square-caret-down":["s","r"],"square-caret-left":["s","r"],"square-caret-right":["s","r"],"square-caret-up":["s","r"],"square-check":["s","r"],"square-dribbble":["b"],"square-envelope":["s"],"square-facebook":["b"],"square-font-awesome":["b"],"square-font-awesome-stroke":["b"],"square-full":["s","r"],"square-git":["b"],"square-github":["b"],"square-gitlab":["b"],"square-google-plus":["b"],"square-h":["s"],"square-hacker-news":["b"],"square-instagram":["b"],"square-js":["b"],"square-lastfm":["b"],"square-minus":["s","r"],"square-nfi":["s"],"square-odnoklassniki":["b"],"square-parking":["s"],"square-pen":["s"],"square-person-confined":["s"],"square-phone":["s"],"square-phone-flip":["s"],"square-pied-piper":["b"],"square-pinterest":["b"],"square-plus":["s","r"],"square-poll-horizontal":["s"],"square-poll-vertical":["s"],"square-reddit":["b"],"square-root-variable":["s"],"square-rss":["s"],"square-share-nodes":["s"],"square-snapchat":["b"],"square-steam":["b"],"square-tumblr":["b"],"square-twitter":["b"],"square-up-right":["s"],"square-viadeo":["b"],"square-vimeo":["b"],"square-virus":["s"],"square-whatsapp":["b"],"square-xing":["b"],"square-xmark":["s"],"square-youtube":["b"],"squarespace":["b"],"stack-exchange":["b"],"stack-overflow":["b"],"stackpath":["b"],"staff-snake":["s"],"stairs":["s"],"stamp":["s"],"stapler":["s"],"star":["s","r"],"star-and-crescent":["s"],"star-half":["s","r"],"star-half-stroke":["s","r"],"star-of-david":["s"],"star-of-life":["s"],"staylinked":["b"],"steam":["b"],"steam-symbol":["b"],"sterling-sign":["s"],"stethoscope":["s"],"sticker-mule":["b"],"stop":["s"],"stopwatch":["s"],"stopwatch-20":["s"],"store":["s"],"store-slash":["s"],"strava":["b"],"street-view":["s"],"strikethrough":["s"],"stripe":["b"],"stripe-s":["b"],"stroopwafel":["s"],"studiovinari":["b"],"stumbleupon":["b"],"stumbleupon-circle":["b"],"subscript":["s"],"suitcase":["s"],"suitcase-medical":["s"],"suitcase-rolling":["s"],"sun":["s","r"],"sun-plant-wilt":["s"],"superpowers":["b"],"superscript":["s"],"supple":["b"],"suse":["b"],"swatchbook":["s"],"swift":["b"],"symfony":["b"],"synagogue":["s"],"syringe":["s"],"t":["s"],"table":["s"],"table-cells":["s"],"table-cells-large":["s"],"table-columns":["s"],"table-list":["s"],"table-tennis-paddle-ball":["s"],"tablet":["s"],"tablet-button":["s"],"tablet-screen-button":["s"],"tablets":["s"],"tachograph-digital":["s"],"tag":["s"],"tags":["s"],"tape":["s"],"tarp":["s"],"tarp-droplet":["s"],"taxi":["s"],"teamspeak":["b"],"teeth":["s"],"teeth-open":["s"],"telegram":["b"],"temperature-arrow-down":["s"],"temperature-arrow-up":["s"],"temperature-empty":["s"],"temperature-full":["s"],"temperature-half":["s"],"temperature-high":["s"],"temperature-low":["s"],"temperature-quarter":["s"],"temperature-three-quarters":["s"],"tencent-weibo":["b"],"tenge-sign":["s"],"tent":["s"],"tent-arrow-down-to-line":["s"],"tent-arrow-left-right":["s"],"tent-arrow-turn-left":["s"],"tent-arrows-down":["s"],"tents":["s"],"terminal":["s"],"text-height":["s"],"text-slash":["s"],"text-width":["s"],"the-red-yeti":["b"],"themeco":["b"],"themeisle":["b"],"thermometer":["s"],"think-peaks":["b"],"thumbs-down":["s","r"],"thumbs-up":["s","r"],"thumbtack":["s"],"ticket":["s"],"ticket-simple":["s"],"tiktok":["b"],"timeline":["s"],"toggle-off":["s"],"toggle-on":["s"],"toilet":["s"],"toilet-paper":["s"],"toilet-paper-slash":["s"],"toilet-portable":["s"],"toilets-portable":["s"],"toolbox":["s"],"tooth":["s"],"torii-gate":["s"],"tornado":["s"],"tower-broadcast":["s"],"tower-cell":["s"],"tower-observation":["s"],"tractor":["s"],"trade-federation":["b"],"trademark":["s"],"traffic-light":["s"],"trailer":["s"],"train":["s"],"train-subway":["s"],"train-tram":["s"],"transgender":["s"],"trash":["s"],"trash-arrow-up":["s"],"trash-can":["s","r"],"trash-can-arrow-up":["s"],"tree":["s"],"tree-city":["s"],"trello":["b"],"triangle-exclamation":["s"],"trophy":["s"],"trowel":["s"],"trowel-bricks":["s"],"truck":["s"],"truck-arrow-right":["s"],"truck-droplet":["s"],"truck-fast":["s"],"truck-field":["s"],"truck-field-un":["s"],"truck-front":["s"],"truck-medical":["s"],"truck-monster":["s"],"truck-moving":["s"],"truck-pickup":["s"],"truck-plane":["s"],"truck-ramp-box":["s"],"tty":["s"],"tumblr":["b"],"turkish-lira-sign":["s"],"turn-down":["s"],"turn-up":["s"],"tv":["s"],"twitch":["b"],"twitter":["b"],"typo3":["b"],"u":["s"],"uber":["b"],"ubuntu":["b"],"uikit":["b"],"umbraco":["b"],"umbrella":["s"],"umbrella-beach":["s"],"uncharted":["b"],"underline":["s"],"uniregistry":["b"],"unity":["b"],"universal-access":["s"],"unlock":["s"],"unlock-keyhole":["s"],"unsplash":["b"],"untappd":["b"],"up-down":["s"],"up-down-left-right":["s"],"up-long":["s"],"up-right-and-down-left-from-center":["s"],"up-right-from-square":["s"],"upload":["s"],"ups":["b"],"usb":["b"],"user":["s","r"],"user-astronaut":["s"],"user-check":["s"],"user-clock":["s"],"user-doctor":["s"],"user-gear":["s"],"user-graduate":["s"],"user-group":["s"],"user-injured":["s"],"user-large":["s"],"user-large-slash":["s"],"user-lock":["s"],"user-minus":["s"],"user-ninja":["s"],"user-nurse":["s"],"user-pen":["s"],"user-plus":["s"],"user-secret":["s"],"user-shield":["s"],"user-slash":["s"],"user-tag":["s"],"user-tie":["s"],"user-xmark":["s"],"users":["s"],"users-between-lines":["s"],"users-gear":["s"],"users-line":["s"],"users-rays":["s"],"users-rectangle":["s"],"users-slash":["s"],"users-viewfinder":["s"],"usps":["b"],"ussunnah":["b"],"utensils":["s"],"v":["s"],"vaadin":["b"],"van-shuttle":["s"],"vault":["s"],"vector-square":["s"],"venus":["s"],"venus-double":["s"],"venus-mars":["s"],"vest":["s"],"vest-patches":["s"],"viacoin":["b"],"viadeo":["b"],"vial":["s"],"vial-circle-check":["s"],"vial-virus":["s"],"vials":["s"],"viber":["b"],"video":["s"],"video-slash":["s"],"vihara":["s"],"vimeo":["b"],"vimeo-v":["b"],"vine":["b"],"virus":["s"],"virus-covid":["s"],"virus-covid-slash":["s"],"virus-slash":["s"],"viruses":["s"],"vk":["b"],"vnv":["b"],"voicemail":["s"],"volcano":["s"],"volleyball":["s"],"volume-high":["s"],"volume-low":["s"],"volume-off":["s"],"volume-xmark":["s"],"vr-cardboard":["s"],"vuejs":["b"],"w":["s"],"walkie-talkie":["s"],"wallet":["s"],"wand-magic":["s"],"wand-magic-sparkles":["s"],"wand-sparkles":["s"],"warehouse":["s"],"watchman-monitoring":["b"],"water":["s"],"water-ladder":["s"],"wave-square":["s"],"waze":["b"],"weebly":["b"],"weibo":["b"],"weight-hanging":["s"],"weight-scale":["s"],"weixin":["b"],"whatsapp":["b"],"wheat-awn":["s"],"wheat-awn-circle-exclamation":["s"],"wheelchair":["s"],"wheelchair-move":["s"],"whiskey-glass":["s"],"whmcs":["b"],"wifi":["s"],"wikipedia-w":["b"],"wind":["s"],"window-maximize":["s","r"],"window-minimize":["s","r"],"window-restore":["s","r"],"windows":["b"],"wine-bottle":["s"],"wine-glass":["s"],"wine-glass-empty":["s"],"wirsindhandwerk":["b"],"wix":["b"],"wizards-of-the-coast":["b"],"wodu":["b"],"wolf-pack-battalion":["b"],"won-sign":["s"],"wordpress":["b"],"wordpress-simple":["b"],"worm":["s"],"wpbeginner":["b"],"wpexplorer":["b"],"wpforms":["b"],"wpressr":["b"],"wrench":["s"],"x":["s"],"x-ray":["s"],"xbox":["b"],"xing":["b"],"xmark":["s"],"xmarks-lines":["s"],"y":["s"],"y-combinator":["b"],"yahoo":["b"],"yammer":["b"],"yandex":["b"],"yandex-international":["b"],"yarn":["b"],"yelp":["b"],"yen-sign":["s"],"yin-yang":["s"],"yoast":["b"],"youtube":["b"],"z":["s"],"zhihu":["b"]} ================================================ FILE: tabby-core/src/index.ts ================================================ import { NgModule, ModuleWithProviders, LOCALE_ID } from '@angular/core' import { BrowserAnimationsModule } from '@angular/platform-browser/animations' import { CommonModule } from '@angular/common' import { FormsModule } from '@angular/forms' import { NgbModule, NgbTooltipConfig } from '@ng-bootstrap/ng-bootstrap' import { NgxFilesizeModule } from 'ngx-filesize' import { DragDropModule } from '@angular/cdk/drag-drop' import { TranslateModule, TranslateCompiler, TranslateService, MissingTranslationHandler } from '@ngx-translate/core' import { TranslateMessageFormatCompiler, MESSAGE_FORMAT_CONFIG } from 'ngx-translate-messageformat-compiler' import '@angular/localize/init' import { AppRootComponent } from './components/appRoot.component' import { CheckboxComponent } from './components/checkbox.component' import { TabBodyComponent } from './components/tabBody.component' import { PromptModalComponent } from './components/promptModal.component' import { SafeModeModalComponent } from './components/safeModeModal.component' import { StartPageComponent } from './components/startPage.component' import { TabHeaderComponent } from './components/tabHeader.component' import { TitleBarComponent } from './components/titleBar.component' import { ToggleComponent } from './components/toggle.component' import { WindowControlsComponent } from './components/windowControls.component' import { RenameTabModalComponent } from './components/renameTabModal.component' import { SelectorModalComponent } from './components/selectorModal.component' import { SplitTabComponent, SplitTabRecoveryProvider } from './components/splitTab.component' import { SplitTabSpannerComponent } from './components/splitTabSpanner.component' import { SplitTabDropZoneComponent } from './components/splitTabDropZone.component' import { SplitTabPaneLabelComponent } from './components/splitTabPaneLabel.component' import { UnlockVaultModalComponent } from './components/unlockVaultModal.component' import { WelcomeTabComponent } from './components/welcomeTab.component' import { TransfersMenuComponent } from './components/transfersMenu.component' import { ProfileIconComponent } from './components/profileIcon.component' import { AutofocusDirective } from './directives/autofocus.directive' import { AlwaysVisibleTypeaheadDirective } from './directives/alwaysVisibleTypeahead.directive' import { FastHtmlBindDirective } from './directives/fastHtmlBind.directive' import { DropZoneDirective } from './directives/dropZone.directive' import { CdkAutoDropGroup } from './directives/cdkAutoDropGroup.directive' import { Theme, CLIHandler, TabContextMenuItemProvider, TabRecoveryProvider, HotkeyProvider, ConfigProvider, PlatformService, FileProvider, ProfilesService, ProfileProvider, QuickConnectProfileProvider, SelectorOption, Profile, SelectorService, CommandProvider, PartialProfileGroup, ProfileGroup } from './api' import { AppService } from './services/app.service' import { ConfigService } from './services/config.service' import { VaultFileProvider } from './services/vault.service' import { HotkeysService } from './services/hotkeys.service' import { CustomMissingTranslationHandler, LocaleService, TabbyFormatedDatePipe } from './services/locale.service' import { CommandService } from './services/commands.service' import { NewTheme } from './theme' import { CoreConfigProvider } from './config' import { AppHotkeyProvider } from './hotkeys' import { TaskCompletionContextMenu, CommonOptionsContextMenu, TabManagementContextMenu, ProfilesContextMenu } from './tabContextMenu' import { LastCLIHandler, ProfileCLIHandler } from './cli' import { SplitLayoutProfilesService } from './profiles' import { CoreCommandProvider } from './commands' export function TranslateMessageFormatCompilerFactory (): TranslateMessageFormatCompiler { return new TranslateMessageFormatCompiler() } const PROVIDERS = [ { provide: HotkeyProvider, useClass: AppHotkeyProvider, multi: true }, { provide: Theme, useClass: NewTheme, multi: true }, { provide: ConfigProvider, useClass: CoreConfigProvider, multi: true }, { provide: TabContextMenuItemProvider, useClass: CommonOptionsContextMenu, multi: true }, { provide: TabContextMenuItemProvider, useClass: TabManagementContextMenu, multi: true }, { provide: TabContextMenuItemProvider, useClass: TaskCompletionContextMenu, multi: true }, { provide: TabContextMenuItemProvider, useClass: ProfilesContextMenu, multi: true }, { provide: TabRecoveryProvider, useExisting: SplitTabRecoveryProvider, multi: true }, { provide: CLIHandler, useClass: ProfileCLIHandler, multi: true }, { provide: CLIHandler, useClass: LastCLIHandler, multi: true }, { provide: FileProvider, useClass: VaultFileProvider, multi: true }, { provide: ProfileProvider, useExisting: SplitLayoutProfilesService, multi: true }, { provide: CommandProvider, useExisting: CoreCommandProvider, multi: true }, { provide: LOCALE_ID, deps: [LocaleService], useFactory: locale => locale.getLocale(), }, { provide: MESSAGE_FORMAT_CONFIG, useValue: LocaleService.allLanguages.map(x => x.code), }, ] /** @hidden */ @NgModule({ imports: [ BrowserAnimationsModule, CommonModule, FormsModule, NgbModule, NgxFilesizeModule, DragDropModule, TranslateModule.forRoot({ defaultLanguage: 'en', compiler: { provide: TranslateCompiler, useFactory: TranslateMessageFormatCompilerFactory, }, missingTranslationHandler: { provide: MissingTranslationHandler, useClass: CustomMissingTranslationHandler, }, }), ], declarations: [ AppRootComponent, CheckboxComponent, PromptModalComponent, StartPageComponent, TabBodyComponent, TabHeaderComponent, TitleBarComponent, ToggleComponent, WindowControlsComponent, RenameTabModalComponent, SafeModeModalComponent, AutofocusDirective, FastHtmlBindDirective, AlwaysVisibleTypeaheadDirective, SelectorModalComponent, SplitTabComponent, SplitTabSpannerComponent, SplitTabDropZoneComponent, SplitTabPaneLabelComponent, UnlockVaultModalComponent, WelcomeTabComponent, TransfersMenuComponent, DropZoneDirective, CdkAutoDropGroup, ProfileIconComponent, TabbyFormatedDatePipe, ], exports: [ AppRootComponent, CheckboxComponent, ToggleComponent, PromptModalComponent, AutofocusDirective, DropZoneDirective, FastHtmlBindDirective, AlwaysVisibleTypeaheadDirective, DragDropModule, TranslateModule, CdkAutoDropGroup, ProfileIconComponent, TabbyFormatedDatePipe, ], }) export default class AppModule { // eslint-disable-line @typescript-eslint/no-extraneous-class constructor ( app: AppService, config: ConfigService, platform: PlatformService, hotkeys: HotkeysService, commands: CommandService, ngbTooltipConfig: NgbTooltipConfig, public locale: LocaleService, private translate: TranslateService, private profilesService: ProfilesService, private selector: SelectorService, ) { app.ready$.subscribe(() => { config.ready$.toPromise().then(() => { if (config.store.enableWelcomeTab) { app.openNewTabRaw({ type: WelcomeTabComponent }) } }) }) platform.setErrorHandler(err => { console.error('Unhandled exception:', err) }) hotkeys.hotkey$.subscribe(async hotkey => { if (hotkey.startsWith('profile.')) { const id = hotkey.substring(hotkey.indexOf('.') + 1) const profiles = await profilesService.getProfiles() const profile = profiles.find(x => ProfilesService.getProfileHotkeyName(x) === id) if (profile) { profilesService.openNewTabForProfile(profile) } } else if (hotkey.startsWith('profile-selectors.')) { const id = hotkey.substring(hotkey.indexOf('.') + 1) const provider = profilesService.getProviders().find(x => x.id === id) if (!provider) { return } this.showSelector(provider).catch(() => null) } else if (hotkey.startsWith('group-selectors.')) { const id = hotkey.substring(hotkey.indexOf('.') + 1) const groups = await this.profilesService.getProfileGroups({ includeProfiles: true }) const group = groups.find(x => x.id === id) if (!group) { return } this.showGroupSelector(group).catch(() => null) } else if (hotkey === 'command-selector') { commands.showSelector().catch(() => null) } else if (hotkey === 'profile-selector') { commands.run('core:profile-selector', {}) } }) ngbTooltipConfig.openDelay = 750 ngbTooltipConfig.placement = 'top bottom auto' ngbTooltipConfig.container = 'body' } async showSelector (provider: ProfileProvider): Promise { if (this.selector.active) { return } let profiles = await this.profilesService.getProfiles() profiles = profiles.filter(x => !x.isTemplate && x.type === provider.id) const options: SelectorOption[] = profiles.map(p => ({ ...this.profilesService.selectorOptionForProfile(p), callback: () => this.profilesService.openNewTabForProfile(p), })) if (provider instanceof QuickConnectProfileProvider) { options.push({ name: this.translate.instant('Quick connect'), freeInputPattern: this.translate.instant('Connect to "%s"...'), icon: 'fas fa-arrow-right', description: `(${provider.name.toUpperCase()})`, callback: query => { const p = provider.quickConnect(query) if (p) { this.profilesService.openNewTabForProfile(p) } }, }) } await this.selector.show(this.translate.instant('Select profile'), options) } async showGroupSelector (group: PartialProfileGroup): Promise { if (this.selector.active) { return } const profiles = group.profiles ?? [] const options: SelectorOption[] = profiles.map(p => ({ ...this.profilesService.selectorOptionForProfile(p), callback: () => this.profilesService.openNewTabForProfile(p), })) await this.selector.show(this.translate.instant('Select profile'), options) } static forRoot (): ModuleWithProviders { return { ngModule: AppModule, providers: [ ...PROVIDERS, ], } } } export { AppRootComponent as bootstrap } export * from './api' export { AppHotkeyProvider } // Deprecations export { ToolbarButton as IToolbarButton } from './api' export { HotkeyDescription as IHotkeyDescription } from './api' ================================================ FILE: tabby-core/src/profiles.ts ================================================ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import slugify from 'slugify' import { v4 as uuidv4 } from 'uuid' import { Injectable } from '@angular/core' import { ConfigService, NewTabParameters, PartialProfile, Profile, ProfileProvider } from './api' import { SplitTabComponent, SplitTabRecoveryProvider } from './components/splitTab.component' export interface SplitLayoutProfileOptions { recoveryToken: any } export interface SplitLayoutProfile extends Profile { options: SplitLayoutProfileOptions } @Injectable({ providedIn: 'root' }) export class SplitLayoutProfilesService extends ProfileProvider { id = 'split-layout' name = _('Saved layout') configDefaults = { options: { recoveryToken: null, }, } constructor ( private splitTabRecoveryProvider: SplitTabRecoveryProvider, private config: ConfigService, ) { super() } async getBuiltinProfiles (): Promise[]> { return [] } async getNewTabParameters (profile: SplitLayoutProfile): Promise> { return this.splitTabRecoveryProvider.recover(profile.options.recoveryToken) } getDescription (): string { return '' } async createProfile (tab: SplitTabComponent, name: string): Promise { const token = await tab.getRecoveryToken({ includeState: false }) const profile: PartialProfile = { id: `${this.id}:custom:${slugify(name)}:${uuidv4()}`, type: this.id, name, options: { recoveryToken: token, }, } this.config.store.profiles.push(profile) await this.config.save() } } ================================================ FILE: tabby-core/src/services/app.service.ts ================================================ import { Injectable, Inject } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { Observable, Subject, AsyncSubject, takeUntil, debounceTime } from 'rxjs' import { BaseTabComponent } from '../components/baseTab.component' import { SplitTabComponent } from '../components/splitTab.component' import { RenameTabModalComponent } from '../components/renameTabModal.component' import { SelectorOption } from '../api/selector' import { RecoveryToken } from '../api/tabRecovery' import { BootstrapData, BOOTSTRAP_DATA } from '../api/mainProcess' import { HostWindowService } from '../api/hostWindow' import { HostAppService } from '../api/hostApp' import { ConfigService } from './config.service' import { TabRecoveryService } from './tabRecovery.service' import { TabsService, NewTabParameters } from './tabs.service' import { SelectorService } from './selector.service' class CompletionObserver { get done$ (): Observable { return this.done } get destroyed$ (): Observable { return this.destroyed } private done = new AsyncSubject() private destroyed = new AsyncSubject() private interval: number constructor (private tab: BaseTabComponent) { this.interval = setInterval(() => this.tick(), 1000) as any this.tab.destroyed$.pipe(takeUntil(this.destroyed$)).subscribe(() => this.stop()) } async tick () { if (!await this.tab.getCurrentProcess()) { this.done.next() this.stop() } } stop () { clearInterval(this.interval) this.destroyed.next() this.destroyed.complete() this.done.complete() } } @Injectable({ providedIn: 'root' }) export class AppService { tabs: BaseTabComponent[] = [] get activeTab (): BaseTabComponent|null { return this._activeTab ?? null } private lastTabIndex = 0 private _activeTab: BaseTabComponent | null = null private closedTabsStack: RecoveryToken[] = [] private activeTabChange = new Subject() private tabsChanged = new Subject() private tabOpened = new Subject() private tabRemoved = new Subject() private tabClosed = new Subject() private tabDragActive = new Subject() private ready = new AsyncSubject() private recoveryStateChangedHint = new Subject() private completionObservers = new Map() get activeTabChange$ (): Observable { return this.activeTabChange } get tabOpened$ (): Observable { return this.tabOpened } get tabsChanged$ (): Observable { return this.tabsChanged } get tabRemoved$ (): Observable { return this.tabRemoved } get tabClosed$ (): Observable { return this.tabClosed } get tabDragActive$ (): Observable { return this.tabDragActive } /** Fires once when the app is ready */ get ready$ (): Observable { return this.ready } /** @hidden */ private constructor ( private config: ConfigService, private hostApp: HostAppService, private hostWindow: HostWindowService, private tabRecovery: TabRecoveryService, private tabsService: TabsService, private selector: SelectorService, private ngbModal: NgbModal, @Inject(BOOTSTRAP_DATA) private bootstrapData: BootstrapData, ) { this.tabsChanged$.subscribe(() => { this.recoveryStateChangedHint.next() }) setInterval(() => { this.recoveryStateChangedHint.next() }, 30000) this.recoveryStateChangedHint.pipe(debounceTime(1000)).subscribe(() => { this.tabRecovery.saveTabs(this.tabs) }) config.ready$.toPromise().then(async () => { if (this.bootstrapData.isMainWindow) { if (config.store.recoverTabs) { const tabs = await this.tabRecovery.recoverTabs() for (const tab of tabs) { this.openNewTabRaw(tab) } } /** Continue to store the tabs even if the setting is currently off */ this.tabRecovery.enabled = true } }) this.tabClosed$.subscribe(() => { if (!this.tabs.length && this.config.store.appearance.lastTabClosesWindow) { this.hostWindow.close() } }) hostWindow.windowFocused$.subscribe(() => this._activeTab?.emitFocused()) } addTabRaw (tab: BaseTabComponent, index: number|null = null): void { if (index !== null) { this.tabs.splice(index, 0, tab) } else { this.tabs.push(tab) } this.selectTab(tab) this.tabsChanged.next() this.tabOpened.next(tab) if (this.bootstrapData.isMainWindow) { tab.recoveryStateChangedHint$.subscribe(() => { this.recoveryStateChangedHint.next() }) } tab.titleChange$.subscribe(title => { if (tab === this._activeTab) { this.hostWindow.setTitle(title) } }) tab.destroyed$.subscribe(() => { this.removeTab(tab) this.tabRemoved.next(tab) this.tabClosed.next(tab) }) if (tab instanceof SplitTabComponent) { tab.tabAdded$.subscribe(() => this.emitTabsChanged()) tab.tabRemoved$.subscribe(() => this.emitTabsChanged()) tab.tabAdopted$.subscribe(t => { this.removeTab(t) this.tabRemoved.next(t) }) } } removeTab (tab: BaseTabComponent): void { const newIndex = Math.min(this.tabs.length - 2, this.tabs.indexOf(tab)) this.tabs = this.tabs.filter((x) => x !== tab) if (tab === this._activeTab) { this.selectTab(this.tabs[newIndex]) } this.tabsChanged.next() } /** * Adds a new tab **without** wrapping it in a SplitTabComponent * @param inputs Properties to be assigned on the new tab component instance */ openNewTabRaw (params: NewTabParameters): T { const tab = this.tabsService.create(params) this.addTabRaw(tab) return tab } /** * Adds a new tab while wrapping it in a SplitTabComponent * @param inputs Properties to be assigned on the new tab component instance */ openNewTab (params: NewTabParameters): T { if (params.type as any === SplitTabComponent) { return this.openNewTabRaw(params) } const tab = this.tabsService.create(params) this.wrapAndAddTab(tab) return tab } /** * Adds an existing tab while wrapping it in a SplitTabComponent */ wrapAndAddTab (tab: BaseTabComponent): SplitTabComponent { const splitTab = this.tabsService.create({ type: SplitTabComponent }) splitTab.addTab(tab, null, 'r') this.addTabRaw(splitTab) return splitTab } async reopenLastTab (): Promise { const token = this.closedTabsStack.pop() if (token) { const recoveredTab = await this.tabRecovery.recoverTab(token) if (recoveredTab) { const tab = this.tabsService.create(recoveredTab) if (this.activeTab) { this.addTabRaw(tab, this.tabs.indexOf(this.activeTab) + 1) } else { this.addTabRaw(tab) } return tab } } return null } selectTab (tab: BaseTabComponent|null): void { if (tab && this._activeTab === tab) { this._activeTab.emitFocused() return } if (this._activeTab && this.tabs.includes(this._activeTab)) { this.lastTabIndex = this.tabs.indexOf(this._activeTab) } else { this.lastTabIndex = 0 } if (this._activeTab) { this._activeTab.clearActivity() this._activeTab.emitBlurred() this._activeTab.emitVisibility(false) } this._activeTab = tab this.activeTabChange.next(tab) setImmediate(() => { this._activeTab?.emitFocused() this._activeTab?.emitVisibility(true) }) this.hostWindow.setTitle(this._activeTab?.title) } getParentTab (tab: BaseTabComponent): SplitTabComponent|null { for (const topLevelTab of this.tabs) { if (topLevelTab instanceof SplitTabComponent) { if (topLevelTab.getAllTabs().includes(tab)) { return topLevelTab } } } return null } /** Switches between the current tab and the previously active one */ toggleLastTab (): void { if (!this.lastTabIndex || this.lastTabIndex >= this.tabs.length) { this.lastTabIndex = 0 } this.selectTab(this.tabs[this.lastTabIndex]) } nextTab (): void { if (!this._activeTab) { return } if (this.tabs.length > 1) { const tabIndex = this.tabs.indexOf(this._activeTab) if (tabIndex < this.tabs.length - 1) { this.selectTab(this.tabs[tabIndex + 1]) } else if (this.config.store.appearance.cycleTabs) { this.selectTab(this.tabs[0]) } } } previousTab (): void { if (!this._activeTab) { return } if (this.tabs.length > 1) { const tabIndex = this.tabs.indexOf(this._activeTab) if (tabIndex > 0) { this.selectTab(this.tabs[tabIndex - 1]) } else if (this.config.store.appearance.cycleTabs) { this.selectTab(this.tabs[this.tabs.length - 1]) } } } moveSelectedTabLeft (): void { if (!this._activeTab) { return } if (this.tabs.length > 1) { const tabIndex = this.tabs.indexOf(this._activeTab) if (tabIndex > 0) { this.swapTabs(this._activeTab, this.tabs[tabIndex - 1]) } else if (this.config.store.appearance.cycleTabs) { this.tabs.push(this.tabs.shift()!) } } } moveSelectedTabRight (): void { if (!this._activeTab) { return } if (this.tabs.length > 1) { const tabIndex = this.tabs.indexOf(this._activeTab) if (tabIndex < this.tabs.length - 1) { this.swapTabs(this._activeTab, this.tabs[tabIndex + 1]) } else if (this.config.store.appearance.cycleTabs) { this.tabs.unshift(this.tabs.pop()!) } } } swapTabs (a: BaseTabComponent, b: BaseTabComponent): void { const i1 = this.tabs.indexOf(a) const i2 = this.tabs.indexOf(b) this.tabs[i1] = b this.tabs[i2] = a } renameTab (tab: BaseTabComponent): void { const modal = this.ngbModal.open(RenameTabModalComponent) modal.componentInstance.value = tab.customTitle || tab.title modal.result.then(result => { tab.setTitle(result) tab.customTitle = result this.emitTabsChanged() }).catch(() => null) } /** @hidden */ emitTabsChanged (): void { this.tabsChanged.next() } async closeTab (tab: BaseTabComponent, checkCanClose?: boolean): Promise { if (!this.tabs.includes(tab)) { return } if (checkCanClose && !await tab.canClose()) { return } const token = await this.tabRecovery.getFullRecoveryToken(tab, { includeState: true }) if (token) { this.closedTabsStack.push(token) this.closedTabsStack = this.closedTabsStack.slice(-5) } tab.destroy() } async duplicateTab (tab: BaseTabComponent): Promise { const dup = await this.tabsService.duplicate(tab) if (dup) { this.addTabRaw(dup, this.tabs.indexOf(tab) + 1) } return dup } /** * Attempts to close all tabs, returns false if one of the tabs blocked closure */ async closeAllTabs (): Promise { for (const tab of this.tabs) { if (!await tab.canClose()) { return false } } for (const tab of this.tabs) { tab.destroy(true) } return true } async closeWindow (): Promise { this.tabRecovery.enabled = false await this.tabRecovery.saveTabs(this.tabs) if (await this.closeAllTabs()) { this.hostWindow.close() } else { this.tabRecovery.enabled = true } } /** @hidden */ emitReady (): void { this.ready.next() this.ready.complete() this.hostApp.emitReady() } /** @hidden */ emitTabDragStarted (tab: BaseTabComponent): void { this.tabDragActive.next(tab) } /** @hidden */ emitTabDragEnded (): void { this.tabDragActive.next(null) } /** * Returns an observable that fires once * the tab's internal "process" (see [[BaseTabProcess]]) completes */ observeTabCompletion (tab: BaseTabComponent): Observable { if (!this.completionObservers.has(tab)) { const observer = new CompletionObserver(tab) observer.destroyed$.subscribe(() => { this.stopObservingTabCompletion(tab) }) this.completionObservers.set(tab, observer) } return this.completionObservers.get(tab)!.done$ } stopObservingTabCompletion (tab: BaseTabComponent): void { this.completionObservers.delete(tab) } // Deprecated showSelector (name: string, options: SelectorOption[]): Promise { return this.selector.show(name, options) } explodeTab (tab: SplitTabComponent): SplitTabComponent[] { const result: SplitTabComponent[] = [] for (const child of tab.getAllTabs().slice(1)) { tab.removeTab(child) result.push(this.wrapAndAddTab(child)) } return result } combineTabsInto (into: SplitTabComponent): void { this.explodeTab(into) let allChildren: BaseTabComponent[] = [] for (const tab of this.tabs) { if (into === tab) { continue } let children = [tab] if (tab instanceof SplitTabComponent) { children = tab.getAllTabs() } allChildren = allChildren.concat(children) } let x = 1 let previous: BaseTabComponent|null = null const stride = Math.ceil(Math.sqrt(allChildren.length + 1)) for (const child of allChildren) { into.add(child, x ? previous : null, x ? 'r' : 'b') previous = child x = (x + 1) % stride } into.equalize() } } ================================================ FILE: tabby-core/src/services/commands.service.ts ================================================ import { Inject, Injectable, Optional } from '@angular/core' import { AppService, Command, CommandContext, CommandProvider, ConfigService, MenuItemOptions, SplitTabComponent, TabContextMenuItemProvider, ToolbarButton, ToolbarButtonProvider, TranslateService } from '../api' import { SelectorService } from './selector.service' @Injectable({ providedIn: 'root' }) export class CommandService { private lastCommand = Promise.resolve() constructor ( private selector: SelectorService, private config: ConfigService, private app: AppService, private translate: TranslateService, @Optional() @Inject(TabContextMenuItemProvider) protected contextMenuProviders: TabContextMenuItemProvider[], @Optional() @Inject(ToolbarButtonProvider) private toolbarButtonProviders: ToolbarButtonProvider[], @Inject(CommandProvider) private commandProviders: CommandProvider[], ) { this.contextMenuProviders.sort((a, b) => a.weight - b.weight) } async getCommands (context: CommandContext): Promise { let buttons: ToolbarButton[] = [] this.config.enabledServices(this.toolbarButtonProviders).forEach(provider => { buttons = buttons.concat(provider.provide()) }) buttons = buttons .sort((a: ToolbarButton, b: ToolbarButton) => (a.weight ?? 0) - (b.weight ?? 0)) let items: MenuItemOptions[] = [] if (context.tab) { for (const tabHeader of [false, true]) { // Top-level tab menu for (let section of await Promise.all(this.contextMenuProviders.map(x => x.getItems(context.tab!, tabHeader)))) { // eslint-disable-next-line @typescript-eslint/no-loop-func section = section.filter(item => !items.some(ex => ex.label === item.label)) items = items.concat(section) } if (context.tab instanceof SplitTabComponent) { const tab = context.tab.getFocusedTab() if (tab) { for (let section of await Promise.all(this.contextMenuProviders.map(x => x.getItems(tab, tabHeader)))) { // eslint-disable-next-line @typescript-eslint/no-loop-func section = section.filter(item => !items.some(ex => ex.label === item.label)) items = items.concat(section) } } } } } items = items.filter(x => (x.enabled ?? true) && x.type !== 'separator') const flatItems: MenuItemOptions[] = [] function flattenItem (item: MenuItemOptions, prefix?: string): void { if (item.submenu) { item.submenu.forEach(x => flattenItem(x, (prefix ? `${prefix} > ` : '') + (item.commandLabel ?? item.label))) } else { flatItems.push({ ...item, label: (prefix ? `${prefix} > ` : '') + (item.commandLabel ?? item.label), }) } } items.forEach(x => flattenItem(x)) const commands = buttons.map(x => Command.fromToolbarButton(x)) commands.push(...flatItems.map(x => Command.fromMenuItem(x))) for (const provider of this.config.enabledServices(this.commandProviders)) { commands.push(...await provider.provide(context)) } return commands .filter(c => !this.config.store.commandBlacklist.includes(c.id)) .sort((a, b) => (a.weight ?? 0) - (b.weight ?? 0)) .map(command => { const run = command.run command.run = async () => { // Serialize execution this.lastCommand = this.lastCommand.finally(run) await this.lastCommand } return command }) } async run (id: string, context: CommandContext): Promise { const commands = await this.getCommands(context) const command = commands.find(x => x.id === id) await command?.run() } async showSelector (): Promise { if (this.selector.active) { return } const context: CommandContext = {} const tab = this.app.activeTab if (tab instanceof SplitTabComponent) { context.tab = tab.getFocusedTab() ?? undefined } const commands = await this.getCommands(context) return this.selector.show( this.translate.instant('Commands'), commands.map(c => ({ name: c.label, callback: c.run, description: c.sublabel, icon: c.icon, })), ) } } ================================================ FILE: tabby-core/src/services/config.service.ts ================================================ import deepClone from 'clone-deep' import deepEqual from 'deep-equal' import { v4 as uuidv4 } from 'uuid' import * as yaml from 'js-yaml' import { Observable, Subject, AsyncSubject, lastValueFrom } from 'rxjs' import { Injectable, Inject } from '@angular/core' import { TranslateService } from '@ngx-translate/core' import { ConfigProvider } from '../api/configProvider' import { PlatformService } from '../api/platform' import { HostAppService } from '../api/hostApp' import { Vault, VaultService } from './vault.service' import { serializeFunction } from '../utils' import { PartialProfileGroup, ProfileGroup } from '../api/profileProvider' const deepmerge = require('deepmerge') // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types export const configMerge = (a, b) => deepmerge(a, b, { arrayMerge: (_d, s) => s }) // eslint-disable-line @typescript-eslint/no-var-requires // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types export const configMergeByDefault = (a, b) => deepmerge(a, b) // eslint-disable-line @typescript-eslint/no-var-requires const LATEST_VERSION = 1 function isStructuralMember (v): v is AnyRec { return v instanceof Object && !(v instanceof Array) && Object.keys(v).length > 0 && !v.__nonStructural } function isNonStructuralObjectMember (v): boolean { return v instanceof Object && (v instanceof Array || v.__nonStructural) } // eslint-disable-next-line @typescript-eslint/no-type-alias type AnyRec = Record // eslint-disable-next-line @typescript-eslint/no-type-alias type IsRecord = T extends object // eslint-disable-next-line @typescript-eslint/ban-types ? (T extends Function ? false : true) : false // eslint-disable-next-line @typescript-eslint/no-type-alias export type ProxifiedConfig = { [K in keyof T]: IsRecord extends true ? ProxifiedConfig // structural -> nested proxy : T[K]; // leaf -> original type } // eslint-disable-next-line @typescript-eslint/no-type-alias export type FullyDefined = T extends object ? { [K in keyof T]-?: FullyDefined } : T /** @hidden */ // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export class ConfigProxy { constructor (real: Partial, defaults: T) { for (const key in defaults) { if (isStructuralMember(defaults[key])) { if (!real[key]) { real[key] = {} as any } const proxy = new ConfigProxy(real[key] as any, defaults[key]) Object.defineProperty( this, key, { enumerable: true, configurable: false, get: () => proxy, }, ) } else { Object.defineProperty( this, key, { enumerable: true, configurable: false, get: () => this.__getValue(key), set: (value) => { this.__setValue(key, value) }, }, ) } } this.__getValue = (key: keyof T) => { // eslint-disable-line @typescript-eslint/unbound-method if (real[key] !== undefined) { return real[key] } else { if (isNonStructuralObjectMember(defaults[key])) { // The object might be modified outside real[key] = this.__getDefault(key) delete real[key].__nonStructural return real[key] } return this.__getDefault(key) } } this.__getDefault = (key: keyof T) => { // eslint-disable-line @typescript-eslint/unbound-method return deepClone(defaults[key]) } this.__setValue = (key: keyof T, value: any) => { // eslint-disable-line @typescript-eslint/unbound-method if (deepEqual(value, this.__getDefault(key))) { // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete real[key] } else { real[key] = value } } this.__cleanup = () => { // eslint-disable-line @typescript-eslint/unbound-method // Trigger removal of default values for (const key in defaults) { if (isStructuralMember(defaults[key])) { (this as any)[key].__cleanup() } else { const v = this.__getValue(key) this.__setValue(key, v) } } } } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-empty-function __getValue (_key: keyof T): any { } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-empty-function __setValue (_key: keyof T, _value: any) { } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-empty-function __getDefault (_key: keyof T): any { } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-empty-function __cleanup () { } } // eslint-disable-next-line @typescript-eslint/no-type-alias, @typescript-eslint/no-redeclare // export type ConfigProxy = ProxifiedConfig @Injectable({ providedIn: 'root' }) export class ConfigService { /** * Contains the actual config values */ store: any /** * Whether an app restart is required due to recent changes */ restartRequested: boolean /** Fires once when the config is loaded */ get ready$ (): Observable { return this.ready } private ready = new AsyncSubject() private changed = new Subject() private _store: any private defaults: any private servicesCache: Record|null = null // eslint-disable-line @typescript-eslint/ban-types get changed$ (): Observable { return this.changed } /** @hidden */ private constructor ( private hostApp: HostAppService, private platform: PlatformService, private vault: VaultService, private translate: TranslateService, @Inject(ConfigProvider) private configProviders: ConfigProvider[], ) { this.defaults = this.mergeDefaults() setTimeout(() => this.init()) vault.contentChanged$.subscribe(() => { this.store.vault = vault.store this.save() }) this.save = serializeFunction(this.save.bind(this)) } mergeDefaults (): unknown { const providers = this.configProviders return providers.map(provider => { let defaults = provider.platformDefaults[this.hostApp.configPlatform] ?? {} defaults = configMerge( defaults, provider.platformDefaults[this.hostApp.platform] ?? {}, ) if (provider.defaults) { defaults = configMerge(provider.defaults, defaults) } return defaults }).reduce(configMergeByDefault) } getDefaults (): Record { const cleanup = o => { if (o instanceof Array) { return o.map(cleanup) } else if (o instanceof Object) { const r = {} for (const k of Object.keys(o)) { if (k !== '__nonStructural') { r[k] = cleanup(o[k]) } } return r } else { return o } } return cleanup(this.defaults) } async load (): Promise { const content = await this.platform.loadConfig() if (content) { this._store = yaml.load(content) } else { this._store = { version: LATEST_VERSION } } this._store = await this.maybeDecryptConfig(this._store) this.migrate(this._store) this.store = new ConfigProxy(this._store, this.defaults) this.vault.setStore(this.store.vault) } async save (): Promise { await lastValueFrom(this.ready$) if (!this._store) { throw new Error('Cannot save an empty store') } // Scrub undefined values let cleanStore = JSON.parse(JSON.stringify(this._store)) cleanStore = await this.maybeEncryptConfig(cleanStore) await this.platform.saveConfig(yaml.dump(cleanStore)) this.emitChange() } /** * Reads config YAML as string */ readRaw (): string { // Scrub undefined values const cleanStore = JSON.parse(JSON.stringify(this._store)) return yaml.dump(cleanStore) } /** * Writes config YAML as string */ async writeRaw (data: string): Promise { this._store = yaml.load(data) await this.save() await this.load() this.emitChange() } requestRestart (): void { this.restartRequested = true } /** * Filters a list of Angular services to only include those provided * by plugins that are enabled * * @typeparam T Base provider type */ enabledServices (services: T[]|undefined): T[] { // eslint-disable-line @typescript-eslint/ban-types if (!services) { return [] } if (!this.servicesCache) { this.servicesCache = {} for (const imp of window['pluginModules']) { const module = imp.ngModule || imp if (module.ɵinj?.providers) { this.servicesCache[module.pluginName] = module.ɵinj.providers.map(provider => { return provider.useClass ?? provider.useExisting ?? provider }) } } } return services.filter(service => { for (const pluginName in this.servicesCache) { if (this.servicesCache[pluginName].includes(service.constructor)) { const id = `${pluginName}:${service.constructor.name}` return !this.store?.pluginBlacklist?.includes(pluginName) && !this.store?.providerBlacklist?.includes(id) } } return true }) } private async init () { await this.load() this.ready.next(true) this.ready.complete() this.hostApp.configChangeBroadcast$.subscribe(async () => { await this.load() this.emitChange() }) } private emitChange (): void { this.vault.setStore(this.store.vault) this.changed.next() } // eslint-disable-next-line max-statements private migrate (config) { config.version ??= 0 if (config.version < 1) { for (const connection of config.ssh?.connections ?? []) { if (connection.privateKey) { connection.privateKeys = [connection.privateKey] delete connection.privateKey } } config.version = 1 } if (config.version < 2) { config.profiles ??= [] if (config.terminal?.recoverTabs !== undefined) { config.recoverTabs = config.terminal.recoverTabs delete config.terminal.recoverTabs } for (const profile of config.terminal?.profiles ?? []) { if (profile.sessionOptions) { profile.options = profile.sessionOptions delete profile.sessionOptions } profile.type = 'local' profile.id = `local:custom:${uuidv4()}` } if (config.terminal?.profiles) { config.profiles = config.terminal.profiles delete config.terminal.profiles delete config.terminal.environment config.terminal.profile = `local:${config.terminal.profile}` } config.version = 2 } if (config.version < 3) { delete config.ssh?.recentConnections for (const c of config.ssh?.connections ?? []) { const p = { id: `ssh:${uuidv4()}`, type: 'ssh', icon: 'fas fa-desktop', name: c.name, group: c.group ?? undefined, color: c.color, disableDynamicTitle: c.disableDynamicTitle, options: c, } config.profiles.push(p) } for (const p of config.profiles ?? []) { if (p.type === 'ssh') { if (p.options.jumpHost) { p.options.jumpHost = config.profiles.find(x => x.name === p.options.jumpHost)?.id } } } for (const c of config.serial?.connections ?? []) { const p = { id: `serial:${uuidv4()}`, type: 'serial', icon: 'fas fa-microchip', name: c.name, group: c.group ?? undefined, color: c.color, options: c, } config.profiles.push(p) } delete config.ssh?.connections delete config.serial?.connections delete window.localStorage.lastSerialConnection config.version = 3 } if (config.version < 4) { for (const p of config.profiles ?? []) { if (!p.id) { p.id = `${p.type}:custom:${uuidv4()}` } } config.version = 4 } if (config.version < 5) { const groups: PartialProfileGroup[] = [] for (const p of config.profiles ?? []) { if (!(p.group ?? '').trim()) { continue } let group = groups.find(x => x.name === p.group) if (!group) { group = { id: `${uuidv4()}`, name: `${p.group}`, } groups.push(group) } p.group = group.id } const profileGroupCollapsed = JSON.parse(window.localStorage.profileGroupCollapsed ?? '{}') for (const g of groups) { if (profileGroupCollapsed[g.name]) { const collapsed = profileGroupCollapsed[g.name] // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete profileGroupCollapsed[g.name] profileGroupCollapsed[g.id] = collapsed } } window.localStorage.profileGroupCollapsed = JSON.stringify(profileGroupCollapsed) config.groups = groups config.version = 5 } if (config.version < 6) { if (config.ssh?.clearServiceMessagesOnConnect === false) { config.profileDefaults ??= {} config.profileDefaults.ssh ??= {} config.profileDefaults.ssh.clearServiceMessagesOnConnect = false delete config.ssh?.clearServiceMessagesOnConnect } config.version = 6 } if (config.version < 7) { if (!config.configSync?.host || config.configSync?.host === 'https://api.tabby.sh') { config.configSync ??= {} delete config.configSync.host delete config.configSync.token } config.version = 7 } if (config.version < 8) { if (config.profileDefaults?.ssh?.options?.algorithms?.compression) { config.profileDefaults.ssh.options.algorithms.compression = ['none'] } for (const p of config.profiles ?? []) { if (p.options?.algorithms?.compression) { p.options.algorithms.compression = ['none'] } } config.version = 8 } } private async maybeDecryptConfig (store) { if (!store.encrypted) { return store } // eslint-disable-next-line @typescript-eslint/init-declarations let decryptedVault: Vault while (true) { try { const passphrase = await this.vault.getPassphrase() decryptedVault = await this.vault.decrypt(store.vault, passphrase) break } catch (e) { let result = await this.platform.showMessageBox({ type: 'error', message: this.translate.instant('Could not decrypt config'), detail: e.toString(), buttons: [ this.translate.instant('Try again'), this.translate.instant('Erase config'), this.translate.instant('Quit'), ], defaultId: 0, }) if (result.response === 2) { this.platform.quit() } if (result.response === 1) { result = await this.platform.showMessageBox({ type: 'warning', message: this.translate.instant('Are you sure?'), detail: e.toString(), buttons: [ this.translate.instant('Erase config'), this.translate.instant('Quit'), ], defaultId: 1, cancelId: 1, }) if (result.response === 1) { this.platform.quit() } return {} } } } delete decryptedVault.config.vault delete decryptedVault.config.encrypted delete decryptedVault.config.configSync return { ...decryptedVault.config, vault: store.vault, encrypted: store.encrypted, configSync: store.configSync, } } private async maybeEncryptConfig (store) { if (!store.encrypted) { return store } const vault = await this.vault.load() if (!vault) { throw new Error('Vault not configured') } vault.config = { ...store } delete vault.config.vault delete vault.config.encrypted delete vault.config.configSync return { vault: await this.vault.encrypt(vault), encrypted: true, configSync: store.configSync, } } } ================================================ FILE: tabby-core/src/services/docking.service.ts ================================================ import { Observable, Subject } from 'rxjs' export abstract class Screen { id: number name?: string } export abstract class DockingService { get screensChanged$ (): Observable { return this.screensChanged } protected screensChanged = new Subject() abstract dock (): void abstract getScreens (): Screen[] } ================================================ FILE: tabby-core/src/services/fileProviders.service.ts ================================================ import { Inject, Injectable } from '@angular/core' import { TranslateService } from '@ngx-translate/core' import { FileProvider, NotificationsService, SelectorService } from '../api' @Injectable({ providedIn: 'root' }) export class FileProvidersService { /** @hidden */ private constructor ( private selector: SelectorService, private notifications: NotificationsService, private translate: TranslateService, @Inject(FileProvider) private fileProviders: FileProvider[], ) { } async selectAndStoreFile (description: string): Promise { return this.selectProvider().then(p => { return p.selectAndStoreFile(description) }) } async retrieveFile (key: string): Promise { for (const p of this.fileProviders) { try { return await p.retrieveFile(key) } catch { continue } } throw new Error('Not found') } async selectProvider (): Promise { const providers: FileProvider[] = [] await Promise.all(this.fileProviders.map(async p => { if (await p.isAvailable()) { providers.push(p) } })) if (!providers.length) { this.notifications.error(this.translate.instant('Vault master passphrase needs to be set to allow storing secrets')) throw new Error('No available file providers') } if (providers.length === 1) { return providers[0] } return this.selector.show( this.translate.instant('Select file storage'), providers.map(p => ({ name: p.name, result: p, })), ) } } ================================================ FILE: tabby-core/src/services/homeBase.service.ts ================================================ import { Injectable, Inject } from '@angular/core' import * as mixpanel from 'mixpanel' import { v4 as uuidv4 } from 'uuid' import { ConfigService } from './config.service' import { PlatformService, BOOTSTRAP_DATA, BootstrapData, HostAppService } from '../api' @Injectable({ providedIn: 'root' }) export class HomeBaseService { appVersion: string mixpanel: any /** @hidden */ private constructor ( private config: ConfigService, private platform: PlatformService, private hostApp: HostAppService, @Inject(BOOTSTRAP_DATA) private bootstrapData: BootstrapData, ) { this.appVersion = platform.getAppVersion() if (this.config.store.enableAnalytics && !this.config.store.enableWelcomeTab) { this.enableAnalytics() } } openGitHub (): void { this.platform.openExternal('https://github.com/Eugeny/tabby') } openDiscord (): void { this.platform.openExternal('https://discord.gg/Vn7BjmzhtF') } openTranslations (): void { this.platform.openExternal('https://translate.tabby.sh/project/tabby') } reportBug (): void { let body = `Version: ${this.appVersion}\n` body += `Platform: ${this.hostApp.platform} ${process.arch} ${this.platform.getOSRelease()}\n` const plugins = this.bootstrapData.installedPlugins.filter(x => !x.isBuiltin).map(x => x.name) body += `Plugins: ${plugins.join(', ') || 'none'}\n` body += `Frontend: ${this.config.store.terminal?.frontend}\n\n` this.platform.openExternal(`https://github.com/Eugeny/tabby/issues/new?body=${encodeURIComponent(body)}`) } enableAnalytics (): void { if (!window.localStorage.analyticsUserID) { window.localStorage.analyticsUserID = uuidv4() } this.mixpanel = (mixpanel as any).init('bb4638b0860eef14c04d4fbc5eb365fa') if (!window.localStorage.installEventSent) { this.mixpanel.track('freshInstall', this.getAnalyticsProperties()) window.localStorage.installEventSent = true } this.mixpanel.track('launch', this.getAnalyticsProperties()) } getAnalyticsProperties (): Record { return { distinct_id: window.localStorage.analyticsUserID, platform: process.platform, os: this.platform.getOSRelease(), version: this.appVersion, } } } ================================================ FILE: tabby-core/src/services/hotkeys.service.ts ================================================ import { Injectable, Inject, NgZone, EventEmitter } from '@angular/core' import { Observable, Subject, filter } from 'rxjs' import { HotkeyDescription, HotkeyProvider } from '../api/hotkeyProvider' import { KeyEventData, getKeyName, Keystroke, KeyName, getKeystrokeName, metaKeyName, altKeyName } from './hotkeys.util' import { ConfigService } from './config.service' import { HostAppService, Platform } from '../api/hostApp' import { deprecate } from 'util' export interface PartialHotkeyMatch { id: string strokes: string[] matchedLength: number } interface PastKeystroke { keystroke: Keystroke time: number } @Injectable({ providedIn: 'root' }) export class HotkeysService { /** @hidden @deprecated */ key = new EventEmitter() /** @hidden @deprecated */ matchedHotkey = new EventEmitter() /** * Fired for each recognized hotkey */ get unfilteredHotkey$ (): Observable { return this._hotkey } /** * Fired for each recognized hotkey */ get hotkey$ (): Observable { return this._hotkey.pipe(filter(() => { return document.querySelectorAll('input:focus').length === 0 })) } /** * Fired for once hotkey is released */ get hotkeyOff$ (): Observable { return this._hotkeyOff } /** * Fired for each singular key */ get key$ (): Observable { return this._key } /** * Fired for each key event */ get keyEvent$ (): Observable { return this._keyEvent } /** * Fired for each singular key combination */ get keystroke$ (): Observable { return this._keystroke } private _hotkey = new Subject() private _hotkeyOff = new Subject() private _keyEvent = new Subject() private _key = new Subject() private _keystroke = new Subject() private disabledLevel = 0 private hotkeyDescriptions: HotkeyDescription[] = [] private pressedKeys = new Set() private pressedKeyTimestamps = new Map() private pressedHotkey: string|null = null private pressedKeystroke: Keystroke|null = null private lastKeystrokes: PastKeystroke[] = [] private recognitionPhase = true private lastEventTimestamp = 0 private constructor ( private zone: NgZone, private config: ConfigService, @Inject(HotkeyProvider) private hotkeyProviders: HotkeyProvider[], hostApp: HostAppService, ) { this.config.ready$.toPromise().then(async () => { const hotkeys = await this.getHotkeyDescriptions() this.hotkeyDescriptions = hotkeys const events = ['keydown', 'keyup'] events.forEach(eventType => { document.addEventListener(eventType, (nativeEvent: KeyboardEvent) => { this._keyEvent.next(nativeEvent) this.pushKeyEvent(eventType, nativeEvent) if (hostApp.platform === Platform.Web && this.matchActiveHotkey(true) !== null) { nativeEvent.preventDefault() nativeEvent.stopPropagation() } }) }) }) // deprecated this.hotkey$.subscribe(h => this.matchedHotkey.emit(h)) this.matchedHotkey.subscribe = deprecate(s => this.hotkey$.subscribe(s), 'matchedHotkey is deprecated, use hotkey$') this.keyEvent$.subscribe(h => this.key.next(h)) this.key.subscribe = deprecate(s => this.keyEvent$.subscribe(s), 'key is deprecated, use keyEvent$') } /** * Adds a new key event to the buffer * * @param eventName DOM event name * @param nativeEvent event object */ pushKeyEvent (eventName: string, nativeEvent: KeyboardEvent): void { if (nativeEvent.timeStamp === this.lastEventTimestamp) { return } nativeEvent['event'] = eventName const eventData = { ctrlKey: nativeEvent.ctrlKey, metaKey: nativeEvent.metaKey, altKey: nativeEvent.altKey, shiftKey: nativeEvent.shiftKey, code: nativeEvent.code, key: nativeEvent.key, eventName, time: nativeEvent.timeStamp, registrationTime: performance.now(), } for (const [key, time] of this.pressedKeyTimestamps.entries()) { if (time < performance.now() - 2000) { this.removePressedKey(key) } } const keyName = getKeyName(eventData) if (eventName === 'keydown') { this.addPressedKey(keyName, eventData) this.recognitionPhase = true this.updateModifiers(eventData) } if (eventName === 'keyup') { const keystroke = getKeystrokeName([...this.pressedKeys]) if (this.recognitionPhase) { this._keystroke.next(keystroke) this.lastKeystrokes.push({ keystroke, time: performance.now(), }) this.recognitionPhase = false } this.pressedKeys.clear() this.pressedKeyTimestamps.clear() this.removePressedKey(keyName) } if (this.pressedKeys.size) { this.pressedKeystroke = getKeystrokeName([...this.pressedKeys]) } else { this.pressedKeystroke = null } const matched = this.matchActiveHotkey() this.zone.run(() => { if (matched) { if (this.recognitionPhase) { this.emitHotkeyOn(matched) } } else if (this.pressedHotkey) { this.emitHotkeyOff(this.pressedHotkey) } }) this.zone.run(() => { this._key.next(getKeyName(eventData)) }) if (process.platform === 'darwin' && eventData.metaKey && eventName === 'keydown' && !['Ctrl', 'Shift', altKeyName, metaKeyName, 'Enter'].includes(keyName)) { // macOS will swallow non-modified keyups if Cmd is held down this.pushKeyEvent('keyup', nativeEvent) } this.lastEventTimestamp = nativeEvent.timeStamp } getCurrentKeystrokes (): Keystroke[] { if (!this.pressedKeystroke) { return [] } return [...this.lastKeystrokes.map(x => x.keystroke), this.pressedKeystroke] } matchActiveHotkey (partial = false): string|null { if (!this.isEnabled() || !this.pressedKeystroke) { return null } const matches: { id: string, sequence: string[], }[] = [] const currentSequence = this.getCurrentKeystrokes() const config = this.getHotkeysConfig() for (const id in config) { for (const sequence of config[id]) { if (currentSequence.length < sequence.length) { continue } if (sequence[sequence.length - 1] !== this.pressedKeystroke) { continue } let lastIndex = 0 let matched = true for (const item of sequence) { const nextOffset = currentSequence.slice(lastIndex).findIndex( x => x.toLowerCase() === item.toLowerCase(), ) if (nextOffset === -1) { matched = false break } lastIndex += nextOffset } if (partial ? lastIndex > 0 : matched) { matches.push({ id, sequence, }) } } } matches.sort((a, b) => b.sequence.length - a.sequence.length) if (!matches.length) { return null } if (matches[0].sequence.length > 1) { this.clearCurrentKeystrokes() } return matches[0].id } clearCurrentKeystrokes (): void { this.lastKeystrokes = [] this.pressedKeys.clear() this.pressedKeyTimestamps.clear() this.pressedKeystroke = null this.pressedHotkey = null } getHotkeyDescription (id: string): HotkeyDescription { return this.hotkeyDescriptions.filter((x) => x.id === id)[0] } enable (): void { this.disabledLevel-- } disable (): void { this.disabledLevel++ } isEnabled (): boolean { return this.disabledLevel === 0 } async getHotkeyDescriptions (): Promise { return ( await Promise.all( this.config.enabledServices(this.hotkeyProviders) .map(async x => x.provide()), ) ).reduce((a, b) => a.concat(b)) } private updateModifiers (event: KeyEventData) { for (const [prop, key] of Object.entries({ ctrlKey: 'Ctrl', metaKey: metaKeyName, altKey: altKeyName, shiftKey: 'Shift', })) { if (!event[prop] && this.pressedKeys.has(key)) { this.removePressedKey(key) } if (event[prop] && !this.pressedKeys.has(key)) { this.addPressedKey(key, event) } } } private emitHotkeyOn (hotkey: string) { if (this.pressedHotkey) { if (this.pressedHotkey !== hotkey) { this.emitHotkeyOff(this.pressedHotkey) } } console.debug('Matched hotkey', hotkey) this._hotkey.next(hotkey) this.pressedHotkey = hotkey this.recognitionPhase = false } private emitHotkeyOff (hotkey: string) { console.debug('Unmatched hotkey', hotkey) this._hotkeyOff.next(hotkey) this.pressedHotkey = null } private getHotkeysConfig () { return this.getHotkeysConfigRecursive(this.config.store.hotkeys) } private getHotkeysConfigRecursive (branch: any) { const keys = {} for (const key in branch) { let value = branch[key] if (value instanceof Object && !(value instanceof Array)) { const subkeys = this.getHotkeysConfigRecursive(value) for (const subkey in subkeys) { keys[key + '.' + subkey] = subkeys[subkey] } } else { if (typeof value === 'string') { value = [value] } if (!(value instanceof Array)) { continue } if (value.length > 0) { value = value.map((item: string | string[]) => typeof item === 'string' ? [item] : item) keys[key] = value } } } return keys } private addPressedKey (keyName: KeyName, eventData: KeyEventData) { this.pressedKeys.add(keyName) this.pressedKeyTimestamps.set(keyName, eventData.registrationTime) } private removePressedKey (key: KeyName) { this.pressedKeys.delete(key) this.pressedKeyTimestamps.delete(key) } } ================================================ FILE: tabby-core/src/services/hotkeys.util.ts ================================================ /* eslint-disable @typescript-eslint/no-type-alias */ export const metaKeyName = { darwin: '⌘', win32: 'Win', linux: 'Super', }[process.platform] export const altKeyName = { darwin: '⌥', win32: 'Alt', linux: 'Alt', }[process.platform] export interface KeyEventData { ctrlKey?: boolean metaKey?: boolean altKey?: boolean shiftKey?: boolean key: string code: string eventName: string time: number registrationTime: number } const REGEX_LATIN_KEYNAME = /^[A-Za-z]$/ export type KeyName = string export type Keystroke = string export function getKeyName (event: KeyEventData): KeyName { // eslint-disable-next-line @typescript-eslint/init-declarations let key: string if (event.key === 'Control') { key = 'Ctrl' } else if (event.key === 'Meta') { key = metaKeyName } else if (event.key === 'Alt') { key = altKeyName } else if (event.key === 'Shift') { key = 'Shift' } else if (event.key === '`') { key = '`' } else if (event.key === '~') { key = '~' } else { key = event.code if (REGEX_LATIN_KEYNAME.test(event.key)) { // Handle Dvorak etc via the reported "character" instead of the scancode key = event.key.toUpperCase() } else { key = key.replace('Key', '') key = key.replace('Arrow', '') key = key.replace('Digit', '') key = { Comma: ',', Period: '.', Slash: '/', Backslash: '\\', IntlBackslash: '`', Minus: '-', Equal: '=', Semicolon: ';', Quote: '\'', BracketLeft: '[', BracketRight: ']', }[key] ?? key } } return key } export function getKeystrokeName (keys: KeyName[]): Keystroke { const strictOrdering: KeyName[] = ['Ctrl', metaKeyName, altKeyName, 'Shift'] keys = [ ...strictOrdering.map(x => keys.find(k => k === x)).filter(x => !!x) as KeyName[], ...keys.filter(k => !strictOrdering.includes(k)), ] return keys.join('-') } ================================================ FILE: tabby-core/src/services/locale.service.ts ================================================ import { Injectable, Pipe, PipeTransform } from '@angular/core' import { formatDate, registerLocaleData } from '@angular/common' import { TranslateService, MissingTranslationHandler } from '@ngx-translate/core' import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler' import localeENUS from '@angular/common/locales/en' import localeENGB from '@angular/common/locales/en-GB' import localeAF from '@angular/common/locales/af' import localeBG from '@angular/common/locales/bg' import localeCS from '@angular/common/locales/cs' import localeDA from '@angular/common/locales/da' import localeDE from '@angular/common/locales/de' import localeES from '@angular/common/locales/es' import localeFR from '@angular/common/locales/fr' import localeHR from '@angular/common/locales/hr' import localeID from '@angular/common/locales/id' import localeIT from '@angular/common/locales/it' import localeJA from '@angular/common/locales/ja' import localeKO from '@angular/common/locales/ko' import localePL from '@angular/common/locales/pl' import localePT from '@angular/common/locales/pt' import localeRU from '@angular/common/locales/ru' import localeSRSP from '@angular/common/locales/sr-Cyrl' import localeSV from '@angular/common/locales/sv' import localeTR from '@angular/common/locales/tr' import localeUK from '@angular/common/locales/uk' import localeZH from '@angular/common/locales/zh' import { Observable, Subject } from 'rxjs' import { distinctUntilChanged } from 'rxjs/operators' import { ConfigService } from './config.service' import { LogService, Logger } from './log.service' registerLocaleData(localeENUS) registerLocaleData(localeENGB) registerLocaleData(localeAF) registerLocaleData(localeBG) registerLocaleData(localeCS) registerLocaleData(localeDA) registerLocaleData(localeDE) registerLocaleData(localeES) registerLocaleData(localeFR) registerLocaleData(localeHR) registerLocaleData(localeID) registerLocaleData(localeIT) registerLocaleData(localeJA) registerLocaleData(localeKO) registerLocaleData(localePL) registerLocaleData(localePT) registerLocaleData(localeRU) registerLocaleData(localeSRSP) registerLocaleData(localeSV) registerLocaleData(localeTR) registerLocaleData(localeUK) registerLocaleData(localeZH) function flattenMessageFormatTranslation (po: any) { const translation = {} po = po.translations[''] for (const k of Object.keys(po)) { translation[k] = po[k].msgstr[0] || k } return translation } export class CustomMissingTranslationHandler extends MissingTranslationHandler { compiler = new TranslateMessageFormatCompiler() // eslint-disable-next-line @typescript-eslint/ban-types handle (params: { key: string, translateService: TranslateService, interpolateParams?: Object }): any { const v = this.compiler.compile(params.key, params.translateService.currentLang) if (typeof v === 'string') { return v } return v(params.interpolateParams) } } @Injectable({ providedIn: 'root' }) export class LocaleService { private logger: Logger static allLanguages = [ { code: 'af-ZA', name: 'Afrikaans', }, { code: 'id-ID', name: 'Bahasa Indonesia', }, { code: 'cs-CZ', name: 'Čeština', }, { code: 'da-DK', name: 'Dansk', }, { code: 'de-DE', name: 'Deutsch', }, { code: 'en-GB', name: 'English (UK)', }, { code: 'en-US', name: 'English (US)', }, { code: 'es-ES', name: 'Español', }, { code: 'fr-FR', name: 'Français', }, { code: 'hr-HR', name: 'Hrvatski', }, { code: 'it-IT', name: 'Italiano', }, { code: 'pl-PL', name: 'Polski', }, { code: 'pt-PT', name: 'Português', }, { code: 'pt-BR', name: 'Português do Brasil', }, { code: 'sv-SE', name: 'Svenska', }, { code: 'tr-TR', name: 'Türkçe', }, { code: 'bg-BG', name: 'Български', }, { code: 'ru-RU', name: 'Русский', }, { code: 'sr-SP', name: 'Српски', }, { code: 'uk-UA', name: 'Українська', }, { code: 'ja-JP', name: '日本語', }, { code: 'ko-KR', name: '한국어', }, { code: 'zh-CN', name: '中文(简体)', }, { code: 'zh-TW', name: '中文 (繁體)', }, ] get localeChanged$ (): Observable { return this.localeChanged.pipe(distinctUntilChanged()) } private locale = 'en-US' private localeChanged = new Subject() constructor ( private config: ConfigService, private translate: TranslateService, log: LogService, ) { this.patchTranslateService(translate) this.logger = log.create('translate') config.changed$.subscribe(() => { this.refresh() }) config.ready$.subscribe(() => { this.refresh() }) const d = new Date() if (d.getMonth() === 3 && d.getDate() === 1) { LocaleService.allLanguages.find(x => x.code === 'en-US')!.name = 'English (simplified)' LocaleService.allLanguages.find(x => x.code === 'en-GB')!.name = 'English (traditional)' } } private patchTranslateService (translate: TranslateService) { translate['_defaultTranslation'] = null const oldGetParsedResult = translate.getParsedResult.bind(translate) // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types translate.getParsedResult = function (translations: any, key: any, interpolateParams?: any): any { if (!this._defaultTranslation) { const po = require(`../../../locale/en-US.po`) this._defaultTranslation = flattenMessageFormatTranslation(po) } this.translations[this.defaultLang][key] ??= this.compiler.compile( this._defaultTranslation[key] || key, this.defaultLang, ) return oldGetParsedResult(translations, key, interpolateParams ?? {}) }.bind(translate) } refresh (): void { let lang = this.config.store.language if (!lang) { for (const systemLanguage of navigator.languages) { if (!lang && LocaleService.allLanguages.some(x => x.code === systemLanguage)) { lang = systemLanguage } } } lang ??= 'en-US' this.setLocale(lang) } async setLocale (lang: string): Promise { if (!this.translate.langs.includes(lang)) { this.translate.addLangs([lang]) const po = require(`../../../locale/${lang}.po`) const translation = flattenMessageFormatTranslation(po) this.translate.setTranslation(lang, translation) } this.translate.setDefaultLang(lang) this.locale = lang this.localeChanged.next(lang) this.logger.debug('Setting language to', lang) } getLocale (): string { return this.locale } } @Pipe({ name: 'tabbyDate', }) export class TabbyFormatedDatePipe implements PipeTransform { constructor (private locale: LocaleService) {} transform (date: string): string { return formatDate(date, 'medium', this.locale.getLocale()) } } ================================================ FILE: tabby-core/src/services/log.service.ts ================================================ export abstract class Logger { constructor (protected name: string) { } debug (...args: any[]): void { this.doLog('debug', ...args) } info (...args: any[]): void { this.doLog('info', ...args) } warn (...args: any[]): void { this.doLog('warn', ...args) } error (...args: any[]): void { this.doLog('error', ...args) } log (...args: any[]): void { this.doLog('log', ...args) } protected abstract doLog (level: string, ...args: any[]): void } export class ConsoleLogger extends Logger { protected doLog (level: string, ...args: any[]): void { console[level](`%c[${this.name}]`, 'color: #aaa', ...args) } } export abstract class LogService { abstract create (name: string): Logger } ================================================ FILE: tabby-core/src/services/notifications.service.ts ================================================ import { Injectable } from '@angular/core' import { ToastrService } from 'ngx-toastr' @Injectable({ providedIn: 'root' }) export class NotificationsService { private constructor ( private toastr: ToastrService, ) { } notice (text: string): void { this.toastr.info(text, undefined, { timeOut: 1000, }) } info (text: string, details?: string): void { this.toastr.info(text, details) } error (text: string, details?: string): void { this.toastr.error(text, details) } } ================================================ FILE: tabby-core/src/services/profiles.service.ts ================================================ import { Injectable, Inject } from '@angular/core' import { TranslateService } from '@ngx-translate/core' import { NewTabParameters } from './tabs.service' import { BaseTabComponent } from '../components/baseTab.component' import { QuickConnectProfileProvider, PartialProfile, PartialProfileGroup, Profile, ProfileGroup, ProfileProvider } from '../api/profileProvider' import { SelectorOption } from '../api/selector' import { AppService } from './app.service' import { configMerge, ConfigProxy, ConfigService, FullyDefined } from './config.service' import { NotificationsService } from './notifications.service' import { SelectorService } from './selector.service' import deepClone from 'clone-deep' import { v4 as uuidv4 } from 'uuid' import slugify from 'slugify' @Injectable({ providedIn: 'root' }) export class ProfilesService { private profileDefaults: Profile = { id: '', type: '', name: '', group: '', options: {}, icon: '', color: '', disableDynamicTitle: false, weight: 0, isBuiltin: false, isTemplate: false, behaviorOnSessionEnd: 'auto', } constructor ( private app: AppService, private config: ConfigService, private notifications: NotificationsService, private selector: SelectorService, private translate: TranslateService, @Inject(ProfileProvider) private profileProviders: ProfileProvider[], ) { } /* * Methods used to interact with ProfileProvider */ getProviders (): ProfileProvider[] { return [...this.profileProviders] } providerForProfile (profile: PartialProfile): ProfileProvider|null { const provider = this.profileProviders.find(x => x.id === profile.type) ?? null return provider as unknown as ProfileProvider|null } getDescription

(profile: PartialProfile

): string|null { profile = this.getConfigProxyForProfile(profile) as PartialProfile

return this.providerForProfile(profile)?.getDescription(profile) ?? null } /* * Methods used to interact with Profile */ /* * Return ConfigProxy for a given Profile * arg: skipUserDefaults -> do not merge global provider defaults in ConfigProxy * arg: skipGroupDefaults -> do not merge parent group provider defaults in ConfigProxy */ getConfigProxyForProfile

(profile: PartialProfile

, options?: { skipGlobalDefaults?: boolean, skipGroupDefaults?: boolean }): FullyDefined

& ConfigProxy> { const defaults = this.getProfileDefaults(profile, options).reduce(configMerge, {}) return new ConfigProxy(profile, defaults) as any } /** * Return an Array of Profiles * arg: includeBuiltin (default: true) -> include BuiltinProfiles * arg: clone (default: false) -> return deepclone Array */ async getProfiles (options?: { includeBuiltin?: boolean, clone?: boolean }): Promise[]> { let list = this.config.store.profiles ?? [] if (options?.includeBuiltin ?? true) { const lists = await Promise.all(this.config.enabledServices(this.profileProviders).map(x => x.getBuiltinProfiles())) list = [ ...this.config.store.profiles ?? [], ...lists.reduce((a, b) => a.concat(b), []), ] } const sortKey = p => `${this.resolveProfileGroupName(p.group ?? '')} / ${p.name}` list.sort((a, b) => sortKey(a).localeCompare(sortKey(b))) list.sort((a, b) => (a.isBuiltin ? 1 : 0) - (b.isBuiltin ? 1 : 0)) return options?.clone ? deepClone(list) : list } /** * Insert a new Profile in config * arg: genId (default: true) -> generate uuid in before pushing Profile into config */ async newProfile (profile: PartialProfile, options?: { genId?: boolean }): Promise { if (options?.genId ?? true) { profile.id = `${profile.type}:custom:${slugify(profile.name)}:${uuidv4()}` } const cProfile = this.config.store.profiles.find(p => p.id === profile.id) if (cProfile) { throw new Error(`Cannot insert new Profile, duplicated Id: ${profile.id}`) } this.config.store.profiles.push(profile) } /** * Write a Profile in config */ async writeProfile (profile: PartialProfile): Promise { const cProfile = this.config.store.profiles.find(p => p.id === profile.id) if (cProfile) { // Fully replace the config for (const k in cProfile) { // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete cProfile[k] } Object.assign(cProfile, profile) } } /** * Delete a Profile from config */ async deleteProfile (profile: PartialProfile): Promise { this.providerForProfile(profile)?.deleteProfile(this.getConfigProxyForProfile(profile)) this.config.store.profiles = this.config.store.profiles.filter(p => p.id !== profile.id) const profileHotkeyName = ProfilesService.getProfileHotkeyName(profile) if (this.config.store.hotkeys.profile.hasOwnProperty(profileHotkeyName)) { const profileHotkeys = deepClone(this.config.store.hotkeys.profile) // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete profileHotkeys[profileHotkeyName] this.config.store.hotkeys.profile = profileHotkeys } } /** * Delete all Profiles from config using option filter * arg: filter (p: PartialProfile) => boolean -> predicate used to decide which profiles have to be deleted */ async bulkDeleteProfiles (filter: (p: PartialProfile) => boolean): Promise { for (const profile of this.config.store.profiles.filter(filter)) { this.providerForProfile(profile)?.deleteProfile(this.getConfigProxyForProfile(profile)) const profileHotkeyName = ProfilesService.getProfileHotkeyName(profile) if (this.config.store.hotkeys.profile.hasOwnProperty(profileHotkeyName)) { const profileHotkeys = deepClone(this.config.store.hotkeys.profile) // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete profileHotkeys[profileHotkeyName] this.config.store.hotkeys.profile = profileHotkeys } } this.config.store.profiles = this.config.store.profiles.filter(x => !filter(x)) } async openNewTabForProfile

(profile: PartialProfile

): Promise { const params = await this.newTabParametersForProfile(profile) if (params) { return this.app.openNewTab(params) } return null } async newTabParametersForProfile

(profile: PartialProfile

): Promise|null> { const fullProfile = this.getConfigProxyForProfile(profile) const params = await this.providerForProfile(fullProfile)?.getNewTabParameters(fullProfile) ?? null if (params) { params.inputs ??= {} params.inputs['title'] = profile.name if (fullProfile.disableDynamicTitle) { params.inputs['disableDynamicTitle'] = true } if (fullProfile.color) { params.inputs['color'] = fullProfile.color } if (fullProfile.icon) { params.inputs['icon'] = fullProfile.icon } } return params } async launchProfile (profile: PartialProfile): Promise { await this.openNewTabForProfile(profile) let recentProfiles: PartialProfile[] = JSON.parse(window.localStorage['recentProfiles'] ?? '[]') if (this.config.store.terminal.showRecentProfiles > 0) { recentProfiles = recentProfiles.filter(x => x.group !== profile.group || x.name !== profile.name) recentProfiles.unshift(profile) recentProfiles = recentProfiles.slice(0, this.config.store.terminal.showRecentProfiles) } else { recentProfiles = [] } window.localStorage['recentProfiles'] = JSON.stringify(recentProfiles) } static getProfileHotkeyName (profile: PartialProfile): string { return (profile.id ?? profile.name).replace(/\./g, '-') } /* * Methods used to interact with Profile Selector */ selectorOptionForProfile

(profile: PartialProfile

): SelectorOption { const fullProfile = this.getConfigProxyForProfile(profile) const provider = this.providerForProfile(fullProfile) const freeInputEquivalent = provider instanceof QuickConnectProfileProvider ? provider.intoQuickConnectString(fullProfile) ?? undefined : undefined return { name: profile.name, icon: profile.icon ?? undefined, color: profile.color ?? undefined, weight: profile.weight, group: this.resolveProfileGroupName(profile.group ?? ''), freeInputEquivalent, description: provider?.getDescription(fullProfile), } } showProfileSelector (): Promise|null> { if (this.selector.active) { return Promise.resolve(null) } return new Promise|null>(async (resolve, reject) => { try { const recentProfiles = this.getRecentProfiles() let options: SelectorOption[] = recentProfiles.map((p, i) => ({ ...this.selectorOptionForProfile(p), group: this.translate.instant('Recent'), icon: 'fas fa-history', color: p.color ?? undefined, weight: i - (recentProfiles.length + 1), callback: async () => { if (p.id) { p = (await this.getProfiles()).find(x => x.id === p.id) ?? p } resolve(p) }, })) if (recentProfiles.length) { options.push({ name: this.translate.instant('Clear recent profiles'), group: this.translate.instant('Recent'), icon: 'fas fa-eraser', weight: -1, callback: async () => { window.localStorage.removeItem('recentProfiles') this.config.save() resolve(null) }, }) } let profiles = await this.getProfiles() if (!this.config.store.terminal.showBuiltinProfiles) { profiles = profiles.filter(x => !x.isBuiltin) } profiles = profiles.filter(x => !x.isTemplate) profiles = profiles.filter(x => x.id && !this.config.store.profileBlacklist.includes(x.id)) options = [...options, ...profiles.map((p): SelectorOption => ({ ...this.selectorOptionForProfile(p), weight: p.isBuiltin ? 2 : 1, callback: () => resolve(p), }))] try { const { SettingsTabComponent } = window['nodeRequire']('tabby-settings') options.push({ name: this.translate.instant('Manage profiles'), icon: 'fas fa-window-restore', weight: 10, callback: () => { this.app.openNewTabRaw({ type: SettingsTabComponent, inputs: { activeTab: 'profiles' }, }) resolve(null) }, }) } catch { } this.getProviders().forEach(provider => { if (provider instanceof QuickConnectProfileProvider) { options.push({ name: this.translate.instant('Quick connect'), freeInputPattern: this.translate.instant('Connect to "%s"...'), description: `(${provider.name.toUpperCase()})`, icon: 'fas fa-arrow-right', weight: provider.id !== this.config.store.defaultQuickConnectProvider ? 1 : 0, callback: query => { const profile = provider.quickConnect(query) resolve(profile) }, }) } }) await this.selector.show(this.translate.instant('Select profile or enter an address'), options).catch(() => reject()) } catch (err) { reject(err) } }) } getRecentProfiles (): PartialProfile[] { let recentProfiles: PartialProfile[] = JSON.parse(window.localStorage['recentProfiles'] ?? '[]') recentProfiles = recentProfiles.slice(0, this.config.store.terminal.showRecentProfiles) return recentProfiles } async quickConnect (query: string): Promise|null> { for (const provider of this.getProviders()) { if (provider instanceof QuickConnectProfileProvider) { const profile = provider.quickConnect(query) if (profile) { return profile } } } this.notifications.error(`Could not parse "${query}"`) return null } /* * Methods used to interact with Profile/ProfileGroup/Global defaults */ /** * Return global defaults for a given profile provider * Always return something, empty object if no defaults found */ getProviderDefaults (provider: ProfileProvider): any { const defaults = this.config.store.profileDefaults return defaults[provider.id] ?? {} } /** * Set global defaults for a given profile provider */ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types setProviderDefaults (provider: ProfileProvider, pdefaults: any): void { this.config.store.profileDefaults[provider.id] = pdefaults } /** * Return defaults for a given profile * Always return something, empty object if no defaults found * arg: skipUserDefaults -> do not merge global provider defaults in ConfigProxy * arg: skipGroupDefaults -> do not merge parent group provider defaults in ConfigProxy */ getProfileDefaults (profile: PartialProfile, options?: { skipGlobalDefaults?: boolean, skipGroupDefaults?: boolean }): any[] { const provider = this.providerForProfile(profile) return [ this.profileDefaults, provider?.configDefaults ?? {}, provider && !options?.skipGlobalDefaults ? this.getProviderDefaults(provider) : {}, provider && !options?.skipGlobalDefaults && !options?.skipGroupDefaults ? this.getProviderProfileGroupDefaults(profile.group ?? '', provider) : {}, ] } /* * Methods used to interact with ProfileGroup */ /** * Synchronously return an Array of the existing ProfileGroups * Does not return builtin groups */ getSyncProfileGroups (): PartialProfileGroup[] { return deepClone(this.config.store.groups ?? []) } /** * Return an Array of the existing ProfileGroups * arg: includeProfiles (default: false) -> if false, does not fill up the profiles field of ProfileGroup * arg: includeNonUserGroup (default: false) -> if false, does not add built-in and ungrouped groups */ async getProfileGroups (options?: { includeProfiles?: boolean, includeNonUserGroup?: boolean }): Promise[]> { let profiles: PartialProfile[] = [] if (options?.includeProfiles) { profiles = await this.getProfiles({ includeBuiltin: options.includeNonUserGroup, clone: true }) } let groups: PartialProfileGroup[] = this.getSyncProfileGroups() groups = groups.map(x => { x.editable = true if (options?.includeProfiles) { x.profiles = profiles.filter(p => p.group === x.id) profiles = profiles.filter(p => p.group !== x.id) } return x }) if (options?.includeNonUserGroup) { const builtInGroups: PartialProfileGroup[] = [] builtInGroups.push({ id: 'built-in', name: this.translate.instant('Built-in'), editable: false, profiles: [], }) const ungrouped: PartialProfileGroup = { id: 'ungrouped', name: this.translate.instant('Ungrouped'), editable: false, } if (options.includeProfiles) { for (const profile of profiles.filter(p => p.isBuiltin)) { let group: PartialProfileGroup | undefined = builtInGroups.find(g => g.id === slugify(profile.group ?? 'built-in')) if (!group) { group = { id: `${slugify(profile.group!)}`, name: `${profile.group!}`, editable: false, profiles: [], } builtInGroups.push(group) } group.profiles!.push(profile) } ungrouped.profiles = profiles.filter(p => !p.isBuiltin) } groups = groups.concat(builtInGroups) groups.push(ungrouped) } return groups } /** * Insert a new ProfileGroup in config * arg: genId (default: true) -> generate uuid in before pushing Profile into config */ async newProfileGroup (group: PartialProfileGroup, options?: { genId?: boolean }): Promise { if (options?.genId ?? true) { group.id = `${uuidv4()}` } const cProfileGroup = this.config.store.groups.find(p => p.id === group.id) if (cProfileGroup) { throw new Error(`Cannot insert new ProfileGroup, duplicated Id: ${group.id}`) } this.config.store.groups.push(group) } /** * Write a ProfileGroup in config */ async writeProfileGroup (group: PartialProfileGroup): Promise { delete group.profiles delete group.editable const cGroup = this.config.store.groups.find(g => g.id === group.id) if (cGroup) { Object.assign(cGroup, group) } } /** * Delete a ProfileGroup from config */ async deleteProfileGroup (group: PartialProfileGroup, options?: { deleteProfiles?: boolean }): Promise { this.config.store.groups = this.config.store.groups.filter(g => g.id !== group.id) if (options?.deleteProfiles) { await this.bulkDeleteProfiles((p) => p.group === group.id) } else { for (const profile of this.config.store.profiles.filter(x => x.group === group.id)) { delete profile.group } } if (this.config.store.hotkeys['group-selectors'].hasOwnProperty(group.id)) { const groupSelectorsHotkeys = { ...this.config.store.hotkeys['group-selectors'] } // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete groupSelectorsHotkeys[group.id] this.config.store.hotkeys['group-selectors'] = groupSelectorsHotkeys } } /** * Resolve and return ProfileGroup Name from ProfileGroup ID */ resolveProfileGroupName (groupId: string): string { return this.config.store.groups.find(g => g.id === groupId)?.name ?? groupId } /** * Return defaults for a given group ID and provider * Always return something, empty object if no defaults found * arg: skipUserDefaults -> do not merge global provider defaults in ConfigProxy */ getProviderProfileGroupDefaults (groupId: string, provider: ProfileProvider): any { return this.getSyncProfileGroups().find(g => g.id === groupId)?.defaults?.[provider.id] ?? {} } } ================================================ FILE: tabby-core/src/services/selector.service.ts ================================================ import { Injectable } from '@angular/core' import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap' import { SelectorModalComponent } from '../components/selectorModal.component' import { SelectorOption } from '../api/selector' @Injectable({ providedIn: 'root' }) export class SelectorService { private current: NgbModalRef|null = null get active (): boolean { return !!this.current } /** @hidden */ private constructor ( private ngbModal: NgbModal, ) { } show (name: string, options: SelectorOption[]): Promise { const modal = this.ngbModal.open(SelectorModalComponent) this.current = modal modal.result.finally(() => { this.current = null }) const instance: SelectorModalComponent = modal.componentInstance instance.name = name instance.options = options return modal.result as Promise } } ================================================ FILE: tabby-core/src/services/tabRecovery.service.ts ================================================ import { Injectable, Inject } from '@angular/core' import { TabRecoveryProvider, RecoveryToken } from '../api/tabRecovery' import { BaseTabComponent, GetRecoveryTokenOptions } from '../components/baseTab.component' import { Logger, LogService } from './log.service' import { ConfigService } from './config.service' import { NewTabParameters } from './tabs.service' /** @hidden */ @Injectable({ providedIn: 'root' }) export class TabRecoveryService { logger: Logger enabled = false private constructor ( @Inject(TabRecoveryProvider) private tabRecoveryProviders: TabRecoveryProvider[]|null, private config: ConfigService, log: LogService, ) { this.logger = log.create('tabRecovery') } async saveTabs (tabs: BaseTabComponent[]): Promise { if (!this.enabled || !this.config.store.recoverTabs) { return } window.localStorage.tabsRecovery = JSON.stringify( (await Promise.all( tabs.map(async tab => this.getFullRecoveryToken(tab, { includeState: true })), )).filter(token => !!token), ) } async getFullRecoveryToken (tab: BaseTabComponent, options?: GetRecoveryTokenOptions): Promise { const token = await tab.getRecoveryToken(options) if (token) { token.tabTitle = tab.title token.tabCustomTitle = tab.customTitle if (tab.icon) { token.tabIcon = tab.icon } if (tab.color) { token.tabColor = tab.color } token.disableDynamicTitle = tab['disableDynamicTitle'] } return token } async recoverTab (token: RecoveryToken): Promise|null> { for (const provider of this.config.enabledServices(this.tabRecoveryProviders ?? [])) { try { if (!await provider.applicableTo(token)) { continue } const tab = await provider.recover(token) tab.inputs = tab.inputs ?? {} tab.inputs.icon = token.tabIcon ?? null tab.inputs.color = token.tabColor ?? null tab.inputs.title = token.tabTitle || '' tab.inputs.customTitle = token.tabCustomTitle || '' tab.inputs.disableDynamicTitle = token.disableDynamicTitle return tab } catch (error) { this.logger.warn('Tab recovery crashed:', token, provider, error) } } return null } async recoverTabs (): Promise[]> { if (window.localStorage.tabsRecovery) { const tabs: NewTabParameters[] = [] for (const token of JSON.parse(window.localStorage.tabsRecovery)) { const tab = await this.recoverTab(token) if (tab) { tabs.push(tab) } } return tabs } return [] } } ================================================ FILE: tabby-core/src/services/tabs.service.ts ================================================ import deepClone from 'clone-deep' import { Injectable, ComponentFactoryResolver, Injector } from '@angular/core' import { BaseTabComponent } from '../components/baseTab.component' import { TabRecoveryService } from './tabRecovery.service' export interface TabComponentType { // eslint-disable-next-line @typescript-eslint/prefer-function-type new (...args: any[]): T } export interface NewTabParameters { /** * Component type to be instantiated */ type: TabComponentType /** * Component instance inputs */ inputs?: Record } @Injectable({ providedIn: 'root' }) export class TabsService { /** @hidden */ private constructor ( private componentFactoryResolver: ComponentFactoryResolver, private injector: Injector, private tabRecovery: TabRecoveryService, ) { } /** * Instantiates a tab component and assigns given inputs */ create (params: NewTabParameters): T { const componentFactory = this.componentFactoryResolver.resolveComponentFactory(params.type) const componentRef = componentFactory.create(this.injector) const tab = componentRef.instance tab.hostView = componentRef.hostView tab.destroyed$.subscribe(() => componentRef.destroy()) Object.assign(tab, params.inputs ?? {}) return tab } /** * Duplicates an existing tab instance (using the tab recovery system) */ async duplicate (tab: BaseTabComponent): Promise { const token = await this.tabRecovery.getFullRecoveryToken(tab) if (!token) { return null } const dup = await this.tabRecovery.recoverTab(deepClone(token)) if (dup) { return this.create(dup) } return null } } ================================================ FILE: tabby-core/src/services/themes.service.ts ================================================ import { Inject, Injectable } from '@angular/core' import { Subject, Observable } from 'rxjs' import * as Color from 'color' import { ConfigService } from '../services/config.service' import { Theme } from '../api/theme' import { PlatformService, PlatformTheme } from '../api/platform' import { NewTheme } from '../theme' @Injectable({ providedIn: 'root' }) export class ThemesService { get themeChanged$ (): Observable { return this.themeChanged } private themeChanged = new Subject() private styleElement: HTMLElement|null = null private rootElementStyleBackup = '' /** @hidden */ private constructor ( private config: ConfigService, private standardTheme: NewTheme, private platform: PlatformService, @Inject(Theme) private themes: Theme[], ) { this.rootElementStyleBackup = document.documentElement.style.cssText this.applyTheme(standardTheme) this.applyThemeVariables() config.ready$.toPromise().then(() => { this.applyCurrentTheme() this.applyThemeVariables() platform.themeChanged$.subscribe(() => { this.applyCurrentTheme() this.applyThemeVariables() }) config.changed$.subscribe(() => { this.applyCurrentTheme() this.applyThemeVariables() }) }) } private getConfigStoreOrDefaults (): any { /// Theme service is active before the vault is unlocked and config is available return this.config.store ?? this.config.getDefaults() } private applyThemeVariables () { if (!this.findCurrentTheme().followsColorScheme) { document.documentElement.style.cssText = this.rootElementStyleBackup } const theme = this._getActiveColorScheme() const isDark = Color(theme.background).luminosity() < Color(theme.foreground).luminosity() function more (some, factor) { if (isDark) { return Color(some).darken(factor) } return Color(some).lighten(factor) } function less (some, factor) { if (!isDark) { return Color(some).darken(factor) } return Color(some).lighten(factor) } let background = Color(theme.background) if (this.getConfigStoreOrDefaults().appearance.vibrancy) { background = background.fade(0.6) } // const background = theme.background const backgroundMore = more(background.string(), 0.25).string() // const backgroundMore =more(theme.background, 0.25).string() const accentIndex = 4 const vars: Record = {} const contrastPairs: string[][] = [] vars['--body-bg'] = background.string() if (this.findCurrentTheme().followsColorScheme) { vars['--bs-body-bg'] = theme.background vars['--bs-body-color'] = theme.foreground vars['--bs-black'] = theme.colors[0] vars['--bs-red'] = theme.colors[1] vars['--bs-green'] = theme.colors[2] vars['--bs-yellow'] = theme.colors[3] vars['--bs-blue'] = theme.colors[4] vars['--bs-purple'] = theme.colors[5] vars['--bs-cyan'] = theme.colors[6] vars['--bs-gray'] = theme.colors[7] vars['--bs-gray-dark'] = theme.colors[8] // vars['--bs-red'] = theme.colors[9] // vars['--bs-green'] = theme.colors[10] // vars['--bs-yellow'] = theme.colors[11] // vars['--bs-blue'] = theme.colors[12] // vars['--bs-purple'] = theme.colors[13] // vars['--bs-cyan'] = theme.colors[14] contrastPairs.push(['--bs-body-bg', '--bs-body-color']) vars['--theme-fg-more-2'] = more(theme.foreground, 0.5).string() vars['--theme-fg-more'] = more(theme.foreground, 0.25).string() vars['--theme-fg'] = theme.foreground vars['--theme-fg-less'] = less(theme.foreground, 0.25).string() vars['--theme-fg-less-2'] = less(theme.foreground, 0.5).string() vars['--theme-bg-less-2'] = less(theme.background, 0.5).string() vars['--theme-bg-less'] = less(theme.background, 0.25).string() vars['--theme-bg'] = theme.background vars['--theme-bg-more'] = backgroundMore vars['--theme-bg-more-2'] = more(backgroundMore, 0.25).string() contrastPairs.push(['--theme-bg', '--theme-fg']) contrastPairs.push(['--theme-bg-less', '--theme-fg-less']) contrastPairs.push(['--theme-bg-less-2', '--theme-fg-less-2']) contrastPairs.push(['--theme-bg-more', '--theme-fg-more']) contrastPairs.push(['--theme-bg-more-2', '--theme-fg-more-2']) const themeColors = { primary: theme.colors[accentIndex], secondary: isDark ? less(theme.background, 0.5).string() : less(theme.background, 0.125).string(), tertiary: more(theme.background, 0.75).string(), warning: theme.colors[3], danger: theme.colors[1], success: theme.colors[2], info: theme.colors[4], dark: more(theme.background, 0.75).string(), light: more(theme.foreground, 0.5).string(), link: theme.colors[8], // for .btn-link } for (const [key, color] of Object.entries(themeColors)) { vars[`--bs-${key}-bg`] = more(color, 0.5).string() vars[`--bs-${key}-color`] = less(color, 0.5).string() vars[`--bs-${key}`] = color vars[`--bs-${key}-rgb`] = Color(color).rgb().array().join(', ') vars[`--theme-${key}-more-2`] = more(color, 1).string() vars[`--theme-${key}-more`] = more(color, 0.5).string() vars[`--theme-${key}`] = color vars[`--theme-${key}-less`] = less(color, 0.25).string() vars[`--theme-${key}-less-2`] = less(color, 0.75).string() vars[`--theme-${key}-fg`] = more(color, 3).string() vars[`--theme-${key}-active-bg`] = less(color, 1).string() vars[`--theme-${key}-active-fg`] = more(color, 1).string() contrastPairs.push([`--theme-${key}`, `--theme-${key}-fg`]) contrastPairs.push([`--theme-${key}-active-bg`, `--theme-${key}-active-fg`]) } const switchBackground = less(theme.colors[accentIndex], 0.25).string() vars['--bs-form-switch-bg'] = `url("data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%27-4 -4 8 8%27%3e%3ccircle r=%273%27 fill=%27${switchBackground}%27/%3e%3c/svg%3e")` } vars['--spaciness'] = this.getConfigStoreOrDefaults().appearance.spaciness for (const [bg, fg] of contrastPairs) { const colorBg = Color(vars[bg]).hsl() const colorFg = Color(vars[fg]).hsl() const bgContrast = colorBg.contrast(colorFg) if (bgContrast < this.getConfigStoreOrDefaults().terminal.minimumContrastRatio) { vars[fg] = this.ensureContrast(colorFg, colorBg).string() } } for (const [key, value] of Object.entries(vars)) { document.documentElement.style.setProperty(key, value) } document.body.classList.toggle('no-animations', !this.getConfigStoreOrDefaults().accessibility.animations) } private ensureContrast (color: Color, against: Color): Color { const a = this.increaseContrast(color, against, 1.1) const b = this.increaseContrast(color, against, 0.9) return a.contrast(against) > b.contrast(against) ? a : b } private increaseContrast (color: Color, against: Color, step=1.1): Color { color = color.hsl() color.color[2] = Math.max(color.color[2], 0.01) while ( (step < 1 && color.color[2] > 1 || step > 1 && color.color[2] < 99) && color.contrast(against) < this.getConfigStoreOrDefaults().terminal.minimumContrastRatio) { color.color[2] *= step } return color } findTheme (name: string): Theme|null { return this.config.enabledServices(this.themes).find(x => x.name === name) ?? null } findCurrentTheme (): Theme { return this.findTheme(this.getConfigStoreOrDefaults().appearance.theme) ?? this.standardTheme } /// @hidden _getActiveColorScheme (): any { let theme: PlatformTheme = 'dark' if (this.getConfigStoreOrDefaults().appearance.colorSchemeMode === 'light') { theme = 'light' } else if (this.getConfigStoreOrDefaults().appearance.colorSchemeMode === 'auto') { theme = this.platform.getTheme() } if (theme === 'light') { return this.getConfigStoreOrDefaults().terminal.lightColorScheme } else { return this.getConfigStoreOrDefaults().terminal.colorScheme } } applyTheme (theme: Theme): void { if (!this.styleElement) { this.styleElement = document.createElement('style') this.styleElement.setAttribute('id', 'theme') document.querySelector('head')!.appendChild(this.styleElement) } this.styleElement.textContent = theme.css document.querySelector('style#custom-css')!.innerHTML = this.getConfigStoreOrDefaults().appearance.css this.themeChanged.next(theme) } private applyCurrentTheme (): void { this.applyTheme(this.findCurrentTheme()) } } ================================================ FILE: tabby-core/src/services/updater.service.ts ================================================ export abstract class UpdaterService { abstract check (): Promise abstract update (): Promise } ================================================ FILE: tabby-core/src/services/vault.service.ts ================================================ import * as crypto from 'crypto' import { promisify } from 'util' import { Injectable, NgZone } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { AsyncSubject, Subject, Observable } from 'rxjs' import { wrapPromise, serializeFunction } from '../utils' import { UnlockVaultModalComponent } from '../components/unlockVaultModal.component' import { NotificationsService } from './notifications.service' import { SelectorService } from './selector.service' import { FileProvider } from '../api/fileProvider' import { PlatformService } from '../api/platform' const PBKDF_ITERATIONS = 100000 const PBKDF_DIGEST = 'sha512' const PBKDF_SALT_LENGTH = 64 / 8 const CRYPT_ALG = 'aes-256-cbc' const CRYPT_KEY_LENGTH = 256 / 8 const CRYPT_IV_LENGTH = 128 / 8 export interface StoredVault { version: number contents: string keySalt: string iv: string } export interface VaultSecret { type: string key: VaultSecretKey value: string } export interface VaultFileSecret extends VaultSecret { key: { id: string description: string } } export interface Vault { config: any secrets: VaultSecret[] } // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface VaultSecretKey { } function migrateVaultContent (content: any): Vault { return { config: content.config, secrets: content.secrets ?? [], } } function deriveVaultKey (passphrase: string, salt: Buffer): Promise { return promisify(crypto.pbkdf2)( Buffer.from(passphrase), salt, PBKDF_ITERATIONS, CRYPT_KEY_LENGTH, PBKDF_DIGEST, ) } async function encryptVault (content: Vault, passphrase: string): Promise { const keySalt = await promisify(crypto.randomBytes)(PBKDF_SALT_LENGTH) const iv = await promisify(crypto.randomBytes)(CRYPT_IV_LENGTH) const key = await deriveVaultKey(passphrase, keySalt) const plaintext = JSON.stringify(content) const cipher = crypto.createCipheriv(CRYPT_ALG, key, iv) const encrypted = Buffer.concat([cipher.update(plaintext, 'utf-8'), cipher.final()]) return { version: 1, contents: encrypted.toString('base64'), keySalt: keySalt.toString('hex'), iv: iv.toString('hex'), } } async function decryptVault (vault: StoredVault, passphrase: string): Promise { if (vault.version !== 1) { throw new Error(`Unsupported vault format version ${vault.version}`) } const keySalt = Buffer.from(vault.keySalt, 'hex') const key = await deriveVaultKey(passphrase, keySalt) const iv = Buffer.from(vault.iv, 'hex') const encrypted = Buffer.from(vault.contents, 'base64') const decipher = crypto.createDecipheriv(CRYPT_ALG, key, iv) const plaintext = decipher.update(encrypted, undefined, 'utf-8') + decipher.final('utf-8') return migrateVaultContent(JSON.parse(plaintext)) } export const VAULT_SECRET_TYPE_FILE = 'file' // Don't make it accessible through VaultService fields let _rememberedPassphrase: string|null = null @Injectable({ providedIn: 'root' }) export class VaultService { /** Fires once when the config is loaded */ get ready$ (): Observable { return this.ready } get contentChanged$ (): Observable { return this.contentChanged } store: StoredVault|null = null private ready = new AsyncSubject() private contentChanged = new Subject() /** @hidden */ private constructor ( private zone: NgZone, private notifications: NotificationsService, private ngbModal: NgbModal, ) { this.getPassphrase = serializeFunction(this.getPassphrase.bind(this)) } async setEnabled (enabled: boolean, passphrase?: string): Promise { if (enabled) { if (!this.store) { await this.save(migrateVaultContent({}), passphrase) } } else { this.store = null this.contentChanged.next() } } isOpen (): boolean { return !!_rememberedPassphrase } forgetPassphrase (): void { _rememberedPassphrase = null } async decrypt (storage: StoredVault, passphrase?: string): Promise { if (!passphrase) { passphrase = await this.getPassphrase() } try { return await wrapPromise(this.zone, decryptVault(storage, passphrase)) } catch (e) { this.forgetPassphrase() if (e.toString().includes('BAD_DECRYPT')) { this.notifications.error('Incorrect passphrase') } throw e } } async load (passphrase?: string): Promise { if (!this.store) { return null } return this.decrypt(this.store, passphrase) } async encrypt (vault: Vault, passphrase?: string): Promise { if (!passphrase) { passphrase = await this.getPassphrase() } if (_rememberedPassphrase) { _rememberedPassphrase = passphrase } return wrapPromise(this.zone, encryptVault(vault, passphrase)) } async save (vault: Vault, passphrase?: string): Promise { await this.ready$.toPromise() this.store = await this.encrypt(vault, passphrase) this.contentChanged.next() } async getPassphrase (): Promise { if (!_rememberedPassphrase) { const modal = this.ngbModal.open(UnlockVaultModalComponent) const { passphrase, rememberFor } = await modal.result setTimeout(() => { _rememberedPassphrase = null // avoid multiple consequent prompts }, Math.max(1000, rememberFor * 60000)) _rememberedPassphrase = passphrase } return _rememberedPassphrase! } async getSecret (type: string, key: VaultSecretKey): Promise { await this.ready$.toPromise() const vault = await this.load() if (!vault) { return null } let vaultSecret = vault.secrets.find(s => s.type === type && this.keyMatches(key, s)) if (!vaultSecret) { // search for secret without host in vault (like a default user/password used in multiple servers) key['host'] = null vaultSecret = vault.secrets.find(s => s.type === type && this.keyMatches(key, s)) } return vaultSecret ?? null } async addSecret (secret: VaultSecret): Promise { await this.ready$.toPromise() const vault = await this.load() if (!vault) { return } vault.secrets = vault.secrets.filter(s => s.type !== secret.type || !this.keyMatches(secret.key, s)) vault.secrets.push(secret) await this.save(vault) } async updateSecret (secret: VaultSecret, update: VaultSecret): Promise { await this.ready$.toPromise() const vault = await this.load() if (!vault) { return } const target = vault.secrets.find(s => s.type === secret.type && this.keyMatches(secret.key, s)) if (!target) { return } Object.assign(target, update) await this.save(vault) } async removeSecret (type: string, key: VaultSecretKey): Promise { await this.ready$.toPromise() const vault = await this.load() if (!vault) { return } vault.secrets = vault.secrets.filter(s => s.type !== type || !this.keyMatches(key, s)) await this.save(vault) } private keyMatches (key: VaultSecretKey, secret: VaultSecret): boolean { return Object.keys(key).every(k => secret.key[k] === key[k]) } setStore (store: StoredVault): void { this.store = store this.ready.next(true) this.ready.complete() } isEnabled (): boolean { return !!this.store } } @Injectable() export class VaultFileProvider extends FileProvider { name = 'Vault' prefix = 'vault://' constructor ( private vault: VaultService, private platform: PlatformService, private selector: SelectorService, private zone: NgZone, ) { super() } async isAvailable (): Promise { return this.vault.isEnabled() } async selectAndStoreFile (description: string): Promise { const vault = await this.vault.load() if (!vault) { throw new Error('Vault is locked') } const files = vault.secrets.filter(x => x.type === VAULT_SECRET_TYPE_FILE) as VaultFileSecret[] if (files.length) { const result = await this.selector.show('Select file', [ { name: 'Add a new file', icon: 'fas fa-plus', result: null, }, ...files.map(f => ({ name: f.key.description, icon: 'fas fa-file', result: f, })), ]).catch(() => null) if (result) { return `${this.prefix}${result.key.id}` } } return this.addNewFile(description) } async addNewFile (description: string): Promise { const transfers = await this.platform.startUpload() if (!transfers.length) { throw new Error('Nothing selected') } const transfer = transfers[0] const id = (await wrapPromise(this.zone, promisify(crypto.randomBytes)(32))).toString('hex') await this.vault.addSecret({ type: VAULT_SECRET_TYPE_FILE, key: { id, description: `${description} (${transfer.getName()})`, }, value: Buffer.from(await transfer.readAll()).toString('base64'), }) return `${this.prefix}${id}` } async retrieveFile (key: string): Promise { if (!key.startsWith(this.prefix)) { throw new Error('Incorrect type') } const secret = await this.vault.getSecret(VAULT_SECRET_TYPE_FILE, { id: key.substring(this.prefix.length) }) if (!secret) { throw new Error('Not found') } return Buffer.from(secret.value, 'base64') } } ================================================ FILE: tabby-core/src/tabContextMenu.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Injectable } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { TranslateService } from '@ngx-translate/core' import { Subscription } from 'rxjs' import { AppService } from './services/app.service' import { BaseTabComponent } from './components/baseTab.component' import { SplitTabComponent, SplitDirection } from './components/splitTab.component' import { TabContextMenuItemProvider } from './api/tabContextMenuProvider' import { MenuItemOptions } from './api/menu' import { ProfilesService } from './services/profiles.service' import { TabsService } from './services/tabs.service' import { HotkeysService } from './services/hotkeys.service' import { PromptModalComponent } from './components/promptModal.component' import { SplitLayoutProfilesService } from './profiles' import { TAB_COLORS } from './utils' /** @hidden */ @Injectable() export class TabManagementContextMenu extends TabContextMenuItemProvider { weight = 99 constructor ( private app: AppService, private translate: TranslateService, ) { super() } async getItems (tab: BaseTabComponent): Promise { let items: MenuItemOptions[] = [ { label: this.translate.instant('Close'), commandLabel: this.translate.instant('Close tab'), click: () => { if (this.app.tabs.includes(tab)) { this.app.closeTab(tab, true) } else { tab.destroy() } }, }, ] if (!tab.parent) { items = [ ...items, { label: this.translate.instant('Close other tabs'), click: () => { for (const t of this.app.tabs.filter(x => x !== tab)) { this.app.closeTab(t, true) } }, }, { label: this.translate.instant('Close tabs to the right'), click: () => { for (const t of this.app.tabs.slice(this.app.tabs.indexOf(tab) + 1)) { this.app.closeTab(t, true) } }, }, { label: this.translate.instant('Close tabs to the left'), click: () => { for (const t of this.app.tabs.slice(0, this.app.tabs.indexOf(tab))) { this.app.closeTab(t, true) } }, }, ] } else if (tab.parent instanceof SplitTabComponent) { const directions: SplitDirection[] = ['r', 'b', 'l', 't'] items.push({ label: this.translate.instant('Split'), submenu: directions.map(dir => ({ label: { r: this.translate.instant('Right'), b: this.translate.instant('Down'), l: this.translate.instant('Left'), t: this.translate.instant('Up'), }[dir], commandLabel: { r: this.translate.instant('Split to the right'), b: this.translate.instant('Split to the down'), l: this.translate.instant('Split to the left'), t: this.translate.instant('Split to the up'), }[dir], click: () => { (tab.parent as SplitTabComponent).splitTab(tab, dir) }, })) as MenuItemOptions[], }) } return items } } /** @hidden */ @Injectable() export class CommonOptionsContextMenu extends TabContextMenuItemProvider { weight = -1 constructor ( private app: AppService, private ngbModal: NgbModal, private splitLayoutProfilesService: SplitLayoutProfilesService, private translate: TranslateService, ) { super() } async getItems (tab: BaseTabComponent, tabHeader?: boolean): Promise { let items: MenuItemOptions[] = [] if (tabHeader) { const currentColor = TAB_COLORS.find(x => x.value === tab.color)?.name items = [ ...items, { label: this.translate.instant('Rename'), commandLabel: this.translate.instant('Rename tab'), click: () => { this.app.renameTab(tab) }, }, { label: this.translate.instant('Duplicate'), commandLabel: this.translate.instant('Duplicate tab'), click: () => this.app.duplicateTab(tab), }, { label: this.translate.instant('Color'), commandLabel: this.translate.instant('Change tab color'), sublabel: currentColor ? this.translate.instant(currentColor) : undefined, submenu: TAB_COLORS.map(color => ({ label: this.translate.instant(color.name) ?? color.name, type: 'radio', checked: tab.color === color.value, click: () => { tab.color = color.value }, })) as MenuItemOptions[], }, ] if (tab instanceof SplitTabComponent && tab.getAllTabs().length > 1) { items.push({ label: this.translate.instant('Save layout as profile'), click: async () => { const modal = this.ngbModal.open(PromptModalComponent) modal.componentInstance.prompt = this.translate.instant('Profile name') const name = (await modal.result.catch(() => null))?.value if (!name) { return } this.splitLayoutProfilesService.createProfile(tab, name) }, }) } } return items } } /** @hidden */ @Injectable() export class TaskCompletionContextMenu extends TabContextMenuItemProvider { constructor ( private app: AppService, private translate: TranslateService, ) { super() } async getItems (tab: BaseTabComponent): Promise { const process = await tab.getCurrentProcess() const items: MenuItemOptions[] = [] const extTab: (BaseTabComponent & { __completionNotificationEnabled?: boolean, __outputNotificationSubscription?: Subscription|null }) = tab if (process) { items.push({ enabled: false, label: this.translate.instant('Current process: {name}', process), }) items.push({ label: this.translate.instant('Notify when done'), type: 'checkbox', checked: extTab.__completionNotificationEnabled, click: () => { extTab.__completionNotificationEnabled = !extTab.__completionNotificationEnabled if (extTab.__completionNotificationEnabled) { this.app.observeTabCompletion(tab).subscribe(() => { new Notification(this.translate.instant('Process completed'), { body: process.name, }).addEventListener('click', () => { this.app.selectTab(tab) }) extTab.__completionNotificationEnabled = false }) } else { this.app.stopObservingTabCompletion(tab) } }, }) } items.push({ label: this.translate.instant('Notify on activity'), type: 'checkbox', checked: !!extTab.__outputNotificationSubscription, click: () => { tab.clearActivity() if (extTab.__outputNotificationSubscription) { extTab.__outputNotificationSubscription.unsubscribe() extTab.__outputNotificationSubscription = null } else { extTab.__outputNotificationSubscription = tab.activity$.subscribe(active => { if (extTab.__outputNotificationSubscription && active) { extTab.__outputNotificationSubscription.unsubscribe() extTab.__outputNotificationSubscription = null new Notification(this.translate.instant('Tab activity'), { body: tab.title, }).addEventListener('click', () => { this.app.selectTab(tab) }) } }) } }, }) return items } } /** @hidden */ @Injectable() export class ProfilesContextMenu extends TabContextMenuItemProvider { weight = 10 constructor ( private profilesService: ProfilesService, private tabsService: TabsService, private app: AppService, private translate: TranslateService, hotkeys: HotkeysService, ) { super() hotkeys.hotkey$.subscribe(hotkey => { if (hotkey === 'switch-profile') { let tab = this.app.activeTab if (tab instanceof SplitTabComponent) { tab = tab.getFocusedTab() if (tab) { this.switchTabProfile(tab) } } } }) } async switchTabProfile (tab: BaseTabComponent) { const profile = await this.profilesService.showProfileSelector().catch(() => null) if (!profile) { return } const params = await this.profilesService.newTabParametersForProfile(profile) if (!params) { return } if (!await tab.canClose()) { return } const newTab = this.tabsService.create(params) ;(tab.parent as SplitTabComponent).replaceTab(tab, newTab) tab.destroy() } async getItems (tab: BaseTabComponent): Promise { if (tab.parent instanceof SplitTabComponent && tab.parent.getAllTabs().length > 1) { return [ { label: this.translate.instant('Switch profile'), click: () => this.switchTabProfile(tab), }, ] } return [] } } ================================================ FILE: tabby-core/src/theme.new.scss ================================================ $font-family-sans-serif: "Source Sans Pro"; $font-size-base: 14rem / 16; app-root { background: transparent; &.vibrant { background: rgba(var(--bs-dark-rgb),.65); } &> .content { .tab-bar { background: var(--theme-bg-more-2); .btn-tab-bar { background: transparent; line-height: 42px; align-items: center; svg, path { fill: var(--bs-body-color); fill-opacity: 0.75; } &:hover { background: rgba(0, 0, 0, .125) !important; } &:active { background: rgba(0, 0, 0, .25) !important; } } &>.tabs { tab-header { border-left: 1px solid transparent; border-right: 1px solid transparent; transition: 0.125s ease-out width; color: var(--theme-fg-more-2); .index { color: var(--bs-body-color); opacity: 0.4; } button { color: var(--bs-body-color); border: none; transition: 0.25s all; &:hover { background: var(--theme-bg-more-2) !important; } &:active { background: var(--theme-bg-more-2) !important; } } .progressbar { background: var(--bs-blue); } .activity-indicator { background:var(--bs-body-color); opacity: .2; } .current-tab-indicator { background:var(--bs-light); } &.active { color: var(--theme-fg); background: var(--body-bg); } } } } } } tab-body { background: var(--body-bg); } $tab-border-radius: 5px; $modal-header-border-color: transparent; $modal-footer-border-color: transparent; $form-check-input-width: 1.4em; $form-switch-width: 2.5em; $input-placeholder-color: var(--theme-fg-more-2); @import '~bootstrap/scss/bootstrap.scss'; @import "./theme.vendor.scss"; body { background: var(--body-bg); --bs-border-color: var(--theme-bg-more-2); --bs-form-control-bg: var(--theme-bg-more-2); --bs-emphasis-color: var(--theme-fg-less-2); } .list-group { --bs-list-group-bg: var(--theme-bg-more); --bs-list-group-border-color: var(--theme-bg-more-2); --bs-list-group-border-width: 0; --bs-list-group-action-color: var(--bs-body-color); --bs-list-group-action-hover-color: var(--theme-fg); --bs-list-group-action-hover-bg: var(--theme-bg-more-2); --bs-list-group-action-active-color: var(--theme-fg); --bs-list-group-action-active-bg: var(--theme-bg-more-2); --bs-list-group-disabled-color: var(--bs-secondary-color); --bs-list-group-disabled-bg: var(--bs-body-bg); --bs-list-group-active-color: var(--bs-primary-color); --bs-list-group-active-bg: var(--bs-primary-bg); } .nav { --bs-nav-link-color: var(--theme-fg-more); --bs-nav-link-hover-color: var(--theme-fg-less); --bs-nav-link-disabled-color: var(--bs-gray); } .nav-tabs { --bs-nav-tabs-border-width: 2px; --bs-nav-tabs-border-radius: 0; --bs-nav-tabs-link-hover-border-color: var(--bs-body-bg); --bs-nav-tabs-border-color: var(--theme-fg); --bs-nav-tabs-link-active-color: var(--theme-fg); --bs-nav-tabs-link-active-bg: transparent; --bs-nav-tabs-link-active-border-color: transparent; } .nav-pills { --bs-nav-pills-border-radius: #{$nav-pills-border-radius}; --bs-nav-pills-link-active-color: var(--theme-primary-fg); --bs-nav-pills-link-active-bg: var(--theme-primary); } .nav-tabs { margin-bottom: 10px; border: none; &.nav-justified .nav-link { margin-right: 5px; } .nav-link { border: none; border-bottom: var(--bs-nav-tabs-border-width) solid transparent; text-transform: uppercase; font-weight: bold; padding: 5px 0; margin-right: 20px; uib-tab-heading > i { font-size: 18px; } &.disabled { color: var(--bs-nav-tabs-link-disabled-color); border-color: transparent; } } .nav-item:last-child .nav-link { margin-right: 0; } .nav-link.active, .nav-item.show .nav-link { color: var(--bs-nav-tabs-link-active-color); border-color: var(--bs-nav-tabs-border-color); } .nav-item { outline: none !important; } } .dropdown-menu { --bs-dropdown-bg: var(--theme-bg-more); } .progress { --bs-progress-height: 3px; } tab-body { terminal-toolbar { background: var(--bs-body-bg); .btn, .toolbar-pin-button { font-weight: bold; } } } @each $color, $value in $theme-colors { .btn-#{$color} { // 6c757d --bs-btn-bg: var(--theme-#{$color}); --bs-btn-border-color: var(--theme-#{$color}); --bs-btn-disabled-bg: var(--theme-#{$color}); --bs-btn-disabled-border-color: var(--theme-#{$color}); --bs-btn-hover-border-color: var(--theme-#{$color}-less); --bs-btn-hover-bg: var(--theme-#{$color}-less); --bs-btn-active-border-color: var(--theme-#{$color}); --bs-btn-active-bg: var(--theme-#{$color}-active-bg); --bs-btn-focus-shadow-rgb: 130, 138, 145; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); --bs-btn-color: var(--theme-#{$color}-fg); --bs-btn-hover-color: var(--theme-#{$color}-fg); --bs-btn-active-color: var(--theme-#{$color}-active-fg); --bs-btn-disabled-color: var(--theme-#{$color}-fg); } .alert-#{$color} { --bs-alert-bg: var(--theme-#{$color}-fg); --bs-alert-border-color: var(--theme-#{$color}-more); --bs-alert-color: var(--theme-#{$color}); } } multi-hotkey-input { .item { background: var(--theme-bg-more); border: 1px solid var(--bs-primary); border-radius: 3px; margin-right: 5px; .body { padding: 3px 0 2px; .stroke { padding: 0 6px; border-right: 1px solid var(--bs-body-bg); } } .remove { padding: 3px 8px 2px; } } .item:has(.duplicate) { background-color: var(--bs-danger); border: 1px solid var(--bs-danger); } .add { color: #777; padding: 4px 10px 0; } .add, .item .body, .item .remove { &:hover { background: var(--theme-bg-more); } &:active { background: var(--theme-bg-more-2); } } .add:has(.duplicate), .item:has(.duplicate) .body, .item:has(.duplicate) .remove { &:hover { background: var(--theme-danger-less); } &:active { background: var(--theme-danger-less-2); } } } hotkey-input-modal { .input { // background: $input-bg; padding: 10px; font-size: 24px; line-height: 27px; height: 55px; .stroke { background: var(--theme-bg-more); border: 1px solid var(--bs-primary); border-radius: 3px; margin-right: 10px; padding: 3px 10px; } } .timeout { background: $input-bg; div { background: $blue; } } } .mb-3 label { margin-bottom: 2px; } .btn { i + * { margin-left: 5px; } &.btn-lg i + * { margin-left: 10px; } } .input-group-addon + .form-control { border-left: none; } .input-group > select.form-control { flex-direction: row; } .list-group-item { // transition: 0.0625s background ease; i + * { margin-left: 10px; } } .list-group.list-group-flush .list-group-item { background: transparent; border: none; &:not(:last-child) { border-bottom: none; } } .list-group-light { .list-group-item { border: none !important; outline: none !important; background: transparent; border-radius: $border-radius; margin: 0 !important; &.active { background-color: var(--bs-list-group-active-bg); } } } .list-group-item svg { fill: var(--bs-body-color); fill-opacity: 0.75; } *::-webkit-scrollbar { background: rgba(0, 0, 0, .125); width: 10px; margin: 5px; } *::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, .25); } *::-webkit-scrollbar-corner, *::-webkit-resizer { opacity: 0; } search-panel { background: var(--theme-bg-more) !important; input { border-radius: 0 !important; } } .btn { cursor: pointer; justify-content: flex-start; overflow: hidden; &.disabled, &:disabled { cursor: not-allowed; } } .btn-link { text-decoration: none; } ngx-colors-panel .opened { background: var(--bs-body-bg) !important; button { color: var(--bs-body-color) !important; } .button svg { fill: white; } } .text-muted { opacity: .5; color: var(--theme-fg) !important; } .form-switch .form-check-input { --bs-form-switch-bg: inherit; border-color: var(--theme-bg-more); background-color: var(--theme-bg-more-2); &:checked { border-color: var(--theme-primary-more); background-color: var(--theme-primary); } } .form-control:focus { border-color: var(--theme-fg-more-2); } .accordion { --bs-accordion-bg: var(--theme-bg-more); --bs-accordion-active-color: var(--theme-fg); --bs-accordion-active-bg: var(--theme-bg-more-2); } start-page { background: var(--theme-bg-more-2); } split-tab-spanner { background: rgba(var(--bs-dark-rgb), .1); &:hover, &.active { background: rgba(var(--bs-dark-rgb), .2); } } window-controls { button svg { fill: var(--theme-fg) !important; } } ================================================ FILE: tabby-core/src/theme.ts ================================================ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import { Injectable } from '@angular/core' import { Theme } from './api' /** @hidden */ @Injectable({ providedIn: 'root' }) export class NewTheme extends Theme { name = _('Follow the color scheme') css = require('./theme.new.scss') terminalBackground = '#f7f1e0' followsColorScheme = true } ================================================ FILE: tabby-core/src/theme.vars.scss ================================================ $white: #fff; $gray-100: #f8f9fa; $gray-200: #e9ecef; $gray-300: #dee2e6; $gray-400: #ced4da; $gray-500: #adb5bd; $gray-600: #6c757d; $gray-700: #495057; $gray-800: #343a40; $gray-900: #212529; $black: #000; $red: #d9534f !default; $orange: #f0ad4e !default; $yellow: #ffd500 !default; $green: #5cb85c !default; $blue: #0275d8 !default; $teal: #5bc0de !default; $pink: #ff5b77 !default; $purple: #613d7c !default; @import "~bootstrap/scss/functions"; $content-bg: rgba(39, 49, 60, 0.65); //#1D272D; $content-bg-solid: #1D272D; $table-bg: rgba(255,255,255,.025); $table-bg-hover: rgba(255,255,255,.05); $table-border-color: rgba(255,255,255,.1); $theme-colors: ( primary: $blue, secondary: #38434e, success: $green, info: $blue, warning: $orange, danger: $red, light: $gray-300, dark: #0e151d, rare: $purple ); $body-color: #ccc; $body-bg: #131d27; $body-bg2: #20333e; $font-family-sans-serif: "Source Sans Pro"; $font-family-monospace: "Source Code Pro"; $font-size-base: 14rem / 16; $font-size-lg: 1.28rem; $font-size-sm: .85rem; $line-height-base: 1.6; $border-radius: .4rem; $border-radius-lg: .6rem; $border-radius-sm: .2rem; // ----- $headings-color: #ced9e2; $headings-font-weight: lighter; $input-btn-padding-y: .3rem; $input-btn-padding-x: .9rem; $input-btn-line-height: 1.6; $input-btn-line-height-sm: 1.8; $input-btn-line-height-lg: 1.8; $btn-link-disabled-color: $gray-600; $btn-focus-box-shadow: none; $h4-font-size: 18px; $link-color: $gray-400; $link-hover-color: $white; $link-hover-decoration: none; $component-active-color: #4fadff; $component-active-bg: #0059a559; $list-group-bg: $table-bg; $list-group-border-color: transparent; $list-group-item-padding-y: 0.8rem; $list-group-item-padding-x: 1rem; $list-group-hover-bg: $table-bg-hover; $list-group-active-bg: rgba(255,255,255,.05); $list-group-active-color: $component-active-color; $list-group-active-border-color: translate; $list-group-action-color: $body-color; $list-group-action-hover-color: white; $list-group-action-active-color: $component-active-color; $list-group-action-active-bg: $list-group-active-bg; $alert-padding-y: 0.9rem; $alert-padding-x: 1.25rem; $input-box-shadow: none; $transition-base: all .15s ease-in-out; $transition-fade: opacity .1s linear; $transition-collapse: height .35s ease; $btn-transition: all .15s ease-in-out; $popover-bg: $body-bg; $popover-body-color: $body-color; $popover-header-bg: $table-bg-hover; $popover-header-color: $headings-color; $popover-arrow-color: $popover-bg; $popover-max-width: 360px; $btn-border-width: 2px; $input-bg: #181e23; $input-disabled-bg: #2e3235; $input-color: #ddd; $input-border-color: $input-bg; $input-border-width: 2px; $input-focus-bg: $input-bg; $input-focus-border-color: rgba(171, 171, 171, 0.61); $input-focus-color: $input-color; $input-btn-focus-color: var(--focus-color); $input-btn-focus-box-shadow: 0 0 0 2px $input-btn-focus-color; $input-group-addon-color: $input-color; $input-group-addon-bg: $input-bg; $input-group-addon-border-color: transparent; $input-group-btn-border-color: $input-bg; $nav-tabs-border-radius: 0; $nav-tabs-border-color: transparent; $nav-tabs-border-width: 2px; $nav-tabs-link-hover-border-color: transparent; $nav-tabs-link-active-color: #eee; $nav-tabs-link-active-bg: transparent; $nav-tabs-link-active-border-color: #eee; $navbar-padding-y: 0; $navbar-padding-x: 0; $dropdown-bg: $content-bg-solid; $dropdown-color: $body-color; $dropdown-border-width: 1px; $dropdown-box-shadow: 0 0 1rem rgba($black, .25), 0 1px 1px rgba($black, .12); $dropdown-header-color: $gray-500; $dropdown-link-color: $body-color; $dropdown-link-hover-color: #eee; $dropdown-link-hover-bg: rgba(255,255,255,.04); $dropdown-link-active-color: white; $dropdown-link-active-bg: rgba(0, 0, 0, .2); $dropdown-item-padding-y: 0.5rem; $dropdown-item-padding-x: 1.5rem; $code-color: $orange; $code-bg: rgba(0, 0, 0, .25); $code-padding-y: 3px; $code-padding-x: 5px; $pre-bg: $dropdown-bg; $pre-color: $dropdown-link-color; $badge-font-size: 0.75rem; $badge-font-weight: bold; $badge-padding-y: 4px; $badge-padding-x: 6px; $form-check-input-border: lighten($body-bg, 25%); $form-check-input-width: 1.4em; $form-switch-width: 2.5em; $form-switch-color: lighten($body-bg, 25%); $form-switch-focus-color: lighten($body-bg, 40%); $form-switch-checked-color: map-get($theme-colors, "primary"); $modal-content-bg: $content-bg-solid; $modal-content-border-color: $body-bg; $modal-header-border-width: 0; $modal-footer-border-color: #222; $modal-footer-border-width: 1px; $modal-content-border-width: 0; $progress-bg: $table-bg; $progress-height: 3px; $alert-bg-level: 9; $alert-border-level: 5; $alert-color-level: -5; $text-muted: rgba(255, 255, 255, 0.5); $card-bg: $list-group-bg; $tooltip-color: rgba(255, 255, 255, .75); $tooltip-bg: rgba(0, 0, 0, .75); $accordion-border-color: $list-group-border-color; $accordion-bg: $list-group-bg; $accordion-button-active-bg: $list-group-active-bg; $accordion-button-active-color: $list-group-active-color; $btn-close-color: $body-color; ================================================ FILE: tabby-core/src/theme.vendor.scss ================================================ // $alert-border-radius: 0; // @mixin border-radius ($r) {} @import "../../node_modules/ngx-toastr/toastr-bs5-alert.scss"; ================================================ FILE: tabby-core/src/utfSplitter.ts ================================================ const partials = [ [0b110, 5, 0], [0b1110, 4, 1], [0b11110, 3, 2], ] export class UTF8Splitter { private internal = Buffer.alloc(0) write (data: Buffer): Buffer { this.internal = Buffer.concat([this.internal, data]) let keep = 0 for (const [pattern, shift, maxOffset] of partials) { for (let offset = 0; offset < maxOffset + 1; offset++) { if (this.internal[this.internal.length - offset - 1] >> shift === pattern) { keep = Math.max(keep, offset + 1) } } } const result = this.internal.slice(0, this.internal.length - keep) this.internal = this.internal.slice(this.internal.length - keep) return result } flush (): Buffer { const result = this.internal this.internal = Buffer.alloc(0) return result } } ================================================ FILE: tabby-core/src/utils.ts ================================================ import * as os from 'os' import { NgZone } from '@angular/core' import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' export const WIN_BUILD_CONPTY_SUPPORTED = 17692 export const WIN_BUILD_CONPTY_STABLE = 18309 export const WIN_BUILD_WSL_EXE_DISTRO_FLAG = 17763 export const WIN_BUILD_FLUENT_BG_SUPPORTED = 17063 export function getWindows10Build (): number|undefined { return process.platform === 'win32' && parseFloat(os.release()) >= 10 ? parseInt(os.release().split('.')[2]) : undefined } export function isWindowsBuild (build: number): boolean { const b = getWindows10Build() return b !== undefined && b >= build } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types export function getCSSFontFamily (config: any): string { let fonts: string[] = config.terminal.font.split(',').map(x => x.trim().replaceAll('"', '')) if (config.terminal.fallbackFont) { fonts.push(config.terminal.fallbackFont) } fonts.push('monospace-fallback') fonts.push('monospace') fonts = fonts.map(x => `"${x}"`) return fonts.join(', ') } export function wrapPromise (zone: NgZone, promise: Promise): Promise { return new Promise((resolve, reject) => { promise.then(result => { zone.run(() => resolve(result)) }).catch(error => { zone.run(() => reject(error)) }) }) } export class ResettableTimeout { private id: any = null constructor (private fn: () => void, private timeout: number) {} set (timeout?: number): void { this.clear() this.id = setTimeout(this.fn, timeout ?? this.timeout) } clear (): void { if (this.id) { clearTimeout(this.id) } } } export const TAB_COLORS = [ { name: _('No color'), value: null }, { name: _('Blue'), value: '#0275d8' }, { name: _('Green'), value: '#5cb85c' }, { name: _('Orange'), value: '#f0ad4e' }, { name: _('Purple'), value: '#613d7c' }, { name: _('Red'), value: '#d9534f' }, { name: _('Yellow'), value: '#ffd500' }, ] export function serializeFunction Promise> (fn: T): T { let queue = Promise.resolve() return ((...args) => { const res = queue.then(() => fn(...args)) queue = res.catch(() => null) return res }) as T } ================================================ FILE: tabby-core/tsconfig.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist"], "compilerOptions": { "baseUrl": "src" } } ================================================ FILE: tabby-core/tsconfig.typings.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "compilerOptions": { "baseUrl": "src", "emitDeclarationOnly": true, "declaration": true, "declarationDir": "./typings", "paths": { "tabby-*": ["../../tabby-*"], "*": ["../../app/node_modules/*"] } } } ================================================ FILE: tabby-core/webpack.config.mjs ================================================ import * as path from 'path' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) import config from '../webpack.plugin.config.mjs' export default () => config({ name: 'core', dirname: __dirname, }) ================================================ FILE: tabby-electron/package.json ================================================ { "name": "tabby-electron", "version": "1.0.231-nightly.0", "description": "Electron-specific bindings", "keywords": [ "tabby-builtin-plugin" ], "main": "dist/index.js", "typings": "typings/index.d.ts", "scripts": { "build": "webpack --progress --color", "watch": "webpack --progress --color --watch" }, "files": [ "dist", "typings" ], "author": "Tabby Developers", "license": "MIT", "peerDependencies": { "@angular/core": "^15", "tabby-local": "*" }, "devDependencies": { "electron-promise-ipc": "^2.2.4", "ps-node": "^0.1.6", "ssh-config": "^5.0.0", "tmp-promise": "^3.0.2", "which": "^3.0.0", "winston": "^3.3.3" } } ================================================ FILE: tabby-electron/src/colorSchemes.ts ================================================ import * as fs from 'mz/fs' import * as path from 'path' import { Injectable } from '@angular/core' import { TerminalColorSchemeProvider, TerminalColorScheme } from 'tabby-terminal' /** @hidden */ @Injectable() export class HyperColorSchemes extends TerminalColorSchemeProvider { async getSchemes (): Promise { const pluginsPath = path.join(process.env.HOME!, '.hyper_plugins', 'node_modules') if (!await fs.exists(pluginsPath)) { return [] } const plugins = await fs.readdir(pluginsPath) const themes: TerminalColorScheme[] = [] plugins.forEach(plugin => { try { const module = (global as any).require(path.join(pluginsPath, plugin)) if (module.decorateConfig) { let config: any = {} try { config = module.decorateConfig({}) } catch { console.warn('Could not load Hyper theme:', plugin) return } if (config.colors) { themes.push({ name: plugin, foreground: config.foregroundColor, background: config.backgroundColor, cursor: config.cursorColor, colors: config.colors.black ? [ config.colors.black, config.colors.red, config.colors.green, config.colors.yellow, config.colors.blue, config.colors.magenta, config.colors.cyan, config.colors.white, config.colors.lightBlack, config.colors.lightRed, config.colors.lightGreen, config.colors.lightYellow, config.colors.lightBlue, config.colors.lightMagenta, config.colors.lightCyan, config.colors.lightWhite, ] : config.colors, }) } } } catch (err) { console.debug('Skipping Hyper plugin', plugin, err) } }) return themes } } ================================================ FILE: tabby-electron/src/config.ts ================================================ import { ConfigProvider, Platform } from 'tabby-core' /** @hidden */ export class ElectronConfigProvider extends ConfigProvider { platformDefaults = { [Platform.macOS]: { hotkeys: { 'toggle-window': ['Ctrl-Space'], 'new-window': ['⌘-N'], }, }, [Platform.Windows]: { hotkeys: { 'toggle-window': ['Ctrl-Space'], 'new-window': ['Ctrl-Shift-N'], }, }, [Platform.Linux]: { hotkeys: { 'toggle-window': ['Ctrl-Space'], 'new-window': ['Ctrl-Shift-N'], }, }, } defaults = {} } ================================================ FILE: tabby-electron/src/hotkeys.ts ================================================ import { Injectable } from '@angular/core' import { HotkeyDescription, HotkeyProvider, TranslateService } from 'tabby-core' /** @hidden */ @Injectable() export class ElectronHotkeyProvider extends HotkeyProvider { hotkeys: HotkeyDescription[] = [ { id: 'new-window', name: this.translate.instant('New window'), }, { id: 'toggle-window', name: this.translate.instant('Toggle terminal window'), }, ] constructor (private translate: TranslateService) { super() } async provide (): Promise { return this.hotkeys } } ================================================ FILE: tabby-electron/src/index.ts ================================================ import { NgModule } from '@angular/core' import { PlatformService, LogService, UpdaterService, DockingService, HostAppService, ThemesService, Platform, AppService, ConfigService, WIN_BUILD_FLUENT_BG_SUPPORTED, isWindowsBuild, HostWindowService, HotkeyProvider, ConfigProvider, FileProvider } from 'tabby-core' import { TerminalColorSchemeProvider, TerminalDecorator } from 'tabby-terminal' import { SFTPContextMenuItemProvider, SSHProfileImporter, AutoPrivateKeyLocator } from 'tabby-ssh' import { PTYInterface, ShellProvider, UACService } from 'tabby-local' import { auditTime } from 'rxjs' import { HyperColorSchemes } from './colorSchemes' import { ElectronPlatformService } from './services/platform.service' import { ElectronLogService } from './services/log.service' import { ElectronUpdaterService } from './services/updater.service' import { TouchbarService } from './services/touchbar.service' import { ElectronDockingService } from './services/docking.service' import { ElectronHostWindow } from './services/hostWindow.service' import { ElectronFileProvider } from './services/fileProvider.service' import { ElectronHostAppService } from './services/hostApp.service' import { ElectronService } from './services/electron.service' import { DockMenuService } from './services/dockMenu.service' import { ElectronUACService } from './services/uac.service' import { ElectronHotkeyProvider } from './hotkeys' import { ElectronConfigProvider } from './config' import { EditSFTPContextMenu } from './sftpContextMenu' import { OpenSSHImporter, PrivateKeyLocator, StaticFileImporter } from './sshImporters' import { ElectronPTYInterface } from './pty' import { PathDropDecorator } from './pathDrop' import { CmderShellProvider } from './shells/cmder' import { Cygwin32ShellProvider } from './shells/cygwin32' import { Cygwin64ShellProvider } from './shells/cygwin64' import { GitBashShellProvider } from './shells/gitBash' import { LinuxDefaultShellProvider } from './shells/linuxDefault' import { MacOSDefaultShellProvider } from './shells/macDefault' import { MSYS2ShellProvider } from './shells/msys2' import { POSIXShellsProvider } from './shells/posix' import { PowerShellCoreShellProvider } from './shells/powershellCore' import { WindowsDefaultShellProvider } from './shells/winDefault' import { WindowsStockShellsProvider } from './shells/windowsStock' import { WSLShellProvider } from './shells/wsl' import { VSDevToolsProvider } from './shells/vs' @NgModule({ providers: [ { provide: TerminalColorSchemeProvider, useClass: HyperColorSchemes, multi: true }, { provide: PlatformService, useExisting: ElectronPlatformService }, { provide: HostWindowService, useExisting: ElectronHostWindow }, { provide: HostAppService, useExisting: ElectronHostAppService }, { provide: LogService, useClass: ElectronLogService }, { provide: UpdaterService, useClass: ElectronUpdaterService }, { provide: DockingService, useClass: ElectronDockingService }, { provide: HotkeyProvider, useClass: ElectronHotkeyProvider, multi: true }, { provide: ConfigProvider, useClass: ElectronConfigProvider, multi: true }, { provide: FileProvider, useClass: ElectronFileProvider, multi: true }, { provide: SFTPContextMenuItemProvider, useClass: EditSFTPContextMenu, multi: true }, { provide: SSHProfileImporter, useExisting: OpenSSHImporter, multi: true }, { provide: SSHProfileImporter, useExisting: StaticFileImporter, multi: true }, { provide: AutoPrivateKeyLocator, useExisting: PrivateKeyLocator, multi: true }, { provide: ShellProvider, useClass: WindowsDefaultShellProvider, multi: true }, { provide: ShellProvider, useClass: MacOSDefaultShellProvider, multi: true }, { provide: ShellProvider, useClass: LinuxDefaultShellProvider, multi: true }, { provide: ShellProvider, useClass: WindowsStockShellsProvider, multi: true }, { provide: ShellProvider, useClass: PowerShellCoreShellProvider, multi: true }, { provide: ShellProvider, useClass: CmderShellProvider, multi: true }, { provide: ShellProvider, useClass: Cygwin32ShellProvider, multi: true }, { provide: ShellProvider, useClass: Cygwin64ShellProvider, multi: true }, { provide: ShellProvider, useClass: GitBashShellProvider, multi: true }, { provide: ShellProvider, useClass: POSIXShellsProvider, multi: true }, { provide: ShellProvider, useClass: MSYS2ShellProvider, multi: true }, { provide: ShellProvider, useClass: WSLShellProvider, multi: true }, { provide: ShellProvider, useClass: VSDevToolsProvider, multi: true }, { provide: UACService, useClass: ElectronUACService }, { provide: PTYInterface, useClass: ElectronPTYInterface }, { provide: TerminalDecorator, useClass: PathDropDecorator, multi: true }, // For WindowsDefaultShellProvider PowerShellCoreShellProvider, WSLShellProvider, WindowsStockShellsProvider, ], }) export default class ElectronModule { constructor ( private config: ConfigService, private hostApp: ElectronHostAppService, private electron: ElectronService, private hostWindow: ElectronHostWindow, touchbar: TouchbarService, docking: DockingService, themeService: ThemesService, app: AppService, dockMenu: DockMenuService, ) { config.ready$.toPromise().then(() => { touchbar.update() docking.dock() hostWindow.windowShown$.subscribe(() => { docking.dock() }) this.registerGlobalHotkey() this.updateVibrancy() this.updateWindowControlsColor() }) config.changed$.subscribe(() => { this.registerGlobalHotkey() }) themeService.themeChanged$.subscribe(theme => { if (hostApp.platform === Platform.macOS) { hostWindow.setTrafficLightPosition( theme.macOSWindowButtonsInsetX ?? 14, theme.macOSWindowButtonsInsetY ?? 11, ) } }) let lastProgress: number|null = null app.tabOpened$.subscribe(tab => { tab.progress$.pipe(auditTime(250)).subscribe(progress => { if (lastProgress === progress) { return } if (progress !== null) { hostWindow.setProgressBar(progress / 100.0) } else { hostWindow.setProgressBar(-1) } lastProgress = progress }) }) config.changed$.subscribe(() => { this.updateVibrancy() this.updateDarkMode() }) config.changed$.subscribe(() => this.updateWindowControlsColor()) config.ready$.toPromise().then(() => { dockMenu.update() }) } private registerGlobalHotkey () { let value = this.config.store.hotkeys['toggle-window'] || [] if (typeof value === 'string') { value = [value] } const specs: string[] = [] value.forEach((item: string | string[]) => { item = typeof item === 'string' ? [item] : item try { let electronKeySpec = item[0] electronKeySpec = electronKeySpec.replaceAll('Meta', 'Super') electronKeySpec = electronKeySpec.replaceAll('⌘', 'Command') electronKeySpec = electronKeySpec.replaceAll('⌥', 'Alt') electronKeySpec = electronKeySpec.replaceAll('-', '+') specs.push(electronKeySpec) } catch (err) { console.error('Could not register the global hotkey:', err) } }) this.electron.ipcRenderer.send('app:register-global-hotkey', specs) } private updateVibrancy () { let vibrancyType = this.config.store.appearance.vibrancyType if (this.hostApp.platform === Platform.Windows && !isWindowsBuild(WIN_BUILD_FLUENT_BG_SUPPORTED)) { vibrancyType = null } this.electron.ipcRenderer.send('window-set-vibrancy', this.config.store.appearance.vibrancy, vibrancyType) this.hostWindow.setOpacity(this.config.store.appearance.opacity) } private updateDarkMode () { const colorSchemeMode = this.config.store.appearance.colorSchemeMode this.electron.ipcRenderer.send('window-set-dark-mode', colorSchemeMode) } private updateWindowControlsColor () { // if windows and not using native frame, WCO does not exist, return. if (this.hostApp.platform === Platform.Windows && this.config.store.appearance.frame === 'native') { return } this.electron.ipcRenderer.send('window-set-window-controls-color', this.config.store.terminal.colorScheme) } } export { ElectronHostWindow, ElectronHostAppService, ElectronService } ================================================ FILE: tabby-electron/src/pathDrop.ts ================================================ import { Injectable } from '@angular/core' import { TerminalDecorator, BaseTerminalTabComponent } from 'tabby-terminal' import { webUtils } from 'electron' /** @hidden */ @Injectable() export class PathDropDecorator extends TerminalDecorator { attach (terminal: BaseTerminalTabComponent): void { setTimeout(() => { this.subscribeUntilDetached(terminal, terminal.frontend?.dragOver$.subscribe(event => { event.preventDefault() })) this.subscribeUntilDetached(terminal, terminal.frontend?.drop$.subscribe((event: DragEvent) => { for (const file of event.dataTransfer!.files as unknown as Iterable) { this.injectPath(terminal, webUtils.getPathForFile(file)) } event.preventDefault() })) }) } private injectPath (terminal: BaseTerminalTabComponent, path: string) { if (path.includes(' ')) { path = `"${path}"` } path = path.replaceAll('\\', '\\\\') terminal.sendInput(path + ' ') } } ================================================ FILE: tabby-electron/src/pty.ts ================================================ import * as psNode from 'ps-node' import { ipcRenderer } from 'electron' import { ChildProcess, PTYInterface, PTYProxy } from 'tabby-local' import { getWorkingDirectoryFromPID } from 'native-process-working-directory' /* eslint-disable block-scoped-var */ try { var macOSNativeProcessList = require('macos-native-processlist') // eslint-disable-line @typescript-eslint/no-var-requires, no-var } catch { } try { var windowsProcessTree = require('@tabby-gang/windows-process-tree') // eslint-disable-line @typescript-eslint/no-var-requires, no-var } catch { } export class ElectronPTYInterface extends PTYInterface { async spawn (...options: any[]): Promise { const id = ipcRenderer.sendSync('pty:spawn', ...options) return new ElectronPTYProxy(id) } async restore (id: string): Promise { if (ipcRenderer.sendSync('pty:exists', id)) { return new ElectronPTYProxy(id) } return null } } // eslint-disable-next-line @typescript-eslint/no-extraneous-class export class ElectronPTYProxy extends PTYProxy { private subscriptions: Map = new Map() private truePID: Promise constructor ( private id: string, ) { super() this.truePID = new Promise(async (resolve) => { let pid = await this.getPID() try { await new Promise(r => setTimeout(r, 2000)) // Retrieve any possible single children now that shell has fully started let processes = await this.getChildProcessesInternal(pid) while (pid && processes.length === 1) { if (!processes[0].pid) { break } pid = processes[0].pid processes = await this.getChildProcessesInternal(pid) } } finally { resolve(pid) } }) this.truePID = this.truePID.catch(() => this.getPID()) } getID (): string { return this.id } getTruePID (): Promise { return this.truePID } async getPID (): Promise { return ipcRenderer.sendSync('pty:get-pid', this.id) } subscribe (event: string, handler: (..._: any[]) => void): void { const key = `pty:${this.id}:${event}` const newHandler = (_event, ...args) => handler(...args) this.subscriptions.set(key, newHandler) ipcRenderer.on(key, newHandler) } ackData (length: number): void { ipcRenderer.send('pty:ack-data', this.id, length) } unsubscribeAll (): void { for (const k of this.subscriptions.keys()) { ipcRenderer.off(k, this.subscriptions.get(k)) } } async resize (columns: number, rows: number): Promise { ipcRenderer.send('pty:resize', this.id, columns, rows) } async write (data: Buffer): Promise { ipcRenderer.send('pty:write', this.id, data) } async kill (signal?: string): Promise { ipcRenderer.send('pty:kill', this.id, signal) } async getChildProcesses (): Promise { return this.getChildProcessesInternal(await this.getTruePID()) } async getChildProcessesInternal (truePID: number): Promise { if (process.platform === 'darwin') { const processes = await macOSNativeProcessList.getProcessList() return processes.filter(x => x.ppid === truePID).map(p => ({ pid: p.pid, ppid: p.ppid, command: p.name, })) } if (process.platform === 'win32') { return new Promise(resolve => { windowsProcessTree.getProcessTree(truePID, tree => { resolve(tree ? tree.children.map(child => ({ pid: child.pid, ppid: tree.pid, command: child.name, })) : []) }) }) } return new Promise((resolve, reject) => { psNode.lookup({ ppid: truePID }, (err, processes) => { if (err) { reject(err) return } resolve(processes as ChildProcess[]) }) }) } async getWorkingDirectory (): Promise { return getWorkingDirectoryFromPID(await this.getTruePID()) } } ================================================ FILE: tabby-electron/src/services/dockMenu.service.ts ================================================ import { NgZone, Injectable } from '@angular/core' import { ConfigService, HostAppService, Platform, ProfilesService, TranslateService } from 'tabby-core' import { ElectronService } from './electron.service' /** @hidden */ @Injectable({ providedIn: 'root' }) export class DockMenuService { appVersion: string private constructor ( config: ConfigService, private electron: ElectronService, private hostApp: HostAppService, private zone: NgZone, private profilesService: ProfilesService, private translate: TranslateService, ) { config.changed$.subscribe(() => this.update()) } async update (): Promise { const profiles = await this.profilesService.getProfiles() if (this.hostApp.platform === Platform.Windows) { this.electron.app.setJumpList([ { type: 'custom', name: this.translate.instant('Recent'), items: this.profilesService.getRecentProfiles().map((profile, index) => ({ type: 'task', program: process.execPath, args: `recent ${index}`, title: profile.name, iconPath: process.execPath, iconIndex: 0, })), }, { type: 'custom', name: this.translate.instant('Profiles'), items: profiles.map(profile => ({ type: 'task', program: process.execPath, args: `profile "${profile.name}"`, title: profile.name, iconPath: process.execPath, iconIndex: 0, })), }, ]) } if (this.hostApp.platform === Platform.macOS) { this.electron.app.dock?.setMenu(this.electron.Menu.buildFromTemplate( [ ...[...this.profilesService.getRecentProfiles(), ...profiles].map(profile => ({ label: profile.name, click: () => this.zone.run(async () => { this.profilesService.openNewTabForProfile(profile) }), })), { label: this.translate.instant('New Window'), click: () => this.zone.run(() => this.hostApp.newWindow()), }, ], )) } } } ================================================ FILE: tabby-electron/src/services/docking.service.ts ================================================ import { Injectable, NgZone, Inject } from '@angular/core' import type { Display } from 'electron' import { ConfigService, DockingService, Screen, PlatformService, BootstrapData, BOOTSTRAP_DATA } from 'tabby-core' import { ElectronService } from '../services/electron.service' import { ElectronHostWindow, Bounds } from './hostWindow.service' @Injectable() export class ElectronDockingService extends DockingService { constructor ( private electron: ElectronService, private config: ConfigService, private zone: NgZone, private hostWindow: ElectronHostWindow, platform: PlatformService, @Inject(BOOTSTRAP_DATA) private bootstrapData: BootstrapData, ) { super() this.screensChanged$.subscribe(() => this.repositionWindow()) platform.displayMetricsChanged$.subscribe(() => this.repositionWindow()) electron.ipcRenderer.on('host:displays-changed', () => { this.zone.run(() => this.screensChanged.next()) }) } dock (): void { const dockSide = this.config.store.appearance.dock if (dockSide === 'off' || !this.bootstrapData.isMainWindow) { this.hostWindow.setAlwaysOnTop(false) return } let display = this.electron.screen.getAllDisplays() .filter(x => x.id === this.config.store.appearance.dockScreen)[0] // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (!display) { display = this.getCurrentScreen() } const newBounds: Bounds = { x: 0, y: 0, width: 0, height: 0 } const fill = this.config.store.appearance.dockFill <= 1 ? this.config.store.appearance.dockFill : 1 const space = this.config.store.appearance.dockSpace <= 1 ? this.config.store.appearance.dockSpace : 1 const [minWidth, minHeight] = this.hostWindow.getWindow().getMinimumSize() if (dockSide === 'left' || dockSide === 'right') { newBounds.width = Math.max(minWidth, Math.round(fill * display.workArea.width)) newBounds.height = Math.round(display.workArea.height * space) } if (dockSide === 'top' || dockSide === 'bottom') { newBounds.width = Math.round(display.workArea.width * space) newBounds.height = Math.max(minHeight, Math.round(fill * display.workArea.height)) } if (dockSide === 'right') { newBounds.x = display.workArea.x + display.workArea.width - newBounds.width } else if (dockSide === 'left') { newBounds.x = display.workArea.x } else { newBounds.x = display.workArea.x + Math.round(display.workArea.width / 2 * (1 - space)) } if (dockSide === 'bottom') { newBounds.y = display.workArea.y + display.workArea.height - newBounds.height } else if (dockSide === 'top') { newBounds.y = display.workArea.y } else { newBounds.y = display.workArea.y + Math.round(display.workArea.height / 2 * (1 - space)) } const alwaysOnTop = this.config.store.appearance.dockAlwaysOnTop this.hostWindow.setAlwaysOnTop(alwaysOnTop) setImmediate(() => { this.hostWindow.setBounds(newBounds) }) } getScreens (): Screen[] { const primaryDisplayID = this.electron.screen.getPrimaryDisplay().id return this.electron.screen.getAllDisplays().sort((a, b) => a.bounds.x === b.bounds.x ? a.bounds.y - b.bounds.y : a.bounds.x - b.bounds.x, ).map((display, index) => { return { ...display, id: display.id, name: display.id === primaryDisplayID ? 'Primary Display' : `Display ${index + 1}`, } }) } private getCurrentScreen (): Display { return this.electron.screen.getDisplayNearestPoint(this.electron.screen.getCursorScreenPoint()) } private repositionWindow () { const [x, y] = this.hostWindow.getWindow().getPosition() for (const screen of this.electron.screen.getAllDisplays()) { const bounds = screen.bounds if (x >= bounds.x && x <= bounds.x + bounds.width && y >= bounds.y && y <= bounds.y + bounds.height) { return } } const screen = this.electron.screen.getPrimaryDisplay() this.hostWindow.getWindow().setPosition(screen.bounds.x, screen.bounds.y) } } ================================================ FILE: tabby-electron/src/services/electron.service.ts ================================================ import { Injectable } from '@angular/core' import { App, IpcRenderer, Shell, Dialog, Clipboard, GlobalShortcut, Screen, AutoUpdater, TouchBar, BrowserWindow, Menu, MenuItem, PowerSaveBlocker, NativeTheme } from 'electron' import * as remote from '@electron/remote' export interface MessageBoxResponse { response: number checkboxChecked?: boolean } @Injectable({ providedIn: 'root' }) export class ElectronService { app: App ipcRenderer: IpcRenderer shell: Shell dialog: Dialog clipboard: Clipboard globalShortcut: GlobalShortcut screen: Screen process: any autoUpdater: AutoUpdater powerSaveBlocker: PowerSaveBlocker nativeTheme: NativeTheme TouchBar: typeof TouchBar BrowserWindow: typeof BrowserWindow Menu: typeof Menu MenuItem: typeof MenuItem /** @hidden */ private constructor () { const electron = require('electron') this.shell = electron.shell this.clipboard = electron.clipboard this.ipcRenderer = electron.ipcRenderer this.process = remote.getGlobal('process') this.app = remote.app this.screen = remote.screen this.dialog = remote.dialog this.globalShortcut = remote.globalShortcut this.autoUpdater = remote.autoUpdater this.powerSaveBlocker = remote.powerSaveBlocker this.TouchBar = remote.TouchBar this.BrowserWindow = remote.BrowserWindow this.Menu = remote.Menu this.MenuItem = remote.MenuItem this.nativeTheme = remote.nativeTheme } } ================================================ FILE: tabby-electron/src/services/fileProvider.service.ts ================================================ import { promises as fs } from 'fs' import { Injectable } from '@angular/core' import { FileProvider } from 'tabby-core' import { ElectronService } from '../services/electron.service' import { ElectronHostWindow } from './hostWindow.service' @Injectable() export class ElectronFileProvider extends FileProvider { name = 'Filesystem' constructor ( private electron: ElectronService, private hostWindow: ElectronHostWindow, ) { super() } async selectAndStoreFile (description: string): Promise { const result = await this.electron.dialog.showOpenDialog( this.hostWindow.getWindow(), { buttonLabel: `Select ${description}`, properties: ['openFile', 'treatPackageAsDirectory'], }, ) if (result.canceled || !result.filePaths.length) { throw new Error('canceled') } return `file://${result.filePaths[0]}` } async retrieveFile (key: string): Promise { if (key.startsWith('file://')) { key = key.substring('file://'.length) } else if (key.includes('://')) { throw new Error('Incorrect type') } return fs.readFile(key, { encoding: null }) } } ================================================ FILE: tabby-electron/src/services/hostApp.service.ts ================================================ import { Injectable, NgZone, Injector } from '@angular/core' import { isWindowsBuild, WIN_BUILD_FLUENT_BG_SUPPORTED, HostAppService, Platform, CLIHandler } from 'tabby-core' import { ElectronService } from '../services/electron.service' @Injectable({ providedIn: 'root' }) export class ElectronHostAppService extends HostAppService { get platform (): Platform { return this.configPlatform } get configPlatform (): Platform { return { win32: Platform.Windows, darwin: Platform.macOS, linux: Platform.Linux, }[process.platform] } constructor ( private zone: NgZone, private electron: ElectronService, injector: Injector, ) { super(injector) electron.ipcRenderer.on('host:preferences-menu', () => this.zone.run(() => this.settingsUIRequest.next())) electron.ipcRenderer.on('cli', (_$event, argv: any, cwd: string, secondInstance: boolean) => this.zone.run(async () => { const event = { argv, cwd, secondInstance } this.logger.info('CLI arguments received:', event) const cliHandlers = injector.get(CLIHandler) as unknown as CLIHandler[] cliHandlers.sort((a, b) => b.priority - a.priority) let handled = false for (const handler of cliHandlers) { if (handled && handler.firstMatchOnly) { continue } if (await handler.handle(event)) { this.logger.info('CLI handler matched:', handler.constructor.name) handled = true } } })) electron.ipcRenderer.on('host:config-change', () => this.zone.run(() => { this.configChangeBroadcast.next() })) if (isWindowsBuild(WIN_BUILD_FLUENT_BG_SUPPORTED)) { electron.ipcRenderer.send('window-set-disable-vibrancy-while-dragging', true) } } newWindow (): void { this.electron.ipcRenderer.send('app:new-window') } async saveConfig (data: string): Promise { await this.electron.ipcRenderer.invoke('app:save-config', data) } emitReady (): void { this.electron.ipcRenderer.send('app:ready') } relaunch (): void { const isPortable = !!process.env.PORTABLE_EXECUTABLE_FILE if (isPortable) { this.electron.app.relaunch({ execPath: process.env.PORTABLE_EXECUTABLE_FILE }) } else { let args: string[] = [] if (this.platform === Platform.Linux) { args = ['--no-sandbox'] } this.electron.app.relaunch({ args }) } this.electron.app.exit() } quit (): void { this.logger.info('Quitting') this.electron.app.quit() } } ================================================ FILE: tabby-electron/src/services/hostWindow.service.ts ================================================ import type { BrowserWindow, TouchBar } from 'electron' import { Injectable, Inject, NgZone } from '@angular/core' import { BootstrapData, BOOTSTRAP_DATA, HostWindowService } from 'tabby-core' import { ElectronService } from '../services/electron.service' export interface Bounds { x: number y: number width: number height: number } @Injectable({ providedIn: 'root' }) export class ElectronHostWindow extends HostWindowService { get isFullscreen (): boolean { return this._isFullscreen } private _isFullscreen = false private _isMaximized = false constructor ( zone: NgZone, private electron: ElectronService, @Inject(BOOTSTRAP_DATA) private bootstrapData: BootstrapData, ) { super() electron.ipcRenderer.on('host:window-enter-full-screen', () => zone.run(() => { this._isFullscreen = true })) electron.ipcRenderer.on('host:window-leave-full-screen', () => zone.run(() => { this._isFullscreen = false })) electron.ipcRenderer.on('host:window-shown', () => zone.run(() => this.windowShown.next())) electron.ipcRenderer.on('host:window-close-request', () => zone.run(() => { this.windowCloseRequest.next() })) electron.ipcRenderer.on('host:window-moved', () => zone.run(() => { this.windowMoved.next() })) electron.ipcRenderer.on('host:window-focused', () => zone.run(() => { this.windowFocused.next() })) electron.ipcRenderer.on('host:became-main-window', () => zone.run(() => { this.bootstrapData.isMainWindow = true })) electron.ipcRenderer.on('host:window-maximized', () => zone.run(() => { this._isMaximized = true })) electron.ipcRenderer.on('host:window-unmaximized', () => zone.run(() => { this._isMaximized = false })) this._isMaximized = this.getWindow().isMaximized() } getWindow (): BrowserWindow { return this.electron.BrowserWindow.fromId(this.bootstrapData.windowID)! } openDevTools (): void { this.getWindow().webContents.openDevTools({ mode: 'undocked' }) } reload (): void { this.getWindow().reload() } setTitle (title?: string): void { this.electron.ipcRenderer.send('window-set-title', title ?? 'Tabby') } toggleFullscreen (): void { this.getWindow().setFullScreen(!this._isFullscreen) } minimize (): void { this.electron.ipcRenderer.send('window-minimize') } isMaximized (): boolean { return this._isMaximized } toggleMaximize (): void { if (this.getWindow().isMaximized()) { this.getWindow().unmaximize() } else { this.getWindow().maximize() } } close (): void { this.electron.ipcRenderer.send('window-close') } setBounds (bounds: Bounds): void { this.electron.ipcRenderer.send('window-set-bounds', bounds) } setAlwaysOnTop (flag: boolean): void { this.electron.ipcRenderer.send('window-set-always-on-top', flag) } setTouchBar (touchBar: TouchBar): void { this.getWindow().setTouchBar(touchBar) } setTrafficLightPosition (x: number, y: number): void { this.electron.ipcRenderer.send('window-set-traffic-light-position', x, y) } setOpacity (opacity: number): void { this.electron.ipcRenderer.send('window-set-opacity', opacity) } setProgressBar (value: number): void { this.electron.ipcRenderer.send('window-set-progress-bar', value) } bringToFront (): void { this.electron.ipcRenderer.send('window-bring-to-front') } } ================================================ FILE: tabby-electron/src/services/log.service.ts ================================================ import * as fs from 'fs' import * as path from 'path' import * as winston from 'winston' import { Injectable } from '@angular/core' import { ConsoleLogger, Logger } from 'tabby-core' import { ElectronService } from '../services/electron.service' const initializeWinston = (electron: ElectronService) => { const logDirectory = electron.app.getPath('userData') // eslint-disable-next-line const winston = require('winston') if (!fs.existsSync(logDirectory)) { fs.mkdirSync(logDirectory) } return winston.createLogger({ transports: [ new winston.transports.File({ level: 'debug', filename: path.join(logDirectory, 'log.txt'), format: winston.format.simple(), handleExceptions: false, maxsize: 5242880, maxFiles: 5, }), ], exitOnError: false, }) } export class WinstonAndConsoleLogger extends ConsoleLogger { constructor (private winstonLogger: winston.Logger, name: string) { super(name) } protected doLog (level: string, ...args: any[]): void { super.doLog(level, ...args) this.winstonLogger[level](...args) } } @Injectable({ providedIn: 'root' }) export class ElectronLogService { private log: winston.Logger /** @hidden */ constructor (electron: ElectronService) { this.log = initializeWinston(electron) } create (name: string): Logger { return new WinstonAndConsoleLogger(this.log, name) } } ================================================ FILE: tabby-electron/src/services/platform.service.ts ================================================ import * as path from 'path' import * as fs from 'fs/promises' import * as fsSync from 'fs' import * as os from 'os' import promiseIpc, { RendererProcessType } from 'electron-promise-ipc' import { execFile } from 'mz/child_process' import { Injectable, NgZone } from '@angular/core' import { PlatformService, ClipboardContent, Platform, MenuItemOptions, MessageBoxOptions, MessageBoxResult, DirectoryUpload, FileUpload, FileDownload, DirectoryDownload, FileUploadOptions, wrapPromise, TranslateService, FileTransfer, PlatformTheme } from 'tabby-core' import { ElectronService } from '../services/electron.service' import { ElectronHostWindow } from './hostWindow.service' import { ShellIntegrationService } from './shellIntegration.service' import { ElectronHostAppService } from './hostApp.service' import { configPath } from '../../../app/lib/config' const fontManager = require('fontmanager-redux') // eslint-disable-line /* eslint-disable block-scoped-var */ try { // eslint-disable-next-line no-var var windowsProcessTreeNative = require('@tabby-gang/windows-process-tree/build/Release/windows_process_tree.node') // eslint-disable-next-line no-var var wnr = require('windows-native-registry') } catch { } @Injectable({ providedIn: 'root' }) export class ElectronPlatformService extends PlatformService { supportsWindowControls = true private configPath: string constructor ( private hostApp: ElectronHostAppService, private hostWindow: ElectronHostWindow, private electron: ElectronService, private zone: NgZone, private shellIntegration: ShellIntegrationService, private translate: TranslateService, ) { super() this.configPath = configPath electron.ipcRenderer.on('host:display-metrics-changed', () => { this.zone.run(() => this.displayMetricsChanged.next()) }) electron.nativeTheme.on('updated', () => { this.zone.run(() => this.themeChanged.next(this.getTheme())) }) } async getAllFiles (dir: string, root: DirectoryUpload): Promise { const items = await fs.readdir(dir, { withFileTypes: true }) for (const item of items) { if (item.isDirectory()) { root.pushChildren(await this.getAllFiles(path.join(dir, item.name), new DirectoryUpload(item.name))) } else { const file = new ElectronFileUpload(path.join(dir, item.name), this.electron) root.pushChildren(file) await wrapPromise(this.zone, file.open()) this.fileTransferStarted.next(file) } } return root } readClipboard (): string { return this.electron.clipboard.readText() } setClipboard (content: ClipboardContent): void { require('@electron/remote').clipboard.write(content) } async installPlugin (name: string, version: string): Promise { await (promiseIpc as RendererProcessType).send('plugin-manager:install', name, version) } async uninstallPlugin (name: string): Promise { await (promiseIpc as RendererProcessType).send('plugin-manager:uninstall', name) } async isProcessRunning (name: string): Promise { if (this.hostApp.platform === Platform.Windows) { return new Promise(resolve => { windowsProcessTreeNative.getProcessList(list => { // eslint-disable-line block-scoped-var resolve(list.some(x => x.name === name)) }, 0) }) } else { throw new Error('Not supported') } } getWinSCPPath (): string|null { const key = wnr.getRegistryKey(wnr.HK.CR, 'WinSCP.Url\\DefaultIcon') if (key?.['']) { let detectedPath = key[''].value?.split(',')[0] detectedPath = detectedPath?.substring(1, detectedPath.length - 1) return detectedPath } return null } async exec (app: string, argv: string[]): Promise { await execFile(app, argv) } isShellIntegrationSupported (): boolean { return this.hostApp.platform !== Platform.Linux } async isShellIntegrationInstalled (): Promise { return this.shellIntegration.isInstalled() } async installShellIntegration (): Promise { await this.shellIntegration.install() } async uninstallShellIntegration (): Promise { await this.shellIntegration.remove() } async loadConfig (): Promise { if (fsSync.existsSync(this.configPath)) { return fs.readFile(this.configPath, 'utf8') } else { return '' } } async saveConfig (content: string): Promise { await this.hostApp.saveConfig(content) } getConfigPath (): string|null { return this.configPath } showItemInFolder (p: string): void { this.electron.shell.showItemInFolder(p) } openExternal (url: string): void { this.electron.shell.openExternal(url) } openPath (p: string): void { this.electron.shell.openPath(p) } getOSRelease (): string { return os.release() } getAppVersion (): string { return this.electron.app.getVersion() } async listFonts (): Promise { if (this.hostApp.platform === Platform.Windows || this.hostApp.platform === Platform.macOS) { let fonts = await new Promise(resolve => fontManager.getAvailableFonts(resolve)) fonts = fonts.map(x => x.family.trim()) return fonts } // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (this.hostApp.platform === Platform.Linux) { const stdout = (await execFile('fc-list', [':spacing=mono']))[0] const fonts = stdout.toString() .split('\n') .filter(x => !!x) .map(x => x.split(':')[1].trim()) .map(x => x.split(',')[0].trim()) fonts.sort() return fonts } return [] } popupContextMenu (menu: MenuItemOptions[], _event?: MouseEvent): void { this.electron.Menu.buildFromTemplate(menu.map(item => this.rewrapMenuItemOptions(item))).popup({}) } rewrapMenuItemOptions (menu: MenuItemOptions): MenuItemOptions { return { ...menu, click: () => { this.zone.run(() => { menu.click?.() }) }, submenu: menu.submenu ? menu.submenu.map(x => this.rewrapMenuItemOptions(x)) : undefined, } } async showMessageBox (options: MessageBoxOptions): Promise { return this.electron.dialog.showMessageBox(this.hostWindow.getWindow(), options) } quit (): void { this.electron.app.exit(0) } async startUpload (options?: FileUploadOptions, paths?: string[]): Promise { options ??= { multiple: false } const properties: any[] = ['openFile', 'treatPackageAsDirectory'] if (options.multiple) { properties.push('multiSelections') } if (!paths) { const result = await this.electron.dialog.showOpenDialog( this.hostWindow.getWindow(), { buttonLabel: this.translate.instant('Select'), properties, }, ) if (result.canceled) { return [] } paths = result.filePaths } return Promise.all(paths.map(async p => { const transfer = new ElectronFileUpload(p, this.electron) await wrapPromise(this.zone, transfer.open()) this.fileTransferStarted.next(transfer) return transfer })) } async startUploadDirectory (paths?: string[]): Promise { const properties: any[] = ['openFile', 'treatPackageAsDirectory', 'openDirectory'] if (!paths) { const result = await this.electron.dialog.showOpenDialog( this.hostWindow.getWindow(), { buttonLabel: this.translate.instant('Select'), properties, }, ) if (result.canceled) { return new DirectoryUpload() } paths = result.filePaths } const root = new DirectoryUpload() root.pushChildren(await this.getAllFiles(paths[0].split(path.sep).join(path.posix.sep), new DirectoryUpload(path.basename(paths[0])))) return root } async startDownload (name: string, mode: number, size: number, filePath?: string): Promise { if (!filePath) { const result = await this.electron.dialog.showSaveDialog( this.hostWindow.getWindow(), { defaultPath: name, }, ) if (!result.filePath) { return null } filePath = result.filePath } const transfer = new ElectronFileDownload(filePath, mode, size, this.electron) await wrapPromise(this.zone, transfer.open()) this.fileTransferStarted.next(transfer) return transfer } async startDownloadDirectory (name: string, estimatedSize?: number): Promise { const selectedFolder = await this.pickDirectory(this.translate.instant('Select destination folder for {name}', { name }), this.translate.instant('Download here')) if (!selectedFolder) { return null } let downloadPath = path.join(selectedFolder, name) let counter = 1 while (fsSync.existsSync(downloadPath)) { downloadPath = path.join(selectedFolder, `${name} (${counter})`) counter++ } const transfer = new ElectronDirectoryDownload(downloadPath, name, estimatedSize ?? 0, this.electron, this.zone) await wrapPromise(this.zone, transfer.open()) this.fileTransferStarted.next(transfer) return transfer } _registerFileTransfer (transfer: FileTransfer): void { this.fileTransferStarted.next(transfer) } setErrorHandler (handler: (_: any) => void): void { this.electron.ipcRenderer.on('uncaughtException', (_$event, err) => { handler(err) }) } async pickDirectory (title?: string, buttonLabel?: string): Promise { const result = await this.electron.dialog.showOpenDialog( this.hostWindow.getWindow(), { title, buttonLabel, properties: ['openDirectory', 'showHiddenFiles'], }, ) if (result.canceled || !result.filePaths.length) { return null } return result.filePaths[0] } getTheme (): PlatformTheme { if (this.electron.nativeTheme.shouldUseDarkColors) { return 'dark' } else { return 'light' } } } class ElectronFileUpload extends FileUpload { private size: number private mode: number private file: fs.FileHandle private buffer: Uint8Array private powerSaveBlocker = 0 constructor (private filePath: string, private electron: ElectronService) { super() this.buffer = new Uint8Array(256 * 1024) this.powerSaveBlocker = electron.powerSaveBlocker.start('prevent-app-suspension') } async open (): Promise { const stat = await fs.stat(this.filePath) this.size = stat.size this.mode = stat.mode this.setTotalSize(this.size) this.file = await fs.open(this.filePath, 'r') } getName (): string { return path.basename(this.filePath) } getMode (): number { return this.mode } getSize (): number { return this.size } async read (): Promise { const result = await this.file.read(this.buffer, 0, this.buffer.length, null) this.increaseProgress(result.bytesRead) if (this.getCompletedBytes() >= this.getSize()) { this.setCompleted(true) } return this.buffer.slice(0, result.bytesRead) } close (): void { this.electron.powerSaveBlocker.stop(this.powerSaveBlocker) this.file.close() } } class ElectronFileDownload extends FileDownload { private file: fs.FileHandle private powerSaveBlocker = 0 constructor ( private filePath: string, private mode: number, private size: number, private electron: ElectronService, ) { super() this.powerSaveBlocker = electron.powerSaveBlocker.start('prevent-app-suspension') this.setTotalSize(size) } async open (): Promise { this.file = await fs.open(this.filePath, 'w', this.mode) } getName (): string { return path.basename(this.filePath) } getSize (): number { return this.size } async write (buffer: Uint8Array): Promise { let pos = 0 while (pos < buffer.length) { const result = await this.file.write(buffer, pos, buffer.length - pos, null) this.increaseProgress(result.bytesWritten) pos += result.bytesWritten } if (this.getCompletedBytes() >= this.getSize()) { this.setCompleted(true) } } close (): void { this.electron.powerSaveBlocker.stop(this.powerSaveBlocker) this.file.close() } } class ElectronDirectoryDownload extends DirectoryDownload { private powerSaveBlocker = 0 constructor ( private basePath: string, private name: string, estimatedSize: number, private electron: ElectronService, private zone: NgZone, ) { super() this.powerSaveBlocker = electron.powerSaveBlocker.start('prevent-app-suspension') this.setTotalSize(estimatedSize) } async open (): Promise { await fs.mkdir(this.basePath, { recursive: true }) } getName (): string { return this.name } getSize (): number { return this.getTotalSize() } async createDirectory (relativePath: string): Promise { const fullPath = path.join(this.basePath, relativePath) await fs.mkdir(fullPath, { recursive: true }) } async createFile (relativePath: string, mode: number, size: number): Promise { const fullPath = path.join(this.basePath, relativePath) await fs.mkdir(path.dirname(fullPath), { recursive: true }) const fileDownload = new ElectronFileDownload(fullPath, mode, size, this.electron) await wrapPromise(this.zone, fileDownload.open()) return fileDownload } close (): void { this.electron.powerSaveBlocker.stop(this.powerSaveBlocker) } } ================================================ FILE: tabby-electron/src/services/shellIntegration.service.ts ================================================ import * as path from 'path' import * as fs from 'mz/fs' import { exec } from 'mz/child_process' import { Injectable } from '@angular/core' import { HostAppService, Platform } from 'tabby-core' import { ElectronService } from '../services/electron.service' /* eslint-disable block-scoped-var */ try { var wnr = require('windows-native-registry') // eslint-disable-line @typescript-eslint/no-var-requires, no-var } catch (_) { } @Injectable({ providedIn: 'root' }) export class ShellIntegrationService { private automatorWorkflows = ['Open Tabby here.workflow', 'Paste path into Tabby.workflow'] private automatorWorkflowsLocation: string private automatorWorkflowsDestination: string private registryKeys = [ { path: 'Software\\Classes\\Directory\\Background\\shell\\Tabby', value: 'Open Tabby here', command: 'open "%V"', }, { path: 'SOFTWARE\\Classes\\Directory\\shell\\Tabby', value: 'Open Tabby here', command: 'open "%V"', }, { path: 'Software\\Classes\\*\\shell\\Tabby', value: 'Paste path into Tabby', command: 'paste "%V"', }, ] private constructor ( private electron: ElectronService, private hostApp: HostAppService, ) { if (this.hostApp.platform === Platform.macOS) { this.automatorWorkflowsLocation = path.join( path.dirname(path.dirname(this.electron.app.getPath('exe'))), 'Resources', 'extras', 'automator-workflows', ) this.automatorWorkflowsDestination = path.join(process.env.HOME!, 'Library', 'Services') } this.updatePaths() } async isInstalled (): Promise { if (this.hostApp.platform === Platform.macOS) { return fs.exists(path.join(this.automatorWorkflowsDestination, this.automatorWorkflows[0])) } else if (this.hostApp.platform === Platform.Windows) { return !!wnr.getRegistryKey(wnr.HK.CU, this.registryKeys[0].path) } return true } async install (): Promise { const exe: string = process.env.PORTABLE_EXECUTABLE_FILE ?? this.electron.app.getPath('exe') if (this.hostApp.platform === Platform.macOS) { for (const wf of this.automatorWorkflows) { await exec(`cp -r "${this.automatorWorkflowsLocation}/${wf}" "${this.automatorWorkflowsDestination}"`) } } else if (this.hostApp.platform === Platform.Windows) { for (const registryKey of this.registryKeys) { wnr.createRegistryKey(wnr.HK.CU, registryKey.path) wnr.createRegistryKey(wnr.HK.CU, registryKey.path + '\\command') wnr.setRegistryValue(wnr.HK.CU, registryKey.path, '', wnr.REG.SZ, registryKey.value) wnr.setRegistryValue(wnr.HK.CU, registryKey.path, 'Icon', wnr.REG.SZ, exe) wnr.setRegistryValue(wnr.HK.CU, registryKey.path + '\\command', '', wnr.REG.SZ, exe + ' ' + registryKey.command) } if (wnr.getRegistryKey(wnr.HK.CU, 'Software\\Classes\\Directory\\Background\\shell\\Open Tabby here')) { wnr.deleteRegistryKey(wnr.HK.CU, 'Software\\Classes\\Directory\\Background\\shell\\Open Tabby here') } if (wnr.getRegistryKey(wnr.HK.CU, 'Software\\Classes\\*\\shell\\Paste path into Tabby')) { wnr.deleteRegistryKey(wnr.HK.CU, 'Software\\Classes\\*\\shell\\Paste path into Tabby') } } } async remove (): Promise { if (this.hostApp.platform === Platform.macOS) { for (const wf of this.automatorWorkflows) { await exec(`rm -rf "${this.automatorWorkflowsDestination}/${wf}"`) } } else if (this.hostApp.platform === Platform.Windows) { for (const registryKey of this.registryKeys) { wnr.deleteRegistryKey(wnr.HK.CU, registryKey.path) } } } private async updatePaths (): Promise { // Update paths in case of an update if (this.hostApp.platform === Platform.Windows) { if (await this.isInstalled()) { await this.install() } } } } ================================================ FILE: tabby-electron/src/services/touchbar.service.ts ================================================ import deepEqual from 'deep-equal' import { Subject, distinctUntilChanged, map } from 'rxjs' import { ipcRenderer } from 'electron' import { Injectable, NgZone } from '@angular/core' import { AppService, HostAppService, Platform } from 'tabby-core' /** @hidden */ @Injectable({ providedIn: 'root' }) export class TouchbarService { private touchbarState$ = new Subject() private constructor ( private app: AppService, private hostApp: HostAppService, private zone: NgZone, ) { if (this.hostApp.platform !== Platform.macOS) { return } app.tabsChanged$.subscribe(() => this.update()) app.activeTabChange$.subscribe(() => this.update()) app.tabOpened$.subscribe(tab => { tab.titleChange$.subscribe(() => this.update()) tab.activity$.pipe( map(x => !x || tab === app.activeTab), distinctUntilChanged(), ).subscribe(() => this.update()) }) ipcRenderer.on('touchbar-selection', (_event, index) => this.zone.run(() => { this.app.selectTab(this.app.tabs[index]) })) this.touchbarState$.pipe(distinctUntilChanged(deepEqual)).subscribe(state => { ipcRenderer.send('window-set-touch-bar', ...state) }) } update (): void { if (this.hostApp.platform !== Platform.macOS) { return } const tabSegments = this.app.tabs.map(tab => ({ label: this.shortenTitle(tab.title), hasActivity: this.app.activeTab !== tab && tab.hasActivity, })) this.touchbarState$.next([tabSegments, this.app.activeTab ? this.app.tabs.indexOf(this.app.activeTab) : undefined]) } private shortenTitle (title: string): string { if (title.length > 15) { title = title.substring(0, 15) + '...' } return title } } ================================================ FILE: tabby-electron/src/services/uac.service.ts ================================================ import { Injectable } from '@angular/core' import * as path from 'path' import { WIN_BUILD_CONPTY_SUPPORTED, isWindowsBuild } from 'tabby-core' import { SessionOptions, UACService } from 'tabby-local' import { ElectronService } from './electron.service' /** @hidden */ @Injectable() export class ElectronUACService extends UACService { constructor ( private electron: ElectronService, ) { super() this.isAvailable = isWindowsBuild(WIN_BUILD_CONPTY_SUPPORTED) } patchSessionOptionsForUAC (sessionOptions: SessionOptions): SessionOptions { let helperPath = path.join( path.dirname(this.electron.app.getPath('exe')), 'resources', 'extras', 'UAC.exe', ) if (process.env.TABBY_DEV) { helperPath = path.join( path.dirname(this.electron.app.getPath('exe')), '..', '..', '..', 'extras', 'UAC.exe', ) } const options = { ...sessionOptions } options.args = [options.command, ...options.args] options.command = helperPath return options } } ================================================ FILE: tabby-electron/src/services/updater.service.ts ================================================ import { Injectable } from '@angular/core' import axios from 'axios' import { Logger, LogService, ConfigService, UpdaterService, PlatformService, TranslateService } from 'tabby-core' import { ElectronService } from '../services/electron.service' const UPDATES_URL = 'https://api.github.com/repos/eugeny/tabby/releases/latest' @Injectable() export class ElectronUpdaterService extends UpdaterService { private logger: Logger private downloaded: Promise private electronUpdaterAvailable = true private updateURL: string constructor ( log: LogService, config: ConfigService, private translate: TranslateService, private platform: PlatformService, private electron: ElectronService, ) { super() this.logger = log.create('updater') if (process.platform === 'linux' || process.env.PORTABLE_EXECUTABLE_FILE) { this.electronUpdaterAvailable = false return } this.electron.ipcRenderer.on('updater:update-available', () => { this.logger.info('Update available') }) this.electron.ipcRenderer.on('updater:update-not-available', () => { this.logger.info('No updates') }) this.electron.ipcRenderer.on('updater:error', err => { this.logger.error(err) this.electronUpdaterAvailable = false }) this.downloaded = new Promise(resolve => { this.electron.ipcRenderer.once('updater:update-downloaded', () => resolve(true)) }) config.ready$.toPromise().then(() => { if (config.store.enableAutomaticUpdates && this.electronUpdaterAvailable && !process.env.TABBY_DEV) { this.logger.debug('Checking for updates') try { this.electron.ipcRenderer.send('updater:check-for-updates') } catch (e) { this.electronUpdaterAvailable = false this.logger.info('Electron updater unavailable, falling back', e) } } }) } async check (): Promise { if (this.electronUpdaterAvailable) { return new Promise((resolve, reject) => { // eslint-disable-next-line @typescript-eslint/init-declarations, prefer-const let cancel const onNoUpdate = () => { cancel() resolve(false) } const onUpdate = () => { cancel() resolve(this.downloaded) } const onError = (err) => { cancel() reject(err) } cancel = () => { this.electron.ipcRenderer.off('updater:error', onError) this.electron.ipcRenderer.off('updater:update-not-available', onNoUpdate) this.electron.ipcRenderer.off('updater:update-available', onUpdate) } this.electron.ipcRenderer.on('updater:error', onError) this.electron.ipcRenderer.on('updater:update-not-available', onNoUpdate) this.electron.ipcRenderer.on('updater:update-available', onUpdate) try { this.electron.ipcRenderer.send('updater:check-for-updates') } catch (e) { this.electronUpdaterAvailable = false this.logger.info('Electron updater unavailable, falling back', e) } }) this.electron.ipcRenderer.on('updater:update-available', () => { this.logger.info('Update available') }) this.electron.ipcRenderer.once('updater:update-not-available', () => { this.logger.info('No updates') }) } else { this.logger.debug('Checking for updates through fallback method.') const response = await axios.get(UPDATES_URL) const data = response.data const version = data.tag_name.substring(1) if (this.electron.app.getVersion() !== version) { this.logger.info('Update available') this.updateURL = data.html_url return true } this.logger.info('No updates') return false } return this.downloaded } async update (): Promise { if (!this.electronUpdaterAvailable) { await this.electron.shell.openExternal(this.updateURL) } else { if ((await this.platform.showMessageBox( { type: 'warning', message: this.translate.instant('Installing the update will close all tabs and restart Tabby.'), buttons: [ this.translate.instant('Update'), this.translate.instant('Cancel'), ], defaultId: 0, cancelId: 1, }, )).response === 0) { await this.downloaded this.electron.ipcRenderer.send('updater:quit-and-install') } } } } ================================================ FILE: tabby-electron/src/sftpContextMenu.ts ================================================ import * as tmp from 'tmp-promise' import * as path from 'path' import * as fs from 'fs' import { Subject, debounceTime, debounce } from 'rxjs' import { Injectable } from '@angular/core' import { MenuItemOptions, TranslateService } from 'tabby-core' import { SFTPFile, SFTPPanelComponent, SFTPContextMenuItemProvider, SFTPSession } from 'tabby-ssh' import { ElectronPlatformService } from './services/platform.service' /** @hidden */ @Injectable() export class EditSFTPContextMenu extends SFTPContextMenuItemProvider { weight = 0 constructor ( private translate: TranslateService, private platform: ElectronPlatformService, ) { super() } async getItems (item: SFTPFile, panel: SFTPPanelComponent): Promise { const items: MenuItemOptions[] = [ { click: () => this.platform.setClipboard({ text: item.fullPath, }), label: this.translate.instant('Copy full path'), }, ] if (!item.isDirectory) { items.push({ click: () => this.edit(item, panel.sftp), label: this.translate.instant('Edit locally'), }) } return items } private async edit (item: SFTPFile, sftp: SFTPSession) { const tempDir = (await tmp.dir({ unsafeCleanup: true })).path const tempPath = path.join(tempDir, item.name) const transfer = await this.platform.startDownload(item.name, item.mode, item.size, tempPath) if (!transfer) { return } await sftp.download(item.fullPath, transfer) this.platform.openPath(tempPath) const events = new Subject() fs.chmodSync(tempPath, 0o700) // skip the first burst of events setTimeout(() => { const watcher = fs.watch(tempPath, event => events.next(event)) events.pipe(debounceTime(1000), debounce(async event => { if (event === 'rename') { watcher.close() } const upload = await this.platform.startUpload({ multiple: false }, [tempPath]) if (!upload.length) { return } await sftp.upload(item.fullPath, upload[0]) await sftp.chmod(item.fullPath, item.mode) })).subscribe() watcher.on('close', () => events.complete()) sftp.closed$.subscribe(() => watcher.close()) }, 1000) } } ================================================ FILE: tabby-electron/src/shells/cmder.ts ================================================ import * as path from 'path' import { Injectable } from '@angular/core' import { HostAppService, Platform } from 'tabby-core' import { ShellProvider, Shell } from 'tabby-local' /** @hidden */ @Injectable() export class CmderShellProvider extends ShellProvider { constructor ( private hostApp: HostAppService, ) { super() } async provide (): Promise { if (this.hostApp.platform !== Platform.Windows) { return [] } if (!process.env.CMDER_ROOT) { return [] } return [ { id: 'cmder', name: 'Cmder', command: 'cmd.exe', args: [ '/k', path.join(process.env.CMDER_ROOT, 'vendor', 'init.bat'), ], icon: require('../icons/cmder.svg'), env: { TERM: 'cygwin', }, }, { id: 'cmderps', name: 'Cmder PowerShell', command: 'powershell.exe', args: [ '-ExecutionPolicy', 'Bypass', '-nologo', '-noprofile', '-noexit', '-command', `Invoke-Expression '. ''${path.join(process.env.CMDER_ROOT, 'vendor', 'profile.ps1')}'''`, ], icon: require('../icons/cmder-powershell.svg'), env: {}, }, ] } } ================================================ FILE: tabby-electron/src/shells/cygwin32.ts ================================================ import * as path from 'path' import { Injectable } from '@angular/core' import { HostAppService, Platform } from 'tabby-core' import { ShellProvider, Shell } from 'tabby-local' /* eslint-disable block-scoped-var */ try { var wnr = require('windows-native-registry') // eslint-disable-line @typescript-eslint/no-var-requires, no-var } catch { } /** @hidden */ @Injectable() export class Cygwin32ShellProvider extends ShellProvider { constructor ( private hostApp: HostAppService, ) { super() } async provide (): Promise { if (this.hostApp.platform !== Platform.Windows) { return [] } const cygwinPath = wnr.getRegistryValue(wnr.HK.LM, 'Software\\WOW6432Node\\Cygwin\\setup', 'rootdir') if (!cygwinPath) { return [] } return [{ id: 'cygwin32', name: 'Cygwin (32 bit)', command: path.join(cygwinPath, 'bin', 'bash.exe'), args: ['--login', '-i'], icon: require('../icons/cygwin.svg'), env: { TERM: 'cygwin', }, }] } } ================================================ FILE: tabby-electron/src/shells/cygwin64.ts ================================================ import * as path from 'path' import { Injectable } from '@angular/core' import { HostAppService, Platform } from 'tabby-core' import { ShellProvider, Shell } from 'tabby-local' /* eslint-disable block-scoped-var */ try { var wnr = require('windows-native-registry') // eslint-disable-line @typescript-eslint/no-var-requires, no-var } catch { } /** @hidden */ @Injectable() export class Cygwin64ShellProvider extends ShellProvider { constructor ( private hostApp: HostAppService, ) { super() } async provide (): Promise { if (this.hostApp.platform !== Platform.Windows) { return [] } const cygwinPath = wnr.getRegistryValue(wnr.HK.LM, 'Software\\Cygwin\\setup', 'rootdir') if (!cygwinPath) { return [] } return [{ id: 'cygwin64', name: 'Cygwin', command: path.join(cygwinPath, 'bin', 'bash.exe'), args: ['--login', '-i'], icon: require('../icons/cygwin.svg'), env: { TERM: 'cygwin', }, }] } } ================================================ FILE: tabby-electron/src/shells/gitBash.ts ================================================ import * as path from 'path' import { Injectable } from '@angular/core' import { Platform, ConfigService, HostAppService } from 'tabby-core' import { Shell } from 'tabby-local' import { WindowsBaseShellProvider } from './windowsBase' /* eslint-disable block-scoped-var */ try { var wnr = require('windows-native-registry') // eslint-disable-line @typescript-eslint/no-var-requires, no-var } catch { } /** @hidden */ @Injectable() export class GitBashShellProvider extends WindowsBaseShellProvider { // eslint-disable-next-line @typescript-eslint/no-useless-constructor constructor ( hostApp: HostAppService, config: ConfigService, ) { super(hostApp, config) } async provide (): Promise { if (this.hostApp.platform !== Platform.Windows) { return [] } let gitBashPath = wnr.getRegistryValue(wnr.HK.LM, 'Software\\GitForWindows', 'InstallPath') if (!gitBashPath) { gitBashPath = wnr.getRegistryValue(wnr.HK.CU, 'Software\\GitForWindows', 'InstallPath') } if (!gitBashPath) { return [] } return [{ id: 'git-bash', name: 'Git Bash', command: path.join(gitBashPath, 'bin', 'bash.exe'), args: ['--login', '-i'], icon: require('../icons/git-bash.svg'), env: this.getEnvironment(), }] } } ================================================ FILE: tabby-electron/src/shells/linuxDefault.ts ================================================ import * as fs from 'mz/fs' import { Injectable } from '@angular/core' import { HostAppService, Platform, LogService, Logger, TranslateService } from 'tabby-core' import { ShellProvider, Shell } from 'tabby-local' /** @hidden */ @Injectable() export class LinuxDefaultShellProvider extends ShellProvider { private logger: Logger constructor ( private hostApp: HostAppService, private translate: TranslateService, log: LogService, ) { super() this.logger = log.create('linuxDefaultShell') } async provide (): Promise { if (this.hostApp.platform !== Platform.Linux) { return [] } const line = (await fs.readFile('/etc/passwd', { encoding: 'utf-8' })) .split('\n').find(x => x.startsWith(`${process.env.LOGNAME}:`)) if (!line) { this.logger.warn('Could not detect user shell') return [{ id: 'default', name: this.translate.instant('User default'), command: '/bin/sh', env: {}, }] } else { return [{ id: 'default', name: this.translate.instant('User default'), command: line.split(':')[6], args: ['--login'], hidden: true, env: {}, }] } } } ================================================ FILE: tabby-electron/src/shells/macDefault.ts ================================================ import { Injectable } from '@angular/core' import promiseIpc, { RendererProcessType } from 'electron-promise-ipc' import { HostAppService, Platform, TranslateService } from 'tabby-core' import { ShellProvider, Shell } from 'tabby-local' /** @hidden */ @Injectable() export class MacOSDefaultShellProvider extends ShellProvider { private cachedShell?: string constructor ( private hostApp: HostAppService, private translate: TranslateService, ) { super() } async provide (): Promise { if (this.hostApp.platform !== Platform.macOS) { return [] } return [{ id: 'default', name: this.translate.instant('OS default'), command: await this.getDefaultShellCached(), args: ['--login'], hidden: true, env: {}, }] } private async getDefaultShellCached () { if (!this.cachedShell) { this.cachedShell = await this.getDefaultShell() } return this.cachedShell } private async getDefaultShell (): Promise { // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion return (promiseIpc as RendererProcessType).send('get-default-mac-shell') as Promise } } ================================================ FILE: tabby-electron/src/shells/msys2.ts ================================================ import * as fs from 'fs/promises' import * as path from 'path' import { Injectable } from '@angular/core' import { HostAppService, Platform } from 'tabby-core' import { ShellProvider, Shell } from 'tabby-local' /** @hidden */ @Injectable() export class MSYS2ShellProvider extends ShellProvider { constructor ( private hostApp: HostAppService, ) { super() } async provide (): Promise { if (this.hostApp.platform !== Platform.Windows) { return [] } const msys2Path = path.resolve(process.env.SystemRoot ?? 'C:\\Windows', '../msys64') try { await fs.access(msys2Path) } catch { return [] } let homePath: string|undefined = path.resolve(msys2Path, 'home', process.env.USERNAME!) try { await fs.access(msys2Path) } catch { homePath = undefined } const environments = ['msys', 'mingw64', 'clang64', 'ucrt64'] return environments.map(e => ({ id: `msys2-${e}`, name: `MSYS2 (${e.toUpperCase()})`, command: path.join(msys2Path, 'msys2_shell.cmd'), args: ['-defterm', '-here', '-no-start', '-' + e], icon: require('../icons/msys2.svg'), env: {}, cwd: homePath, })) } } ================================================ FILE: tabby-electron/src/shells/posix.ts ================================================ import * as fs from 'mz/fs' import slugify from 'slugify' import { Injectable } from '@angular/core' import { HostAppService, Platform } from 'tabby-core' import { ShellProvider, Shell } from 'tabby-local' /** @hidden */ @Injectable() export class POSIXShellsProvider extends ShellProvider { constructor ( private hostApp: HostAppService, ) { super() } async provide (): Promise { if (this.hostApp.platform === Platform.Windows) { return [] } let shellListPath = '/etc/shells' try { await fs.stat(shellListPath) } catch { // Solus Linux shellListPath = '/usr/share/defaults/etc/shells' } return (await fs.readFile(shellListPath, { encoding: 'utf-8' })) .split('\n') .map(x => x.trim()) .filter(x => x && !x.startsWith('#')) .map(x => ({ id: slugify(x), name: x.split('/').pop(), icon: 'fas fa-terminal', command: x, args: ['-l'], env: {}, })) } } ================================================ FILE: tabby-electron/src/shells/powershellCore.ts ================================================ import { Injectable } from '@angular/core' import { HostAppService, ConfigService, Platform } from 'tabby-core' import { Shell } from 'tabby-local' import { WindowsBaseShellProvider } from './windowsBase' /* eslint-disable block-scoped-var */ try { var wnr = require('windows-native-registry') // eslint-disable-line @typescript-eslint/no-var-requires, no-var } catch { } /** @hidden */ @Injectable() export class PowerShellCoreShellProvider extends WindowsBaseShellProvider { // eslint-disable-next-line @typescript-eslint/no-useless-constructor constructor ( hostApp: HostAppService, config: ConfigService, ) { super(hostApp, config) } async provide (): Promise { if (this.hostApp.platform !== Platform.Windows) { return [] } const pwshPath = wnr.getRegistryValue(wnr.HK.LM, 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\pwsh.exe', '') if (!pwshPath) { return [] } return [{ id: 'powershell-core', name: 'PowerShell Core', command: pwshPath, args: ['-nologo'], icon: require('../icons/powershell-core.svg'), env: this.getEnvironment(), }] } } ================================================ FILE: tabby-electron/src/shells/vs.ts ================================================ import * as path from 'path' import * as fs from 'fs/promises' import { Injectable } from '@angular/core' import { HostAppService, Platform } from 'tabby-core' import { ShellProvider, Shell } from 'tabby-local' /* eslint-disable quote-props */ const vsIconMap: Record = { '2017': require('../icons/vs2017.svg'), '2019': require('../icons/vs2019.svg'), '2022': require('../icons/vs2022.svg'), } /* eslint-enable quote-props */ /** @hidden */ @Injectable() export class VSDevToolsProvider extends ShellProvider { constructor ( private hostApp: HostAppService, ) { super() } async provide (): Promise { if (this.hostApp.platform !== Platform.Windows) { return [] } const x86ParentPath = path.join(process.env['programfiles(x86)'] ?? 'C:\\Program Files (x86)', 'Microsoft Visual Studio') const x64ParentPath = path.join(process.env['programfiles'] ?? 'C:\\Program Files', 'Microsoft Visual Studio') const result: Shell[] = [] for (const parentPath of [x86ParentPath, x64ParentPath]) { try { await fs.stat(parentPath) for (const version of await fs.readdir(parentPath)) { const bat = path.join(parentPath, version, 'Community\\Common7\\Tools\\VsDevCmd.bat') try { await fs.stat(bat) } catch { continue } result.push({ id: `vs-cmd-${version}`, name: `Developer Prompt for VS ${version}`, command: 'cmd.exe', args: ['/k', bat], icon: vsIconMap[version], env: {}, }) } } catch (_) { // Ignore } } return result // return [ // { // id: 'cmderps', // name: 'Cmder PowerShell', // command: 'powershell.exe', // args: [ // '-ExecutionPolicy', // 'Bypass', // '-nologo', // '-noprofile', // '-noexit', // '-command', // `Invoke-Expression '. ''${path.join(process.env.CMDER_ROOT, 'vendor', 'profile.ps1')}'''`, // ], // icon: require('../icons/cmder-powershell.svg'), // env: {}, // }, // ] } } ================================================ FILE: tabby-electron/src/shells/winDefault.ts ================================================ import { Injectable } from '@angular/core' import { HostAppService, Platform, TranslateService } from 'tabby-core' import { ShellProvider, Shell } from 'tabby-local' import { WSLShellProvider } from './wsl' import { PowerShellCoreShellProvider } from './powershellCore' import { WindowsStockShellsProvider } from './windowsStock' /** @hidden */ @Injectable() export class WindowsDefaultShellProvider extends ShellProvider { private providers: ShellProvider[] constructor ( psc: PowerShellCoreShellProvider, wsl: WSLShellProvider, stock: WindowsStockShellsProvider, private hostApp: HostAppService, private translate: TranslateService, ) { super() this.providers = [ psc, wsl, stock, ] } async provide (): Promise { if (this.hostApp.platform !== Platform.Windows) { return [] } // Figure out a sensible default const shellLists = await Promise.all(this.providers.map(x => x.provide())) for (const list of shellLists) { if (list.length) { const shell = list[list.length - 1] return [{ ...shell, id: 'default', name: this.translate.instant('OS default ({name})', shell), hidden: true, }] } } return [] } } ================================================ FILE: tabby-electron/src/shells/windowsBase.ts ================================================ import { ConfigService, HostAppService } from 'tabby-core' import { ShellProvider } from 'tabby-local' export abstract class WindowsBaseShellProvider extends ShellProvider { constructor ( protected hostApp: HostAppService, protected config: ConfigService, ) { super() } protected getEnvironment (): any { return { wt: { WT_SESSION: 0, }, cygwin: { TERM: 'cygwin', }, }[this.config.store.terminal.identification] ?? {} } } ================================================ FILE: tabby-electron/src/shells/windowsStock.ts ================================================ import * as path from 'path' import * as fs from 'fs/promises' import * as which from 'which' import { Injectable } from '@angular/core' import { HostAppService, Platform, ConfigService } from 'tabby-core' import { ElectronService } from '../services/electron.service' import { Shell } from 'tabby-local' import { WindowsBaseShellProvider } from './windowsBase' /** @hidden */ @Injectable() export class WindowsStockShellsProvider extends WindowsBaseShellProvider { constructor ( hostApp: HostAppService, config: ConfigService, private electron: ElectronService, ) { super(hostApp, config) } async provide (): Promise { if (this.hostApp.platform !== Platform.Windows) { return [] } let clinkPath = path.join( path.dirname(this.electron.app.getPath('exe')), 'resources', 'extras', 'clink', `clink_${process.arch}.exe`, ) if (process.env.TABBY_DEV) { clinkPath = path.join( path.dirname(this.electron.app.getPath('exe')), '..', '..', '..', 'extras', 'clink', `clink_${process.arch}.exe`, ) } return [ { id: 'clink', name: 'CMD (clink)', command: 'cmd.exe', args: ['/k', clinkPath, 'inject'], env: { // Tell clink not to emulate ANSI handling WT_SESSION: '0', }, icon: require('../icons/clink.svg'), }, { id: 'cmd', name: 'CMD (stock)', command: 'cmd.exe', env: {}, icon: require('../icons/cmd.svg'), }, { id: 'powershell', name: 'PowerShell', command: await this.getPowerShellPath(), args: ['-nologo'], icon: require('../icons/powershell.svg'), env: this.getEnvironment(), }, ] } private async getPowerShellPath () { for (const name of ['pwsh.exe', 'powershell.exe']) { if (await which(name, { nothrow: true })) { return name } } for (const psPath of [ `${process.env.USERPROFILE}\\AppData\\Local\\Microsoft\\WindowsApps\\pwsh.exe`, `${process.env.SystemRoot}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`, `${process.env.SystemRoot}\\System32\\powershell.exe`, (process.env.SystemRoot ?? 'C:\\Windows') + '\\powerhshell.exe', ]) { try { await fs.stat(psPath) return psPath } catch { } } return 'powershell.exe' } } ================================================ FILE: tabby-electron/src/shells/wsl.ts ================================================ import * as fs from 'mz/fs' import slugify from 'slugify' import { Injectable } from '@angular/core' import { HostAppService, Platform, isWindowsBuild, WIN_BUILD_WSL_EXE_DISTRO_FLAG } from 'tabby-core' import { ShellProvider, Shell } from 'tabby-local' /* eslint-disable block-scoped-var */ try { var wnr = require('windows-native-registry') // eslint-disable-line @typescript-eslint/no-var-requires, no-var } catch { } // WSL Distribution List // https://docs.microsoft.com/en-us/windows/wsl/install-win10#install-your-linux-distribution-of-choice /* eslint-disable quote-props */ const wslIconMap: Record = { 'Alpine': require('../icons/alpine.svg'), 'Debian': require('../icons/debian.svg'), 'kali-linux': require('../icons/kali.svg'), 'SLES-12': require('../icons/suse.svg'), 'openSUSE-Leap-15-1': require('../icons/suse.svg'), 'Ubuntu-16.04': require('../icons/ubuntu.svg'), 'Ubuntu-18.04': require('../icons/ubuntu.svg'), 'Ubuntu-22.04': require('../icons/ubuntu.svg'), 'Ubuntu': require('../icons/ubuntu.svg'), 'AlmaLinux-8': require('../icons/alma.svg'), 'OracleLinux_7_9': require('../icons/oracle-linux.svg'), 'OracleLinux_8_5': require('../icons/oracle-linux.svg'), 'openEuler': require('../icons/open-euler.svg'), 'Linux': require('../icons/linux.svg'), 'docker-desktop': require('../icons/docker.svg'), 'docker-desktop-data': require('../icons/docker.svg'), } /* eslint-enable quote-props */ /** @hidden */ @Injectable() export class WSLShellProvider extends ShellProvider { constructor ( private hostApp: HostAppService, ) { super() } async provide (): Promise { if (this.hostApp.platform !== Platform.Windows) { return [] } const bashPath = `${process.env.windir}\\system32\\bash.exe` const wslPath = `${process.env.windir}\\system32\\wsl.exe` const lxssPath = 'Software\\Microsoft\\Windows\\CurrentVersion\\Lxss' const lxss = wnr.getRegistryKey(wnr.HK.CU, lxssPath) const shells: Shell[] = [] if (lxss?.DefaultDistribution) { const defaultDistKey = wnr.getRegistryKey(wnr.HK.CU, lxssPath + '\\' + String(lxss.DefaultDistribution.value)) if (defaultDistKey?.DistributionName) { const shell: Shell = { id: 'wsl', name: 'WSL / Default distro', command: wslPath, env: { TERM: 'xterm-color', COLORTERM: 'truecolor', }, // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition icon: wslIconMap[defaultDistKey.DistributionName.value] ?? wslIconMap.Linux, } shells.push(shell) } } if (!lxss?.DefaultDistribution || !isWindowsBuild(WIN_BUILD_WSL_EXE_DISTRO_FLAG)) { if (await fs.exists(bashPath)) { return [{ id: 'wsl', name: 'WSL / Bash on Windows', icon: wslIconMap.Linux, command: bashPath, env: { TERM: 'xterm-color', COLORTERM: 'truecolor', }, }] } else { return [] } } for (const child of wnr.listRegistrySubkeys(wnr.HK.CU, lxssPath) as string[]) { const childKey = wnr.getRegistryKey(wnr.HK.CU, lxssPath + '\\' + child) if (!childKey.DistributionName || !childKey.BasePath) { continue } const wslVersion = (childKey.Flags?.value || 0) & 8 ? 2 : 1 const name = childKey.DistributionName.value const fsBase = wslVersion === 2 ? `\\\\wsl$\\${name}` : childKey.BasePath.value as string + '\\rootfs' const slug = slugify(name, { remove: /[:.]/g }) const shell: Shell = { id: `wsl-${slug}`, name: `WSL / ${name}`, command: wslPath, args: ['-d', name], fsBase, env: { TERM: 'xterm-color', COLORTERM: 'truecolor', }, // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition icon: wslIconMap[name] ?? wslIconMap.Linux, } shells.push(shell) } return shells } } ================================================ FILE: tabby-electron/src/sshImporters.ts ================================================ import * as fs from 'fs/promises' import * as fsSync from 'fs' import * as path from 'path' import * as glob from 'glob' import * as yaml from 'js-yaml' import { Injectable } from '@angular/core' import { PartialProfile } from 'tabby-core' import { SSHProfileImporter, PortForwardType, SSHProfile, AutoPrivateKeyLocator, ForwardedPortConfig, } from 'tabby-ssh' import { ElectronService } from './services/electron.service' import SSHConfig, { Directive, LineType } from 'ssh-config' // Enum to delineate the properties in SSHProfile options enum SSHProfilePropertyNames { Host = 'host', Port = 'port', User = 'user', X11 = 'x11', PrivateKeys = 'privateKeys', KeepaliveInterval = 'keepaliveInterval', KeepaliveCountMax = 'keepaliveCountMax', ReadyTimeout = 'readyTimeout', JumpHost = 'jumpHost', AgentForward = 'agentForward', ProxyCommand = 'proxyCommand', ForwardedPorts = 'forwardedPorts', } // Data structure to map the (lowercase) ssh-config attributes (as keys) to a tuple // containing the name of the corresponding SSHProfile attribute const decodeFields: Record = { hostname: SSHProfilePropertyNames.Host, user: SSHProfilePropertyNames.User, port: SSHProfilePropertyNames.Port, forwardx11: SSHProfilePropertyNames.X11, serveraliveinterval: SSHProfilePropertyNames.KeepaliveInterval, serveralivecountmax: SSHProfilePropertyNames.KeepaliveCountMax, connecttimeout: SSHProfilePropertyNames.ReadyTimeout, proxyjump: SSHProfilePropertyNames.JumpHost, forwardagent: SSHProfilePropertyNames.AgentForward, identityfile: SSHProfilePropertyNames.PrivateKeys, proxycommand: SSHProfilePropertyNames.ProxyCommand, localforward: SSHProfilePropertyNames.ForwardedPorts, remoteforward: SSHProfilePropertyNames.ForwardedPorts, dynamicforward: SSHProfilePropertyNames.ForwardedPorts, } // Function to use the above to return details corresponding to the supplied SSHProperty name. // If the name of the supplied SSH Config file Property is valid, and one that we process, // then we get back the name of the corresponding Property in the SSHProfile object function decodeTarget (SSHProperty: string): string { const lower = SSHProperty.toLowerCase() if (lower in decodeFields) { return decodeFields[lower] } return '' } // Function to combine SSHConfig values into a single string. This is used to smash // together the proxyCommand values which are split on whitespace and presented as // an array of objects in the SSHConfig object function convertSSHConfigValuesToString (arg: string | string[] | object[]): string { if (typeof arg === 'string') { return arg } let allStrings = true for (const item of arg) { if (typeof item !== 'string') { allStrings = false break } } if (allStrings) { return arg.join(' ') } // Have to explicitly unwrap the arg into a list of objects to avoid Typescript grumbles const objList: object[] = [] for (const item of arg) { if ( typeof item === 'object' && 'val' in item ) { objList.push(item) } } return objList.filter(obj => 'val' in obj) .map(obj => 'val' in obj ? obj.val as string: '') .join(' ') } // Function to read in the SSH config file recursively and parse any Include directives async function parseSSHConfigFile ( filePath: string, visited = new Set(), ): Promise { // If we've already processed this file, return an empty config to avoid infinite recursion if (visited.has(filePath)) { return SSHConfig.parse('') } visited.add(filePath) let raw = '' try { raw = await fs.readFile(filePath, 'utf8') } catch (err) { console.error(`Error reading SSH config file: ${filePath}`, err) return SSHConfig.parse('') } const parsed = SSHConfig.parse(raw) const merged = SSHConfig.parse('') for (const entry of parsed) { if (entry.type === LineType.DIRECTIVE && entry.param.toLowerCase() === 'include') { const directive = entry as Directive if (typeof directive.value !== 'string') { continue } // ssh_config(5) says "Files without absolute paths are assumed to be in ~/.ssh if included in a user configuration file or /etc/ssh if included from the system configuration file." let incPath = '' if (path.isAbsolute(directive.value)) { incPath = directive.value } else if (directive.value.startsWith('~')) { incPath = path.join(process.env.HOME ?? '~', directive.value.slice(1)) } else { incPath = path.join(process.env.HOME ?? '~', '.ssh', directive.value) } const matches = glob.sync(incPath) for (const match of matches) { const stat = await fs.stat(match) if (stat.isDirectory()) { continue } const matchedConfig = await parseSSHConfigFile(match, visited) merged.push(...matchedConfig) } } else { merged.push(entry) } } return merged } // Function to convert an SSH Profile name into a sha256 hash-based ID async function hashSSHProfileName (name: string) { const textEncoder = new TextEncoder() const encoded = textEncoder.encode(name) const hash = await crypto.subtle.digest('SHA-256', encoded) const hashArray = Array.from(new Uint8Array(hash)) return hashArray.map(b => b.toString(16).padStart(2, '0')).join('') } // Function to take an ssh-config entry and convert it into an SSHProfile async function convertHostToSSHProfile (host: string, settings: Record): Promise> { // inline function to generate an id for this profile const deriveID = async (name: string) => 'openssh-config:' + await hashSSHProfileName(name) // Start point of the profile, with an ID, name, type and group const thisProfile: PartialProfile = { id: await deriveID(host), name: `${host} (.ssh/config)`, type: 'ssh', group: 'Imported from .ssh/config', } const options = {} function convertToForwardedPortDescriptor (forwardType: PortForwardType.Local | PortForwardType.Remote | PortForwardType.Dynamic, details: string): ForwardedPortConfig { const detailsParts = details.split(/\s/) const bindParts = detailsParts[0].trim().split(':') if (bindParts.length === 1) { bindParts.unshift('127.0.0.1') } let tgtParts = ['', '22'] if ( detailsParts.length > 1 ) { tgtParts = detailsParts[1].trim().split(':') } return { host: bindParts[0], port: parseInt(bindParts[1]), targetAddress: tgtParts[0], targetPort: parseInt(tgtParts[1]), type: forwardType, description: details, } } // for each ssh-config key in turn... for (const key in settings) { // decode a target attribute and an action const targetName = decodeTarget(key) switch (targetName) { // The following have single string values case SSHProfilePropertyNames.User: case SSHProfilePropertyNames.Host: case SSHProfilePropertyNames.JumpHost: const basicString = settings[key] if (typeof basicString === 'string') { if (targetName === SSHProfilePropertyNames.JumpHost) { options[targetName] = await deriveID(basicString) } else { options[targetName] = basicString } } else { console.log('Unexpected value in settings for ' + key) } break // The following have single integer values case SSHProfilePropertyNames.Port: case SSHProfilePropertyNames.KeepaliveCountMax: const numberString = settings[key] if (typeof numberString === 'string') { options[targetName] = parseInt(numberString, 10) } else { console.log('Unexpected value in settings for ' + key) } break // KeepaliveInterval and ReadyTimeout are in seconds in SSH config but milliseconds in Tabby case SSHProfilePropertyNames.KeepaliveInterval: case SSHProfilePropertyNames.ReadyTimeout: const secondsString = settings[key] if (typeof secondsString === 'string') { const parsedSeconds = parseInt(secondsString, 10) if (!isNaN(parsedSeconds) && parsedSeconds >= 0) { options[targetName] = parsedSeconds * 1000 } else { console.log(`Invalid value for ${key}: "${secondsString}"`) } } else { console.log('Unexpected value in settings for ' + key) } break // The following have single yes/no values case SSHProfilePropertyNames.X11: case SSHProfilePropertyNames.AgentForward: let booleanString = settings[key] booleanString = typeof booleanString === 'string' ? booleanString.toLowerCase() : '' if ( booleanString === 'yes' || booleanString === 'no' ) { options[targetName] = booleanString === 'yes' } else { console.log('Unexpected value in settings for ' + key) } break // ProxyCommand will be an array if unquoted and containing multiple words, // or a simple string otherwise case SSHProfilePropertyNames.ProxyCommand: const proxyCommand = convertSSHConfigValuesToString(settings[key]) options[targetName] = proxyCommand break // IdentityFile may have multiple values and the need to have '~' converted to the // path to the HOME directory case SSHProfilePropertyNames.PrivateKeys: const processedKeys: string [] = (settings[key] as string[]).map( s => { let retVal: string = s if (s.startsWith('~/')) { retVal = path.join(process.env.HOME ?? '~', s.slice(2)) } return retVal }) options[targetName] = processedKeys break // The port forwarding directives all end up in the same space, but with a different value // in the SSHProfileOptions object case SSHProfilePropertyNames.ForwardedPorts: const forwardTypeString = key.toLowerCase() let forwardType: PortForwardType | null = null switch (forwardTypeString) { case 'localforward': forwardType = PortForwardType.Local break case 'remoteforward': forwardType = PortForwardType.Remote break case 'dynamicforward': forwardType = PortForwardType.Dynamic break } if (forwardType) { options[targetName] ??= [] for (const forwarderDetails of settings[key]) { if (typeof forwarderDetails === 'string') { options[targetName].push(convertToForwardedPortDescriptor(forwardType, forwarderDetails)) } } } break } } thisProfile.options = options return thisProfile } async function convertToSSHProfiles (config: SSHConfig): Promise[]> { const myMap = new Map>() function noWildCardsInName (name: string) { return !/[?*]/.test(name) } for (const entry of config) { // Each entry represents a line in the SSH Config. If the line is a 'Host' line, // then it will also contain the configuration for that identifiable Host. // There may be more than one host per line and some 'Hosts' have wildcards in their // names // If this is a genuine entry rather than a Comment... // ... and there is a 'Host' Parameter if (entry.type === LineType.DIRECTIVE && entry.param === 'Host') { // for each Name in this entry const hostList: string[] = [] // if there is more than one host specified on this line, then the names will be // in an array if (typeof entry.value === 'string') { hostList.push(entry.value) } else if (Array.isArray(entry.value)) { for (const item of entry.value) { hostList.push(item.val) } } // for each Host identified on this line, check that there are no wildcards in the // name and that we've not seen the name before. // If that is the case, then get the full configuration for this name. // If that has a 'Hostname' property (if that's missing, the name is not usable // for our purposes) then convert the configuration into an SSHProfile and stash it for (const host of hostList) { if (noWildCardsInName(host)) { if (!(host in myMap)) { // NOTE: SSHConfig.compute() lies about the return types const configuration: Record = config.compute(host) if (Object.keys(configuration).map(key => key.toLowerCase()).includes('hostname')) { myMap[host] = await convertHostToSSHProfile(host, configuration) } } } } } } // Convert the values from the map into a list of Partial SSHProfiles sorted // by Hostname return Object.keys(myMap).sort().map(key => myMap[key]) } @Injectable({ providedIn: 'root' }) export class OpenSSHImporter extends SSHProfileImporter { async getProfiles (): Promise[]> { const configPath = path.join(process.env.HOME ?? '~', '.ssh', 'config') try { const config: SSHConfig = await parseSSHConfigFile(configPath) return await convertToSSHProfiles(config) } catch (e) { if (e.code === 'ENOENT') { return [] } throw e } } } @Injectable({ providedIn: 'root' }) export class StaticFileImporter extends SSHProfileImporter { private configPath: string constructor ( electron: ElectronService, ) { super() this.configPath = path.join(electron.app.getPath('userData'), 'ssh-profiles.yaml') } async getProfiles (): Promise[]> { const deriveID = async name => 'file-config:' + await hashSSHProfileName(name) if (!fsSync.existsSync(this.configPath)) { return [] } const content = await fs.readFile(this.configPath, 'utf8') if (!content) { return [] } return Promise.all((yaml.load(content) as PartialProfile[]).map(async item => ({ ...item, id: await deriveID(item.name), type: 'ssh', }))) } } @Injectable({ providedIn: 'root' }) export class PrivateKeyLocator extends AutoPrivateKeyLocator { async getKeys (): Promise<[string, Buffer][]> { const results: [string, Buffer][] = [] const keysPath = path.join(process.env.HOME!, '.ssh') if (!fsSync.existsSync(keysPath)) { return results } for (const file of await fs.readdir(keysPath)) { if (/^id_[\w\d]+$/.test(file)) { const privateKeyContents = await fs.readFile( path.join(keysPath, file), { encoding: null }, ) results.push([file, privateKeyContents]) } } return results } } ================================================ FILE: tabby-electron/tsconfig.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist"], "compilerOptions": { "baseUrl": "src" } } ================================================ FILE: tabby-electron/tsconfig.typings.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "compilerOptions": { "baseUrl": "src", "emitDeclarationOnly": true, "declaration": true, "declarationDir": "./typings", "paths": { "tabby-*": ["../../tabby-*"], "*": ["../../app/node_modules/*"] } } } ================================================ FILE: tabby-electron/webpack.config.mjs ================================================ import * as path from 'path' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) import config from '../webpack.plugin.config.mjs' export default () => config({ name: 'electron', dirname: __dirname, }) ================================================ FILE: tabby-linkifier/README.md ================================================ # Tabby Linkifier Plugin This plugin makes URLs, IPs and file paths in the terminal clickable and adds a context menu that allows quickly copying them. ================================================ FILE: tabby-linkifier/package.json ================================================ { "name": "tabby-linkifier", "version": "1.0.231-nightly.0", "description": "Makes URLs, IPs and file paths clickable in Tabby", "keywords": [ "tabby-builtin-plugin" ], "main": "dist/index.js", "typings": "typings/index.d.ts", "scripts": { "build": "webpack --progress --color --display-modules", "watch": "webpack --progress --color --watch" }, "files": [ "dist", "typings" ], "author": "Tabby Developers", "license": "MIT", "devDependencies": { "@xterm/addon-web-links": "^0.10.0", "untildify": "^4.0.0" } } ================================================ FILE: tabby-linkifier/src/api.ts ================================================ import { BaseTerminalTabComponent } from 'tabby-terminal' export abstract class LinkHandler { regex: RegExp priority = 1 convert (uri: string, _tab?: BaseTerminalTabComponent): Promise|string { return uri } verify (_uri: string, _tab?: BaseTerminalTabComponent): Promise|boolean { return true } abstract handle (uri: string, tab?: BaseTerminalTabComponent): void private _fullMatchRegex: RegExp | null = null get fullMatchRegex (): RegExp { if (!this._fullMatchRegex) { this._fullMatchRegex = new RegExp(`^${this.regex.source}$`) } return this._fullMatchRegex } } ================================================ FILE: tabby-linkifier/src/config.ts ================================================ import { ConfigProvider } from 'tabby-core' /** @hidden */ export class ClickableLinksConfigProvider extends ConfigProvider { defaults = { clickableLinks: { modifier: null, }, } platformDefaults = { } } ================================================ FILE: tabby-linkifier/src/decorator.ts ================================================ import { Inject, Injectable } from '@angular/core' import { ConfigService, PlatformService } from 'tabby-core' import { TerminalDecorator, BaseTerminalTabComponent, XTermFrontend } from 'tabby-terminal' import { WebLinksAddon } from '@xterm/addon-web-links' import { LinkHandler } from './api' @Injectable() export class LinkHighlighterDecorator extends TerminalDecorator { constructor ( private config: ConfigService, private platform: PlatformService, @Inject(LinkHandler) private handlers: LinkHandler[], ) { super() } attach (tab: BaseTerminalTabComponent): void { if (!(tab.frontend instanceof XTermFrontend)) { // not xterm return } tab.frontend.xterm.options.linkHandler = { activate: (event, uri) => { if (!this.willHandleEvent(event)) { return } this.platform.openExternal(uri) }, } const openLink = async uri => { for (const handler of this.handlers) { if (!handler.fullMatchRegex.test(uri)) { continue } if (!await handler.verify(await handler.convert(uri, tab), tab)) { continue } handler.handle(await handler.convert(uri, tab), tab) } } let regex = new RegExp('') const regexSource = this.handlers.map(x => `(${x.regex.source})`).join('|') try { regex = new RegExp(regexSource) console.debug('Linkifier regexp', regex) } catch (error) { console.error('Could not build regex for your link handlers:', error) console.error('Regex source was:', regexSource) return } const addon = new WebLinksAddon( async (event, uri) => { if (!this.willHandleEvent(event)) { return } openLink(uri) }, { urlRegex: regex, }, ) tab.frontend.xterm.loadAddon(addon) } private willHandleEvent (event: MouseEvent) { const modifier = this.config.store.clickableLinks.modifier return !modifier || event[modifier] } } ================================================ FILE: tabby-linkifier/src/handlers.ts ================================================ import * as fs from 'fs/promises' import * as path from 'path' import untildify from 'untildify' import { Injectable } from '@angular/core' import { ToastrService } from 'ngx-toastr' import { PlatformService } from 'tabby-core' import { BaseTerminalTabComponent } from 'tabby-terminal' import { LinkHandler } from './api' @Injectable() export class URLHandler extends LinkHandler { // From https://urlregex.com/ // with "-" added to last group (https://github.com/Eugeny/tabby/issues/5611) regex = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((:((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{1,5})|([0-9]{1,4})))?(?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w-]*))?)/ priority = 5 constructor (private platform: PlatformService) { super() } handle (uri: string): void { this.platform.openExternal(uri) } } @Injectable() export class IPHandler extends LinkHandler { regex = /\b((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/ priority = 4 constructor (private platform: PlatformService) { super() } handle (uri: string): void { this.platform.openExternal(`http://${uri}`) } } export class BaseFileHandler extends LinkHandler { constructor ( protected toastr: ToastrService, protected platform: PlatformService, ) { super() } async handle (uri: string): Promise { try { this.platform.openExternal('file://' + uri) } catch (err) { this.toastr.error(err.toString()) } } async verify (uri: string): Promise { try { await fs.access(uri) return true } catch { return false } } async convert (uri: string, tab?: BaseTerminalTabComponent): Promise { let p = untildify(uri) if (!path.isAbsolute(p) && tab) { const cwd = await tab.session?.getWorkingDirectory() if (cwd) { p = path.resolve(cwd, p) } } return p } } @Injectable() export class UnixFileHandler extends BaseFileHandler { // Only absolute and home paths regex = /[~]?(\/[\w\d.~-]{1,100})+/ constructor ( protected toastr: ToastrService, protected platform: PlatformService, ) { super(toastr, platform) } } @Injectable() export class WindowsFileHandler extends BaseFileHandler { regex = /(([a-zA-Z]:|\\|~)\\[\w\-()\\\.]{1,1024}|"([a-zA-Z]:|\\)\\[\w\s\-()\\\.]{1,1024}")/ constructor ( protected toastr: ToastrService, protected platform: PlatformService, ) { super(toastr, platform) } convert (uri: string, tab?: BaseTerminalTabComponent): Promise { const sanitizedUri = uri.replace(/"/g, '') return super.convert(sanitizedUri, tab) } } ================================================ FILE: tabby-linkifier/src/index.ts ================================================ /* eslint-disable @typescript-eslint/no-extraneous-class */ import { NgModule } from '@angular/core' import { ToastrModule } from 'ngx-toastr' import { ConfigProvider } from 'tabby-core' import { TerminalDecorator } from 'tabby-terminal' import { LinkHandler } from './api' import { UnixFileHandler, WindowsFileHandler, URLHandler, IPHandler } from './handlers' import { LinkHighlighterDecorator } from './decorator' import { ClickableLinksConfigProvider } from './config' @NgModule({ imports: [ ToastrModule, ], providers: [ { provide: LinkHandler, useClass: URLHandler, multi: true }, { provide: LinkHandler, useClass: IPHandler, multi: true }, { provide: LinkHandler, useClass: UnixFileHandler, multi: true }, { provide: LinkHandler, useClass: WindowsFileHandler, multi: true }, { provide: TerminalDecorator, useClass: LinkHighlighterDecorator, multi: true }, { provide: ConfigProvider, useClass: ClickableLinksConfigProvider, multi: true }, ], }) export default class LinkifierModule { } export * from './api' ================================================ FILE: tabby-linkifier/tsconfig.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist"], "compilerOptions": { "baseUrl": "src", } } ================================================ FILE: tabby-linkifier/tsconfig.typings.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "compilerOptions": { "baseUrl": "src", "emitDeclarationOnly": true, "declaration": true, "declarationDir": "./typings", "paths": { "tabby-*": ["../../tabby-*"], "*": ["../../app/node_modules/*"] } } } ================================================ FILE: tabby-linkifier/webpack.config.mjs ================================================ import * as path from 'path' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) import config from '../webpack.plugin.config.mjs' export default () => config({ name: 'linkifier', dirname: __dirname, }) ================================================ FILE: tabby-local/README.md ================================================ # Tabby Local Plugin * local shells Using the API: ```ts import { ShellProvider } from 'tabby-local' ``` Exporting your subclasses: ```ts @NgModule({ ... providers: [ ... { provide: ShellProvider, useClass: MyShellPlugin, multi: true }, ... ] }) ``` ================================================ FILE: tabby-local/package.json ================================================ { "name": "tabby-local", "version": "1.0.231-nightly.0", "description": "Tabby's local shell plugin", "keywords": [ "tabby-builtin-plugin" ], "main": "dist/index.js", "typings": "typings/index.d.ts", "scripts": { "build": "webpack --progress --color --display-modules", "watch": "webpack --progress --color --watch" }, "files": [ "dist", "typings" ], "author": "Tabby Developers", "license": "MIT", "devDependencies": { "ansi-colors": "^4.1.1", "dataurl": "0.1.0", "runes": "^0.4.2" }, "peerDependencies": { "@angular/animations": "^15", "@angular/common": "^15", "@angular/core": "^15", "@angular/forms": "^15", "@angular/platform-browser": "^15", "@ng-bootstrap/ng-bootstrap": "^14", "rxjs": "^7", "tabby-core": "*", "tabby-settings": "*", "tabby-terminal": "*" } } ================================================ FILE: tabby-local/src/api.ts ================================================ import { BaseTerminalProfile } from 'tabby-terminal' export interface Shell { id: string name: string command: string args?: string[] env: Record /** * Base path to which shell's internal FS is relative * Currently used for WSL only */ fsBase?: string cwd?: string /** * SVG icon */ icon?: string hidden?: boolean } /** * Extend to add support for more shells */ export abstract class ShellProvider { abstract provide (): Promise } export interface SessionOptions { restoreFromPTYID: string | null command: string args: string[] cwd: string | null env: Record width: number | null height: number | null pauseAfterExit: boolean runAsAdministrator: boolean } export interface LocalProfile extends BaseTerminalProfile { options: SessionOptions } export interface ChildProcess { pid: number ppid: number command: string } export abstract class UACService { isAvailable = false abstract patchSessionOptionsForUAC (sessionOptions: SessionOptions): SessionOptions } export abstract class PTYProxy { abstract getID (): string abstract getPID (): Promise abstract resize (columns: number, rows: number): Promise abstract write (data: Buffer): Promise abstract kill (signal?: string): Promise abstract ackData (length: number): void abstract subscribe (event: string, handler: (..._: any[]) => void): void abstract unsubscribeAll (): void abstract getChildProcesses (): Promise abstract getTruePID (): Promise abstract getWorkingDirectory (): Promise } export abstract class PTYInterface { abstract spawn (...options: any[]): Promise abstract restore (id: string): Promise } ================================================ FILE: tabby-local/src/buttonProvider.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Injectable } from '@angular/core' import { ToolbarButtonProvider, ToolbarButton, TranslateService } from 'tabby-core' import { TerminalService } from './services/terminal.service' /** @hidden */ @Injectable() export class ButtonProvider extends ToolbarButtonProvider { constructor ( private terminal: TerminalService, private translate: TranslateService, ) { super() } provide (): ToolbarButton[] { return [ { icon: require('./icons/plus.svg'), title: this.translate.instant('New terminal'), touchBarNSImage: 'NSTouchBarAddDetailTemplate', click: () => { this.terminal.openTab() }, }, ] } } ================================================ FILE: tabby-local/src/cli.ts ================================================ import * as path from 'path' import * as fs from 'mz/fs' import { Injectable } from '@angular/core' import { CLIHandler, CLIEvent, AppService, ConfigService, HostWindowService, ProfilesService, NotificationsService } from 'tabby-core' import { TerminalService } from './services/terminal.service' @Injectable() export class TerminalCLIHandler extends CLIHandler { firstMatchOnly = true priority = 0 constructor ( private hostWindow: HostWindowService, private terminal: TerminalService, ) { super() } async handle (event: CLIEvent): Promise { const op = event.argv._[0] if (op === 'open') { this.handleOpenDirectory(path.resolve(event.cwd, event.argv.directory!)) } else if (op === 'run') { this.handleRunCommand(event.argv.command!) } else { return false } return true } private async handleOpenDirectory (directory: string) { if (directory.length > 1 && (directory.endsWith('/') || directory.endsWith('\\'))) { directory = directory.substring(0, directory.length - 1) } if (await fs.exists(directory)) { if ((await fs.stat(directory)).isDirectory()) { this.terminal.openTab(undefined, directory) this.hostWindow.bringToFront() } } } private handleRunCommand (command: string[]) { this.terminal.openTab({ type: 'local', name: '', options: { command: command[0], args: command.slice(1), }, }, null, true) this.hostWindow.bringToFront() } } @Injectable() export class OpenPathCLIHandler extends CLIHandler { firstMatchOnly = true priority = -100 constructor ( private terminal: TerminalService, private profiles: ProfilesService, private hostWindow: HostWindowService, private notifications: NotificationsService, ) { super() } async handle (event: CLIEvent): Promise { const op = event.argv._[0] const opAsPath = op ? path.resolve(event.cwd, op) : null const profile = await this.terminal.getDefaultProfile() if (opAsPath && (await fs.lstat(opAsPath)).isDirectory()) { this.terminal.openTab(profile, opAsPath) this.hostWindow.bringToFront() return true } if (opAsPath && await fs.exists(opAsPath)) { if (opAsPath.endsWith('.sh') || opAsPath.endsWith('.command')) { profile.options!.pauseAfterExit = true profile.options?.args?.push(opAsPath) this.terminal.openTab(profile) this.hostWindow.bringToFront() return true } else if (opAsPath.endsWith('.bat')) { const psProfile = (await this.profiles.getProfiles()).find(x => x.id === 'cmd') if (psProfile) { psProfile.options!.pauseAfterExit = true psProfile.options?.args?.push(opAsPath) this.terminal.openTab(psProfile) this.hostWindow.bringToFront() return true } } else if (opAsPath.endsWith('.ps1')) { const cmdProfile = (await this.profiles.getProfiles()).find(x => x.id === 'powershell') if (cmdProfile) { cmdProfile.options!.pauseAfterExit = true cmdProfile.options?.args?.push(opAsPath) this.terminal.openTab(cmdProfile) this.hostWindow.bringToFront() return true } } else { this.notifications.error('Cannot handle scripts of this type') } } return false } } @Injectable() export class AutoOpenTabCLIHandler extends CLIHandler { firstMatchOnly = true priority = -1000 constructor ( private app: AppService, private config: ConfigService, private terminal: TerminalService, ) { super() } async handle (event: CLIEvent): Promise { if (!event.secondInstance && this.config.store.terminal.autoOpen && !this.config.store.enableWelcomeTab) { this.app.ready$.subscribe(() => { if (this.app.tabs.length === 0) { this.terminal.openTab() } }) return true } return false } } ================================================ FILE: tabby-local/src/components/commandLineEditor.component.pug ================================================ ng-container(*ngIf='!argvMode') .mb-3 label(translate) Command line .input-group a.input-group-text.text-decoration-none( (click)='switchToArgv()', ngbTooltip='Split into unescaped arguments', href='#' ) i.fas.fa-fw.fa-caret-right input.form-control.text-monospace( [(ngModel)]='command', (ngModelChange)='parseCommand()' ) ng-container(*ngIf='argvMode && _model') .mb-3 label(translate) Program .input-group a.input-group-text.text-decoration-none( (click)='switchToCommand()', ngbTooltip='Combine into a single escaped command', href='#' ) i.fas.fa-fw.fa-caret-down input.form-control.text-monospace( type='text', [(ngModel)]='_model.command', ) .mb-3(*ngIf='_model.args') label(translate) Arguments .input-group( *ngFor='let arg of _model.args; index as i; trackBy: trackByIndex', ) input.form-control.text-monospace( type='text', [(ngModel)]='_model.args[i]', ) button.btn.btn-secondary((click)='_model.args.splice(i, 1)') i.fas.fa-fw.fa-trash .mt-2 button.btn.btn-secondary((click)='_model.args.push("")') i.fas.fa-plus.me-2 span(translate) Add ================================================ FILE: tabby-local/src/components/commandLineEditor.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import * as shellQuote from 'shell-quote' import { Component, Input } from '@angular/core' import { SessionOptions } from '../api' /** @hidden */ @Component({ selector: 'command-line-editor', templateUrl: './commandLineEditor.component.pug', }) export class CommandLineEditorComponent { @Input() argvMode = false @Input() _model: SessionOptions command = '' @Input() get model (): SessionOptions { return this._model } set model (value: SessionOptions) { this._model = value this.updateCommand() } switchToCommand () { this.updateCommand() this.argvMode = false } switchToArgv () { this.argvMode = true } parseCommand () { const args = shellQuote.parse(this.command) this.model.command = args[0] ?? '' this.model.args = args.slice(1) } updateCommand () { this.command = shellQuote.quote([ this.model.command, ...this.model.args, ]) } trackByIndex (index) { return index } } ================================================ FILE: tabby-local/src/components/environmentEditor.component.pug ================================================ .mb-2.d-flex.align-items-center(*ngFor='let pair of vars') .input-group input.form-control.w-25.text-monospace([(ngModel)]='pair.key', (blur)='emitUpdate()', placeholder='Variable name') .input-group-text = input.form-control.w-50.text-monospace([(ngModel)]='pair.value', (blur)='emitUpdate()', placeholder='Value') button.btn.btn-secondary((click)='removeEnvironmentVar(pair.key)') i.fas.fa-fw.fa-trash .d-flex button.btn.btn-secondary((click)='addEnvironmentVar()') i.fas.fa-plus.me-2 span(translate) Add .ms-auto .text-muted(translate) Substitutions allowed. .d-flex.ms-1(*ngIf='shouldShowExample()') .text-muted(translate) Example: a.ms-1((click)='addExample()', href='#') extend PATH ================================================ FILE: tabby-local/src/components/environmentEditor.component.scss ================================================ :host { display: block; } ================================================ FILE: tabby-local/src/components/environmentEditor.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, Output, Input } from '@angular/core' import { Subject } from 'rxjs' /** @hidden */ @Component({ selector: 'environment-editor', templateUrl: './environmentEditor.component.pug', styleUrls: ['./environmentEditor.component.scss'], }) export class EnvironmentEditorComponent { @Output() modelChange = new Subject() vars: { key: string, value: string }[] = [] private cachedModel: any @Input() get model (): any { return this.cachedModel } set model (value) { this.vars = Object.entries(value).map(([k, v]) => ({ key: k, value: v as string })) this.cachedModel = this.getModel() } getModel () { const model = {} for (const pair of this.vars) { model[pair.key] = pair.value } return model } emitUpdate () { this.cachedModel = this.getModel() this.modelChange.next(this.cachedModel) } addEnvironmentVar () { this.vars.push({ key: '', value: '' }) } removeEnvironmentVar (key: string) { this.vars = this.vars.filter(x => x.key !== key) this.emitUpdate() } shouldShowExample (): boolean { return !this.vars.find(v => v.key.toLowerCase() === 'path') } addExample (): void { const value = process.platform === 'win32' ? 'C:\\Program Files\\Custom:%PATH%' : '/opt/custom:$PATH' this.vars.push({ key: 'PATH', value }) this.emitUpdate() } } ================================================ FILE: tabby-local/src/components/localProfileSettings.component.pug ================================================ ul.nav-tabs(ngbNav, #nav='ngbNav') li(ngbNavItem) a(ngbNavLink, translate) General ng-template(ngbNavContent) command-line-editor([model]='profile.options') .form-line(*ngIf='uac?.isAvailable') .header .title(translate) Run as administrator toggle( [(ngModel)]='profile.options.runAsAdministrator', ) .mb-3 label(translate) Working directory .input-group input.form-control( type='text', placeholder='Home directory', [(ngModel)]='profile.options.cwd' ) button.btn.btn-secondary((click)='pickWorkingDirectory()') i.fas.fa-folder-open .mb-3 label(translate) Environment environment-editor( type='text', [(model)]='profile.options.env', ) li(ngbNavItem) a(ngbNavLink, translate) Colors ng-template(ngbNavContent) color-scheme-selector([(model)]='profile.terminalColorScheme') div([ngbNavOutlet]='nav') ================================================ FILE: tabby-local/src/components/localProfileSettings.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, Inject, Optional } from '@angular/core' import { LocalProfile, UACService } from '../api' import { FullyDefined, PlatformService, ProfileSettingsComponent } from 'tabby-core' import { LocalProfilesService } from '../profiles' /** @hidden */ @Component({ templateUrl: './localProfileSettings.component.pug', }) export class LocalProfileSettingsComponent implements ProfileSettingsComponent { profile: FullyDefined constructor ( @Optional() @Inject(UACService) public uac: UACService|undefined, private platform: PlatformService, ) { } async pickWorkingDirectory (): Promise { const cwd = await this.platform.pickDirectory() if (!cwd) { return } this.profile.options.cwd = cwd } } ================================================ FILE: tabby-local/src/components/shellSettingsTab.component.pug ================================================ h3.mb-3(translate) Shell .form-line(*ngIf='isConPTYAvailable') .header .title(translate) Use ConPTY .description(translate) Enables the experimental Windows ConPTY API toggle( [(ngModel)]='config.store.terminal.useConPTY', (ngModelChange)='config.save()' ) .alert.alert-info.d-flex.align-items-center(*ngIf='config.store.terminal.useConPTY && isConPTYAvailable && !isConPTYStable') .me-auto(translate) Windows 10 build 18309 or above is recommended for ConPTY .alert.alert-info.d-flex.align-items-center(*ngIf='config.store.terminal.profile.startsWith("WSL") && (!config.store.terminal.useConPTY)') .me-auto(translate) WSL terminal only supports TrueColor with ConPTY ================================================ FILE: tabby-local/src/components/shellSettingsTab.component.ts ================================================ import { Component, HostBinding } from '@angular/core' import { WIN_BUILD_CONPTY_SUPPORTED, WIN_BUILD_CONPTY_STABLE, isWindowsBuild, ConfigService } from 'tabby-core' /** @hidden */ @Component({ templateUrl: './shellSettingsTab.component.pug', }) export class ShellSettingsTabComponent { isConPTYAvailable: boolean isConPTYStable: boolean @HostBinding('class.content-box') true constructor ( public config: ConfigService, ) { this.isConPTYAvailable = isWindowsBuild(WIN_BUILD_CONPTY_SUPPORTED) this.isConPTYStable = isWindowsBuild(WIN_BUILD_CONPTY_STABLE) } } ================================================ FILE: tabby-local/src/components/terminalTab.component.ts ================================================ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import { Component, Input, Injector, Inject, Optional } from '@angular/core' import { BaseTabProcess, WIN_BUILD_CONPTY_SUPPORTED, isWindowsBuild, GetRecoveryTokenOptions } from 'tabby-core' import { BaseTerminalTabComponent } from 'tabby-terminal' import { LocalProfile, SessionOptions, UACService } from '../api' import { Session } from '../session' /** @hidden */ @Component({ selector: 'terminalTab', template: BaseTerminalTabComponent.template, styles: BaseTerminalTabComponent.styles, animations: BaseTerminalTabComponent.animations, }) export class TerminalTabComponent extends BaseTerminalTabComponent { @Input() sessionOptions: SessionOptions // Deprecated session: Session|null = null // eslint-disable-next-line @typescript-eslint/no-useless-constructor constructor ( injector: Injector, @Optional() @Inject(UACService) private uac: UACService|undefined, ) { super(injector) } ngOnInit (): void { this.sessionOptions = this.profile.options this.logger = this.log.create('terminalTab') const isConPTY = isWindowsBuild(WIN_BUILD_CONPTY_SUPPORTED) && this.config.store.terminal.useConPTY this.subscribeUntilDestroyed(this.hotkeys.hotkey$, hotkey => { if (!this.hasFocus) { return } switch (hotkey) { case 'home': this.sendInput(isConPTY ? '\x1b[H' : '\x1bOH') break case 'end': this.sendInput(isConPTY ? '\x1b[F' : '\x1bOF') break } }) super.ngOnInit() } protected onFrontendReady (): void { this.initializeSession(this.size.columns, this.size.rows) this.savedStateIsLive = this.profile.options.restoreFromPTYID === this.session?.getID() super.onFrontendReady() } initializeSession (columns: number, rows: number): void { const session = new Session(this.injector) if (this.profile.options.runAsAdministrator && this.uac?.isAvailable) { this.profile = { ...this.profile, options: this.uac.patchSessionOptionsForUAC(this.profile.options), } } session.start({ ...this.profile.options, width: columns, height: rows, }) this.setSession(session) this.recoveryStateChangedHint.next() } async getRecoveryToken (options?: GetRecoveryTokenOptions): Promise { const cwd = this.session ? await this.session.getWorkingDirectory() : null return { type: 'app:local-tab', profile: { ...this.profile, options: { ...this.profile.options, cwd: cwd ?? this.profile.options.cwd, restoreFromPTYID: options?.includeState && this.session?.getID(), }, }, savedState: options?.includeState && this.frontend?.saveState(), } } async getCurrentProcess (): Promise { const children = await this.session?.getChildProcesses() if (!children?.length) { return null } return { name: children[0].command, } } async canClose (): Promise { const children = await this.session?.getChildProcesses() if (!children?.length) { return true } return (await this.platform.showMessageBox( { type: 'warning', message: this.translate.instant( _('"{command}" is still running. Close?'), children[0], ), buttons: [ this.translate.instant(_('Kill')), this.translate.instant(_('Cancel')), ], defaultId: 0, cancelId: 1, }, )).response === 0 } ngOnDestroy (): void { super.ngOnDestroy() this.session?.destroy() } /** * Return true if the user explicitly exit the session. * Always return true for terminalTab as the session can only be ended by the user */ protected isSessionExplicitlyTerminated (): boolean { return true } } ================================================ FILE: tabby-local/src/config.ts ================================================ import { ConfigProvider, Platform } from 'tabby-core' /** @hidden */ export class TerminalConfigProvider extends ConfigProvider { defaults = { terminal: { autoOpen: true, useConPTY: true, environment: {}, setComSpec: false, }, } platformDefaults = { [Platform.macOS]: { terminal: { profile: 'local:default', }, hotkeys: { 'new-tab': [ '⌘-T', ], }, }, [Platform.Windows]: { terminal: { profile: 'local:cmd-clink', }, hotkeys: { 'new-tab': [ 'Ctrl-Shift-T', ], }, }, [Platform.Linux]: { terminal: { profile: 'local:default', }, hotkeys: { 'new-tab': [ 'Ctrl-Shift-T', ], }, }, } } ================================================ FILE: tabby-local/src/hotkeys.ts ================================================ import { Injectable } from '@angular/core' import { HotkeyDescription, HotkeyProvider, TranslateService } from 'tabby-core' /** @hidden */ @Injectable() export class LocalTerminalHotkeyProvider extends HotkeyProvider { hotkeys: HotkeyDescription[] = [ { id: 'new-tab', name: this.translate.instant('New tab'), }, ] constructor (private translate: TranslateService) { super() } async provide (): Promise { return this.hotkeys } } ================================================ FILE: tabby-local/src/index.ts ================================================ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { FormsModule } from '@angular/forms' import { NgbModule } from '@ng-bootstrap/ng-bootstrap' import { ToastrModule } from 'ngx-toastr' import TabbyCorePlugin, { HostAppService, ToolbarButtonProvider, TabRecoveryProvider, ConfigProvider, HotkeysService, HotkeyProvider, TabContextMenuItemProvider, CLIHandler, ProfileProvider } from 'tabby-core' import TabbyTerminalModule from 'tabby-terminal' import { SettingsTabProvider } from 'tabby-settings' import { TerminalTabComponent } from './components/terminalTab.component' import { ShellSettingsTabComponent } from './components/shellSettingsTab.component' import { EnvironmentEditorComponent } from './components/environmentEditor.component' import { LocalProfileSettingsComponent } from './components/localProfileSettings.component' import { CommandLineEditorComponent } from './components/commandLineEditor.component' import { TerminalService } from './services/terminal.service' import { ButtonProvider } from './buttonProvider' import { RecoveryProvider } from './recoveryProvider' import { ShellSettingsTabProvider } from './settings' import { TerminalConfigProvider } from './config' import { LocalTerminalHotkeyProvider } from './hotkeys' import { NewTabContextMenu } from './tabContextMenu' import { AutoOpenTabCLIHandler, OpenPathCLIHandler, TerminalCLIHandler } from './cli' import { LocalProfilesService } from './profiles' /** @hidden */ @NgModule({ imports: [ CommonModule, FormsModule, NgbModule, ToastrModule, TabbyCorePlugin, TabbyTerminalModule, ], providers: [ { provide: SettingsTabProvider, useClass: ShellSettingsTabProvider, multi: true }, { provide: ToolbarButtonProvider, useClass: ButtonProvider, multi: true }, { provide: TabRecoveryProvider, useClass: RecoveryProvider, multi: true }, { provide: ConfigProvider, useClass: TerminalConfigProvider, multi: true }, { provide: HotkeyProvider, useClass: LocalTerminalHotkeyProvider, multi: true }, { provide: ProfileProvider, useClass: LocalProfilesService, multi: true }, { provide: TabContextMenuItemProvider, useClass: NewTabContextMenu, multi: true }, { provide: CLIHandler, useClass: TerminalCLIHandler, multi: true }, { provide: CLIHandler, useClass: OpenPathCLIHandler, multi: true }, { provide: CLIHandler, useClass: AutoOpenTabCLIHandler, multi: true }, ], declarations: [ TerminalTabComponent, ShellSettingsTabComponent, EnvironmentEditorComponent, CommandLineEditorComponent, LocalProfileSettingsComponent, ], exports: [ TerminalTabComponent, EnvironmentEditorComponent, CommandLineEditorComponent, ], }) export default class LocalTerminalModule { // eslint-disable-line @typescript-eslint/no-extraneous-class private constructor ( hotkeys: HotkeysService, terminal: TerminalService, hostApp: HostAppService, ) { hotkeys.hotkey$.subscribe(async (hotkey) => { if (hotkey === 'new-tab') { terminal.openTab() } if (hotkey === 'new-window') { hostApp.newWindow() } }) } } export { TerminalTabComponent } export { TerminalService } export * from './api' ================================================ FILE: tabby-local/src/profiles.ts ================================================ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import deepClone from 'clone-deep' import { Injectable, Inject } from '@angular/core' import { ProfileProvider, NewTabParameters, ConfigService, SplitTabComponent, AppService, PartialProfile } from 'tabby-core' import { TerminalTabComponent } from './components/terminalTab.component' import { LocalProfileSettingsComponent } from './components/localProfileSettings.component' import { ShellProvider, Shell, SessionOptions, LocalProfile } from './api' @Injectable({ providedIn: 'root' }) export class LocalProfilesService extends ProfileProvider { id = 'local' name = _('Local terminal') settingsComponent = LocalProfileSettingsComponent configDefaults = { options: { restoreFromPTYID: null, command: '', args: [], cwd: null, env: { __nonStructural: true, }, width: null, height: null, pauseAfterExit: false, runAsAdministrator: false, }, } constructor ( private app: AppService, private config: ConfigService, @Inject(ShellProvider) private shellProviders: ShellProvider[], ) { super() } async getBuiltinProfiles (): Promise[]> { return (await this.getShells()).map(shell => ({ id: `local:${shell.id}`, type: 'local', name: shell.name, icon: shell.icon, options: this.optionsFromShell(shell), isBuiltin: true, })) } async getNewTabParameters (profile: LocalProfile): Promise> { profile = deepClone(profile) if (!profile.options.cwd) { if (this.app.activeTab instanceof TerminalTabComponent && this.app.activeTab.session) { profile.options.cwd = await this.app.activeTab.session.getWorkingDirectory() ?? null } if (this.app.activeTab instanceof SplitTabComponent) { const focusedTab = this.app.activeTab.getFocusedTab() if (focusedTab instanceof TerminalTabComponent && focusedTab.session) { profile.options.cwd = await focusedTab.session.getWorkingDirectory() ?? null } } } return { type: TerminalTabComponent, inputs: { profile, }, } } async getShells (): Promise { const shellLists = await Promise.all(this.config.enabledServices(this.shellProviders).map(x => x.provide())) return shellLists.reduce((a, b) => a.concat(b), []) } optionsFromShell (shell: Shell): SessionOptions { return { ...this.configDefaults.options, command: shell.command, args: shell.args ?? [], env: shell.env, cwd: shell.cwd ?? null, } } getSuggestedName (profile: LocalProfile): string { return this.getDescription(profile) } getDescription (profile: PartialProfile): string { return profile.options?.command ?? '' } } ================================================ FILE: tabby-local/src/recoveryProvider.ts ================================================ import { Injectable, Injector } from '@angular/core' import { TabRecoveryProvider, NewTabParameters, RecoveryToken, ProfilesService } from 'tabby-core' import { TerminalTabComponent } from './components/terminalTab.component' /** @hidden */ @Injectable() export class RecoveryProvider extends TabRecoveryProvider { constructor (private injector: Injector) { super() } async applicableTo (recoveryToken: RecoveryToken): Promise { return recoveryToken.type === 'app:local-tab' } async recover (recoveryToken: RecoveryToken): Promise> { return { type: TerminalTabComponent, inputs: { profile: this.injector.get(ProfilesService).getConfigProxyForProfile(recoveryToken.profile), savedState: recoveryToken.savedState, }, } } } ================================================ FILE: tabby-local/src/services/terminal.service.ts ================================================ import * as fsSync from 'fs' import { Injectable } from '@angular/core' import { Logger, LogService, ConfigService, ProfilesService, PartialProfile } from 'tabby-core' import { TerminalTabComponent } from '../components/terminalTab.component' import { LocalProfile } from '../api' @Injectable({ providedIn: 'root' }) export class TerminalService { private logger: Logger /** @hidden */ private constructor ( private profilesService: ProfilesService, private config: ConfigService, log: LogService, ) { this.logger = log.create('terminal') } async getDefaultProfile (): Promise> { const profiles = await this.profilesService.getProfiles() let profile = profiles.find(x => x.id === this.config.store.terminal.profile) if (!profile) { profile = profiles.filter(x => x.type === 'local' && x.isBuiltin)[0] } return profile } /** * Launches a new terminal with a specific shell and CWD * @param pause Wait for a keypress when the shell exits */ async openTab (profile?: PartialProfile|null, cwd?: string|null, pause?: boolean): Promise { if (!profile) { profile = await this.getDefaultProfile() } const fullProfile = this.profilesService.getConfigProxyForProfile(profile) cwd = cwd ?? fullProfile.options.cwd if (cwd && !fsSync.existsSync(cwd)) { console.warn('Ignoring non-existent CWD:', cwd) cwd = null } this.logger.info(`Starting profile ${fullProfile.name}`, fullProfile) const options = { ...fullProfile.options, // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing pauseAfterExit: fullProfile.options.pauseAfterExit || pause, cwd: cwd ?? undefined, } return (await this.profilesService.openNewTabForProfile({ ...fullProfile, options, })) as TerminalTabComponent|null } } ================================================ FILE: tabby-local/src/session.ts ================================================ import * as fs from 'mz/fs' import * as fsSync from 'fs' import { Injector } from '@angular/core' import { HostAppService, ConfigService, WIN_BUILD_CONPTY_SUPPORTED, isWindowsBuild, Platform, BootstrapData, BOOTSTRAP_DATA, LogService } from 'tabby-core' import { BaseSession } from 'tabby-terminal' import { SessionOptions, ChildProcess, PTYInterface, PTYProxy } from './api' const windowsDirectoryRegex = /([a-zA-Z]:[^\:\[\]\?\"\<\>\|]+)/mi function mergeEnv (...envs) { const result = {} const keyMap = {} for (const env of envs) { for (const [key, value] of Object.entries(env)) { // const lookup = process.platform === 'win32' ? key.toLowerCase() : key const lookup = key.toLowerCase() keyMap[lookup] ??= key result[keyMap[lookup]] = value } } return result } function substituteEnv (env: Record) { env = { ...env } const pattern = process.platform === 'win32' ? /%(\w+)%/g : /\$(\w+)\b/g for (const [key, value] of Object.entries(env)) { env[key] = value.toString().replace(pattern, function (substring, p1) { if (process.platform === 'win32') { return Object.entries(process.env).find(x => x[0].toLowerCase() === p1.toLowerCase())?.[1] ?? '' } else { return process.env[p1] ?? '' } }) } return env } /** @hidden */ export class Session extends BaseSession { private pty: PTYProxy|null = null private ptyClosed = false private pauseAfterExit = false private guessedCWD: string|null = null private initialCWD: string|null = null private config: ConfigService private hostApp: HostAppService private bootstrapData: BootstrapData private ptyInterface: PTYInterface constructor ( injector: Injector, ) { super(injector.get(LogService).create('local')) this.config = injector.get(ConfigService) this.hostApp = injector.get(HostAppService) this.ptyInterface = injector.get(PTYInterface) this.bootstrapData = injector.get(BOOTSTRAP_DATA) } async start (options: SessionOptions): Promise { let pty: PTYProxy|null = null if (options.restoreFromPTYID) { pty = await this.ptyInterface.restore(options.restoreFromPTYID) options.restoreFromPTYID = null } if (!pty) { let env = mergeEnv( process.env, { COLORTERM: 'truecolor', TERM: 'xterm-256color', TERM_PROGRAM: 'Tabby', }, substituteEnv(options.env), this.config.store.terminal.environment || {}, ) if (this.hostApp.platform === Platform.Windows && this.config.store.terminal.setComSpec) { env = mergeEnv(env, { COMSPEC: this.bootstrapData.executable }) } delete env[''] if (this.hostApp.platform === Platform.macOS && !process.env.LC_ALL) { const locale = process.env.LC_CTYPE ?? 'en_US.UTF-8' Object.assign(env, { LANG: locale, LC_ALL: locale, LC_MESSAGES: locale, LC_NUMERIC: locale, LC_COLLATE: locale, LC_MONETARY: locale, }) } // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing let cwd = options.cwd || process.env.HOME if (!fsSync.existsSync(cwd!)) { console.warn('Ignoring non-existent CWD:', cwd) cwd = undefined } pty = await this.ptyInterface.spawn(options.command, options.args, { name: 'xterm-256color', cols: options.width ?? 80, rows: options.height ?? 30, encoding: null, cwd, env: env, // `1` instead of `true` forces ConPTY even if unstable useConpty: isWindowsBuild(WIN_BUILD_CONPTY_SUPPORTED) && this.config.store.terminal.useConPTY ? 1 : false, }) this.guessedCWD = cwd ?? null } this.pty = pty pty.getTruePID().then(async () => { this.initialCWD = await this.getWorkingDirectory() }) this.open = true this.pty.subscribe('data', (array: Uint8Array) => { this.pty!.ackData(array.length) const data = Buffer.from(array) this.emitOutput(data) if (this.hostApp.platform === Platform.Windows) { this.guessWindowsCWD(data.toString()) } }) this.pty.subscribe('exit', () => { if (this.pauseAfterExit) { return } else if (this.open) { this.destroy() } }) this.pty.subscribe('close', () => { this.ptyClosed = true if (this.pauseAfterExit) { this.emitOutput(Buffer.from('\r\nPress any key to close\r\n')) } else if (this.open) { this.destroy() } }) this.pauseAfterExit = options.pauseAfterExit this.destroyed$.subscribe(() => this.pty!.unsubscribeAll()) } getID (): string|null { return this.pty?.getID() ?? null } resize (columns: number, rows: number): void { this.pty?.resize(columns, rows) } write (data: Buffer): void { if (this.ptyClosed) { this.destroy() } if (this.open) { this.pty?.write(data) } } kill (signal?: string): void { this.pty?.kill(signal) } async getChildProcesses (): Promise { return this.pty?.getChildProcesses() ?? [] } async gracefullyKillProcess (): Promise { if (this.hostApp.platform === Platform.Windows) { this.kill() } else { await new Promise((resolve) => { this.kill('SIGTERM') setTimeout(async () => { try { process.kill(await this.pty!.getPID(), 0) // still alive this.kill('SIGKILL') resolve() } catch { resolve() } }, 500) }) } } supportsWorkingDirectory (): boolean { return !!(this.initialCWD ?? this.reportedCWD ?? this.guessedCWD) } async getWorkingDirectory (): Promise { if (this.reportedCWD) { return this.reportedCWD } let cwd: string|null = null try { cwd = await this.pty?.getWorkingDirectory() ?? null } catch (exc) { console.info('Could not read working directory:', exc) } try { cwd = await fs.realpath(cwd) } catch {} if (this.hostApp.platform === Platform.Windows && (cwd === this.initialCWD || cwd === process.env.WINDIR)) { // shell doesn't truly change its process' CWD cwd = null } // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing cwd = cwd || this.guessedCWD try { await fs.access(cwd) } catch { return null } return cwd } private guessWindowsCWD (data: string) { const match = windowsDirectoryRegex.exec(data) if (match) { this.guessedCWD = match[0] } } } ================================================ FILE: tabby-local/src/settings.ts ================================================ import { Injectable } from '@angular/core' import { HostAppService, Platform } from 'tabby-core' import { SettingsTabProvider } from 'tabby-settings' import { ShellSettingsTabComponent } from './components/shellSettingsTab.component' /** @hidden */ @Injectable() export class ShellSettingsTabProvider extends SettingsTabProvider { id = 'terminal-shell' icon = 'list-ul' title = 'Shell' constructor (private hostApp: HostAppService) { super() } getComponentType (): any { if (this.hostApp.platform === Platform.Windows) { return ShellSettingsTabComponent } } } ================================================ FILE: tabby-local/src/tabContextMenu.ts ================================================ import { Inject, Injectable, Optional } from '@angular/core' import { ConfigService, BaseTabComponent, TabContextMenuItemProvider, MenuItemOptions, ProfilesService, TranslateService } from 'tabby-core' import { TerminalTabComponent } from './components/terminalTab.component' import { TerminalService } from './services/terminal.service' import { LocalProfile, UACService } from './api' /** @hidden */ @Injectable() export class NewTabContextMenu extends TabContextMenuItemProvider { weight = 10 constructor ( public config: ConfigService, private profilesService: ProfilesService, private terminalService: TerminalService, @Optional() @Inject(UACService) private uac: UACService|undefined, private translate: TranslateService, ) { super() } async getItems (tab: BaseTabComponent, tabHeader?: boolean): Promise { const profiles = (await this.profilesService.getProfiles()).filter(x => x.type === 'local') as LocalProfile[] const items: MenuItemOptions[] = [ { label: this.translate.instant('New terminal'), click: () => { if (tab instanceof TerminalTabComponent) { this.profilesService.openNewTabForProfile(tab.profile) } else { this.terminalService.openTab() } }, }, { label: this.translate.instant('New with profile'), submenu: profiles.map(profile => ({ label: profile.name, click: async () => { let workingDirectory = profile.options.cwd if (!workingDirectory && tab instanceof TerminalTabComponent) { workingDirectory = await tab.session?.getWorkingDirectory() ?? null } await this.terminalService.openTab(profile, workingDirectory) }, })), }, ] if (this.uac?.isAvailable) { items.push({ label: this.translate.instant('New admin tab'), submenu: profiles.map(profile => ({ label: profile.name, click: () => { this.profilesService.openNewTabForProfile({ ...profile, options: { ...profile.options, runAsAdministrator: true, }, }) }, })), }) } if (tab instanceof TerminalTabComponent && tabHeader && this.uac?.isAvailable) { const terminalTab = tab items.push({ label: this.translate.instant('Duplicate as administrator'), click: () => { this.profilesService.openNewTabForProfile({ ...terminalTab.profile, options: { ...terminalTab.profile.options, runAsAdministrator: true, }, }) }, }) } return items } } ================================================ FILE: tabby-local/tsconfig.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "compilerOptions": { "baseUrl": "src" } } ================================================ FILE: tabby-local/tsconfig.typings.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "compilerOptions": { "baseUrl": "src", "emitDeclarationOnly": true, "declaration": true, "declarationDir": "./typings", "paths": { "tabby-*": ["../../tabby-*"], "*": [ "../../app/node_modules/*" ] } } } ================================================ FILE: tabby-local/webpack.config.mjs ================================================ import * as path from 'path' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) import config from '../webpack.plugin.config.mjs' export default () => config({ name: 'local', dirname: __dirname, }) ================================================ FILE: tabby-plugin-manager/package.json ================================================ { "name": "tabby-plugin-manager", "version": "1.0.231-nightly.0", "description": "Tabby's plugin manager", "keywords": [ "tabby-builtin-plugin" ], "main": "dist/index.js", "typings": "typings/index.d.ts", "scripts": { "build": "webpack --progress --color --display-modules", "watch": "webpack --progress --color --watch" }, "files": [ "dist", "typings" ], "author": "Tabby Developers", "license": "MIT", "devDependencies": { "@types/semver": "^7.1.0", "semver": "^7.1.1" }, "peerDependencies": { "@angular/common": "^15", "@angular/core": "^15", "@angular/forms": "^15", "@angular/platform-browser": "^15", "@ng-bootstrap/ng-bootstrap": "^14", "rxjs": "^7", "tabby-core": "*", "tabby-settings": "*" } } ================================================ FILE: tabby-plugin-manager/src/components/pluginsSettingsTab.component.pug ================================================ .d-flex.mb-3 h3(translate) Plugins button.btn.btn-secondary.btn-sm.ms-auto((click)='openPluginsFolder()') i.fas.fa-folder span(translate) Plugins folder .alert.alert-danger(*ngIf='errorMessage') strong( translate='Error in {plugin}:', [translateParams]='{plugin: erroredPlugin}' ) pre {{errorMessage}} ul.nav-tabs.mb-2(ngbNav, #nav='ngbNav') li(ngbNavItem) a(ngbNavLink, translate) Available ng-template(ngbNavContent) .input-group.mb-3.mt-3 .input-group-text i.fas.fa-fw.fa-circle-notch.fa-spin(*ngIf='!availablePluginsReady') i.fas.fa-fw.fa-search(*ngIf='availablePluginsReady') input.form-control( type='text', [(ngModel)]='availableFilter', (ngModelChange)='searchAvailable(availableFilter)', [placeholder]='"Search plugins"|translate' ) ngb-accordion.mb-4(*ngIf='availablePlugins$', [closeOthers]='true') ng-container(*ngFor='let plugin of (availablePlugins$|async)') ngb-panel(*ngIf='!isAlreadyInstalled(plugin)') ng-template(ngbPanelTitle) .text-left strong.d-block {{plugin.name}} small.d-block.text-muted {{plugin.description}} ng-template(ngbPanelContent) .row .col-4 div.d-flex.flex-column.flex-md-row.gap-2 button.btn.btn-primary.btn-block.justify-content-center( (click)='installPlugin(plugin)', [disabled]='busy.has(plugin.name)' ) i.fas.fa-fw.fa-cloud-download(*ngIf='busy.get(plugin.name) != BusyState.Installing') i.fas.fa-fw.fa-circle-notch.fa-spin(*ngIf='busy.get(plugin.name) == BusyState.Installing') span.ms-2(translate) Get button.btn.btn-secondary.btn-block.justify-content-center( *ngIf='plugin.homepage', (click)='showPluginHomepage(plugin)' ) i.fas.fa-fw.fa-external-link-alt span.ms-2(translate) Homepage .col-8 ng-container(*ngTemplateOutlet='pluginInfo; context: { plugin }') .mt-2 {{plugin.description}} li(ngbNavItem) a(ngbNavLink, translate) Installed ng-template(ngbNavContent) .input-group.mb-3.mt-3 .input-group-text i.fas.fa-fw.fa-search input.form-control( type='text', [(ngModel)]='installedFilter', (ngModelChange)='searchInstalled(installedFilter)', [placeholder]='"Search plugins"|translate' ) ngb-accordion.mb-4([closeOthers]='true') ng-container(*ngFor='let plugin of installedPlugins$') ngb-panel ng-template(ngbPanelTitle) .text-left.me-auto div strong {{plugin.name}} small.text-muted.ms-2(*ngIf='plugin.isBuiltin', translate) Built-in small.text-warning.ms-2(*ngIf='!isPluginEnabled(plugin)', translate) Disabled small.d-block.text-muted {{plugin.description}} button.btn.btn-primary.ms-2( *ngIf='knownUpgrades[plugin.name]', (click)='upgradePlugin(plugin)', [disabled]='busy.has(plugin.name)' ) i.fas.fa-fw.fa-arrow-up(*ngIf='busy.get(plugin.name) != BusyState.Installing') i.fas.fa-fw.fa-circle-notch.fa-spin(*ngIf='busy.get(plugin.name) == BusyState.Installing') span( translate='Upgrade to {version}', [translateParams]='{version: knownUpgrades[plugin.name]?.version}' ) ng-template(ngbPanelContent) .row .col-4 button.btn.btn-warning.btn-block.justify-content-center( (click)='togglePlugin(plugin)', *ngIf='isPluginEnabled(plugin)', [disabled]='!canDisablePlugin(plugin)', translate ) Disable button.btn.btn-success.btn-block.justify-content-center( (click)='togglePlugin(plugin)', *ngIf='canDisablePlugin(plugin) && !isPluginEnabled(plugin)', translate ) Enable button.btn.btn-danger.btn-block.justify-content-center( (click)='uninstallPlugin(plugin)', *ngIf='!plugin.isBuiltin', [disabled]='busy.has(plugin.name)' ) i.fas.fa-fw.fa-trash(*ngIf='busy.get(plugin.name) != BusyState.Uninstalling') i.fas.fa-fw.fa-circle-notch.fa-spin(*ngIf='busy.get(plugin.name) == BusyState.Uninstalling') span(translate) Uninstall .col-8 ng-container(*ngTemplateOutlet='pluginInfo; context: { plugin }') .mt-2 {{plugin.description}} ng-template(#pluginInfo, let-plugin='plugin') .row.align-items-center .col-4 strong(translate) Version .col-8 span {{plugin.version}} .row.align-items-center .col-4 strong(translate) Author .col-8 .badge.text-bg-success(*ngIf='plugin.isOfficial') i.fas.fa-check span.ms-1(translate) Official a.btn.btn-link.px-0.w-auto((click)='showPluginInfo(plugin)', *ngIf='!plugin.isOfficial') span {{plugin.author}} i.fas.fa-fw.fa-external-link-alt.ms-2 .mb-4([ngbNavOutlet]='nav') ================================================ FILE: tabby-plugin-manager/src/components/pluginsSettingsTab.component.scss ================================================ ::ng-deep .card-header { padding: 0; > button { width: 100%; } } ================================================ FILE: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import { BehaviorSubject, Observable, debounceTime, distinctUntilChanged, first, tap, flatMap, map } from 'rxjs' import semverGt from 'semver/functions/gt' import { Component, HostBinding, Input } from '@angular/core' import { ConfigService, PlatformService, PluginInfo } from 'tabby-core' import { PluginManagerService } from '../services/pluginManager.service' enum BusyState { Installing = 'Installing', Uninstalling = 'Uninstalling' } const FORCE_ENABLE = ['tabby-core', 'tabby-settings', 'tabby-electron', 'tabby-web', 'tabby-plugin-manager'] _('Search plugins') /** @hidden */ @Component({ templateUrl: './pluginsSettingsTab.component.pug', styleUrls: ['./pluginsSettingsTab.component.scss'], }) export class PluginsSettingsTabComponent { BusyState = BusyState @Input() availablePlugins$: Observable @Input() availablePluginsQuery$ = new BehaviorSubject('') @Input() availablePluginsReady = false @Input() installedPluginsQuery$ = new BehaviorSubject('') @Input() knownUpgrades: Record = {} @Input() busy = new Map() @Input() erroredPlugin: string @Input() errorMessage: string @HostBinding('class.content-box') true installedPlugins$: PluginInfo[] = [] installedFilter = '' availableFilter = '' constructor ( private config: ConfigService, private platform: PlatformService, public pluginManager: PluginManagerService, ) { } ngOnInit () { this.availablePlugins$ = this.availablePluginsQuery$ .asObservable() .pipe( debounceTime(200), distinctUntilChanged(), flatMap(query => { this.availablePluginsReady = false return this.pluginManager.listAvailable(query).pipe(tap(() => { this.availablePluginsReady = true })) }), ) this.availablePlugins$.pipe(first(), map((plugins: PluginInfo[]) => { plugins.sort((a, b) => a.name > b.name ? 1 : -1) return plugins })).subscribe(available => { for (const plugin of this.pluginManager.installedPlugins) { this.knownUpgrades[plugin.name] = available.find(x => x.name === plugin.name && semverGt(x.version, plugin.version)) ?? null } }) this.installedPluginsQuery$ .asObservable() .pipe( debounceTime(200), distinctUntilChanged(), flatMap(query => { return this.pluginManager.listInstalled(query) }), ).subscribe(plugin => { this.installedPlugins$ = plugin }) } openPluginsFolder (): void { this.platform.openPath(this.pluginManager.userPluginsPath) } searchAvailable (query: string) { this.availablePluginsQuery$.next(query) } searchInstalled (query: string) { this.installedPluginsQuery$.next(query) } isAlreadyInstalled (plugin: PluginInfo): boolean { return this.pluginManager.installedPlugins.some(x => x.name === plugin.name) } async installPlugin (plugin: PluginInfo): Promise { this.busy.set(plugin.name, BusyState.Installing) try { await this.pluginManager.installPlugin(plugin) this.busy.delete(plugin.name) this.config.requestRestart() } catch (err) { console.error('Error installing plugin', plugin.name, err) this.erroredPlugin = plugin.name this.errorMessage = err this.busy.delete(plugin.name) throw err } } async uninstallPlugin (plugin: PluginInfo): Promise { this.busy.set(plugin.name, BusyState.Uninstalling) try { await this.pluginManager.uninstallPlugin(plugin) this.busy.delete(plugin.name) this.config.requestRestart() } catch (err) { console.error('Error uninstalling plugin', plugin.name, err) this.erroredPlugin = plugin.name this.errorMessage = err this.busy.delete(plugin.name) throw err } } async upgradePlugin (plugin: PluginInfo): Promise { return this.installPlugin(this.knownUpgrades[plugin.name]!) } showPluginInfo (plugin: PluginInfo) { this.platform.openExternal('https://www.npmjs.com/package/' + plugin.packageName) } showPluginHomepage (plugin: PluginInfo) { this.platform.openExternal(plugin.homepage ?? '') } isPluginEnabled (plugin: PluginInfo) { return !this.config.store.pluginBlacklist.includes(plugin.name) } canDisablePlugin (plugin: PluginInfo) { return !FORCE_ENABLE.includes(plugin.packageName) } togglePlugin (plugin: PluginInfo) { if (this.isPluginEnabled(plugin)) { this.disablePlugin(plugin) } else { this.enablePlugin(plugin) } } enablePlugin (plugin: PluginInfo) { this.config.store.pluginBlacklist = this.config.store.pluginBlacklist.filter(x => x !== plugin.name) this.config.save() this.config.requestRestart() } disablePlugin (plugin: PluginInfo) { this.config.store.pluginBlacklist = [...this.config.store.pluginBlacklist, plugin.name] this.config.save() this.config.requestRestart() } } ================================================ FILE: tabby-plugin-manager/src/index.ts ================================================ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { FormsModule } from '@angular/forms' import { NgbModule } from '@ng-bootstrap/ng-bootstrap' import TabbyCorePlugin from 'tabby-core' import { SettingsTabProvider } from 'tabby-settings' import { PluginsSettingsTabComponent } from './components/pluginsSettingsTab.component' import { PluginManagerService } from './services/pluginManager.service' import { PluginsSettingsTabProvider } from './settings' @NgModule({ imports: [ CommonModule, FormsModule, NgbModule, TabbyCorePlugin, ], providers: [ { provide: SettingsTabProvider, useClass: PluginsSettingsTabProvider, multi: true }, ], declarations: [ PluginsSettingsTabComponent, ], }) export default class PluginManagerModule { } // eslint-disable-line @typescript-eslint/no-extraneous-class export { PluginManagerService } ================================================ FILE: tabby-plugin-manager/src/services/pluginManager.service.ts ================================================ import axios from 'axios' import { compare as semverCompare } from 'semver' import { Observable, from, forkJoin, map, of } from 'rxjs' import { Injectable, Inject } from '@angular/core' import { Logger, LogService, PlatformService, BOOTSTRAP_DATA, BootstrapData, PluginInfo } from 'tabby-core' import { PLUGIN_BLACKLIST } from '../../../app/src/pluginBlacklist' const OFFICIAL_NPM_ACCOUNT = 'eugenepankov' @Injectable({ providedIn: 'root' }) export class PluginManagerService { logger: Logger userPluginsPath: string installedPlugins: PluginInfo[] private constructor ( log: LogService, private platform: PlatformService, @Inject(BOOTSTRAP_DATA) bootstrapData: BootstrapData, ) { this.logger = log.create('pluginManager') this.installedPlugins = [...bootstrapData.installedPlugins] this.installedPlugins.sort((a, b) => a.name.localeCompare(b.name)) this.userPluginsPath = bootstrapData.userPluginsPath } listAvailable (query?: string): Observable { return forkJoin( this._listAvailableInternal('tabby-', 'tabby-plugin', query), this._listAvailableInternal('terminus-', 'terminus-plugin', query), ).pipe( map(x => x.reduce((a, b) => a.concat(b), [])), map(x => { const names = new Set() return x.filter(item => { if (names.has(item.name)) { return false } names.add(item.name) return true }) }), map(x => x.sort((a, b) => a.name.localeCompare(b.name))), ) } listInstalled (query: string): Observable { return of(this.installedPlugins.filter(x=>x.name.includes(query))) } _listAvailableInternal (namePrefix: string, keyword: string, query?: string): Observable { return from( axios.get(`https://registry.npmjs.com/-/v1/search?text=keywords%3A${keyword}%20${query}&size=250`), ).pipe( map(response => response.data.objects .filter(item => !item.keywords?.includes('tabby-dummy-transition-plugin')) .map(item => ({ name: item.package.name.substring(namePrefix.length), packageName: item.package.name, description: item.package.description, version: item.package.version, homepage: item.package.links.homepage, author: item.package.author?.name, isOfficial: item.package.publisher.username === OFFICIAL_NPM_ACCOUNT, })), ), map(plugins => plugins.filter(x => x.packageName.startsWith(namePrefix))), map(plugins => plugins.filter(x => !PLUGIN_BLACKLIST.includes(x.packageName))), map(plugins => { const mapping: Record = {} for (const p of plugins) { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition mapping[p.name] ??= [] mapping[p.name].push(p) } return Object.values(mapping).map(list => { list.sort((a, b) => -semverCompare(a.version, b.version)) return list[0] }) }), map(plugins => plugins.sort((a, b) => a.name.localeCompare(b.name))), ) } async installPlugin (plugin: PluginInfo): Promise { try { await this.platform.installPlugin(plugin.packageName, plugin.version) this.installedPlugins = this.installedPlugins.filter(x => x.packageName !== plugin.packageName) this.installedPlugins.push(plugin) } catch (err) { this.logger.error(err) throw err } } async uninstallPlugin (plugin: PluginInfo): Promise { try { await this.platform.uninstallPlugin(plugin.packageName) this.installedPlugins = this.installedPlugins.filter(x => x.packageName !== plugin.packageName) } catch (err) { this.logger.error(err) throw err } } } ================================================ FILE: tabby-plugin-manager/src/settings.ts ================================================ import { Injectable } from '@angular/core' import { SettingsTabProvider } from 'tabby-settings' import { PluginsSettingsTabComponent } from './components/pluginsSettingsTab.component' /** @hidden */ @Injectable() export class PluginsSettingsTabProvider extends SettingsTabProvider { id = 'plugins' title = 'Plugins' getComponentType (): any { return PluginsSettingsTabComponent } } ================================================ FILE: tabby-plugin-manager/tsconfig.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist"], "compilerOptions": { "baseUrl": "src", } } ================================================ FILE: tabby-plugin-manager/tsconfig.typings.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "compilerOptions": { "baseUrl": "src", "emitDeclarationOnly": true, "declaration": true, "declarationDir": "./typings", "paths": { "tabby-*": ["../../tabby-*"], "*": ["../../app/node_modules/*"] } } } ================================================ FILE: tabby-plugin-manager/webpack.config.mjs ================================================ import * as path from 'path' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) import config from '../webpack.plugin.config.mjs' export default () => config({ name: 'plugin-manager', dirname: __dirname, }) ================================================ FILE: tabby-serial/package.json ================================================ { "name": "tabby-serial", "version": "1.0.231-nightly.0", "description": "Serial connections for Tabby", "keywords": [ "tabby-builtin-plugin" ], "main": "dist/index.js", "typings": "typings/index.d.ts", "scripts": { "build": "webpack --progress --color", "watch": "webpack --progress --color --watch" }, "files": [ "dist", "typings" ], "author": "Tabby Developers", "license": "MIT", "devDependencies": { "@types/node": "14.14.14", "ansi-colors": "^4.1.1" }, "peerDependencies": { "@angular/animations": "^15", "@angular/common": "^15", "@angular/core": "^15", "@angular/forms": "^15", "@angular/platform-browser": "^15", "@angular/platform-browser-dynamic": "^15", "@ng-bootstrap/ng-bootstrap": "^14", "rxjs": "^7", "tabby-core": "*", "tabby-settings": "*", "tabby-terminal": "*" } } ================================================ FILE: tabby-serial/src/api.ts ================================================ import stripAnsi from 'strip-ansi' import { SerialPortStream } from '@serialport/stream' import { LogService, NotificationsService } from 'tabby-core' import { Subject, Observable } from 'rxjs' import { Injector, NgZone } from '@angular/core' import { BaseSession, ConnectableTerminalProfile, InputProcessingOptions, InputProcessor, LoginScriptsOptions, SessionMiddleware, StreamProcessingOptions, TerminalStreamProcessor, UTF8SplitterMiddleware } from 'tabby-terminal' import { SerialService } from './services/serial.service' export interface SerialProfile extends ConnectableTerminalProfile { options: SerialProfileOptions } export interface SerialProfileOptions extends StreamProcessingOptions, LoginScriptsOptions { port: string baudrate: number | null databits: 5 | 6 | 7 | 8 stopbits: 1 | 1.5 | 2 parity: string rtscts: boolean xon: boolean xoff: boolean xany: boolean slowSend: boolean input: InputProcessingOptions, } export const BAUD_RATES = [ 110, 150, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600, 1500000, ] export interface SerialPortInfo { name: string description?: string } class SlowFeedMiddleware extends SessionMiddleware { feedFromTerminal (data: Buffer): void { for (const byte of data) { this.outputToSession.next(Buffer.from([byte])) } } } export class SerialSession extends BaseSession { serial: SerialPortStream|null get serviceMessage$ (): Observable { return this.serviceMessage } private serviceMessage = new Subject() private streamProcessor: TerminalStreamProcessor private zone: NgZone private notifications: NotificationsService private serialService: SerialService constructor (injector: Injector, public profile: SerialProfile) { super(injector.get(LogService).create(`serial-${profile.options.port}`)) this.serialService = injector.get(SerialService) this.zone = injector.get(NgZone) this.notifications = injector.get(NotificationsService) this.streamProcessor = new TerminalStreamProcessor(profile.options) this.middleware.push(this.streamProcessor) if (this.profile.options.slowSend) { this.middleware.unshift(new SlowFeedMiddleware()) } this.middleware.push(new UTF8SplitterMiddleware()) this.middleware.push(new InputProcessor(profile.options.input)) this.setLoginScriptsOptions(profile.options) } async start (): Promise { if (!this.profile.options.port) { this.profile.options.port = (await this.serialService.listPorts())[0].name } const serial = this.serial = new SerialPortStream({ binding: this.serialService.detectBinding(), path: this.profile.options.port, autoOpen: false, baudRate: parseInt(this.profile.options.baudrate as any), dataBits: this.profile.options.databits, stopBits: this.profile.options.stopbits, parity: this.profile.options.parity, rtscts: this.profile.options.rtscts, xon: this.profile.options.xon, xoff: this.profile.options.xoff, xany: this.profile.options.xany, }) let connected = false await new Promise(async (resolve, reject) => { serial.on('open', () => { connected = true this.zone.run(resolve) }) serial.on('error', error => { this.zone.run(() => { if (connected) { this.notifications.error(error.message) } else { reject(error) } this.destroy() }) }) serial.on('close', () => { this.emitServiceMessage('Port closed') this.destroy() }) try { serial.open() } catch (e) { this.notifications.error(e.message) reject(e) } }) this.open = true setTimeout(() => this.streamProcessor.start()) serial.on('readable', () => { this.emitOutput(serial.read()) }) serial.on('end', () => { this.logger.info('Shell session ended') if (this.open) { this.destroy() } }) this.loginScriptProcessor?.executeUnconditionalScripts() } write (data: Buffer): void { this.serial?.write(data) } async destroy (): Promise { this.serviceMessage.complete() await super.destroy() } // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-empty-function resize (_, __) { this.streamProcessor.resize() } kill (_?: string): void { this.serial?.close() } emitServiceMessage (msg: string): void { this.serviceMessage.next(msg) this.logger.info(stripAnsi(msg)) } async getChildProcesses (): Promise { return [] } async gracefullyKillProcess (): Promise { this.kill('TERM') } supportsWorkingDirectory (): boolean { return false } async getWorkingDirectory (): Promise { return null } } ================================================ FILE: tabby-serial/src/components/serialProfileSettings.component.pug ================================================ ul.nav-tabs(ngbNav, #nav='ngbNav') li(ngbNavItem) a(ngbNavLink, translate) General ng-template(ngbNavContent) .row .col-6(ng:if='hostApp.platform !== Platform.Web') .mb-3 label(translate) Device input.form-control( type='text', alwaysVisibleTypeahead, [(ngModel)]='profile.options.port', [ngbTypeahead]='portsAutocomplete', [resultFormatter]='portsFormatter' ) .col-6 .mb-3 label(translate) Baud rate input.form-control( type='number', alwaysVisibleTypeahead, placeholder='Ask every time', [(ngModel)]='profile.options.baudrate', [ngbTypeahead]='baudratesAutocomplete' ) stream-processing-settings([options]='profile.options') li(ngbNavItem) a(ngbNavLink, translate) Advanced ng-template(ngbNavContent) .form-line .header .title(translate) Data bits input.form-control( type='number', placeholder='8', [(ngModel)]='profile.options.databits', ) .form-line .header .title(translate) Stop bits input.form-control( type='number', placeholder='1', [(ngModel)]='profile.options.stopbits', ) .form-line .header .title(translate) Parity select.form-control( type='text', [(ngModel)]='profile.options.parity' ) option(value='none', translate) None option(value='even') Even option(value='odd') Odd option(value='mark', ng:if='hostApp.platform === Platform.Windows') Mark option(value='space', ng:if='hostApp.platform === Platform.Windows') Space .form-line .header .title RTS / CTS toggle([(ngModel)]='profile.options.rtscts') .form-line .header .title XON toggle([(ngModel)]='profile.options.xon') .form-line .header .title XOFF toggle([(ngModel)]='profile.options.xoff') .form-line .header .title Xany toggle([(ngModel)]='profile.options.xany') .form-line .header .title(translate) Slow feed .description(translate) Sends data one byte at a time toggle([(ngModel)]='profile.options.slowSend') li(ngbNavItem) a(ngbNavLink, translate) Colors ng-template(ngbNavContent) color-scheme-selector([(model)]='profile.terminalColorScheme') li(ngbNavItem) a(ngbNavLink, translate) Login scripts ng-template(ngbNavContent) login-scripts-settings([options]='profile.options') li(ngbNavItem) a(ngbNavLink, translate) Input ng-template(ngbNavContent) input-processing-settings([options]='profile.options.input') div([ngbNavOutlet]='nav') ================================================ FILE: tabby-serial/src/components/serialProfileSettings.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component } from '@angular/core' import { debounceTime, distinctUntilChanged, map } from 'rxjs' import { FullyDefined, HostAppService, Platform, ProfileSettingsComponent } from 'tabby-core' import { SerialPortInfo, BAUD_RATES, SerialProfile } from '../api' import { SerialService } from '../services/serial.service' import { SerialProfilesService } from '../profiles' /** @hidden */ @Component({ templateUrl: './serialProfileSettings.component.pug', }) export class SerialProfileSettingsComponent implements ProfileSettingsComponent { profile: FullyDefined foundPorts: SerialPortInfo[] Platform = Platform constructor ( private serial: SerialService, public hostApp: HostAppService, ) { } portsAutocomplete = text$ => text$.pipe(map(() => { return this.foundPorts.map(x => x.name) })) baudratesAutocomplete = text$ => text$.pipe( debounceTime(200), distinctUntilChanged(), map((q: string) => [ null, ...BAUD_RATES.filter(x => !q || x.toString().startsWith(q)), ]), ) portsFormatter = port => { const p = this.foundPorts.find(x => x.name === port) if (p?.description) { return `${port} (${p.description})` } return port } async ngOnInit () { this.foundPorts = await this.serial.listPorts() } } ================================================ FILE: tabby-serial/src/components/serialTab.component.pug ================================================ terminal-toolbar([tab]='this') i.fas.fa-xs.fa-circle.text-success.me-2(*ngIf='session && session.open') i.fas.fa-xs.fa-circle.text-danger.me-2(*ngIf='!session || !session.open') strong {{profile.options.port}} ({{profile.options.baudrate}}) .me-auto button.btn.btn-sm.btn-link.me-3((click)='changeBaudRate()', *ngIf='session && session.open && hostApp.platform !== Platform.Web') span(translate) Change baud rate button.btn.btn-sm.btn-link((click)='reconnect()', *ngIf='!session || !session.open') i.fas.fa-redo span(translate) Reconnect ================================================ FILE: tabby-serial/src/components/serialTab.component.scss ================================================ @import '../../../tabby-ssh/src/components/sshTab.component.scss'; :host { select { width: auto; } } ================================================ FILE: tabby-serial/src/components/serialTab.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import colors from 'ansi-colors' import { Component, Injector } from '@angular/core' import { Platform, SelectorService } from 'tabby-core' import { BaseTerminalTabComponent, ConnectableTerminalTabComponent } from 'tabby-terminal' import { SerialSession, BAUD_RATES, SerialProfile } from '../api' /** @hidden */ @Component({ selector: 'serial-tab', template: `${BaseTerminalTabComponent.template} ${require('./serialTab.component.pug')}`, styleUrls: ['./serialTab.component.scss', ...BaseTerminalTabComponent.styles], animations: BaseTerminalTabComponent.animations, }) export class SerialTabComponent extends ConnectableTerminalTabComponent { session: SerialSession|null = null Platform = Platform // eslint-disable-next-line @typescript-eslint/no-useless-constructor constructor ( injector: Injector, private selector: SelectorService, ) { super(injector) this.enableToolbar = true } ngOnInit () { this.subscribeUntilDestroyed(this.hotkeys.hotkey$, hotkey => { if (!this.hasFocus) { return } switch (hotkey) { case 'home': this.sendInput('\x1b[H' ) break case 'end': this.sendInput('\x1b[F' ) break case 'restart-serial-session': this.reconnect() break } }) super.ngOnInit() setImmediate(() => { this.setTitle(this.profile.name) }) } async initializeSession () { super.initializeSession() const session = new SerialSession(this.injector, this.profile) this.setSession(session) this.startSpinner(this.translate.instant(_('Connecting'))) try { await this.session!.start() this.stopSpinner() session.emitServiceMessage(this.translate.instant(_('Port opened'))) } catch (e) { this.stopSpinner() this.write(colors.black.bgRed(' X ') + ' ' + colors.red(e.message) + '\r\n') return } this.session!.resize(this.size.columns, this.size.rows) } protected attachSessionHandlers () { this.attachSessionHandler(this.session!.serviceMessage$, msg => { this.write(`\r\n${colors.black.bgWhite(' Serial ')} ${msg}\r\n`) this.session?.resize(this.size.columns, this.size.rows) }) super.attachSessionHandlers() } protected onSessionDestroyed (): void { if (this.frontend) { // Session was closed abruptly this.write('\r\n' + colors.black.bgWhite(' SERIAL ') + ` session closed\r\n`) super.onSessionDestroyed() } } async changeBaudRate () { const rate = await this.selector.show( this.translate.instant(_('Baud rate')), BAUD_RATES.map(x => ({ name: x.toString(), result: x, })), ) this.session?.serial?.update({ baudRate: rate }) this.profile.options.baudrate = rate } protected isSessionExplicitlyTerminated (): boolean { return super.isSessionExplicitlyTerminated() || this.recentInputs.endsWith('close\r') || this.recentInputs.endsWith('quit\r') } } ================================================ FILE: tabby-serial/src/config.ts ================================================ import { ConfigProvider } from 'tabby-core' /** @hidden */ export class SerialConfigProvider extends ConfigProvider { defaults = { hotkeys: { serial: [ 'Alt-K', ], 'restart-serial-session': [], }, } platformDefaults = { } } ================================================ FILE: tabby-serial/src/hotkeys.ts ================================================ import { Injectable } from '@angular/core' import { HotkeyDescription, HotkeyProvider, TranslateService } from 'tabby-core' /** @hidden */ @Injectable() export class SerialHotkeyProvider extends HotkeyProvider { hotkeys: HotkeyDescription[] = [ { id: 'serial', name: this.translate.instant('Show Serial connections'), }, { id: 'restart-serial-session', name: this.translate.instant('Restart current serial session'), }, ] constructor (private translate: TranslateService) { super() } async provide (): Promise { return this.hotkeys } } ================================================ FILE: tabby-serial/src/index.ts ================================================ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { FormsModule } from '@angular/forms' import { NgbModule } from '@ng-bootstrap/ng-bootstrap' import { ToastrModule } from 'ngx-toastr' import TabbyCoreModule, { ConfigProvider, TabRecoveryProvider, HotkeyProvider, ProfileProvider } from 'tabby-core' import TabbyTerminalModule from 'tabby-terminal' import { SerialProfileSettingsComponent } from './components/serialProfileSettings.component' import { SerialTabComponent } from './components/serialTab.component' import { SerialConfigProvider } from './config' import { RecoveryProvider } from './recoveryProvider' import { SerialHotkeyProvider } from './hotkeys' import { SerialProfilesService } from './profiles' /** @hidden */ @NgModule({ imports: [ NgbModule, CommonModule, FormsModule, ToastrModule, TabbyCoreModule, TabbyTerminalModule, ], providers: [ { provide: ConfigProvider, useClass: SerialConfigProvider, multi: true }, { provide: ProfileProvider, useClass: SerialProfilesService, multi: true }, { provide: TabRecoveryProvider, useClass: RecoveryProvider, multi: true }, { provide: HotkeyProvider, useClass: SerialHotkeyProvider, multi: true }, ], declarations: [ SerialProfileSettingsComponent, SerialTabComponent, ], }) export default class SerialModule { } // eslint-disable-line @typescript-eslint/no-extraneous-class export { SerialTabComponent } export { SerialSession } from './api' ================================================ FILE: tabby-serial/src/profiles.ts ================================================ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import slugify from 'slugify' import deepClone from 'clone-deep' import { Injectable } from '@angular/core' import { NewTabParameters, SelectorService, HostAppService, Platform, TranslateService, ConnectableProfileProvider } from 'tabby-core' import { SerialProfileSettingsComponent } from './components/serialProfileSettings.component' import { SerialTabComponent } from './components/serialTab.component' import { SerialService } from './services/serial.service' import { BAUD_RATES, SerialProfile } from './api' @Injectable({ providedIn: 'root' }) export class SerialProfilesService extends ConnectableProfileProvider { id = 'serial' name = _('Serial') settingsComponent = SerialProfileSettingsComponent configDefaults = { options: { port: null, baudrate: null, databits: 8, stopbits: 1, parity: 'none', rtscts: false, xon: false, xoff: false, xany: false, inputMode: null, outputMode: null, inputNewlines: null, outputNewlines: null, scripts: [], slowSend: false, input: { backspace: 'backspace' }, }, clearServiceMessagesOnConnect: false, } constructor ( private selector: SelectorService, private serial: SerialService, private hostApp: HostAppService, private translate: TranslateService, ) { super() } async getBuiltinProfiles (): Promise { if (this.hostApp.platform === Platform.Web) { return [ { id: `serial:web`, type: 'serial', name: this.translate.instant('Serial connection'), icon: 'fas fa-microchip', isBuiltin: true, } as SerialProfile, ] } return [ { id: `serial:template`, type: 'serial', name: this.translate.instant('Serial connection'), icon: 'fas fa-microchip', isBuiltin: true, isTemplate: true, } as SerialProfile, ...(await this.serial.listPorts()).map(p => ({ id: `serial:port-${slugify(p.name).replace('.', '-')}`, type: 'serial', name: p.description ? this.translate.instant('Serial: {description}', p) : this.translate.instant('Serial'), icon: 'fas fa-microchip', isBuiltin: true, options: { port: p.name, }, } as SerialProfile)), ] } async getNewTabParameters (profile: SerialProfile): Promise> { if (!profile.options.baudrate) { profile = deepClone(profile) profile.options.baudrate = await this.selector.show( this.translate.instant('Baud rate'), BAUD_RATES.map(x => ({ name: x.toString(), result: x, })), ) } return { type: SerialTabComponent, inputs: { profile }, } } getSuggestedName (profile: SerialProfile): string { return this.getDescription(profile) } getDescription (profile: SerialProfile): string { return profile.options.port } } ================================================ FILE: tabby-serial/src/recoveryProvider.ts ================================================ import { Injectable, Injector } from '@angular/core' import { TabRecoveryProvider, NewTabParameters, RecoveryToken, ProfilesService } from 'tabby-core' import { SerialTabComponent } from './components/serialTab.component' /** @hidden */ @Injectable() export class RecoveryProvider extends TabRecoveryProvider { constructor (private injector: Injector) { super() } async applicableTo (recoveryToken: RecoveryToken): Promise { return recoveryToken.type === 'app:serial-tab' } async recover (recoveryToken: RecoveryToken): Promise> { return { type: SerialTabComponent, inputs: { profile: this.injector.get(ProfilesService).getConfigProxyForProfile(recoveryToken.profile), savedState: recoveryToken.savedState, }, } } } ================================================ FILE: tabby-serial/src/services/serial.service.ts ================================================ import { Injectable, Injector } from '@angular/core' import WSABinding from 'serialport-binding-webserialapi' import AbstractBinding from '@serialport/binding-abstract' import { autoDetect } from '@serialport/bindings-cpp' import { HostAppService, PartialProfile, Platform, ProfilesService } from 'tabby-core' import { SerialPortInfo, SerialProfile } from '../api' import { SerialTabComponent } from '../components/serialTab.component' @Injectable({ providedIn: 'root' }) export class SerialService { private constructor ( private injector: Injector, private hostApp: HostAppService, ) { } detectBinding (): typeof AbstractBinding { return this.hostApp.platform === Platform.Web ? WSABinding : autoDetect() } async listPorts (): Promise { try { return (await this.detectBinding().list()).map(x => ({ name: x.path, description: `${x.manufacturer ?? ''} ${x.serialNumber ?? ''}`.trim() || undefined, })) } catch (err) { console.error('Failed to list serial ports', err) return [] } } quickConnect (query: string): Promise { let path = query let baudrate = 115200 if (query.includes('@')) { baudrate = parseInt(path.split('@')[1]) path = path.split('@')[0] } const profile: PartialProfile = { name: query, type: 'serial', options: { port: path, baudrate: baudrate, }, } window.localStorage.lastSerialConnection = JSON.stringify(profile) return this.injector.get(ProfilesService).openNewTabForProfile(profile) as Promise } } ================================================ FILE: tabby-serial/tsconfig.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "compilerOptions": { "baseUrl": "src" } } ================================================ FILE: tabby-serial/tsconfig.typings.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "include": ["src"], "compilerOptions": { "baseUrl": "src", "emitDeclarationOnly": true, "declaration": true, "declarationDir": "./typings", "paths": { "tabby-*": ["../../tabby-*"], "*": ["../../app/node_modules/*"] } } } ================================================ FILE: tabby-serial/webpack.config.mjs ================================================ import * as path from 'path' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) import config from '../webpack.plugin.config.mjs' export default () => config({ name: 'serial', dirname: __dirname, }) ================================================ FILE: tabby-settings/README.md ================================================ # Tabby Settings Plugin * tabbed settings interface Using the API: ```ts import { SettingsTabProvider } from 'tabby-settings' ``` Exporting your subclasses: ```ts @NgModule({ ... providers: [ ... { provide: SettingsTabProvider, useClass: MySettingsTab, multi: true }, ... ] }) ``` ================================================ FILE: tabby-settings/package.json ================================================ { "name": "tabby-settings", "version": "1.0.231-nightly.0", "description": "Tabby terminal settings page", "keywords": [ "tabby-builtin-plugin" ], "main": "dist/index.js", "typings": "typings/index.d.ts", "scripts": { "build": "webpack --progress --color --display-modules", "watch": "webpack --progress --color --watch" }, "files": [ "dist", "typings" ], "author": "Tabby Developers", "license": "MIT", "devDependencies": { "@types/marked": "^5.0.1", "marked": "^5.1.2", "ngx-infinite-scroll": "^16" }, "peerDependencies": { "@angular/animations": "^15", "@angular/common": "^15", "@angular/core": "^15", "@angular/forms": "^15", "@angular/platform-browser": "^15", "@ng-bootstrap/ng-bootstrap": "^14", "rxjs": "^7", "tabby-core": "*" } } ================================================ FILE: tabby-settings/src/api.ts ================================================ /** * Extend to add your own settings tabs */ export abstract class SettingsTabProvider { id: string icon: string title: string weight = 0 prioritized = false getComponentType (): any { return null } } ================================================ FILE: tabby-settings/src/buttonProvider.ts ================================================ import { Injectable } from '@angular/core' import { ToolbarButtonProvider, ToolbarButton, AppService, HostAppService, HotkeysService, TranslateService } from 'tabby-core' import { SettingsTabComponent } from './components/settingsTab.component' /** @hidden */ @Injectable() export class ButtonProvider extends ToolbarButtonProvider { constructor ( hostApp: HostAppService, hotkeys: HotkeysService, private app: AppService, private translate: TranslateService, ) { super() hostApp.settingsUIRequest$.subscribe(() => this.open()) hotkeys.hotkey$.subscribe(async (hotkey) => { if (hotkey === 'settings') { this.open() } }) } provide (): ToolbarButton[] { return [{ icon: require('./icons/cog.svg'), title: this.translate.instant('Settings'), touchBarNSImage: 'NSTouchBarComposeTemplate', weight: 10, click: (): void => this.open(), }] } open (): void { const settingsTab = this.app.tabs.find(tab => tab instanceof SettingsTabComponent) if (settingsTab) { this.app.selectTab(settingsTab) } else { this.app.openNewTabRaw({ type: SettingsTabComponent }) } } } ================================================ FILE: tabby-settings/src/components/configSyncSettingsTab.component.pug ================================================ h3.mb-3(translate) Config sync ul.nav-tabs(ngbNav, #nav='ngbNav') li(ngbNavItem) a(ngbNavLink, translate) Sync ng-template(ngbNavContent) .form-line .header .title(translate) Sync host .input-group.w-50 input.form-control( type='text', [(ngModel)]='config.store.configSync.host', (keydown.enter)='config.save()', ) button.btn.btn-secondary( *ngIf='config.store.configSync.host', (click)='openSyncHost()' ) i.fas.fa-external-link-alt .form-line(*ngIf='config.store.configSync.host') .header .title(translate) Secret sync token .description(translate) Get it from the Tabby Web settings window .input-group input.form-control( type='password', [(ngModel)]='config.store.configSync.token', (keydown.enter)='config.save(); testConnection()' ) .input-group-text(*ngIf='config.store.configSync.token') i.fas.fa-fw.fa-circle-notch.fa-spin.text-warning(*ngIf='connectionSuccessful === null') i.fas.fa-fw.fa-check.text-success(*ngIf='connectionSuccessful') i.fas.fa-fw.fa-exclamation-triangle.text-danger(*ngIf='connectionSuccessful === false') .alert.alert-info.d-flex.align-items-center .me-auto span(translate) Config sync requires an instance of the Tabby Web service. a.ml-1((click)='openTabbyWebInfo()', href='#', translate) Learn more ng-container(*ngIf='config.store.configSync.token') .alert.alert-danger(*ngIf='connectionSuccessful === false') i.fas.fa-exclamation-triangle span.ms-2(translate='Connection failed: {error}', [translateParams]='{error: connectionError}') ng-container(*ngIf='connectionSuccessful') .form-line .header .title(translate) Configs div(*ngIf='configs === null') i.fas.fa-fw.fa-circle-notch.fa-spin span.ms-2(translate) Loading configs... ng-container(*ngIf='configs !== null') .list-group.list-group-light .list-group-item.d-flex.align-items-center( *ngFor='let cfg of configs', [class.active]='isActiveConfig(cfg)', ) i.fas.fa-fw.text-success([class.fa-check]='isActiveConfig(cfg)') i.fas.fa-fw.fa-file .ms-2.d-flex.flex-column.align-items-start div {{cfg.name}} small.text-muted( translate='Modified on {date}', [translateParams]='{date: cfg.modified_at|tabbyDate}' ) .me-auto button.btn.btn-link.ms-1( (click)='uploadAndSync(cfg)', [class.hover-reveal]='!isActiveConfig(cfg)' ) i.fas.fa-arrow-up span.ms-2(*ngIf='isActiveConfig(cfg)', translate) Upload span.ms-2(*ngIf='!isActiveConfig(cfg)', translate) Replace button.btn.btn-link.ms-1( (click)='downloadAndSync(cfg)', [class.hover-reveal]='!isActiveConfig(cfg)' ) i.fas.fa-arrow-down span.ms-2(translate) Download button.btn.btn-link.ms-1( (click)='delete(cfg)', [class.hover-reveal]='!isActiveConfig(cfg)' ) i.fas.fa-trash span.ms-2(translate) Delete a.list-group-item.list-group-item-action.d-flex.align-items-center( href='#', (click)='uploadAsNew()' ) i.fas.fa-fw i.fas.fa-fw.fa-cloud-upload-alt .ms-2(translate) Upload as a new config ng-container(*ngIf='hasMatchingRemoteConfig()') .form-line .header .title(translate) Sync automatically .description(translate) Automatically upload changes and check for updates every minute toggle( [(ngModel)]='config.store.configSync.auto', (ngModelChange)='config.save()', ) li(ngbNavItem) a(ngbNavLink, translate) Advanced ng-template(ngbNavContent) .alert.alert-info(*ngIf='config.store.encrypted') div(translate) Partial config sync is not possible when the config is encrypted via Vault. .form-line(*ngIf='!config.store.encrypted') .header .title(translate) Sync hotkeys toggle( [(ngModel)]='config.store.configSync.parts.hotkeys', (ngModelChange)='config.save()', ) .form-line(*ngIf='!config.store.encrypted') .header .title(translate) Sync window settings toggle( [(ngModel)]='config.store.configSync.parts.appearance', (ngModelChange)='config.save()', ) .form-line(*ngIf='!config.store.encrypted') .header .title(translate) Sync Vault toggle( [(ngModel)]='config.store.configSync.parts.vault', (ngModelChange)='config.save()', ) div([ngbNavOutlet]='nav') ================================================ FILE: tabby-settings/src/components/configSyncSettingsTab.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, HostBinding } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { BaseComponent, ConfigService, PromptModalComponent, HostAppService, PlatformService, NotificationsService, TranslateService } from 'tabby-core' import { Config, ConfigSyncService } from '../services/configSync.service' /** @hidden */ @Component({ selector: 'config-sync-settings-tab', templateUrl: './configSyncSettingsTab.component.pug', }) export class ConfigSyncSettingsTabComponent extends BaseComponent { connectionSuccessful: boolean|null = null connectionError: Error|null = null configs: Config[]|null = null @HostBinding('class.content-box') true constructor ( public config: ConfigService, public platform: PlatformService, private configSync: ConfigSyncService, private hostApp: HostAppService, private ngbModal: NgbModal, private notifications: NotificationsService, private translate: TranslateService, ) { super() } async ngOnInit () { await this.testConnection() this.loadConfigs() } async testConnection () { if (!this.config.store.configSync.host || !this.config.store.configSync.token) { return } this.connectionSuccessful = null try { await this.configSync.getUser() this.connectionSuccessful = true this.loadConfigs() } catch (e) { this.connectionSuccessful = false this.connectionError = e this.configs = null } } async loadConfigs () { this.configs = await this.configSync.getConfigs() } async uploadAsNew () { let name = this.translate.instant('New config on {platform}', this.hostApp) const modal = this.ngbModal.open(PromptModalComponent) modal.componentInstance.prompt = this.translate.instant('Name for the new config') modal.componentInstance.value = name name = (await modal.result.catch(() => null))?.value if (!name) { return } const cfg = await this.configSync.createNewConfig(name) this.loadConfigs() this.configSync.setConfig(cfg) this.uploadAndSync(cfg) } async uploadAndSync (cfg: Config) { if (this.config.store.configSync.configID !== cfg.id) { if ((await this.platform.showMessageBox({ type: 'warning', message: this.translate.instant('Overwrite the config on the remote side and start syncing?'), buttons: [ this.translate.instant('Overwrite remote and sync'), this.translate.instant('Cancel'), ], defaultId: 1, cancelId: 1, })).response === 1) { return } } this.configSync.setConfig(cfg) await this.configSync.upload() this.loadConfigs() this.notifications.info(this.translate.instant('Config uploaded')) } async downloadAndSync (cfg: Config) { if ((await this.platform.showMessageBox({ type: 'warning', message: this.translate.instant('Overwrite the local config and start syncing?'), buttons: [ this.translate.instant('Overwrite local and sync'), this.translate.instant('Cancel'), ], defaultId: 1, cancelId: 1, })).response === 1) { return } this.configSync.setConfig(cfg) await this.configSync.download() this.notifications.info(this.translate.instant('Config downloaded')) } async delete (cfg: Config) { if ((await this.platform.showMessageBox({ type: 'warning', message: this.translate.instant('Delete the config on the remote side?'), buttons: [ this.translate.instant('Delete'), this.translate.instant('Cancel'), ], defaultId: 1, cancelId: 1, })).response === 1) { return } await this.configSync.delete(cfg) this.loadConfigs() this.notifications.info(this.translate.instant('Config deleted')) } hasMatchingRemoteConfig () { return !!this.configs?.find(c => this.isActiveConfig(c)) } isActiveConfig (c: Config) { return c.id === this.config.store.configSync.configID } openSyncHost () { if (this.config.store.configSync.host === 'https://api.tabby.sh') { this.platform.openExternal('https://app.tabby.sh') } else { this.platform.openExternal(this.config.store.configSync.host) } } openTabbyWebInfo () { this.platform.openExternal('https://github.com/Eugeny/tabby-web') } } ================================================ FILE: tabby-settings/src/components/editProfileGroupModal.component.pug ================================================ .modal-header h3.m-0 {{group.name}} .modal-body .row .col-12.col-lg-4 .mb-3 label(translate) Name input.form-control( type='text', autofocus, [(ngModel)]='group.name', ) .col-12.col-lg-8 .form-line.content-box .header .title(translate) Default profile group settings .description(translate) These apply to all profiles of a given type in this group .list-group.mt-3.mb-3.content-box a.list-group-item.list-group-item-action.d-flex.align-items-center( (click)='editDefaults(provider)', *ngFor='let provider of providers' ) {{provider.name|translate}} .me-auto button.btn.btn-link.hover-reveal.ms-1((click)='$event.stopPropagation(); deleteDefaults(provider)') i.fas.fa-trash-arrow-up .modal-footer button.btn.btn-primary((click)='save()', translate) Save button.btn.btn-danger((click)='cancel()', translate) Cancel ================================================ FILE: tabby-settings/src/components/editProfileGroupModal.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, Input } from '@angular/core' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { ConfigProxy, ProfileGroup, Profile, ProfileProvider, PlatformService, TranslateService } from 'tabby-core' /** @hidden */ @Component({ templateUrl: './editProfileGroupModal.component.pug', }) export class EditProfileGroupModalComponent { @Input() group: G & ConfigProxy @Input() providers: ProfileProvider[] constructor ( private modalInstance: NgbActiveModal, private platform: PlatformService, private translate: TranslateService, ) {} save () { this.modalInstance.close({ group: this.group }) } cancel () { this.modalInstance.dismiss() } editDefaults (provider: ProfileProvider) { this.modalInstance.close({ group: this.group, provider }) } async deleteDefaults (provider: ProfileProvider): Promise { if ((await this.platform.showMessageBox( { type: 'warning', message: this.translate.instant('Restore settings to inherited defaults ?'), buttons: [ this.translate.instant('Delete'), this.translate.instant('Keep'), ], defaultId: 1, cancelId: 1, }, )).response === 0) { // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete this.group.defaults?.[provider.id] } } } export interface EditProfileGroupModalComponentResult { group: G provider?: ProfileProvider } ================================================ FILE: tabby-settings/src/components/editProfileModal.component.pug ================================================ .modal-header(*ngIf='defaultsMode === "disabled"') h3.m-0 {{profile.name}} .modal-header(*ngIf='defaultsMode !== "disabled"') h3.m-0( translate='Defaults for {type}', [translateParams]='{type: profileProvider.name}' ) .modal-body .row .col-12.col-lg-4 .mb-3(*ngIf='defaultsMode === "disabled"') label(translate) Name input.form-control( type='text', autofocus, [(ngModel)]='profile.name', ) .mb-3(*ngIf='defaultsMode === "disabled"') label(translate) Group input.form-control( type='text', alwaysVisibleTypeahead, placeholder='Ungrouped', [(ngModel)]='profileGroup', [ngbTypeahead]='groupTypeahead', [inputFormatter]="groupFormatter", [resultFormatter]="groupFormatter", [editable]="false" ) .mb-3(*ngIf='defaultsMode === "disabled"') label(translate) Icon .input-group input.form-control( type='text', alwaysVisibleTypeahead, [(ngModel)]='profile.icon', [ngbTypeahead]='iconSearch', [resultTemplate]='rt' ) .input-group-text profile-icon( [icon]='profile.icon', [color]='profile.color' ) ng-template(#rt,let-r='result',let-t='term') i([class]='"fa-fw " + r') ngb-highlight.ms-2([result]='r', [term]='t') .form-line .header .title(translate) Color input.form-control.w-50( type='text', [(ngModel)]='profile.color', placeholder='#000000', [ngbTypeahead]='colorsAutocomplete', [resultFormatter]='colorsFormatter' ) .form-line .header .title(translate) Disable dynamic tab title .description(translate) Connection name will be used instead toggle([(ngModel)]='profile.disableDynamicTitle') .form-line .header .title(translate) When a session ends .description(*ngIf='profile.behaviorOnSessionEnd == "auto"', translate) Only close the tab when session is explicitly terminated select.form-control( [(ngModel)]='profile.behaviorOnSessionEnd', ) option(ngValue='auto', translate) Auto option(ngValue='keep', translate) Keep option(*ngIf='isConnectable()', ngValue='reconnect', translate) Reconnect option(ngValue='close', translate) Close .form-line(*ngIf='isConnectable()') .header .title(translate) Clear terminal after connection toggle( [(ngModel)]='profile.clearServiceMessagesOnConnect', ) .mb-4 .col-12.col-lg-8(*ngIf='this.profileProvider.settingsComponent') ng-template(#placeholder) .modal-footer button.btn.btn-primary((click)='save()', translate) Save button.btn.btn-danger((click)='cancel()', translate) Cancel ================================================ FILE: tabby-settings/src/components/editProfileModal.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Observable, OperatorFunction, debounceTime, map, distinctUntilChanged } from 'rxjs' import { Component, Input, ViewChild, ViewContainerRef, ComponentFactoryResolver, Injector } from '@angular/core' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { PartialProfileGroup, Profile, ProfileProvider, ProfileSettingsComponent, ProfilesService, TAB_COLORS, ProfileGroup, ConnectableProfileProvider, FullyDefined, ConfigProxy } from 'tabby-core' const iconsData = require('../../../tabby-core/src/icons.json') const iconsClassList = Object.keys(iconsData).map( icon => iconsData[icon].map( style => `fa${style[0]} fa-${icon}`, ), ).flat() /** @hidden */ @Component({ templateUrl: './editProfileModal.component.pug', }) export class EditProfileModalComponent

> { @Input('profile') _profile: P @Input() profileProvider: PP @Input() settingsComponent: new () => ProfileSettingsComponent @Input() defaultsMode: 'enabled'|'group'|'disabled' = 'disabled' @Input() profileGroup: PartialProfileGroup | undefined groups: PartialProfileGroup[] @ViewChild('placeholder', { read: ViewContainerRef }) placeholder: ViewContainerRef protected profile: FullyDefined

& ConfigProxy> private settingsComponentInstance?: ProfileSettingsComponent constructor ( private injector: Injector, private componentFactoryResolver: ComponentFactoryResolver, private profilesService: ProfilesService, private modalInstance: NgbActiveModal, ) { if (this.defaultsMode === 'disabled') { this.profilesService.getProfileGroups().then(groups => { this.groups = groups this.profileGroup = groups.find(g => g.id === this.profile.group) }) } } colorsAutocomplete = text$ => text$.pipe( debounceTime(200), distinctUntilChanged(), map((q: string) => TAB_COLORS .filter(x => !q || x.name.toLowerCase().startsWith(q.toLowerCase())) .map(x => x.value), ), ) colorsFormatter = value => { return TAB_COLORS.find(x => x.value === value)?.name ?? value } ngOnInit () { this.profile = this.profilesService.getConfigProxyForProfile

(this._profile, { skipGlobalDefaults: this.defaultsMode === 'enabled', skipGroupDefaults: this.defaultsMode === 'group' }) } ngAfterViewInit () { const componentType = this.profileProvider.settingsComponent if (componentType) { setTimeout(() => { const componentFactory = this.componentFactoryResolver.resolveComponentFactory(componentType) const componentRef = componentFactory.create(this.injector) this.settingsComponentInstance = componentRef.instance this.settingsComponentInstance.profile = this.profile this.placeholder.insert(componentRef.hostView) }) } } groupTypeahead: OperatorFunction[]> = (text$: Observable) => text$.pipe( debounceTime(200), distinctUntilChanged(), map(q => this.groups.filter(g => !q || g.name.toLowerCase().includes(q.toLowerCase()))), ) groupFormatter = (g: PartialProfileGroup) => g.name iconSearch: OperatorFunction = (text$: Observable) => text$.pipe( debounceTime(200), map(term => iconsClassList.filter(v => v.toLowerCase().includes(term.toLowerCase())).slice(0, 10)), ) save () { if (!this.profileGroup) { this.profile.group = '' } else { this.profile.group = this.profileGroup.id } this.settingsComponentInstance?.save?.() this.profile.__cleanup() this.modalInstance.close(this._profile) } cancel () { this.modalInstance.dismiss() } isConnectable (): boolean { return this.profileProvider instanceof ConnectableProfileProvider } } ================================================ FILE: tabby-settings/src/components/hotkeyInputModal.component.pug ================================================ .modal-header h5(translate) Press the key now .modal-body .input .stroke( *ngFor='let stroke of value', [@animateKey]='true', [@.disabled]='!config.store.accessibility.animations' ) {{stroke}} .timeout div([style.width]='timeoutProgress + "%"') .modal-footer button.btn.btn-primary((click)='close()', translate) Cancel ================================================ FILE: tabby-settings/src/components/hotkeyInputModal.component.scss ================================================ :host { >.modal-body { padding: 0 !important; } .input { display: flex; .stroke { flex: none; } } .timeout { height: 5px; margin: 0 0 15px; div { height: 5px; } } } ================================================ FILE: tabby-settings/src/components/hotkeyInputModal.component.ts ================================================ import { Component, Input } from '@angular/core' import { trigger, transition, style, animate } from '@angular/animations' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { HotkeysService, BaseComponent, Keystroke, ConfigService } from 'tabby-core' const INPUT_TIMEOUT = 1000 /** @hidden */ @Component({ selector: 'hotkey-input-modal', templateUrl: './hotkeyInputModal.component.pug', styleUrls: ['./hotkeyInputModal.component.scss'], animations: [ trigger('animateKey', [ transition(':enter', [ style({ transform: 'translateX(25px)', opacity: '0', }), animate('250ms ease-out', style({ transform: 'translateX(0)', opacity: '1', })), ]), transition(':leave', [ style({ transform: 'translateX(0)', opacity: '1', }), animate('250ms ease-in', style({ transform: 'translateX(25px)', opacity: '0', })), ]), ]), ], }) export class HotkeyInputModalComponent extends BaseComponent { @Input() value: Keystroke[] = [] @Input() timeoutProgress = 0 private lastKeyEvent: number|null = null private keyTimeoutInterval: number|null = null constructor ( private modalInstance: NgbActiveModal, public hotkeys: HotkeysService, public config: ConfigService, ) { super() this.hotkeys.clearCurrentKeystrokes() this.subscribeUntilDestroyed(hotkeys.keyEvent$, event => { event.preventDefault() event.stopPropagation() }) this.subscribeUntilDestroyed(hotkeys.keystroke$, keystroke => { this.lastKeyEvent = performance.now() this.value.push(keystroke) }) } splitKeys (keys: string): string[] { return keys.split('+').map((x) => x.trim()) } ngOnInit (): void { this.keyTimeoutInterval = window.setInterval(() => { if (!this.lastKeyEvent) { return } this.timeoutProgress = Math.min(100, (performance.now() - this.lastKeyEvent) * 100 / INPUT_TIMEOUT) if (this.timeoutProgress === 100) { clearInterval(this.keyTimeoutInterval!) this.modalInstance.close(this.value) } }, 25) this.hotkeys.disable() } ngOnDestroy (): void { clearInterval(this.keyTimeoutInterval!) this.hotkeys.clearCurrentKeystrokes() this.hotkeys.enable() super.ngOnDestroy() } close (): void { clearInterval(this.keyTimeoutInterval!) this.modalInstance.dismiss() } } ================================================ FILE: tabby-settings/src/components/hotkeySettingsTab.component.pug ================================================ h3.mb-3(translate) Hotkeys .input-group.mb-4 .input-group-text i.fas.fa-fw.fa-search input.form-control(type='search', [placeholder]='"Search hotkeys"|translate', [(ngModel)]='hotkeyFilter') .mb-3.hotkeys-table ng-container(*ngFor='let hotkey of hotkeyDescriptions') .row.align-items-center(*ngIf='!hotkeyFilter || hotkeyFilterFn(hotkey, hotkeyFilter)') .col-8.py-2 span {{hotkey.name|translate}} span.ms-2.text-muted ({{hotkey.id}}) .col-4.pe-5 multi-hotkey-input( [hotkeys]='getHotkeys(hotkey.id) || []', (hotkeysChange)='setHotkeys(hotkey.id, $event)' ) ================================================ FILE: tabby-settings/src/components/hotkeySettingsTab.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import { Component, NgZone } from '@angular/core' import { ConfigService, Hotkey, HotkeyDescription, HotkeysService, HostAppService, } from 'tabby-core' _('Search hotkeys') /** @hidden */ @Component({ selector: 'hotkey-settings-tab', templateUrl: './hotkeySettingsTab.component.pug', }) export class HotkeySettingsTabComponent { hotkeyFilter = '' hotkeyDescriptions: HotkeyDescription[] allDuplicateHotkeys = this.getAllDuplicateHotkeys() constructor ( public config: ConfigService, public hostApp: HostAppService, public zone: NgZone, hotkeys: HotkeysService, ) { hotkeys.getHotkeyDescriptions().then(descriptions => { this.hotkeyDescriptions = descriptions }) } getHotkeys (id: string): Hotkey[] { let ptr = this.config.store.hotkeys for (const token of id.split(/\./g)) { ptr = ptr[token] } return (ptr || []).map(hotkey => this.detectDuplicates(hotkey)) } setHotkeys (id: string, hotkeys: Hotkey[]) { let ptr = this.config.store let prop = 'hotkeys' for (const token of id.split(/\./g)) { ptr = ptr[prop] prop = token } ptr[prop] = hotkeys.map(hotkey => hotkey.strokes.length === 1 && Array.isArray(hotkey.strokes) ? hotkey.strokes[0] : hotkey.strokes, ) this.config.save() this.allDuplicateHotkeys = this.getAllDuplicateHotkeys() } hotkeyFilterFn (hotkey: HotkeyDescription, query: string): boolean { const s = hotkey.name + hotkey.id + this.getHotkeys(hotkey.id).map(h => h.strokes).toString() return s.toLowerCase().includes(query.toLowerCase()) } private getAllDuplicateHotkeys (): string[] { const allHotkeys = Object .values(this.config.store.hotkeys) .filter((value: unknown) => Array.isArray(value)) .flat() .map((hotkey: string | string[]) => this.toHotkeyIdentifier(hotkey)) return allHotkeys.filter(hotkey => allHotkeys.indexOf(hotkey) !== allHotkeys.lastIndexOf(hotkey)) } private detectDuplicates (strokes: string[] | string): Hotkey { const hotkeyIdentifier = this.toHotkeyIdentifier(strokes) const isDuplicate = this.allDuplicateHotkeys.includes(hotkeyIdentifier) return { strokes, isDuplicate } } private toHotkeyIdentifier (hotkey: string[] | string): string { return Array.isArray(hotkey) ? hotkey.join('$#!') : hotkey } } ================================================ FILE: tabby-settings/src/components/multiHotkeyInput.component.pug ================================================ .item(*ngFor='let hotkey of hotkeys') .body((click)='editItem(hotkey)') .stroke(*ngFor='let stroke of castAny(hotkey.strokes)') span(*ngIf='!hotkey.isDuplicate') {{stroke}} span.duplicate(*ngIf='hotkey.isDuplicate') {{stroke}} .remove((click)='removeItem(hotkey)') × .add((click)='addItem()', translate) Add... ================================================ FILE: tabby-settings/src/components/multiHotkeyInput.component.scss ================================================ :host { display: flex; flex-wrap: nowrap; &:hover .add { display: initial; } } .item { display: flex; flex: none; .body { flex: none; display: flex; .stroke { flex: none; } } .remove { flex: none; } } .add { flex: auto; display: none; &:first-child { display: block; } } ================================================ FILE: tabby-settings/src/components/multiHotkeyInput.component.ts ================================================ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { HotkeyInputModalComponent } from './hotkeyInputModal.component' import { Hotkey } from 'tabby-core' import deepEqual from 'deep-equal' /** @hidden */ @Component({ selector: 'multi-hotkey-input', templateUrl: './multiHotkeyInput.component.pug', styleUrls: ['./multiHotkeyInput.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) export class MultiHotkeyInputComponent { @Input() hotkeys: Hotkey[] = [] @Output() hotkeysChange = new EventEmitter() constructor ( private ngbModal: NgbModal, ) { } ngOnChanges (): void { this.hotkeys = this.hotkeys.map(hotkey => typeof hotkey.strokes === 'string' ? { ...hotkey, strokes: [hotkey.strokes] } : hotkey) } editItem (item: Hotkey): void { this.ngbModal.open(HotkeyInputModalComponent).result.then((newStrokes: string[]) => { this.hotkeys.find(hotkey => deepEqual(hotkey.strokes, item.strokes))!.strokes = newStrokes this.storeUpdatedHotkeys() }) } addItem (): void { this.ngbModal.open(HotkeyInputModalComponent).result.then((value: string[]) => { this.hotkeys.push({ strokes: value, isDuplicate: false }) this.storeUpdatedHotkeys() }) } removeItem (item: Hotkey): void { this.hotkeys = this.hotkeys.filter(x => x !== item) this.storeUpdatedHotkeys() } private storeUpdatedHotkeys () { this.hotkeysChange.emit(this.hotkeys) } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types protected castAny = (x: any): any => x } ================================================ FILE: tabby-settings/src/components/profilesSettingsTab.component.pug ================================================ h3.mb-3(translate) Profiles ul.nav-tabs(ngbNav, #nav='ngbNav') li(ngbNavItem) a(ngbNavLink, translate) Profiles ng-template(ngbNavContent) .form-line .header .title(translate) Default profile for new tabs select.form-control( [(ngModel)]='config.store.terminal.profile', (ngModelChange)='config.save()', ) optgroup([label]='"Custom Profiles"|translate', *ngIf='customProfiles?.length > 0') option( *ngFor='let profile of customProfiles', [ngValue]='profile.id' ) {{profile.name}} optgroup([label]='"Built-in Profiles"|translate') option( *ngFor='let profile of builtinProfiles', [ngValue]='profile.id' ) {{profile.name}} .d-flex.mb-3 .input-group .input-group-text i.fas.fa-fw.fa-search input.form-control(type='search', [placeholder]='"Filter"|translate', [(ngModel)]='filter') div(ngbDropdown).d-inline-block.flex-shrink-0.ms-3 button.btn.btn-primary(ngbDropdownToggle) i.fas.fa-fw.fa-plus span(translate) New div(ngbDropdownMenu) button(ngbDropdownItem, (click)='newProfile()') i.fas.fa-fw.fa-plus span(translate) New profile button(ngbDropdownItem, (click)='newProfileGroup()') i.fas.fa-fw.fa-plus span(translate) New profile Group .list-group.mt-3.mb-3 ng-container(*ngFor='let group of profileGroups') ng-container(*ngIf='isGroupVisible(group)') .list-group-item.list-group-item-action.d-flex.align-items-center( (click)='toggleGroupCollapse(group)' ) .fa.fa-fw.fa-chevron-right(*ngIf='group.collapsed && group.profiles?.length > 0') .fa.fa-fw.fa-chevron-down(*ngIf='!group.collapsed && group.profiles?.length > 0') span.ms-3.me-auto {{group.name || ("Ungrouped"|translate)}} button.btn.btn-sm.btn-link.hover-reveal.ms-2( *ngIf='group.editable && group.name', (click)='$event.stopPropagation(); editProfileGroup(group)' ) i.fas.fa-pencil-alt button.btn.btn-sm.btn-link.hover-reveal.ms-2( *ngIf='group.editable && group.name', (click)='$event.stopPropagation(); deleteProfileGroup(group)' ) i.fas.fa-trash-alt ng-container(*ngIf='!group.collapsed') ng-container(*ngFor='let profile of group.profiles') .list-group-item.ps-5.d-flex.align-items-center( *ngIf='isProfileVisible(profile)', [class.list-group-item-action]='!profile.isBuiltin', (click)='profile.isBuiltin ? null : editProfile(profile)' ) profile-icon( [icon]='profile.icon', [color]='profile.color' ) .no-wrap {{profile.name}} .text-muted.no-wrap.ms-2 {{getDescription(profile)}} .me-auto button.btn.btn-link.hover-reveal.ms-1(*ngIf='!profile.isTemplate', (click)='$event.stopPropagation(); launchProfile(profile)') i.fas.fa-play .ms-1.hover-reveal(ngbDropdown, placement='bottom-right top-right auto') button.btn.btn-link.ms-1( ngbDropdownToggle, (click)='$event.stopPropagation()' ) i.fas.fa-fw.fa-ellipsis-vertical div(ngbDropdownMenu) button.dropdown-item( ngbDropdownItem, (click)='$event.stopPropagation(); newProfile(profile)' ) i.fas.fa-fw.fa-copy span(translate) Duplicate button.dropdown-item( ngbDropdownItem, *ngIf='profile.id && !isProfileBlacklisted(profile)', (click)='$event.stopPropagation(); blacklistProfile(profile)' ) i.fas.fa-fw.fa-eye-slash span(translate) Hide button.dropdown-item( ngbDropdownItem, *ngIf='profile.id && isProfileBlacklisted(profile)', (click)='$event.stopPropagation(); unblacklistProfile(profile)' ) i.fas.fa-fw.fa-eye span(translate) Show button.dropdown-item( *ngIf='!profile.isBuiltin', (click)='$event.stopPropagation(); deleteProfile(profile)' ) i.fas.fa-fw.fa-trash-alt span(translate) Delete .ms-1(class='badge text-bg-{{getTypeColorClass(profile)}}') {{getTypeLabel(profile)}} .ms-1.text-danger.fas.fa-eye-slash(*ngIf='isProfileBlacklisted(profile)') li(ngbNavItem) a(ngbNavLink, translate) Advanced ng-template(ngbNavContent) .form-line.content-box(*ngIf='config.store.profiles.length > 0') .header .title(translate) Show recent profiles in selector .description(translate) Set to 0 to disable recent profiles input.form-control( type='number', min='0', step='1', [(ngModel)]='config.store.terminal.showRecentProfiles', (ngModelChange)='config.save()' ) .form-line.content-box(*ngIf='config.store.profiles.length > 0') .header .title(translate) Show built-in profiles in selector .description(translate) If disabled, only custom profiles will show up in the profile selector toggle( [(ngModel)]='config.store.terminal.showBuiltinProfiles', (ngModelChange)='config.save()' ) .form-line.content-box(*ngIf='hostApp.platform === Platform.Windows') .header .title(translate) Terminal identification .description(translate) How Tabby presents itself through environment vars select.form-control( [(ngModel)]='config.store.terminal.identification', (ngModelChange)='config.save()', ) option(ngValue='wt', translation) Windows Terminal option(ngValue='cygwin', translation) Cygwin .form-line .header .title(translate) Default "Connect to" type .description(translate) Default connection type used by quick connect feature (ex. SSH, Telnet) select.form-control( [(ngModel)]='config.store.defaultQuickConnectProvider', (ngModelChange)='config.save()', ) option( *ngFor='let provider of getQuickConnectProviders()', [ngValue]='provider.id' ) {{provider.name}} .form-line.content-box .header .title(translate) Default profile settings .description(translate) These apply to all profiles of a given type .list-group.mt-3.mb-3.content-box a.list-group-item.list-group-item-action.d-flex.align-items-center( (click)='editDefaults(provider)', *ngFor='let provider of profileProviders' ) {{provider.name|translate}} .me-auto button.btn.btn-link.hover-reveal.ms-1((click)='$event.stopPropagation(); deleteDefaults(provider)') i.fas.fa-trash-arrow-up div([ngbNavOutlet]='nav') ================================================ FILE: tabby-settings/src/components/profilesSettingsTab.component.scss ================================================ profile-icon { width: 1.25rem; margin-right: 0.25rem; } profile-icon + * { margin-left: 10px; } ================================================ FILE: tabby-settings/src/components/profilesSettingsTab.component.ts ================================================ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import deepClone from 'clone-deep' import { Component, Inject } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { ConfigService, HostAppService, Profile, SelectorService, ProfilesService, PromptModalComponent, PlatformService, BaseComponent, PartialProfile, ProfileProvider, TranslateService, Platform, ProfileGroup, PartialProfileGroup, QuickConnectProfileProvider } from 'tabby-core' import { EditProfileModalComponent } from './editProfileModal.component' import { EditProfileGroupModalComponent, EditProfileGroupModalComponentResult } from './editProfileGroupModal.component' _('Filter') _('Ungrouped') interface CollapsableProfileGroup extends ProfileGroup { collapsed: boolean } /** @hidden */ @Component({ templateUrl: './profilesSettingsTab.component.pug', styleUrls: ['./profilesSettingsTab.component.scss'], }) export class ProfilesSettingsTabComponent extends BaseComponent { builtinProfiles: PartialProfile[] = [] profiles: PartialProfile[] = [] templateProfiles: PartialProfile[] = [] customProfiles: PartialProfile[] = [] profileGroups: PartialProfileGroup[] filter = '' Platform = Platform constructor ( public config: ConfigService, public hostApp: HostAppService, @Inject(ProfileProvider) public profileProviders: ProfileProvider[], private profilesService: ProfilesService, private selector: SelectorService, private ngbModal: NgbModal, private platform: PlatformService, private translate: TranslateService, ) { super() this.profileProviders.sort((a, b) => a.name.localeCompare(b.name)) } async ngOnInit (): Promise { await this.refreshProfileGroups() await this.refreshProfiles() this.subscribeUntilDestroyed(this.config.changed$, () => this.refreshProfileGroups()) this.subscribeUntilDestroyed(this.config.changed$, () => this.refreshProfiles()) } async refreshProfiles (): Promise { this.builtinProfiles = (await this.profilesService.getProfiles()).filter(x => x.isBuiltin) this.customProfiles = (await this.profilesService.getProfiles()).filter(x => !x.isBuiltin) this.templateProfiles = this.builtinProfiles.filter(x => x.isTemplate) this.builtinProfiles = this.builtinProfiles.filter(x => !x.isTemplate) } launchProfile (profile: PartialProfile): void { this.profilesService.openNewTabForProfile(profile) } async newProfile (base?: PartialProfile): Promise { if (!base) { let profiles = await this.profilesService.getProfiles() profiles = profiles.filter(x => !this.isProfileBlacklisted(x)) profiles.sort((a, b) => (a.weight ?? 0) - (b.weight ?? 0)) base = await this.selector.show( this.translate.instant('Select a base profile to use as a template'), profiles.map(p => ({ icon: p.icon ?? undefined, description: this.profilesService.getDescription(p) ?? undefined, name: p.group ? `${this.profilesService.resolveProfileGroupName(p.group)} / ${p.name}` : p.name, result: p, })), ).catch(() => undefined) if (!base) { return } } const baseProfile: PartialProfile = deepClone(base) delete baseProfile.id if (base.isTemplate) { baseProfile.name = '' } else if (!base.isBuiltin) { baseProfile.name = this.translate.instant('{name} copy', base) } baseProfile.isBuiltin = false baseProfile.isTemplate = false const result = await this.showProfileEditModal(baseProfile) if (!result) { return } if (!result.name) { const cfgProxy = this.profilesService.getConfigProxyForProfile(result) result.name = this.profilesService.providerForProfile(result)?.getSuggestedName(cfgProxy) ?? this.translate.instant('{name} copy', base) } await this.profilesService.newProfile(result) await this.config.save() } async editProfile (profile: PartialProfile): Promise { const result = await this.showProfileEditModal(profile) if (!result) { return } await this.profilesService.writeProfile(result) await this.config.save() } async showProfileEditModal (profile: PartialProfile): Promise|null> { const modal = this.ngbModal.open( EditProfileModalComponent, { size: 'lg' }, ) const provider = this.profilesService.providerForProfile(profile) if (!provider) { throw new Error('Cannot edit a profile without a provider') } modal.componentInstance.profile = deepClone(profile) modal.componentInstance.profileProvider = provider const result = await modal.result.catch(() => null) if (!result) { return null } result.type = provider.id return result } async deleteProfile (profile: PartialProfile): Promise { if ((await this.platform.showMessageBox( { type: 'warning', message: this.translate.instant('Delete "{name}"?', profile), buttons: [ this.translate.instant('Delete'), this.translate.instant('Keep'), ], defaultId: 1, cancelId: 1, }, )).response === 0) { await this.profilesService.deleteProfile(profile) await this.config.save() } } async newProfileGroup (): Promise { const modal = this.ngbModal.open(PromptModalComponent) modal.componentInstance.prompt = this.translate.instant('New group name') const result = await modal.result.catch(() => null) if (result?.value.trim()) { await this.profilesService.newProfileGroup({ id: '', name: result.value }) await this.config.save() } } async editProfileGroup (group: PartialProfileGroup): Promise { const result = await this.showProfileGroupEditModal(group) if (!result) { return } await this.profilesService.writeProfileGroup(ProfilesSettingsTabComponent.collapsableIntoPartialProfileGroup(result)) await this.config.save() } async showProfileGroupEditModal (group: PartialProfileGroup): Promise|null> { const modal = this.ngbModal.open( EditProfileGroupModalComponent, { size: 'lg' }, ) modal.componentInstance.group = deepClone(group) modal.componentInstance.providers = this.profileProviders const result: EditProfileGroupModalComponentResult | null = await modal.result.catch(() => null) if (!result) { return null } if (result.provider) { return this.editProfileGroupDefaults(result.group, result.provider) } return result.group } private async editProfileGroupDefaults (group: PartialProfileGroup, provider: ProfileProvider): Promise|null> { const modal = this.ngbModal.open( EditProfileModalComponent, { size: 'lg' }, ) const model = group.defaults?.[provider.id] ?? {} model.type = provider.id modal.componentInstance.profile = Object.assign({}, model) modal.componentInstance.profileProvider = provider modal.componentInstance.defaultsMode = 'group' const result = await modal.result.catch(() => null) if (result) { // Fully replace the config for (const k in model) { // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete model[k] } Object.assign(model, result) if (!group.defaults) { group.defaults = {} } group.defaults[provider.id] = model } return this.showProfileGroupEditModal(group) } async deleteProfileGroup (group: PartialProfileGroup): Promise { if ((await this.platform.showMessageBox( { type: 'warning', message: this.translate.instant('Delete "{name}"?', group), buttons: [ this.translate.instant('Delete'), this.translate.instant('Keep'), ], defaultId: 1, cancelId: 1, }, )).response === 0) { let deleteProfiles = false if ((group.profiles?.length ?? 0) > 0 && (await this.platform.showMessageBox( { type: 'warning', message: this.translate.instant('Delete the group\'s profiles?'), buttons: [ this.translate.instant('Move to "Ungrouped"'), this.translate.instant('Delete'), ], defaultId: 0, cancelId: 0, }, )).response !== 0) { deleteProfiles = true } await this.profilesService.deleteProfileGroup(group, { deleteProfiles }) await this.config.save() } } async refreshProfileGroups (): Promise { const profileGroupCollapsed = JSON.parse(window.localStorage.profileGroupCollapsed ?? '{}') const groups = await this.profilesService.getProfileGroups({ includeNonUserGroup: true, includeProfiles: true }) groups.sort((a, b) => a.name.localeCompare(b.name)) groups.sort((a, b) => (a.id === 'built-in' || !a.editable ? 1 : 0) - (b.id === 'built-in' || !b.editable ? 1 : 0)) groups.sort((a, b) => (a.id === 'ungrouped' ? 0 : 1) - (b.id === 'ungrouped' ? 0 : 1)) this.profileGroups = groups.map(g => ProfilesSettingsTabComponent.intoPartialCollapsableProfileGroup(g, profileGroupCollapsed[g.id] ?? false)) } isGroupVisible (group: PartialProfileGroup): boolean { return !this.filter || (group.profiles ?? []).some(x => this.isProfileVisible(x)) } isProfileVisible (profile: PartialProfile): boolean { return !this.filter || (profile.name + '$' + (this.getDescription(profile) ?? '')).toLowerCase().includes(this.filter.toLowerCase()) } getDescription (profile: PartialProfile): string|null { return this.profilesService.getDescription(profile) } getTypeLabel (profile: PartialProfile): string { const name = this.profilesService.providerForProfile(profile)?.name if (name === 'Local terminal') { return '' } return name ? this.translate.instant(name) : this.translate.instant('Unknown') } getTypeColorClass (profile: PartialProfile): string { return { ssh: 'secondary', serial: 'success', telnet: 'info', 'split-layout': 'primary', }[this.profilesService.providerForProfile(profile)?.id ?? ''] ?? 'warning' } toggleGroupCollapse (group: PartialProfileGroup): void { if (group.profiles?.length === 0) { return } group.collapsed = !group.collapsed this.saveProfileGroupCollapse(group) } async editDefaults (provider: ProfileProvider): Promise { const modal = this.ngbModal.open( EditProfileModalComponent, { size: 'lg' }, ) const model = this.profilesService.getProviderDefaults(provider) model.type = provider.id modal.componentInstance.profile = Object.assign({}, model) modal.componentInstance.profileProvider = provider modal.componentInstance.defaultsMode = 'enabled' const result = await modal.result.catch(() => null) if (result) { // Fully replace the config for (const k in model) { // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete model[k] } Object.assign(model, result) this.profilesService.setProviderDefaults(provider, model) await this.config.save() } } async deleteDefaults (provider: ProfileProvider): Promise { if ((await this.platform.showMessageBox( { type: 'warning', message: this.translate.instant('Restore settings to defaults ?'), buttons: [ this.translate.instant('Delete'), this.translate.instant('Keep'), ], defaultId: 1, cancelId: 1, }, )).response === 0) { this.profilesService.setProviderDefaults(provider, {}) await this.config.save() } } blacklistProfile (profile: PartialProfile): void { this.config.store.profileBlacklist = [...this.config.store.profileBlacklist, profile.id] this.config.save() } unblacklistProfile (profile: PartialProfile): void { this.config.store.profileBlacklist = this.config.store.profileBlacklist.filter(x => x !== profile.id) this.config.save() } isProfileBlacklisted (profile: PartialProfile): boolean { return profile.id && this.config.store.profileBlacklist.includes(profile.id) } getQuickConnectProviders (): ProfileProvider[] { return this.profileProviders.filter(x => x instanceof QuickConnectProfileProvider) } /** * Save ProfileGroup collapse state in localStorage */ private saveProfileGroupCollapse (group: PartialProfileGroup): void { const profileGroupCollapsed = JSON.parse(window.localStorage.profileGroupCollapsed ?? '{}') profileGroupCollapsed[group.id] = group.collapsed window.localStorage.profileGroupCollapsed = JSON.stringify(profileGroupCollapsed) } private static collapsableIntoPartialProfileGroup (group: PartialProfileGroup): PartialProfileGroup { const g: any = { ...group } delete g.collapsed return g } private static intoPartialCollapsableProfileGroup (group: PartialProfileGroup, collapsed: boolean): PartialProfileGroup { const collapsableGroup = { ...group, collapsed, } return collapsableGroup } } ================================================ FILE: tabby-settings/src/components/releaseNotesTab.component.pug ================================================ .container( infiniteScroll, [infiniteScrollDistance]='2', [infiniteScrollThrottle]='50', infiniteScrollContainer='release-notes-tab', [fromRoot]='true', (scrolled)='onScrolled()' ) div(*ngFor='let release of releases') h1 {{release.name}} .text-muted {{release.version}} / {{release.date|tabbyDate}} section([fastHtmlBind]='release.content') ================================================ FILE: tabby-settings/src/components/releaseNotesTab.component.scss ================================================ :host { overflow-y: scroll; width: 100%; padding: 30px; } ::ng-deep img { max-width: 100%; } h1 { margin: 0; } section { margin: 20px 0; } ================================================ FILE: tabby-settings/src/components/releaseNotesTab.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import axios from 'axios' import * as marked from '../../node_modules/marked/src/marked' import { Component, Injector } from '@angular/core' import { BaseTabComponent, TranslateService } from 'tabby-core' export interface Release { name: string version: string content: string date: Date } /** @hidden */ @Component({ selector: 'release-notes-tab', templateUrl: './releaseNotesTab.component.pug', styleUrls: ['./releaseNotesTab.component.scss'], }) export class ReleaseNotesComponent extends BaseTabComponent { releases: Release[] = [] lastPage = 1 constructor (translate: TranslateService, injector: Injector) { super(injector) this.setTitle(translate.instant(_('Release notes'))) this.loadReleases(1) } async loadReleases (page) { console.log('Loading releases page', page) const response = await axios.get(`https://api.github.com/repos/eugeny/tabby/releases?page=${page}`, { headers: { Accept: 'application/vnd.github.v3+json' }, }) this.releases = this.releases.concat(response.data.map(r => ({ name: r.name, version: r.tag_name, content: marked.marked(r.body), date: new Date(r.created_at), }))) this.lastPage = page } onScrolled () { this.loadReleases(this.lastPage + 1) } } ================================================ FILE: tabby-settings/src/components/setVaultPassphraseModal.component.pug ================================================ h3.modal-header.m-0.pb-0(translate) Set master passphrase .modal-body .mb-2(translate) You can change it later, but it's unrecoverable if forgotten. .input-group input.form-control.form-control-lg( [type]='showPassphrase ? "text" : "password"', autofocus, [(ngModel)]='passphrase', #input, placeholder='Master passphrase', (keyup.enter)='ok()', (keyup.esc)='cancel()', ) button.btn.btn-secondary((click)='showPassphrase = !showPassphrase') i.fas.fa-eye .modal-footer button.btn.btn-primary((click)='ok()', translate) Set passphrase button.btn.btn-danger((click)='cancel()', translate) Cancel ================================================ FILE: tabby-settings/src/components/setVaultPassphraseModal.component.ts ================================================ import { Component, ViewChild, ElementRef } from '@angular/core' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' /** @hidden */ @Component({ templateUrl: './setVaultPassphraseModal.component.pug', }) export class SetVaultPassphraseModalComponent { passphrase: string showPassphrase = false @ViewChild('input') input: ElementRef constructor ( private modalInstance: NgbActiveModal, ) { } ngOnInit (): void { setTimeout(() => { this.input.nativeElement.focus() }) } ok (): void { this.modalInstance.close(this.passphrase) } cancel (): void { this.modalInstance.close(null) } } ================================================ FILE: tabby-settings/src/components/settingsTab.component.pug ================================================ .content ul.nav-pills(ngbNav, #nav='ngbNav', [activeId]='activeTab', orientation='vertical') li(ngbNavItem='application') a(ngbNavLink) i.fas.fa-fw.fa-window-maximize.me-2 span(translate) Application ng-template(ngbNavContent) .content-box .row .col-12.col-md-6 .logo-area .tabby-logo.mt-3 h1.tabby-title Tabby sup α .text-muted {{homeBase.appVersion}} button.btn.btn-secondary.mt-3.mb-2( *ngIf='!updateAvailable && hostApp.platform !== Platform.Web', (click)='checkForUpdates()', [disabled]='checkingForUpdate' ) i.fas.fa-sync( [class.fa-spin]='checkingForUpdate' ) span(translate) Check for updates button.btn.btn-info.mt-3.mb-2( *ngIf='updateAvailable', (click)='updater.update()', ) i.fas.fa-sync span(translate) Update .col-12.col-md-6 .list-group.list-group-light.mb-5 button.list-group-item.list-group-item-action.link-card((click)='homeBase.reportBug()') i.fas.fa-fw.fa-bug div div(translate) Report a problem small.text-muted(translate) Generate a pre-filled GitHub issue button.list-group-item.list-group-item-action.link-card((click)='homeBase.openDiscord()') i.fab.fa-fw.fa-discord div div(translate) Community small.text-muted(translate) On Discord button.list-group-item.list-group-item-action.link-card((click)='homeBase.openGitHub()') i.fab.fa-fw.fa-github div div GitHub small.text-muted(translate) Source code button.list-group-item.list-group-item-action.link-card((click)='showReleaseNotes()') i.fas.fa-fw.fa-book div div(translate) What's new small.text-muted(translate) Show release notes h3(translate) Application settings .form-line .header .title(translate) Language a.description((click)='homeBase.openTranslations()') span(translate) Help translate Tabby i.fas.fa-external-link-square-alt.ms-1 select.form-control([(ngModel)]='config.store.language', (ngModelChange)='saveConfiguration(true)') option([ngValue]='null', translate) Automatic option( [value]='lang.code', *ngFor='let lang of allLanguages' ) {{lang.name}} .form-line(*ngIf='platform.isShellIntegrationSupported()') .header .title(translate) Shell integration .description(translate) Allows quickly opening a terminal in the selected folder toggle([ngModel]='isShellIntegrationInstalled', (ngModelChange)='toggleShellIntegration()') .form-line(*ngIf='hostApp.platform !== Platform.Web') .header .title(translate) Enable analytics .description(translate) We're only tracking your Tabby and OS versions. toggle( [(ngModel)]='config.store.enableAnalytics', (ngModelChange)='saveConfiguration(true)', ) .form-line(*ngIf='hostApp.platform !== Platform.Web') .header .title(translate) Automatic Updates .description(translate) Enable automatic installation of updates when they become available. toggle([(ngModel)]='config.store.enableAutomaticUpdates', (ngModelChange)='saveConfiguration()') .form-line(*ngIf='hostApp.platform !== Platform.Web') .header .title(translate) Debugging button.btn.btn-secondary((click)='hostWindow.openDevTools()') i.fas.fa-bug span(translate) Open DevTools h3(translate) Accessibility .form-line .header .title(translate) Enable animations toggle([(ngModel)]='config.store.accessibility.animations', (ngModelChange)='saveConfiguration()') .form-line .header .title(translate) Minimum contrast ratio input.form-control( type='number', min='1', max='21', step='0.5', [(ngModel)]='config.store.terminal.minimumContrastRatio', (ngModelChange)='config.save()' ) ng-container(*ngFor='let provider of settingsProviders') li(*ngIf='provider.prioritized', [ngbNavItem]='provider.id') a.d-flex.align-items-center(ngbNavLink) i(class='fas fa-fw me-2 fa-{{provider.icon}}') span {{provider.title|translate}} ng-template(ngbNavContent) settings-tab-body([provider]='provider') .mb-3 ng-container(*ngFor='let provider of settingsProviders') li(*ngIf='!provider.prioritized', [ngbNavItem]='provider.id') a.d-flex.align-items-center(ngbNavLink) i(class='fas fa-fw me-2 fa-{{provider.icon || "puzzle-piece"}}') span {{provider.title|translate}} ng-template(ngbNavContent) settings-tab-body([provider]='provider') li(ngbNavItem='config-file') a.d-flex.align-items-center(ngbNavLink) i.fas.fa-fw.fa-code.me-2 span(translate) Config file ng-template.test(ngbNavContent) .d-flex.flex-column.w-100.h-100 .h-100.d-flex .w-100.d-flex.flex-column h3(translate) Config file textarea.form-control.h-100( [(ngModel)]='configFile' ) .w-100.d-flex.flex-column(*ngIf='showConfigDefaults') h3(translate) Defaults textarea.form-control.h-100( [(ngModel)]='configDefaults', readonly ) .mt-3.d-flex button.btn.btn-primary((click)='saveConfigFile()', *ngIf='isConfigFileValid()') i.fas.fa-check.me-2 span(translate) Save and apply button.btn.btn-primary(disabled, *ngIf='!isConfigFileValid()') i.fas.fa-exclamation-triangle.me-2 span(translate) Invalid syntax button.btn.btn-secondary.ms-auto( (click)='showConfigDefaults = !showConfigDefaults', translate ) Show defaults button.btn.btn-secondary.ms-3( *ngIf='platform.getConfigPath()', (click)='showConfigFile()' ) i.fas.fa-external-link-square-alt.me-2 span(translate) Show config file div([ngbNavOutlet]='nav') button.btn.btn-warning.btn-block( *ngIf='config.restartRequested', (click)='restartApp()', translate ) Restart the app to apply changes ================================================ FILE: tabby-settings/src/components/settingsTab.component.scss ================================================ :host { display: flex; flex: auto; flex-direction: column; min-width: 0; >.btn-block { margin: 20px; width: auto; flex: none; } .logo-area { .tabby-logo { margin: 0 0 0 -8px; width: 60px; height: 60px; } .tabby-title { text-align: left; } } .link-card { display: flex; line-height: 1; align-items: center; } > .content { display: flex; min-height: 0; flex: 1 0 0; > .nav { padding: 20px 10px; width: 222px; flex: none; overflow-y: auto; flex-wrap: nowrap; } > .tab-content { flex: auto; padding: 20px 0; overflow-y: auto; display: flex; flex-direction: column; > ::ng-deep .tab-pane { padding: 0 30px; min-height: 100%; > settings-tab-body > * { display: block; } } } } &.pad-window-controls > .content > .nav { padding-top: 40px; } } textarea { font-family: 'Source Code Pro', monospace; font-size: 12px; min-height: 120px; } ================================================ FILE: tabby-settings/src/components/settingsTab.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import * as yaml from 'js-yaml' import { debounce } from 'utils-decorators/dist/esm/debounce/debounce' import { Component, Inject, Input, HostBinding, Injector } from '@angular/core' import { ConfigService, BaseTabComponent, HostAppService, Platform, HomeBaseService, UpdaterService, PlatformService, HostWindowService, AppService, LocaleService, TranslateService, } from 'tabby-core' import { SettingsTabProvider } from '../api' import { ReleaseNotesComponent } from './releaseNotesTab.component' /** @hidden */ @Component({ selector: 'settings-tab', templateUrl: './settingsTab.component.pug', styleUrls: [ './settingsTab.component.scss', ], }) export class SettingsTabComponent extends BaseTabComponent { @Input() activeTab: string Platform = Platform configDefaults: any configFile: string isShellIntegrationInstalled = false checkingForUpdate = false updateAvailable = false showConfigDefaults = false allLanguages = LocaleService.allLanguages @HostBinding('class.pad-window-controls') padWindowControls = false constructor ( public config: ConfigService, public hostApp: HostAppService, public hostWindow: HostWindowService, public homeBase: HomeBaseService, public platform: PlatformService, public locale: LocaleService, public updater: UpdaterService, private app: AppService, @Inject(SettingsTabProvider) public settingsProviders: SettingsTabProvider[], translate: TranslateService, injector: Injector, ) { super(injector) this.setTitle(translate.instant(_('Settings'))) this.settingsProviders = config.enabledServices(this.settingsProviders) this.settingsProviders = this.settingsProviders.filter(x => !!x.getComponentType()) this.settingsProviders.sort((a, b) => a.weight - b.weight + a.title.localeCompare(b.title)) this.configDefaults = yaml.dump(config.getDefaults()) const onConfigChange = () => { this.configFile = config.readRaw() this.padWindowControls = hostApp.platform === Platform.macOS && config.store.appearance.tabsLocation !== 'top' } this.subscribeUntilDestroyed(config.changed$, onConfigChange) onConfigChange() } async ngOnInit () { this.isShellIntegrationInstalled = await this.platform.isShellIntegrationInstalled() } async toggleShellIntegration () { if (!this.isShellIntegrationInstalled) { await this.platform.installShellIntegration() } else { await this.platform.uninstallShellIntegration() } this.isShellIntegrationInstalled = await this.platform.isShellIntegrationInstalled() } ngOnDestroy () { this.config.save() } restartApp () { this.hostApp.relaunch() } @debounce(500) saveConfiguration (requireRestart?: boolean) { this.config.save() if (requireRestart) { this.config.requestRestart() } } saveConfigFile () { if (this.isConfigFileValid()) { this.config.writeRaw(this.configFile) } } showConfigFile () { this.platform.showItemInFolder(this.platform.getConfigPath()!) } isConfigFileValid () { try { yaml.load(this.configFile) return true } catch { return false } } async checkForUpdates () { this.checkingForUpdate = true this.updateAvailable = await this.updater.check() this.checkingForUpdate = false } showReleaseNotes () { this.app.openNewTabRaw({ type: ReleaseNotesComponent, }) } } ================================================ FILE: tabby-settings/src/components/settingsTabBody.component.ts ================================================ import { Component, Input, ViewContainerRef, ViewChild, ComponentFactoryResolver, ComponentRef } from '@angular/core' import { SettingsTabProvider } from '../api' /** @hidden */ @Component({ selector: 'settings-tab-body', template: '', styles: [` :host { display: block; padding-bottom: 20px; max-width: 600px; } `], }) export class SettingsTabBodyComponent { @Input() provider: SettingsTabProvider @ViewChild('placeholder', { read: ViewContainerRef }) placeholder: ViewContainerRef component: ComponentRef constructor (private componentFactoryResolver: ComponentFactoryResolver) { } ngAfterViewInit (): void { // run after the change detection finishes setImmediate(() => { this.component = this.placeholder.createComponent( this.componentFactoryResolver.resolveComponentFactory( this.provider.getComponentType(), ), ) }) } } ================================================ FILE: tabby-settings/src/components/showSecretModal.component.pug ================================================ h4.modal-header.m-0.pb-0 {{title}} .modal-body .input-group.w-100 input.form-control( type='text', [(ngModel)]='secret.value', disabled ) button.btn.btn-secondary( (click)='copySecret()' ) i.fas.fa-copy .modal-footer button.btn.btn-primary((click)='close()', translate) Close ================================================ FILE: tabby-settings/src/components/showSecretModal.component.ts ================================================ import { Component, Input } from '@angular/core' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { NotificationsService, VaultFileSecret } from 'tabby-core' /** @hidden */ @Component({ templateUrl: './showSecretModal.component.pug', }) export class ShowSecretModalComponent { @Input() title: string @Input() secret: VaultFileSecret constructor ( public modalInstance: NgbActiveModal, private notifications: NotificationsService, ) { } close (): void { this.modalInstance.dismiss() } copySecret (): void { navigator.clipboard.writeText(this.secret.value) // Show a notification this.notifications.info('Copied to clipboard') } } ================================================ FILE: tabby-settings/src/components/vaultSettingsTab.component.pug ================================================ .text-center(*ngIf='!vault.isEnabled()') i.fas.fa-key.fa-3x.m-3 h3.m-3(translate) Vault is not configured .m-3(translate) Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases. button.btn.btn-primary.m-2((click)='enableVault()', translate) Set master passphrase div(*ngIf='vault.isEnabled()') .d-flex.align-items-center.mb-3 h3.m-0(translate) Vault .d-flex.ms-auto(ngbDropdown, *ngIf='vault.isEnabled()') button.btn.btn-secondary(ngbDropdownToggle, translate) Options div(ngbDropdownMenu) a(ngbDropdownItem, (click)='changePassphrase()') i.fas.fa-fw.fa-key span(translate) Change the master passphrase a(ngbDropdownItem, (click)='disableVault()') i.fas.fa-fw.fa-radiation-alt span(translate) Erase the Vault div(*ngIf='vaultContents') .text-center(*ngIf='!vaultContents.secrets.length') i.fas.fa-empty-set.fa-3x h3.m-3(translate) Vault is empty .list-group .list-group-item.d-flex.align-items-center.p-1.ps-3(*ngFor='let secret of vaultContents.secrets') i.fas.fa-key .me-auto {{getSecretLabel(secret)}} .hover-reveal(ngbDropdown) button.btn.btn-link(ngbDropdownToggle) i.fas.fa-ellipsis-v div(ngbDropdownMenu) button(ngbDropdownItem, (click)='showSecret(secret)') i.fas.fa-fw.fa-eye span(translate) Show button( ngbDropdownItem, *ngIf='secret.type === VAULT_SECRET_TYPE_FILE', (click)='renameFile(castAny(secret))' ) i.fas.fa-fw.fa-pencil-alt span(translate) Rename button( ngbDropdownItem, *ngIf='secret.type === VAULT_SECRET_TYPE_FILE', (click)='replaceFileContent(castAny(secret))' ) i.fas.fa-fw.fa-file-import span(translate) Replace button( ngbDropdownItem, *ngIf='secret.type === VAULT_SECRET_TYPE_FILE', (click)='exportFile(castAny(secret))' ) i.fas.fa-fw.fa-file-export span(translate) Export button(ngbDropdownItem, (click)='removeSecret(secret)') i.fas.fa-fw.fa-trash span(translate) Delete h3.mt-5(translate) Options .form-line .header .title(translate) Encrypt config file .description(translate) Puts all of Tabby's configuration into the vault toggle( [ngModel]='config.store.encrypted', (click)='toggleConfigEncrypted()', ) .text-center(*ngIf='!vaultContents') i.fas.fa-key.fa-3x h3.m-3(translate) Vault is locked button.btn.btn-primary.m-2((click)='loadVault()', translate) Show vault contents ================================================ FILE: tabby-settings/src/components/vaultSettingsTab.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, HostBinding } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { BaseComponent, VaultService, VaultSecret, Vault, PlatformService, ConfigService, VAULT_SECRET_TYPE_FILE, PromptModalComponent, VaultFileSecret, TranslateService } from 'tabby-core' import { SetVaultPassphraseModalComponent } from './setVaultPassphraseModal.component' import { ShowSecretModalComponent } from './showSecretModal.component' /** @hidden */ @Component({ selector: 'vault-settings-tab', templateUrl: './vaultSettingsTab.component.pug', }) export class VaultSettingsTabComponent extends BaseComponent { vaultContents: Vault|null = null VAULT_SECRET_TYPE_FILE = VAULT_SECRET_TYPE_FILE @HostBinding('class.content-box') true constructor ( public vault: VaultService, public config: ConfigService, private platform: PlatformService, private ngbModal: NgbModal, private translate: TranslateService, ) { super() if (vault.isOpen()) { this.loadVault() } } async loadVault (): Promise { this.vaultContents = await this.vault.load() } async enableVault () { const modal = this.ngbModal.open(SetVaultPassphraseModalComponent) const newPassphrase = await modal.result.catch(() => null) if (newPassphrase) { await this.vault.setEnabled(true, newPassphrase) this.vaultContents = await this.vault.load(newPassphrase) } } async disableVault () { if ((await this.platform.showMessageBox( { type: 'warning', message: this.translate.instant('Delete vault contents?'), buttons: [ this.translate.instant('Delete'), this.translate.instant('Keep'), ], defaultId: 1, cancelId: 1, }, )).response === 0) { await this.vault.setEnabled(false) } } async changePassphrase () { if (!this.vaultContents) { this.vaultContents = await this.vault.load() } if (!this.vaultContents) { return } const modal = this.ngbModal.open(SetVaultPassphraseModalComponent) const newPassphrase = await modal.result.catch(() => null) if (newPassphrase) { this.vault.save(this.vaultContents, newPassphrase) } } async toggleConfigEncrypted () { this.config.store.encrypted = !this.config.store.encrypted try { await this.config.save() } catch (e) { this.config.store.encrypted = !this.config.store.encrypted throw e } } getSecretLabel (secret: VaultSecret) { if (secret.type === 'ssh:password') { return this.translate.instant('SSH password for {user}@{host}:{port}', (secret as any).key) } if (secret.type === 'ssh:key-passphrase') { return this.translate.instant('Passphrase for a private key with hash {hash}...', { hash: (secret as any).key.hash.substring(0, 8) }) } if (secret.type === VAULT_SECRET_TYPE_FILE) { // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion return this.translate.instant('File: {description}', (secret as VaultFileSecret).key) } return this.translate.instant('Unknown secret of type {type} for {key}', { type: secret.type, key: JSON.stringify(secret.key) }) } showSecret (secret: VaultSecret) { if (!this.vaultContents) { return } const modal = this.ngbModal.open(ShowSecretModalComponent) modal.componentInstance.title = this.getSecretLabel(secret) modal.componentInstance.secret = secret } removeSecret (secret: VaultSecret) { if (!this.vaultContents) { return } this.vaultContents.secrets = this.vaultContents.secrets.filter(x => x !== secret) this.vault.removeSecret(secret.type, secret.key) } async replaceFileContent (secret: VaultFileSecret) { const transfers = await this.platform.startUpload() if (!transfers.length) { return } await this.vault.updateSecret(secret, { ...secret, value: Buffer.from(await transfers[0].readAll()).toString('base64'), }) this.loadVault() } async renameFile (secret: VaultFileSecret) { const modal = this.ngbModal.open(PromptModalComponent) modal.componentInstance.prompt = this.translate.instant('New name') modal.componentInstance.value = secret.key.description const description = (await modal.result.catch(() => null))?.value if (!description) { return } await this.vault.updateSecret(secret, { ...secret, key: { ...secret.key, description, }, }) this.loadVault() } async exportFile (secret: VaultFileSecret) { this.vault.forgetPassphrase() // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion secret = (await this.vault.getSecret(secret.type, secret.key)) as VaultFileSecret const content = Buffer.from(secret.value, 'base64') const download = await this.platform.startDownload(secret.key.description, 0o600, content.length) if (download) { await download.write(content) download.close() } } castAny = (x: any) => x } ================================================ FILE: tabby-settings/src/components/windowSettingsTab.component.pug ================================================ h3.mb-3(translate) Window .form-line(*ngIf='themes.length > 1') .header .title(translate) Theme select.form-control( [(ngModel)]='config.store.appearance.theme', (ngModelChange)='saveConfiguration()', ) option(*ngFor='let theme of themes', [ngValue]='theme.name') {{theme.name|translate}} .form-line .header .title(translate) Spaciness .description(translate) Controls the amount of space between elements input( type='range', [(ngModel)]='config.store.appearance.spaciness', (mouseup)='saveConfiguration()', min='0.6', max='1.4', step='0.1' ) .form-line(*ngIf='hostApp.platform === Platform.Web') .header .title(translate) Ask before closing the browser tab .description(translate) Prevents accidental closing toggle( [(ngModel)]='config.store.web.preventAccidentalTabClosure', (ngModelChange)='saveConfiguration()', ) .form-line(*ngIf='platform.supportsWindowControls') .header .title(*ngIf='hostApp.platform !== Platform.macOS', translate) Acrylic background .title(*ngIf='hostApp.platform === Platform.macOS', translate) Vibrancy .description(translate) Gives the window a blurred transparent background toggle( [(ngModel)]='config.store.appearance.vibrancy', (ngModelChange)='saveConfiguration()' ) .form-line(*ngIf='config.store.appearance.vibrancy && isFluentVibrancySupported && config.store.hacks.enableFluentBackground') .header .title(translate) Background type .btn-group input.btn-check( type='radio', name='vibracy', [(ngModel)]='config.store.appearance.vibrancyType', (ngModelChange)='saveConfiguration()', id='vibrancyTypeBlur', [value]='"blur"' ) label.btn.btn-secondary( for='vibrancyTypeBlur' ) span(translate) Blur input.btn-check( type='radio', name='vibracy', [(ngModel)]='config.store.appearance.vibrancyType', (ngModelChange)='saveConfiguration()', id='vibrancyTypeFluent', [value]='"fluent"' ) label.btn.btn-secondary( for='vibrancyTypeFluent' ) span Fluent .form-line(*ngIf='platform.supportsWindowControls') .header .title(translate) Opacity input( type='range', [(ngModel)]='config.store.appearance.opacity', (ngModelChange)='saveConfiguration(); (hostApp.platform === Platform.Linux && config.requestRestart())', min='0.4', max='1', step='0.01' ) .form-line(*ngIf='platform.supportsWindowControls') .header .title(translate) Window frame .description(translate) Whether a custom window or an OS native window should be used .btn-group input.btn-check( type='radio', name='frame', [(ngModel)]='config.store.appearance.frame', (ngModelChange)='saveConfiguration(true)', id='frameNative', [value]='"native"' ) label.btn.btn-secondary(for='frameNative') span(translate) Native input.btn-check( type='radio', name='frame', [(ngModel)]='config.store.appearance.frame', (ngModelChange)='saveConfiguration(true)', id='frameThin', [value]='"thin"' ) label.btn.btn-secondary(for='frameThin') span(translate) Thin input.btn-check( type='radio', name='frame', [(ngModel)]='config.store.appearance.frame', (ngModelChange)='saveConfiguration(true)', id='frameFull', [value]='"full"' ) label.btn.btn-secondary(for='frameFull') span(translate) Full .form-line(*ngIf='hostApp.platform !== Platform.Web && hostApp.platform !== Platform.Linux') .header .title(translate) Hide tray icon .description(translate) Hide Tabby from tray or menu bar. toggle( [(ngModel)]='config.store.hideTray', (ngModelChange)='saveConfiguration(true)' ) h3.mt-4(translate) Docking .form-line(*ngIf='docking') .header .title(translate) Dock the terminal .description(translate) Snaps the window to a side of the screen .btn-group input.btn-check( type='radio', name='docking', [(ngModel)]='config.store.appearance.dock', (ngModelChange)='saveConfiguration(); docking.dock()', id='dockingOff', [value]='"off"' ) label.btn.btn-secondary(for='dockingOff') span(translate) Off input.btn-check( type='radio', name='docking', [(ngModel)]='config.store.appearance.dock', (ngModelChange)='saveConfiguration(); docking.dock()', id='dockingTop', [value]='"top"' ) label.btn.btn-secondary(for='dockingTop') span(translate) Top input.btn-check( type='radio', name='docking', [(ngModel)]='config.store.appearance.dock', (ngModelChange)='saveConfiguration(); docking.dock()', id='dockingLeft', [value]='"left"' ) label.btn.btn-secondary(for='dockingLeft') span(translate) Left input.btn-check( type='radio', name='docking', [(ngModel)]='config.store.appearance.dock', (ngModelChange)='saveConfiguration(); docking.dock()', id='dockingRight', [value]='"right"' ) label.btn.btn-secondary(for='dockingRight') span(translate) Right input.btn-check( type='radio', name='docking', [(ngModel)]='config.store.appearance.dock', (ngModelChange)='saveConfiguration(); docking.dock()', id='dockingBottom', [value]='"bottom"' ) label.btn.btn-secondary(for='dockingBottom') span(translate) Bottom .ms-5.form-line(*ngIf='docking && config.store.appearance.dock != "off"') .header .title(translate) Display on .description(translate) Snaps the window to a side of the screen div input.btn-check( type='radio', name='dockScreen', [(ngModel)]='config.store.appearance.dockScreen', (ngModelChange)='saveConfiguration(); docking.dock()', id='dockScreenCurrent', value='current' ) label.btn.btn-secondary(id='dockScreenCurrent') span(translate) Current input.btn-check( *ngFor='let screen of screens', type='radio', name='dockScreen', [(ngModel)]='config.store.appearance.dockScreen', (ngModelChange)='saveConfiguration(); docking.dock()', id='dockScreen{{screen.id}}', [value]='screen.id' ) label.btn.btn-secondary(*ngFor='let screen of screens', for='dockScreen{{screen.id}}') | {{screen.name}} .ms-5.form-line(*ngIf='docking && config.store.appearance.dock != "off"') .header .title(translate) Dock always on top .description(translate) Keep docked terminal always on top toggle( [(ngModel)]='config.store.appearance.dockAlwaysOnTop', (ngModelChange)='saveConfiguration(); docking.dock()', ) .ms-5.form-line(*ngIf='docking && config.store.appearance.dock != "off"') .header .title(translate) Docked terminal size .description(translate) Window dimension away from the edge input( type='range', [(ngModel)]='config.store.appearance.dockFill', (mouseup)='saveConfiguration(); docking.dock()', min='0.05', max='1', step='0.01' ) .ms-5.form-line(*ngIf='docking && config.store.appearance.dock != "off"') .header .title(translate) Docked terminal space .description(translate) Window dimension along the edge input( type='range', [(ngModel)]='config.store.appearance.dockSpace', (mouseup)='saveConfiguration(); docking.dock()', min='0.2', max='1', step='0.01' ) .ms-5.form-line(*ngIf='docking && config.store.appearance.dock != "off"') .header .title(translate) Hide window on focus loss .description(translate) Hides the docked terminal when you click away. toggle( [(ngModel)]='config.store.appearance.dockHideOnBlur', (ngModelChange)='saveConfiguration(); ', ) h3.mt-4(translate) Tabs .form-line .header .title(translate) Tabs location .btn-group input.btn-check( type='radio', name='tabsLocation', [(ngModel)]='config.store.appearance.tabsLocation', (ngModelChange)='saveConfiguration()', id='tabsLocationTop', [value]='"top"' ) label.btn.btn-secondary(for='tabsLocationTop') span(translate) Top input.btn-check( type='radio', name='tabsLocation', [(ngModel)]='config.store.appearance.tabsLocation', (ngModelChange)='saveConfiguration()', id='tabsLocationBottom', [value]='"bottom"' ) label.btn.btn-secondary(for='tabsLocationBottom') span(translate) Bottom input.btn-check( type='radio', name='tabsLocation', [(ngModel)]='config.store.appearance.tabsLocation', (ngModelChange)='saveConfiguration()', id='tabsLocationLeft', [value]='"left"' ) label.btn.btn-secondary(for='tabsLocationLeft') span(translate) Left input.btn-check( type='radio', name='tabsLocation', [(ngModel)]='config.store.appearance.tabsLocation', (ngModelChange)='saveConfiguration()', id='tabsLocationRight', [value]='"right"' ) label.btn.btn-secondary(for='tabsLocationRight') span(translate) Right .form-line .header .title(translate) Tabs width .btn-group input.btn-check( type='radio', name='flexTabs', [(ngModel)]='config.store.appearance.flexTabs', (ngModelChange)='saveConfiguration()', id='flexTabsTrue', [value]='true' ) label.btn.btn-secondary(for='flexTabsTrue') span(translate, translateComment='[Dynamic] tab width') id.tab-width.dynamic input.btn-check( type='radio', name='flexTabs', [(ngModel)]='config.store.appearance.flexTabs', (ngModelChange)='saveConfiguration()', id='flexTabsFalse', [value]='false' ) label.btn.btn-secondary(for='flexTabsFalse') span(translate) Fixed .form-line .header .title(translate) Show tabs in fullscreen mode toggle( [(ngModel)]='config.store.appearance.tabsInFullscreen', (ngModelChange)='config.save();', ) .form-line .header .title(translate) Hide tab index toggle( [(ngModel)]='config.store.terminal.hideTabIndex', (ngModelChange)='config.save();', ) .form-line .header .title(translate) Show profile icon on tab toggle( [(ngModel)]='config.store.terminal.showTabProfileIcon', (ngModelChange)='config.save();', ) .form-line .header .title(translate) Hide tab options button toggle( [(ngModel)]='config.store.terminal.hideTabOptionsButton', (ngModelChange)='config.save();', ) .form-line .header .title(translate) Hide tab close button toggle( [(ngModel)]='config.store.terminal.hideCloseButton', (ngModelChange)='config.save();', ) .form-line .header .title(translate) Close the window after closing the last tab toggle( [(ngModel)]='config.store.appearance.lastTabClosesWindow', (ngModelChange)='config.save();', ) h3.mt-4(translate) Panes .form-line() .header .title(translate) Pane resize step .description(translate) For keyboard shortcuts input( type='range', [(ngModel)]='config.store.terminal.paneResizeStep', (ngModelChange)='saveConfiguration();', min='0.1', max='0.9', step='0.05' ) .form-line() .header .title(translate) Focus follows mouse .description(translate) Moving the mouse over an inactive pane will cause it to activate toggle( [(ngModel)]='config.store.terminal.focusFollowsMouse', (ngModelChange)='config.save(); config.requestRestart()' ) h3.mt-4(translate) Hacks .form-line(*ngIf='hostApp.platform !== Platform.Web') .header .title(translate) Disable GPU acceleration .description(translate) Tick this if you're experiencing aliasing, ghosting or other visual issues toggle( [(ngModel)]='config.store.hacks.disableGPU', (ngModelChange)='config.save(); config.requestRestart()' ) .form-line(*ngIf='hostApp.platform === Platform.Windows && isFluentVibrancySupported') .header .title(translate) Enable fluent background option .description(translate) Experimental Windows 10 background style known to cause issues toggle( [(ngModel)]='config.store.hacks.enableFluentBackground', (ngModelChange)='config.save()' ) .form-line(*ngIf='hostApp.platform === Platform.Windows && isFluentVibrancySupported') .header .title(translate) Disable fluent background while dragging .description(translate) Fluent background sometimes causes drag lag toggle( [(ngModel)]='config.store.hacks.disableVibrancyWhileDragging', (ngModelChange)='config.save(); config.requestRestart()' ) ================================================ FILE: tabby-settings/src/components/windowSettingsTab.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { debounce } from 'utils-decorators/dist/esm/debounce/debounce' import { Component, HostBinding, Inject, NgZone, Optional } from '@angular/core' import { DockingService, ConfigService, Theme, HostAppService, Platform, isWindowsBuild, WIN_BUILD_FLUENT_BG_SUPPORTED, BaseComponent, Screen, PlatformService, } from 'tabby-core' /** @hidden */ @Component({ selector: 'window-settings-tab', templateUrl: './windowSettingsTab.component.pug', }) export class WindowSettingsTabComponent extends BaseComponent { screens: Screen[] Platform = Platform isFluentVibrancySupported = false @HostBinding('class.content-box') true constructor ( public config: ConfigService, public hostApp: HostAppService, public platform: PlatformService, public zone: NgZone, @Inject(Theme) public themes: Theme[], @Optional() public docking?: DockingService, ) { super() this.themes = config.enabledServices(this.themes) const dockingService = docking if (dockingService) { this.subscribeUntilDestroyed(dockingService.screensChanged$, () => { this.zone.run(() => this.screens = dockingService.getScreens()) }) this.screens = dockingService.getScreens() } this.isFluentVibrancySupported = isWindowsBuild(WIN_BUILD_FLUENT_BG_SUPPORTED) } @debounce(500) saveConfiguration (requireRestart?: boolean) { this.config.save() if (requireRestart) { this.config.requestRestart() } } } ================================================ FILE: tabby-settings/src/config.ts ================================================ import { ConfigProvider, Platform } from 'tabby-core' /** @hidden */ export class SettingsConfigProvider extends ConfigProvider { defaults = { configSync: { host: null, token: null, configID: null, auto: false, parts: { hotkeys: true, appearance: true, vault: true, }, }, hotkeys: { 'settings-tab': { __nonStructural: true, }, }, } platformDefaults = { [Platform.macOS]: { hotkeys: { settings: ['⌘-,'], }, }, [Platform.Windows]: { hotkeys: { settings: ['Ctrl-,'], }, }, [Platform.Linux]: { hotkeys: { settings: ['Ctrl-,'], }, }, } } ================================================ FILE: tabby-settings/src/hotkeys.ts ================================================ import { Inject, Injectable } from '@angular/core' import { HotkeyDescription, HotkeyProvider, TranslateService } from 'tabby-core' import { SettingsTabProvider } from './api' /** @hidden */ @Injectable() export class SettingsHotkeyProvider extends HotkeyProvider { hotkeys: HotkeyDescription[] = [ { id: 'settings', name: this.translate.instant('Open Settings'), }, ] constructor ( private translate: TranslateService, @Inject(SettingsTabProvider) private settingsProviders: SettingsTabProvider[], ) { super() } async provide (): Promise { return [ ...this.hotkeys, ...this.settingsProviders.map(provider => ({ id: `settings-tab.${provider.id}`, name: this.translate.instant('Open settings tab: {tab}', { tab: provider.title }), })), ] } } ================================================ FILE: tabby-settings/src/index.ts ================================================ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { FormsModule } from '@angular/forms' import { NgbModule } from '@ng-bootstrap/ng-bootstrap' import { InfiniteScrollModule } from 'ngx-infinite-scroll' import TabbyCorePlugin, { ToolbarButtonProvider, HotkeyProvider, ConfigProvider, HotkeysService, AppService } from 'tabby-core' import { EditProfileModalComponent } from './components/editProfileModal.component' import { EditProfileGroupModalComponent } from './components/editProfileGroupModal.component' import { HotkeyInputModalComponent } from './components/hotkeyInputModal.component' import { HotkeySettingsTabComponent } from './components/hotkeySettingsTab.component' import { MultiHotkeyInputComponent } from './components/multiHotkeyInput.component' import { SettingsTabComponent } from './components/settingsTab.component' import { SettingsTabBodyComponent } from './components/settingsTabBody.component' import { WindowSettingsTabComponent } from './components/windowSettingsTab.component' import { VaultSettingsTabComponent } from './components/vaultSettingsTab.component' import { SetVaultPassphraseModalComponent } from './components/setVaultPassphraseModal.component' import { ProfilesSettingsTabComponent } from './components/profilesSettingsTab.component' import { ReleaseNotesComponent } from './components/releaseNotesTab.component' import { ConfigSyncSettingsTabComponent } from './components/configSyncSettingsTab.component' import { ShowSecretModalComponent } from './components/showSecretModal.component' import { ConfigSyncService } from './services/configSync.service' import { SettingsTabProvider } from './api' import { ButtonProvider } from './buttonProvider' import { SettingsHotkeyProvider } from './hotkeys' import { SettingsConfigProvider } from './config' import { HotkeySettingsTabProvider, WindowSettingsTabProvider, VaultSettingsTabProvider, ProfilesSettingsTabProvider, ConfigSyncSettingsTabProvider } from './settings' /** @hidden */ @NgModule({ imports: [ CommonModule, FormsModule, NgbModule, TabbyCorePlugin, InfiniteScrollModule, ], providers: [ { provide: ToolbarButtonProvider, useClass: ButtonProvider, multi: true }, { provide: ConfigProvider, useClass: SettingsConfigProvider, multi: true }, { provide: HotkeyProvider, useClass: SettingsHotkeyProvider, multi: true }, { provide: SettingsTabProvider, useClass: HotkeySettingsTabProvider, multi: true }, { provide: SettingsTabProvider, useClass: WindowSettingsTabProvider, multi: true }, { provide: SettingsTabProvider, useClass: VaultSettingsTabProvider, multi: true }, { provide: SettingsTabProvider, useClass: ProfilesSettingsTabProvider, multi: true }, { provide: SettingsTabProvider, useClass: ConfigSyncSettingsTabProvider, multi: true }, ], declarations: [ EditProfileModalComponent, EditProfileGroupModalComponent, HotkeyInputModalComponent, HotkeySettingsTabComponent, MultiHotkeyInputComponent, ProfilesSettingsTabComponent, SettingsTabComponent, SettingsTabBodyComponent, SetVaultPassphraseModalComponent, VaultSettingsTabComponent, WindowSettingsTabComponent, ConfigSyncSettingsTabComponent, ReleaseNotesComponent, ShowSecretModalComponent, ], }) export default class SettingsModule { constructor ( public configSync: ConfigSyncService, app: AppService, hotkeys: HotkeysService, ) { hotkeys.hotkey$.subscribe(async hotkey => { if (hotkey.startsWith('settings-tab.')) { const id = hotkey.substring(hotkey.indexOf('.') + 1) app.openNewTabRaw({ type: SettingsTabComponent, inputs: { activeTab: id }, }) } }) } } export * from './api' export { SettingsTabComponent } ================================================ FILE: tabby-settings/src/services/configSync.service.ts ================================================ import * as yaml from 'js-yaml' import axios from 'axios' import { Injectable } from '@angular/core' import { ConfigService, HostAppService, Logger, LogService, Platform, PlatformService } from 'tabby-core' export interface User { id: number } export interface Config { id: number name: string content: string last_used_with_version: string|null created_at: Date modified_at: Date } const OPTIONAL_CONFIG_PARTS = ['hotkeys', 'appearance', 'vault'] @Injectable({ providedIn: 'root' }) export class ConfigSyncService { private logger: Logger private lastRemoteChange = new Date(0) constructor ( log: LogService, private platform: PlatformService, private hostApp: HostAppService, private config: ConfigService, ) { this.logger = log.create('configSync') config.ready$.toPromise().then(() => { this.autoSync() config.changed$.subscribe(() => { if (this.isEnabled() && this.config.store.configSync.auto) { this.upload() } }) }) } isAvailable (): boolean { return this.hostApp.platform !== Platform.Web } isEnabled (): boolean { return this.isAvailable() && !!this.config.store.configSync.host && !!this.config.store.configSync.token && !!this.config.store.configSync.configID } async getConfigs (): Promise { return this.request('GET', '/api/1/configs') } async getConfig (id: number): Promise { return this.request('GET', `/api/1/configs/${id}`) } async updateConfig (id: number, data: Partial): Promise { return this.request('PATCH', `/api/1/configs/${id}`, { data }) } async getUser (): Promise { return this.request('GET', '/api/1/user') } async createNewConfig (name: string): Promise { return this.request('POST', '/api/1/configs', { data: { name, }, }) } async deleteConfig (id: number): Promise { return this.request('DELETE', `/api/1/configs/${id}`) } setConfig (config: Config): void { this.config.store.configSync.configID = config.id this.config.save() this.lastRemoteChange = new Date(config.modified_at) } async upload (): Promise { if (!this.isEnabled()) { return } try { const data = await this.readConfigDataForSync() const remoteData = yaml.load((await this.getConfig(this.config.store.configSync.configID)).content) as any for (const part of OPTIONAL_CONFIG_PARTS) { if (!this.config.store.configSync.parts[part]) { data[part] = remoteData[part] } } const content = yaml.dump(data) const result = await this.updateConfig(this.config.store.configSync.configID, { content, last_used_with_version: this.platform.getAppVersion(), }) this.lastRemoteChange = new Date(result.modified_at) this.logger.debug('Config uploaded') } catch (error) { this.logger.error('Upload failed:', error) throw error } } async download (): Promise { if (!this.isEnabled()) { return } try { const config = await this.getConfig(this.config.store.configSync.configID) const data = yaml.load(config.content) as any const localData = yaml.load(this.config.readRaw()) as any data.configSync = localData.configSync if (!data.encrypted) { for (const part of OPTIONAL_CONFIG_PARTS) { if (!this.config.store.configSync.parts[part]) { data[part] = localData[part] } } } await this.writeConfigDataFromSync(data) this.logger.debug('Config downloaded') } catch (error) { this.logger.error('Download failed:', error) throw error } } async delete (config: Config): Promise { try { await this.deleteConfig(config.id) this.logger.debug('Config deleted') } catch (error) { this.logger.error('Delete failed:', error) throw error } } private async readConfigDataForSync (): Promise { const data = yaml.load(await this.platform.loadConfig()) as any delete data.configSync return data } private async writeConfigDataFromSync (data: any) { await this.platform.saveConfig(yaml.dump(data)) await this.config.load() await this.config.save() } private async request (method: 'GET'|'POST'|'PATCH'|'DELETE', url: string, params = {}) { if (this.config.store.configSync.host.endsWith('/')) { this.config.store.configSync.host = this.config.store.configSync.host.slice(0, -1) } url = this.config.store.configSync.host + url this.logger.debug(`${method} ${url}`, params) try { const response = await axios.request({ url, method, headers: { Authorization: `Bearer ${this.config.store.configSync.token}`, }, ...params, }) this.logger.debug(response) return response.data } catch (error) { this.logger.error(error) throw error } } private async autoSync () { while (true) { try { if (this.isEnabled() && this.config.store.configSync.auto) { const cfg = await this.getConfig(this.config.store.configSync.configID) if (new Date(cfg.modified_at) > this.lastRemoteChange) { this.logger.info('Remote config changed, downloading') this.download() this.lastRemoteChange = new Date(cfg.modified_at) } } } catch (error) { this.logger.debug('Recovering from autoSync network error') } await new Promise(resolve => setTimeout(resolve, 60000)) } } } ================================================ FILE: tabby-settings/src/settings.ts ================================================ import { Injectable } from '@angular/core' import { SettingsTabProvider } from './api' import { HotkeySettingsTabComponent } from './components/hotkeySettingsTab.component' import { WindowSettingsTabComponent } from './components/windowSettingsTab.component' import { VaultSettingsTabComponent } from './components/vaultSettingsTab.component' import { ConfigSyncSettingsTabComponent } from './components/configSyncSettingsTab.component' import { ProfilesSettingsTabComponent } from './components/profilesSettingsTab.component' import { TranslateService } from 'tabby-core' /** @hidden */ @Injectable() export class HotkeySettingsTabProvider extends SettingsTabProvider { id = 'hotkeys' icon = 'keyboard' title = this.translate.instant('Hotkeys') constructor (private translate: TranslateService) { super() } getComponentType (): any { return HotkeySettingsTabComponent } } /** @hidden */ @Injectable() export class WindowSettingsTabProvider extends SettingsTabProvider { id = 'window' icon = 'window-maximize' title = this.translate.instant('Window') constructor (private translate: TranslateService) { super() } getComponentType (): any { return WindowSettingsTabComponent } } /** @hidden */ @Injectable() export class VaultSettingsTabProvider extends SettingsTabProvider { id = 'vault' icon = 'key' title = 'Vault' getComponentType (): any { return VaultSettingsTabComponent } } /** @hidden */ @Injectable() export class ProfilesSettingsTabProvider extends SettingsTabProvider { id = 'profiles' icon = 'window-restore' title = this.translate.instant('Profiles & connections') prioritized = true constructor (private translate: TranslateService) { super() } getComponentType (): any { return ProfilesSettingsTabComponent } } /** @hidden */ @Injectable() export class ConfigSyncSettingsTabProvider extends SettingsTabProvider { id = 'config-sync' icon = 'cloud' title = this.translate.instant('Config sync') constructor (private translate: TranslateService) { super() } getComponentType (): any { return ConfigSyncSettingsTabComponent } } ================================================ FILE: tabby-settings/tsconfig.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist"], "compilerOptions": { "baseUrl": "src", } } ================================================ FILE: tabby-settings/tsconfig.typings.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "compilerOptions": { "baseUrl": "src", "emitDeclarationOnly": true, "declaration": true, "declarationDir": "./typings", "paths": { "tabby-*": ["../../tabby-*"], "*": ["../../app/node_modules/*"] } } } ================================================ FILE: tabby-settings/webpack.config.mjs ================================================ import * as path from 'path' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) import config from '../webpack.plugin.config.mjs' export default () => config({ name: 'settings', dirname: __dirname, }) ================================================ FILE: tabby-ssh/package.json ================================================ { "name": "tabby-ssh", "version": "1.0.231-nightly.0", "description": "SSH connections for Tabby", "keywords": [ "tabby-builtin-plugin" ], "main": "dist/index.js", "typings": "typings/index.d.ts", "scripts": { "build": "webpack --progress --color", "watch": "webpack --progress --color --watch", "postinstall": "run-script-os", "postinstall:darwin:linux": "exit" }, "files": [ "dist", "typings" ], "author": "Tabby Developers", "license": "MIT", "devDependencies": { "@types/node": "20.3.1", "ansi-colors": "^4.1.1", "strip-ansi": "^7.0.0" }, "dependencies": { "@luminati-io/socksv5": "^0.0.7", "run-script-os": "^1.1.3", "tmp-promise": "^3.0.3" }, "peerDependencies": { "@angular/animations": "^15", "@angular/common": "^15", "@angular/core": "^15", "@angular/forms": "^15", "@angular/platform-browser": "^15", "@ng-bootstrap/ng-bootstrap": "^14", "rxjs": "^7", "tabby-core": "*", "tabby-settings": "*", "tabby-terminal": "*" }, "resolutions": { "glob": "7.2.3" } } ================================================ FILE: tabby-ssh/src/algorithms.ts ================================================ import * as russh from 'russh' import { SSHAlgorithmType } from './api' export const supportedAlgorithms = { [SSHAlgorithmType.KEX]: russh.getSupportedKexAlgorithms().filter(x => x !== 'none'), [SSHAlgorithmType.HOSTKEY]: russh.getSupportedKeyTypes().filter(x => x !== 'none'), [SSHAlgorithmType.CIPHER]: russh.getSupportedCiphers().filter(x => x !== 'clear'), [SSHAlgorithmType.HMAC]: russh.getSupportedMACs().filter(x => x !== 'none'), [SSHAlgorithmType.COMPRESSION]: russh.getSupportedCompressionAlgorithms().reverse(), } export const defaultAlgorithms = { [SSHAlgorithmType.KEX]: [ 'mlkem768x25519-sha256', 'curve25519-sha256', 'curve25519-sha256@libssh.org', 'diffie-hellman-group16-sha512', 'diffie-hellman-group14-sha256', 'ext-info-c', 'ext-info-s', 'kex-strict-c-v00@openssh.com', 'kex-strict-s-v00@openssh.com', ], [SSHAlgorithmType.HOSTKEY]: [ 'ssh-ed25519', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp521', 'rsa-sha2-256', 'rsa-sha2-512', 'ssh-rsa', ], [SSHAlgorithmType.CIPHER]: [ 'chacha20-poly1305@openssh.com', 'aes256-gcm@openssh.com', 'aes256-ctr', 'aes192-ctr', 'aes128-ctr', ], [SSHAlgorithmType.HMAC]: [ 'hmac-sha2-512-etm@openssh.com', 'hmac-sha2-256-etm@openssh.com', 'hmac-sha2-512', 'hmac-sha2-256', 'hmac-sha1-etm@openssh.com', 'hmac-sha1', ], [SSHAlgorithmType.COMPRESSION]: [ 'none', ], } ================================================ FILE: tabby-ssh/src/api/contextMenu.ts ================================================ import { MenuItemOptions } from 'tabby-core' import { SFTPFile } from '../session/sftp' import { SFTPPanelComponent } from '../components/sftpPanel.component' /** * Extend to add items to the SFTPPanel context menu */ export abstract class SFTPContextMenuItemProvider { weight = 0 abstract getItems (item: SFTPFile, panel: SFTPPanelComponent): Promise } ================================================ FILE: tabby-ssh/src/api/importer.ts ================================================ import { PartialProfile } from 'tabby-core' import { SSHProfile } from './interfaces' export abstract class SSHProfileImporter { abstract getProfiles (): Promise[]> } export abstract class AutoPrivateKeyLocator { abstract getKeys (): Promise<[string, Buffer][]> } ================================================ FILE: tabby-ssh/src/api/index.ts ================================================ export * from './contextMenu' export * from './interfaces' export * from './importer' export { SSHMultiplexerService } from '../services/sshMultiplexer.service' ================================================ FILE: tabby-ssh/src/api/interfaces.ts ================================================ import { ConnectableTerminalProfile, InputProcessingOptions, LoginScriptsOptions } from 'tabby-terminal' export enum SSHAlgorithmType { HMAC = 'hmac', KEX = 'kex', CIPHER = 'cipher', HOSTKEY = 'serverHostKey', COMPRESSION = 'compression', } export interface SSHProfile extends ConnectableTerminalProfile { options: SSHProfileOptions } export interface SSHProfileOptions extends LoginScriptsOptions { host: string port?: number user: string auth: null|'password'|'publicKey'|'agent'|'keyboardInteractive' password: string privateKeys: string[] keepaliveInterval: number keepaliveCountMax: number readyTimeout: number | null x11: boolean skipBanner: boolean jumpHost: string | null agentForward: boolean warnOnClose: boolean algorithms: Record proxyCommand: string | null forwardedPorts: ForwardedPortConfig[] socksProxyHost: string | null socksProxyPort: number | null httpProxyHost: string | null httpProxyPort: number | null reuseSession: boolean input: InputProcessingOptions, } export enum PortForwardType { Local = 'Local', Remote = 'Remote', Dynamic = 'Dynamic', } export interface ForwardedPortConfig { type: PortForwardType host: string port: number targetAddress: string targetPort: number description: string } ================================================ FILE: tabby-ssh/src/components/hostKeyPromptModal.component.pug ================================================ .modal-header h3.m-0(translate) Host key verification .modal-body.pt-0 .alert.alert-danger(*ngIf='isMismatched') strong(translate) Warning: remote host's key has suddenly changed! div(translate) You could be under a man-in-the-middle attack right now, or the host key could have just been changed. .mb-3(*ngIf='isMismatched') .d-flex.align-items-center label(translate) Last known host key fingerprint .badge.text-bg-danger.ms-auto {{ selector.type }} code {{knownHost?.digest}} .mb-3 .d-flex.align-items-center label(translate) Current host key fingerprint .badge.text-bg-success.ms-auto {{ selector.type }} code {{digest}} .modal-footer .w-100 button.d-block.w-100.mb-3.btn.btn-primary( (click)='acceptAndSave()', [class.btn-danger]='isMismatched', translate ) Accept and remember key button.d-block.w-100.mb-3.btn.btn-secondary( (click)='accept()', [class.btn-warning]='isMismatched', translate ) Accept just this once button.d-block.w-100.btn.btn-secondary( [class.btn-danger]='!isMismatched', (click)='cancel()', translate ) Disconnect ================================================ FILE: tabby-ssh/src/components/hostKeyPromptModal.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, Input } from '@angular/core' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { KnownHost, KnownHostSelector, SSHKnownHostsService } from '../services/sshKnownHosts.service' /** @hidden */ @Component({ templateUrl: './hostKeyPromptModal.component.pug', }) export class HostKeyPromptModalComponent { @Input() selector: KnownHostSelector @Input() digest: string knownHost: KnownHost|null isMismatched = false isUnknown = false constructor ( private knownHosts: SSHKnownHostsService, private modalInstance: NgbActiveModal, ) { } ngOnInit () { this.knownHost = this.knownHosts.getFor(this.selector) if (!this.knownHost) { this.isUnknown = true } else if (this.knownHost.digest !== this.digest) { this.isMismatched = true } } accept () { this.modalInstance.close(true) } async acceptAndSave () { await this.knownHosts.store(this.selector, this.digest) this.accept() } cancel () { this.modalInstance.close(false) } } ================================================ FILE: tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.pug ================================================ .d-flex strong(translate) Keyboard-interactive auth .ms-2 {{prompt.name}} .prompt-text {{prompt.prompts[step].prompt}} input.form-control.mt-2( #input, autofocus, [type]='isPassword() ? "password": "text"', placeholder='Response', (keyup.enter)='next()', [(ngModel)]='prompt.responses[step]' ) .d-flex.mt-3 checkbox( *ngIf='isPassword()', [(ngModel)]='remember', [text]='"Save password"|translate' ) .ms-auto button.btn.btn-secondary.me-3( *ngIf='step > 0', (click)='previous()' ) button.btn.btn-primary( (click)='next()' ) span(*ngIf='step < prompt.prompts.length - 1') Next span(*ngIf='step == prompt.prompts.length - 1') Finish ================================================ FILE: tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.scss ================================================ :host { display: flex; flex-direction: column; padding: 15px 20px; } .prompt-text { white-space: pre-wrap; } ================================================ FILE: tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.ts ================================================ import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, ChangeDetectionStrategy } from '@angular/core' import { KeyboardInteractivePrompt } from '../session/ssh' import { SSHProfile } from '../api' import { PasswordStorageService } from '../services/passwordStorage.service' @Component({ selector: 'keyboard-interactive-auth-panel', templateUrl: './keyboardInteractiveAuthPanel.component.pug', styleUrls: ['./keyboardInteractiveAuthPanel.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) export class KeyboardInteractiveAuthComponent { @Input() profile: SSHProfile @Input() prompt: KeyboardInteractivePrompt @Input() step = 0 @Output() done = new EventEmitter() @ViewChild('input') input: ElementRef remember = false constructor (private passwordStorage: PasswordStorageService) {} isPassword (): boolean { return this.prompt.isAPasswordPrompt(this.step) } previous (): void { if (this.step > 0) { this.step-- } this.input.nativeElement.focus() } next (): void { if (this.isPassword() && this.remember) { this.passwordStorage.savePassword(this.profile, this.prompt.responses[this.step]) } if (this.step === this.prompt.prompts.length - 1) { this.prompt.respond() this.done.emit() return } this.step++ this.input.nativeElement.focus() } } ================================================ FILE: tabby-ssh/src/components/sftpCreateDirectoryModal.component.pug ================================================ .modal-body label(translate) Name for the new directory .mb-3.w-100.me-2 input.form-control( type='text', [(ngModel)]='directoryName', ) .modal-footer button.btn.btn-success((click)='create()', translate) Create button.btn.btn-danger((click)='cancel()', translate) Cancel ================================================ FILE: tabby-ssh/src/components/sftpCreateDirectoryModal.component.ts ================================================ import { Component } from '@angular/core' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { BaseComponent } from 'tabby-core' /** @hidden */ @Component({ templateUrl: './sftpCreateDirectoryModal.component.pug', }) export class SFTPCreateDirectoryModalComponent extends BaseComponent { directoryName: string constructor ( private modalInstance: NgbActiveModal, ) { super() } create (): void { this.modalInstance.close(this.directoryName) } cancel (): void { this.modalInstance.close('') } } ================================================ FILE: tabby-ssh/src/components/sftpDeleteModal.component.pug ================================================ .modal-body label(translate) Deleting .no-wrap {{progressMessage}} .modal-footer button.btn.btn-danger((click)='cancel()', translate) Cancel ================================================ FILE: tabby-ssh/src/components/sftpDeleteModal.component.ts ================================================ import { Component } from '@angular/core' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { BaseComponent } from 'tabby-core' import { SFTPFile, SFTPSession } from '../session/sftp' /** @hidden */ @Component({ templateUrl: './sftpDeleteModal.component.pug', }) export class SFTPDeleteModalComponent extends BaseComponent { sftp: SFTPSession item: SFTPFile progressMessage = '' cancelled = false constructor ( private modalInstance: NgbActiveModal, ) { super() } async ngOnInit (): Promise { this.destroyed$.subscribe(() => this.cancel()) await this.run(this.item) this.modalInstance.close() } cancel (): void { this.cancelled = true this.modalInstance.close() } async run (file: SFTPFile): Promise { this.progressMessage = file.fullPath if (file.isDirectory) { for (const child of await this.sftp.readdir(file.fullPath)) { await this.run(child) if (this.cancelled) { break } } await this.sftp.rmdir(file.fullPath) } else { this.sftp.unlink(file.fullPath) } } } ================================================ FILE: tabby-ssh/src/components/sftpPanel.component.pug ================================================ .header input.form-control.flex-grow-1.w-0( *ngIf='editingPath !== null', type='text', autofocus, (keydown.enter)='confirmPath()', (keydown.esc)='editingPath = null', (blur)='editingPath = null', [(ngModel)]='editingPath' ) .breadcrumb(*ngIf='editingPath === null', (dblclick)='editPath()') a.breadcrumb-item.text-decoration-none((click)='navigate("/")') SFTP a.breadcrumb-item.text-decoration-none( *ngFor='let segment of pathSegments', (click)='navigate(segment.path)' ) {{segment.name}} .breadcrumb-spacer.flex-grow-1.h-100((dblclick)='editPath()') button.btn.btn-link.btn-sm.flex-shrink-0.d-flex(*ngIf='!showFilter', (click)='showFilter = true') i.fas.fa-filter.me-1 div(translate) Filter button.btn.btn-link.btn-sm.flex-shrink-0.d-flex((click)='openCreateDirectoryModal()') i.fas.fa-plus.me-1 div(translate) Create directory button.btn.btn-link.btn-sm.flex-shrink-0.d-flex((click)='upload()') i.fas.fa-upload.me-1 div(translate) Upload files button.btn.btn-link.btn-sm.flex-shrink-0.d-flex((click)='uploadFolder()') i.fas.fa-upload.me-1 div(translate) Upload folder button.btn.btn-link.text-decoration-none((click)='close()') !{require('../../../tabby-core/src/icons/times.svg')} .filter-bar.px-3.py-2.border-bottom(*ngIf='showFilter') .input-group input.form-control( type='text', placeholder='Filter...', autofocus, [(ngModel)]='filterText', (input)='onFilterChange()', (keydown.escape)='clearFilter()' ) button.btn.btn-secondary((click)='clearFilter()') i.fas.fa-times .body(dropZone, (transfer)='uploadOneFolder($event)') a.alert.alert-info.d-flex.align-items-center( *ngIf='shouldShowCWDTip && !cwdDetectionAvailable', (click)='platform.openExternal("https://tabby.sh/go/cwd-detection")' ) .me-auto strong(translate) Working directory detection div(translate) Learn how to allow Tabby to detect remote shell's working directory. button.close((click)='dismissCWDTip()') i.fas.fa-close div(*ngIf='!sftp', translate) Connecting div(*ngIf='sftp') div(*ngIf='fileList === null', translate) Loading .list-group.list-group-light(*ngIf='fileList !== null') .list-group-item.list-group-item-action.d-flex.align-items-center( *ngIf='path !== "/" && (!showFilter || filterText.trim() === "")', (click)='goUp()' ) i.fas.fa-fw.fa-level-up-alt div(translate) Go up .list-group-item.list-group-item-action.d-flex.align-items-center( *ngFor='let item of filteredFileList', (contextmenu)='showContextMenu(item, $event)', (click)='open(item)' ) i.fa-fw([class]='getIcon(item)') div {{item.name}} .me-auto .size(*ngIf='!item.isDirectory') {{item.size|filesize}} .date {{item.modified|tabbyDate}} .mode {{getModeString(item)}} .alert.alert-info.text-center.mt-3(*ngIf='fileList !== null && filteredFileList.length === 0 && showFilter && filterText.trim() !== ""') i.fas.fa-search.me-2 span(translate) No files match the filter "{{filterText}}" ================================================ FILE: tabby-ssh/src/components/sftpPanel.component.scss ================================================ :host { display: flex; flex-direction: column; > .header { padding: 5px 15px 0 20px; display: flex; align-items: center; flex: none; } > .filter-bar { flex: none; } > .body { padding: 10px 20px; flex: 1 1 0; overflow-y: auto; } .breadcrumb { background: none; padding: 0; margin: 0; } .breadcrumb-item { cursor: pointer; } .breadcrumb-item:first-child { font-weight: bold; } .list-group-item-action { &:hover { background: rgba(white, .05); } } .mode, .size, .date { font-family: monospace; opacity: .5; font-size: 12px; text-align: right; margin-left: 20px; } .size { width: 100px; } .date { width: 200px; } } .btn-link svg { width: 12px; } ================================================ FILE: tabby-ssh/src/components/sftpPanel.component.ts ================================================ import * as C from 'constants' import { posix as path } from 'path' import { Component, Input, Output, EventEmitter, Inject, Optional } from '@angular/core' import { FileUpload, DirectoryUpload, DirectoryDownload, MenuItemOptions, NotificationsService, PlatformService } from 'tabby-core' import { SFTPSession, SFTPFile } from '../session/sftp' import { SSHSession } from '../session/ssh' import { SFTPContextMenuItemProvider } from '../api' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { SFTPCreateDirectoryModalComponent } from './sftpCreateDirectoryModal.component' interface PathSegment { name: string path: string } @Component({ selector: 'sftp-panel', templateUrl: './sftpPanel.component.pug', styleUrls: ['./sftpPanel.component.scss'], }) export class SFTPPanelComponent { @Input() session: SSHSession @Output() closed = new EventEmitter() sftp: SFTPSession fileList: SFTPFile[]|null = null filteredFileList: SFTPFile[] = [] @Input() path = '/' @Output() pathChange = new EventEmitter() pathSegments: PathSegment[] = [] @Input() cwdDetectionAvailable = false editingPath: string|null = null showFilter = false filterText = '' constructor ( private ngbModal: NgbModal, private notifications: NotificationsService, public platform: PlatformService, @Optional() @Inject(SFTPContextMenuItemProvider) protected contextMenuProviders: SFTPContextMenuItemProvider[], ) { this.contextMenuProviders.sort((a, b) => a.weight - b.weight) } async ngOnInit (): Promise { this.sftp = await this.session.openSFTP() try { await this.navigate(this.path) } catch (error) { console.warn('Could not navigate to', this.path, ':', error) this.notifications.error(error.message) await this.navigate('/') } } async navigate (newPath: string, fallbackOnError = true): Promise { const previousPath = this.path this.path = newPath this.pathChange.next(this.path) this.clearFilter() let p = newPath this.pathSegments = [] while (p !== '/') { this.pathSegments.unshift({ name: path.basename(p), path: p, }) p = path.dirname(p) } this.fileList = null this.filteredFileList = [] try { this.fileList = await this.sftp.readdir(this.path) } catch (error) { this.notifications.error(error.message) if (previousPath && fallbackOnError) { this.navigate(previousPath, false) } return } const dirKey = a => a.isDirectory ? 1 : 0 this.fileList.sort((a, b) => dirKey(b) - dirKey(a) || a.name.localeCompare(b.name)) this.updateFilteredList() } getFileType (fileExtension: string): string { const codeExtensions = ['js', 'ts', 'py', 'java', 'cpp', 'h', 'cs', 'html', 'css', 'rb', 'php', 'swift', 'go', 'kt', 'sh', 'json', 'cc', 'c', 'xml'] const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp'] const pdfExtensions = ['pdf'] const archiveExtensions = ['zip', 'rar', 'tar', 'gz'] const wordExtensions = ['doc', 'docx'] const videoExtensions = ['mp4', 'avi', 'mkv', 'mov'] const powerpointExtensions = ['ppt', 'pptx'] const textExtensions = ['txt', 'log'] const audioExtensions = ['mp3', 'wav', 'flac'] const excelExtensions = ['xls', 'xlsx'] const lowerCaseExtension = fileExtension.toLowerCase() if (codeExtensions.includes(lowerCaseExtension)) { return 'code' } else if (imageExtensions.includes(lowerCaseExtension)) { return 'image' } else if (pdfExtensions.includes(lowerCaseExtension)) { return 'pdf' } else if (archiveExtensions.includes(lowerCaseExtension)) { return 'archive' } else if (wordExtensions.includes(lowerCaseExtension)) { return 'word' } else if (videoExtensions.includes(lowerCaseExtension)) { return 'video' } else if (powerpointExtensions.includes(lowerCaseExtension)) { return 'powerpoint' } else if (textExtensions.includes(lowerCaseExtension)) { return 'text' } else if (audioExtensions.includes(lowerCaseExtension)) { return 'audio' } else if (excelExtensions.includes(lowerCaseExtension)) { return 'excel' } else { return 'unknown' } } getIcon (item: SFTPFile): string { if (item.isDirectory) { return 'fas fa-folder text-info' } if (item.isSymlink) { return 'fas fa-link text-warning' } const fileMatch = /\.([^.]+)$/.exec(item.name) const extension = fileMatch ? fileMatch[1] : null if (extension !== null) { const fileType = this.getFileType(extension) switch (fileType) { case 'unknown': return 'fas fa-file' default: return `fa-solid fa-file-${fileType} ` } } return 'fas fa-file' } goUp (): void { this.navigate(path.dirname(this.path)) } async open (item: SFTPFile): Promise { if (item.isDirectory) { await this.navigate(item.fullPath) } else if (item.isSymlink) { const target = path.resolve(this.path, await this.sftp.readlink(item.fullPath)) const stat = await this.sftp.stat(target) if (stat.isDirectory) { await this.navigate(item.fullPath) } else { await this.download(item.fullPath, stat.mode, stat.size) } } else { await this.download(item.fullPath, item.mode, item.size) } } async downloadItem (item: SFTPFile): Promise { if (item.isDirectory) { await this.downloadFolder(item) return } if (item.isSymlink) { const target = path.resolve(this.path, await this.sftp.readlink(item.fullPath)) const stat = await this.sftp.stat(target) if (stat.isDirectory) { await this.downloadFolder(item) return } await this.download(item.fullPath, stat.mode, stat.size) return } await this.download(item.fullPath, item.mode, item.size) } async openCreateDirectoryModal (): Promise { const modal = this.ngbModal.open(SFTPCreateDirectoryModalComponent) const directoryName = await modal.result.catch(() => null) if (directoryName?.trim()) { this.sftp.mkdir(path.join(this.path, directoryName)).then(() => { this.notifications.notice('The directory was created successfully') this.navigate(path.join(this.path, directoryName)) }).catch(() => { this.notifications.error('The directory could not be created') }) } } async upload (): Promise { const transfers = await this.platform.startUpload({ multiple: true }) await Promise.all(transfers.map(t => this.uploadOne(t))) } async uploadFolder (): Promise { const transfer = await this.platform.startUploadDirectory() await this.uploadOneFolder(transfer) } async uploadOneFolder (transfer: DirectoryUpload, accumPath = ''): Promise { const savedPath = this.path for(const t of transfer.getChildrens()) { if (t instanceof DirectoryUpload) { try { await this.sftp.mkdir(path.posix.join(this.path, accumPath, t.getName())) } catch { // Intentionally ignoring errors from making duplicate dirs. } await this.uploadOneFolder(t, path.posix.join(accumPath, t.getName())) } else { await this.sftp.upload(path.posix.join(this.path, accumPath, t.getName()), t) } } if (this.path === savedPath) { await this.navigate(this.path) } } async uploadOne (transfer: FileUpload): Promise { const savedPath = this.path await this.sftp.upload(path.join(this.path, transfer.getName()), transfer) if (this.path === savedPath) { await this.navigate(this.path) } } async download (itemPath: string, mode: number, size: number): Promise { const transfer = await this.platform.startDownload(path.basename(itemPath), mode, size) if (!transfer) { return } this.sftp.download(itemPath, transfer) } async downloadFolder (folder: SFTPFile): Promise { try { const transfer = await this.platform.startDownloadDirectory(folder.name, 0) if (!transfer) { return } // Start background size calculation and download simultaneously const sizeCalculationPromise = this.calculateFolderSizeAndUpdate(folder, transfer) const downloadPromise = this.downloadFolderRecursive(folder, transfer, '') try { await Promise.all([sizeCalculationPromise, downloadPromise]) transfer.setStatus('') transfer.setCompleted(true) } catch (error) { transfer.cancel() throw error } finally { transfer.close() } } catch (error) { this.notifications.error(`Failed to download folder: ${error.message}`) throw error } } private async calculateFolderSizeAndUpdate (folder: SFTPFile, transfer: DirectoryDownload) { let totalSize = 0 const items = await this.sftp.readdir(folder.fullPath) for (const item of items) { if (item.isDirectory) { totalSize += await this.calculateFolderSizeAndUpdate(item, transfer) } else { totalSize += item.size } transfer.setTotalSize(totalSize) } return totalSize } private async downloadFolderRecursive (folder: SFTPFile, transfer: DirectoryDownload, relativePath: string): Promise { const items = await this.sftp.readdir(folder.fullPath) for (const item of items) { if (transfer.isCancelled()) { throw new Error('Download cancelled') } const itemRelativePath = relativePath ? `${relativePath}/${item.name}` : item.name transfer.setStatus(itemRelativePath) if (item.isDirectory) { await transfer.createDirectory(itemRelativePath) await this.downloadFolderRecursive(item, transfer, itemRelativePath) } else { const fileDownload = await transfer.createFile(itemRelativePath, item.mode, item.size) await this.sftp.download(item.fullPath, fileDownload) } } } getModeString (item: SFTPFile): string { const s = 'SGdrwxrwxrwx' const e = ' ---------' const c = [ 0o4000, 0o2000, C.S_IFDIR, C.S_IRUSR, C.S_IWUSR, C.S_IXUSR, C.S_IRGRP, C.S_IWGRP, C.S_IXGRP, C.S_IROTH, C.S_IWOTH, C.S_IXOTH, ] let result = '' for (let i = 0; i < c.length; i++) { result += item.mode & c[i] ? s[i] : e[i] } return result } async buildContextMenu (item: SFTPFile): Promise { let items: MenuItemOptions[] = [] for (const section of await Promise.all(this.contextMenuProviders.map(x => x.getItems(item, this)))) { items.push({ type: 'separator' }) items = items.concat(section) } return items.slice(1) } async showContextMenu (item: SFTPFile, event: MouseEvent): Promise { event.preventDefault() this.platform.popupContextMenu(await this.buildContextMenu(item), event) } get shouldShowCWDTip (): boolean { return !window.localStorage.sshCWDTipDismissed } dismissCWDTip (): void { window.localStorage.sshCWDTipDismissed = 'true' } editPath (): void { this.editingPath = this.path } confirmPath (): void { if (this.editingPath === null) { return } this.navigate(this.editingPath) this.editingPath = null } close (): void { this.closed.emit() } clearFilter (): void { this.showFilter = false this.filterText = '' this.updateFilteredList() } onFilterChange (): void { this.updateFilteredList() } private updateFilteredList (): void { if (!this.fileList) { this.filteredFileList = [] return } if (!this.showFilter || this.filterText.trim() === '') { this.filteredFileList = this.fileList return } this.filteredFileList = this.fileList.filter(item => item.name.toLowerCase().includes(this.filterText.toLowerCase()), ) } } ================================================ FILE: tabby-ssh/src/components/sshPortForwardingConfig.component.pug ================================================ .list-group.mb-3 .list-group-item.d-flex.align-items-center(*ngFor='let fw of model') div .d-flex.align-items-center strong(*ngIf='fw.type === PortForwardType.Local', translate) Local strong(*ngIf='fw.type === PortForwardType.Remote', translate) Remote strong(*ngIf='fw.type === PortForwardType.Dynamic', translate, translateContext='[Dynamic] port forwarding') id.port-forwarding.dynamic .ms-3 {{fw.host}}:{{fw.port}} .ms-2 → .ms-2(*ngIf='fw.type !== PortForwardType.Dynamic') {{fw.targetAddress}}:{{fw.targetPort}} .ms-2(*ngIf='fw.type === PortForwardType.Dynamic', translate) SOCKS proxy div {{fw.description}} button.btn.btn-link.hover-reveal.ms-auto((click)='remove(fw)') i.fas.fa-trash-alt h5(translate) Add a port forward .input-group.mb-2(*ngIf='newForward.type === PortForwardType.Dynamic') input.form-control(type='text', [(ngModel)]='newForward.host') .input-group-text : input.form-control(type='number', [(ngModel)]='newForward.port') .input-group-text → .input-group-text(style='flex: 3 1 0', translate) SOCKS proxy .input-group.mb-2(*ngIf='newForward.type !== PortForwardType.Dynamic') input.form-control(type='text', [(ngModel)]='newForward.host') .input-group-text : input.form-control(type='number', [(ngModel)]='newForward.port') .input-group-text → input.form-control(type='text', [(ngModel)]='newForward.targetAddress') .input-group-text : input.form-control(type='number', [(ngModel)]='newForward.targetPort') .input-group.mb-2 input.form-control( type='text', [placeholder]='"Description"|translate', [(ngModel)]='newForward.description' ) .d-flex .btn-group.me-auto input.btn-check( type='radio', [(ngModel)]='newForward.type', id='newForwardTypeLocal', name='newForwardType', [value]='PortForwardType.Local' ) label.btn.btn-secondary.m-0( for='newForwardTypeLocal', translate ) Local input.btn-check( type='radio', [(ngModel)]='newForward.type', id='newForwardTypeRemote', name='newForwardType', [value]='PortForwardType.Remote' ) label.btn.btn-secondary.m-0( for='newForwardTypeRemote', translate ) Remote input.btn-check( type='radio', [(ngModel)]='newForward.type', id='newForwardTypeDynamic', name='newForwardType', [value]='PortForwardType.Dynamic' ) label.btn.btn-secondary.m-0( for='newForwardTypeDynamic', translate, translateContext='[Dynamic] port forwarding' ) id.port-forwarding.dynamic button.btn.btn-primary((click)='addForward()') i.fas.fa-check.me-2 span(translate) Forward port ================================================ FILE: tabby-ssh/src/components/sshPortForwardingConfig.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, Input, Output, EventEmitter } from '@angular/core' import { ForwardedPortConfig, PortForwardType } from '../api' /** @hidden */ @Component({ selector: 'ssh-port-forwarding-config', templateUrl: './sshPortForwardingConfig.component.pug', }) export class SSHPortForwardingConfigComponent { @Input() model: ForwardedPortConfig[] @Output() forwardAdded = new EventEmitter() @Output() forwardRemoved = new EventEmitter() newForward: ForwardedPortConfig PortForwardType = PortForwardType constructor ( ) { this.reset() } reset () { this.newForward = { type: PortForwardType.Local, host: '127.0.0.1', port: 8000, targetAddress: '127.0.0.1', targetPort: 80, description: '', } } async addForward () { try { this.forwardAdded.emit(this.newForward) this.reset() } catch (e) { console.error(e) } } remove (fw: ForwardedPortConfig) { this.forwardRemoved.emit(fw) this.newForward = fw } } ================================================ FILE: tabby-ssh/src/components/sshPortForwardingModal.component.pug ================================================ .modal-header(*ngIf='session.forwardedPorts.length') h5.m-0(translate) Forwarded ports .modal-body.pt-0 ssh-port-forwarding-config( [model]='session.forwardedPorts', (forwardAdded)='onForwardAdded($event)', (forwardRemoved)='onForwardRemoved($event)' ) ================================================ FILE: tabby-ssh/src/components/sshPortForwardingModal.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, Input } from '@angular/core' import { ForwardedPort } from '../session/forwards' import { SSHSession } from '../session/ssh' import { ForwardedPortConfig } from '../api' /** @hidden */ @Component({ templateUrl: './sshPortForwardingModal.component.pug', }) export class SSHPortForwardingModalComponent { @Input() session: SSHSession onForwardAdded (fw: ForwardedPortConfig) { const newForward = new ForwardedPort() Object.assign(newForward, fw) this.session.addPortForward(newForward) } onForwardRemoved (fw: ForwardedPortConfig) { this.session.removePortForward(fw as ForwardedPort) } } ================================================ FILE: tabby-ssh/src/components/sshProfileSettings.component.pug ================================================ ul.nav-tabs(ngbNav, #nav='ngbNav') li(ngbNavItem) a(ngbNavLink, translate) General ng-template(ngbNavContent) .d-flex.w-100.mt-3 .mb-3.me-2( ngbDropdown ) label(translate) Connection button.btn.btn-secondary.d-block(ngbDropdownToggle) {{getConnectionDropdownTitle()}} div(ngbDropdownMenu) button.dropdown-item( (click)='connectionMode = "direct"', translate ) Direct button.dropdown-item( *ngIf='hostApp.platform !== Platform.Web', (click)='connectionMode = "proxyCommand"', ) div Proxy command .text-muted(translate) Command's stdin/stdout is used instead of a network connection button.dropdown-item( (click)='connectionMode = "jumpHost"', ) div(translate) Jump host .text-muted(translate) Connect to a different host first and use it as a proxy button.dropdown-item( (click)='connectionMode = "socksProxy"', ) div(translate) SOCKS proxy .text-muted(translate) Connect through a proxy server button.dropdown-item( (click)='connectionMode = "httpProxy"', ) div(translate) HTTP proxy .text-muted(translate) Using CONNECT method .mb-3.w-100(*ngIf='connectionMode === "proxyCommand"') label(translate) Proxy command input.form-control( type='text', [(ngModel)]='profile.options.proxyCommand', ) .mb-3.w-100.me-2(*ngIf='connectionMode !== "proxyCommand"') label(translate) Host input.form-control( type='text', [(ngModel)]='profile.options.host', ) .mb-3(*ngIf='connectionMode !== "proxyCommand"') label(translate) Port input.form-control( type='number', placeholder='22', [(ngModel)]='profile.options.port', ) .mb-3(*ngIf='connectionMode === "jumpHost"') label(translate) Jump host select.form-control([(ngModel)]='profile.options.jumpHost') option([ngValue]='null', translate) Select option([ngValue]='x.id', *ngFor='let x of jumpHosts') {{getJumpHostLabel(x)}} .d-flex.w-100(*ngIf='connectionMode === "socksProxy"') .mb-3.w-100.me-2 label(translate) SOCKS proxy host input.form-control( type='text', [(ngModel)]='profile.options.socksProxyHost', ) .mb-3 label(translate) SOCKS proxy port input.form-control( type='number', placeholder='5000', [(ngModel)]='profile.options.socksProxyPort', ) .d-flex.w-100(*ngIf='connectionMode === "httpProxy"') .mb-3.w-100.me-2 label(translate) HTTP proxy host input.form-control( type='text', [(ngModel)]='profile.options.httpProxyHost', ) .mb-3 label(translate) HTTP proxy port input.form-control( type='number', placeholder='5000', [(ngModel)]='profile.options.httpProxyPort', ) .mb-3 label(translate) Username input.form-control( type='text', placeholder='Ask every time', [(ngModel)]='profile.options.user', ) .mb-3 label(translate) Authentication method .btn-group.mt-1.w-100 input.btn-check( type='radio', name='auth', [(ngModel)]='profile.options.auth', id='authAuto', [value]='null' ) label.btn.btn-secondary( for='authAuto' ) i.far.fa-lightbulb .m-0(translate) Auto input.btn-check( type='radio', name='auth', [(ngModel)]='profile.options.auth', id='authPassword', [value]='"password"' ) label.btn.btn-secondary( for='authPassword' ) i.fas.fa-font .m-0(translate) Password input.btn-check( type='radio', name='auth', [(ngModel)]='profile.options.auth', id='authPublicKey', [value]='"publicKey"' ) label.btn.btn-secondary( for='authPublicKey' ) i.fas.fa-key .m-0(translate) Key input.btn-check( type='radio', name='auth', [(ngModel)]='profile.options.auth', id='authAgent', [value]='"agent"' ) label.btn.btn-secondary( for='authAgent' , ng:if='hostApp.platform !== Platform.Web') i.fas.fa-user-secret .m-0(translate) Agent input.btn-check( type='radio', name='auth', [(ngModel)]='profile.options.auth', id='auth"keyboardInteractive"', [value]='"keyboardInteractive"' ) label.btn.btn-secondary( for='auth"keyboardInteractive"' ) i.far.fa-keyboard .m-0(translate) Interactive .form-line(*ngIf='profile.options.user && (!profile.options.auth || profile.options.auth === "password")') .header .title(translate) Password .description(*ngIf='!hasSavedPassword', translate) Save a password in the keychain .description(*ngIf='hasSavedPassword', translate) There is a saved password for this connection button.btn.btn-success.ms-4(*ngIf='!hasSavedPassword', (click)='setPassword()') i.fas.fa-key span(translate) Set password button.btn.btn-danger.ms-4(*ngIf='hasSavedPassword', (click)='clearSavedPassword()') i.fas.fa-trash-alt span(translate) Forget .mb-3(*ngIf='!profile.options.auth || profile.options.auth === "publicKey"') label(translate) Private keys .list-group.mb-2 .list-group-item.d-flex.align-items-center.p-1.ps-3(*ngFor='let path of profile.options.privateKeys') i.fas.fa-key .no-wrap.me-auto {{path}} button.btn.btn-link((click)='removePrivateKey(path)') i.fas.fa-trash button.btn.btn-secondary((click)='addPrivateKey()') i.fas.fa-folder-open span(translate) Add a private key li(ngbNavItem) a(ngbNavLink, translate) Ports ng-template(ngbNavContent) ssh-port-forwarding-config( *ngIf='profile.options.forwardedPorts', [model]='profile.options.forwardedPorts', (forwardAdded)='onForwardAdded($event)', (forwardRemoved)='onForwardRemoved($event)' ) li(ngbNavItem) a(ngbNavLink, translate) Advanced ng-template(ngbNavContent) .form-line(ng:if='hostApp.platform !== Platform.Web') .header .title(translate) X11 forwarding toggle([(ngModel)]='profile.options.x11') .form-line(ng:if='hostApp.platform !== Platform.Web') .header .title(translate) Agent forwarding toggle([(ngModel)]='profile.options.agentForward') .form-line .header .title(translate) Skip MoTD/banner .description(translate) Will prevent the SSH greeting from showing up toggle([(ngModel)]='profile.options.skipBanner') .form-line .header .title(translate) Reuse session for multiple tabs .description Multiplex multiple shells through the same connection toggle([(ngModel)]='profile.options.reuseSession') .form-line .header .title(translate) Keep Alive Interval (Milliseconds) input.form-control( type='number', placeholder='0', [(ngModel)]='profile.options.keepaliveInterval', ) .form-line .header .title(translate) Max Keep Alive Count input.form-control( type='number', placeholder='3', [(ngModel)]='profile.options.keepaliveCountMax', ) .form-line .header .title(translate) Ready Timeout (Milliseconds) input.form-control( type='number', placeholder='20000', [(ngModel)]='profile.options.readyTimeout', ) li(ngbNavItem) a(ngbNavLink, translate) Ciphers ng-template(ngbNavContent) .form-line.align-items-start .header .title(translate) Ciphers .w-75 div(*ngFor='let alg of supportedAlgorithms.cipher') checkbox([text]='alg', [(ngModel)]='algorithms.cipher[alg]') .form-line.align-items-start .header .title(translate) Key exchange .w-75 div(*ngFor='let alg of supportedAlgorithms.kex') checkbox([text]='alg', [(ngModel)]='algorithms.kex[alg]') .form-line.align-items-start .header .title HMAC .w-75 div(*ngFor='let alg of supportedAlgorithms.hmac') checkbox([text]='alg', [(ngModel)]='algorithms.hmac[alg]') .form-line.align-items-start .header .title(translate) Host key .w-75 div(*ngFor='let alg of supportedAlgorithms.serverHostKey') checkbox([text]='alg', [(ngModel)]='algorithms.serverHostKey[alg]') .form-line.align-items-start .header .title Compression .w-75 div(*ngFor='let alg of supportedAlgorithms.compression') checkbox([text]='alg', [(ngModel)]='algorithms.compression[alg]') li(ngbNavItem) a(ngbNavLink, translate) Colors ng-template(ngbNavContent) color-scheme-selector([(model)]='profile.terminalColorScheme') li(ngbNavItem) a(ngbNavLink, translate) Login scripts ng-template(ngbNavContent) login-scripts-settings([options]='profile.options', #loginScriptsSettings) li(ngbNavItem) a(ngbNavLink, translate) Input ng-template(ngbNavContent) input-processing-settings([options]='profile.options.input') div([ngbNavOutlet]='nav') ================================================ FILE: tabby-ssh/src/components/sshProfileSettings.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, ViewChild } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { firstBy } from 'thenby' import { FileProvidersService, Platform, HostAppService, PromptModalComponent, PartialProfile, ProfilesService, ProfileSettingsComponent } from 'tabby-core' import { LoginScriptsSettingsComponent } from 'tabby-terminal' import { PasswordStorageService } from '../services/passwordStorage.service' import { ForwardedPortConfig, SSHAlgorithmType, SSHProfile } from '../api' import { supportedAlgorithms } from '../algorithms' import { FullyDefined, ProxifiedConfig } from 'tabby-core/src/services/config.service' import { SSHProfilesService } from '../profiles' /** @hidden */ @Component({ templateUrl: './sshProfileSettings.component.pug', }) export class SSHProfileSettingsComponent implements ProfileSettingsComponent { Platform = Platform profile: ProxifiedConfig> hasSavedPassword: boolean connectionMode: 'direct'|'proxyCommand'|'jumpHost'|'socksProxy'|'httpProxy' = 'direct' supportedAlgorithms = supportedAlgorithms algorithms: Record> = {} jumpHosts: PartialProfile[] @ViewChild('loginScriptsSettings') loginScriptsSettings: LoginScriptsSettingsComponent|null constructor ( public hostApp: HostAppService, private profilesService: ProfilesService, private passwordStorage: PasswordStorageService, private ngbModal: NgbModal, private fileProviders: FileProvidersService, ) { } async ngOnInit () { this.jumpHosts = (await this.profilesService.getProfiles({ includeBuiltin: false })).filter(x => x.type === 'ssh' && x !== this.profile) this.jumpHosts.sort(firstBy(x => this.getJumpHostLabel(x))) for (const k of Object.values(SSHAlgorithmType)) { this.algorithms[k] = {} for (const alg of this.profile.options.algorithms[k]) { this.algorithms[k][alg] = true } } if (this.profile.options.proxyCommand) { this.connectionMode = 'proxyCommand' } else if (this.profile.options.jumpHost) { this.connectionMode = 'jumpHost' } else if (this.profile.options.socksProxyHost) { this.connectionMode = 'socksProxy' } else if (this.profile.options.httpProxyHost) { this.connectionMode = 'httpProxy' } if (this.profile.options.user) { try { this.hasSavedPassword = !!await this.passwordStorage.loadPassword(this.profile) } catch (e) { console.error('Could not check for saved password', e) } } } getJumpHostLabel (p: PartialProfile) { return p.group ? `${this.profilesService.resolveProfileGroupName(p.group)} / ${p.name}` : p.name } async setPassword () { const modal = this.ngbModal.open(PromptModalComponent) modal.componentInstance.prompt = `Password for ${this.profile.options.user}@${this.profile.options.host}` modal.componentInstance.password = true try { const result = await modal.result.catch(() => null) if (result?.value) { this.passwordStorage.savePassword(this.profile, result.value) this.hasSavedPassword = true } } catch { } } clearSavedPassword () { this.hasSavedPassword = false this.passwordStorage.deletePassword(this.profile) } async addPrivateKey () { const ref = await this.fileProviders.selectAndStoreFile(`private key for ${this.profile.name}`).catch(() => null) if (ref) { this.profile.options.privateKeys = [ ...this.profile.options.privateKeys, ref, ] } } removePrivateKey (path: string) { this.profile.options.privateKeys = this.profile.options.privateKeys.filter(x => x !== path) } save () { for (const k of Object.values(SSHAlgorithmType)) { this.profile.options.algorithms[k] = Object.entries(this.algorithms[k]) .filter(([_, v]) => !!v) .map(([key, _]) => key) if(k !== SSHAlgorithmType.COMPRESSION) { this.profile.options.algorithms[k].sort() } } if (this.connectionMode !== 'jumpHost') { this.profile.options.jumpHost = null } if (this.connectionMode !== 'proxyCommand') { this.profile.options.proxyCommand = null } if (this.connectionMode !== 'socksProxy') { this.profile.options.socksProxyHost = null this.profile.options.socksProxyPort = null } if (this.connectionMode !== 'httpProxy') { this.profile.options.httpProxyHost = null this.profile.options.httpProxyPort = null } this.loginScriptsSettings?.save() } onForwardAdded (fw: ForwardedPortConfig) { this.profile.options.forwardedPorts.push(fw) } onForwardRemoved (fw: ForwardedPortConfig) { this.profile.options.forwardedPorts = this.profile.options.forwardedPorts.filter(x => x !== fw) } getConnectionDropdownTitle () { return { direct: 'Direct', proxyCommand: 'Proxy command', jumpHost: 'Jump host', socksProxy: 'SOCKS proxy', httpProxy: 'HTTP proxy', }[this.connectionMode] } } ================================================ FILE: tabby-ssh/src/components/sshSettingsTab.component.pug ================================================ h3 SSH .form-line .header .title(translate) Warn when closing active connections toggle( [(ngModel)]='config.store.ssh.warnOnClose', (ngModelChange)='config.save()', ) .form-line .header .title(translate) Verify host keys when connecting toggle( [(ngModel)]='config.store.ssh.verifyHostKeys', (ngModelChange)='config.save()', ) .form-line(*ngIf='hostApp.platform === Platform.Windows') .header .title(translate) WinSCP path .description(translate) When WinSCP is detected, you can launch an SCP session from the context menu. input.form-control( type='text', placeholder='Auto-detect', [(ngModel)]='config.store.ssh.winSCPPath', (ngModelChange)='config.save()', ) .form-line(*ngIf='hostApp.platform === Platform.Windows') .header .title(translate) Agent type .description(translate) Forces a specific SSH agent connection type. select.form-control( [(ngModel)]='config.store.ssh.agentType', (ngModelChange)='config.save()', ) option(value='auto', translate) Automatic option(value='pageant') Pageant option(value='pipe') Named pipe .form-line(*ngIf='config.store.ssh.agentType === "pipe"') .header .title(translate) Agent pipe path .description(translate) Sets the SSH agent's named pipe path. input.form-control( type='text', placeholder='Default: \\\\.\\pipe\\openssh-ssh-agent', [(ngModel)]='config.store.ssh.agentPath', (ngModelChange)='config.save()', ) .form-line .header .title(translate) Override X11 display .description(translate) Path or address of the local X11 socket input.form-control( type='text', [placeholder]='defaultX11Display', [(ngModel)]='config.store.ssh.x11Display', (ngModelChange)='config.save()' ) .alert.alert-info(translate) SSH connection management is now done through the "Profiles & connections" tab ================================================ FILE: tabby-ssh/src/components/sshSettingsTab.component.ts ================================================ import { Component, HostBinding } from '@angular/core' import { X11Socket } from '../session/x11' import { ConfigService, HostAppService, Platform } from 'tabby-core' /** @hidden */ @Component({ templateUrl: './sshSettingsTab.component.pug', }) export class SSHSettingsTabComponent { Platform = Platform defaultX11Display: string @HostBinding('class.content-box') true constructor ( public config: ConfigService, public hostApp: HostAppService, ) { const spec = X11Socket.resolveDisplaySpec() if ('path' in spec) { this.defaultX11Display = spec.path } else { this.defaultX11Display = `${spec.host}:${spec.port}` } } } ================================================ FILE: tabby-ssh/src/components/sshTab.component.pug ================================================ terminal-toolbar([tab]='this') i.fas.fa-xs.fa-circle.text-success.me-2(*ngIf='session && session.open') i.fas.fa-xs.fa-circle.text-danger.me-2(*ngIf='!session || !session.open') strong.me-auto( style='user-select: text; cursor: text;' onclick='event.stopPropagation()' ) {{profile.options.user}}@{{profile.options.host}}:{{profile.options.port}} .me-2( ngbDropdown, container='body', *ngIf='session && !session.supportsWorkingDirectory()', placement='bottom-right bottom-left bottom' ) button.btn.btn-sm.btn-link(ngbDropdownToggle) i.far.fa-lightbulb.text-primary .bg-dark(ngbDropdownMenu) a.d-flex.align-items-center(ngbDropdownItem, (click)='platform.openExternal("https://tabby.sh/go/cwd-detection")') .me-auto strong(translate) Working directory detection div(translate) Learn how to allow Tabby to detect remote shell's working directory. i.fas.fa-arrow-right.ms-4 button.btn.btn-sm.btn-link.me-2((click)='reconnect()') i.fas.fa-redo span(translate) Reconnect button.btn.btn-sm.btn-link.me-2((click)='openSFTP()', *ngIf='session && session.open') i.far.fa-folder-open span SFTP button.btn.btn-sm.btn-link( *ngIf='session && session.open && hostApp.platform !== Platform.Web', (click)='showPortForwarding()' ) i.fas.fa-plug span(translate) Ports sftp-panel.bg-dark( @panelSlide, [@.disabled]='!config.store.accessibility.animations', [(path)]='sftpPath', *ngIf='sftpPanelVisible && sshSession', (click)='$event.stopPropagation()', [session]='sshSession!', [cwdDetectionAvailable]='session?.supportsWorkingDirectory() ?? false', (closed)='sftpPanelVisible = false' ) keyboard-interactive-auth-panel.bg-dark( *ngIf='activeKIPrompt', [prompt]='activeKIPrompt', [profile]='profile', (click)='$event.stopPropagation()', (done)='activeKIPrompt = null; frontend?.focus()' ) ================================================ FILE: tabby-ssh/src/components/sshTab.component.scss ================================================ sftp-panel { position: absolute; height: 80%; width: 100%; bottom: 0; z-index: 5; } ================================================ FILE: tabby-ssh/src/components/sshTab.component.ts ================================================ import * as russh from 'russh' import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import colors from 'ansi-colors' import { Component, Injector, HostListener } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { Platform, ProfilesService } from 'tabby-core' import { BaseTerminalTabComponent, ConnectableTerminalTabComponent } from 'tabby-terminal' import { SSHService } from '../services/ssh.service' import { KeyboardInteractivePrompt, SSHSession } from '../session/ssh' import { SSHPortForwardingModalComponent } from './sshPortForwardingModal.component' import { SSHProfile } from '../api' import { SSHShellSession } from '../session/shell' import { SSHMultiplexerService } from '../services/sshMultiplexer.service' /** @hidden */ @Component({ selector: 'ssh-tab', template: `${BaseTerminalTabComponent.template} ${require('./sshTab.component.pug')}`, styles: [ ...BaseTerminalTabComponent.styles, require('./sshTab.component.scss'), ], animations: BaseTerminalTabComponent.animations, }) export class SSHTabComponent extends ConnectableTerminalTabComponent { Platform = Platform sshSession: SSHSession|null = null session: SSHShellSession|null = null sftpPanelVisible = false sftpPath = '/' enableToolbar = true activeKIPrompt: KeyboardInteractivePrompt|null = null constructor ( injector: Injector, public ssh: SSHService, private ngbModal: NgbModal, private profilesService: ProfilesService, private sshMultiplexer: SSHMultiplexerService, ) { super(injector) this.sessionChanged$.subscribe(() => { this.activeKIPrompt = null }) } ngOnInit (): void { this.subscribeUntilDestroyed(this.hotkeys.hotkey$, hotkey => { if (!this.hasFocus) { return } switch (hotkey) { case 'home': this.sendInput('\x1bOH' ) break case 'end': this.sendInput('\x1bOF' ) break case 'restart-ssh-session': this.reconnect() break case 'launch-winscp': if (this.sshSession) { this.ssh.launchWinSCP(this.sshSession) } break } }) super.ngOnInit() } async setupOneSession (injector: Injector, profile: SSHProfile, multiplex = true): Promise { let session = await this.sshMultiplexer.getSession(profile) if (!multiplex || !session || !profile.options.reuseSession) { session = new SSHSession(injector, profile) if (profile.options.jumpHost) { const jumpConnection = (await this.profilesService.getProfiles()).find(x => x.id === profile.options.jumpHost) if (!jumpConnection) { throw new Error(`${profile.options.host}: jump host "${profile.options.jumpHost}" not found in your config`) } const jumpSession = await this.setupOneSession( this.injector, this.profilesService.getConfigProxyForProfile(jumpConnection), ) jumpSession.ref() session.willDestroy$.subscribe(() => jumpSession.unref()) jumpSession.willDestroy$.subscribe(() => { if (session?.open) { session.destroy() } }) if (!(jumpSession.ssh instanceof russh.AuthenticatedSSHClient)) { throw new Error('Jump session is not authenticated yet somehow') } try { session.jumpChannel = await jumpSession.ssh.openTCPForwardChannel({ addressToConnectTo: profile.options.host, portToConnectTo: profile.options.port ?? 22, originatorAddress: '127.0.0.1', originatorPort: 0, }) } catch (err) { jumpSession.emitServiceMessage(colors.bgRed.black(' X ') + ` Could not set up port forward on ${jumpConnection.name}`) throw err } } } this.attachSessionHandler(session.serviceMessage$, msg => { msg = msg.replace(/\n/g, '\r\n ') this.write(`\r${colors.black.bgWhite(' SSH ')} ${msg}\r\n`) }) this.attachSessionHandler(session.willDestroy$, () => { this.activeKIPrompt = null }) this.attachSessionHandler(session.keyboardInteractivePrompt$, prompt => { this.activeKIPrompt = prompt setTimeout(() => { this.frontend?.scrollToBottom() }) }) if (!session.open) { this.write('\r\n' + colors.black.bgWhite(' SSH ') + ` Connecting to ${session.profile.name}\r\n`) this.startSpinner(this.translate.instant(_('Connecting'))) try { await session.start() } finally { this.stopSpinner() } this.sshMultiplexer.addSession(session) } return session } protected onSessionDestroyed (): void { if (this.frontend) { // Session was closed abruptly this.write('\r\n' + colors.black.bgWhite(' SSH ') + ` ${this.sshSession?.profile.options.host}: session closed\r\n`) super.onSessionDestroyed() } } private async initializeSessionMaybeMultiplex (multiplex = true): Promise { this.sshSession = await this.setupOneSession(this.injector, this.profile, multiplex) const session = new SSHShellSession(this.injector, this.sshSession, this.profile) this.setSession(session) this.attachSessionHandler(session.serviceMessage$, msg => { msg = msg.replace(/\n/g, '\r\n ') this.write(`\r${colors.black.bgWhite(' SSH ')} ${msg}\r\n`) session.resize(this.size.columns, this.size.rows) }) await session.start() this.session?.resize(this.size.columns, this.size.rows) } async initializeSession (): Promise { await super.initializeSession() try { await this.initializeSessionMaybeMultiplex(true) } catch { try { await this.initializeSessionMaybeMultiplex(false) } catch (e) { console.error('SSH session initialization failed', e) this.write(colors.black.bgRed(' X ') + ' ' + colors.red(e.message) + '\r\n') return } } } showPortForwarding (): void { const modal = this.ngbModal.open(SSHPortForwardingModalComponent).componentInstance as SSHPortForwardingModalComponent modal.session = this.sshSession! } async canClose (): Promise { if (!this.session?.open) { return true } if (!this.profile.options.warnOnClose) { return true } return (await this.platform.showMessageBox( { type: 'warning', message: this.translate.instant(_('Disconnect from {host}?'), this.profile.options), buttons: [ this.translate.instant(_('Disconnect')), this.translate.instant(_('Do not close')), ], defaultId: 0, cancelId: 1, }, )).response === 0 } async openSFTP (): Promise { this.sftpPath = await this.session?.getWorkingDirectory() ?? this.sftpPath setTimeout(() => { this.sftpPanelVisible = true }, 100) } @HostListener('click') onClick (): void { this.sftpPanelVisible = false } protected isSessionExplicitlyTerminated (): boolean { return super.isSessionExplicitlyTerminated() || this.recentInputs.charCodeAt(this.recentInputs.length - 1) === 4 || this.recentInputs.endsWith('exit\r') } } ================================================ FILE: tabby-ssh/src/config.ts ================================================ import { ConfigProvider } from 'tabby-core' /** @hidden */ export class SSHConfigProvider extends ConfigProvider { defaults = { ssh: { warnOnClose: false, winSCPPath: null, agentType: 'auto', agentPath: null, x11Display: null, knownHosts: [], verifyHostKeys: true, }, hotkeys: { 'restart-ssh-session': [], 'launch-winscp': [], }, } platformDefaults = { } } ================================================ FILE: tabby-ssh/src/hotkeys.ts ================================================ import { Injectable } from '@angular/core' import { HotkeyDescription, HotkeyProvider, TranslateService } from 'tabby-core' /** @hidden */ @Injectable() export class SSHHotkeyProvider extends HotkeyProvider { hotkeys: HotkeyDescription[] = [ { id: 'restart-ssh-session', name: this.translate.instant('Restart current SSH session'), }, { id: 'launch-winscp', name: this.translate.instant('Launch WinSCP for current SSH session'), }, ] constructor (private translate: TranslateService) { super() } async provide (): Promise { return this.hotkeys } } ================================================ FILE: tabby-ssh/src/index.ts ================================================ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { FormsModule } from '@angular/forms' import { NgbModule } from '@ng-bootstrap/ng-bootstrap' import { ToastrModule } from 'ngx-toastr' import { NgxFilesizeModule } from 'ngx-filesize' import TabbyCoreModule, { ConfigProvider, TabRecoveryProvider, HotkeyProvider, TabContextMenuItemProvider, ProfileProvider } from 'tabby-core' import { SettingsTabProvider } from 'tabby-settings' import TabbyTerminalModule from 'tabby-terminal' import { SSHProfileSettingsComponent } from './components/sshProfileSettings.component' import { SSHPortForwardingModalComponent } from './components/sshPortForwardingModal.component' import { SSHPortForwardingConfigComponent } from './components/sshPortForwardingConfig.component' import { SSHSettingsTabComponent } from './components/sshSettingsTab.component' import { SSHTabComponent } from './components/sshTab.component' import { SFTPPanelComponent } from './components/sftpPanel.component' import { SFTPDeleteModalComponent } from './components/sftpDeleteModal.component' import { KeyboardInteractiveAuthComponent } from './components/keyboardInteractiveAuthPanel.component' import { HostKeyPromptModalComponent } from './components/hostKeyPromptModal.component' import { SSHConfigProvider } from './config' import { SSHSettingsTabProvider } from './settings' import { RecoveryProvider } from './recoveryProvider' import { SSHHotkeyProvider } from './hotkeys' import { SFTPContextMenu } from './tabContextMenu' import { SSHProfilesService } from './profiles' import { SFTPContextMenuItemProvider } from './api/contextMenu' import { CommonSFTPContextMenu } from './sftpContextMenu' import { SFTPCreateDirectoryModalComponent } from './components/sftpCreateDirectoryModal.component' /** @hidden */ @NgModule({ imports: [ NgbModule, NgxFilesizeModule, CommonModule, FormsModule, ToastrModule, TabbyCoreModule, TabbyTerminalModule, ], providers: [ { provide: ConfigProvider, useClass: SSHConfigProvider, multi: true }, { provide: SettingsTabProvider, useClass: SSHSettingsTabProvider, multi: true }, { provide: TabRecoveryProvider, useClass: RecoveryProvider, multi: true }, { provide: HotkeyProvider, useClass: SSHHotkeyProvider, multi: true }, { provide: TabContextMenuItemProvider, useClass: SFTPContextMenu, multi: true }, { provide: ProfileProvider, useExisting: SSHProfilesService, multi: true }, { provide: SFTPContextMenuItemProvider, useClass: CommonSFTPContextMenu, multi: true }, ], declarations: [ SSHProfileSettingsComponent, SFTPDeleteModalComponent, SFTPCreateDirectoryModalComponent, SSHPortForwardingModalComponent, SSHPortForwardingConfigComponent, SSHSettingsTabComponent, SSHTabComponent, SFTPPanelComponent, KeyboardInteractiveAuthComponent, HostKeyPromptModalComponent, ], }) // eslint-disable-next-line @typescript-eslint/no-extraneous-class export default class SSHModule { } export * from './api' export { SFTPFile, SFTPSession } from './session/sftp' export { SFTPPanelComponent, SSHTabComponent } export { PasswordStorageService } from './services/passwordStorage.service' ================================================ FILE: tabby-ssh/src/profiles.ts ================================================ import { Injectable, InjectFlags, Injector } from '@angular/core' import { NewTabParameters, PartialProfile, TranslateService, QuickConnectProfileProvider } from 'tabby-core' import { SSHProfileSettingsComponent } from './components/sshProfileSettings.component' import { SSHTabComponent } from './components/sshTab.component' import { PasswordStorageService } from './services/passwordStorage.service' import { SSHAlgorithmType, SSHProfile } from './api' import { SSHProfileImporter } from './api/importer' import { defaultAlgorithms } from './algorithms' @Injectable({ providedIn: 'root' }) export class SSHProfilesService extends QuickConnectProfileProvider { id = 'ssh' name = 'SSH' settingsComponent = SSHProfileSettingsComponent configDefaults = { options: { host: '', port: 22, user: 'root', auth: null, password: null, privateKeys: [], keepaliveInterval: 5000, keepaliveCountMax: 10, readyTimeout: null, x11: false, skipBanner: false, jumpHost: null, agentForward: false, warnOnClose: null, algorithms: { hmac: [] as string[], kex: [] as string[], cipher: [] as string[], serverHostKey: [] as string[], compression: [] as string[], }, proxyCommand: null, forwardedPorts: [], scripts: [], socksProxyHost: null, socksProxyPort: null, httpProxyHost: null, httpProxyPort: null, reuseSession: true, input: { backspace: 'backspace' }, }, clearServiceMessagesOnConnect: true, } constructor ( private passwordStorage: PasswordStorageService, private translate: TranslateService, private injector: Injector, ) { super() for (const k of Object.values(SSHAlgorithmType)) { this.configDefaults.options.algorithms[k] = [...defaultAlgorithms[k]] if (k !== SSHAlgorithmType.COMPRESSION) { this.configDefaults.options.algorithms[k].sort() } } } async getBuiltinProfiles (): Promise[]> { const importers = this.injector.get(SSHProfileImporter as any, [], InjectFlags.Optional) let imported: PartialProfile[] = [] for (const importer of importers) { try { imported = imported.concat(await importer.getProfiles()) } catch (e) { console.warn('Could not import SSH profiles:', e) } } return [ { id: `ssh:template`, type: 'ssh', name: this.translate.instant('SSH connection'), icon: 'fas fa-desktop', options: { host: '', port: 22, user: 'root', }, isBuiltin: true, isTemplate: true, weight: -1, }, ...imported.map(p => ({ ...p, isBuiltin: true, })), ] } async getNewTabParameters (profile: SSHProfile): Promise> { return { type: SSHTabComponent, inputs: { profile }, } } getSuggestedName (profile: SSHProfile): string { return `${profile.options.user}@${profile.options.host}:${profile.options.port}` } getDescription (profile: PartialProfile): string { return profile.options?.host ?? '' } deleteProfile (profile: SSHProfile): void { this.passwordStorage.deletePassword(profile) } quickConnect (query: string): PartialProfile { let user: string|undefined = undefined let host = query let port = 22 if (host.includes('@')) { const parts = host.split(/@/g) host = parts[parts.length - 1] user = parts.slice(0, parts.length - 1).join('@') } if (host.includes('[')) { port = parseInt(host.split(']')[1].substring(1)) host = host.split(']')[0].substring(1) } else if (host.includes(':')) { port = parseInt(host.split(/:/g)[1]) host = host.split(':')[0] } return { name: query, type: 'ssh', options: { host, user, port, }, } } intoQuickConnectString (profile: SSHProfile): string|null { let s = profile.options.host if (profile.options.user !== 'root') { s = `${profile.options.user}@${s}` } if (profile.options.port !== 22) { s = `${s}:${profile.options.port}` } return s } } ================================================ FILE: tabby-ssh/src/recoveryProvider.ts ================================================ import { Injectable, Injector } from '@angular/core' import { TabRecoveryProvider, NewTabParameters, RecoveryToken, ProfilesService } from 'tabby-core' import { SSHTabComponent } from './components/sshTab.component' /** @hidden */ @Injectable() export class RecoveryProvider extends TabRecoveryProvider { constructor (private injector: Injector) { super() } async applicableTo (recoveryToken: RecoveryToken): Promise { return recoveryToken.type === 'app:ssh-tab' } async recover (recoveryToken: RecoveryToken): Promise> { return { type: SSHTabComponent, inputs: { profile: this.injector.get(ProfilesService).getConfigProxyForProfile(recoveryToken.profile), savedState: recoveryToken.savedState, }, } } } ================================================ FILE: tabby-ssh/src/services/passwordStorage.service.ts ================================================ import * as keytar from 'keytar' import { Injectable } from '@angular/core' import { VaultService } from 'tabby-core' import { SSHProfile } from '../api' export const VAULT_SECRET_TYPE_PASSWORD = 'ssh:password' export const VAULT_SECRET_TYPE_PASSPHRASE = 'ssh:key-passphrase' @Injectable({ providedIn: 'root' }) export class PasswordStorageService { constructor (private vault: VaultService) { } async savePassword (profile: SSHProfile, password: string, username?: string): Promise { const account = username ?? profile.options.user if (this.vault.isEnabled()) { const key = this.getVaultKeyForConnection(profile, account) this.vault.addSecret({ type: VAULT_SECRET_TYPE_PASSWORD, key, value: password }) } else { if (!account) { return } const key = this.getKeytarKeyForConnection(profile) return keytar.setPassword(key, account, password) } } async deletePassword (profile: SSHProfile, username?: string): Promise { const account = username ?? profile.options.user if (this.vault.isEnabled()) { const key = this.getVaultKeyForConnection(profile, account) this.vault.removeSecret(VAULT_SECRET_TYPE_PASSWORD, key) } else { if (!account) { return } const key = this.getKeytarKeyForConnection(profile) await keytar.deletePassword(key, account) } } async loadPassword (profile: SSHProfile, username?: string): Promise { const account = username ?? profile.options.user if (this.vault.isEnabled()) { const key = this.getVaultKeyForConnection(profile, account) return (await this.vault.getSecret(VAULT_SECRET_TYPE_PASSWORD, key))?.value ?? null } else { if (!account) { return null } const key = this.getKeytarKeyForConnection(profile) return keytar.getPassword(key, account) } } async savePrivateKeyPassword (id: string, password: string): Promise { if (this.vault.isEnabled()) { const key = this.getVaultKeyForPrivateKey(id) this.vault.addSecret({ type: VAULT_SECRET_TYPE_PASSPHRASE, key, value: password }) } else { const key = this.getKeytarKeyForPrivateKey(id) return keytar.setPassword(key, 'user', password) } } async deletePrivateKeyPassword (id: string): Promise { if (this.vault.isEnabled()) { const key = this.getVaultKeyForPrivateKey(id) this.vault.removeSecret(VAULT_SECRET_TYPE_PASSPHRASE, key) } else { const key = this.getKeytarKeyForPrivateKey(id) await keytar.deletePassword(key, 'user') } } async loadPrivateKeyPassword (id: string): Promise { if (this.vault.isEnabled()) { const key = this.getVaultKeyForPrivateKey(id) return (await this.vault.getSecret(VAULT_SECRET_TYPE_PASSPHRASE, key))?.value ?? null } else { const key = this.getKeytarKeyForPrivateKey(id) return keytar.getPassword(key, 'user') } } private getKeytarKeyForConnection (profile: SSHProfile): string { let key = `ssh@${profile.options.host}` if (profile.options.port) { key = `ssh@${profile.options.host}:${profile.options.port}` } return key } private getKeytarKeyForPrivateKey (id: string): string { return `ssh-private-key:${id}` } private getVaultKeyForConnection (profile: SSHProfile, username?: string) { return { user: username ?? profile.options.user, host: profile.options.host, port: profile.options.port, } } private getVaultKeyForPrivateKey (id: string) { return { hash: id } } } ================================================ FILE: tabby-ssh/src/services/ssh.service.ts ================================================ import * as fs from 'fs/promises' import * as crypto from 'crypto' import * as tmp from 'tmp-promise' import { Injectable } from '@angular/core' import { ConfigService, FileProvidersService, HostAppService, Platform, PlatformService } from 'tabby-core' import { SSHSession } from '../session/ssh' import { SSHProfile } from '../api' import { PasswordStorageService } from './passwordStorage.service' @Injectable({ providedIn: 'root' }) export class SSHService { private detectedWinSCPPath: string | null private constructor ( private passwordStorage: PasswordStorageService, private config: ConfigService, hostApp: HostAppService, private platform: PlatformService, private fileProviders: FileProvidersService, ) { if (hostApp.platform === Platform.Windows) { this.detectedWinSCPPath = platform.getWinSCPPath() } } getWinSCPPath (): string|undefined { return this.detectedWinSCPPath ?? this.config.store.ssh.winSCPPath } async generateWinSCPXTunnelURI (jumpHostProfile: SSHProfile|null): Promise<{ uri: string|null, privateKeyFile?: tmp.FileResult|null }> { let uri = '' let tmpFile: tmp.FileResult|null = null if (jumpHostProfile) { uri += ';x-tunnel=1' const jumpHostname = jumpHostProfile.options.host uri += `;x-tunnelhostname=${jumpHostname}` const jumpPort = jumpHostProfile.options.port ?? 22 uri += `;x-tunnelportnumber=${jumpPort}` const jumpUsername = jumpHostProfile.options.user uri += `;x-tunnelusername=${jumpUsername}` if (jumpHostProfile.options.auth === 'password') { const jumpPassword = await this.passwordStorage.loadPassword(jumpHostProfile, jumpUsername) if (jumpPassword) { uri += `;x-tunnelpasswordplain=${encodeURIComponent(jumpPassword)}` } } if (jumpHostProfile.options.auth === 'publicKey' && jumpHostProfile.options.privateKeys.length > 0) { const privateKeyPairs = await this.convertPrivateKeyFileToPuTTYFormat(jumpHostProfile) tmpFile = privateKeyPairs.privateKeyFile if (tmpFile) { uri += `;x-tunnelpublickeyfile=${encodeURIComponent(tmpFile.path)}` } if (privateKeyPairs.passphrase != null) { uri += `;x-tunnelpassphraseplain=${encodeURIComponent(privateKeyPairs.passphrase)}` } } } return { uri: uri, privateKeyFile: tmpFile?? null } } async getWinSCPURI (profile: SSHProfile, cwd?: string, username?: string): Promise<{ uri: string, privateKeyFile?: tmp.FileResult|null }> { let uri = `scp://${username ?? profile.options.user}` const password = await this.passwordStorage.loadPassword(profile, username) if (password) { uri += ':' + encodeURIComponent(password) } let tmpFile: tmp.FileResult|null = null if (profile.options.jumpHost) { const jumpHostProfile = this.config.store.profiles.find(x => x.id === profile.options.jumpHost) ?? null const xTunnelParams = await this.generateWinSCPXTunnelURI(jumpHostProfile) uri += xTunnelParams.uri ?? '' tmpFile = xTunnelParams.privateKeyFile ?? null } if (profile.options.host.includes(':')) { uri += `@[${profile.options.host}]:${profile.options.port}${cwd ?? '/'}` }else { uri += `@${profile.options.host}:${profile.options.port}${cwd ?? '/'}` } return { uri, privateKeyFile: tmpFile?? null } } async convertPrivateKeyFileToPuTTYFormat (profile: SSHProfile): Promise<{ passphrase: string|null, privateKeyFile: tmp.FileResult|null }> { if (profile.options.privateKeys.length === 0) { throw new Error('No private keys in profile') } const path = this.getWinSCPPath() if (!path) { throw new Error('WinSCP not found') } let tmpPrivateKeyFile: tmp.FileResult|null = null let passphrase: string|null = null const tmpFile: tmp.FileResult = await tmp.file() for (const pk of profile.options.privateKeys) { let privateKeyContent: string|null = null const buffer = await this.fileProviders.retrieveFile(pk) privateKeyContent = buffer.toString() await fs.writeFile(tmpFile.path, privateKeyContent) const keyHash = crypto.createHash('sha512').update(privateKeyContent).digest('hex') // need to pass an default passphrase, otherwise it might get stuck at the passphrase input const curPassphrase = await this.passwordStorage.loadPrivateKeyPassword(keyHash) ?? 'tabby' const winSCPcom = path.slice(0, -3) + 'com' try { await this.platform.exec(winSCPcom, ['/keygen', tmpFile.path, '-o', tmpFile.path, '--old-passphrase', curPassphrase]) } catch (error) { console.warn('Could not convert private key ', error) continue } tmpPrivateKeyFile = tmpFile passphrase = curPassphrase break } return { passphrase, privateKeyFile: tmpPrivateKeyFile } } async launchWinSCP (session: SSHSession): Promise { const path = this.getWinSCPPath() if (!path) { return } const winscpParms = await this.getWinSCPURI(session.profile, undefined, session.authUsername ?? undefined) const args = [winscpParms.uri] let tmpFile: tmp.FileResult|null = null try { if (session.activePrivateKey && session.profile.options.privateKeys.length > 0) { const profile = session.profile const privateKeyPairs = await this.convertPrivateKeyFileToPuTTYFormat(profile) tmpFile = privateKeyPairs.privateKeyFile if (tmpFile) { args.push(`/privatekey=${tmpFile.path}`) } if (privateKeyPairs.passphrase != null) { args.push(`/passphrase=${privateKeyPairs.passphrase}`) } } await this.platform.exec(path, args) } finally { tmpFile?.cleanup() winscpParms.privateKeyFile?.cleanup() } } } ================================================ FILE: tabby-ssh/src/services/sshKnownHosts.service.ts ================================================ import { Injectable } from '@angular/core' import { ConfigService } from 'tabby-core' export interface KnownHostSelector { host: string port: number type: string } export interface KnownHost extends KnownHostSelector { digest: string } @Injectable({ providedIn: 'root' }) export class SSHKnownHostsService { constructor ( private config: ConfigService, ) { } getFor (selector: KnownHostSelector): KnownHost|null { return this.config.store.ssh.knownHosts.find(x => x.host === selector.host && x.port === selector.port && x.type === selector.type) ?? null } async store (selector: KnownHostSelector, digest: string): Promise { const existing = this.getFor(selector) if (existing) { existing.digest = digest } else { this.config.store.ssh.knownHosts.push({ ...selector, digest }) } this.config.save() } } ================================================ FILE: tabby-ssh/src/services/sshMultiplexer.service.ts ================================================ import { Injectable } from '@angular/core' import { SSHProfile } from '../api' import { PartialProfile, ProfilesService } from 'tabby-core' import { SSHSession } from '../session/ssh' @Injectable({ providedIn: 'root' }) export class SSHMultiplexerService { private sessions = new Map() constructor ( private profilesService: ProfilesService, ) { } async addSession (session: SSHSession): Promise { const key = await this.getMultiplexerKey(session.profile) this.sessions.set(key, session) session.willDestroy$.subscribe(() => { if (this.sessions.get(key) === session) { this.sessions.delete(key) } }) } async getSession (profile: PartialProfile): Promise { const fullProfile = this.profilesService.getConfigProxyForProfile(profile) const key = await this.getMultiplexerKey(fullProfile) return this.sessions.get(key) ?? null } private async getMultiplexerKey (profile: SSHProfile) { let key = `${profile.options.host}:${profile.options.port}:${profile.options.user}:${profile.options.proxyCommand}:${profile.options.socksProxyHost}:${profile.options.socksProxyPort}:${profile.options.httpProxyHost}:${profile.options.httpProxyPort}` if (profile.options.jumpHost) { const jumpConnection = (await this.profilesService.getProfiles()).find(x => x.id === profile.options.jumpHost) if (!jumpConnection) { return key } const jumpProfile = this.profilesService.getConfigProxyForProfile(jumpConnection) key += '$' + await this.getMultiplexerKey(jumpProfile) } return key } } ================================================ FILE: tabby-ssh/src/session/forwards.ts ================================================ import socksv5 from '@luminati-io/socksv5' import { Server, Socket, createServer } from 'net' import { ForwardedPortConfig, PortForwardType } from '../api' export class ForwardedPort implements ForwardedPortConfig { type: PortForwardType host = '127.0.0.1' port: number targetAddress: string targetPort: number description: string private listener: Server|null = null async startLocalListener (callback: (accept: () => Socket, reject: () => void, sourceAddress: string|null, sourcePort: number|null, targetAddress: string, targetPort: number) => void): Promise { if (this.type === PortForwardType.Local) { const listener = this.listener = createServer(s => callback( () => s, () => s.destroy(), s.remoteAddress ?? null, s.remotePort ?? null, this.targetAddress, this.targetPort, )) return new Promise((resolve, reject) => { listener.listen(this.port, this.host) listener.on('error', reject) listener.on('listening', resolve) }) } else if (this.type === PortForwardType.Dynamic) { return new Promise((resolve, reject) => { this.listener = socksv5.createServer((info, acceptConnection, rejectConnection) => { callback( () => acceptConnection(true), () => rejectConnection(), null, null, info.dstAddr, info.dstPort, ) }) as Server this.listener.on('error', reject) this.listener.listen(this.port, this.host, resolve) this.listener['useAuth'](socksv5.auth.None()) }) } else { throw new Error('Invalid forward type for a local listener') } } stopLocalListener (): void { this.listener?.close() } toString (): string { if (this.type === PortForwardType.Local) { return `(local) ${this.host}:${this.port} → (remote) ${this.targetAddress}:${this.targetPort}` } if (this.type === PortForwardType.Remote) { return `(remote) ${this.host}:${this.port} → (local) ${this.targetAddress}:${this.targetPort}` } else { return `(dynamic) ${this.host}:${this.port}` } } } ================================================ FILE: tabby-ssh/src/session/sftp.ts ================================================ /* eslint-disable @typescript-eslint/no-unused-vars */ import { Subject, Observable } from 'rxjs' import { posix as posixPath } from 'path' import { Injector } from '@angular/core' import { FileDownload, FileUpload, Logger, LogService } from 'tabby-core' import * as russh from 'russh' export interface SFTPFile { name: string fullPath: string isDirectory: boolean isSymlink: boolean mode: number size: number modified: Date } export class SFTPFileHandle { position = 0 constructor ( private inner: russh.SFTPFile|null, ) { } async read (): Promise { if (!this.inner) { return Promise.resolve(new Uint8Array(0)) } return this.inner.read(256 * 1024) } async write (chunk: Uint8Array): Promise { if (!this.inner) { throw new Error('File handle is closed') } await this.inner.writeAll(chunk) } async close (): Promise { await this.inner?.shutdown() this.inner = null } } export class SFTPSession { get closed$ (): Observable { return this.closed } private closed = new Subject() private logger: Logger constructor (private sftp: russh.SFTP, injector: Injector) { this.logger = injector.get(LogService).create('sftp') sftp.closed$.subscribe(() => { this.closed.next() this.closed.complete() }) } async readdir (p: string): Promise { this.logger.debug('readdir', p) const entries = await this.sftp.readDirectory(p) return entries.map(entry => this._makeFile( posixPath.join(p, entry.name), entry, )) } readlink (p: string): Promise { this.logger.debug('readlink', p) return this.sftp.readlink(p) } async stat (p: string): Promise { this.logger.debug('stat', p) const stats = await this.sftp.stat(p) return { name: posixPath.basename(p), fullPath: p, isDirectory: stats.type === russh.SFTPFileType.Directory, isSymlink: stats.type === russh.SFTPFileType.Symlink, mode: stats.permissions ?? 0, size: stats.size, modified: new Date((stats.mtime ?? 0) * 1000), } } async open (p: string, mode: number): Promise { this.logger.debug('open', p, mode) const handle = await this.sftp.open(p, mode) return new SFTPFileHandle(handle) } async rmdir (p: string): Promise { await this.sftp.removeDirectory(p) } async mkdir (p: string): Promise { await this.sftp.createDirectory(p) } async rename (oldPath: string, newPath: string): Promise { this.logger.debug('rename', oldPath, newPath) await this.sftp.rename(oldPath, newPath) } async unlink (p: string): Promise { await this.sftp.removeFile(p) } async chmod (p: string, mode: string|number): Promise { this.logger.debug('chmod', p, mode) await this.sftp.chmod(p, mode) } async upload (path: string, transfer: FileUpload): Promise { this.logger.info('Uploading into', path) const tempPath = path + '.tabby-upload' try { const handle = await this.open(tempPath, russh.OPEN_WRITE | russh.OPEN_CREATE) while (true) { const chunk = await transfer.read() if (!chunk.length) { break } await handle.write(chunk) } await handle.close() await this.unlink(path).catch(() => null) await this.rename(tempPath, path) transfer.close() } catch (e) { transfer.cancel() this.unlink(tempPath).catch(() => null) throw e } } async download (path: string, transfer: FileDownload): Promise { this.logger.info('Downloading', path) try { const handle = await this.open(path, russh.OPEN_READ) while (true) { const chunk = await handle.read() if (!chunk.length) { break } await transfer.write(chunk) } transfer.close() handle.close() } catch (e) { transfer.cancel() throw e } } private _makeFile (p: string, entry: russh.SFTPDirectoryEntry): SFTPFile { return { fullPath: p, name: posixPath.basename(p), isDirectory: entry.metadata.type === russh.SFTPFileType.Directory, isSymlink: entry.metadata.type === russh.SFTPFileType.Symlink, mode: entry.metadata.permissions ?? 0, size: entry.metadata.size, modified: new Date((entry.metadata.mtime ?? 0) * 1000), } } } ================================================ FILE: tabby-ssh/src/session/shell.ts ================================================ import { Observable, Subject } from 'rxjs' import stripAnsi from 'strip-ansi' import { Injector } from '@angular/core' import { LogService } from 'tabby-core' import { BaseSession, UTF8SplitterMiddleware, InputProcessor } from 'tabby-terminal' import { SSHSession } from './ssh' import { SSHProfile } from '../api' import * as russh from 'russh' export class SSHShellSession extends BaseSession { shell?: russh.Channel get serviceMessage$ (): Observable { return this.serviceMessage } private serviceMessage = new Subject() private ssh: SSHSession|null constructor ( injector: Injector, ssh: SSHSession, private profile: SSHProfile, ) { super(injector.get(LogService).create(`ssh-shell-${profile.options.host}-${profile.options.port}`)) this.ssh = ssh this.setLoginScriptsOptions(this.profile.options) this.ssh.serviceMessage$.subscribe(m => this.serviceMessage.next(m)) this.middleware.push(new UTF8SplitterMiddleware()) this.middleware.push(new InputProcessor(profile.options.input)) } async start (): Promise { if (!this.ssh) { throw new Error('SSH session not set') } this.ssh.ref() this.ssh.willDestroy$.subscribe(() => { this.destroy() }) this.logger.debug('Opening shell') try { this.shell = await this.ssh.openShellChannel({ x11: this.profile.options.x11 }) } catch (err) { if (err.toString().includes('Unable to request X11')) { this.emitServiceMessage(' Make sure `xauth` is installed on the remote side') } throw new Error(`Remote rejected opening a shell channel: ${err}`) } this.open = true this.logger.debug('Shell open') this.loginScriptProcessor?.executeUnconditionalScripts() this.shell.data$.subscribe(data => { this.emitOutput(Buffer.from(data)) }) this.shell.eof$.subscribe(() => { this.logger.info('Shell session ended') if (this.open) { this.destroy() } }) } emitServiceMessage (msg: string): void { this.serviceMessage.next(msg) this.logger.info(stripAnsi(msg)) } resize (columns: number, rows: number): void { this.shell?.resizePTY({ columns, rows, pixHeight: 0, pixWidth: 0, }) } write (data: Buffer): void { if (this.shell) { this.shell.write(new Uint8Array(data)) } } kill (_signal?: string): void { // this.shell?.signal(signal ?? 'TERM') } async destroy (): Promise { this.logger.debug('Closing shell') this.serviceMessage.complete() this.kill() this.ssh?.unref() this.ssh = null await super.destroy() } async getChildProcesses (): Promise { return [] } async gracefullyKillProcess (): Promise { this.kill('TERM') } supportsWorkingDirectory (): boolean { return !!this.reportedCWD } async getWorkingDirectory (): Promise { return this.reportedCWD ?? null } } ================================================ FILE: tabby-ssh/src/session/ssh.ts ================================================ import * as fs from 'mz/fs' import * as crypto from 'crypto' import colors from 'ansi-colors' import stripAnsi from 'strip-ansi' import * as shellQuote from 'shell-quote' import { Injector } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { ConfigService, FileProvidersService, NotificationsService, PromptModalComponent, LogService, Logger, TranslateService, Platform, HostAppService } from 'tabby-core' import { Socket } from 'net' import { Subject, Observable } from 'rxjs' import { HostKeyPromptModalComponent } from '../components/hostKeyPromptModal.component' import { PasswordStorageService } from '../services/passwordStorage.service' import { SSHKnownHostsService } from '../services/sshKnownHosts.service' import { SFTPSession } from './sftp' import { SSHAlgorithmType, SSHProfile, AutoPrivateKeyLocator, PortForwardType } from '../api' import { ForwardedPort } from './forwards' import { X11Socket } from './x11' import { supportedAlgorithms } from '../algorithms' import * as russh from 'russh' const WINDOWS_OPENSSH_AGENT_PIPE = '\\\\.\\pipe\\openssh-ssh-agent' export interface Prompt { prompt: string echo?: boolean } type AuthMethod = { type: 'none'|'prompt-password'|'hostbased' } | { type: 'keyboard-interactive', savedPassword?: string } | { type: 'saved-password', password: string } | { type: 'publickey' name: string contents: Buffer } | ({ type: 'agent', publicKey?: russh.SshPublicKey } & ({ kind: 'unix-socket', path: string } | { kind: 'named-pipe', path: string } | { kind: 'pageant', })) function sshAuthTypeForMethod (m: AuthMethod): string { switch (m.type) { case 'none': return 'none' case 'hostbased': return 'hostbased' case 'prompt-password': return 'password' case 'saved-password': return 'password' case 'keyboard-interactive': return 'keyboard-interactive' case 'publickey': return 'publickey' case 'agent': return 'publickey' } } export class KeyboardInteractivePrompt { readonly responses: string[] = [] private _resolve: (value: string[]) => void private _reject: (reason: any) => void readonly promise = new Promise((resolve, reject) => { this._resolve = resolve this._reject = reject }) constructor ( public name: string, public instruction: string, public prompts: Prompt[], ) { this.responses = new Array(this.prompts.length).fill('') } isAPasswordPrompt (index: number): boolean { return this.prompts[index].prompt.toLowerCase().includes('password') && !this.prompts[index].echo } respond (): void { this._resolve(this.responses) } reject (): void { this._reject(new Error('Keyboard-interactive auth rejected')) } } export class SSHSession { shell?: russh.Channel ssh: russh.SSHClient|russh.AuthenticatedSSHClient sftp?: russh.SFTP forwardedPorts: ForwardedPort[] = [] jumpChannel: russh.NewChannel|null = null savedPassword?: string get serviceMessage$ (): Observable { return this.serviceMessage } get keyboardInteractivePrompt$ (): Observable { return this.keyboardInteractivePrompt } get willDestroy$ (): Observable { return this.willDestroy } activePrivateKey: russh.KeyPair|null = null authUsername: string|null = null open = false private logger: Logger private refCount = 0 private allAuthMethods: AuthMethod[] = [] private serviceMessage = new Subject() private keyboardInteractivePrompt = new Subject() private willDestroy = new Subject() private passwordStorage: PasswordStorageService private ngbModal: NgbModal private hostApp: HostAppService private notifications: NotificationsService private fileProviders: FileProvidersService private config: ConfigService private translate: TranslateService private knownHosts: SSHKnownHostsService private privateKeyImporters: AutoPrivateKeyLocator[] private previouslyDisconnected = false constructor ( private injector: Injector, public profile: SSHProfile, ) { this.logger = injector.get(LogService).create(`ssh-${profile.options.host}-${profile.options.port}`) this.passwordStorage = injector.get(PasswordStorageService) this.ngbModal = injector.get(NgbModal) this.hostApp = injector.get(HostAppService) this.notifications = injector.get(NotificationsService) this.fileProviders = injector.get(FileProvidersService) this.config = injector.get(ConfigService) this.translate = injector.get(TranslateService) this.knownHosts = injector.get(SSHKnownHostsService) this.privateKeyImporters = injector.get(AutoPrivateKeyLocator, []) this.willDestroy$.subscribe(() => { for (const port of this.forwardedPorts) { port.stopLocalListener() } }) } private addPublicKeyAuthMethod (name: string, contents: Buffer) { this.allAuthMethods.push({ type: 'publickey', name, contents, }) } async init (): Promise { this.allAuthMethods = [{ type: 'none' }] if (!this.profile.options.auth || this.profile.options.auth === 'publicKey') { if (this.profile.options.privateKeys.length) { for (let pk of this.profile.options.privateKeys) { // eslint-disable-next-line @typescript-eslint/init-declarations let contents: Buffer pk = pk.replace('%h', this.profile.options.host) pk = pk.replace('%r', this.profile.options.user) try { contents = await this.fileProviders.retrieveFile(pk) } catch (error) { this.emitServiceMessage(colors.bgYellow.yellow.black(' ! ') + ` Could not load private key ${pk}: ${error}`) continue } // If the file parses as a public key, it was likely a .pub file // mistakenly configured in the privateKeys list. In that case, // skip it here and warn the user instead of treating it as a // private key. try { russh.parsePublicKey(contents.toString('utf-8')) this.emitServiceMessage( colors.bgYellow.yellow.black(' ! ') + ` Expected a private key, but ${pk} appears to be a public key. Skipping it for private key authentication.`, ) continue } catch { // Not a valid public key; treat the file contents as a private key below. } this.addPublicKeyAuthMethod(pk, contents) } } else { for (const importer of this.privateKeyImporters) { for (const [name, contents] of await importer.getKeys()) { this.addPublicKeyAuthMethod(name, contents) } } } } if (!this.profile.options.auth || this.profile.options.auth === 'agent') { const spec = await this.getAgentConnectionSpec() if (!spec) { this.emitServiceMessage(colors.bgYellow.yellow.black(' ! ') + ` Agent auth selected, but no running Agent process is found`) } else { // If user configured specific private keys, try to load their corresponding // .pub files and use them first for agent-identity authentication if (this.profile.options.privateKeys.length) { for (let pk of this.profile.options.privateKeys) { pk = pk.replace('%h', this.profile.options.host) pk = pk.replace('%r', this.profile.options.user) // Try to load as public key file let pubKeyPath = pk if (!pk.endsWith('.pub')) { pubKeyPath = pk + '.pub' } try { const pubKeyContent = await this.fileProviders.retrieveFile(pubKeyPath) const publicKey = russh.parsePublicKey(pubKeyContent.toString('utf-8')) this.allAuthMethods.push({ type: 'agent', ...spec, publicKey, } as AuthMethod) this.emitServiceMessage(`Loaded public key for agent auth: ${pubKeyPath}`) } catch (error) { // Not a public key file or doesn't exist, skip this.emitServiceMessage( `Could not load public key for agent auth from ${pubKeyPath}: ${error}. ` + `Agent-identity authentication will not be attempted for this key.`, ) } } } // Always add fallback agent auth that tries all keys this.allAuthMethods.push({ type: 'agent', ...spec, }) } } if (!this.profile.options.auth || this.profile.options.auth === 'password') { if (this.profile.options.password) { this.allAuthMethods.push({ type: 'saved-password', password: this.profile.options.password }) } } if (!this.profile.options.auth || this.profile.options.auth === 'keyboardInteractive') { if (this.profile.options.password) { this.allAuthMethods.push({ type: 'keyboard-interactive', savedPassword: this.profile.options.password }) } this.allAuthMethods.push({ type: 'keyboard-interactive' }) } if (!this.profile.options.auth || this.profile.options.auth === 'password') { this.allAuthMethods.push({ type: 'prompt-password' }) } this.allAuthMethods.push({ type: 'hostbased' }) } private async populateStoredPasswordsForResolvedUsername (): Promise { if (!this.authUsername) { return } const storedPassword = await this.passwordStorage.loadPassword(this.profile, this.authUsername) if (!storedPassword) { return } if (!this.profile.options.auth || this.profile.options.auth === 'password') { const hasSavedPassword = this.allAuthMethods.some(method => method.type === 'saved-password' && method.password === storedPassword) if (!hasSavedPassword) { const promptIndex = this.allAuthMethods.findIndex(method => method.type === 'prompt-password') const insertIndex = promptIndex >= 0 ? promptIndex : this.allAuthMethods.length this.allAuthMethods.splice(insertIndex, 0, { type: 'saved-password', password: storedPassword }) } } if (!this.profile.options.auth || this.profile.options.auth === 'keyboardInteractive') { const existingSaved = this.allAuthMethods.find(method => method.type === 'keyboard-interactive' && method.savedPassword === storedPassword) if (!existingSaved) { const updatable = this.allAuthMethods.find(method => method.type === 'keyboard-interactive' && method.savedPassword === undefined) if (updatable && updatable.type === 'keyboard-interactive') { updatable.savedPassword = storedPassword } else { this.allAuthMethods.push({ type: 'keyboard-interactive', savedPassword: storedPassword }) } } } } private async getAgentConnectionSpec (): Promise { if (this.hostApp.platform === Platform.Windows) { if (this.config.store.ssh.agentType === 'auto') { let pipeExists = false try { await fs.stat(WINDOWS_OPENSSH_AGENT_PIPE) pipeExists = true } catch (e) { if (e.code === 'EBUSY') { pipeExists = true } } if (pipeExists) { return { kind: 'named-pipe', path: WINDOWS_OPENSSH_AGENT_PIPE, } } else if (russh.isPageantRunning()) { return { kind: 'pageant', } } else { this.emitServiceMessage(colors.bgYellow.yellow.black(' ! ') + ` Agent auth selected, but no running Agent process is found`) } } else if (this.config.store.ssh.agentType === 'pageant') { return { kind: 'pageant', } } else { return { kind: 'named-pipe', path: this.config.store.ssh.agentPath || WINDOWS_OPENSSH_AGENT_PIPE, } } } else { return { kind: 'unix-socket', path: process.env.SSH_AUTH_SOCK!, } } return null } async openSFTP (): Promise { if (!(this.ssh instanceof russh.AuthenticatedSSHClient)) { throw new Error('Cannot open SFTP session before auth') } if (!this.sftp) { this.sftp = await this.ssh.activateSFTP(await this.ssh.openSessionChannel()) } return new SFTPSession(this.sftp, this.injector) } async start (): Promise { await this.init() const algorithms = {} for (const key of Object.values(SSHAlgorithmType)) { algorithms[key] = this.profile.options.algorithms[key].filter(x => supportedAlgorithms[key].includes(x)) } // eslint-disable-next-line @typescript-eslint/init-declarations let transport: russh.SshTransport if (this.profile.options.proxyCommand) { this.emitServiceMessage(colors.bgBlue.black(' Proxy command ') + ` Using ${this.profile.options.proxyCommand}`) const argv = shellQuote.parse(this.profile.options.proxyCommand) transport = await russh.SshTransport.newCommand(argv[0], argv.slice(1)) } else if (this.jumpChannel) { transport = await russh.SshTransport.newSshChannel(this.jumpChannel.take()) this.jumpChannel = null } else if (this.profile.options.socksProxyHost) { this.emitServiceMessage(colors.bgBlue.black(' Proxy ') + ` Using ${this.profile.options.socksProxyHost}:${this.profile.options.socksProxyPort}`) transport = await russh.SshTransport.newSocksProxy( this.profile.options.socksProxyHost, this.profile.options.socksProxyPort ?? 1080, this.profile.options.host, this.profile.options.port ?? 22, ) } else if (this.profile.options.httpProxyHost) { this.emitServiceMessage(colors.bgBlue.black(' Proxy ') + ` Using ${this.profile.options.httpProxyHost}:${this.profile.options.httpProxyPort}`) transport = await russh.SshTransport.newHttpProxy( this.profile.options.httpProxyHost, this.profile.options.httpProxyPort ?? 8080, this.profile.options.host, this.profile.options.port ?? 22, ) } else { transport = await russh.SshTransport.newSocket(`${this.profile.options.host.trim()}:${this.profile.options.port ?? 22}`) } this.ssh = await russh.SSHClient.connect( transport, async key => { if (!await this.verifyHostKey(key)) { return false } this.logger.info('Host key verified') return true }, { preferred: { ciphers: this.profile.options.algorithms[SSHAlgorithmType.CIPHER].filter(x => supportedAlgorithms[SSHAlgorithmType.CIPHER].includes(x)), kex: this.profile.options.algorithms[SSHAlgorithmType.KEX].filter(x => supportedAlgorithms[SSHAlgorithmType.KEX].includes(x)), mac: this.profile.options.algorithms[SSHAlgorithmType.HMAC].filter(x => supportedAlgorithms[SSHAlgorithmType.HMAC].includes(x)), key: this.profile.options.algorithms[SSHAlgorithmType.HOSTKEY].filter(x => supportedAlgorithms[SSHAlgorithmType.HOSTKEY].includes(x)), compression: this.profile.options.algorithms[SSHAlgorithmType.COMPRESSION].filter(x => supportedAlgorithms[SSHAlgorithmType.COMPRESSION].includes(x)), }, keepaliveIntervalSeconds: Math.round(this.profile.options.keepaliveInterval / 1000), keepaliveCountMax: this.profile.options.keepaliveCountMax, connectionTimeoutSeconds: this.profile.options.readyTimeout ? Math.round(this.profile.options.readyTimeout / 1000) : undefined, }, ) this.ssh.banner$.subscribe(banner => { if (!this.profile.options.skipBanner) { this.emitServiceMessage(banner) } }) this.previouslyDisconnected = false this.ssh.disconnect$.subscribe(() => { if (!this.previouslyDisconnected) { this.previouslyDisconnected = true // Let service messages drain setTimeout(() => { this.destroy() }) } }) // Authentication this.authUsername ??= this.profile.options.user if (!this.authUsername) { const modal = this.ngbModal.open(PromptModalComponent) modal.componentInstance.prompt = `Username for ${this.profile.options.host}` try { const result = await modal.result.catch(() => null) this.authUsername = result?.value ?? null } catch { this.authUsername = 'root' } } if (this.authUsername?.startsWith('$')) { try { const result = process.env[this.authUsername.slice(1)] this.authUsername = result ?? this.authUsername } catch { this.authUsername = 'root' } } await this.populateStoredPasswordsForResolvedUsername() const authenticatedClient = await this.handleAuth() if (authenticatedClient) { this.ssh = authenticatedClient } else { this.ssh.disconnect() this.passwordStorage.deletePassword(this.profile, this.authUsername ?? undefined) // eslint-disable-next-line @typescript-eslint/no-base-to-string throw new Error('Authentication rejected') } // auth success if (this.savedPassword) { this.passwordStorage.savePassword(this.profile, this.savedPassword, this.authUsername ?? undefined) } for (const fw of this.profile.options.forwardedPorts) { this.addPortForward(Object.assign(new ForwardedPort(), fw)) } this.open = true this.ssh.tcpChannelOpen$.subscribe(async event => { this.logger.info(`Incoming forwarded connection: ${event.clientAddress}:${event.clientPort} -> ${event.targetAddress}:${event.targetPort}`) if (!(this.ssh instanceof russh.AuthenticatedSSHClient)) { throw new Error('Cannot open agent channel before auth') } const channel = await this.ssh.activateChannel(event.channel) const forward = this.forwardedPorts.find(x => x.port === event.targetPort && x.host === event.targetAddress) if (!forward) { this.emitServiceMessage(colors.bgRed.black(' X ') + ` Rejected incoming forwarded connection for unrecognized port ${event.targetAddress}:${event.targetPort}`) channel.close() return } const socket = new Socket() socket.connect(forward.targetPort, forward.targetAddress) socket.on('error', e => { // eslint-disable-next-line @typescript-eslint/no-base-to-string this.emitServiceMessage(colors.bgRed.black(' X ') + ` Could not forward the remote connection to ${forward.targetAddress}:${forward.targetPort}: ${e}`) channel.close() }) this.setupSocketChannelEvents(channel, socket, 'Remote forward') socket.on('connect', () => { this.logger.info('Connection forwarded') }) }) this.ssh.x11ChannelOpen$.subscribe(async event => { this.logger.info(`Incoming X11 connection from ${event.clientAddress}:${event.clientPort}`) const displaySpec = (this.config.store.ssh.x11Display || process.env.DISPLAY) ?? 'localhost:0' this.logger.debug(`Trying display ${displaySpec}`) if (!(this.ssh instanceof russh.AuthenticatedSSHClient)) { throw new Error('Cannot open agent channel before auth') } const channel = await this.ssh.activateChannel(event.channel) const socket = new X11Socket() try { const x11Stream = await socket.connect(displaySpec) this.logger.info('Connection forwarded') this.setupSocketChannelEvents(channel, x11Stream, 'X11 forward') } catch (e) { // eslint-disable-next-line @typescript-eslint/no-base-to-string this.emitServiceMessage(colors.bgRed.black(' X ') + ` Could not connect to the X server: ${e}`) this.emitServiceMessage(` Tabby tried to connect to ${JSON.stringify(X11Socket.resolveDisplaySpec(displaySpec))} based on the DISPLAY environment var (${displaySpec})`) if (process.platform === 'win32') { this.emitServiceMessage(' To use X forwarding, you need a local X server, e.g.:') this.emitServiceMessage(' * VcXsrv: https://sourceforge.net/projects/vcxsrv/') this.emitServiceMessage(' * Xming: https://sourceforge.net/projects/xming/') } channel.close() } }) this.ssh.agentChannelOpen$.subscribe(async newChannel => { if (!(this.ssh instanceof russh.AuthenticatedSSHClient)) { throw new Error('Cannot open agent channel before auth') } const channel = await this.ssh.activateChannel(newChannel) const spec = await this.getAgentConnectionSpec() if (!spec) { await channel.close() return } const agent = await russh.SSHAgentStream.connect(spec) channel.data$.subscribe(data => agent.write(data)) agent.data$.subscribe(data => channel.write(data), undefined, () => channel.close()) channel.closed$.subscribe(() => agent.close()) }) } private async verifyHostKey (key: russh.SshPublicKey): Promise { this.emitServiceMessage('Host key fingerprint:') this.emitServiceMessage(colors.white.bgBlack(` ${key.algorithm()} `) + colors.bgBlackBright(' ' + key.fingerprint() + ' ')) if (!this.config.store.ssh.verifyHostKeys) { return true } const selector = { host: this.profile.options.host, port: this.profile.options.port ?? 22, type: key.algorithm(), } const keyDigest = crypto.createHash('sha256').update(key.bytes()).digest('base64') const knownHost = this.profile.options.host ? this.knownHosts.getFor(selector) : null if (!knownHost || knownHost.digest !== keyDigest) { const modal = this.ngbModal.open(HostKeyPromptModalComponent) modal.componentInstance.selector = selector modal.componentInstance.digest = keyDigest return modal.result.catch(() => false) } return true } emitServiceMessage (msg: string): void { this.serviceMessage.next(msg) this.logger.info(stripAnsi(msg)) } emitKeyboardInteractivePrompt (prompt: KeyboardInteractivePrompt): void { this.logger.info('Keyboard-interactive auth:', prompt.name, prompt.instruction) this.emitServiceMessage(colors.bgBlackBright(' ') + ` Keyboard-interactive auth requested: ${prompt.name}`) if (prompt.instruction) { for (const line of prompt.instruction.split('\n')) { this.emitServiceMessage(line) } } this.keyboardInteractivePrompt.next(prompt) } async handleAuth (): Promise { const subscription = this.ssh.disconnect$.subscribe(() => { // Auto auth and >=3 keys found if (!this.profile.options.auth && this.allAuthMethods.filter(x => x.type === 'publickey').length >= 3) { this.emitServiceMessage('The server has disconnected during authentication.') this.emitServiceMessage('This may happen if too many private key authentication attemps are made.') this.emitServiceMessage('You can set the specific private key for authentication in the profile settings.') } }) try { return await this._handleAuth() } finally { subscription.unsubscribe() } } // eslint-disable-next-line max-statements private async _handleAuth (): Promise { this.activePrivateKey = null if (!(this.ssh instanceof russh.SSHClient)) { throw new Error('Wrong state for auth handling') } if (!this.authUsername) { throw new Error('No username') } const noneResult = await this.ssh.authenticateNone(this.authUsername) if (noneResult instanceof russh.AuthenticatedSSHClient) { return noneResult } let remainingMethods = [...this.allAuthMethods] let methodsLeft = noneResult.remainingMethods function maybeSetRemainingMethods (r: russh.AuthFailure) { if (r.remainingMethods.length) { methodsLeft = r.remainingMethods } } while (true) { const m = methodsLeft const method = remainingMethods.find(x => m.length === 0 || m.includes(sshAuthTypeForMethod(x))) if (this.previouslyDisconnected || !method) { return null } remainingMethods = remainingMethods.filter(x => x !== method) if (method.type === 'saved-password') { this.emitServiceMessage(this.translate.instant('Using saved password')) const result = await this.ssh.authenticateWithPassword(this.authUsername, method.password) if (result instanceof russh.AuthenticatedSSHClient) { return result } maybeSetRemainingMethods(result) } if (method.type === 'prompt-password') { const modal = this.ngbModal.open(PromptModalComponent) modal.componentInstance.prompt = `Password for ${this.authUsername}@${this.profile.options.host}` modal.componentInstance.password = true modal.componentInstance.showRememberCheckbox = true try { const promptResult = await modal.result.catch(() => null) if (promptResult) { if (promptResult.remember) { this.savedPassword = promptResult.value } const result = await this.ssh.authenticateWithPassword(this.authUsername, promptResult.value) if (result instanceof russh.AuthenticatedSSHClient) { return result } maybeSetRemainingMethods(result) } else { continue } } catch { continue } } if (method.type === 'publickey') { try { const key = await this.loadPrivateKey(method.name, method.contents) this.emitServiceMessage(`Trying private key: ${method.name}`) const result = await this.ssh.authenticateWithKeyPair(this.authUsername, key, null) if (result instanceof russh.AuthenticatedSSHClient) { return result } maybeSetRemainingMethods(result) } catch (e) { this.emitServiceMessage(colors.bgYellow.yellow.black(' ! ') + ` Failed to load private key ${method.name}: ${e}`) continue } } if (method.type === 'keyboard-interactive') { let state: russh.AuthenticatedSSHClient|russh.KeyboardInteractiveAuthenticationState = await this.ssh.startKeyboardInteractiveAuthentication(this.authUsername) while (true) { if (state.state === 'failure') { maybeSetRemainingMethods(state) break } const prompts = state.prompts() let responses: string[] = [] // OpenSSH can send a k-i request without prompts // just respond ok to it if (prompts.length > 0) { const prompt = new KeyboardInteractivePrompt( state.name, state.instructions, state.prompts(), ) if (method.savedPassword) { // eslint-disable-next-line max-depth for (let i = 0; i < prompt.prompts.length; i++) { // eslint-disable-next-line max-depth if (prompt.isAPasswordPrompt(i)) { prompt.responses[i] = method.savedPassword } } } this.emitKeyboardInteractivePrompt(prompt) try { // eslint-disable-next-line @typescript-eslint/await-thenable responses = await prompt.promise } catch { break // this loop } } state = await this.ssh.continueKeyboardInteractiveAuthentication(responses) if (state instanceof russh.AuthenticatedSSHClient) { return state } } } if (method.type === 'agent') { try { const result = method.publicKey ? await this.ssh.authenticateWithAgentIdentity(this.authUsername, method, method.publicKey) : await this.ssh.authenticateWithAgent(this.authUsername, method) if (result instanceof russh.AuthenticatedSSHClient) { return result } maybeSetRemainingMethods(result) } catch (e) { const identitySuffix = method.publicKey ? ` with identity ${method.publicKey.fingerprint()}` : '' this.emitServiceMessage(colors.bgYellow.yellow.black(' ! ') + ` Failed to authenticate using agent${identitySuffix}: ${e}`) continue } } } return null } async addPortForward (fw: ForwardedPort): Promise { if (fw.type === PortForwardType.Local || fw.type === PortForwardType.Dynamic) { await fw.startLocalListener(async (accept, reject, sourceAddress, sourcePort, targetAddress, targetPort) => { this.logger.info(`New connection on ${fw}`) if (!(this.ssh instanceof russh.AuthenticatedSSHClient)) { this.logger.error(`Connection while unauthenticated on ${fw}`) reject() return } const channel = await this.ssh.activateChannel(await this.ssh.openTCPForwardChannel({ addressToConnectTo: targetAddress, portToConnectTo: targetPort, originatorAddress: sourceAddress ?? '127.0.0.1', originatorPort: sourcePort ?? 0, }).catch(err => { this.emitServiceMessage(colors.bgRed.black(' X ') + ` Remote has rejected the forwarded connection to ${targetAddress}:${targetPort} via ${fw}: ${err}`) reject() throw err })) const socket = accept() this.setupSocketChannelEvents(channel, socket, 'Local forward') }).then(() => { this.emitServiceMessage(colors.bgGreen.black(' -> ') + ` Forwarded ${fw}`) this.forwardedPorts.push(fw) }).catch(e => { this.emitServiceMessage(colors.bgRed.black(' X ') + ` Failed to forward port ${fw}: ${e}`) throw e }) } if (fw.type === PortForwardType.Remote) { if (!(this.ssh instanceof russh.AuthenticatedSSHClient)) { throw new Error('Cannot add remote port forward before auth') } try { await this.ssh.forwardTCPPort(fw.host, fw.port) } catch (err) { // eslint-disable-next-line @typescript-eslint/no-base-to-string this.emitServiceMessage(colors.bgRed.black(' X ') + ` Remote rejected port forwarding for ${fw}: ${err}`) return } this.emitServiceMessage(colors.bgGreen.black(' <- ') + ` Forwarded ${fw}`) this.forwardedPorts.push(fw) } } async removePortForward (fw: ForwardedPort): Promise { if (fw.type === PortForwardType.Local || fw.type === PortForwardType.Dynamic) { fw.stopLocalListener() this.forwardedPorts = this.forwardedPorts.filter(x => x !== fw) } if (fw.type === PortForwardType.Remote) { if (!(this.ssh instanceof russh.AuthenticatedSSHClient)) { throw new Error('Cannot remove remote port forward before auth') } this.ssh.stopForwardingTCPPort(fw.host, fw.port) this.forwardedPorts = this.forwardedPorts.filter(x => x !== fw) } this.emitServiceMessage(`Stopped forwarding ${fw}`) } async destroy (): Promise { this.logger.info('Destroying') this.willDestroy.next() this.willDestroy.complete() this.serviceMessage.complete() this.ssh.disconnect() } async openShellChannel (options: { x11: boolean }): Promise { if (!(this.ssh instanceof russh.AuthenticatedSSHClient)) { throw new Error('Cannot open shell channel before auth') } const ch = await this.ssh.activateChannel(await this.ssh.openSessionChannel()) await ch.requestPTY('xterm-256color', { columns: 80, rows: 24, pixHeight: 0, pixWidth: 0, }) if (options.x11) { await ch.requestX11Forwarding({ singleConnection: false, authProtocol: 'MIT-MAGIC-COOKIE-1', authCookie: crypto.randomBytes(16).toString('hex'), screenNumber: 0, }) } if (this.profile.options.agentForward) { await ch.requestAgentForwarding() } await ch.requestShell() return ch } private setupSocketChannelEvents (channel: russh.Channel, socket: Socket, logPrefix: string): void { // Channel → Socket data flow with error handling channel.data$.subscribe({ next: data => socket.write(data), error: err => { this.logger.error(`${logPrefix}: channel data error: ${err}`) socket.destroy() }, }) // Socket → Channel data flow with proper conversion socket.on('data', data => { try { channel.write(new Uint8Array(data.buffer, data.byteOffset, data.byteLength)) } catch (err) { this.logger.error(`${logPrefix}: channel write error: ${err}`) socket.destroy(new Error(`${logPrefix}failed to write to channel: ${err}`)) } }) // Handle EOF from remote channel.eof$.subscribe(() => { this.logger.debug(`${logPrefix}: channel EOF received, ending socket`) socket.end() }) // Handle channel close channel.closed$.subscribe(() => { this.logger.debug(`${logPrefix}: channel closed, destroying socket`) socket.destroy() }) // Handle socket errors socket.on('error', err => { this.logger.error(`${logPrefix}: socket error: ${err}`) channel.close() }) // Handle socket close socket.on('close', () => { this.logger.debug(`${logPrefix}: socket closed, closing channel`) channel.close() }) // Handle EOF from local socket.on('end', () => { this.logger.debug(`${logPrefix}: socket end, sending EOF to channel`) channel.eof() }) } async loadPrivateKey (name: string, privateKeyContents: Buffer): Promise { this.activePrivateKey = await this.loadPrivateKeyWithPassphraseMaybe(privateKeyContents.toString()) return this.activePrivateKey } async loadPrivateKeyWithPassphraseMaybe (privateKey: string): Promise { const keyHash = crypto.createHash('sha512').update(privateKey).digest('hex') privateKey = privateKey.replaceAll('EC PRIVATE KEY', 'PRIVATE KEY') let triedSavedPassphrase = false let passphrase: string|null = null while (true) { try { return await russh.KeyPair.parse(privateKey, passphrase ?? undefined) } catch (e) { if (!triedSavedPassphrase) { passphrase = await this.passwordStorage.loadPrivateKeyPassword(keyHash) triedSavedPassphrase = true continue } if ([ 'Error: Keys(KeyIsEncrypted)', 'Error: Keys(SshKey(Ppk(Encrypted)))', 'Error: Keys(SshKey(Ppk(IncorrectMac)))', 'Error: Keys(SshKey(Crypto))', ].includes(e.toString())) { await this.passwordStorage.deletePrivateKeyPassword(keyHash) const modal = this.ngbModal.open(PromptModalComponent) modal.componentInstance.prompt = 'Private key passphrase' modal.componentInstance.password = true modal.componentInstance.showRememberCheckbox = true const result = await modal.result.catch(() => { throw new Error('Passphrase prompt cancelled') }) passphrase = result?.value if (passphrase && result.remember) { this.passwordStorage.savePrivateKeyPassword(keyHash, passphrase) } } else { this.notifications.error('Could not read the private key', e.toString()) throw e } } } } ref (): void { this.refCount++ } unref (): void { this.refCount-- if (this.refCount === 0) { this.destroy() } } } ================================================ FILE: tabby-ssh/src/session/x11.ts ================================================ import { Socket, SocketConnectOpts } from 'net' import { Subject } from 'rxjs' export class X11Socket { error$ = new Subject() private socket: Socket | null = null static resolveDisplaySpec (spec?: string|null): SocketConnectOpts { // eslint-disable-next-line prefer-const, @typescript-eslint/no-unused-vars let [_, xHost, xDisplay] = /^(.+):(\d+)(?:.(\d+))$/.exec(spec ?? process.env.DISPLAY ?? 'localhost:0') ?? [undefined, undefined, undefined] if (process.platform === 'win32') { xHost ??= 'localhost' } else { xHost ??= 'unix' } if (spec?.startsWith('/')) { xHost = spec } const display = parseInt(xDisplay ?? '0') const port = display < 100 ? display + 6000 : display if (xHost === 'unix') { xHost = `/tmp/.X11-unix/X${display}` } if (xHost.startsWith('/')) { return { path: xHost, } } else { return { host: xHost, port: port, } } } connect (spec: string): Promise { this.socket = new Socket() return new Promise((resolve, reject) => { this.socket!.on('connect', () => { resolve(this.socket!) }) this.socket!.on('error', e => { this.error$.next(e) reject(e) }) this.socket!.connect(X11Socket.resolveDisplaySpec(spec)) }) } destroy (): void { this.socket?.destroy() } } ================================================ FILE: tabby-ssh/src/settings.ts ================================================ import { Injectable } from '@angular/core' import { SettingsTabProvider } from 'tabby-settings' import { SSHSettingsTabComponent } from './components/sshSettingsTab.component' /** @hidden */ @Injectable() export class SSHSettingsTabProvider extends SettingsTabProvider { id = 'ssh' icon = 'globe' title = 'SSH' getComponentType (): any { return SSHSettingsTabComponent } } ================================================ FILE: tabby-ssh/src/sftpContextMenu.ts ================================================ import { Injectable } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { MenuItemOptions, PlatformService, TranslateService, HostAppService, Platform } from 'tabby-core' import { SFTPSession, SFTPFile } from './session/sftp' import { SFTPContextMenuItemProvider } from './api' import { SFTPDeleteModalComponent } from './components/sftpDeleteModal.component' import { SFTPPanelComponent } from './components/sftpPanel.component' /** @hidden */ @Injectable() export class CommonSFTPContextMenu extends SFTPContextMenuItemProvider { weight = 10 constructor ( private platform: PlatformService, private ngbModal: NgbModal, private translate: TranslateService, private hostApp: HostAppService, ) { super() } async getItems (item: SFTPFile, panel: SFTPPanelComponent): Promise { const items: MenuItemOptions[] = [ { click: async () => { await panel.openCreateDirectoryModal() }, label: this.translate.instant('Create directory'), }, ] // Add download folder option for directories (only in electron) if (item.isDirectory && this.hostApp.platform !== Platform.Web) { items.push({ click: () => panel.downloadFolder(item), label: this.translate.instant('Download directory'), }) } if (!item.isDirectory) { items.push({ click: () => panel.downloadItem(item), label: this.translate.instant('Download'), }) } items.push({ click: async () => { if ((await this.platform.showMessageBox({ type: 'warning', message: this.translate.instant('Delete {fullPath}?', item), defaultId: 0, cancelId: 1, buttons: [ this.translate.instant('Delete'), this.translate.instant('Cancel'), ], })).response === 0) { await this.deleteItem(item, panel.sftp) panel.navigate(panel.path) } }, label: this.translate.instant('Delete'), }) return items } async deleteItem (item: SFTPFile, session: SFTPSession): Promise { const modal = this.ngbModal.open(SFTPDeleteModalComponent) modal.componentInstance.item = item modal.componentInstance.sftp = session await modal.result.catch(() => null) } } ================================================ FILE: tabby-ssh/src/tabContextMenu.ts ================================================ import { Injectable } from '@angular/core' import { BaseTabComponent, TabContextMenuItemProvider, HostAppService, Platform, MenuItemOptions, TranslateService } from 'tabby-core' import { SSHTabComponent } from './components/sshTab.component' import { SSHService } from './services/ssh.service' /** @hidden */ @Injectable() export class SFTPContextMenu extends TabContextMenuItemProvider { weight = 10 constructor ( private hostApp: HostAppService, private ssh: SSHService, private translate: TranslateService, ) { super() } async getItems (tab: BaseTabComponent): Promise { if (!(tab instanceof SSHTabComponent)) { return [] } const items = [{ label: this.translate.instant('Open SFTP panel'), click: () => { tab.openSFTP() }, }] if (this.hostApp.platform === Platform.Windows && this.ssh.getWinSCPPath()) { items.push({ label: this.translate.instant('Launch WinSCP'), click: (): void => { this.ssh.launchWinSCP(tab.sshSession!) }, }) } return items } } ================================================ FILE: tabby-ssh/tsconfig.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "compilerOptions": { "baseUrl": "src" } } ================================================ FILE: tabby-ssh/tsconfig.typings.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "include": ["src"], "compilerOptions": { "baseUrl": "src", "emitDeclarationOnly": true, "declaration": true, "declarationDir": "./typings", "paths": { "tabby-*": ["../../tabby-*"], "*": ["../../app/node_modules/*"] }, "types": ["node"] } } ================================================ FILE: tabby-ssh/webpack.config.mjs ================================================ import * as path from 'path' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) import config from '../webpack.plugin.config.mjs' export default () => config({ name: 'ssh', dirname: __dirname, }) ================================================ FILE: tabby-telnet/package.json ================================================ { "name": "tabby-telnet", "version": "1.0.231-nightly.0", "description": "Telnet/socket connections for Tabby", "keywords": [ "tabby-builtin-plugin" ], "main": "dist/index.js", "typings": "typings/index.d.ts", "scripts": { "build": "webpack --progress --color", "watch": "webpack --progress --color --watch" }, "files": [ "dist", "typings" ], "author": "Tabby Developers", "license": "MIT", "devDependencies": { "ansi-colors": "^4.1.1", "@types/node": "14.14.31" }, "peerDependencies": { "@angular/animations": "^15", "@angular/common": "^15", "@angular/core": "^15", "@angular/forms": "^15", "@angular/platform-browser": "^15", "@ng-bootstrap/ng-bootstrap": "^14", "rxjs": "^7", "tabby-core": "*", "tabby-settings": "*", "tabby-terminal": "*" } } ================================================ FILE: tabby-telnet/src/components/telnetProfileSettings.component.pug ================================================ ul.nav-tabs(ngbNav, #nav='ngbNav') li(ngbNavItem) a(ngbNavLink, translate) General ng-template(ngbNavContent) .mb-3 label(translate) Host input.form-control( type='text', [(ngModel)]='profile.options.host', ) .mb-3 label(translate) Port input.form-control( type='number', placeholder='22', [(ngModel)]='profile.options.port', ) stream-processing-settings([options]='profile.options') li(ngbNavItem) a(ngbNavLink, translate) Login scripts ng-template(ngbNavContent) login-scripts-settings([options]='profile.options') li(ngbNavItem) a(ngbNavLink, translate) Input ng-template(ngbNavContent) input-processing-settings([options]='profile.options.input') div([ngbNavOutlet]='nav') ================================================ FILE: tabby-telnet/src/components/telnetProfileSettings.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component } from '@angular/core' import { FullyDefined, ProfileSettingsComponent } from 'tabby-core' import { TelnetProfile } from '../session' import { TelnetProfilesService } from '../profiles' /** @hidden */ @Component({ templateUrl: './telnetProfileSettings.component.pug', }) export class TelnetProfileSettingsComponent implements ProfileSettingsComponent { profile: FullyDefined } ================================================ FILE: tabby-telnet/src/components/telnetTab.component.pug ================================================ terminal-toolbar([tab]='this') i.fas.fa-xs.fa-circle.text-success.me-2(*ngIf='session && session.open') i.fas.fa-xs.fa-circle.text-danger.me-2(*ngIf='!session || !session.open') strong.me-auto {{profile.options.host}}:{{profile.options.port}} button.btn.btn-sm.btn-link.me-2((click)='reconnect()') i.fas.fa-redo span(translate) Reconnect ================================================ FILE: tabby-telnet/src/components/telnetTab.component.scss ================================================ @import '../../../tabby-ssh/src/components/sshTab.component.scss'; ================================================ FILE: tabby-telnet/src/components/telnetTab.component.ts ================================================ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import colors from 'ansi-colors' import { Component, Injector } from '@angular/core' import { Platform } from 'tabby-core' import { BaseTerminalTabComponent, ConnectableTerminalTabComponent } from 'tabby-terminal' import { TelnetProfile, TelnetSession } from '../session' /** @hidden */ @Component({ selector: 'telnet-tab', template: `${BaseTerminalTabComponent.template} ${require('./telnetTab.component.pug')}`, styleUrls: ['./telnetTab.component.scss', ...BaseTerminalTabComponent.styles], animations: BaseTerminalTabComponent.animations, }) export class TelnetTabComponent extends ConnectableTerminalTabComponent { Platform = Platform session: TelnetSession|null = null // eslint-disable-next-line @typescript-eslint/no-useless-constructor constructor ( injector: Injector, ) { super(injector) this.enableToolbar = true } ngOnInit (): void { this.subscribeUntilDestroyed(this.hotkeys.hotkey$, hotkey => { if (this.hasFocus && hotkey === 'restart-telnet-session') { this.reconnect() } }) super.ngOnInit() } protected onSessionDestroyed (): void { if (this.frontend) { // Session was closed abruptly this.write('\r\n' + colors.black.bgWhite(' TELNET ') + ` ${this.session?.profile.options.host}: session closed\r\n`) super.onSessionDestroyed() } } async initializeSession (): Promise { await super.initializeSession() const session = new TelnetSession(this.injector, this.profile) this.setSession(session) try { this.startSpinner(this.translate.instant(_('Connecting'))) this.attachSessionHandler(session.serviceMessage$, msg => { this.write(`\r${colors.black.bgWhite(' Telnet ')} ${msg}\r\n`) session.resize(this.size.columns, this.size.rows) }) try { await session.start() this.stopSpinner() } catch (e) { this.stopSpinner() this.write(colors.black.bgRed(' X ') + ' ' + colors.red(e.message) + '\r\n') return } } catch (e) { this.write(colors.black.bgRed(' X ') + ' ' + colors.red(e.message) + '\r\n') } } async canClose (): Promise { if (!this.session?.open) { return true } return (await this.platform.showMessageBox( { type: 'warning', message: this.translate.instant(_('Disconnect from {host}?'), this.profile.options), buttons: [ this.translate.instant(_('Disconnect')), this.translate.instant(_('Do not close')), ], defaultId: 0, cancelId: 1, }, )).response === 0 } protected isSessionExplicitlyTerminated (): boolean { return super.isSessionExplicitlyTerminated() || this.recentInputs.endsWith('close\r') || this.recentInputs.endsWith('quit\r') } } ================================================ FILE: tabby-telnet/src/config.ts ================================================ import { ConfigProvider } from 'tabby-core' /** @hidden */ export class TelnetConfigProvider extends ConfigProvider { defaults = { hotkeys: { 'restart-telnet-session': [], }, } platformDefaults = { } } ================================================ FILE: tabby-telnet/src/hotkeys.ts ================================================ import { Injectable } from '@angular/core' import { HotkeyDescription, HotkeyProvider, TranslateService } from 'tabby-core' /** @hidden */ @Injectable() export class TelnetHotkeyProvider extends HotkeyProvider { hotkeys: HotkeyDescription[] = [ { id: 'restart-telnet-session', name: this.translate.instant('Restart current Telnet session'), }, ] constructor (private translate: TranslateService) { super() } async provide (): Promise { return this.hotkeys } } ================================================ FILE: tabby-telnet/src/index.ts ================================================ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { FormsModule } from '@angular/forms' import { NgbModule } from '@ng-bootstrap/ng-bootstrap' import { ToastrModule } from 'ngx-toastr' import { NgxFilesizeModule } from 'ngx-filesize' import TabbyCoreModule, { ConfigProvider, TabRecoveryProvider, HotkeyProvider, ProfileProvider } from 'tabby-core' import TabbyTerminalModule from 'tabby-terminal' import { TelnetProfileSettingsComponent } from './components/telnetProfileSettings.component' import { TelnetTabComponent } from './components/telnetTab.component' import { TelnetConfigProvider } from './config' import { RecoveryProvider } from './recoveryProvider' import { TelnetHotkeyProvider } from './hotkeys' import { TelnetProfilesService } from './profiles' /** @hidden */ @NgModule({ imports: [ NgbModule, NgxFilesizeModule, CommonModule, FormsModule, ToastrModule, TabbyCoreModule, TabbyTerminalModule, ], providers: [ { provide: ConfigProvider, useClass: TelnetConfigProvider, multi: true }, { provide: TabRecoveryProvider, useClass: RecoveryProvider, multi: true }, { provide: HotkeyProvider, useClass: TelnetHotkeyProvider, multi: true }, { provide: ProfileProvider, useExisting: TelnetProfilesService, multi: true }, ], declarations: [ TelnetProfileSettingsComponent, TelnetTabComponent, ], }) // eslint-disable-next-line @typescript-eslint/no-extraneous-class export default class TelnetModule { } ================================================ FILE: tabby-telnet/src/profiles.ts ================================================ import { Injectable } from '@angular/core' import { NewTabParameters, PartialProfile, TranslateService, QuickConnectProfileProvider } from 'tabby-core' import { TelnetProfileSettingsComponent } from './components/telnetProfileSettings.component' import { TelnetTabComponent } from './components/telnetTab.component' import { TelnetProfile } from './session' @Injectable({ providedIn: 'root' }) export class TelnetProfilesService extends QuickConnectProfileProvider { id = 'telnet' name = 'Telnet' supportsQuickConnect = true settingsComponent = TelnetProfileSettingsComponent configDefaults = { options: { host: null, port: 23, inputMode: 'local-echo', outputMode: null, inputNewlines: null, outputNewlines: 'crlf', scripts: [], input: { backspace: 'backspace' }, }, clearServiceMessagesOnConnect: false, } constructor (private translate: TranslateService) { super() } async getBuiltinProfiles (): Promise[]> { return [ { id: `telnet:template`, type: 'telnet', name: this.translate.instant('Telnet session'), icon: 'fas fa-network-wired', options: { host: '', port: 23, inputMode: 'readline', outputMode: null, inputNewlines: null, outputNewlines: 'crlf', }, isBuiltin: true, isTemplate: true, }, { id: `socket:template`, type: 'telnet', name: this.translate.instant('Raw socket connection'), icon: 'fas fa-network-wired', options: { host: '', port: 1234, }, isBuiltin: true, isTemplate: true, }, ] } async getNewTabParameters (profile: TelnetProfile): Promise> { return { type: TelnetTabComponent, inputs: { profile }, } } getSuggestedName (profile: TelnetProfile): string|null { return this.getDescription(profile) || null } getDescription (profile: TelnetProfile): string { return profile.options.host ? `${profile.options.host}:${profile.options.port}` : '' } quickConnect (query: string): PartialProfile { let host = query let port = 23 if (host.includes('[')) { port = parseInt(host.split(']')[1].substring(1)) host = host.split(']')[0].substring(1) } else if (host.includes(':')) { port = parseInt(host.split(/:/g)[1]) host = host.split(':')[0] } return { name: query, type: 'telnet', options: { host, port, inputMode: 'readline', outputNewlines: 'crlf', }, } } intoQuickConnectString (profile: TelnetProfile): string | null { let s = profile.options.host if (profile.options.port !== 23) { s = `${s}:${profile.options.port}` } return s } } ================================================ FILE: tabby-telnet/src/recoveryProvider.ts ================================================ import { Injectable, Injector } from '@angular/core' import { TabRecoveryProvider, NewTabParameters, RecoveryToken, ProfilesService } from 'tabby-core' import { TelnetTabComponent } from './components/telnetTab.component' /** @hidden */ @Injectable() export class RecoveryProvider extends TabRecoveryProvider { constructor (private injector: Injector) { super() } async applicableTo (recoveryToken: RecoveryToken): Promise { return recoveryToken.type === 'app:telnet-tab' } async recover (recoveryToken: RecoveryToken): Promise> { return { type: TelnetTabComponent, inputs: { profile: this.injector.get(ProfilesService).getConfigProxyForProfile(recoveryToken.profile), savedState: recoveryToken.savedState, }, } } } ================================================ FILE: tabby-telnet/src/session.ts ================================================ /* eslint-disable @typescript-eslint/no-unsafe-enum-comparison */ import { Socket } from 'net' import colors from 'ansi-colors' import stripAnsi from 'strip-ansi' import { Injector } from '@angular/core' import { LogService } from 'tabby-core' import { BaseSession, ConnectableTerminalProfile, InputProcessingOptions, InputProcessor, LoginScriptsOptions, SessionMiddleware, StreamProcessingOptions, TerminalStreamProcessor } from 'tabby-terminal' import { Subject, Observable } from 'rxjs' export interface TelnetProfile extends ConnectableTerminalProfile { options: TelnetProfileOptions } export interface TelnetProfileOptions extends StreamProcessingOptions, LoginScriptsOptions { host: string port: number | null input: InputProcessingOptions, } enum TelnetCommands { SUBOPTION_SEND = 1, SUBOPTION_END = 240, GA = 249, SUBOPTION = 250, WILL = 251, WONT = 252, DO = 253, DONT = 254, IAC = 255, } enum TelnetOptions { ECHO = 0x1, AUTH_OPTIONS = 0x25, SUPPRESS_GO_AHEAD = 0x03, TERMINAL_TYPE = 0x18, NEGO_WINDOW_SIZE = 0x1f, NEGO_TERMINAL_SPEED = 0x20, STATUS = 0x05, REMOTE_FLOW_CONTROL = 0x21, X_DISPLAY_LOCATION = 0x23, NEW_ENVIRON = 0x27, } class UnescapeFFMiddleware extends SessionMiddleware { feedFromSession (data: Buffer): void { while (data.includes(0xff)) { const pos = data.indexOf(0xff) this.outputToTerminal.next(data.slice(0, pos)) this.outputToTerminal.next(Buffer.from([0xff, 0xff])) data = data.slice(pos + 1) } this.outputToTerminal.next(data) } } export class TelnetSession extends BaseSession { get serviceMessage$ (): Observable { return this.serviceMessage } private serviceMessage = new Subject() private socket: Socket private streamProcessor: TerminalStreamProcessor private telnetProtocol = false private lastWidth = 0 private lastHeight = 0 private requestedOptions = new Set() private telnetRemoteEcho = false constructor ( injector: Injector, public profile: TelnetProfile, ) { super(injector.get(LogService).create(`telnet-${profile.options.host}-${profile.options.port}`)) this.streamProcessor = new TerminalStreamProcessor(profile.options) this.middleware.push(this.streamProcessor) this.middleware.push(new InputProcessor(profile.options.input)) this.setLoginScriptsOptions(profile.options) } async start (): Promise { this.socket = new Socket() this.emitServiceMessage(`Connecting to ${this.profile.options.host}`) return new Promise((resolve, reject) => { this.socket.on('error', err => { this.emitServiceMessage(colors.bgRed.black(' X ') + ` Socket error: ${err as any}`) reject(err) this.destroy() }) this.socket.on('close', () => { this.emitServiceMessage('Connection closed') this.destroy() }) this.socket.on('data', data => this.onData(data)) this.socket.connect(this.profile.options.port ?? 23, this.profile.options.host, () => { this.emitServiceMessage('Connected') this.open = true setTimeout(() => this.streamProcessor.start()) this.loginScriptProcessor?.executeUnconditionalScripts() resolve() }) }) } requestOption (cmd: TelnetCommands, option: TelnetOptions): void { this.requestedOptions.add(option) this.emitTelnet(cmd, option) } emitServiceMessage (msg: string): void { this.serviceMessage.next(msg) this.logger.info(stripAnsi(msg)) } onData (data: Buffer): void { if (!this.telnetProtocol && data[0] === TelnetCommands.IAC) { this.telnetProtocol = true this.middleware.push(new UnescapeFFMiddleware()) this.requestOption(TelnetCommands.DO, TelnetOptions.SUPPRESS_GO_AHEAD) this.emitTelnet(TelnetCommands.WILL, TelnetOptions.TERMINAL_TYPE) this.emitTelnet(TelnetCommands.WILL, TelnetOptions.NEGO_WINDOW_SIZE) } if (this.telnetProtocol) { data = this.processTelnetProtocol(data) } this.emitOutput(data) } emitTelnet (command: TelnetCommands, option: TelnetOptions): void { this.logger.debug('>', TelnetCommands[command], TelnetOptions[option] || option) this.socket.write(Buffer.from([TelnetCommands.IAC, command, option])) } emitTelnetSuboption (option: TelnetOptions, value: Buffer): void { this.logger.debug('>', 'SUBOPTION', TelnetOptions[option], value) this.socket.write(Buffer.from([ TelnetCommands.IAC, TelnetCommands.SUBOPTION, option, ...value, TelnetCommands.IAC, TelnetCommands.SUBOPTION_END, ])) } processTelnetProtocol (data: Buffer): Buffer { while (data.length) { if (data[0] === TelnetCommands.IAC) { const command = data[1] const commandName = TelnetCommands[command] const option = data[2] const optionName = TelnetOptions[option] if (command === TelnetCommands.IAC) { data = data.slice(1) break } data = data.slice(3) this.logger.debug('<', commandName || command, optionName || option) if (command === TelnetCommands.WILL || command === TelnetCommands.WONT || command === TelnetCommands.DONT) { if (this.requestedOptions.has(option)) { this.requestedOptions.delete(option) continue } } if (command === TelnetCommands.WILL) { if ([ TelnetOptions.SUPPRESS_GO_AHEAD, TelnetOptions.ECHO, ].includes(option)) { this.emitTelnet(TelnetCommands.DO, option) if (option === TelnetOptions.ECHO && this.streamProcessor.forceEcho) { this.telnetRemoteEcho = true this.streamProcessor.forceEcho = false this.requestOption(TelnetCommands.WONT, option) } } else { this.logger.debug('(!) Unhandled option') this.emitTelnet(TelnetCommands.DONT, option) } } if (command === TelnetCommands.DO) { if (option === TelnetOptions.NEGO_WINDOW_SIZE) { this.emitTelnet(TelnetCommands.WILL, option) this.emitSize() } else if (option === TelnetOptions.ECHO) { if (this.telnetRemoteEcho) { this.streamProcessor.forceEcho = false this.emitTelnet(TelnetCommands.WONT, option) } else { this.streamProcessor.forceEcho = true this.emitTelnet(TelnetCommands.WILL, option) } } else if (option === TelnetOptions.TERMINAL_TYPE) { this.emitTelnet(TelnetCommands.WILL, option) } else { this.logger.debug('(!) Unhandled option') this.emitTelnet(TelnetCommands.WONT, option) } } if (command === TelnetCommands.DONT) { if (option === TelnetOptions.ECHO) { this.streamProcessor.forceEcho = false this.emitTelnet(TelnetCommands.WONT, option) } else { this.logger.debug('(!) Unhandled option') this.emitTelnet(TelnetCommands.WONT, option) } } if (command === TelnetCommands.WONT) { if (option === TelnetOptions.ECHO) { this.telnetRemoteEcho = false this.emitTelnet(TelnetCommands.DONT, option) } else { this.logger.debug('(!) Unhandled option') this.emitTelnet(TelnetCommands.DONT, option) } } if (command === TelnetCommands.SUBOPTION) { const endIndex = data.indexOf(TelnetCommands.IAC) const optionValue = data.slice(0, endIndex) this.logger.debug('<', commandName || command, optionName || option, optionValue) if (option === TelnetOptions.TERMINAL_TYPE && optionValue[0] === TelnetCommands.SUBOPTION_SEND) { this.emitTelnetSuboption(option, Buffer.from([0, ...Buffer.from('XTERM-256COLOR')])) } data = data.slice(endIndex + 2) } } else { return data } } return data } // eslint-disable-next-line @typescript-eslint/no-empty-function resize (w: number, h: number): void { if (w && h) { this.lastWidth = w this.lastHeight = h } if (this.lastWidth && this.lastHeight && this.telnetProtocol) { this.emitSize() } } private emitSize () { if (this.lastWidth && this.lastHeight) { this.emitTelnetSuboption(TelnetOptions.NEGO_WINDOW_SIZE, Buffer.from([ this.lastWidth >> 8, this.lastWidth & 0xff, this.lastHeight >> 8, this.lastHeight & 0xff, ])) } else { this.emitTelnet(TelnetCommands.WONT, TelnetOptions.NEGO_WINDOW_SIZE) } } write (data: Buffer): void { this.socket.write(data) } kill (_signal?: string): void { this.socket.destroy() } async destroy (): Promise { this.streamProcessor.close() this.serviceMessage.complete() this.kill() await super.destroy() } async getChildProcesses (): Promise { return [] } async gracefullyKillProcess (): Promise { this.kill() } supportsWorkingDirectory (): boolean { return false } async getWorkingDirectory (): Promise { return null } } ================================================ FILE: tabby-telnet/tsconfig.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "compilerOptions": { "baseUrl": "src" } } ================================================ FILE: tabby-telnet/tsconfig.typings.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "include": ["src"], "compilerOptions": { "baseUrl": "src", "emitDeclarationOnly": true, "declaration": true, "declarationDir": "./typings", "paths": { "tabby-*": ["../../tabby-*"], "*": ["../../app/node_modules/*"] } } } ================================================ FILE: tabby-telnet/webpack.config.mjs ================================================ import * as path from 'path' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) import config from '../webpack.plugin.config.mjs' export default () => config({ name: 'telnet', dirname: __dirname, }) ================================================ FILE: tabby-terminal/README.md ================================================ # Tabby Terminal Plugin * terminal tabs * terminal frontends * session management ================================================ FILE: tabby-terminal/package.json ================================================ { "name": "tabby-terminal", "version": "1.0.231-nightly.0", "description": "Tabby's terminal emulation core", "keywords": [ "tabby-builtin-plugin" ], "main": "dist/index.js", "typings": "typings/index.d.ts", "scripts": { "build": "webpack --progress --color --display-modules", "watch": "webpack --progress --color --watch", "prepare": "patch-package" }, "files": [ "dist", "typings" ], "author": "Tabby Developers", "license": "MIT", "devDependencies": { "@xterm/addon-canvas": "^0.7.0", "@xterm/addon-clipboard": "^0.2.0", "@xterm/addon-fit": "^0.11.0", "@xterm/addon-image": "^0.9.0", "@xterm/addon-ligatures": "^0.10.0", "@xterm/addon-search": "^0.16.0", "@xterm/addon-serialize": "^0.14.0", "@xterm/addon-unicode11": "^0.9.0", "@xterm/addon-webgl": "^0.19.0", "@xterm/xterm": "^6.0.0", "ansi-colors": "^4.1.1", "binstring": "^0.2.1", "buffer-replace": "^1.0.0", "cli-spinner": "^0.2.10", "dataurl": "0.1.0", "hexer": "^1.5.0", "ngx-colors": "^3.4.0", "patch-package": "^6.5.0", "runes": "^0.4.2", "zmodem.js": "^0.1.9" }, "peerDependencies": { "@angular/animations": "^15", "@angular/common": "^15", "@angular/core": "^15", "@angular/forms": "^15", "@angular/platform-browser": "^15", "@ng-bootstrap/ng-bootstrap": "^14", "rxjs": "^7", "tabby-core": "*", "tabby-settings": "*" } } ================================================ FILE: tabby-terminal/patches/ansi-color+0.2.1.patch ================================================ diff --git a/node_modules/ansi-color/lib/ansi-color.js b/node_modules/ansi-color/lib/ansi-color.js index 1062c87..4fc2847 100644 --- a/node_modules/ansi-color/lib/ansi-color.js +++ b/node_modules/ansi-color/lib/ansi-color.js @@ -32,8 +32,8 @@ exports.set = function(str, color) { var color_attrs = color.split("+"); var ansi_str = ""; for(var i=0, attr; attr = color_attrs[i]; i++) { - ansi_str += "\033[" + ANSI_CODES[attr] + "m"; + ansi_str += "\x1b[" + ANSI_CODES[attr] + "m"; } - ansi_str += str + "\033[" + ANSI_CODES["off"] + "m"; + ansi_str += str + "\x1b[" + ANSI_CODES["off"] + "m"; return ansi_str; }; ================================================ FILE: tabby-terminal/src/api/baseTerminalTab.component.ts ================================================ import { Observable, Subject, first, auditTime, debounce, interval } from 'rxjs' import { Spinner } from 'cli-spinner' import colors from 'ansi-colors' import { NgZone, OnInit, OnDestroy, Injector, ViewChild, HostBinding, Input, ElementRef, InjectFlags, Component } from '@angular/core' import { trigger, transition, style, animate, AnimationTriggerMetadata } from '@angular/animations' import { AppService, ConfigService, BaseTabComponent, HostAppService, HotkeysService, NotificationsService, Platform, LogService, Logger, TabContextMenuItemProvider, SplitTabComponent, SubscriptionContainer, MenuItemOptions, PlatformService, HostWindowService, ResettableTimeout, TranslateService, ThemesService, FullyDefined } from 'tabby-core' import { BaseSession } from '../session' import { Frontend } from '../frontends/frontend' import { XTermFrontend, XTermWebGLFrontend } from '../frontends/xtermFrontend' import { ResizeEvent, BaseTerminalProfile } from './interfaces' import { TerminalDecorator } from './decorator' import { SearchPanelComponent } from '../components/searchPanel.component' import { MultifocusService } from '../services/multifocus.service' import { getTerminalBackgroundColor } from '../helpers' const INACTIVE_TAB_UNLOAD_DELAY = 1000 * 30 const OSC_FOCUS_IN = Buffer.from('\x1b[I') const OSC_FOCUS_OUT = Buffer.from('\x1b[O') /** * A class to base your custom terminal tabs on */ @Component({ template: '' }) export class BaseTerminalTabComponent

extends BaseTabComponent implements OnInit, OnDestroy { static template: string = require('../components/baseTerminalTab.component.pug') static styles: string[] = [require('../components/baseTerminalTab.component.scss')] static animations: AnimationTriggerMetadata[] = [ trigger('toolbarSlide', [ transition(':enter', [ style({ transform: 'translateY(-25%)', opacity: '0', }), animate('100ms ease-out', style({ transform: 'translateY(0%)', opacity: '1', })), ]), transition(':leave', [ animate('100ms ease-out', style({ transform: 'translateY(-25%)', opacity: '0', })), ]), ]), trigger('panelSlide', [ transition(':enter', [ style({ transform: 'translateY(25%)', opacity: '0', }), animate('100ms ease-out', style({ transform: 'translateY(0%)', opacity: '1', })), ]), transition(':leave', [ animate('100ms ease-out', style({ transform: 'translateY(25%)', opacity: '0', })), ]), ]), ] session: BaseSession|null = null savedState?: any savedStateIsLive = false @Input() zoom = 0 @Input() showSearchPanel = false /** @hidden */ @ViewChild('content') content /** @hidden */ @HostBinding('style.background-color') backgroundColor: string|null = null /** @hidden */ @HostBinding('class.toolbar-enabled') enableToolbar = false /** @hidden */ @HostBinding('class.toolbar-pinned') pinToolbar = false /** @hidden */ @HostBinding('class.toolbar-revealed') revealToolbar = false frontend?: Frontend /** @hidden */ frontendIsReady = false frontendReady = new Subject() size: ResizeEvent profile: FullyDefined

/** * Enables normal passthrough from session output to terminal input */ enablePassthrough = true /** * Disables display of dynamic window/tab title provided by the shell */ disableDynamicTitle = false alternateScreenActive = false @ViewChild(SearchPanelComponent, { 'static': false }) searchPanel?: SearchPanelComponent // Deps start config: ConfigService element: ElementRef protected zone: NgZone protected app: AppService protected hostApp: HostAppService protected hotkeys: HotkeysService protected platform: PlatformService protected notifications: NotificationsService protected log: LogService protected decorators: TerminalDecorator[] = [] protected contextMenuProviders: TabContextMenuItemProvider[] protected hostWindow: HostWindowService protected translate: TranslateService protected multifocus: MultifocusService protected themes: ThemesService // Deps end protected logger: Logger protected output = new Subject() protected binaryOutput = new Subject() protected sessionChanged = new Subject() protected recentInputs = '' private bellPlayer: HTMLAudioElement private termContainerSubscriptions = new SubscriptionContainer() private sessionHandlers = new SubscriptionContainer() private spinner = new Spinner({ stream: { write: x => { try { if (!this.frontend) { return } this.writeRaw(x) } catch { this.spinner.stop() } }, }, }) private spinnerActive = false private spinnerPaused = false private toolbarRevealTimeout = new ResettableTimeout(() => { this.revealToolbar = false }, 1000) private frontendWriteLock = Promise.resolve() get input$ (): Observable { if (!this.frontend) { throw new Error('Frontend not ready') } return this.frontend.input$ } get output$ (): Observable { return this.output } get binaryOutput$ (): Observable { return this.binaryOutput } get resize$ (): Observable { if (!this.frontend) { throw new Error('Frontend not ready') } return this.frontend.resize$ } get alternateScreenActive$ (): Observable { if (!this.frontend) { throw new Error('Frontend not ready') } return this.frontend.alternateScreenActive$ } get frontendReady$ (): Observable { return this.frontendReady } get sessionChanged$ (): Observable { return this.sessionChanged } constructor (protected injector: Injector) { super(injector) this.config = injector.get(ConfigService) this.element = injector.get(ElementRef) this.zone = injector.get(NgZone) this.app = injector.get(AppService) this.hostApp = injector.get(HostAppService) this.hotkeys = injector.get(HotkeysService) this.platform = injector.get(PlatformService) this.notifications = injector.get(NotificationsService) this.log = injector.get(LogService) this.decorators = injector.get(TerminalDecorator, null, InjectFlags.Optional) as TerminalDecorator[] this.contextMenuProviders = injector.get(TabContextMenuItemProvider, null, InjectFlags.Optional) as TabContextMenuItemProvider[] this.hostWindow = injector.get(HostWindowService) this.translate = injector.get(TranslateService) this.multifocus = injector.get(MultifocusService) this.themes = injector.get(ThemesService) this.logger = this.log.create('baseTerminalTab') this.setTitle(this.translate.instant('Terminal')) this.subscribeUntilDestroyed(this.hotkeys.unfilteredHotkey$, async hotkey => { if (!this.hasFocus) { return } if (hotkey === 'search') { this.showSearchPanel = true setImmediate(() => { const input = this.element.nativeElement.querySelector('.search-input') const selectedText = (this.frontend?.getSelection() ?? '').trim() if (input && selectedText.length) { input.value = selectedText } input?.focus() input?.select() }) } }) this.subscribeUntilDestroyed(this.hotkeys.hotkey$, async hotkey => { if (!this.hasFocus) { return } switch (hotkey) { case 'ctrl-c': if (this.frontend?.getSelection()) { this.frontend.copySelection() this.frontend.clearSelection() this.notifications.notice(this.translate.instant('Copied')) } else { this.forEachFocusedTerminalPane(tab => tab.sendInput('\x03')) } break case 'copy': this.frontend?.copySelection() this.frontend?.clearSelection() this.notifications.notice(this.translate.instant('Copied')) break case 'paste': this.forEachFocusedTerminalPane(tab => tab.paste()) break case 'select-all': this.frontend?.selectAll() break case 'clear': this.forEachFocusedTerminalPane(tab => tab.frontend?.clear()) break case 'zoom-in': this.forEachFocusedTerminalPane(tab => tab.zoomIn()) break case 'zoom-out': this.forEachFocusedTerminalPane(tab => tab.zoomOut()) break case 'reset-zoom': this.forEachFocusedTerminalPane(tab => tab.resetZoom()) break case 'previous-word': this.forEachFocusedTerminalPane(tab => { tab.sendInput({ [Platform.Windows]: '\x1b[1;5D', [Platform.macOS]: '\x1bb', [Platform.Linux]: '\x1bb', }[this.hostApp.platform]) }) break case 'next-word': this.forEachFocusedTerminalPane(tab => { tab.sendInput({ [Platform.Windows]: '\x1b[1;5C', [Platform.macOS]: '\x1bf', [Platform.Linux]: '\x1bf', }[this.hostApp.platform]) }) break case 'delete-line': this.forEachFocusedTerminalPane(tab => { tab.sendInput('\x1bw') }) break case 'delete-previous-word': this.forEachFocusedTerminalPane(tab => { tab.sendInput('\u0017') }) break case 'delete-next-word': this.forEachFocusedTerminalPane(tab => { tab.sendInput({ [Platform.Windows]: '\x1bd\x1b[3;5~', [Platform.macOS]: '\x1bd', [Platform.Linux]: '\x1bd', }[this.hostApp.platform]) }) break case 'copy-current-path': this.copyCurrentPath() break case 'scroll-to-top': this.frontend?.scrollToTop() break case 'scroll-page-up': this.frontend?.scrollPages(-1) break case 'scroll-up': this.frontend?.scrollLines(-1) break case 'scroll-down': this.frontend?.scrollLines(1) break case 'scroll-page-down': this.frontend?.scrollPages(1) break case 'scroll-to-bottom': this.frontend?.scrollToBottom() break } }) this.bellPlayer = document.createElement('audio') this.bellPlayer.src = require('../bell.ogg') this.bellPlayer.load() this.contextMenuProviders.sort((a, b) => a.weight - b.weight) } /** @hidden */ ngOnInit (): void { this.pinToolbar = this.enableToolbar && (window.localStorage.pinTerminalToolbar ?? 'true') === 'true' this.focused$.subscribe(() => { this.configure() this.frontend?.focus() }) this.subscribeUntilDestroyed(this.platform.themeChanged$, () => { this.configure() }) // Check if the the WebGL renderer is compatible with xterm.js: // - https://github.com/Eugeny/tabby/issues/8884 // - https://github.com/microsoft/vscode/issues/190195 // - https://github.com/xtermjs/xterm.js/issues/4665 // - https://bugs.chromium.org/p/chromium/issues/detail?id=1476475 // // Inspired by https://github.com/microsoft/vscode/pull/191795 let enable8884Workarround = false const checkCanvas = document.createElement('canvas') const checkGl = checkCanvas.getContext('webgl2') const debugInfo = checkGl?.getExtension('WEBGL_debug_renderer_info') if (checkGl && debugInfo) { const renderer = checkGl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) if (renderer.startsWith('ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero)')) { enable8884Workarround = true } } const cls: new (..._) => Frontend = enable8884Workarround ? XTermFrontend : { xterm: XTermFrontend, 'xterm-webgl': XTermWebGLFrontend, }[this.config.store.terminal.frontend] ?? XTermFrontend this.frontend = new cls(this.injector) this.frontendReady$.pipe(first()).subscribe(() => { this.onFrontendReady() }) this.frontend.resize$.pipe(first()).subscribe(async ({ columns, rows }) => { this.size = { columns, rows } this.frontendReady.next() this.frontendReady.complete() this.config.enabledServices(this.decorators).forEach(decorator => { try { decorator.attach(this) } catch (e) { this.logger.warn('Decorator attach() throws', e) } }) setTimeout(() => { this.session?.resize(columns, rows) }, 1000) this.session?.releaseInitialDataBuffer() this.sessionChanged$.subscribe(() => { this.session?.releaseInitialDataBuffer() }) }) this.alternateScreenActive$.subscribe(x => { this.alternateScreenActive = x }) setImmediate(async () => { if (this.hasFocus) { await this.frontend?.attach(this.content.nativeElement, this.profile) this.frontend?.configure(this.profile) } else { this.focused$.pipe(first()).subscribe(async () => { await this.frontend?.attach(this.content.nativeElement, this.profile) this.frontend?.configure(this.profile) }) } }) this.attachTermContainerHandlers() this.configure() setTimeout(() => { this.binaryOutput$.subscribe(() => { this.displayActivity() }) }, 1000) this.frontend.bell$.subscribe(() => { if (this.config.store.terminal.bell === 'visual') { this.frontend?.visualBell() } if (this.config.store.terminal.bell === 'audible') { this.bellPlayer.play() } }) this.frontend.focus() this.blurred$.subscribe(() => { this.multifocus.cancel() }) this.visibility$ .pipe(debounce(visibility => interval(visibility ? 0 : INACTIVE_TAB_UNLOAD_DELAY))) .subscribe(visibility => { if (this.frontend instanceof XTermFrontend) { if (visibility) { this.frontend.xterm.refresh(0, this.frontend.xterm.rows - 1) } else { this.frontend.xterm.element?.querySelectorAll('canvas').forEach(c => { c.height = c.width = 0 c.style.height = c.style.width = '0px' }) } } }) } protected onFrontendReady (): void { this.frontendIsReady = true if (this.savedState) { this.frontend!.restoreState(this.savedState) if (!this.savedStateIsLive) { this.frontend!.write('\r\n\r\n') this.frontend!.write(colors.bgWhite.black(' * ') + colors.bgBlackBright.white(' History restored ')) this.frontend!.write('\r\n\r\n') } } this.input$.subscribe(data => { this.recentInputs += data this.recentInputs = this.recentInputs.substring(this.recentInputs.length - 32) }) } async buildContextMenu (): Promise { let items: MenuItemOptions[] = [] for (const section of await Promise.all(this.contextMenuProviders.map(x => x.getItems(this)))) { items = items.concat(section) items.push({ type: 'separator' }) } items.splice(items.length - 1, 1) return items } /** * Feeds input into the active session */ sendInput (data: string|Buffer): void { if (!(data instanceof Buffer)) { data = Buffer.from(data, 'utf-8') } this.session?.feedFromTerminal(data) if (this.config.store.terminal.scrollOnInput && !data.equals(OSC_FOCUS_IN) && !data.equals(OSC_FOCUS_OUT)) { this.frontend?.scrollToBottom() } } /** * Feeds input into the terminal frontend */ async write (data: string): Promise { this.frontendWriteLock = this.frontendWriteLock.then(() => this.withSpinnerPaused(() => this.writeRaw(data))) await this.frontendWriteLock } protected async writeRaw (data: string): Promise { if (!this.frontend) { throw new Error('Frontend not ready') } if (this.config.store.terminal.detectProgress) { const percentageMatch = /(^|[^\d])(\d+(\.\d+)?)%([^\d]|$)/.exec(data) if (!this.alternateScreenActive && percentageMatch) { const percentage = percentageMatch[3] ? parseFloat(percentageMatch[2]) : parseInt(percentageMatch[2]) if (percentage > 0 && percentage <= 100) { this.setProgress(percentage) } } else { this.setProgress(null) } } await this.frontend.write(data) } async paste (): Promise { let data = this.platform.readClipboard() if (this.hostApp.platform === Platform.Windows) { data = data.replaceAll('\r\n', '\r') } else { data = data.replaceAll('\n', '\r') } if (this.config.store.terminal.trimWhitespaceOnPaste && data.indexOf('\n') === data.length - 1) { // Ends with a newline and has no other line breaks data = data.substring(0, data.length - 1) } if (!this.alternateScreenActive) { if ((data.includes('\r') || data.includes('\n')) && this.config.store.terminal.warnOnMultilinePaste) { const buttons = [ this.translate.instant('Paste'), this.translate.instant('Cancel'), ] const result = (await this.platform.showMessageBox( { type: 'warning', detail: data.slice(0, 1000), message: this.translate.instant('Paste multiple lines?'), buttons, defaultId: 0, cancelId: 1, }, )).response if (result === 1) { return } } else { if (this.config.store.terminal.trimWhitespaceOnPaste) { data = data.trimEnd() if (!data.includes('\r')) { data = data.trimStart() } } } } if (this.config.store.terminal.bracketedPaste && this.frontend?.supportsBracketedPaste()) { data = `\x1b[200~${data}\x1b[201~` } this.sendInput(data) } /** * Applies the user settings to the terminal */ configure (): void { this.frontend?.configure(this.profile) this.backgroundColor = getTerminalBackgroundColor(this.config, this.themes, this.profile.terminalColorScheme) } zoomIn (): void { this.zoom++ this.frontend?.setZoom(this.zoom) } zoomOut (): void { this.zoom-- this.frontend?.setZoom(this.zoom) } resetZoom (): void { this.zoom = 0 this.frontend?.setZoom(this.zoom) } async copyCurrentPath (): Promise { let cwd: string|null = null if (this.session?.supportsWorkingDirectory()) { cwd = await this.session.getWorkingDirectory() } if (cwd) { this.platform.setClipboard({ text: cwd }) this.notifications.notice(this.translate.instant('Copied')) } else { this.notifications.error(this.translate.instant('Shell does not support current path detection')) } } /** @hidden */ ngOnDestroy (): void { super.ngOnDestroy() this.stopSpinner() } async destroy (): Promise { this.frontend?.detach(this.content.nativeElement) this.frontend?.destroy() this.frontend = undefined this.content.nativeElement.remove() this.detachTermContainerHandlers() this.config.enabledServices(this.decorators).forEach(decorator => { try { decorator.detach(this) } catch (e) { this.logger.warn('Decorator attach() throws', e) } }) this.output.complete() this.binaryOutput.complete() this.frontendReady.complete() super.destroy() if (this.session?.open) { await this.session.destroy() } } protected detachTermContainerHandlers (): void { this.termContainerSubscriptions.cancelAll() } private rightMouseDownTime = 0 protected async handleRightMouseDown (event: MouseEvent): Promise { event.preventDefault() event.stopPropagation() this.rightMouseDownTime = Date.now() if (this.config.store.terminal.rightClick === 'menu') { this.platform.popupContextMenu(await this.buildContextMenu(), event) } } protected async handleRightMouseUp (event: MouseEvent): Promise { event.preventDefault() event.stopPropagation() if (this.config.store.terminal.rightClick === 'paste' || this.config.store.terminal.rightClick === 'clipboard') { const duration = Date.now() - this.rightMouseDownTime if (duration < 250) { if (this.config.store.terminal.rightClick === 'paste') { this.paste() } else if (this.config.store.terminal.rightClick === 'clipboard') { if (this.frontend?.getSelection()) { this.frontend.copySelection() this.frontend.clearSelection() } else { this.paste() } } } else { this.platform.popupContextMenu(await this.buildContextMenu(), event) } } } protected attachTermContainerHandlers (): void { this.detachTermContainerHandlers() if (!this.frontend) { throw new Error('Frontend not ready') } const maybeConfigure = () => { if (this.hasFocus) { setTimeout(() => this.configure(), 250) } } this.termContainerSubscriptions.subscribe(this.frontend.title$, title => this.zone.run(() => { if (!this.disableDynamicTitle) { this.setTitle(title) } })) this.termContainerSubscriptions.subscribe(this.focused$, () => this.frontend && (this.frontend.enableResizing = true)) this.termContainerSubscriptions.subscribe(this.blurred$, () => this.frontend && (this.frontend.enableResizing = false)) this.termContainerSubscriptions.subscribe(this.frontend.mouseEvent$, event => { if (event.type === 'mousedown') { if (event.which === 1) { this.multifocus.cancel() } if (event.which === 2) { if (this.config.store.terminal.pasteOnMiddleClick) { this.paste() } event.preventDefault() event.stopPropagation() return } if (event.which === 3 || event.which === 1 && event.ctrlKey) { this.handleRightMouseDown(event) return } } if (event.type === 'mouseup') { if (event.which === 3 || event.which === 1 && event.ctrlKey) { this.handleRightMouseUp(event) return } } if (event.type === 'mousewheel') { let wheelDeltaY = 0 if ('wheelDeltaY' in event) { wheelDeltaY = (event as unknown as WheelEvent)['wheelDeltaY'] } else { wheelDeltaY = (event as unknown as WheelEvent).deltaY } if (event.altKey) { event.preventDefault() const delta = Math.round(wheelDeltaY / 50) this.sendInput((delta > 0 ? '\u001bOA' : '\u001bOB').repeat(Math.abs(delta))) } } }) this.termContainerSubscriptions.subscribe(this.frontend.input$, data => { this.sendInput(data) }) this.termContainerSubscriptions.subscribe(this.frontend.resize$.pipe(auditTime(100)), ({ columns, rows }) => { this.logger.debug(`Resizing to ${columns}x${rows}`) this.size = { columns, rows } this.zone.run(() => { if (this.session?.open) { this.session.resize(columns, rows) } }) }) this.termContainerSubscriptions.subscribe(this.platform.displayMetricsChanged$, maybeConfigure) this.termContainerSubscriptions.subscribe(this.hostWindow.windowMoved$, maybeConfigure) } setSession (session: BaseSession|null, destroyOnSessionClose = false): void { if (session) { if (this.session) { this.setSession(null) } this.detachSessionHandlers() this.session = session this.attachSessionHandlers(destroyOnSessionClose) } else { this.detachSessionHandlers() this.session = null } this.sessionChanged.next(session) } showToolbar (): void { this.revealToolbar = true this.toolbarRevealTimeout.clear() } hideToolbar (): void { this.toolbarRevealTimeout.set() } togglePinToolbar (): void { this.pinToolbar = !this.pinToolbar window.localStorage.pinTerminalToolbar = this.pinToolbar } @HostBinding('class.with-title-inset') get hasTitleInset (): boolean { return this.hostApp.platform === Platform.macOS && this.config.store.appearance.tabsLocation !== 'top' && this.config.store.appearance.frame === 'thin' } protected attachSessionHandler (observable: Observable, handler: (v: T) => void): void { this.sessionHandlers.subscribe(observable, handler) } protected attachSessionHandlers (destroyOnSessionClose = false): void { if (!this.session) { throw new Error('Session not set') } // this.session.output$.bufferTime(10).subscribe((datas) => { this.attachSessionHandler(this.session.output$, data => { if (this.enablePassthrough) { this.output.next(data) this.write(data) } }) this.attachSessionHandler(this.session.binaryOutput$, data => { if (this.enablePassthrough) { this.binaryOutput.next(data) } }) this.attachSessionHandler(this.session.closed$, () => { this.onSessionClosed(destroyOnSessionClose) }) this.attachSessionHandler(this.session.destroyed$, () => { this.onSessionDestroyed() }) } /** * Method called when session is closed. */ protected onSessionClosed (destroyOnSessionClose = false): void { if (destroyOnSessionClose || this.shouldTabBeDestroyedOnSessionClose()) { this.destroy() } } /** * Return true if tab should be destroyed on session closed. */ protected shouldTabBeDestroyedOnSessionClose (): boolean { const behavior = this.profile.behaviorOnSessionEnd return behavior === 'close' || behavior === 'auto' && this.isSessionExplicitlyTerminated() } /** * Method called when session is destroyed. Set the session to null */ protected onSessionDestroyed (): void { this.setSession(null) } protected detachSessionHandlers (): void { this.sessionHandlers.cancelAll() } protected startSpinner (text?: string): void { if (this.spinnerActive || this.spinnerPaused) { return } if (text) { this.spinner.text = text } this.spinner.setSpinnerString(6) this.spinnerActive = true this.zone.runOutsideAngular(() => { this.spinner.start() }) } protected stopSpinner (): void { if (!this.spinnerActive) { return } this.spinner.stop(true) this.spinnerActive = false } protected async withSpinnerPaused (work: () => any): Promise { this.spinnerPaused = true if (this.spinnerActive) { this.spinner.stop(true) } try { await work() } finally { this.spinnerPaused = false if (this.spinnerActive) { this.zone.runOutsideAngular(() => { this.spinner.start() }) } } } protected forEachFocusedTerminalPane (cb: (tab: BaseTerminalTabComponent) => void): void { if (this.parent && this.parent instanceof SplitTabComponent && this.parent._allFocusMode) { for (const tab of this.parent.getAllTabs()) { if (tab instanceof BaseTerminalTabComponent) { cb(tab) } } } else { cb(this) } } /** * Return true if the user explicitly exit the session */ protected isSessionExplicitlyTerminated (): boolean { return false } } ================================================ FILE: tabby-terminal/src/api/colorSchemeProvider.ts ================================================ import { TerminalColorScheme } from './interfaces' /** * Extend to add more terminal color schemes */ export abstract class TerminalColorSchemeProvider { abstract getSchemes (): Promise } ================================================ FILE: tabby-terminal/src/api/connectableTerminalTab.component.ts ================================================ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import { Injector, Component } from '@angular/core' import { first } from 'rxjs' import { ConnectableTerminalProfile } from './interfaces' import { BaseTerminalTabComponent } from './baseTerminalTab.component' import { GetRecoveryTokenOptions, RecoveryToken } from 'tabby-core' /** * A class to base your custom connectable terminal tabs on */ @Component({ template: '' }) export abstract class ConnectableTerminalTabComponent

extends BaseTerminalTabComponent

{ protected reconnectOffered = false protected isDisconnectedByHand = false constructor (protected injector: Injector) { super(injector) this.subscribeUntilDestroyed(this.hotkeys.hotkey$, hotkey => { if (!this.hasFocus) { return } switch (hotkey) { case 'reconnect-tab': this.reconnect() this.notifications.notice(this.translate.instant('Reconnect')) break case 'disconnect-tab': this.disconnect() this.notifications.notice(this.translate.instant('Disconnect')) break } }) } ngOnInit (): void { this.logger = this.log.create(`${this.profile.type}Tab`) super.ngOnInit() } protected onFrontendReady (): void { this.initializeSession().then(() => { this.clearServiceMessagesOnConnect() }) super.onFrontendReady() } /** * Initialize Connectable Session. * Set reconnectOffered to false */ async initializeSession (): Promise { this.reconnectOffered = false this.isDisconnectedByHand = false } /** * Method called when session is destroyed. Handle the tab behavior on session end for connectable tab */ protected onSessionDestroyed (): void { super.onSessionDestroyed() if (this.frontend) { if (this.profile.behaviorOnSessionEnd === 'reconnect' && !this.isDisconnectedByHand) { this.reconnect() } else if (this.profile.behaviorOnSessionEnd === 'keep' || !this.shouldTabBeDestroyedOnSessionClose()) { this.offerReconnection() } } } /** * Offering reconnection to the user if it hasn't been done yet. * Set reconnectOffered to true */ offerReconnection (): void { if (!this.reconnectOffered) { this.reconnectOffered = true this.write(this.translate.instant(_('Press any key to reconnect')) + '\r\n') this.input$.pipe(first()).subscribe(() => { if (!this.session?.open && this.reconnectOffered) { this.reconnect() } }) } } /** * Return true if tab should be destroyed on session closed. */ protected shouldTabBeDestroyedOnSessionClose (): boolean { if (this.isDisconnectedByHand) { return false } return super.shouldTabBeDestroyedOnSessionClose() } async getRecoveryToken (options?: GetRecoveryTokenOptions): Promise { return { type: `app:${this.profile.type}-tab`, profile: this.profile, savedState: options?.includeState && this.frontend?.saveState(), } } async disconnect (): Promise { this.isDisconnectedByHand = true await this.session?.destroy() } async reconnect (): Promise { this.session?.destroy() await this.initializeSession() this.clearServiceMessagesOnConnect() this.session?.releaseInitialDataBuffer() } private clearServiceMessagesOnConnect (): void { if (this.profile.clearServiceMessagesOnConnect && this.session?.open) { this.frontend?.clear() } } } ================================================ FILE: tabby-terminal/src/api/contextMenuProvider.ts ================================================ import type { MenuItemOptions } from 'tabby-core' import { BaseTerminalTabComponent } from './baseTerminalTab.component' /** * Extend to add more terminal context menu items * @deprecated */ export abstract class TerminalContextMenuItemProvider { weight: number abstract getItems (tab: BaseTerminalTabComponent): Promise } ================================================ FILE: tabby-terminal/src/api/decorator.ts ================================================ import { Subscription } from 'rxjs' import { BaseTerminalTabComponent } from './baseTerminalTab.component' /** * Extend to automatically run actions on new terminals */ export abstract class TerminalDecorator { private smartSubscriptions = new Map, Subscription[]>() /** * Called when a new terminal tab starts */ attach (terminal: BaseTerminalTabComponent): void { } // eslint-disable-line /** * Called before a terminal tab is destroyed. * Make sure to call super() */ detach (terminal: BaseTerminalTabComponent): void { for (const s of this.smartSubscriptions.get(terminal) ?? []) { s.unsubscribe() } this.smartSubscriptions.delete(terminal) } /** * Automatically cancel @subscription once detached from @terminal */ protected subscribeUntilDetached (terminal: BaseTerminalTabComponent, subscription?: Subscription): void { if (!subscription) { return } if (!this.smartSubscriptions.has(terminal)) { this.smartSubscriptions.set(terminal, []) } this.smartSubscriptions.get(terminal)?.push(subscription) } } ================================================ FILE: tabby-terminal/src/api/interfaces.ts ================================================ import { ConnectableProfile, Profile } from 'tabby-core' export interface ResizeEvent { columns: number rows: number } export interface TerminalColorScheme { name: string foreground: string background: string cursor: string colors: string[] selection?: string selectionForeground?: string cursorAccent?: string } export interface BaseTerminalProfile extends Profile { terminalColorScheme: TerminalColorScheme | null } export interface ConnectableTerminalProfile extends BaseTerminalProfile, ConnectableProfile {} ================================================ FILE: tabby-terminal/src/api/middleware.ts ================================================ import { Subject, Observable } from 'rxjs' import { SubscriptionContainer } from 'tabby-core' export class SessionMiddleware { get outputToSession$ (): Observable { return this.outputToSession } get outputToTerminal$ (): Observable { return this.outputToTerminal } protected outputToSession = new Subject() protected outputToTerminal = new Subject() feedFromSession (data: Buffer): void { this.outputToTerminal.next(data) } feedFromTerminal (data: Buffer): void { this.outputToSession.next(data) } close (): void { this.outputToSession.complete() this.outputToTerminal.complete() } } export class SessionMiddlewareStack extends SessionMiddleware { private stack: SessionMiddleware[] = [] private subs = new SubscriptionContainer() constructor () { super() this.push(new SessionMiddleware()) } push (middleware: SessionMiddleware): void { this.stack.push(middleware) this.relink() } unshift (middleware: SessionMiddleware): void { this.stack.unshift(middleware) this.relink() } remove (middleware: SessionMiddleware): void { this.stack = this.stack.filter(m => m !== middleware) this.relink() } replace (middleware: SessionMiddleware, newMiddleware: SessionMiddleware): void { const index = this.stack.indexOf(middleware) if (index >= 0) { this.stack[index].close() this.stack[index] = newMiddleware } else { this.stack.push(newMiddleware) } this.relink() } feedFromSession (data: Buffer): void { this.stack[0].feedFromSession(data) } feedFromTerminal (data: Buffer): void { this.stack[this.stack.length - 1].feedFromTerminal(data) } close (): void { for (const m of this.stack) { m.close() } this.subs.cancelAll() super.close() } private relink () { this.subs.cancelAll() for (let i = 0; i < this.stack.length - 1; i++) { this.subs.subscribe( this.stack[i].outputToTerminal$, x => this.stack[i + 1].feedFromSession(x), ) } this.subs.subscribe( this.stack[this.stack.length - 1].outputToTerminal$, x => this.outputToTerminal.next(x), ) for (let i = this.stack.length - 2; i >= 0; i--) { this.subs.subscribe( this.stack[i + 1].outputToSession$, x => this.stack[i].feedFromTerminal(x), ) } this.subs.subscribe( this.stack[0].outputToSession$, x => this.outputToSession.next(x), ) } } ================================================ FILE: tabby-terminal/src/cli.ts ================================================ import shellQuote from 'shell-quote' import { Injectable } from '@angular/core' import { CLIHandler, CLIEvent, AppService, HostWindowService } from 'tabby-core' import { BaseTerminalTabComponent } from './api/baseTerminalTab.component' @Injectable() export class TerminalCLIHandler extends CLIHandler { firstMatchOnly = true priority = 0 constructor ( private app: AppService, private hostWindow: HostWindowService, ) { super() } async handle (event: CLIEvent): Promise { const op = event.argv._[0] if (op === 'paste') { let text = event.argv.text! if (event.argv.escape!) { text = shellQuote.quote([text]) } this.handlePaste(text) return true } return false } private handlePaste (text: string) { if (this.app.activeTab instanceof BaseTerminalTabComponent && this.app.activeTab.session) { this.app.activeTab.sendInput(text) this.hostWindow.bringToFront() } } } ================================================ FILE: tabby-terminal/src/colorSchemes.ts ================================================ import { Injectable } from '@angular/core' import { TerminalColorScheme } from './api/interfaces' import { TerminalColorSchemeProvider } from './api/colorSchemeProvider' @Injectable({ providedIn: 'root' }) export class DefaultColorSchemes extends TerminalColorSchemeProvider { static defaultColorScheme: TerminalColorScheme = { name: 'Tabby Default', foreground: '#cacaca', background: '#171717', cursor: '#bbbbbb', colors: [ '#000000', '#ff615a', '#b1e969', '#ebd99c', '#5da9f6', '#e86aff', '#82fff7', '#dedacf', '#313131', '#f58c80', '#ddf88f', '#eee5b2', '#a5c7ff', '#ddaaff', '#b7fff9', '#ffffff', ], selection: undefined, cursorAccent: undefined, } static defaultLightColorScheme: TerminalColorScheme = { name: 'Tabby Default Light', foreground: '#4d4d4c', background: '#ffffff', cursor: '#4d4d4c', colors: [ '#000000', '#c82829', '#718c00', '#eab700', '#4271ae', '#8959a8', '#3e999f', '#ffffff', '#000000', '#c82829', '#718c00', '#eab700', '#4271ae', '#8959a8', '#3e999f', '#ffffff', ], selection: undefined, cursorAccent: undefined, } async getSchemes (): Promise { return [ DefaultColorSchemes.defaultColorScheme, DefaultColorSchemes.defaultLightColorScheme, ] } } ================================================ FILE: tabby-terminal/src/components/appearanceSettingsTab.component.pug ================================================ h3.mb-3(translate) Appearance .form-line .header .title(translate) Font .input-group.w-75 input.form-control( type='text', [ngbTypeahead]='fontAutocomplete', [(ngModel)]='config.store.terminal.font', (ngModelChange)='config.save()', ) input.form-control.font-size-input( type='number', max='48', [(ngModel)]='config.store.terminal.fontSize', (ngModelChange)='fixFontSize(); config.save()', ) .row .col-12.col-md-6 .form-line .header .title(translate) Enable font ligatures toggle( [(ngModel)]='config.store.terminal.ligatures', (ngModelChange)='config.save()', ) .form-line .header .title(translate) Normal font weight input.form-control( type='number', min='100', max='900', step='100', [(ngModel)]='config.store.terminal.fontWeight', (ngModelChange)='config.save()' ) .form-line .header .title(translate) Bold font weight input.form-control( type='number', min='100', max='900', step='100', [(ngModel)]='config.store.terminal.fontWeightBold', (ngModelChange)='config.save()' ) .col-12.col-md-6 color-scheme-preview([scheme]='config.store.terminal.colorScheme', [fontPreview]='true') .content-box .form-line(*ngIf='!themes.findCurrentTheme().followsColorScheme') .header .title(translate) Terminal background .btn-group(role='group') input.btn-check( type='radio', name='background', [(ngModel)]='config.store.terminal.background', (ngModelChange)='config.save()', id='backgroundTheme', [value]='"theme"' ) label.btn.btn-secondary( for='backgroundTheme' ) span(translate) From theme input.btn-check( type='radio', name='background', [(ngModel)]='config.store.terminal.background', (ngModelChange)='config.save()', id='backgroundColorScheme', [value]='"colorScheme"' ) label.btn.btn-secondary( for='backgroundColorScheme' ) span(translate) From color scheme .form-line .header .title(translate) Cursor shape .btn-group(role='group') input.btn-check( type='radio', name='cursor', [(ngModel)]='config.store.terminal.cursor', (ngModelChange)='config.save()', id='cursorBlock', [value]='"block"' ) label.btn.btn-secondary( for='cursorBlock' ) | █ input.btn-check( type='radio', name='cursor', [(ngModel)]='config.store.terminal.cursor', (ngModelChange)='config.save()', id='cursorBeam', [value]='"beam"' ) label.btn.btn-secondary( for='cursorBeam' ) | | input.btn-check( type='radio', name='cursor', [(ngModel)]='config.store.terminal.cursor', (ngModelChange)='config.save()', id='cursorUnderline', [value]='"underline"' ) label.btn.btn-secondary( for='cursorUnderline' ) | ▁ .form-line .header .title(translate) Blink cursor toggle( [(ngModel)]='config.store.terminal.cursorBlink', (ngModelChange)='config.save()', ) .form-line .header .title(translate) Minimum contrast ratio input.form-control( type='number', min='1', max='21', step='0.5', [(ngModel)]='config.store.terminal.minimumContrastRatio', (ngModelChange)='config.save()' ) .form-line .header .title(translate) Fallback font .description(translate) A second font family used to display characters missing in the main font input.form-control( type='text', [ngbTypeahead]='fontAutocomplete', [(ngModel)]='config.store.terminal.fallbackFont', (ngModelChange)='config.save()' ) .form-line .header .title(translate) Line padding .description(translate) Additional space between lines input.form-control( type='number', [(ngModel)]='config.store.terminal.linePadding', (ngModelChange)='config.save()', ) .form-line .header .title(translate) Custom CSS textarea.form-control.mb-5( [(ngModel)]='config.store.appearance.css', (ngModelChange)='saveConfiguration()', ) ================================================ FILE: tabby-terminal/src/components/appearanceSettingsTab.component.scss ================================================ color-scheme-preview { flex-shrink: 0; margin-bottom: 20px; } textarea { font-family: 'Source Code Pro', monospace; min-height: 120px; } .font-size-input { width: 100px; flex: none; } ================================================ FILE: tabby-terminal/src/components/appearanceSettingsTab.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Observable, debounceTime, distinctUntilChanged, map } from 'rxjs' import { debounce } from 'utils-decorators/dist/esm/debounce/debounce' import { Component } from '@angular/core' import { ConfigService, getCSSFontFamily, PlatformService, ThemesService } from 'tabby-core' /** @hidden */ @Component({ templateUrl: './appearanceSettingsTab.component.pug', styleUrls: ['./appearanceSettingsTab.component.scss'], }) export class AppearanceSettingsTabComponent { fonts: string[] = [] constructor ( public config: ConfigService, public themes: ThemesService, private platform: PlatformService, ) { } async ngOnInit () { this.fonts = await this.platform.listFonts() } fontAutocomplete = (text$: Observable) => { return text$.pipe( debounceTime(200), distinctUntilChanged(), map(query => this.fonts.filter(v => new RegExp(query, 'gi').test(v))), map(list => Array.from(new Set(list))), ) } getPreviewFontFamily () { return getCSSFontFamily(this.config.store) } @debounce(500) saveConfiguration (requireRestart?: boolean) { this.config.save() if (requireRestart) { this.config.requestRestart() } } fixFontSize () { this.config.store.terminal.fontSize = Math.min( 50, Math.max( 5, this.config.store.terminal.fontSize, ), ) } } ================================================ FILE: tabby-terminal/src/components/baseTerminalTab.component.pug ================================================ .terminal-toolbar-spacer .content(#content, [style.opacity]='frontendIsReady ? 1 : 0') search-panel( *ngIf='showSearchPanel && hasFocus && frontend', @toolbarSlide, [@.disabled]='!config.store.accessibility.animations', [frontend]='frontend', (close)='showSearchPanel = false; frontend.cancelSearch()' ) button.btn.btn-sm.btn-link.toolbar-pin-button( *ngIf='enableToolbar && !pinToolbar', (click)='togglePinToolbar()', (mouseenter)='showToolbar()', (mouseleave)='hideToolbar()' ) i.fas.fa-wrench ================================================ FILE: tabby-terminal/src/components/baseTerminalTab.component.scss ================================================ :host { flex: auto; display: flex; flex-direction: column; // overflow: hidden; position: relative; &> .content { flex: auto; position: relative; display: block; overflow: hidden; margin: calc(max(0px, 30px * var(--spaciness) - 15px)); transition: opacity ease-out 0.25s; opacity: 0; div[style]:last-child { background: black !important; color: white !important; } } $toolbarHeight: 40px; > terminal-toolbar { position: absolute; top: 0; left: 0; right: 0; z-index: 4; opacity: 0; transition: 0.25s opacity; will-change: transform; transform: translate(0, -100px); transition: 0.25s transform ease-out; height: $toolbarHeight; } &.toolbar-revealed, &.toolbar-pinned { > terminal-toolbar { opacity: 1; transform: translate(0, 0); } } > .toolbar-pin-button { position: absolute; right: 34px; top: 5px; z-index: 4; background: #00000047; } &.toolbar-pinned > .terminal-toolbar-spacer { width: 100%; height: $toolbarHeight; } } :host-context(.with-title-inset) { padding-top: 20px; terminal-toolbar { padding-left: 90px; } } ================================================ FILE: tabby-terminal/src/components/colorPicker.component.pug ================================================ div( [style.background]='model', ngx-colors-trigger, [(ngModel)]='model', (ngModelChange)='modelChange.emit($event)', [ngbTooltip]='hint' ) {{ title }} ================================================ FILE: tabby-terminal/src/components/colorPicker.component.scss ================================================ :host { display: inline-block; } div { width: 32px; height: 32px; box-shadow: 0 1px 1px rgba(0,0,0,.5); border: none; margin: 5px 10px 5px 0; border-radius: 2px; text-align: center; font-weight: bold; font-size: 17px; display: inline-block; color: #fff; line-height: 31px; text-shadow: 0 1px 1px rgba(0,0,0,.5); } ================================================ FILE: tabby-terminal/src/components/colorPicker.component.ts ================================================ import { Component, Input, Output, EventEmitter } from '@angular/core' /** @hidden */ @Component({ selector: 'color-picker', templateUrl: './colorPicker.component.pug', styleUrls: ['./colorPicker.component.scss'], }) export class ColorPickerComponent { @Input() model: string @Input() title: string @Input() hint: string @Output() modelChange = new EventEmitter() } ================================================ FILE: tabby-terminal/src/components/colorSchemePreview.component.pug ================================================ .preview( [style.font-family]='getPreviewFontFamily()', [style.font-size]='(fontPreview ? config.store.terminal.fontSize : 11) + "px"', [style.font-weight]='config.store.terminal.fontWeight', [style.background-color]='scheme.background', [style.color]='scheme.foreground', [style.font-feature-settings]='\'"liga" \' + config.store.terminal.ligatures ? 1 : 0', [style.font-variant-ligatures]='config.store.terminal.ligatures ? "initial" : "none"', ) div span([style.color]='scheme.colors[2]') john span([style.color]='scheme.colors[6]') @ span([style.color]='scheme.colors[4]') doe-pc strong( [style.color]='scheme.colors[1]', [style.font-weight]='config.store.terminal.fontWeightBold' ) $ span ls span([style.background-color]='scheme.cursor')   div span -rwxr-xr-x 1 root strong( [style.color]='scheme.colors[3]', [style.font-weight]='config.store.terminal.fontWeightBold' ) Documents div span -rwxr-xr-x 1 root  strong( [style.color]='scheme.colors[0]', [style.background]='scheme.colors[2]', [style.font-weight]='config.store.terminal.fontWeightBold' ) Downloads div span -rwxr-xr-x 1 root  strong( [style.color]='scheme.colors[0]', [style.background]='scheme.colors[8]', [style.font-weight]='config.store.terminal.fontWeightBold' ) Pictures div span -rwxr-xr-x 1 root strong( [style.color]='scheme.colors[12]', [style.font-weight]='config.store.terminal.fontWeightBold' ) Music div(*ngIf='fontPreview') span -rwxr-xr-x 1 root span([style.color]='scheme.colors[2]') 実行可能ファイル div(*ngIf='fontPreview') span -rwxr-xr-x 1 root span([style.color]='scheme.colors[6]') sym span -> span([style.color]='scheme.colors[1]') link div(*ngIf='fontPreview') span strong( [style.font-weight]='config.store.terminal.fontWeightBold' ) Icons: span    span span   span( [style.background-color]='scheme.colors[1]', [style.color]='scheme.colors[0]', )  Powerline  span([style.color]='scheme.colors[1]')  ================================================ FILE: tabby-terminal/src/components/colorSchemePreview.component.scss ================================================ :host { display: block; } .preview { margin-top: 10px; margin-left: 10px; padding: 5px 10px; border-radius: 4px; overflow: hidden; span { white-space: pre; } } ================================================ FILE: tabby-terminal/src/components/colorSchemePreview.component.ts ================================================ import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' import { BaseComponent, ConfigService, getCSSFontFamily } from 'tabby-core' import { TerminalColorScheme } from '../api/interfaces' /** @hidden */ @Component({ selector: 'color-scheme-preview', templateUrl: './colorSchemePreview.component.pug', styleUrls: ['./colorSchemePreview.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) export class ColorSchemePreviewComponent extends BaseComponent { @Input() scheme: TerminalColorScheme @Input() fontPreview = false constructor ( public config: ConfigService, changeDetector: ChangeDetectorRef, ) { super() this.subscribeUntilDestroyed(config.changed$, () => { changeDetector.markForCheck() }) } getPreviewFontFamily (): string { return getCSSFontFamily(this.config.store) } } ================================================ FILE: tabby-terminal/src/components/colorSchemeSelector.component.pug ================================================ .head .bg-dark.p-3.mb-4(*ngIf='model != undefined') .d-flex.align-items-center span {{model.name}} .me-auto a.btn-link((click)='selectScheme(undefined); $event.preventDefault()', href='#', translate) Clear color-scheme-preview([scheme]='model') .input-group.mb-3 .input-group-text i.fas.fa-fw.fa-search input.form-control(type='search', [placeholder]='"Search color schemes"|translate', [(ngModel)]='filter') .body .list-group.list-group-light.mb-3 ng-container(*ngFor='let scheme of allColorSchemes') .list-group-item.list-group-item-action( [hidden]='filter && !scheme.name.toLowerCase().includes(filter.toLowerCase())', (click)='selectScheme(scheme)' ) .d-flex.w-100.align-items-center i.fas.fa-fw([class.fa-check]='model?.name === scheme.name') .ms-2 .me-auto {{scheme.name}} color-scheme-preview([scheme]='scheme') ================================================ FILE: tabby-terminal/src/components/colorSchemeSelector.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import { Component, Inject, Input, ChangeDetectionStrategy, ChangeDetectorRef, HostBinding, Output, EventEmitter } from '@angular/core' import { ConfigService } from 'tabby-core' import { TerminalColorSchemeProvider } from '../api/colorSchemeProvider' import { TerminalColorScheme } from '../api/interfaces' _('Search color schemes') /** @hidden */ @Component({ selector: 'color-scheme-selector', templateUrl: './colorSchemeSelector.component.pug', styles: [` :host { display: block; max-height: 100vh; overflow-y: auto; } `], changeDetection: ChangeDetectionStrategy.OnPush, }) export class ColorSchemeSelectorComponent { allColorSchemes: TerminalColorScheme[] = [] filter = '' @Input() model?: TerminalColorScheme @Output() modelChange = new EventEmitter() @HostBinding('class.content-box') true constructor ( @Inject(TerminalColorSchemeProvider) private colorSchemeProviders: TerminalColorSchemeProvider[], private changeDetector: ChangeDetectorRef, public config: ConfigService, ) { } async ngOnInit () { const stockColorSchemes = (await Promise.all(this.config.enabledServices(this.colorSchemeProviders).map(x => x.getSchemes()))).reduce((a, b) => a.concat(b)) stockColorSchemes.sort((a, b) => a.name.localeCompare(b.name)) const customColorSchemes = this.config.store.terminal.customColorSchemes this.allColorSchemes = customColorSchemes.concat(stockColorSchemes) this.changeDetector.markForCheck() } selectScheme (scheme: TerminalColorScheme|undefined) { this.model = scheme this.modelChange.emit(scheme) this.changeDetector.markForCheck() } } ================================================ FILE: tabby-terminal/src/components/colorSchemeSettingsForMode.component.pug ================================================ .head .d-flex.align-items-center(*ngIf='!editing') strong.me-2(translate) Current color scheme span {{getCurrentSchemeName()}} .me-auto .btn-toolbar button.btn.btn-secondary((click)='editScheme()') i.fas.fa-pen span(translate) Edit .me-1 button.btn.btn-danger( (click)='deleteScheme(config.store.terminal[this.configKey])', *ngIf='currentCustomScheme' ) i.fas.fa-trash span(translate) Delete div(*ngIf='editing') .mb-3 label(translate) Name input.form-control(type='text', [(ngModel)]='config.store.terminal[this.configKey].name') .mb-3 color-picker( [(model)]='config.store.terminal[this.configKey].foreground', (modelChange)='config.save()', title='FG', hint='Foreground' ) color-picker( [(model)]='config.store.terminal[this.configKey].background', (modelChange)='config.save()', title='BG', hint='Background' ) color-picker( [(model)]='config.store.terminal[this.configKey].cursor', (modelChange)='config.save()', title='CU', hint='Cursor color' ) color-picker( [(model)]='config.store.terminal[this.configKey].cursorAccent', (modelChange)='config.save()', title='CA', hint='Block cursor foreground' ) color-picker( [(model)]='config.store.terminal[this.configKey].selection', (modelChange)='config.save()', title='SB', hint='Selection background' ) color-picker( [(model)]='config.store.terminal[this.configKey].selectionForeground', (modelChange)='config.save()', title='SF', hint='Selection foreground' ) color-picker( *ngFor='let _ of config.store.terminal[this.configKey].colors; let idx = index; trackBy: colorsTrackBy', [(model)]='config.store.terminal[this.configKey].colors[idx]', (modelChange)='config.save()', [title]='idx.toString()', hint='ANSI color {{idx}}' ) color-scheme-preview([scheme]='config.store.terminal[this.configKey]') .btn-toolbar.d-flex.mt-2(*ngIf='editing') .me-auto button.btn.btn-primary((click)='saveScheme()') i.fas.fa-check span(translate) Save .me-1 button.btn.btn-secondary((click)='cancelEditing()') i.fas.fa-times span(translate) Cancel hr.mt-3.mb-4 .input-group.mb-3 .input-group-text i.fas.fa-fw.fa-search input.form-control(type='search', [placeholder]='"Search color schemes"|translate', [(ngModel)]='filter') .body .list-group.list-group-light.mb-3 ng-container(*ngFor='let scheme of allColorSchemes') .list-group-item.list-group-item-action( [hidden]='filter && !scheme.name.toLowerCase().includes(filter.toLowerCase())', (click)='selectScheme(scheme)', [class.active]='(currentCustomScheme || currentStockScheme) === scheme' ) .d-flex.w-100.align-items-center i.fas.fa-fw([class.fa-check]='(currentCustomScheme || currentStockScheme) === scheme') .ms-2 .me-auto span {{scheme.name}} .badge.text-bg-info.ms-2(*ngIf='customColorSchemes.includes(scheme)', translate) Custom div .d-flex .swatch( *ngFor='let index of colorIndexes.slice(0, 8)', [style.background-color]='scheme.colors[index]' ) .d-flex .swatch( *ngFor='let index of colorIndexes.slice(8, 16)', [style.background-color]='scheme.colors[index]' ) color-scheme-preview([scheme]='scheme') ================================================ FILE: tabby-terminal/src/components/colorSchemeSettingsForMode.component.scss ================================================ .head { flex: none; } .body { overflow: auto; flex: auto; min-height: 0; } .swatch { width: 10px; height: 10px; border-radius: 50%; margin-right: 3px; margin-bottom: 3px; box-shadow: 0 1px 1px rgba(0, 0, 0, .5); } .list-group-item color-scheme-preview { margin-left: 14px; } ================================================ FILE: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import deepEqual from 'deep-equal' import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import { Component, Inject, Input, ChangeDetectionStrategy, ChangeDetectorRef, HostBinding } from '@angular/core' import { ConfigService, PlatformService, TranslateService } from 'tabby-core' import { TerminalColorSchemeProvider } from '../api/colorSchemeProvider' import { TerminalColorScheme } from '../api/interfaces' _('Search color schemes') /** @hidden */ @Component({ selector: 'color-scheme-settings-for-mode', templateUrl: './colorSchemeSettingsForMode.component.pug', styleUrls: ['./colorSchemeSettingsForMode.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) export class ColorSchemeSettingsForModeComponent { @Input() configKey: 'colorScheme'|'lightColorScheme' @Input() stockColorSchemes: TerminalColorScheme[] = [] @Input() customColorSchemes: TerminalColorScheme[] = [] @Input() allColorSchemes: TerminalColorScheme[] = [] @Input() filter = '' @Input() editing = false colorIndexes = [...new Array(16).keys()] currentStockScheme: TerminalColorScheme|null = null currentCustomScheme: TerminalColorScheme|null = null @HostBinding('class.content-box') true constructor ( @Inject(TerminalColorSchemeProvider) private colorSchemeProviders: TerminalColorSchemeProvider[], private changeDetector: ChangeDetectorRef, private platform: PlatformService, private translate: TranslateService, public config: ConfigService, ) { } async ngOnInit () { this.stockColorSchemes = (await Promise.all(this.config.enabledServices(this.colorSchemeProviders).map(x => x.getSchemes()))).reduce((a, b) => a.concat(b)) this.stockColorSchemes.sort((a, b) => a.name.localeCompare(b.name)) this.customColorSchemes = this.config.store.terminal.customColorSchemes this.changeDetector.markForCheck() this.update() } ngOnChanges () { this.update() } selectScheme (scheme: TerminalColorScheme) { this.config.store.terminal[this.configKey] = { ...scheme } this.config.save() this.cancelEditing() this.update() } update () { this.currentCustomScheme = this.findMatchingScheme(this.config.store.terminal[this.configKey], this.customColorSchemes) this.currentStockScheme = this.findMatchingScheme(this.config.store.terminal[this.configKey], this.stockColorSchemes) this.allColorSchemes = this.customColorSchemes.concat(this.stockColorSchemes) this.changeDetector.markForCheck() } editScheme () { this.editing = true } saveScheme () { this.customColorSchemes = this.customColorSchemes.filter(x => x.name !== this.config.store.terminal[this.configKey].name) this.customColorSchemes.push(this.config.store.terminal[this.configKey]) this.config.store.terminal.customColorSchemes = this.customColorSchemes this.config.save() this.cancelEditing() this.update() } cancelEditing () { this.editing = false } async deleteScheme (scheme: TerminalColorScheme) { if ((await this.platform.showMessageBox( { type: 'warning', message: this.translate.instant('Delete "{name}"?', scheme), buttons: [ this.translate.instant('Delete'), this.translate.instant('Keep'), ], defaultId: 1, cancelId: 1, }, )).response === 0) { this.customColorSchemes = this.customColorSchemes.filter(x => x.name !== scheme.name) this.config.store.terminal.customColorSchemes = this.customColorSchemes this.config.save() this.update() } } getCurrentSchemeName () { return (this.currentCustomScheme ?? this.currentStockScheme)?.name ?? 'Custom' } findMatchingScheme (scheme: TerminalColorScheme, schemes: TerminalColorScheme[]) { return schemes.find(x => deepEqual(x, scheme)) ?? null } colorsTrackBy (index) { return index } } ================================================ FILE: tabby-terminal/src/components/colorSchemeSettingsTab.component.pug ================================================ h3.mb-3(translate) Color schemes .form-line.mb-4 .header .title(translate) Switch color scheme .btn-group(role='group') input.btn-check( type='radio', name='colorSchemeMode', [(ngModel)]='config.store.appearance.colorSchemeMode', (ngModelChange)='config.save()', id='colorSchemeModeAuto', [value]='"auto"' ) label.btn.btn-secondary( for='colorSchemeModeAuto' ) span(translate) From system input.btn-check( type='radio', name='colorSchemeMode', [(ngModel)]='config.store.appearance.colorSchemeMode', (ngModelChange)='config.save()', id='colorSchemeModeDark', [value]='"dark"' ) label.btn.btn-secondary( for='colorSchemeModeDark' ) span(translate) Always dark input.btn-check( type='radio', name='colorSchemeMode', [(ngModel)]='config.store.appearance.colorSchemeMode', (ngModelChange)='config.save()', id='colorSchemeModeLight', [value]='"light"' ) label.btn.btn-secondary( for='colorSchemeModeLight' ) span(translate) Always light ul.nav-tabs(ngbNav, #nav='ngbNav', [activeId]='defaultTab') li(ngbNavItem='dark') a(ngbNavLink, translate) Dark mode ng-template(ngbNavContent) color-scheme-settings-for-mode(configKey='colorScheme') li(ngbNavItem='light') a(ngbNavLink, translate) Light mode ng-template(ngbNavContent) color-scheme-settings-for-mode(configKey='lightColorScheme') div([ngbNavOutlet]='nav') ================================================ FILE: tabby-terminal/src/components/colorSchemeSettingsTab.component.ts ================================================ import { Component } from '@angular/core' import { ConfigService, PlatformService } from 'tabby-core' /** @hidden */ @Component({ templateUrl: './colorSchemeSettingsTab.component.pug', }) export class ColorSchemeSettingsTabComponent { defaultTab = 'dark' constructor ( platform: PlatformService, public config: ConfigService, ) { this.defaultTab = platform.getTheme() } } ================================================ FILE: tabby-terminal/src/components/inputProcessingSettings.component.pug ================================================ .form-line .header .title(translate) Backspace key mode select.form-control([(ngModel)]='options.backspace') option( *ngFor='let mode of backspaceModes', [value]='mode.key', ) {{mode.name|translate}} ================================================ FILE: tabby-terminal/src/components/inputProcessingSettings.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import { Component, Input } from '@angular/core' import { InputProcessingOptions } from '../middleware/inputProcessing' /** @hidden */ @Component({ selector: 'input-processing-settings', templateUrl: './inputProcessingSettings.component.pug', }) export class InputProcessingSettingsComponent { @Input() options: InputProcessingOptions backspaceModes = [ { key: 'backspace', name: _('Pass-through'), }, { key: 'ctrl-h', name: 'Ctrl-H', }, { key: 'ctrl-?', name: 'Ctrl-?', }, { key: 'delete', name: 'Delete (CSI 3~)', }, ] getBackspaceModeName (key) { return this.backspaceModes.find(x => x.key === key)?.name } setBackspaceMode (mode) { this.options.backspace = mode } } ================================================ FILE: tabby-terminal/src/components/loginScriptsSettings.component.pug ================================================ div //TODO ([sortablejs]='scripts') .input-group.flex-grow-1(*ngFor='let script of scripts') input.form-control( type='text', placeholder='Expect', [(ngModel)]='script.expect' ) input.form-control( type='text', placeholder='Send', [(ngModel)]='script.send' ) .input-group-text.p-0.border-0 .hover-reveal(ngbDropdown) button.btn.btn-link.btn-sm(ngbDropdownToggle) i.fas.fa-fw.fa-cog .dropdown-menu-right(ngbDropdownMenu) a.dropdown-item( href='#', (click)='script.isRegex = false', [class.active]='!script.isRegex', ) i.fas.fa-fw([class.fa-check]='!script.isRegex') span(translate) Exact match a.dropdown-item( href='#', (click)='script.isRegex = true', [class.active]='script.isRegex', ) i.fas.fa-fw([class.fa-check]='script.isRegex') span(translate) Regex a.dropdown-item( href='#', (click)='script.optional = !script.optional', [class.active]='script.optional', ) i.fas.fa-fw([class.fa-check]='script.optional') span(translate) Optional button.btn.btn-link.btn-sm.hover-reveal((click)='deleteScript(script)') i.fas.fa-fw.fa-trash-alt button.btn.btn-secondary.mt-2((click)='addScript()') i.fas.fa-plus span(translate) New item ================================================ FILE: tabby-terminal/src/components/loginScriptsSettings.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, Input } from '@angular/core' import { PlatformService, TranslateService } from 'tabby-core' import { LoginScript, LoginScriptsOptions } from '../middleware/loginScriptProcessing' /** @hidden */ @Component({ selector: 'login-scripts-settings', templateUrl: './loginScriptsSettings.component.pug', }) export class LoginScriptsSettingsComponent { @Input() options: LoginScriptsOptions scripts: LoginScript[] constructor ( private platform: PlatformService, private translate: TranslateService, ) { } ngOnInit () { this.scripts = this.options.scripts } async deleteScript (script: LoginScript) { if ((await this.platform.showMessageBox( { type: 'warning', message: this.translate.instant('Delete this script?'), detail: script.expect, buttons: [ this.translate.instant('Delete'), this.translate.instant('Keep'), ], defaultId: 0, cancelId: 1, }, )).response === 0) { this.scripts = this.scripts.filter(x => x !== script) } } addScript () { this.scripts.push({ expect: '', send: '' }) } save () { this.options.scripts = this.scripts } } ================================================ FILE: tabby-terminal/src/components/searchPanel.component.pug ================================================ .input-group input.search-input.form-control( type='text', [(ngModel)]='query', (ngModelChange)='onQueryChange()', [class.text-danger]='state.resultCount == 0', (click)='$event.stopPropagation()', (keyup.enter)='findPrevious()', (keyup.up)='findPrevious()', (keyup.down)='findNext()', (keyup.esc)='close.emit()', [placeholder]='"Search"|translate' ) .input-group-text.result-counter(*ngIf='state.resultCount > 0') {{(state.resultIndex ?? 0) + 1}} / {{state.resultCount}} ng-container(*ngIf='state.resultCount > 0') button.btn.btn-link( (click)='findPrevious()', [ngbTooltip]='"Search up"|translate', placement='bottom', [fastHtmlBind]='icons.arrowUp' ) button.btn.btn-link( (click)='findNext()', [ngbTooltip]='"Search down"|translate', placement='bottom', [fastHtmlBind]='icons.arrowDown' ) .me-2 button.btn( (click)='options.caseSensitive = !options.caseSensitive; saveSearchOptions()', [class.btn-link]='!options.caseSensitive', [class.btn-info]='options.caseSensitive', [ngbTooltip]='"Case sensitivity"|translate', placement='bottom', [fastHtmlBind]='icons.case' ) button.btn( (click)='options.regex = !options.regex; saveSearchOptions()', [class.btn-link]='!options.regex', [class.btn-info]='options.regex', [ngbTooltip]='"Regular expression"|translate', placement='bottom', [fastHtmlBind]='icons.regexp' ) button.btn( (click)='options.wholeWord = !options.wholeWord; saveSearchOptions()', [class.btn-link]='!options.wholeWord', [class.btn-info]='options.wholeWord', [ngbTooltip]='"Whole word"|translate', placement='bottom', [fastHtmlBind]='icons.wholeWord' ) .me-2 button.btn.btn-link( (click)='close.emit()', [fastHtmlBind]='icons.close' ) ================================================ FILE: tabby-terminal/src/components/searchPanel.component.scss ================================================ :host { position: fixed; width: 600px; max-width: 80vw; right: 40px; height: 36px; z-index: 5; border-radius: 0 0 5px 5px; background: rgba(0, 0, 0, .95); border: 1px solid rgba(0, 0, 0, .5); border-top: 0; display: flex; button { padding: 0 6px; margin: 4px 2px; flex-shrink: 0; } } .result-counter { font-size: 0.7rem; opacity: .5; } :host ::ng-deep svg { height: 16px; } ================================================ FILE: tabby-terminal/src/components/searchPanel.component.ts ================================================ import { Component, Input, Output, EventEmitter } from '@angular/core' import { Subject, debounceTime } from 'rxjs' import { Frontend, SearchOptions, SearchState } from '../frontends/frontend' import { ConfigService, NotificationsService, TranslateService } from 'tabby-core' @Component({ selector: 'search-panel', templateUrl: './searchPanel.component.pug', styleUrls: ['./searchPanel.component.scss'], }) export class SearchPanelComponent { @Input() query: string @Input() frontend: Frontend state: SearchState = { resultCount: 0 } options: SearchOptions = { incremental: true, ...this.config.store.terminal.searchOptions, } @Output() close = new EventEmitter() private queryChanged = new Subject() icons = { 'case': require('../icons/case.svg'), regexp: require('../icons/regexp.svg'), wholeWord: require('../icons/whole-word.svg'), arrowUp: require('../icons/arrow-up.svg'), arrowDown: require('../icons/arrow-down.svg'), close: require('../icons/close.svg'), } constructor ( private notifications: NotificationsService, private translate: TranslateService, public config: ConfigService, ) { this.queryChanged.pipe(debounceTime(250)).subscribe(() => { this.findPrevious(true) }) } onQueryChange (): void { this.state = { resultCount: 0 } this.queryChanged.next(this.query) } findNext (incremental = false): void { if (!this.query) { return } this.state = this.frontend.findNext(this.query, { ...this.options, incremental: incremental || undefined }) if (!this.state.resultCount) { this.notifications.notice(this.translate.instant('Not found')) } } findPrevious (incremental = false): void { if (!this.query) { return } this.state = this.frontend.findPrevious(this.query, { ...this.options, incremental: incremental || undefined }) if (!this.state.resultCount) { this.notifications.notice(this.translate.instant('Not found')) } } saveSearchOptions (): void { this.config.store.terminal.searchOptions.regex = this.options.regex this.config.store.terminal.searchOptions.caseSensitive = this.options.caseSensitive this.config.store.terminal.searchOptions.wholeWord = this.options.wholeWord this.config.save() } ngOnDestroy (): void { this.queryChanged.complete() } } ================================================ FILE: tabby-terminal/src/components/streamProcessingSettings.component.pug ================================================ .form-line .header .title(translate) Input mode .d-flex(ngbDropdown) button.btn.btn-secondary.btn-tab-bar( ngbDropdownToggle, ) {{getInputModeName(options.inputMode)}} div(ngbDropdownMenu) a.d-flex.flex-column( *ngFor='let mode of inputModes', (click)='setInputMode(mode.key)', ngbDropdownItem ) div {{mode.name|translate}} .text-muted {{mode.description|translate}} .form-line .header .title(translate) Input newlines select.form-control( [(ngModel)]='options.inputNewlines', ) option([ngValue]='mode.key', *ngFor='let mode of newlineModes') {{mode.name|translate}} .form-line .header .title(translate) Output mode .d-flex(ngbDropdown) button.btn.btn-secondary.btn-tab-bar( ngbDropdownToggle, ) {{getOutputModeName(options.outputMode)}} div(ngbDropdownMenu) a.d-flex.flex-column( *ngFor='let mode of outputModes', (click)='setOutputMode(mode.key)', ngbDropdownItem ) div {{mode.name|translate}} .text-muted {{mode.description|translate}} .form-line .header .title(translate) Output newlines select.form-control( [(ngModel)]='options.outputNewlines', ) option([ngValue]='mode.key', *ngFor='let mode of newlineModes') {{mode.name|translate}} ================================================ FILE: tabby-terminal/src/components/streamProcessingSettings.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker' import { Component, Input } from '@angular/core' import { StreamProcessingOptions } from '../middleware/streamProcessing' /** @hidden */ @Component({ selector: 'stream-processing-settings', templateUrl: './streamProcessingSettings.component.pug', }) export class StreamProcessingSettingsComponent { @Input() options: StreamProcessingOptions inputModes = [ { key: null, name: _('Normal'), description: _('Input is sent as you type'), }, { key: 'local-echo', name: _('Local echo'), description: _('Immediately echoes your input locally'), }, { key: 'readline', name: _('Line by line'), description: _('Line editor, input is sent after you press Enter'), }, { key: 'readline-hex', name: _('Hexadecimal'), description: _('Send bytes by typing in hex values'), }, ] outputModes = [ { key: null, name: _('Normal'), description: _('Output is shown as it is received'), }, { key: 'hex', name: _('Hexadecimal'), description: _('Output is shown as a hexdump'), }, ] newlineModes = [ { key: null, name: _('Keep') }, { key: 'strip', name: _('Strip') }, { key: 'cr', name: _('Force CR') }, { key: 'lf', name: _('Force LF') }, { key: 'crlf', name: _('Force CRLF') }, { key: 'implicit_cr', name: _('Implicit CR in every LF') }, { key: 'implicit_lf', name: _('Implicit LF in every CR') }, ] getInputModeName (key) { return this.inputModes.find(x => x.key === key)?.name } getOutputModeName (key) { return this.outputModes.find(x => x.key === key)?.name } setInputMode (mode) { this.options.inputMode = mode } setOutputMode (mode) { this.options.outputMode = mode } } ================================================ FILE: tabby-terminal/src/components/terminalSettingsTab.component.pug ================================================ div h3.mb-3(translate) Rendering .form-line(*ngIf='hostApp.platform !== Platform.Web') .header .title(translate) Frontend .description(translate) Switches terminal frontend implementation (experimental) select.form-control( [(ngModel)]='config.store.terminal.frontend', (ngModelChange)='config.save()', ) option(value='xterm-webgl') xterm (WebGL) option(value='xterm') xterm (canvas) .form-line .header .title(translate) Scrollback .description(translate) Number of lines kept in the buffer input.form-control( type='number', [(ngModel)]='config.store.terminal.scrollbackLines', (ngModelChange)='config.save()', ) .form-line .header .title(translate) Draw bold text in bright colors toggle( [(ngModel)]='config.store.terminal.drawBoldTextInBrightColors', (ngModelChange)='config.save()' ) .form-line .header .title(translate) Sixel graphics support (experimental) .description(translate) Display images via Sixel escape sequences toggle( [(ngModel)]='config.store.terminal.sixel', (ngModelChange)='config.save(); config.requestRestart()' ) div.mt-4 h3(translate) Keyboard .form-line .header .title( translate="Use {altKeyName} as the Meta key", [translateParams]='{altKeyName: altKeyName}' ) .description(translate) Lets the shell handle Meta key instead of OS toggle( [(ngModel)]='config.store.terminal.altIsMeta', (ngModelChange)='config.save()', ) .form-line .header .title(translate) Scroll on input .description(translate) Scrolls the terminal to the bottom on user input toggle( [(ngModel)]='config.store.terminal.scrollOnInput', (ngModelChange)='config.save()', ) div.mt-4 h3(translate) Mouse .form-line .header .title(translate) Right click .description(*ngIf='config.store.terminal.rightClick == "paste"', translate) Long-click for context menu select.form-control( [(ngModel)]='config.store.terminal.rightClick', (ngModelChange)='config.save()' ) option(ngValue='off', translate) Off option(ngValue='menu', translate) Context menu option(ngValue='paste', translate) Paste option(ngValue='clipboard', translate) Paste if no selection, else copy .form-line .header .title(translate) Paste on middle-click toggle( [(ngModel)]='config.store.terminal.pasteOnMiddleClick', (ngModelChange)='config.save()', ) .form-line .header .title(translate) Word separators .description(translate) Double-click selection will stop at these characters input.form-control( type='text', placeholder=' ()[]{}\'"', [(ngModel)]='config.store.terminal.wordSeparator', (ngModelChange)='config.save()', ) .form-line(*ngIf='config.store.clickableLinks') .header .title(translate) Require a key to click links .description(translate) When enabled, links are only clickable while holding this key select.form-control( [(ngModel)]='config.store.clickableLinks.modifier', (ngModelChange)='config.save()', ) option([ngValue]='null', translate) No modifier option(value='ctrlKey', *ngIf='hostApp.platform !== Platform.macOS') Ctrl option(value='altKey') {{altKeyName}} option(value='shiftKey') Shift option(value='metaKey') {{metaKeyName}} .mt-4 h3(translate) Clipboard .form-line .header .title(translate) Copy on select toggle( [(ngModel)]='config.store.terminal.copyOnSelect', (ngModelChange)='config.save()', ) .form-line .header .title(translate) Copy with formatting toggle( [(ngModel)]='config.store.terminal.copyAsHTML', (ngModelChange)='config.save()', ) .form-line .header .title(translate) Bracketed paste (requires shell support) .description(translate) Prevents accidental execution of pasted commands toggle( [(ngModel)]='config.store.terminal.bracketedPaste', (ngModelChange)='config.save()', ) .form-line .header .title(translate) Warn on multi-line paste .description(translate) Show a confirmation box when pasting multiple lines toggle( [(ngModel)]='config.store.terminal.warnOnMultilinePaste', (ngModelChange)='config.save()', ) .form-line .header .title(translate) Trim whitespace and newlines .description(translate) Remove whitespace and newlines around the copied text toggle( [(ngModel)]='config.store.terminal.trimWhitespaceOnPaste', (ngModelChange)='config.save()', ) div.mt-4 h3(translate) Sound .form-line .header .title(translate) Terminal bell .btn-group input.btn-check( type='radio', name='bell', [(ngModel)]='config.store.terminal.bell', (ngModelChange)='config.save()', id='bellOff', [value]='"off"' ) label.btn.btn-secondary(for='bellOff') span(translate) Off input.btn-check( type='radio', name='bell', [(ngModel)]='config.store.terminal.bell', (ngModelChange)='config.save()', id='bellVisual', [value]='"visual"' ) label.btn.btn-secondary(for='bellVisual') span(translate) Visual input.btn-check( type='radio', name='bell', [(ngModel)]='config.store.terminal.bell', (ngModelChange)='config.save()', id='bellAudible', [value]='"audible"' ) label.btn.btn-secondary(for='bellAudible') span(translate) Audible .alert.alert-info.d-flex.align-items-center(*ngIf='config.store.terminal.bell != "audible" && (config.store.terminal.profile || "").startsWith("wsl")') .me-auto(translate) WSL terminal bell can only be muted via Volume Mixer button.btn.btn-secondary((click)='openWSLVolumeMixer()', translate) Show Mixer .mt-4 h3(translate) Startup .form-line(*ngIf='hostApp.platform !== Platform.Web') .header .title(translate) Auto-open a terminal on app start toggle( [(ngModel)]='config.store.terminal.autoOpen', (ngModelChange)='config.save()', ) .form-line .header .title(translate) Restore terminal tabs on app start toggle( [(ngModel)]='config.store.recoverTabs', (ngModelChange)='config.save()', ) div.mt-4(*ngIf='hostApp.platform === Platform.Windows') h3(translate) Windows .form-line .header .title(translate) Set Tabby as %COMSPEC% .description(translate) Allows opening .bat files in tabs, but breaks some shells toggle( [(ngModel)]='config.store.terminal.setComSpec', (ngModelChange)='config.save()', ) ================================================ FILE: tabby-terminal/src/components/terminalSettingsTab.component.ts ================================================ import { Component, HostBinding } from '@angular/core' import { ConfigService, HostAppService, Platform, PlatformService, altKeyName, metaKeyName } from 'tabby-core' /** @hidden */ @Component({ templateUrl: './terminalSettingsTab.component.pug', }) export class TerminalSettingsTabComponent { Platform = Platform altKeyName = altKeyName metaKeyName = metaKeyName @HostBinding('class.content-box') true constructor ( public config: ConfigService, public hostApp: HostAppService, private platform: PlatformService, ) { } openWSLVolumeMixer (): void { this.platform.openPath('sndvol.exe') this.platform.exec('wsl.exe', ['tput', 'bel']) } } ================================================ FILE: tabby-terminal/src/components/terminalToolbar.component.pug ================================================ .content( cdkDropList cdkAutoDropGroup='app-tabs' ) i.fas.fa-grip-vertical.drag-handle( *ngIf='shouldShowDragHandle', cdkDrag, [cdkDragData]='tab', (cdkDragStarted)='onTabDragStart()', (cdkDragEnded)='onTabDragEnd()' ) ng-content button.btn.btn-sm.btn-link( *ngIf='tab.enableToolbar', (click)='tab.togglePinToolbar()', (mouseenter)='tab.showToolbar()', (mouseleave)='tab.hideToolbar()' ) i.fas.fa-thumbtack span(*ngIf='tab.pinToolbar', translate) Unpin span(*ngIf='!tab.pinToolbar', translate) Pin ================================================ FILE: tabby-terminal/src/components/terminalToolbar.component.scss ================================================ :host { padding: 5px 15px 5px 15px; display: flex; z-index: 3; overflow: hidden; ::ng-deep .btn { white-space: nowrap; text-overflow: ellipsis; overflow: hidden; } } .content { flex-grow: 1; display: flex; align-items: center; } .drag-handle { margin: 0 10px 0 0; cursor: move; opacity: .3; } ================================================ FILE: tabby-terminal/src/components/terminalToolbar.component.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, HostListener, Input } from '@angular/core' import { AppService, SplitTabComponent } from 'tabby-core' import { BaseTerminalTabComponent } from '../api/baseTerminalTab.component' /** @hidden */ @Component({ selector: 'terminal-toolbar', templateUrl: './terminalToolbar.component.pug', styleUrls: ['./terminalToolbar.component.scss'], }) export class TerminalToolbarComponent { @Input() tab: BaseTerminalTabComponent // eslint-disable-next-line @typescript-eslint/no-useless-constructor constructor ( private app: AppService, ) { } onTabDragStart (): void { this.app.emitTabDragStarted(this.tab) } onTabDragEnd (): void { setTimeout(() => { this.app.emitTabDragEnded() this.app.emitTabsChanged() }) } get shouldShowDragHandle (): boolean { return this.tab.topmostParent instanceof SplitTabComponent && this.tab.topmostParent.getAllTabs().length > 1 } @HostListener('mouseenter') onMouseEnter () { this.tab.showToolbar() } @HostListener('mouseleave') onMouseLeave () { this.tab.hideToolbar() } } ================================================ FILE: tabby-terminal/src/config.ts ================================================ import { ConfigProvider, Platform } from 'tabby-core' import { DefaultColorSchemes } from './colorSchemes' /** @hidden */ export class TerminalConfigProvider extends ConfigProvider { defaults = { hotkeys: { 'copy-current-path': [], }, terminal: { frontend: 'xterm-webgl', fontSize: 14, fontWeight: 400, fontWeightBold: 700, fallbackFont: null, linePadding: 0, bell: 'off', bracketedPaste: true, background: 'theme', ligatures: false, cursor: 'block', cursorBlink: true, hideTabIndex: false, showTabProfileIcon: false, hideCloseButton: false, hideTabOptionsButton: false, rightClick: 'menu', pasteOnMiddleClick: true, copyOnSelect: false, copyAsHTML: true, scrollOnInput: true, altIsMeta: false, wordSeparator: ' ()[]{}\'"', colorScheme: { __nonStructural: true, ...DefaultColorSchemes.defaultColorScheme, }, lightColorScheme: { __nonStructural: true, ...DefaultColorSchemes.defaultLightColorScheme, }, customColorSchemes: [], warnOnMultilinePaste: true, searchRegexAlwaysEnabled: false, searchOptions: { regex: false, wholeWord: false, caseSensitive: false, }, detectProgress: true, scrollbackLines: 25000, drawBoldTextInBrightColors: true, sixel: true, minimumContrastRatio: 4, trimWhitespaceOnPaste: true, }, } platformDefaults = { [Platform.macOS]: { terminal: { font: 'Menlo', }, hotkeys: { 'ctrl-c': ['Ctrl-C'], copy: [ '⌘-C', ], paste: [ '⌘-V', ], clear: [ '⌘-K', ], 'select-all': ['⌘-A'], 'zoom-in': [ '⌘-=', '⌘-Shift-=', ], 'zoom-out': [ '⌘--', '⌘-Shift--', ], 'reset-zoom': [ '⌘-0', ], home: ['⌘-Left', 'Home'], end: ['⌘-Right', 'End'], 'previous-word': ['⌥-Left'], 'next-word': ['⌥-Right'], 'delete-previous-word': ['⌥-Backspace'], 'delete-line': ['⌘-Backspace'], 'delete-next-word': ['⌥-Delete'], search: [ '⌘-F', ], 'pane-focus-all': [ '⌘-Shift-I', ], 'focus-all-tabs': [ '⌘-⌥-Shift-I', ], 'scroll-to-top': ['Shift-PageUp'], 'scroll-page-up': ['⌥-PageUp'], 'scroll-up': ['Ctrl-Shift-Up'], 'scroll-down': ['Ctrl-Shift-Down'], 'scroll-page-down': ['⌥-PageDown'], 'scroll-to-bottom': ['Shift-PageDown'], }, }, [Platform.Windows]: { terminal: { font: 'Consolas', rightClick: 'clipboard', pasteOnMiddleClick: false, copyOnSelect: true, }, hotkeys: { 'ctrl-c': ['Ctrl-C'], copy: [ 'Ctrl-Shift-C', ], paste: [ 'Ctrl-Shift-V', 'Shift-Insert', ], 'select-all': ['Ctrl-Shift-A'], clear: [], 'zoom-in': [ 'Ctrl-=', 'Ctrl-Shift-=', ], 'zoom-out': [ 'Ctrl--', 'Ctrl-Shift--', ], 'reset-zoom': [ 'Ctrl-0', ], home: ['Home'], end: ['End'], 'previous-word': ['Ctrl-Left'], 'next-word': ['Ctrl-Right'], 'delete-previous-word': ['Ctrl-Backspace'], 'delete-line': ['Ctrl-Shift-Backspace'], 'delete-next-word': ['Ctrl-Delete'], search: [ 'Ctrl-Shift-F', ], 'pane-focus-all': [ 'Ctrl-Shift-I', ], 'focus-all-tabs': [ 'Ctrl-Alt-Shift-I', ], 'scroll-to-top': ['Ctrl-PageUp'], 'scroll-page-up': ['Alt-PageUp'], 'scroll-up': ['Ctrl-Shift-Up'], 'scroll-down': ['Ctrl-Shift-Down'], 'scroll-page-down': ['Alt-PageDown'], 'scroll-to-bottom': ['Ctrl-PageDown'], }, }, [Platform.Linux]: { terminal: { font: 'Liberation Mono', pasteOnMiddleClick: false, // handled by OS }, hotkeys: { 'ctrl-c': ['Ctrl-C'], copy: [ 'Ctrl-Shift-C', ], paste: [ 'Ctrl-Shift-V', 'Shift-Insert', ], 'select-all': ['Ctrl-Shift-A'], clear: [], 'zoom-in': [ 'Ctrl-=', 'Ctrl-Shift-=', ], 'zoom-out': [ 'Ctrl--', 'Ctrl-Shift--', ], 'reset-zoom': [ 'Ctrl-0', ], home: ['Home'], end: ['End'], 'previous-word': ['Ctrl-Left'], 'next-word': ['Ctrl-Right'], 'delete-previous-word': ['Ctrl-Backspace'], 'delete-line': ['Ctrl-Shift-Backspace'], 'delete-next-word': ['Ctrl-Delete'], search: [ 'Ctrl-Shift-F', ], 'pane-focus-all': [ 'Ctrl-Shift-I', ], 'focus-all-tabs': [ 'Ctrl-Alt-Shift-I', ], 'scroll-to-top': ['Ctrl-PageUp'], 'scroll-page-up': ['Alt-PageUp'], 'scroll-up': ['Ctrl-Shift-Up'], 'scroll-down': ['Ctrl-Shift-Down'], 'scroll-page-down': ['Alt-PageDown'], 'scroll-to-bottom': ['Ctrl-PageDown'], }, }, } } ================================================ FILE: tabby-terminal/src/features/debug.ts ================================================ import { Injectable } from '@angular/core' import { TerminalDecorator } from '../api/decorator' import { BaseTerminalTabComponent } from '../api/baseTerminalTab.component' import { PlatformService } from 'tabby-core' /** @hidden */ @Injectable() export class DebugDecorator extends TerminalDecorator { constructor ( private platform: PlatformService, ) { super() } attach (terminal: BaseTerminalTabComponent): void { let sessionOutputBuffer = '' const bufferLength = 8192 const handler = data => { sessionOutputBuffer += data if (sessionOutputBuffer.length > bufferLength) { sessionOutputBuffer = sessionOutputBuffer.substring(sessionOutputBuffer.length - bufferLength) } } this.subscribeUntilDetached(terminal, terminal.sessionChanged$.subscribe(session => { this.subscribeUntilDetached(terminal, session?.output$.subscribe(handler)) })) this.subscribeUntilDetached(terminal, terminal.session?.output$.subscribe(handler)) terminal.addEventListenerUntilDestroyed(terminal.content.nativeElement, 'keyup', (e: KeyboardEvent) => { // Ctrl-Shift-Alt-1 if (e.which === 49 && e.ctrlKey && e.shiftKey && e.altKey) { this.doSaveState(terminal) } // Ctrl-Shift-Alt-2 if (e.which === 50 && e.ctrlKey && e.shiftKey && e.altKey) { this.doLoadState(terminal) } // Ctrl-Shift-Alt-3 if (e.which === 51 && e.ctrlKey && e.shiftKey && e.altKey) { this.doCopyState(terminal) } // Ctrl-Shift-Alt-4 if (e.which === 52 && e.ctrlKey && e.shiftKey && e.altKey) { this.doPasteState(terminal) } // Ctrl-Shift-Alt-5 if (e.which === 53 && e.ctrlKey && e.shiftKey && e.altKey) { this.doSaveOutput(sessionOutputBuffer) } // Ctrl-Shift-Alt-6 if (e.which === 54 && e.ctrlKey && e.shiftKey && e.altKey) { this.doLoadOutput(terminal) } // Ctrl-Shift-Alt-7 if (e.which === 55 && e.ctrlKey && e.shiftKey && e.altKey) { this.doCopyOutput(sessionOutputBuffer) } // Ctrl-Shift-Alt-8 if (e.which === 56 && e.ctrlKey && e.shiftKey && e.altKey) { this.doPasteOutput(terminal) } }) } private async loadFile (): Promise { const transfer = await this.platform.startUpload() if (!transfer.length) { return null } const data = await transfer[0].readAll() transfer[0].close() return data.toString() } private async saveFile (content: string, name: string) { const data = Buffer.from(content) const transfer = await this.platform.startDownload(name, 0o644, data.length) if (transfer) { transfer.write(data) transfer.close() } } private doSaveState (terminal: BaseTerminalTabComponent) { this.saveFile(terminal.frontend!.saveState(), 'state.txt') } private async doCopyState (terminal: BaseTerminalTabComponent) { const data = '```' + JSON.stringify(terminal.frontend!.saveState()) + '```' this.platform.setClipboard({ text: data }) } private async doLoadState (terminal: BaseTerminalTabComponent) { const data = await this.loadFile() if (data) { terminal.frontend!.restoreState(data) } } private async doPasteState (terminal: BaseTerminalTabComponent) { let data = this.platform.readClipboard() if (data) { if (data.startsWith('`')) { data = data.substring(3, data.length - 3) } terminal.frontend!.restoreState(JSON.parse(data)) } } private doSaveOutput (buffer: string) { this.saveFile(buffer, 'output.txt') } private async doCopyOutput (buffer: string) { const data = '```' + JSON.stringify(buffer) + '```' this.platform.setClipboard({ text: data }) } private async doLoadOutput (terminal: BaseTerminalTabComponent) { const data = await this.loadFile() if (data) { await terminal.frontend?.write(data) } } private async doPasteOutput (terminal: BaseTerminalTabComponent) { let data = this.platform.readClipboard() if (data) { if (data.startsWith('`')) { data = data.substring(3, data.length - 3) } await terminal.frontend?.write(JSON.parse(data)) } } } ================================================ FILE: tabby-terminal/src/features/zmodem.ts ================================================ import colors from 'ansi-colors' import * as ZModem from 'zmodem.js' import { Observable, filter, first } from 'rxjs' import { Injectable } from '@angular/core' import { TerminalDecorator } from '../api/decorator' import { BaseTerminalTabComponent } from '../api/baseTerminalTab.component' import { SessionMiddleware } from '../api/middleware' import { LogService, Logger, HotkeysService, PlatformService, FileUpload } from 'tabby-core' const SPACER = ' ' class ZModemMiddleware extends SessionMiddleware { private sentry: ZModem.Sentry private isActive = false private logger: Logger private activeSession: any = null private cancelEvent: Observable constructor ( log: LogService, hotkeys: HotkeysService, private platform: PlatformService, ) { super() this.cancelEvent = this.outputToSession$.pipe(filter(x => x.length === 1 && x[0] === 3)) this.logger = log.create('zmodem') this.sentry = new ZModem.Sentry({ to_terminal: data => { if (this.isActive && this.activeSession) { this.outputToTerminal.next(Buffer.from(data)) } }, sender: data => this.outputToSession.next(Buffer.from(data)), on_detect: async detection => { try { this.isActive = true await this.process(detection) } finally { this.isActive = false } }, on_retract: () => { this.showMessage('transfer cancelled') this.activeSession = null this.isActive = false }, }) } feedFromSession (data: Buffer): void { if (this.isActive || this.activeSession) { try { this.sentry.consume(data) } catch (e) { this.showMessage(colors.bgRed.black(' Error ') + ' ' + e) this.logger.error('protocol error', e) this.activeSession?.abort() this.activeSession = null this.isActive = false // Don't forward the problematic data to terminal return } } else { try { this.sentry.consume(data) } catch (e) { this.logger.error('zmodem detection error', e) } this.outputToTerminal.next(data) } } private async process (detection): Promise { this.showMessage(colors.bgBlue.black(' ZMODEM ') + ' Session started') this.showMessage('------------------------') const zsession = detection.confirm() this.activeSession = zsession this.logger.info('new session', zsession) try { if (zsession.type === 'send') { const transfers = await this.platform.startUpload({ multiple: true }) let filesRemaining = transfers.length let sizeRemaining = transfers.reduce((a, b) => a + b.getSize(), 0) for (const transfer of transfers) { await this.sendFile(zsession, transfer, filesRemaining, sizeRemaining) filesRemaining-- sizeRemaining -= transfer.getSize() } await zsession.close() } else { zsession.on('offer', xfer => { this.receiveFile(xfer, zsession) }) zsession.start() await new Promise(resolve => zsession.on('session_end', resolve)) } this.showMessage(colors.bgBlue.black(' ZMODEM ') + ' Complete') } catch (error) { this.logger.error('ZMODEM session error', error) this.showMessage(colors.bgRed.black(' ZMODEM ') + ` Session failed: ${error.message}`) try { zsession.abort() } catch { } } finally { this.activeSession = null } } private async receiveFile (xfer, zsession) { const details: { name: string, size: number, } = xfer.get_details() this.showMessage(colors.bgYellow.black(' Offered ') + ' ' + details.name, true) this.logger.info('offered', xfer) const transfer = await this.platform.startDownload(details.name, 0o644, details.size) if (!transfer) { this.showMessage(colors.bgRed.black(' Rejected ') + ' ' + details.name) xfer.skip() return } let canceled = false const cancelSubscription = this.cancelEvent.subscribe(() => { try { zsession._skip() } catch {} canceled = true }) try { await Promise.race([ xfer.accept({ on_input: chunk => { if (canceled) { return } transfer.write(Buffer.from(chunk)) this.showMessage(colors.bgYellow.black(' ' + Math.round(100 * transfer.getCompletedBytes() / details.size).toString().padStart(3, ' ') + '% ') + ' ' + details.name, true) }, }), this.cancelEvent.pipe(first()).toPromise(), ]) // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (canceled) { transfer.cancel() this.showMessage(colors.bgRed.black(' Canceled ') + ' ' + details.name) } else { transfer.close() this.showMessage(colors.bgGreen.black(' Received ') + ' ' + details.name) } } catch { this.showMessage(colors.bgRed.black(' Error ') + ' ' + details.name) } cancelSubscription.unsubscribe() } private async sendFile (zsession, transfer: FileUpload, filesRemaining, sizeRemaining) { const offer = { name: transfer.getName(), size: transfer.getSize(), mode: transfer.getMode(), files_remaining: filesRemaining, bytes_remaining: sizeRemaining, } this.logger.info('offering', offer) this.showMessage(colors.bgYellow.black(' Offered ') + ' ' + offer.name, true) const xfer = await zsession.send_offer(offer) if (xfer) { let canceled = false const cancelSubscription = this.cancelEvent.subscribe(() => { canceled = true }) while (true) { const chunk = await transfer.read() // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (canceled || !chunk.length) { break } await xfer.send(chunk) this.showMessage(colors.bgYellow.black(' ' + Math.round(100 * transfer.getCompletedBytes() / offer.size).toString().padStart(3, ' ') + '% ') + offer.name, true) } // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (canceled) { transfer.cancel() } else { transfer.close() } await xfer.end() // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (canceled) { this.showMessage(colors.bgRed.black(' Canceled ') + ' ' + offer.name) } else { this.showMessage(colors.bgGreen.black(' Sent ') + ' ' + offer.name) } cancelSubscription.unsubscribe() } else { transfer.cancel() this.showMessage(colors.bgRed.black(' Rejected ') + ' ' + offer.name) this.logger.warn('rejected by the other side') } } private showMessage (msg: string, overwrite = false) { this.outputToTerminal.next(Buffer.from(`\r${msg}${SPACER}`)) if (!overwrite) { this.outputToTerminal.next(Buffer.from('\r\n')) } } } /** @hidden */ @Injectable() export class ZModemDecorator extends TerminalDecorator { constructor ( private log: LogService, private hotkeys: HotkeysService, private platform: PlatformService, ) { super() } attach (terminal: BaseTerminalTabComponent): void { setTimeout(() => { this.attachToSession(terminal) this.subscribeUntilDetached(terminal, terminal.sessionChanged$.subscribe(() => { this.attachToSession(terminal) })) }) } private attachToSession (terminal: BaseTerminalTabComponent) { if (!terminal.session) { return } terminal.session.middleware.unshift(new ZModemMiddleware(this.log, this.hotkeys, this.platform)) } } ================================================ FILE: tabby-terminal/src/frontends/frontend.ts ================================================ import { Injector } from '@angular/core' import { Observable, Subject, AsyncSubject, ReplaySubject, BehaviorSubject } from 'rxjs' import { BaseTerminalProfile, ResizeEvent } from '../api/interfaces' export interface SearchOptions { regex?: boolean wholeWord?: boolean caseSensitive?: boolean incremental?: true } export interface SearchState { resultIndex?: number resultCount: number } /** * Extend to add support for a different VT frontend implementation */ export abstract class Frontend { enableResizing = true protected ready = new AsyncSubject() protected title = new ReplaySubject(1) protected alternateScreenActive = new BehaviorSubject(false) protected mouseEvent = new Subject() protected bell = new Subject() protected contentUpdated = new Subject() protected input = new Subject() protected resize = new ReplaySubject(1) protected dragOver = new Subject() protected drop = new Subject() protected destroyed = new Subject() get ready$ (): Observable { return this.ready } get title$ (): Observable { return this.title } get alternateScreenActive$ (): Observable { return this.alternateScreenActive } get mouseEvent$ (): Observable { return this.mouseEvent } get bell$ (): Observable { return this.bell } get contentUpdated$ (): Observable { return this.contentUpdated } get input$ (): Observable { return this.input } get resize$ (): Observable { return this.resize } get dragOver$ (): Observable { return this.dragOver } get drop$ (): Observable { return this.drop } get destroyed$ (): Observable { return this.destroyed } constructor (protected injector: Injector) { } destroy (): void { this.destroyed.next() for (const o of [ this.ready, this.title, this.alternateScreenActive, this.mouseEvent, this.bell, this.contentUpdated, this.input, this.resize, this.dragOver, this.drop, this.destroyed, ]) { o.complete() } } abstract attach (host: HTMLElement, profile: BaseTerminalProfile): Promise detach (host: HTMLElement): void { } // eslint-disable-line abstract getSelection (): string abstract copySelection (): void abstract selectAll (): void abstract clearSelection (): void abstract focus (): void abstract write (data: string): Promise abstract clear (): void abstract visualBell (): void abstract scrollToTop (): void abstract scrollLines (amount: number): void abstract scrollPages (pages: number): void abstract scrollToBottom (): void abstract configure (profile: BaseTerminalProfile): void abstract setZoom (zoom: number): void abstract findNext (term: string, searchOptions?: SearchOptions): SearchState abstract findPrevious (term: string, searchOptions?: SearchOptions): SearchState abstract cancelSearch (): void abstract saveState (): any abstract restoreState (state: string): void abstract supportsBracketedPaste (): boolean abstract isAlternateScreenActive (): boolean } ================================================ FILE: tabby-terminal/src/frontends/xterm.css ================================================ @import url("../../node_modules/@xterm/xterm/css/xterm.css"); @font-face { font-family: "monospace-fallback"; src: url(../fonts/SourceCodePro.ttf) format("truetype"); } .xterm-decoration-overview-ruler { right: 1px; pointer-events: none; } .xterm-viewport { background: none !important; } ================================================ FILE: tabby-terminal/src/frontends/xtermFrontend.ts ================================================ import deepEqual from 'deep-equal' import { BehaviorSubject, filter, firstValueFrom, takeUntil } from 'rxjs' import { Injector } from '@angular/core' import { ConfigService, getCSSFontFamily, getWindows10Build, HostAppService, HotkeysService, NotificationsService, Platform, PlatformService, ThemesService, TranslateService } from 'tabby-core' import { Frontend, SearchOptions, SearchState } from './frontend' import { Terminal, ITheme } from '@xterm/xterm' import { FitAddon } from '@xterm/addon-fit' import { ClipboardAddon } from '@xterm/addon-clipboard' import { LigaturesAddon } from '@xterm/addon-ligatures' import { ISearchOptions, SearchAddon } from '@xterm/addon-search' import { WebglAddon } from '@xterm/addon-webgl' import { Unicode11Addon } from '@xterm/addon-unicode11' import { SerializeAddon } from '@xterm/addon-serialize' import { ImageAddon } from '@xterm/addon-image' import { CanvasAddon } from '@xterm/addon-canvas' import { BaseTerminalProfile, TerminalColorScheme } from '../api/interfaces' import { getTerminalBackgroundColor } from '../helpers' import './xterm.css' const COLOR_NAMES = [ 'black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'brightBlack', 'brightRed', 'brightGreen', 'brightYellow', 'brightBlue', 'brightMagenta', 'brightCyan', 'brightWhite', ] class FlowControl { private blocked = false private blocked$ = new BehaviorSubject(false) private pendingCallbacks = 0 private lowWatermark = 5 private highWatermark = 10 private bytesWritten = 0 private bytesThreshold = 1024 * 128 constructor (private xterm: Terminal) { } async write (data: string) { if (this.blocked) { await firstValueFrom(this.blocked$.pipe(filter(x => !x))) } this.bytesWritten += data.length if (this.bytesWritten > this.bytesThreshold) { this.pendingCallbacks++ this.bytesWritten = 0 if (!this.blocked && this.pendingCallbacks > this.highWatermark) { this.blocked = true this.blocked$.next(true) } this.xterm.write(data, () => { this.pendingCallbacks-- if (this.blocked && this.pendingCallbacks < this.lowWatermark) { this.blocked = false this.blocked$.next(false) } }) } else { this.xterm.write(data) } } } /** @hidden */ export class XTermFrontend extends Frontend { enableResizing = true xterm: Terminal protected xtermCore: any protected enableWebGL = false private element?: HTMLElement private configuredFontSize = 0 private configuredLinePadding = 0 private zoom = 0 private resizeHandler: () => void private configuredTheme: ITheme = {} private copyOnSelect = false private preventNextOnSelectionChangeEvent = false private search = new SearchAddon() private searchState: SearchState = { resultCount: 0 } private fitAddon = new FitAddon() private serializeAddon = new SerializeAddon() private ligaturesAddon?: LigaturesAddon private webGLAddon?: WebglAddon private canvasAddon?: CanvasAddon private opened = false private resizeObserver?: any private flowControl: FlowControl private configService: ConfigService private hotkeysService: HotkeysService private platformService: PlatformService private hostApp: HostAppService private themes: ThemesService private notifications: NotificationsService private translate: TranslateService constructor (injector: Injector) { super(injector) this.configService = injector.get(ConfigService) this.hotkeysService = injector.get(HotkeysService) this.platformService = injector.get(PlatformService) this.hostApp = injector.get(HostAppService) this.themes = injector.get(ThemesService) this.notifications = injector.get(NotificationsService) this.translate = injector.get(TranslateService) this.xterm = new Terminal({ allowTransparency: true, allowProposedApi: true, overviewRuler: { width: 8, showBottomBorder: false, showTopBorder: false, }, reflowCursorLine: true, windowsPty: process.platform === 'win32' ? { backend: this.configService.store.terminal.useConPTY ? 'conpty' : 'winpty', buildNumber: getWindows10Build(), } : undefined, }) this.flowControl = new FlowControl(this.xterm) this.xtermCore = this.xterm['_core'] this.xterm.onBinary(data => { this.input.next(Buffer.from(data, 'binary')) }) this.xterm.onData(data => { this.input.next(Buffer.from(data, 'utf-8')) }) this.xterm.onResize(({ cols, rows }) => { this.resize.next({ rows, columns: cols }) }) this.xterm.onTitleChange(title => { this.title.next(title) }) this.xterm.onSelectionChange(() => { if (this.getSelection()) { if (this.copyOnSelect && !this.preventNextOnSelectionChangeEvent) { this.copySelection() } this.preventNextOnSelectionChangeEvent = false } }) this.xterm.onBell(() => { this.bell.next() }) this.xterm.loadAddon(this.fitAddon) this.xterm.loadAddon(this.serializeAddon) this.xterm.loadAddon(new Unicode11Addon()) this.xterm.loadAddon(new ClipboardAddon(undefined, { readText: async () => { return this.platformService.readClipboard() }, writeText: async (_, text) => { this.platformService.setClipboard({ text }) this.notifications.notice(this.translate.instant('Copied')) }, })) this.xterm.unicode.activeVersion = '11' if (this.configService.store.terminal.sixel) { this.xterm.loadAddon(new ImageAddon()) } const keyboardEventHandler = (name: string, event: KeyboardEvent) => { if (this.isAlternateScreenActive()) { let modifiers = 0 modifiers += event.ctrlKey ? 1 : 0 modifiers += event.altKey ? 1 : 0 modifiers += event.shiftKey ? 1 : 0 modifiers += event.metaKey ? 1 : 0 if (event.key.startsWith('Arrow') && modifiers === 1) { return true } } // Ctrl-/ if (event.type === 'keydown' && event.key === '/' && event.ctrlKey) { this.input.next(Buffer.from('\u001f', 'binary')) return false } // Ctrl-@ if (event.type === 'keydown' && event.key === '@' && event.ctrlKey) { this.input.next(Buffer.from('\u0000', 'binary')) return false } this.hotkeysService.pushKeyEvent(name, event) let ret = true if (this.hotkeysService.matchActiveHotkey(true) !== null) { event.stopPropagation() event.preventDefault() ret = false } return ret } this.xterm.attachCustomKeyEventHandler((event: KeyboardEvent) => { if (this.hostApp.platform !== Platform.Web) { if ( event.getModifierState('Meta') && event.key.toLowerCase() === 'v' || event.key === 'Insert' && event.shiftKey ) { event.preventDefault() return false } } if (event.getModifierState('Meta') && event.key.startsWith('Arrow')) { return false } return keyboardEventHandler('keydown', event) }) this.xtermCore._scrollToBottom = this.xtermCore.scrollToBottom.bind(this.xtermCore) this.xtermCore.scrollToBottom = () => null this.resizeHandler = () => { try { if (this.xterm.element && getComputedStyle(this.xterm.element).getPropertyValue('height') !== 'auto') { this.fitAddon.fit() this.xterm.refresh(0, this.xterm.rows - 1) } } catch (e) { // tends to throw when element wasn't shown yet console.warn('Could not resize xterm', e) } } const oldKeyUp = this.xtermCore._keyUp.bind(this.xtermCore) this.xtermCore._keyUp = (e: KeyboardEvent) => { this.xtermCore.updateCursorStyle(e) if (keyboardEventHandler('keyup', e)) { oldKeyUp(e) } } this.xterm.buffer.onBufferChange(() => { const altBufferActive = this.xterm.buffer.active.type === 'alternate' this.alternateScreenActive.next(altBufferActive) }) } async attach (host: HTMLElement, profile: BaseTerminalProfile): Promise { this.element = host this.xterm.open(host) this.opened = true // Work around font loading bugs await new Promise(resolve => setTimeout(resolve, this.hostApp.platform === Platform.Web ? 1000 : 0)) // Just configure the colors to avoid a flash this.configureColors(profile.terminalColorScheme) if (this.enableWebGL) { this.webGLAddon = new WebglAddon() this.xterm.loadAddon(this.webGLAddon) this.platformService.displayMetricsChanged$.pipe( takeUntil(this.destroyed$), ).subscribe(() => { this.webGLAddon?.clearTextureAtlas() }) } else { this.canvasAddon = new CanvasAddon() this.xterm.loadAddon(this.canvasAddon) this.platformService.displayMetricsChanged$.pipe( takeUntil(this.destroyed$), ).subscribe(() => { this.canvasAddon?.clearTextureAtlas() }) } // Allow an animation frame await new Promise(r => setTimeout(r, 100)) this.ready.next() this.ready.complete() this.xterm.loadAddon(this.search) this.search.onDidChangeResults(state => { this.searchState = state }) window.addEventListener('resize', this.resizeHandler) this.resizeHandler() // Allow an animation frame await new Promise(r => setTimeout(r, 0)) host.addEventListener('dragOver', (event: any) => this.dragOver.next(event)) host.addEventListener('drop', event => this.drop.next(event)) host.addEventListener('mousedown', event => this.mouseEvent.next(event)) host.addEventListener('mouseup', event => this.mouseEvent.next(event)) host.addEventListener('mousewheel', event => this.mouseEvent.next(event as MouseEvent)) host.addEventListener('contextmenu', event => { event.preventDefault() event.stopPropagation() }) this.resizeObserver = new window['ResizeObserver'](() => setTimeout(() => this.resizeHandler())) this.resizeObserver.observe(host) } detach (_host: HTMLElement): void { window.removeEventListener('resize', this.resizeHandler) this.resizeObserver?.disconnect() delete this.resizeObserver } destroy (): void { super.destroy() this.webGLAddon?.dispose() this.canvasAddon?.dispose() this.xterm.dispose() } getSelection (): string { return this.xterm.getSelection() } copySelection (): void { const text = this.getSelection() if (!text.trim().length) { return } if (text.length < 1024 * 32 && this.configService.store.terminal.copyAsHTML) { this.platformService.setClipboard({ text: this.getSelection(), html: this.getSelectionAsHTML(), }) } else { this.platformService.setClipboard({ text: this.getSelection(), }) } } selectAll (): void { this.xterm.selectAll() } clearSelection (): void { this.xterm.clearSelection() } focus (): void { setTimeout(() => this.xterm.focus()) } async write (data: string): Promise { await this.flowControl.write(data) } clear (): void { this.xterm.clear() } visualBell (): void { if (this.element) { this.element.style.animation = 'none' setTimeout(() => { this.element!.style.animation = 'terminalShakeFrames 0.3s ease' }) } } scrollToTop (): void { this.xterm.scrollToTop() } scrollPages (pages: number): void { this.xterm.scrollPages(pages) } scrollLines (amount: number): void { this.xterm.scrollLines(amount) } scrollToBottom (): void { this.xtermCore._scrollToBottom() } private configureColors (scheme: TerminalColorScheme | null): void { const appColorScheme = this.themes._getActiveColorScheme() as TerminalColorScheme scheme = scheme ?? appColorScheme const theme: ITheme = { foreground: scheme.foreground, selectionBackground: scheme.selection ?? '#88888888', selectionForeground: scheme.selectionForeground ?? undefined, background: getTerminalBackgroundColor(this.configService, this.themes, scheme) ?? '#00000000', cursor: scheme.cursor, cursorAccent: scheme.cursorAccent, overviewRulerBorder: scheme.background, } for (let i = 0; i < COLOR_NAMES.length; i++) { theme[COLOR_NAMES[i]] = scheme.colors[i] } theme.scrollbarSliderBackground = theme.brightBlack theme.scrollbarSliderHoverBackground = theme.brightBlack theme.scrollbarSliderHoverBackground = theme.brightBlack if (!deepEqual(this.configuredTheme, theme)) { this.xterm.options.theme = theme this.configuredTheme = theme } } configure (profile: BaseTerminalProfile): void { const config = this.configService.store setImmediate(() => { if (this.xterm.cols && this.xterm.rows && this.xtermCore.charMeasure) { if (this.xtermCore.charMeasure) { this.xtermCore.charMeasure.measure(this.xtermCore.options) } if (this.xtermCore.renderer) { this.xtermCore.renderer._updateDimensions() } this.resizeHandler() } }) this.xtermCore.browser = { ...this.xtermCore.browser, isWindows: this.hostApp.platform === Platform.Windows, isLinux: this.hostApp.platform === Platform.Linux, isMac: this.hostApp.platform === Platform.macOS, } this.xterm.options.fontFamily = getCSSFontFamily(config) this.xterm.options.cursorStyle = { beam: 'bar', }[config.terminal.cursor] || config.terminal.cursor this.xterm.options.cursorBlink = config.terminal.cursorBlink this.xterm.options.macOptionIsMeta = config.terminal.altIsMeta this.xterm.options.scrollback = config.terminal.scrollbackLines this.xterm.options.wordSeparator = config.terminal.wordSeparator this.xterm.options.drawBoldTextInBrightColors = config.terminal.drawBoldTextInBrightColors this.xterm.options.fontWeight = config.terminal.fontWeight this.xterm.options.fontWeightBold = config.terminal.fontWeightBold this.xterm.options.minimumContrastRatio = config.terminal.minimumContrastRatio this.configuredFontSize = config.terminal.fontSize this.configuredLinePadding = config.terminal.linePadding this.setFontSize() this.copyOnSelect = config.terminal.copyOnSelect this.configureColors(profile.terminalColorScheme) if (this.opened && config.terminal.ligatures && !this.ligaturesAddon && this.hostApp.platform !== Platform.Web) { this.ligaturesAddon = new LigaturesAddon() this.xterm.loadAddon(this.ligaturesAddon) } } setZoom (zoom: number): void { this.zoom = zoom this.setFontSize() this.resizeHandler() } private getSearchOptions (searchOptions?: SearchOptions): ISearchOptions { return { ...searchOptions, decorations: { matchOverviewRuler: '#888888', activeMatchColorOverviewRuler: '#ffff00', matchBackground: '#888888', activeMatchBackground: '#ffff00', }, } } private wrapSearchResult (result: boolean): SearchState { if (!result) { return { resultCount: 0 } } return this.searchState } findNext (term: string, searchOptions?: SearchOptions): SearchState { if (this.copyOnSelect) { this.preventNextOnSelectionChangeEvent = true } return this.wrapSearchResult( this.search.findNext(term, this.getSearchOptions(searchOptions)), ) } findPrevious (term: string, searchOptions?: SearchOptions): SearchState { if (this.copyOnSelect) { this.preventNextOnSelectionChangeEvent = true } return this.wrapSearchResult( this.search.findPrevious(term, this.getSearchOptions(searchOptions)), ) } cancelSearch (): void { this.search.clearDecorations() this.focus() } saveState (): any { return this.serializeAddon.serialize({ excludeAltBuffer: true, excludeModes: true, scrollback: 1000, }) } restoreState (state: string): void { this.xterm.write(state) } supportsBracketedPaste (): boolean { return this.xterm.modes.bracketedPasteMode } isAlternateScreenActive (): boolean { return this.xterm.buffer.active.type === 'alternate' } private setFontSize () { const scale = Math.pow(1.1, this.zoom) this.xterm.options.fontSize = this.configuredFontSize * scale // eslint-disable-next-line @typescript-eslint/restrict-plus-operands this.xterm.options.lineHeight = Math.max(1, (this.configuredFontSize + this.configuredLinePadding * 2) / this.configuredFontSize) this.resizeHandler() } private getSelectionAsHTML (): string { return this.serializeAddon.serializeAsHTML({ includeGlobalBackground: true, onlySelection: true }) } } /** @hidden */ export class XTermWebGLFrontend extends XTermFrontend { protected enableWebGL = true } ================================================ FILE: tabby-terminal/src/helpers.ts ================================================ import { TerminalColorScheme } from './api/interfaces' import { ConfigService, ThemesService } from 'tabby-core' export function getTerminalBackgroundColor ( config: ConfigService, themes: ThemesService, scheme: TerminalColorScheme | null, ): string|null { const appTheme = themes.findCurrentTheme() const appColorScheme = themes._getActiveColorScheme() as TerminalColorScheme // Use non transparent background when: // - legacy theme and user choses colorScheme based BG // - or new theme but profile-specific scheme is used const shouldUseCSBackground = !appTheme.followsColorScheme && config.store.terminal.background === 'colorScheme' // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition || appTheme.followsColorScheme && scheme?.name !== appColorScheme.name return shouldUseCSBackground && scheme ? scheme.background : null } ================================================ FILE: tabby-terminal/src/hotkeys.ts ================================================ import { Injectable } from '@angular/core' import { HotkeyDescription, HotkeyProvider, TranslateService } from 'tabby-core' /** @hidden */ @Injectable() export class TerminalHotkeyProvider extends HotkeyProvider { hotkeys: HotkeyDescription[] = [ { id: 'copy', name: this.translate.instant('Copy to clipboard'), }, { id: 'paste', name: this.translate.instant('Paste from clipboard'), }, { id: 'select-all', name: this.translate.instant('Select all'), }, { id: 'home', name: this.translate.instant('Beginning of the line'), }, { id: 'end', name: this.translate.instant('End of the line'), }, { id: 'previous-word', name: this.translate.instant('Jump to previous word'), }, { id: 'next-word', name: this.translate.instant('Jump to next word'), }, { id: 'delete-previous-word', name: this.translate.instant('Delete previous word'), }, { id: 'delete-line', name: this.translate.instant('Delete entire line'), }, { id: 'delete-next-word', name: this.translate.instant('Delete next word'), }, { id: 'clear', name: this.translate.instant('Clear terminal'), }, { id: 'zoom-in', name: this.translate.instant('Zoom in'), }, { id: 'zoom-out', name: this.translate.instant('Zoom out'), }, { id: 'reset-zoom', name: this.translate.instant('Reset zoom'), }, { id: 'ctrl-c', name: this.translate.instant('Intelligent Ctrl-C (copy/abort)'), }, { id: 'copy-current-path', name: this.translate.instant('Copy current path'), }, { id: 'search', name: this.translate.instant('Search'), }, { id: 'pane-focus-all', name: this.translate.instant('Focus all panes at once (broadcast)'), }, { id: 'focus-all-tabs', name: this.translate.instant('Focus all tabs at once (broadcast)'), }, { id: 'scroll-to-top', name: this.translate.instant('Scroll terminal to top'), }, { id: 'scroll-page-up', name: this.translate.instant('Scroll terminal one page up'), }, { id: 'scroll-up', name: this.translate.instant('Scroll terminal one line up'), }, { id: 'scroll-down', name: this.translate.instant('Scroll terminal one line down'), }, { id: 'scroll-page-down', name: this.translate.instant('Scroll terminal one page down'), }, { id: 'scroll-to-bottom', name: this.translate.instant('Scroll terminal to bottom'), }, { id: 'reconnect-tab', name: this.translate.instant('Reconnect current tab (Serial/Telnet/SSH)'), }, { id: 'disconnect-tab', name: this.translate.instant('Disconnect current tab (Serial/Telnet/SSH)'), }, ] constructor (private translate: TranslateService) { super() } async provide (): Promise { return this.hotkeys } } ================================================ FILE: tabby-terminal/src/index.ts ================================================ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { FormsModule } from '@angular/forms' import { NgbModule } from '@ng-bootstrap/ng-bootstrap' import { ToastrModule } from 'ngx-toastr' import { NgxColorsModule } from 'ngx-colors' import TabbyCorePlugin, { ConfigProvider, HotkeyProvider, TabContextMenuItemProvider, CLIHandler } from 'tabby-core' import { SettingsTabProvider } from 'tabby-settings' import { AppearanceSettingsTabComponent } from './components/appearanceSettingsTab.component' import { ColorSchemeSettingsTabComponent } from './components/colorSchemeSettingsTab.component' import { TerminalSettingsTabComponent } from './components/terminalSettingsTab.component' import { ColorPickerComponent } from './components/colorPicker.component' import { ColorSchemePreviewComponent } from './components/colorSchemePreview.component' import { SearchPanelComponent } from './components/searchPanel.component' import { StreamProcessingSettingsComponent } from './components/streamProcessingSettings.component' import { LoginScriptsSettingsComponent } from './components/loginScriptsSettings.component' import { TerminalToolbarComponent } from './components/terminalToolbar.component' import { ColorSchemeSelectorComponent } from './components/colorSchemeSelector.component' import { InputProcessingSettingsComponent } from './components/inputProcessingSettings.component' import { ColorSchemeSettingsForModeComponent } from './components/colorSchemeSettingsForMode.component' import { TerminalDecorator } from './api/decorator' import { TerminalContextMenuItemProvider } from './api/contextMenuProvider' import { TerminalColorSchemeProvider } from './api/colorSchemeProvider' import { TerminalSettingsTabProvider, AppearanceSettingsTabProvider, ColorSchemeSettingsTabProvider } from './settings' import { DebugDecorator } from './features/debug' import { ZModemDecorator } from './features/zmodem' import { TerminalConfigProvider } from './config' import { TerminalHotkeyProvider } from './hotkeys' import { CopyPasteContextMenu, MiscContextMenu, LegacyContextMenu, ReconnectContextMenu, SaveAsProfileContextMenu } from './tabContextMenu' import { Frontend } from './frontends/frontend' import { XTermFrontend, XTermWebGLFrontend } from './frontends/xtermFrontend' import { TerminalCLIHandler } from './cli' import { DefaultColorSchemes } from './colorSchemes' /** @hidden */ @NgModule({ imports: [ CommonModule, FormsModule, NgbModule, ToastrModule, TabbyCorePlugin, NgxColorsModule, ], providers: [ { provide: SettingsTabProvider, useClass: AppearanceSettingsTabProvider, multi: true }, { provide: SettingsTabProvider, useClass: ColorSchemeSettingsTabProvider, multi: true }, { provide: SettingsTabProvider, useClass: TerminalSettingsTabProvider, multi: true }, { provide: ConfigProvider, useClass: TerminalConfigProvider, multi: true }, { provide: HotkeyProvider, useClass: TerminalHotkeyProvider, multi: true }, { provide: TerminalDecorator, useClass: ZModemDecorator, multi: true }, { provide: TerminalDecorator, useClass: DebugDecorator, multi: true }, { provide: TabContextMenuItemProvider, useClass: CopyPasteContextMenu, multi: true }, { provide: TabContextMenuItemProvider, useClass: MiscContextMenu, multi: true }, { provide: TabContextMenuItemProvider, useClass: LegacyContextMenu, multi: true }, { provide: TabContextMenuItemProvider, useClass: ReconnectContextMenu, multi: true }, { provide: TabContextMenuItemProvider, useClass: SaveAsProfileContextMenu, multi: true }, { provide: CLIHandler, useClass: TerminalCLIHandler, multi: true }, { provide: TerminalColorSchemeProvider, useClass: DefaultColorSchemes, multi: true }, ], declarations: [ ColorPickerComponent, ColorSchemePreviewComponent, ColorSchemeSelectorComponent, AppearanceSettingsTabComponent, ColorSchemeSettingsTabComponent, TerminalSettingsTabComponent, SearchPanelComponent, StreamProcessingSettingsComponent, LoginScriptsSettingsComponent, TerminalToolbarComponent, InputProcessingSettingsComponent, ColorSchemeSettingsForModeComponent, ], exports: [ ColorPickerComponent, ColorSchemeSelectorComponent, SearchPanelComponent, StreamProcessingSettingsComponent, LoginScriptsSettingsComponent, TerminalToolbarComponent, InputProcessingSettingsComponent, ], }) export default class TerminalModule { } // eslint-disable-line @typescript-eslint/no-extraneous-class export { TerminalDecorator, TerminalContextMenuItemProvider, TerminalColorSchemeProvider } export { Frontend, XTermFrontend, XTermWebGLFrontend } export { BaseTerminalTabComponent } from './api/baseTerminalTab.component' export { ConnectableTerminalTabComponent } from './api/connectableTerminalTab.component' export * from './api/interfaces' export * from './middleware/streamProcessing' export * from './middleware/loginScriptProcessing' export * from './middleware/oscProcessing' export * from './middleware/utf8Splitter' export * from './middleware/inputProcessing' export * from './api/middleware' export * from './session' export { LoginScriptsSettingsComponent, StreamProcessingSettingsComponent } export { MultifocusService } from './services/multifocus.service' ================================================ FILE: tabby-terminal/src/middleware/inputProcessing.ts ================================================ import { SessionMiddleware } from '../api/middleware' export interface InputProcessingOptions { backspace: 'ctrl-h'|'ctrl-?'|'delete'|'backspace' } export class InputProcessor extends SessionMiddleware { constructor ( private options: InputProcessingOptions, ) { super() } feedFromTerminal (data: Buffer): void { if (data.length === 1 && data[0] === 0x7f) { if (this.options.backspace === 'ctrl-h') { data = Buffer.from('\x08') } else if (this.options.backspace === 'ctrl-?') { data = Buffer.from('\x7f') } else if (this.options.backspace === 'delete') { data = Buffer.from('\x1b[3~') } else { data = Buffer.from('\x7f') } } this.outputToSession.next(data) } } ================================================ FILE: tabby-terminal/src/middleware/loginScriptProcessing.ts ================================================ import deepClone from 'clone-deep' import { Logger } from 'tabby-core' import { SessionMiddleware } from '../api/middleware' export interface LoginScript { expect: string send: string isRegex?: boolean optional?: boolean } export interface LoginScriptsOptions { scripts: LoginScript[] } export class LoginScriptProcessor extends SessionMiddleware { private remainingScripts: LoginScript[] = [] private escapeSeqMap = { a: '\x07', b: '\x08', e: '\x1b', f: '\x0c', n: '\x0a', r: '\x0d', t: '\x09', v: '\x0b', } constructor ( private logger: Logger, options: LoginScriptsOptions, ) { super() this.remainingScripts = deepClone(options.scripts) for (const script of this.remainingScripts) { if (!script.isRegex) { script.expect = this.unescape(script.expect) } script.send = this.unescape(script.send) } } feedFromSession (data: Buffer): void { const dataString = data.toString() for (const script of this.remainingScripts) { if (!script.expect) { continue } let match = false if (script.isRegex) { const re = new RegExp(script.expect, 'g') match = re.test(dataString) } else { match = dataString.includes(script.expect) } if (match) { this.logger.info('Executing script:', script) this.outputToSession.next(Buffer.from(script.send + '\n')) this.remainingScripts = this.remainingScripts.filter(x => x !== script) } else { if (script.optional) { this.logger.debug('Skip optional script: ' + script.expect) this.remainingScripts = this.remainingScripts.filter(x => x !== script) } else { break } } } super.feedFromSession(data) } executeUnconditionalScripts (): void { for (const script of this.remainingScripts) { if (!script.expect) { this.logger.info('Executing script:', script.send) this.outputToSession.next(Buffer.from(script.send + '\n')) this.remainingScripts = this.remainingScripts.filter(x => x !== script) } else { break } } } unescape (line: string): string { line = line.replace(/\\((x\d{2})|(u\d{4}))/g, (match, g) => { return String.fromCharCode(parseInt(g.substr(1), 16)) }) return line.replace(/\\(.)/g, (match, g) => { return this.escapeSeqMap[g] || g }) } } ================================================ FILE: tabby-terminal/src/middleware/oscProcessing.ts ================================================ import * as os from 'os' import { Subject, Observable } from 'rxjs' import { SessionMiddleware } from '../api/middleware' const OSCPrefix = Buffer.from('\x1b]') const OSCSuffixes = [Buffer.from('\x07'), Buffer.from('\x1b\\')] export class OSCProcessor extends SessionMiddleware { get cwdReported$ (): Observable { return this.cwdReported } private cwdReported = new Subject() feedFromSession (data: Buffer): void { let startIndex = 0 while (data.includes(OSCPrefix, startIndex)) { const si = startIndex if (!OSCSuffixes.some(s => data.includes(s, si))) { break } const params = data.subarray(data.indexOf(OSCPrefix, startIndex) + OSCPrefix.length) const [closesSuffix, closestSuffixIndex] = OSCSuffixes .map((suffix): [Buffer, number] => [suffix, params.indexOf(suffix)]) .filter(([_, index]) => index !== -1) .sort(([_, a], [__, b]) => a - b)[0] const oscString = params.subarray(0, closestSuffixIndex).toString() startIndex = data.indexOf(closesSuffix, startIndex) + closesSuffix.length const [oscCodeString, ...oscParams] = oscString.split(';') const oscCode = parseInt(oscCodeString) if (oscCode === 1337) { const paramString = oscParams.join(';') if (paramString.startsWith('CurrentDir=')) { let reportedCWD = paramString.split('=')[1] if (reportedCWD.startsWith('~')) { reportedCWD = os.homedir() + reportedCWD.substring(1) } this.cwdReported.next(reportedCWD) } else { console.debug('Unsupported OSC 1337 parameter:', paramString) } } else { continue } } super.feedFromSession(data) } close (): void { this.cwdReported.complete() super.close() } } ================================================ FILE: tabby-terminal/src/middleware/streamProcessing.ts ================================================ import hexdump from 'hexer' import bufferReplace from 'buffer-replace' import colors from 'ansi-colors' import binstring from 'binstring' import { interval, debounce } from 'rxjs' import { PassThrough, Readable, Writable } from 'stream' import { ReadLine, createInterface as createReadline, clearLine } from 'readline' import { SessionMiddleware } from '../api/middleware' export type InputMode = null | 'local-echo' | 'readline' | 'readline-hex' export type OutputMode = null | 'hex' export type NewlineMode = null | 'cr' | 'lf' | 'crlf' | 'implicit_cr' | 'implicit_lf' export interface StreamProcessingOptions { inputMode: InputMode inputNewlines: NewlineMode outputMode: OutputMode outputNewlines: NewlineMode } export class TerminalStreamProcessor extends SessionMiddleware { forceEcho = false private inputReadline: ReadLine|null = null private inputPromptVisible = false private inputReadlineInStream: Readable & Writable private inputReadlineOutStream: Readable & Writable private started = false constructor (private options: StreamProcessingOptions) { super() this.inputReadlineInStream = new PassThrough() this.inputReadlineOutStream = new PassThrough() this.inputReadlineOutStream.on('data', data => { this.outputToTerminal.next(Buffer.from(data)) }) this.outputToTerminal$.pipe(debounce(() => interval(500))).subscribe(() => { if (this.started) { this.onOutputSettled() } }) } start (): void { this.inputReadline = createReadline({ input: this.inputReadlineInStream, output: this.inputReadlineOutStream, terminal: true, prompt: this.options.inputMode === 'readline-hex' ? 'hex> ' : '> ', }) this.inputReadline.on('line', line => { this.onTerminalInput(Buffer.from(line + '\n')) this.resetInputPrompt() }) this.started = true } feedFromSession (data: Buffer): void { if (this.options.inputMode?.startsWith('readline')) { if (this.inputPromptVisible) { clearLine(this.inputReadlineOutStream, 0) this.outputToTerminal.next(Buffer.from('\r')) this.inputPromptVisible = false } } data = this.replaceNewlines(data, this.options.outputNewlines) if (this.options.outputMode === 'hex') { this.outputToTerminal.next(Buffer.concat([ Buffer.from('\r\n'), Buffer.from(hexdump(data, { group: 1, gutter: 4, divide: colors.gray(' | '), emptyHuman: colors.gray('╳'), }).replaceAll('\n', '\r\n')), Buffer.from('\r\n\n'), ])) } else { this.outputToTerminal.next(data) } } feedFromTerminal (data: Buffer): void { if (this.options.inputMode === 'local-echo' || this.forceEcho) { this.outputToTerminal.next(this.replaceNewlines(data, 'crlf')) } if (this.options.inputMode?.startsWith('readline')) { this.inputReadlineInStream.write(data) } else { this.onTerminalInput(data) } } resize (): void { if (this.options.inputMode?.startsWith('readline')) { this.inputReadlineOutStream.emit('resize') } } close (): void { this.inputReadline?.close() super.close() } private onTerminalInput (data: Buffer) { if (this.options.inputMode === 'readline-hex') { const tokens = data.toString().split(/\s/g) data = Buffer.concat(tokens.filter(t => !!t).map(t => { if (t.startsWith('0x')) { t = t.substring(2) } return binstring(t, { 'in': 'hex' }) })) } data = this.replaceNewlines(data, this.options.inputNewlines) this.outputToSession.next(data) } private onOutputSettled () { if (this.options.inputMode?.startsWith('readline') && !this.inputPromptVisible) { this.resetInputPrompt() } } private resetInputPrompt () { this.outputToTerminal.next(Buffer.from('\r\n')) this.inputReadline?.prompt(true) this.inputPromptVisible = true } private replaceNewlines (data: Buffer, mode?: NewlineMode): Buffer { if (!mode) { return data } else if (mode === 'implicit_cr') { return bufferReplace(data, '\n', '\r\n') } else if (mode === 'implicit_lf') { return bufferReplace(data, '\r', '\r\n') } data = bufferReplace(data, '\r\n', '\n') data = bufferReplace(data, '\r', '\n') const replacement = { strip: '', cr: '\r', lf: '\n', crlf: '\r\n', }[mode] return bufferReplace(data, '\n', replacement) } } ================================================ FILE: tabby-terminal/src/middleware/utf8Splitter.ts ================================================ import { UTF8Splitter } from 'tabby-core' import { SessionMiddleware } from '../api/middleware' /** * Ensures that the session output is chunked at UTF8 character boundaries. */ export class UTF8SplitterMiddleware extends SessionMiddleware { private decoder = new UTF8Splitter() feedFromSession (data: Buffer): void { super.feedFromSession(this.decoder.write(data)) } close (): void { const remainder = this.decoder.flush() if (remainder.length) { super.feedFromSession(remainder) } super.close() } } ================================================ FILE: tabby-terminal/src/services/multifocus.service.ts ================================================ import { Injectable } from '@angular/core' import { BaseTerminalTabComponent } from '../api/baseTerminalTab.component' import { Subscription } from 'rxjs' import { SplitTabComponent, TranslateService, AppService, HotkeysService } from 'tabby-core' @Injectable({ providedIn: 'root' }) export class MultifocusService { private inputSubscription: Subscription|null = null private currentTab: BaseTerminalTabComponent|null = null private warningElement: HTMLElement constructor ( private app: AppService, hotkeys: HotkeysService, translate: TranslateService, ) { this.warningElement = document.createElement('div') this.warningElement.className = 'broadcast-status-warning' this.warningElement.innerText = translate.instant('Broadcast mode. Click anywhere to cancel.') this.warningElement.style.display = 'none' document.body.appendChild(this.warningElement) hotkeys.hotkey$.subscribe(hotkey => { switch (hotkey) { case 'focus-all-tabs': this.focusAllTabs() break case 'pane-focus-all': this.focusAllPanes() break } }) } start (currentTab: BaseTerminalTabComponent, tabs: BaseTerminalTabComponent[]): void { if (this.inputSubscription) { return } if (currentTab.parent instanceof SplitTabComponent) { const parent = currentTab.parent parent._allFocusMode = true parent.layout() } this.currentTab = currentTab this.inputSubscription = currentTab.frontend?.input$.subscribe(data => { for (const tab of tabs) { if (tab !== currentTab) { tab.sendInput(data) } } }) ?? null } cancel (): void { this.warningElement.style.display = 'none' document.querySelector('app-root')!['style'].border = 'none' if (!this.inputSubscription) { return } this.inputSubscription.unsubscribe() this.inputSubscription = null if (this.currentTab?.parent instanceof SplitTabComponent) { this.currentTab.parent._allFocusMode = false this.currentTab.parent.layout() } this.currentTab = null } focusAllTabs (): void { let currentTab = this.app.activeTab if (currentTab && currentTab instanceof SplitTabComponent) { currentTab = currentTab.getFocusedTab() } if (!currentTab || !(currentTab instanceof BaseTerminalTabComponent)) { return } const tabs = this.app.tabs .map((t => { if (t instanceof BaseTerminalTabComponent) { return [t] } else if (t instanceof SplitTabComponent) { return t.getAllTabs() .filter(x => x instanceof BaseTerminalTabComponent) } else { return [] } }) as (_) => BaseTerminalTabComponent[]) .flat() this.start(currentTab, tabs) this.warningElement.style.display = 'block' document.querySelector('app-root')!['style'].border = '5px solid red' } focusAllPanes (): void { const currentTab = this.app.activeTab if (!currentTab || !(currentTab instanceof SplitTabComponent)) { return } const pane = currentTab.getFocusedTab() if (!pane || !(pane instanceof BaseTerminalTabComponent)) { return } const tabs = currentTab.getAllTabs().filter(t => t instanceof BaseTerminalTabComponent) // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion this.start(pane, tabs as any) } } ================================================ FILE: tabby-terminal/src/session.ts ================================================ import { Observable, Subject } from 'rxjs' import { Logger } from 'tabby-core' import { LoginScriptProcessor, LoginScriptsOptions } from './middleware/loginScriptProcessing' import { OSCProcessor } from './middleware/oscProcessing' import { SessionMiddlewareStack } from './api/middleware' /** * A session object for a [[BaseTerminalTabComponent]] * Extend this to implement custom I/O and process management for your terminal tab */ export abstract class BaseSession { open: boolean readonly oscProcessor = new OSCProcessor() readonly middleware = new SessionMiddlewareStack() protected output = new Subject() protected binaryOutput = new Subject() protected closed = new Subject() protected destroyed = new Subject() protected loginScriptProcessor: LoginScriptProcessor | null = null protected reportedCWD?: string private initialDataBuffer = Buffer.from('') private initialDataBufferReleased = false get output$ (): Observable { return this.output } get binaryOutput$ (): Observable { return this.binaryOutput } get closed$ (): Observable { return this.closed } get destroyed$ (): Observable { return this.destroyed } constructor (protected logger: Logger) { this.middleware.push(this.oscProcessor) this.oscProcessor.cwdReported$.subscribe(cwd => { this.reportedCWD = cwd }) this.middleware.outputToTerminal$.subscribe(data => { if (!this.initialDataBufferReleased) { this.initialDataBuffer = Buffer.concat([this.initialDataBuffer, data]) } else { this.output.next(data.toString()) this.binaryOutput.next(data) } }) this.middleware.outputToSession$.subscribe(data => this.write(data)) } feedFromTerminal (data: Buffer): void { this.middleware.feedFromTerminal(data) } protected emitOutput (data: Buffer): void { this.middleware.feedFromSession(data) } releaseInitialDataBuffer (): void { this.initialDataBufferReleased = true this.output.next(this.initialDataBuffer.toString()) this.binaryOutput.next(this.initialDataBuffer) this.initialDataBuffer = Buffer.from('') } setLoginScriptsOptions (options: LoginScriptsOptions): void { const newProcessor = new LoginScriptProcessor(this.logger, options) if (this.loginScriptProcessor) { this.middleware.replace(this.loginScriptProcessor, newProcessor) } else { this.middleware.push(newProcessor) } this.loginScriptProcessor = newProcessor } async destroy (): Promise { if (this.open) { this.logger.info('Destroying') this.open = false this.closed.next() this.destroyed.next() await this.gracefullyKillProcess() } this.middleware.close() this.closed.complete() this.destroyed.complete() this.output.complete() this.binaryOutput.complete() } abstract start (options: unknown): Promise abstract resize (columns: number, rows: number): void abstract write (data: Buffer): void abstract kill (signal?: string): void abstract gracefullyKillProcess (): Promise abstract supportsWorkingDirectory (): boolean abstract getWorkingDirectory (): Promise } ================================================ FILE: tabby-terminal/src/settings.ts ================================================ import { Injectable } from '@angular/core' import { SettingsTabProvider } from 'tabby-settings' import { AppearanceSettingsTabComponent } from './components/appearanceSettingsTab.component' import { TerminalSettingsTabComponent } from './components/terminalSettingsTab.component' import { ColorSchemeSettingsTabComponent } from './components/colorSchemeSettingsTab.component' import { TranslateService } from 'tabby-core' /** @hidden */ @Injectable() export class AppearanceSettingsTabProvider extends SettingsTabProvider { id = 'terminal-appearance' icon = 'swatchbook' title = this.translate.instant('Appearance') prioritized = true constructor (private translate: TranslateService) { super() } getComponentType (): any { return AppearanceSettingsTabComponent } } /** @hidden */ @Injectable() export class ColorSchemeSettingsTabProvider extends SettingsTabProvider { id = 'terminal-color-scheme' icon = 'palette' title = this.translate.instant('Color scheme') constructor (private translate: TranslateService) { super() } getComponentType (): any { return ColorSchemeSettingsTabComponent } } /** @hidden */ @Injectable() export class TerminalSettingsTabProvider extends SettingsTabProvider { id = 'terminal' icon = 'terminal' title = this.translate.instant('Terminal') prioritized = true constructor (private translate: TranslateService) { super() } getComponentType (): any { return TerminalSettingsTabComponent } } ================================================ FILE: tabby-terminal/src/tabContextMenu.ts ================================================ import { Injectable, Optional, Inject } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { BaseTabComponent, TabContextMenuItemProvider, NotificationsService, MenuItemOptions, TranslateService, SplitTabComponent, PromptModalComponent, ConfigService, PartialProfile, Profile } from 'tabby-core' import { BaseTerminalTabComponent } from './api/baseTerminalTab.component' import { TerminalContextMenuItemProvider } from './api/contextMenuProvider' import { MultifocusService } from './services/multifocus.service' import { ConnectableTerminalTabComponent } from './api/connectableTerminalTab.component' import { v4 as uuidv4 } from 'uuid' import slugify from 'slugify' /** @hidden */ @Injectable() export class CopyPasteContextMenu extends TabContextMenuItemProvider { weight = -10 constructor ( private notifications: NotificationsService, private translate: TranslateService, ) { super() } async getItems (tab: BaseTabComponent, tabHeader?: boolean): Promise { if (tabHeader) { return [] } if (tab instanceof BaseTerminalTabComponent) { return [ { label: this.translate.instant('Copy'), click: (): void => { setTimeout(() => { tab.frontend?.copySelection() this.notifications.notice(this.translate.instant('Copied')) }) }, }, { label: this.translate.instant('Paste'), click: () => tab.paste(), }, ] } return [] } } /** @hidden */ @Injectable() export class MiscContextMenu extends TabContextMenuItemProvider { weight = 1 constructor ( private translate: TranslateService, private multifocus: MultifocusService, ) { super() } async getItems (tab: BaseTabComponent): Promise { const items: MenuItemOptions[] = [] if (tab instanceof BaseTerminalTabComponent && tab.enableToolbar && !tab.pinToolbar) { items.push({ label: this.translate.instant('Show toolbar'), click: () => { tab.pinToolbar = true }, }) } if (tab instanceof BaseTerminalTabComponent && tab.session?.supportsWorkingDirectory()) { items.push({ label: this.translate.instant('Copy current path'), click: () => tab.copyCurrentPath(), }) } items.push({ label: this.translate.instant('Focus all tabs'), click: () => { this.multifocus.focusAllTabs() }, }) if (tab.parent instanceof SplitTabComponent && tab.parent.getAllTabs().length > 1) { items.push({ label: this.translate.instant('Focus all panes'), click: () => { this.multifocus.focusAllPanes() }, }) } return items } } /** @hidden */ @Injectable() export class ReconnectContextMenu extends TabContextMenuItemProvider { weight = 1 constructor ( private translate: TranslateService, private notifications: NotificationsService, ) { super() } async getItems (tab: BaseTabComponent): Promise { if (tab instanceof ConnectableTerminalTabComponent) { return [ { label: this.translate.instant('Disconnect'), click: (): void => { setTimeout(() => { tab.disconnect() this.notifications.notice(this.translate.instant('Disconnect')) }) }, }, { label: this.translate.instant('Reconnect'), click: (): void => { setTimeout(() => { tab.reconnect() this.notifications.notice(this.translate.instant('Reconnect')) }) }, }, ] } return [] } } /** @hidden */ @Injectable() export class LegacyContextMenu extends TabContextMenuItemProvider { weight = 1 constructor ( @Optional() @Inject(TerminalContextMenuItemProvider) protected contextMenuProviders: TerminalContextMenuItemProvider[]|null, ) { super() } async getItems (tab: BaseTabComponent): Promise { if (!this.contextMenuProviders) { return [] } if (tab instanceof BaseTerminalTabComponent) { let items: MenuItemOptions[] = [] for (const p of this.contextMenuProviders) { items = items.concat(await p.getItems(tab)) } return items } return [] } } /** @hidden */ @Injectable() export class SaveAsProfileContextMenu extends TabContextMenuItemProvider { constructor ( private config: ConfigService, private ngbModal: NgbModal, private notifications: NotificationsService, private translate: TranslateService, ) { super() } async getItems (tab: BaseTabComponent): Promise { if (tab instanceof BaseTerminalTabComponent) { return [ { label: this.translate.instant('Save as profile'), click: async () => { const modal = this.ngbModal.open(PromptModalComponent) modal.componentInstance.prompt = this.translate.instant('New profile name') modal.componentInstance.value = tab.profile.name const name = (await modal.result.catch(() => null))?.value if (!name) { return } const options = JSON.parse(JSON.stringify(tab.profile.options)) const cwd = await tab.session?.getWorkingDirectory() ?? tab.profile.options.cwd if (cwd) { options.cwd = cwd } const profile: PartialProfile = { type: tab.profile.type, name, options, } profile.id = `${profile.type}:custom:${slugify(name)}:${uuidv4()}` profile.group = tab.profile.group profile.icon = tab.profile.icon profile.color = tab.profile.color profile.disableDynamicTitle = tab.profile.disableDynamicTitle profile.behaviorOnSessionEnd = tab.profile.behaviorOnSessionEnd this.config.store.profiles = [ ...this.config.store.profiles, profile, ] this.config.save() this.notifications.info(this.translate.instant('Saved')) }, }, ] } return [] } } ================================================ FILE: tabby-terminal/tsconfig.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "compilerOptions": { "baseUrl": "src" } } ================================================ FILE: tabby-terminal/tsconfig.typings.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "compilerOptions": { "baseUrl": "src", "emitDeclarationOnly": true, "declaration": true, "declarationDir": "./typings", "paths": { "tabby-*": ["../../tabby-*"], "*": [ "../../app/node_modules/*", "../node_modules/xterm/src/*" ] } } } ================================================ FILE: tabby-terminal/webpack.config.mjs ================================================ import * as path from 'path' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) import config from '../webpack.plugin.config.mjs' export default () => { const cfg = config({ name: 'terminal', dirname: __dirname, externals: [ 'opentype.js', ], rules: [ { test: /lib[\\/]xterm-addon-image-worker.js$/i, type: 'asset/source', }, ], }) return cfg } ================================================ FILE: tabby-uac/.gitignore ================================================ Debug *.ipch *.suo v15 ================================================ FILE: tabby-uac/UAC/UAC.vcxproj ================================================ Debug Win32 Release Win32 Debug x64 Release x64 15.0 {DCE3B955-DB20-4334-B11B-F6C040825A59} Win32Proj UAC 10.0.17763.0 Application true v141 Unicode Application false v141 true Unicode Application true v141 Unicode Application false v141 true Unicode true true false false Use Level3 Disabled true WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true Console true Use Level3 Disabled true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true Console true Use Level3 MaxSpeed true true true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Console true true true Use Level3 MaxSpeed true true true NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Console true true true Create Create Create Create ================================================ FILE: tabby-uac/UAC/UAC.vcxproj.filters ================================================  {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;ipp;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Header Files Header Files Source Files Source Files ================================================ FILE: tabby-uac/UAC/UAC.vcxproj.user ================================================  cmd.exe WindowsLocalDebugger ================================================ FILE: tabby-uac/UAC/app.manifest ================================================ ================================================ FILE: tabby-uac/UAC.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.27703.2042 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UAC", "UAC\UAC.vcxproj", "{DCE3B955-DB20-4334-B11B-F6C040825A59}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {DCE3B955-DB20-4334-B11B-F6C040825A59}.Debug|x64.ActiveCfg = Debug|x64 {DCE3B955-DB20-4334-B11B-F6C040825A59}.Debug|x64.Build.0 = Debug|x64 {DCE3B955-DB20-4334-B11B-F6C040825A59}.Debug|x86.ActiveCfg = Debug|Win32 {DCE3B955-DB20-4334-B11B-F6C040825A59}.Debug|x86.Build.0 = Debug|Win32 {DCE3B955-DB20-4334-B11B-F6C040825A59}.Release|x64.ActiveCfg = Release|x64 {DCE3B955-DB20-4334-B11B-F6C040825A59}.Release|x64.Build.0 = Release|x64 {DCE3B955-DB20-4334-B11B-F6C040825A59}.Release|x86.ActiveCfg = Release|Win32 {DCE3B955-DB20-4334-B11B-F6C040825A59}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {77F43A07-B912-4CCD-9928-5C12F6D0112B} EndGlobalSection EndGlobal ================================================ FILE: tabby-web/package.json ================================================ { "name": "tabby-web", "version": "1.0.231-nightly.0", "description": "Web-specific bindings", "keywords": [ "tabby-builtin-plugin" ], "main": "dist/index.js", "typings": "typings/index.d.ts", "scripts": { "build": "webpack --progress --color", "watch": "webpack --progress --color --watch" }, "files": [ "dist", "typings" ], "author": "Tabby Developers", "license": "MIT", "peerDependencies": { "@angular/core": "^15" }, "devDependencies": { "@vaadin/vaadin-context-menu": "^5.0.0", "bootstrap": "^4.1.3", "bowser": "^2.11.0", "copy-text-to-clipboard": "^3.0.1" } } ================================================ FILE: tabby-web/src/components/messageBoxModal.component.pug ================================================ .modal-body div {{options.message}} small {{options.detail}} .modal-footer .ms-auto button.btn( *ngFor='let button of options.buttons; index as i', [autofocus]='i === options.defaultId', [class.btn-primary]='i === options.defaultId', [class.btn-secondary]='i !== options.defaultId', (click)='onButton(i)', ) {{button}} ================================================ FILE: tabby-web/src/components/messageBoxModal.component.ts ================================================ import { Component, Input, ElementRef } from '@angular/core' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { BaseComponent, HotkeysService, MessageBoxOptions } from 'tabby-core' /** @hidden */ @Component({ templateUrl: './messageBoxModal.component.pug', }) export class MessageBoxModalComponent extends BaseComponent { @Input() options: MessageBoxOptions constructor ( hotkeys: HotkeysService, private element: ElementRef, private modalInstance: NgbActiveModal, ) { super() this.subscribeUntilDestroyed(hotkeys.key, (event: KeyboardEvent) => { if (event.type === 'keydown') { if (event.key === 'Enter' && this.options.defaultId !== undefined) { this.modalInstance.close(this.options.defaultId) } } }) } ngAfterViewInit (): void { this.element.nativeElement.querySelector('button[autofocus]').focus() } onButton (index: number): void { this.modalInstance.close(index) } } ================================================ FILE: tabby-web/src/config.ts ================================================ import { ConfigProvider } from 'tabby-core' /** @hidden */ export class WebConfigProvider extends ConfigProvider { defaults = { web: { preventAccidentalTabClosure: false, }, } } ================================================ FILE: tabby-web/src/index.ts ================================================ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { ConfigProvider, HostAppService, HostWindowService, LogService, PlatformService, UpdaterService } from 'tabby-core' import { WebPlatformService } from './platform' import { ConsoleLogService } from './services/log.service' import { NullUpdaterService } from './services/updater.service' import { WebHostWindow } from './services/hostWindow.service' import { WebHostApp } from './services/hostApp.service' import { MessageBoxModalComponent } from './components/messageBoxModal.component' import { WebConfigProvider } from './config' import './styles.scss' @NgModule({ imports: [ CommonModule, ], providers: [ { provide: PlatformService, useClass: WebPlatformService }, { provide: LogService, useClass: ConsoleLogService }, { provide: UpdaterService, useClass: NullUpdaterService }, { provide: HostWindowService, useClass: WebHostWindow }, { provide: HostAppService, useClass: WebHostApp }, { provide: ConfigProvider, useClass: WebConfigProvider, multi: true }, ], declarations: [ MessageBoxModalComponent, ], }) export default class WebModule { } // eslint-disable-line @typescript-eslint/no-extraneous-class ================================================ FILE: tabby-web/src/platform.ts ================================================ import '@vaadin/vaadin-context-menu' import copyToClipboard from 'copy-text-to-clipboard' import { Injectable, Inject } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { PlatformService, ClipboardContent, MenuItemOptions, MessageBoxOptions, MessageBoxResult, FileUpload, FileUploadOptions, FileDownload, DirectoryDownload, HTMLFileUpload, DirectoryUpload } from 'tabby-core' // eslint-disable-next-line no-duplicate-imports import type { ContextMenuElement, ContextMenuItem } from '@vaadin/vaadin-context-menu' import { MessageBoxModalComponent } from './components/messageBoxModal.component' import './styles.scss' @Injectable() export class WebPlatformService extends PlatformService { private menu: ContextMenuElement private contextMenuHandlers = new Map void>() private fileSelector: HTMLInputElement constructor ( // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types @Inject('WEB_CONNECTOR') private connector: any, private ngbModal: NgbModal, ) { super() this.menu = window.document.createElement('vaadin-context-menu') this.menu.addEventListener('item-selected', e => { this.contextMenuHandlers.get(e.detail.value)?.() }) document.body.appendChild(this.menu) this.fileSelector = document.createElement('input') this.fileSelector.type = 'file' this.fileSelector.style.visibility = 'hidden' document.body.appendChild(this.fileSelector) } readClipboard (): string { return '' } setClipboard (content: ClipboardContent): void { copyToClipboard(content.text) } async loadConfig (): Promise { return this.connector.loadConfig() } async saveConfig (content: string): Promise { await this.connector.saveConfig(content) } getOSRelease (): string { return '1.0' } openExternal (url: string): void { window.open(url) } getAppVersion (): string { return this.connector.getAppVersion() } async listFonts (): Promise { return [] } popupContextMenu (menu: MenuItemOptions[], event?: MouseEvent): void { this.contextMenuHandlers.clear() this.menu.items = menu .filter(x => x.type !== 'separator') .map(x => this.remapMenuItem(x)) setTimeout(() => { this.menu.open(event) }, 10) } private remapMenuItem (item: MenuItemOptions): ContextMenuItem { const cmi = { text: item.label, disabled: !(item.enabled ?? true), checked: item.checked, children: item.submenu?.map(i => this.remapMenuItem(i)), } if (item.click) { this.contextMenuHandlers.set(cmi, item.click) } return cmi } async showMessageBox (options: MessageBoxOptions): Promise { const modal = this.ngbModal.open(MessageBoxModalComponent, { backdrop: 'static', }) const instance: MessageBoxModalComponent = modal.componentInstance instance.options = options try { const response = await modal.result return { response } } catch { return { response: options.cancelId ?? 1 } } } quit (): void { window.close() } async startDownload (name: string, mode: number, size: number): Promise { const transfer = new HTMLFileDownload(name, mode, size) this.fileTransferStarted.next(transfer) return transfer } async startDownloadDirectory (_name: string, _estimatedSize?: number): Promise { throw new Error('Unsupported') } startUpload (options?: FileUploadOptions): Promise { return new Promise(resolve => { this.fileSelector.onchange = () => { const transfers: FileUpload[] = [] const fileList = this.fileSelector.files! // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition for (let i = 0; i < (fileList.length ?? 0); i++) { const file = fileList[i] const transfer = new HTMLFileUpload(file) this.fileTransferStarted.next(transfer) transfers.push(transfer) if (!options?.multiple) { break } } resolve(transfers) } this.fileSelector.click() }) } async startUploadDirectory (_paths?: string[]): Promise { return new DirectoryUpload() } setErrorHandler (handler: (_: any) => void): void { window.addEventListener('error', handler) } async pickDirectory (): Promise { throw new Error('Unsupported') } } class HTMLFileDownload extends FileDownload { private buffers: Uint8Array[] = [] constructor ( private name: string, private mode: number, private size: number, ) { super() } getName (): string { return this.name } getMode (): number { return this.mode } getSize (): number { return this.size } async write (buffer: Uint8Array): Promise { this.buffers.push(Uint8Array.from(buffer)) this.increaseProgress(buffer.length) if (this.isComplete()) { this.finish() } } finish () { const blob = new Blob(this.buffers, { type: 'application/octet-stream' }) const element = window.document.createElement('a') element.href = window.URL.createObjectURL(blob) element.download = this.name document.body.appendChild(element) element.click() document.body.removeChild(element) } // eslint-disable-next-line @typescript-eslint/no-empty-function close (): void { } } ================================================ FILE: tabby-web/src/services/hostApp.service.ts ================================================ import Bowser from 'bowser' import { Injectable, Injector } from '@angular/core' import { HostAppService, Platform } from 'tabby-core' @Injectable() export class WebHostApp extends HostAppService { get platform (): Platform { return Platform.Web } get configPlatform (): Platform { const os = Bowser.parse(window.navigator.userAgent).os return Platform[os.name ?? 'Windows'] ?? Platform.Windows } // Needed for injector metadata // eslint-disable-next-line @typescript-eslint/no-useless-constructor constructor ( injector: Injector, ) { super(injector) } newWindow (): void { throw new Error('Not implemented') } relaunch (): void { location.reload() } quit (): void { window.close() } } ================================================ FILE: tabby-web/src/services/hostWindow.service.ts ================================================ import { Injectable } from '@angular/core' import { ConfigService, HostWindowService, TranslateService } from 'tabby-core' @Injectable({ providedIn: 'root' }) export class WebHostWindow extends HostWindowService { get isFullscreen (): boolean { return !!document.fullscreenElement } constructor ( config: ConfigService, translate: TranslateService, ) { super() this.windowShown.next() this.windowFocused.next() const unloadHandler = (event) => { if (config.store.web.preventAccidentalTabClosure) { event.preventDefault() event.returnValue = translate.instant('Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window.') } else { window.removeEventListener('beforeunload', unloadHandler) } } window.addEventListener('beforeunload', unloadHandler) } reload (): void { location.reload() } setTitle (title?: string): void { document.title = title ?? 'Tabby' } toggleFullscreen (): void { if (this.isFullscreen) { document.exitFullscreen() } else { document.body.requestFullscreen({ navigationUI: 'hide' }) } } minimize (): void { throw new Error('Unavailable') } isMaximized (): boolean { return true } toggleMaximize (): void { throw new Error('Unavailable') } close (): void { window.close() } } ================================================ FILE: tabby-web/src/services/log.service.ts ================================================ import { Injectable } from '@angular/core' import { ConsoleLogger, Logger } from 'tabby-core' @Injectable({ providedIn: 'root' }) export class ConsoleLogService { create (name: string): Logger { return new ConsoleLogger(name) } } ================================================ FILE: tabby-web/src/services/updater.service.ts ================================================ import { UpdaterService } from 'tabby-core' export class NullUpdaterService extends UpdaterService { async check (): Promise { return false } // eslint-disable-next-line @typescript-eslint/no-empty-function async update (): Promise { } } ================================================ FILE: tabby-web/src/styles.scss ================================================ @import "../../tabby-core/src/theme.vars.scss"; html.tabby { --lumo-primary-text-color: #{$body-color}; --lumo-base-color: #{$body-bg}; --lumo-body-text-color: #{$body-color}; --lumo-tint-5pct: #{$body-bg}; --lumo-font-family: #{$font-family-sans-serif}; --lumo-font-size-m: #{$font-size-base}; --lumo-box-shadow-m: #{$dropdown-box-shadow}; } ================================================ FILE: tabby-web/tsconfig.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist"], "compilerOptions": { "baseUrl": "src" } } ================================================ FILE: tabby-web/tsconfig.typings.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "compilerOptions": { "baseUrl": "src", "emitDeclarationOnly": true, "declaration": true, "declarationDir": "./typings", "paths": { "tabby-*": ["../../tabby-*"], "*": ["../../app/node_modules/*"] } } } ================================================ FILE: tabby-web/webpack.config.mjs ================================================ import * as path from 'path' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) import config from '../webpack.plugin.config.mjs' export default () => config({ name: 'web', dirname: __dirname, }) ================================================ FILE: tabby-web-demo/data/v86_all.js ================================================ ;(function(){'use strict';var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;$jscomp.ISOLATE_POLYFILLS=!1;$jscomp.FORCE_POLYFILL_PROMISE=!1;$jscomp.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a}; $jscomp.getGlobal=function(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;bH;H++)M=127H?J[H]:H,G[H]=String.fromCharCode(M);f.imageSmoothingEnabled=!1;g.style.position="absolute";g.style.backgroundColor="#ccc";g.style.width="7px";g.style.display="inline-block";k.style.display="block";e.style.display="none";this.bus=b;b.register("screen-set-mode",function(w){this.set_mode(w)},this);b.register("screen-fill-buffer-end",function(w){this.update_buffer(w)}, this);b.register("screen-put-char",function(w){this.put_char(w[0],w[1],w[2],w[3],w[4])},this);b.register("screen-update-cursor",function(w){this.update_cursor(w[0],w[1])},this);b.register("screen-update-cursor-scanline",function(w){this.update_cursor_scanline(w[0],w[1])},this);b.register("screen-clear",function(){this.clear_screen()},this);b.register("screen-set-size-text",function(w){this.set_size_text(w[0],w[1])},this);b.register("screen-set-size-graphical",function(w){this.set_size_graphical(w[0], w[1],w[2],w[3])},this);this.init=function(){this.set_size_text(80,25);this.timer()};this.make_screenshot=function(){try{const w=new Image;w.src=e.toDataURL("image/png");window.open("").document.write(w.outerHTML)}catch(w){}};this.put_char=function(w,y,C,D,F){wy;)k.removeChild(k.firstChild);for(;k.childNodes.length=u?2:1;this.bus.send("screen-tell-buffer",[m],[m.buffer]);d(e,v*p,q*p,!1)};this.set_scale=function(w,y){v=w;q=y;d(k,v,q,!0);d(e,v*p,q*p,!1)};this.set_scale(v,q);this.update_cursor_scanline=function(w,y){w&32?g.style.display="none":(g.style.display= "inline",g.style.height=Math.min(15,y-w)+"px",g.style.marginTop=Math.min(15,w)+"px")};this.update_cursor=function(w,y){if(w!==n||y!==r)t[w]=1,t[n]=1,n=w,r=y};this.text_update_row=function(w){var y=3*w*A,C;var D=k.childNodes[w];var F=document.createElement("div");for(var K=0;K{f.strokeRect(y.buffer_x,y.buffer_y,y.buffer_width,y.buffer_height)}),f.lineWidth=1):w.forEach(y=>{f.putImageData(l,y.screen_x-y.buffer_x,y.screen_y-y.buffer_y,y.buffer_x,y.buffer_y,y.buffer_width,y.buffer_height)})};this.init()};const VIRTIO_9P_F_MOUNT_TAG=0,VIRTIO_9P_MAX_TAGLEN=254; var EPERM=1,ENOENT=2,EEXIST=17,EINVAL=22,EOPNOTSUPP=95,ENOTEMPTY=39,EPROTO=71,P9_SETATTR_MODE=1,P9_SETATTR_UID=2,P9_SETATTR_GID=4,P9_SETATTR_SIZE=8,P9_SETATTR_ATIME=16,P9_SETATTR_MTIME=32,P9_SETATTR_CTIME=64,P9_SETATTR_ATIME_SET=128,P9_SETATTR_MTIME_SET=256,P9_STAT_MODE_DIR=2147483648,P9_STAT_MODE_APPEND=1073741824,P9_STAT_MODE_EXCL=536870912,P9_STAT_MODE_MOUNT=268435456,P9_STAT_MODE_AUTH=134217728,P9_STAT_MODE_TMP=67108864,P9_STAT_MODE_SYMLINK=33554432,P9_STAT_MODE_LINK=16777216,P9_STAT_MODE_DEVICE= 8388608,P9_STAT_MODE_NAMED_PIPE=2097152,P9_STAT_MODE_SOCKET=1048576,P9_STAT_MODE_SETUID=524288,P9_STAT_MODE_SETGID=262144,P9_STAT_MODE_SETVTX=65536;const P9_LOCK_TYPE_RDLCK=0,P9_LOCK_TYPE_WRLCK=1,P9_LOCK_TYPE_UNLCK=2,P9_LOCK_TYPES=Object.freeze(["shared","exclusive","unlock"]),P9_LOCK_FLAGS_BLOCK=1,P9_LOCK_FLAGS_RECLAIM=2,P9_LOCK_SUCCESS=0,P9_LOCK_BLOCKED=1,P9_LOCK_ERROR=2,P9_LOCK_GRACE=3;var FID_NONE=-1,FID_INODE=1,FID_XATTR=2; function Virtio9p(a,b,c){this.fs=a;this.bus=c;this.configspace_tagname=[104,111,115,116,57,112];this.configspace_taglen=this.configspace_tagname.length;this.VERSION="9P2000.L";this.msize=this.BLOCKSIZE=8192;this.replybuffer=new Uint8Array(2*this.msize);this.replybuffersize=0;this.fids=[];this.virtio=new VirtIO(b,{name:"virtio-9p",pci_id:48,device_id:4169,subsystem_device_id:9,common:{initial_port:43008,queues:[{size_supported:32,notify_offset:0}],features:[VIRTIO_9P_F_MOUNT_TAG,VIRTIO_F_VERSION_1, VIRTIO_F_RING_EVENT_IDX,VIRTIO_F_RING_INDIRECT_DESC],on_driver_ok:()=>{}},notification:{initial_port:43264,single_handler:!1,handlers:[d=>{if(0!==d)dbg_assert(!1,"Virtio9P Notified for non-existent queue: "+d+" (expected queue_id of 0)");else{for(;this.virtqueue.has_request();)d=this.virtqueue.pop_request(),this.ReceiveRequest(d);this.virtqueue.notify_me_after(0)}}]},isr_status:{initial_port:42752},device_specific:{initial_port:42496,struct:[{bytes:2,name:"mount tag length",read:()=>this.configspace_taglen, write:d=>{}}].concat(v86util.range(VIRTIO_9P_MAX_TAGLEN).map(d=>({bytes:1,name:"mount tag name "+d,read:()=>this.configspace_tagname[d]||0,write:e=>{}})))}});this.virtqueue=this.virtio.queues[0]} Virtio9p.prototype.get_state=function(){var a=[];a[0]=this.configspace_tagname;a[1]=this.configspace_taglen;a[2]=this.virtio;a[3]=this.VERSION;a[4]=this.BLOCKSIZE;a[5]=this.msize;a[6]=this.replybuffer;a[7]=this.replybuffersize;a[8]=this.fids.map(function(b){return[b.inodeid,b.type,b.uid,b.dbg_name]});a[9]=this.fs;return a}; Virtio9p.prototype.set_state=function(a){this.configspace_tagname=a[0];this.configspace_taglen=a[1];this.virtio.set_state(a[2]);this.virtqueue=this.virtio.queues[0];this.VERSION=a[3];this.BLOCKSIZE=a[4];this.msize=a[5];this.replybuffer=a[6];this.replybuffersize=a[7];this.fids=a[8].map(function(b){return{inodeid:b[0],type:b[1],uid:b[2],dbg_name:b[3]}});this.fs.set_state(a[9])};Virtio9p.prototype.Createfid=function(a,b,c,d){return{inodeid:a,type:b,uid:c,dbg_name:d}}; Virtio9p.prototype.update_dbg_name=function(a,b){for(const c of this.fids)c.inodeid===a&&(c.dbg_name=b)};Virtio9p.prototype.Reset=function(){this.fids=[]};Virtio9p.prototype.BuildReply=function(a,b,c){dbg_assert(0<=c,"9P: Negative payload size");marshall.Marshall(["w","b","h"],[c+7,a+1,b],this.replybuffer,0);c+7>=this.replybuffer.length&&message.Debug("Error in 9p: payloadsize exceeds maximum length");this.replybuffersize=c+7}; Virtio9p.prototype.SendError=function(a,b,c){b=marshall.Marshall(["w"],[c],this.replybuffer,7);this.BuildReply(6,a,b)};Virtio9p.prototype.SendReply=function(a){dbg_assert(0<=this.replybuffersize,"9P: Negative replybuffersize");a.set_next_blob(this.replybuffer.subarray(0,this.replybuffersize));this.virtqueue.push_reply(a);this.virtqueue.flush_replies()}; Virtio9p.prototype.ReceiveRequest=async function(a){var b=new Uint8Array(a.length_readable);a.get_next_blob(b);var c={offset:0},d=marshall.Unmarshall(["w","b","h"],b,c),e=d[0],f=d[1],k=d[2];switch(f){case 8:e=this.fs.GetTotalSize();b=this.fs.GetSpace();d=[16914839];d[1]=this.BLOCKSIZE;d[2]=Math.floor(b/d[1]);d[3]=d[2]-Math.floor(e/d[1]);d[4]=d[2]-Math.floor(e/d[1]);d[5]=this.fs.CountUsedInodes();d[6]=this.fs.CountFreeInodes();d[7]=0;d[8]=256;e=marshall.Marshall("wwddddddw".split(""),d,this.replybuffer, 7);this.BuildReply(f,k,e);this.SendReply(a);break;case 112:case 12:d=marshall.Unmarshall(["w","w"],b,c);var g=d[0];c=d[1];message.Debug("[open] fid="+g+", mode="+c);b=this.fids[g].inodeid;var l=this.fs.GetInode(b);message.Debug("file open "+this.fids[g].dbg_name);d=this.fs.OpenInode(b,c);this.fs.AddEvent(this.fids[g].inodeid,function(){message.Debug("file opened "+this.fids[g].dbg_name+" tag:"+k);var v=[];v[0]=l.qid;v[1]=this.msize-24;marshall.Marshall(["Q","w"],v,this.replybuffer,7);this.BuildReply(f, k,17);this.SendReply(a)}.bind(this));break;case 70:d=marshall.Unmarshall(["w","w","s"],b,c);b=d[0];g=d[1];e=d[2];message.Debug("[link] dfid="+b+", name="+e);d=this.fs.Link(this.fids[b].inodeid,this.fids[g].inodeid,e);if(0>d){e="";d===-EPERM?e="Operation not permitted":(e="Unknown error: "+-d,dbg_assert(!1,"[link]: Unexpected error code: "+-d));this.SendError(k,e,-d);this.SendReply(a);break}this.BuildReply(f,k,0);this.SendReply(a);break;case 16:d=marshall.Unmarshall(["w","s","s","w"],b,c);g=d[0];e= d[1];b=d[2];d=d[3];message.Debug("[symlink] fid="+g+", name="+e+", symgt="+b+", gid="+d);b=this.fs.CreateSymlink(e,this.fids[g].inodeid,b);l=this.fs.GetInode(b);l.uid=this.fids[g].uid;l.gid=d;marshall.Marshall(["Q"],[l.qid],this.replybuffer,7);this.BuildReply(f,k,13);this.SendReply(a);break;case 18:d=marshall.Unmarshall("wswwww".split(""),b,c);g=d[0];e=d[1];c=d[2];b=d[3];var m=d[4];d=d[5];message.Debug("[mknod] fid="+g+", name="+e+", major="+b+", minor="+m);b=this.fs.CreateNode(e,this.fids[g].inodeid, b,m);l=this.fs.GetInode(b);l.mode=c;l.uid=this.fids[g].uid;l.gid=d;marshall.Marshall(["Q"],[l.qid],this.replybuffer,7);this.BuildReply(f,k,13);this.SendReply(a);break;case 22:d=marshall.Unmarshall(["w"],b,c);g=d[0];l=this.fs.GetInode(this.fids[g].inodeid);message.Debug("[readlink] fid="+g+" name="+this.fids[g].dbg_name+" target="+l.symlink);e=marshall.Marshall(["s"],[l.symlink],this.replybuffer,7);this.BuildReply(f,k,e);this.SendReply(a);break;case 72:d=marshall.Unmarshall(["w","s","w","w"],b,c); g=d[0];e=d[1];c=d[2];d=d[3];message.Debug("[mkdir] fid="+g+", name="+e+", mode="+c+", gid="+d);b=this.fs.CreateDirectory(e,this.fids[g].inodeid);l=this.fs.GetInode(b);l.mode=c|S_IFDIR;l.uid=this.fids[g].uid;l.gid=d;marshall.Marshall(["Q"],[l.qid],this.replybuffer,7);this.BuildReply(f,k,13);this.SendReply(a);break;case 14:d=marshall.Unmarshall(["w","s","w","w","w"],b,c);g=d[0];e=d[1];b=d[2];c=d[3];d=d[4];this.bus.send("9p-create",[e,this.fids[g].inodeid]);message.Debug("[create] fid="+g+", name="+ e+", flags="+b+", mode="+c+", gid="+d);b=this.fs.CreateFile(e,this.fids[g].inodeid);this.fids[g].inodeid=b;this.fids[g].type=FID_INODE;this.fids[g].dbg_name=e;l=this.fs.GetInode(b);l.uid=this.fids[g].uid;l.gid=d;l.mode=c;marshall.Marshall(["Q","w"],[l.qid,this.msize-24],this.replybuffer,7);this.BuildReply(f,k,17);this.SendReply(a);break;case 52:d=marshall.Unmarshall("wbwddws".split(""),b,c);g=d[0];b=d[2];e=0===d[4]?Infinity:d[4];e=this.fs.DescribeLock(d[1],d[3],e,d[5],d[6]);message.Debug("[lock] fid="+ g+", type="+P9_LOCK_TYPES[e.type]+", start="+e.start+", length="+e.length+", proc_id="+e.proc_id);d=this.fs.Lock(this.fids[g].inodeid,e,b);marshall.Marshall(["b"],[d],this.replybuffer,7);this.BuildReply(f,k,1);this.SendReply(a);break;case 54:d=marshall.Unmarshall("wbddws".split(""),b,c);g=d[0];e=0===d[3]?Infinity:d[3];e=this.fs.DescribeLock(d[1],d[2],e,d[4],d[5]);message.Debug("[getlock] fid="+g+", type="+P9_LOCK_TYPES[e.type]+", start="+e.start+", length="+e.length+", proc_id="+e.proc_id);d=this.fs.GetLock(this.fids[g].inodeid, e);d||(d=e,d.type=P9_LOCK_TYPE_UNLCK);e=marshall.Marshall(["b","d","d","w","s"],[d.type,d.start,Infinity===d.length?0:d.length,d.proc_id,d.client_id],this.replybuffer,7);this.BuildReply(f,k,e);this.SendReply(a);break;case 24:d=marshall.Unmarshall(["w","d"],b,c);g=d[0];l=this.fs.GetInode(this.fids[g].inodeid);message.Debug("[getattr]: fid="+g+" name="+this.fids[g].dbg_name+" request mask="+d[1]);if(!l||l.status===STATUS_UNLINKED){message.Debug("getattr: unlinked");this.SendError(k,"No such file or directory", ENOENT);this.SendReply(a);break}d[0]|=4096;d[0]=d[1];d[1]=l.qid;d[2]=l.mode;d[3]=l.uid;d[4]=l.gid;d[5]=l.nlinks;d[6]=l.major<<8|l.minor;d[7]=l.size;d[8]=this.BLOCKSIZE;d[9]=Math.floor(l.size/512+1);d[10]=l.atime;d[11]=0;d[12]=l.mtime;d[13]=0;d[14]=l.ctime;d[15]=0;d[16]=0;d[17]=0;d[18]=0;d[19]=0;marshall.Marshall("dQwwwddddddddddddddd".split(""),d,this.replybuffer,7);this.BuildReply(f,k,153);this.SendReply(a);break;case 26:d=marshall.Unmarshall("wwwwwddddd".split(""),b,c);g=d[0];l=this.fs.GetInode(this.fids[g].inodeid); message.Debug("[setattr]: fid="+g+" request mask="+d[1]+" name="+this.fids[g].dbg_name);d[1]&P9_SETATTR_MODE&&(l.mode=d[2]);d[1]&P9_SETATTR_UID&&(l.uid=d[3]);d[1]&P9_SETATTR_GID&&(l.gid=d[4]);d[1]&P9_SETATTR_ATIME&&(l.atime=Math.floor((new Date).getTime()/1E3));d[1]&P9_SETATTR_MTIME&&(l.mtime=Math.floor((new Date).getTime()/1E3));d[1]&P9_SETATTR_CTIME&&(l.ctime=Math.floor((new Date).getTime()/1E3));d[1]&P9_SETATTR_ATIME_SET&&(l.atime=d[6]);d[1]&P9_SETATTR_MTIME_SET&&(l.mtime=d[8]);d[1]&P9_SETATTR_SIZE&& await this.fs.ChangeSize(this.fids[g].inodeid,d[5]);this.BuildReply(f,k,0);this.SendReply(a);break;case 50:d=marshall.Unmarshall(["w","d"],b,c);g=d[0];this.BuildReply(f,k,0);this.SendReply(a);break;case 40:case 116:d=marshall.Unmarshall(["w","d","w"],b,c);g=d[0];e=d[1];m=d[2];l=this.fs.GetInode(this.fids[g].inodeid);40==f&&message.Debug("[treaddir]: fid="+g+" offset="+e+" count="+m);116==f&&message.Debug("[read]: fid="+g+" ("+this.fids[g].dbg_name+") offset="+e+" count="+m+" fidtype="+this.fids[g].type); if(!l||l.status===STATUS_UNLINKED){message.Debug("read/treaddir: unlinked");this.SendError(k,"No such file or directory",ENOENT);this.SendReply(a);break}if(this.fids[g].type==FID_XATTR)for(l.caps.lengthl.size&&(m=0),this.bus.send("9p-read-start",[this.fids[g].dbg_name]),d=await this.fs.Read(d, e,m),this.bus.send("9p-read-end",[this.fids[g].dbg_name,m]),d&&this.replybuffer.set(d,11);marshall.Marshall(["w"],[m],this.replybuffer,7);this.BuildReply(f,k,4+m);this.SendReply(a);break;case 118:d=marshall.Unmarshall(["w","d","w"],b,c);g=d[0];e=d[1];m=d[2];d=this.fids[g].dbg_name;message.Debug("[write]: fid="+g+" ("+d+") offset="+e+" count="+m+" fidtype="+this.fids[g].type);if(this.fids[g].type===FID_XATTR){this.SendError(k,"Setxattr not supported",EOPNOTSUPP);this.SendReply(a);break}else await this.fs.Write(this.fids[g].inodeid, e,m,b.subarray(c.offset));this.bus.send("9p-write-end",[d,m]);marshall.Marshall(["w"],[m],this.replybuffer,7);this.BuildReply(f,k,4);this.SendReply(a);break;case 74:d=marshall.Unmarshall(["w","s","w","s"],b,c);c=d[0];m=d[1];e=d[2];b=d[3];message.Debug("[renameat]: oldname="+m+" newname="+b);d=await this.fs.Rename(this.fids[c].inodeid,m,this.fids[e].inodeid,b);if(0>d){e="";d===-ENOENT?e="No such file or directory":d===-EPERM?e="Operation not permitted":d===-ENOTEMPTY?e="Directory not empty":(e="Unknown error: "+ -d,dbg_assert(!1,"[renameat]: Unexpected error code: "+-d));this.SendError(k,e,-d);this.SendReply(a);break}TRACK_FILENAMES&&(d=this.fs.Search(this.fids[e].inodeid,b),this.update_dbg_name(d,b));this.BuildReply(f,k,0);this.SendReply(a);break;case 76:d=marshall.Unmarshall(["w","s","w"],b,c);c=d[0];e=d[1];b=d[2];message.Debug("[unlink]: dirfd="+c+" name="+e+" flags="+b);g=this.fs.Search(this.fids[c].inodeid,e);if(-1==g){this.SendError(k,"No such file or directory",ENOENT);this.SendReply(a);break}d=this.fs.Unlink(this.fids[c].inodeid, e);if(0>d){e="";d===-ENOTEMPTY?e="Directory not empty":d===-EPERM?e="Operation not permitted":(e="Unknown error: "+-d,dbg_assert(!1,"[unlink]: Unexpected error code: "+-d));this.SendError(k,e,-d);this.SendReply(a);break}this.BuildReply(f,k,0);this.SendReply(a);break;case 100:d=marshall.Unmarshall(["w","s"],b,c);message.Debug("[version]: msize="+d[0]+" version="+d[1]);this.msize=d[0];e=marshall.Marshall(["w","s"],[this.msize,this.VERSION],this.replybuffer,7);this.BuildReply(f,k,e);this.SendReply(a); break;case 104:d=marshall.Unmarshall(["w","w","s","s","w"],b,c);g=d[0];e=d[4];message.Debug("[attach]: fid="+g+" afid="+hex8(d[1])+" uname="+d[2]+" aname="+d[3]);this.fids[g]=this.Createfid(0,FID_INODE,e,"");l=this.fs.GetInode(this.fids[g].inodeid);marshall.Marshall(["Q"],[l.qid],this.replybuffer,7);this.BuildReply(f,k,13);this.SendReply(a);break;case 108:d=marshall.Unmarshall(["h"],b,c);message.Debug("[flush] "+k);this.BuildReply(f,k,0);this.SendReply(a);break;case 110:d=marshall.Unmarshall(["w", "w","h"],b,c);g=d[0];m=d[1];var n=d[2];message.Debug("[walk]: fid="+d[0]+" nwfid="+d[1]+" nwname="+n);if(0==n){this.fids[m]=this.Createfid(this.fids[g].inodeid,FID_INODE,this.fids[g].uid,this.fids[g].dbg_name);marshall.Marshall(["h"],[0],this.replybuffer,7);this.BuildReply(f,k,2);this.SendReply(a);break}e=[];for(d=0;db;b++)this.ports[b]=this.create_empty_entry();var c=a.memory_size[0];for(b=0;b<>>32-k|0};c||(c=f.bind(this,8));d||(d=f.bind(this,16));e||(e=f.bind(this,32))}c&&(this.ports[a].read8=c);d&&(this.ports[a].read16=d);e&&(this.ports[a].read32= e);this.ports[a].device=b}; IO.prototype.register_write=function(a,b,c,d,e){dbg_assert("number"===typeof a);dbg_assert("object"===typeof b);dbg_assert(!c||"function"===typeof c);dbg_assert(!d||"function"===typeof d);dbg_assert(!e||"function"===typeof e);dbg_assert(c||d||e);if(DEBUG){var f=function(k){dbg_assert(!1,"Overlapped write"+k+" "+h(a)+" ("+b.name+")")};c||(c=f.bind(this,8));d||(d=f.bind(this,16));e||(e=f.bind(this,32))}c&&(this.ports[a].write8=c);d&&(this.ports[a].write16=d);e&&(this.ports[a].write32=e);this.ports[a].device= b};IO.prototype.register_read_consecutive=function(a,b,c,d,e,f){function k(){return c.call(this)|d.call(this)<<8}function g(){return e.call(this)|f.call(this)<<8}function l(){return c.call(this)|d.call(this)<<8|e.call(this)<<16|f.call(this)<<24}dbg_assert(4===arguments.length||6===arguments.length);e&&f?(this.register_read(a,b,c,k,l),this.register_read(a+1,b,d),this.register_read(a+2,b,e,g),this.register_read(a+3,b,f)):(this.register_read(a,b,c,k),this.register_read(a+1,b,d))}; IO.prototype.register_write_consecutive=function(a,b,c,d,e,f){function k(m){c.call(this,m&255);d.call(this,m>>8&255)}function g(m){e.call(this,m&255);f.call(this,m>>8&255)}function l(m){c.call(this,m&255);d.call(this,m>>8&255);e.call(this,m>>16&255);f.call(this,m>>>24)}dbg_assert(4===arguments.length||6===arguments.length);e&&f?(this.register_write(a,b,c,k,l),this.register_write(a+1,b,d),this.register_write(a+2,b,e,g),this.register_write(a+3,b,f)):(this.register_write(a,b,c,k),this.register_write(a+ 1,b,d))};IO.prototype.mmap_read32_shim=function(a){var b=this.cpu.memory_map_read8[a>>>MMAP_BLOCK_BITS];return b(a)|b(a+1)<<8|b(a+2)<<16|b(a+3)<<24};IO.prototype.mmap_write32_shim=function(a,b){var c=this.cpu.memory_map_write8[a>>>MMAP_BLOCK_BITS];c(a,b&255);c(a+1,b>>8&255);c(a+2,b>>16&255);c(a+3,b>>>24)}; IO.prototype.mmap_register=function(a,b,c,d,e,f){dbg_log("mmap_register addr="+h(a>>>0,8)+" size="+h(b,8),LOG_IO);dbg_assert(0===(a&MMAP_BLOCK_SIZE-1));dbg_assert(b&&0===(b&MMAP_BLOCK_SIZE-1));e||(e=this.mmap_read32_shim.bind(this));f||(f=this.mmap_write32_shim.bind(this));for(a>>>=MMAP_BLOCK_BITS;0>>0,8)+this.get_port_description(a),LOG_IO);return c.write32.call(c.device,b)};IO.prototype.port_read8=function(a){var b=this.ports[a];(b.read8===this.empty_port_read8||LOG_ALL_IO)&&dbg_log("read8 port #"+h(a,4)+this.get_port_description(a),LOG_IO);b=b.read8.call(b.device);dbg_assert(256>b,"8 bit port returned large value: "+h(a));return b}; IO.prototype.port_read16=function(a){var b=this.ports[a];(b.read16===this.empty_port_read16||LOG_ALL_IO)&&dbg_log("read16 port #"+h(a,4)+this.get_port_description(a),LOG_IO);b=b.read16.call(b.device);dbg_assert(65536>b&&0<=b,"16 bit port returned large value: "+h(a));return b}; IO.prototype.port_read32=function(a){var b=this.ports[a];(b.read32===this.empty_port_read32||LOG_ALL_IO)&&dbg_log("read32 port #"+h(a,4)+this.get_port_description(a),LOG_IO);a=b.read32.call(b.device);dbg_assert((a|0)===a);return a}; var debug_port_list={4:"PORT_DMA_ADDR_2",5:"PORT_DMA_CNT_2",10:"PORT_DMA1_MASK_REG",11:"PORT_DMA1_MODE_REG",12:"PORT_DMA1_CLEAR_FF_REG",13:"PORT_DMA1_MASTER_CLEAR",32:"PORT_PIC1_CMD",33:"PORT_PIC1_DATA",64:"PORT_PIT_COUNTER0",65:"PORT_PIT_COUNTER1",66:"PORT_PIT_COUNTER2",67:"PORT_PIT_MODE",96:"PORT_PS2_DATA",97:"PORT_PS2_CTRLB",100:"PORT_PS2_STATUS",112:"PORT_CMOS_INDEX",113:"PORT_CMOS_DATA",128:"PORT_DIAG",129:"PORT_DMA_PAGE_2",146:"PORT_A20",160:"PORT_PIC2_CMD",161:"PORT_PIC2_DATA",178:"PORT_SMI_CMD", 179:"PORT_SMI_STATUS",212:"PORT_DMA2_MASK_REG",214:"PORT_DMA2_MODE_REG",218:"PORT_DMA2_MASTER_CLEAR",240:"PORT_MATH_CLEAR",368:"PORT_ATA2_CMD_BASE",496:"PORT_ATA1_CMD_BASE",632:"PORT_LPT2",744:"PORT_SERIAL4",760:"PORT_SERIAL2",884:"PORT_ATA2_CTRL_BASE",888:"PORT_LPT1",1E3:"PORT_SERIAL3",1008:"PORT_FD_BASE",1010:"PORT_FD_DOR",1012:"PORT_FD_STATUS",1013:"PORT_FD_DATA",1014:"PORT_HD_DATA",1015:"PORT_FD_DIR",1016:"PORT_SERIAL1",3320:"PORT_PCI_CMD",3321:"PORT_PCI_REBOOT",3324:"PORT_PCI_DATA",1026:"PORT_BIOS_DEBUG", 1296:"PORT_QEMU_CFG_CTL",1297:"PORT_QEMU_CFG_DATA",45056:"PORT_ACPI_PM_BASE",45312:"PORT_SMB_BASE",35072:"PORT_BIOS_APM"};IO.prototype.get_port_description=function(a){return debug_port_list[a]?" ("+debug_port_list[a]+")":""};function v86(a,b){this.stopped=this.running=!1;this.cpu=new CPU(a,b);this.bus=a;a.register("cpu-init",this.init,this);a.register("cpu-run",this.run,this);a.register("cpu-stop",this.stop,this);a.register("cpu-restart",this.restart,this);this.register_tick()}v86.prototype.run=function(){this.stopped=!1;this.running||(this.bus.send("emulator-started"),this.fast_next_tick())}; v86.prototype.do_tick=function(){if(this.stopped)this.stopped=this.running=!1,this.bus.send("emulator-stopped");else{this.running=!0;var a=this.cpu.main_run();0>=a?this.fast_next_tick():this.next_tick(a)}};v86.prototype.stop=function(){this.running&&(this.stopped=!0)};v86.prototype.destroy=function(){this.unregister_tick()};v86.prototype.restart=function(){this.cpu.reset();this.cpu.load_bios()};v86.prototype.init=function(a){this.cpu.init(a,this.bus);this.bus.send("emulator-ready")}; if("undefined"!==typeof setImmediate)var fast_next_tick=function(){setImmediate(()=>{this.do_tick()})},register_tick=function(){},unregister_tick=function(){};else if("undefined"!==typeof window&&"undefined"!==typeof postMessage){fast_next_tick=function(){window.postMessage(43605,"*")};let a;register_tick=function(){a=b=>{b.source===window&&43605===b.data&&this.do_tick()};window.addEventListener("message",a,!1)};unregister_tick=function(){window.removeEventListener("message",a);a=null}}else fast_next_tick= function(){setTimeout(()=>{this.do_tick()},0)},register_tick=function(){},unregister_tick=function(){};v86.prototype.fast_next_tick=fast_next_tick;v86.prototype.register_tick=register_tick;v86.prototype.unregister_tick=unregister_tick;var next_tick="undefined"!==typeof document&&"boolean"===typeof document.hidden?function(a){4>a||document.hidden?this.fast_next_tick():setTimeout(()=>{this.do_tick()},a)}:function(a){setTimeout(()=>{this.do_tick()},a)};v86.prototype.next_tick=next_tick; v86.prototype.save_state=function(){return this.cpu.save_state()};v86.prototype.restore_state=function(a){return this.cpu.restore_state(a)};if("object"===typeof performance&&performance.now)v86.microtick=performance.now.bind(performance);else if("function"===typeof require){const {performance:a}=require("perf_hooks");v86.microtick=a.now.bind(a)}else v86.microtick="object"===typeof process&&process.hrtime?function(){var a=process.hrtime();return 1E3*a[0]+a[1]/1E6}:Date.now;var goog=goog||{};goog.exportSymbol=function(){};goog.exportProperty=function(){};var v86util=v86util||{};v86util.pads=function(a,b){return(a||0===a?a+"":"").padEnd(b," ")};v86util.pad0=function(a,b){return(a||0===a?a+"":"").padStart(b,"0")};v86util.zeros=function(a){return Array(a).fill(0)};v86util.range=function(a){return Array.from(Array(a).keys())}; v86util.view=function(a,b,c,d){return new Proxy({},{get:function(e,f,k){e=new a(b.buffer,c,d);k=e[f];if("function"===typeof k)return k.bind(e);dbg_assert(/^\d+$/.test(f)||"buffer"===f||"length"===f||"BYTES_PER_ELEMENT"===f||"byteOffset"===f);return k},set:function(e,f,k,g){dbg_assert(/^\d+$/.test(f));(new a(b.buffer,c,d))[f]=k;return!0}})};function h(a,b){a=a?a.toString(16):"";return"0x"+v86util.pad0(a.toUpperCase(),b||1)} if("undefined"!==typeof crypto&&crypto.getRandomValues){let a=new Int32Array(1);v86util.get_rand_int=function(){crypto.getRandomValues(a);return a[0]}}else if("undefined"!==typeof require){const a=require("crypto");v86util.get_rand_int=function(){return a.randomBytes(4).readInt32LE(0)}}else dbg_assert(!1,"Unsupported platform: No cryptographic random values");function SyncBuffer(a){dbg_assert(a instanceof ArrayBuffer);this.buffer=a;this.byteLength=a.byteLength;this.onprogress=this.onload=void 0} SyncBuffer.prototype.load=function(){this.onload&&this.onload({buffer:this.buffer})};SyncBuffer.prototype.get=function(a,b,c){dbg_assert(a+b<=this.byteLength);c(new Uint8Array(this.buffer,a,b))};SyncBuffer.prototype.set=function(a,b,c){dbg_assert(a+b.byteLength<=this.byteLength);(new Uint8Array(this.buffer,a,b.byteLength)).set(b);c()};SyncBuffer.prototype.get_buffer=function(a){a(this.buffer)}; SyncBuffer.prototype.get_state=function(){const a=[];a[0]=this.byteLength;a[1]=new Uint8Array(this.buffer);return a};SyncBuffer.prototype.set_state=function(a){this.byteLength=a[0];this.buffer=a[1].slice().buffer}; (function(){if("function"===typeof Math.clz32)v86util.int_log2_byte=function(d){dbg_assert(0d);return 31-Math.clz32(d)},v86util.int_log2=function(d){dbg_assert(0b;b++)b&b-1||c++,a[b]=c;v86util.int_log2_byte=function(d){dbg_assert(0d);return a[d]};v86util.int_log2=function(d){d>>>=0;dbg_assert(0>>16;if(e){var f=e>>>8;return f?24+a[f]:16+a[e]}return(f=d>>>8)?8+a[f]:a[d]}}})(); function ByteQueue(a){var b=new Uint8Array(a),c,d;dbg_assert(0===(a&a-1));this.length=0;this.push=function(e){this.length!==a&&this.length++;b[d]=e;d=d+1&a-1};this.shift=function(){if(this.length){var e=b[c];c=c+1&a-1;this.length--;return e}return-1};this.peek=function(){return this.length?b[c]:-1};this.clear=function(){this.length=d=c=0};this.clear()}function FloatQueue(a){this.size=a;this.data=new Float32Array(a);this.length=this.end=this.start=0;dbg_assert(0===(a&a-1))} FloatQueue.prototype.push=function(a){this.length===this.size?this.start=this.start+1&this.size-1:this.length++;this.data[this.end]=a;this.end=this.end+1&this.size-1};FloatQueue.prototype.shift=function(){if(this.length){var a=this.data[this.start];this.start=this.start+1&this.size-1;this.length--;return a}}; FloatQueue.prototype.shift_block=function(a){var b=new Float32Array(a);a>this.length&&(a=this.length);var c=this.start+a,d=this.data.subarray(this.start,c);b.set(d);c>=this.size&&(c-=this.size,b.set(this.data.subarray(0,c),d.length));this.start=c;this.length-=a;return b};FloatQueue.prototype.peek=function(){if(this.length)return this.data[this.start]};FloatQueue.prototype.clear=function(){this.length=this.end=this.start=0};function CircularQueue(a){this.data=[];this.index=0;this.size=a} CircularQueue.prototype.add=function(a){this.data[this.index]=a;this.index=(this.index+1)%this.size};CircularQueue.prototype.toArray=function(){return[].slice.call(this.data,this.index).concat([].slice.call(this.data,0,this.index))};CircularQueue.prototype.clear=function(){this.data=[];this.index=0};CircularQueue.prototype.set=function(a){this.data=a;this.index=0};function dump_file(a,b){a instanceof Array||(a=[a]);a=new Blob(a);download(a,b)} function download(a,b){var c=document.createElement("a");c.download=b;c.href=window.URL.createObjectURL(a);c.dataset.downloadurl=["application/octet-stream",c.download,c.href].join(":");document.createEvent?(a=document.createEvent("MouseEvent"),a.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),c.dispatchEvent(a)):c.click();window.URL.revokeObjectURL(c.href)} v86util.Bitmap=function(a){"number"===typeof a?this.view=new Uint8Array(a+7>>3):a instanceof ArrayBuffer?this.view=new Uint8Array(a):console.assert(!1)};v86util.Bitmap.prototype.set=function(a,b){const c=a>>3;a=1<<(a&7);this.view[c]=b?this.view[c]|a:this.view[c]&~a};v86util.Bitmap.prototype.get=function(a){return this.view[a>>3]>>(a&7)&1};v86util.Bitmap.prototype.get_buffer=function(){return this.view.buffer};function hex_dump(a,b){var c=[];b=b||a.byteLength;for(var d,e,f=0;f>4;f++){d=h(f<<4,5)+" ";for(var k=0;16>k;k++)e=a[(f<<4)+k],d+=h(e,2)+" ";d+=" ";for(k=0;16>k;k++)e=a[(f<<4)+k],d+=33>e||126>8,0,0,0,0,0,0,0,0,0,0,67,16,212,130,0,0,0,0,0,0,0,0,0,0,0,0,this.irq,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];this.pci_bars=[{size:8},{size:4},void 0,void 0,{size:16}];this.name="ide"+e;this.device_control=2;a.io.register_read(this.ata_port|7,this,function(){dbg_log("lower irq",LOG_DISK);this.cpu.device_lower_irq(this.irq); return this.read_status()});a.io.register_read(this.ata_port_high|2,this,this.read_status);a.io.register_write(this.ata_port_high|2,this,this.write_control);a.io.register_read(this.ata_port|0,this,function(){return this.current_interface.read_data(1)},function(){return this.current_interface.read_data(2)},function(){return this.current_interface.read_data(4)});a.io.register_read(this.ata_port|1,this,function(){dbg_log("Read error: "+h(this.current_interface.error&255)+" slave="+(this.current_interface=== this.slave),LOG_DISK);return this.current_interface.error&255});a.io.register_read(this.ata_port|2,this,function(){dbg_log("Read bytecount: "+h(this.current_interface.bytecount&255),LOG_DISK);return this.current_interface.bytecount&255});a.io.register_read(this.ata_port|3,this,function(){dbg_log("Read sector: "+h(this.current_interface.sector&255),LOG_DISK);return this.current_interface.sector&255});a.io.register_read(this.ata_port|4,this,function(){dbg_log("Read 1F4: "+h(this.current_interface.cylinder_low& 255),LOG_DISK);return this.current_interface.cylinder_low&255});a.io.register_read(this.ata_port|5,this,function(){dbg_log("Read 1F5: "+h(this.current_interface.cylinder_high&255),LOG_DISK);return this.current_interface.cylinder_high&255});a.io.register_read(this.ata_port|6,this,function(){dbg_log("Read 1F6",LOG_DISK);return this.current_interface.drive_head&255});a.io.register_write(this.ata_port|0,this,function(k){this.current_interface.write_data_port8(k)},function(k){this.current_interface.write_data_port16(k)}, function(k){this.current_interface.write_data_port32(k)});a.io.register_write(this.ata_port|1,this,function(k){dbg_log("1F1/lba_count: "+h(k),LOG_DISK);this.master.lba_count=(this.master.lba_count<<8|k)&65535;this.slave.lba_count=(this.slave.lba_count<<8|k)&65535});a.io.register_write(this.ata_port|2,this,function(k){dbg_log("1F2/bytecount: "+h(k),LOG_DISK);this.master.bytecount=(this.master.bytecount<<8|k)&65535;this.slave.bytecount=(this.slave.bytecount<<8|k)&65535});a.io.register_write(this.ata_port| 3,this,function(k){dbg_log("1F3/sector: "+h(k),LOG_DISK);this.master.sector=(this.master.sector<<8|k)&65535;this.slave.sector=(this.slave.sector<<8|k)&65535});a.io.register_write(this.ata_port|4,this,function(k){dbg_log("1F4/sector low: "+h(k),LOG_DISK);this.master.cylinder_low=(this.master.cylinder_low<<8|k)&65535;this.slave.cylinder_low=(this.slave.cylinder_low<<8|k)&65535});a.io.register_write(this.ata_port|5,this,function(k){dbg_log("1F5/sector high: "+h(k),LOG_DISK);this.master.cylinder_high= (this.master.cylinder_high<<8|k)&65535;this.slave.cylinder_high=(this.slave.cylinder_high<<8|k)&65535});a.io.register_write(this.ata_port|6,this,function(k){var g=k&16;dbg_log("1F6/drive: "+h(k,2),LOG_DISK);g?(dbg_log("Slave",LOG_DISK),this.current_interface=this.slave):this.current_interface=this.master;this.master.drive_head=k;this.slave.drive_head=k;this.master.is_lba=this.slave.is_lba=k>>6&1;this.master.head=this.slave.head=k&15});this.dma_command=this.dma_status=this.prdt_addr=0;a.io.register_write(this.ata_port| 7,this,function(k){dbg_log("lower irq",LOG_DISK);this.cpu.device_lower_irq(this.irq);this.current_interface.ata_command(k)});a.io.register_read(this.master_port|4,this,void 0,void 0,this.dma_read_addr);a.io.register_write(this.master_port|4,this,void 0,void 0,this.dma_set_addr);a.io.register_read(this.master_port,this,this.dma_read_command8,void 0,this.dma_read_command);a.io.register_write(this.master_port,this,this.dma_write_command8,void 0,this.dma_write_command);a.io.register_read(this.master_port| 2,this,this.dma_read_status);a.io.register_write(this.master_port|2,this,this.dma_write_status);a.io.register_read(this.master_port|8,this,function(){dbg_log("DMA read 0x8",LOG_DISK);return 0});a.io.register_read(this.master_port|10,this,function(){dbg_log("DMA read 0xA",LOG_DISK);return 0});a.devices.pci.register_device(this);DEBUG&&Object.seal(this)} IDEDevice.prototype.read_status=function(){if(this.current_interface.buffer){var a=this.current_interface.status;dbg_log("ATA read status: "+h(a,2),LOG_DISK);return a}return 0};IDEDevice.prototype.write_control=function(a){dbg_log("set device control: "+h(a,2)+" interrupts "+(a&2?"disabled":"enabled"),LOG_DISK);a&4&&(dbg_log("Reset via control port",LOG_DISK),this.cpu.device_lower_irq(this.irq),this.master.device_reset(),this.slave.device_reset());this.device_control=a}; IDEDevice.prototype.dma_read_addr=function(){dbg_log("dma get address: "+h(this.prdt_addr,8),LOG_DISK);return this.prdt_addr};IDEDevice.prototype.dma_set_addr=function(a){dbg_log("dma set address: "+h(a,8),LOG_DISK);this.prdt_addr=a};IDEDevice.prototype.dma_read_status=function(){dbg_log("DMA read status: "+h(this.dma_status),LOG_DISK);return this.dma_status};IDEDevice.prototype.dma_write_status=function(a){dbg_log("DMA set status: "+h(a),LOG_DISK);this.dma_status&=~(a&6)}; IDEDevice.prototype.dma_read_command=function(){return this.dma_read_command8()|this.dma_read_status()<<16};IDEDevice.prototype.dma_read_command8=function(){dbg_log("DMA read command: "+h(this.dma_command),LOG_DISK);return this.dma_command};IDEDevice.prototype.dma_write_command=function(a){dbg_log("DMA write command: "+h(a),LOG_DISK);this.dma_write_command8(a&255);this.dma_write_status(a>>16&255)}; IDEDevice.prototype.dma_write_command8=function(a){dbg_log("DMA write command8: "+h(a),LOG_DISK);let b=this.dma_command;this.dma_command=a&9;if((b&1)!==(a&1))if(0===(a&1))this.dma_status&=-2;else switch(this.dma_status|=1,this.current_interface.current_command){case 37:case 200:this.current_interface.do_ata_read_sectors_dma();break;case 202:case 53:this.current_interface.do_ata_write_sectors_dma();break;case 160:this.current_interface.do_atapi_dma();break;default:dbg_log("Spurious dma command write, current command: "+ h(this.current_interface.current_command),LOG_DISK),dbg_assert(!1)}};IDEDevice.prototype.push_irq=function(){0===(this.device_control&2)&&(dbg_log("push irq",LOG_DISK),this.dma_status|=4,this.cpu.device_raise_irq(this.irq))}; IDEDevice.prototype.get_state=function(){var a=[];a[0]=this.master;a[1]=this.slave;a[2]=this.ata_port;a[3]=this.irq;a[4]=this.pci_id;a[5]=this.ata_port_high;a[6]=this.master_port;a[7]=this.name;a[8]=this.device_control;a[9]=this.prdt_addr;a[10]=this.dma_status;a[11]=this.current_interface===this.master;a[12]=this.dma_command;return a}; IDEDevice.prototype.set_state=function(a){this.master.set_state(a[0]);this.slave.set_state(a[1]);this.ata_port=a[2];this.irq=a[3];this.pci_id=a[4];this.ata_port_high=a[5];this.master_port=a[6];this.name=a[7];this.device_control=a[8];this.prdt_addr=a[9];this.dma_status=a[10];this.current_interface=a[11]?this.master:this.slave;this.dma_command=a[12]}; function IDEInterface(a,b,c,d,e,f,k){this.device=a;this.bus=k;this.nr=e;this.cpu=b;this.buffer=c;this.sector_size=d?CDROM_SECTOR_SIZE:HD_SECTOR_SIZE;this.is_atapi=d;this.cylinder_count=this.sectors_per_track=this.head_count=this.sector_count=0;this.buffer&&(this.sector_count=this.buffer.byteLength/this.sector_size,this.sector_count!==(this.sector_count|0)&&(dbg_log("Warning: Disk size not aligned with sector size",LOG_DISK),this.sector_count=Math.ceil(this.sector_count)),d?(this.head_count=1,this.sectors_per_track= 0):(this.head_count=16,this.sectors_per_track=63),this.cylinder_count=this.sector_count/this.head_count/this.sectors_per_track,this.cylinder_count!==(this.cylinder_count|0)&&(dbg_log("Warning: Rounding up cylinder count. Choose different head number",LOG_DISK),this.cylinder_count=Math.floor(this.cylinder_count)),a=b.devices.rtc,a.cmos_write(CMOS_BIOS_DISKTRANSFLAG,a.cmos_read(CMOS_BIOS_DISKTRANSFLAG)|1<<4*this.nr),a.cmos_write(CMOS_DISK_DATA,a.cmos_read(CMOS_DISK_DATA)&15|240),b=CMOS_DISK_DRIVE1_CYL, a.cmos_write(b+0,this.cylinder_count&255),a.cmos_write(b+1,this.cylinder_count>>8&255),a.cmos_write(b+2,this.head_count&255),a.cmos_write(b+3,255),a.cmos_write(b+4,255),a.cmos_write(b+5,200),a.cmos_write(b+6,this.cylinder_count&255),a.cmos_write(b+7,this.cylinder_count>>8&255),a.cmos_write(b+8,this.sectors_per_track&255));this.stats={sectors_read:0,sectors_written:0,bytes_read:0,bytes_written:0,loading:!1};this.buffer=c;this.drive_head=this.head=this.cylinder_high=this.cylinder_low=this.lba_count= this.sector=this.bytecount=this.is_lba=0;this.status=80;this.sectors_per_drq=128;this.data_pointer=this.error=0;this.data=new Uint8Array(65536);this.data16=new Uint16Array(this.data.buffer);this.data32=new Int32Array(this.data.buffer);this.data_end=this.data_length=0;this.current_atapi_command=this.current_command=-1;this.last_io_id=this.write_dest=0;this.in_progress_io_ids=new Set;this.cancelled_io_ids=new Set;Object.seal(this)} IDEInterface.prototype.device_reset=function(){this.is_atapi?(this.status=0,this.sector=this.error=this.bytecount=1,this.cylinder_low=20,this.cylinder_high=235):(this.status=81,this.sector=this.error=this.bytecount=1,this.cylinder_high=this.cylinder_low=0);this.cancel_io_operations()};IDEInterface.prototype.push_irq=function(){this.device.push_irq()}; IDEInterface.prototype.ata_command=function(a){dbg_log("ATA Command: "+h(a)+" slave="+(this.drive_head>>4&1),LOG_DISK);if(this.buffer)switch(this.current_command=a,this.error=0,a){case 8:dbg_log("ATA device reset",LOG_DISK);this.data_length=this.data_end=this.data_pointer=0;this.device_reset();this.push_irq();break;case 16:this.status=80;this.cylinder_low=0;this.push_irq();break;case 248:this.status=80;a=this.sector_count-1;this.sector=a&255;this.cylinder_low=a>>8&255;this.cylinder_high=a>>16&255; this.drive_head=this.drive_head&240|a>>24&15;this.push_irq();break;case 39:this.status=80;a=this.sector_count-1;this.sector=a&255;this.cylinder_low=a>>8&255;this.cylinder_high=a>>16&255;this.sector|=a>>24<<8&65280;this.push_irq();break;case 32:case 36:case 41:case 196:this.ata_read_sectors(a);break;case 48:case 52:case 57:case 197:this.ata_write_sectors(a);break;case 144:this.push_irq();this.error=257;this.status=80;break;case 145:this.status=80;this.push_irq();break;case 160:this.is_atapi&&(this.status= 88,this.data_allocate(12),this.data_end=12,this.bytecount=1,this.push_irq());break;case 161:dbg_log("ATA identify packet device",LOG_DISK);this.is_atapi?(this.create_identify_packet(),this.status=88,this.cylinder_low=20,this.cylinder_high=235):this.status=65;this.push_irq();break;case 198:dbg_log("Logical sectors per DRQ Block: "+h(this.bytecount&255),LOG_DISK);this.sectors_per_drq=this.bytecount&255;this.status=80;this.push_irq();break;case 37:case 200:this.ata_read_sectors_dma(a);break;case 53:case 202:this.ata_write_sectors_dma(a); break;case 64:dbg_log("read verify sectors",LOG_DISK);this.status=80;this.push_irq();break;case 218:dbg_log("Unimplemented: get media status",LOG_DISK);this.status=65;this.error=4;this.push_irq();break;case 224:dbg_log("ATA standby immediate",LOG_DISK);this.status=80;this.push_irq();break;case 225:dbg_log("ATA idle immediate",LOG_DISK);this.status=80;this.push_irq();break;case 231:dbg_log("ATA flush cache",LOG_DISK);this.status=80;this.push_irq();break;case 236:dbg_log("ATA identify device",LOG_DISK); if(this.is_atapi){this.status=65;this.error=4;this.push_irq();break}this.create_identify_packet();this.status=88;this.push_irq();break;case 234:dbg_log("flush cache ext",LOG_DISK);this.status=80;this.push_irq();break;case 239:dbg_log("set features: "+h(this.bytecount&255),LOG_DISK);this.status=80;this.push_irq();break;case 222:this.status=80;this.push_irq();break;case 245:dbg_log("security freeze lock",LOG_DISK);this.status=80;this.push_irq();break;case 249:dbg_log("Unimplemented: set max address", LOG_DISK);this.status=65;this.error=4;break;default:dbg_assert(!1,"New ATA cmd on 1F7: "+h(a),LOG_DISK),this.status=65,this.error=4}else dbg_log("abort: No buffer",LOG_DISK),this.error=4,this.status=65,this.push_irq()}; IDEInterface.prototype.atapi_handle=function(){dbg_log("ATAPI Command: "+h(this.data[0])+" slave="+(this.drive_head>>4&1),LOG_DISK);this.data_pointer=0;this.current_atapi_command=this.data[0];switch(this.current_atapi_command){case 0:dbg_log("test unit ready",LOG_DISK);this.data_allocate(0);this.data_end=this.data_length;this.status=80;break;case 3:this.data_allocate(this.data[4]);this.data_end=this.data_length;this.status=88;this.data[0]=240;this.data[2]=5;this.data[7]=8;break;case 18:var a=this.data[4]; this.status=88;dbg_log("inquiry: "+h(this.data[1],2)+" length="+a,LOG_DISK);this.data.set([5,128,1,49,31,0,0,0,83,79,78,89,32,32,32,32,67,68,45,82,79,77,32,67,68,85,45,49,48,48,48,32,49,46,49,97]);this.data_end=this.data_length=Math.min(36,a);break;case 26:this.data_allocate(this.data[4]);this.data_end=this.data_length;this.status=88;break;case 30:this.data_allocate(0);this.data_end=this.data_length;this.status=80;break;case 37:a=this.sector_count-1;this.data_set(new Uint8Array([a>>24&255,a>>16&255, a>>8&255,a&255,0,0,this.sector_size>>8&255,this.sector_size&255]));this.data_end=this.data_length;this.status=88;break;case 40:this.lba_count&1?this.atapi_read_dma(this.data):this.atapi_read(this.data);break;case 66:a=this.data[8];this.data_allocate(Math.min(8,a));this.data_end=this.data_length;dbg_log("read q subcode: length="+a,LOG_DISK);this.status=88;break;case 67:a=this.data[8]|this.data[7]<<8;var b=this.data[9]>>6;this.data_allocate(a);this.data_end=this.data_length;dbg_log("read toc: "+h(b, 2)+" length="+a+" "+(this.data[1]&2)+" "+h(this.data[6]),LOG_DISK);0===b?(a=this.sector_count,this.data.set(new Uint8Array([0,18,1,1,0,20,1,0,0,0,0,0,0,22,170,0,a>>24,a>>16&255,a>>8&255,a&255]))):1===b?this.data.set(new Uint8Array([0,10,1,1,0,0,0,0,0,0,0,0])):dbg_assert(!1,"Unimplemented format: "+b);this.status=88;break;case 70:a=this.data[8]|this.data[7]<<8;a=Math.min(a,32);this.data_allocate(a);this.data_end=this.data_length;this.data[0]=a-4>>24&255;this.data[1]=a-4>>16&255;this.data[2]=a-4>>8& 255;this.data[3]=a-4&255;this.data[6]=8;this.data[10]=3;this.status=88;break;case 81:this.data_allocate(0);this.data_end=this.data_length;this.status=80;break;case 82:dbg_log("Unimplemented ATAPI command: "+h(this.data[0]),LOG_DISK);this.status=81;this.data_length=0;this.error=80;break;case 90:a=this.data[8]|this.data[7]<<8;b=this.data[2];dbg_log("mode sense: "+h(b)+" length="+a,LOG_DISK);42===b&&this.data_allocate(Math.min(30,a));this.data_end=this.data_length;this.status=88;break;case 189:this.data_allocate(this.data[9]| this.data[8]<<8);this.data_end=this.data_length;this.data[5]=1;this.status=88;break;case 74:this.status=81;this.data_length=0;this.error=80;dbg_log("Unimplemented ATAPI command: "+h(this.data[0]),LOG_DISK);break;default:this.status=81,this.data_length=0,this.error=80,dbg_log("Unimplemented ATAPI command: "+h(this.data[0]),LOG_DISK),dbg_assert(!1)}this.bytecount=this.bytecount&-8|2;0===(this.status&128)&&this.push_irq();0===(this.status&128)&&0===this.data_length&&(this.bytecount|=1,this.status&=-9)}; IDEInterface.prototype.do_write=function(){this.status=80;dbg_assert(this.data_length<=this.data.length);var a=this.data.subarray(0,this.data_length);dbg_assert(0===this.data_length%512);this.ata_advance(this.current_command,this.data_length/512);this.push_irq();this.buffer.set(this.write_dest,a,function(){});this.report_write(this.data_length)}; IDEInterface.prototype.atapi_read=function(a){var b=a[2]<<24|a[3]<<16|a[4]<<8|a[5],c=a[7]<<8|a[8];a=a[1];var d=c*this.sector_size,e=b*this.sector_size;dbg_log("CD read lba="+h(b)+" lbacount="+h(c)+" bytecount="+h(d)+" flags="+h(a),LOG_DISK);this.data_length=0;var f=this.cylinder_high<<8&65280|this.cylinder_low&255;dbg_log(h(this.cylinder_high,2)+" "+h(this.cylinder_low,2),LOG_DISK);this.cylinder_low=this.cylinder_high=0;65535===f&&f--;f>d&&(f=d);e>=this.buffer.byteLength?(dbg_assert(!1,"CD read: Outside of disk end="+ h(e+d)+" size="+h(this.buffer.byteLength),LOG_DISK),this.status=255,this.push_irq()):0===d?(this.status=80,this.data_pointer=0):(d=Math.min(d,this.buffer.byteLength-e),this.status=208,this.report_read_start(),this.read_buffer(e,d,k=>{dbg_log("cd read: data arrived",LOG_DISK);this.data_set(k);this.status=88;this.bytecount=this.bytecount&-8|2;this.push_irq();this.data_end=f&=-4;this.data_end>this.data_length&&(this.data_end=this.data_length);this.cylinder_low=this.data_end&255;this.cylinder_high=this.data_end>> 8&255;this.report_read_end(d)}))}; IDEInterface.prototype.atapi_read_dma=function(a){var b=a[2]<<24|a[3]<<16|a[4]<<8|a[5],c=a[7]<<8|a[8];a=a[1];var d=c*this.sector_size,e=b*this.sector_size;dbg_log("CD read DMA lba="+h(b)+" lbacount="+h(c)+" bytecount="+h(d)+" flags="+h(a),LOG_DISK);e>=this.buffer.byteLength?(dbg_assert(!1,"CD read: Outside of disk end="+h(e+d)+" size="+h(this.buffer.byteLength),LOG_DISK),this.status=255,this.push_irq()):(this.status=208,this.report_read_start(),this.read_buffer(e,d,f=>{dbg_log("atapi_read_dma: Data arrived"); this.report_read_end(d);this.status=88;this.bytecount=this.bytecount&-8|2;this.data_set(f);this.do_atapi_dma()}))}; IDEInterface.prototype.do_atapi_dma=function(){if(0===(this.device.dma_status&1))dbg_log("do_atapi_dma: Status not set",LOG_DISK);else if(0===(this.status&8))dbg_log("do_atapi_dma: DRQ not set",LOG_DISK);else{dbg_log("atapi dma transfer len="+this.data_length,LOG_DISK);var a=this.device.prdt_addr,b=0,c=this.data;do{var d=this.cpu.read32s(a),e=this.cpu.read16(a+4),f=this.cpu.read8(a+7)&128;e||(e=65536);dbg_log("dma read dest="+h(d)+" count="+h(e)+" datalen="+h(this.data_length),LOG_DISK);this.cpu.write_blob(c.subarray(b, Math.min(b+e,this.data_length)),d);b+=e;a+=8;if(b>=this.data_length&&!f){dbg_log("leave early end="+ +f+" offset="+h(b)+" data_length="+h(this.data_length)+" cmd="+h(this.current_command),LOG_DISK);break}}while(!f);dbg_log("end offset="+b,LOG_DISK);this.status=80;this.device.dma_status&=-2;this.bytecount=this.bytecount&-8|3;this.push_irq()}}; IDEInterface.prototype.read_data=function(a){if(this.data_pointer>>1]:this.data32[this.data_pointer>>>2];this.data_pointer+=a;0===(this.data_pointer&(0===(this.data_end&4095)?4095:255))&&dbg_log("Read 1F0: "+h(this.data[this.data_pointer],2)+" cur="+h(this.data_pointer)+" cnt="+h(this.data_length), LOG_DISK);this.data_pointer>=this.data_end&&this.read_end();return b}dbg_log("Read 1F0: empty",LOG_DISK);this.data_pointer+=a;return 0}; IDEInterface.prototype.read_end=function(){dbg_log("read_end cmd="+h(this.current_command)+" data_pointer="+h(this.data_pointer)+" end="+h(this.data_end)+" length="+h(this.data_length),LOG_DISK);if(160===this.current_command)if(this.data_end===this.data_length)this.status=80,this.bytecount=this.bytecount&-8|3,this.push_irq();else{this.status=88;this.bytecount=this.bytecount&-8|2;this.push_irq();var a=this.cylinder_high<<8&65280|this.cylinder_low&255;this.data_end+a>this.data_length?(this.cylinder_low= this.data_length-this.data_end&255,this.cylinder_high=this.data_length-this.data_end>>8&255,this.data_end=this.data_length):this.data_end+=a;dbg_log("data_end="+h(this.data_end),LOG_DISK)}else this.error=0,this.data_pointer>=this.data_length?this.status=80:(196===this.current_command||41===this.current_command?(a=Math.min(this.sectors_per_drq,(this.data_length-this.data_end)/512),dbg_assert(0===a%1)):(dbg_assert(32===this.current_command||36===this.current_command),a=1),this.ata_advance(this.current_command, a),this.data_end+=512*a,this.status=88),this.push_irq()}; IDEInterface.prototype.write_data_port=function(a,b){dbg_assert(0===this.data_pointer%b);this.data_pointer>=this.data_end?dbg_log("Redundant write to data port: "+h(a)+" count="+h(this.data_end)+" cur="+h(this.data_pointer),LOG_DISK):((0===(this.data_pointer+b&(0===(this.data_end&4095)?4095:255))||20>this.data_end)&&dbg_log("Data port: "+h(a>>>0)+" count="+h(this.data_end)+" cur="+h(this.data_pointer),LOG_DISK),1===b?this.data[this.data_pointer++]=a:2===b?(this.data16[this.data_pointer>>>1]=a,this.data_pointer+= 2):(this.data32[this.data_pointer>>>2]=a,this.data_pointer+=4),dbg_assert(this.data_pointer<=this.data_end),this.data_pointer===this.data_end&&this.write_end())};IDEInterface.prototype.write_data_port8=function(a){this.write_data_port(a,1)};IDEInterface.prototype.write_data_port16=function(a){this.write_data_port(a,2)};IDEInterface.prototype.write_data_port32=function(a){this.write_data_port(a,4)}; IDEInterface.prototype.write_end=function(){160===this.current_command?this.atapi_handle():(dbg_log("write_end data_pointer="+h(this.data_pointer)+" data_length="+h(this.data_length),LOG_DISK),this.data_pointer>=this.data_length?this.do_write():(dbg_assert(48===this.current_command||52===this.current_command||197===this.current_command,"Unexpected command: "+h(this.current_command)),this.status=88,this.data_end+=512,this.push_irq()))}; IDEInterface.prototype.ata_advance=function(a,b){dbg_log("Advance sectors="+b+" old_bytecount="+this.bytecount,LOG_DISK);this.bytecount-=b;36===a||41===a||52===a||57===a||37===a||53===a?(a=b+this.get_lba48(),this.sector=a&255|a>>16&65280,this.cylinder_low=a>>8&255,this.cylinder_high=a>>16&255):this.is_lba?(a=b+this.get_lba28(),this.sector=a&255,this.cylinder_low=a>>8&255,this.cylinder_high=a>>16&255,this.head=this.head&-16|a&15):(a=b+this.get_chs(),b=a/(this.head_count*this.sectors_per_track)|0,this.cylinder_low= b&255,this.cylinder_high=b>>8&255,this.head=(a/this.sectors_per_track|0)%this.head_count&15,this.sector=a%this.sectors_per_track+1&255,dbg_assert(a===this.get_chs()))}; IDEInterface.prototype.ata_read_sectors=function(a){var b=36===a||41===a,c=this.get_count(b);b=this.get_lba(b);var d=32===a||36===a,e=c*this.sector_size,f=b*this.sector_size;dbg_log("ATA read cmd="+h(a)+" mode="+(this.is_lba?"lba":"chs")+" lba="+h(b)+" lbacount="+h(c)+" bytecount="+h(e),LOG_DISK);f+e>this.buffer.byteLength?(dbg_assert(!1,"ATA read: Outside of disk",LOG_DISK),this.status=255,this.push_irq()):(this.status=192,this.report_read_start(),this.read_buffer(f,e,k=>{dbg_log("ata_read: Data arrived", LOG_DISK);this.data_set(k);this.status=88;this.data_end=d?512:Math.min(e,512*this.sectors_per_drq);this.ata_advance(a,d?1:Math.min(c,this.sectors_per_track));this.push_irq();this.report_read_end(e)}))}; IDEInterface.prototype.ata_read_sectors_dma=function(a){var b=37===a;a=this.get_count(b);b=this.get_lba(b);var c=a*this.sector_size,d=b*this.sector_size;dbg_log("ATA DMA read lba="+h(b)+" lbacount="+h(a)+" bytecount="+h(c),LOG_DISK);d+c>this.buffer.byteLength?(dbg_assert(!1,"ATA read: Outside of disk",LOG_DISK),this.status=255,this.push_irq()):(this.status=88,this.device.dma_status|=1)}; IDEInterface.prototype.do_ata_read_sectors_dma=function(){var a=37===this.current_command,b=this.get_count(a);a=this.get_lba(a);var c=b*this.sector_size,d=a*this.sector_size;dbg_assert(a{dbg_log("do_ata_read_sectors_dma: Data arrived",LOG_DISK);var k=this.device.prdt_addr,g=0;dbg_assert(e===k);do{var l=this.cpu.read32s(k),m=this.cpu.read16(k+4),n=this.cpu.read8(k+7)&128;m||(m=65536,dbg_log("dma: prd count was 0", LOG_DISK));dbg_log("dma read transfer dest="+h(l)+" prd_count="+h(m),LOG_DISK);this.cpu.write_blob(f.subarray(g,g+m),l);g+=m;k+=8}while(!n);dbg_assert(g===c);this.ata_advance(this.current_command,b);this.status=80;this.device.dma_status&=-2;this.current_command=-1;this.push_irq();this.report_read_end(c)})}; IDEInterface.prototype.ata_write_sectors=function(a){var b=52===a||57===a,c=this.get_count(b);b=this.get_lba(b);a=48===a||52===a;var d=c*this.sector_size,e=b*this.sector_size;dbg_log("ATA write lba="+h(b)+" mode="+(this.is_lba?"lba":"chs")+" lbacount="+h(c)+" bytecount="+h(d),LOG_DISK);e+d>this.buffer.byteLength?(dbg_assert(!1,"ATA write: Outside of disk",LOG_DISK),this.status=255,this.push_irq()):(this.status=88,this.data_allocate_noclear(d),this.data_end=a?512:Math.min(d,512*this.sectors_per_drq), this.write_dest=e)};IDEInterface.prototype.ata_write_sectors_dma=function(a){var b=53===a;a=this.get_count(b);b=this.get_lba(b);var c=a*this.sector_size,d=b*this.sector_size;dbg_log("ATA DMA write lba="+h(b)+" lbacount="+h(a)+" bytecount="+h(c),LOG_DISK);d+c>this.buffer.byteLength?(dbg_assert(!1,"ATA DMA write: Outside of disk",LOG_DISK),this.status=255,this.push_irq()):(this.status=88,this.device.dma_status|=1)}; IDEInterface.prototype.do_ata_write_sectors_dma=function(){var a=53===this.current_command,b=this.get_count(a),c=this.get_lba(a);a=b*this.sector_size;c*=this.sector_size;var d=this.device.prdt_addr,e=0;dbg_log("prdt addr: "+h(d,8),LOG_DISK);const f=new Uint8Array(a);do{var k=this.cpu.read32s(d),g=this.cpu.read16(d+4),l=this.cpu.read8(d+7)&128;g||(g=65536,dbg_log("dma: prd count was 0",LOG_DISK));dbg_log("dma write transfer dest="+h(k)+" prd_count="+h(g),LOG_DISK);k=this.cpu.mem8.subarray(k,k+g);dbg_assert(k.length=== g);f.set(k,e);e+=g;d+=8}while(!l);dbg_assert(e===f.length);this.buffer.set(c,f,()=>{dbg_log("dma write completed",LOG_DISK);this.ata_advance(this.current_command,b);this.status=80;this.push_irq();this.device.dma_status&=-2;this.current_command=-1});this.report_write(a)}; IDEInterface.prototype.get_chs=function(){var a=this.cylinder_low&255|this.cylinder_high<<8&65280,b=this.head,c=this.sector&255;dbg_log("get_chs: c="+a+" h="+b+" s="+c,LOG_DISK);return(a*this.head_count+b)*this.sectors_per_track+c-1};IDEInterface.prototype.get_lba28=function(){return this.sector&255|this.cylinder_low<<8&65280|this.cylinder_high<<16&16711680|(this.head&15)<<24}; IDEInterface.prototype.get_lba48=function(){return(this.sector&255|this.cylinder_low<<8&65280|this.cylinder_high<<16&16711680|this.sector>>8<<24&4278190080)>>>0};IDEInterface.prototype.get_lba=function(a){return a?this.get_lba48():this.is_lba?this.get_lba28():this.get_chs()};IDEInterface.prototype.get_count=function(a){a?(a=this.bytecount,0===a&&(a=65536)):(a=this.bytecount&255,0===a&&(a=256));return a}; IDEInterface.prototype.create_identify_packet=function(){if(this.drive_head&16)this.data_allocate(0);else{for(var a=0;512>a;a++)this.data[a]=0;a=Math.min(16383,this.cylinder_count);this.data_set([64,this.is_atapi?133:0,a,a>>8,0,0,this.head_count,this.head_count>>8,this.sectors_per_track/512,this.sectors_per_track/512>>8,0,2,this.sectors_per_track,this.sectors_per_track>>8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,4,0,0,0,0,0,0,0,0,0,56,118,32,54,68,72,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,128,0,1,0,0,2,0,0,0,2,0,2,7,0,a,a>>8,this.head_count,this.head_count>>8,this.sectors_per_track,0,this.sector_count&255,this.sector_count>>8&255,this.sector_count>>16&255,this.sector_count>>24&255,0,0,this.sector_count&255,this.sector_count>>8&255,this.sector_count>>16&255,this.sector_count>>24&255,0,0,160===this.current_command?0:7,160===this.current_command?0:4,0,0,30,0,30,0,30,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,126,0,0,0,0,0,0,116,0,64,0,64,0,116,0,64,0,0,0,0,0,0,0,0,0,0,1,96,0,0,0,0,0,0,0,0,0,0,0,0,this.sector_count&255,this.sector_count>>8&255,this.sector_count>>16&255,this.sector_count>>24&255]);this.data_end=this.data_length=512}};IDEInterface.prototype.data_allocate=function(a){this.data_allocate_noclear(a);for(var b=0;b>2;b++)this.data32[b]=0}; IDEInterface.prototype.data_allocate_noclear=function(a){this.data.length{if(this.cancelled_io_ids.delete(d))dbg_assert(!this.in_progress_io_ids.has(d));else{var f=this.in_progress_io_ids.delete(d);dbg_assert(f);c(e)}})};IDEInterface.prototype.cancel_io_operations=function(){for(const a of this.in_progress_io_ids)this.cancelled_io_ids.add(a);this.in_progress_io_ids.clear()}; IDEInterface.prototype.get_state=function(){var a=[];a[0]=this.bytecount;a[1]=this.cylinder_count;a[2]=this.cylinder_high;a[3]=this.cylinder_low;a[4]=this.data_pointer;a[5]=0;a[6]=0;a[7]=0;a[8]=0;a[9]=this.drive_head;a[10]=this.error;a[11]=this.head;a[12]=this.head_count;a[13]=this.is_atapi;a[14]=this.is_lba;a[15]=this.lba_count;a[16]=this.data;a[17]=this.data_length;a[18]=this.sector;a[19]=this.sector_count;a[20]=this.sector_size;a[21]=this.sectors_per_drq;a[22]=this.sectors_per_track;a[23]=this.status; a[24]=this.write_dest;a[25]=this.current_command;a[26]=this.data_end;a[27]=this.current_atapi_command;a[28]=this.buffer;return a}; IDEInterface.prototype.set_state=function(a){this.bytecount=a[0];this.cylinder_count=a[1];this.cylinder_high=a[2];this.cylinder_low=a[3];this.data_pointer=a[4];this.drive_head=a[9];this.error=a[10];this.head=a[11];this.head_count=a[12];this.is_atapi=a[13];this.is_lba=a[14];this.lba_count=a[15];this.data=a[16];this.data_length=a[17];this.sector=a[18];this.sector_count=a[19];this.sector_size=a[20];this.sectors_per_drq=a[21];this.sectors_per_track=a[22];this.status=a[23];this.write_dest=a[24];this.current_command= a[25];this.data_end=a[26];this.current_atapi_command=a[27];this.data16=new Uint16Array(this.data.buffer);this.data32=new Int32Array(this.data.buffer);this.buffer&&this.buffer.set_state(a[28])};var PCI_CONFIG_ADDRESS=3320,PCI_CONFIG_DATA=3324; function PCI(a){this.pci_addr=new Uint8Array(4);this.pci_value=new Uint8Array(4);this.pci_response=new Uint8Array(4);this.pci_status=new Uint8Array(4);this.pci_addr32=new Int32Array(this.pci_addr.buffer);this.pci_value32=new Int32Array(this.pci_value.buffer);this.pci_response32=new Int32Array(this.pci_response.buffer);this.pci_status32=new Int32Array(this.pci_status.buffer);this.device_spaces=[];this.devices=[];this.cpu=a;for(var b=0;256>b;b++)this.device_spaces[b]=void 0,this.devices[b]=void 0;this.io= a.io;a.io.register_write(PCI_CONFIG_DATA,this,function(c){this.pci_write8(this.pci_addr32[0],c)},function(c){this.pci_write16(this.pci_addr32[0],c)},function(c){this.pci_write32(this.pci_addr32[0],c)});a.io.register_write(PCI_CONFIG_DATA+1,this,function(c){this.pci_write8(this.pci_addr32[0]+1|0,c)});a.io.register_write(PCI_CONFIG_DATA+2,this,function(c){this.pci_write8(this.pci_addr32[0]+2|0,c)},function(c){this.pci_write16(this.pci_addr32[0]+2|0,c)});a.io.register_write(PCI_CONFIG_DATA+3,this,function(c){this.pci_write8(this.pci_addr32[0]+ 3|0,c)});a.io.register_read_consecutive(PCI_CONFIG_DATA,this,function(){return this.pci_response[0]},function(){return this.pci_response[1]},function(){return this.pci_response[2]},function(){return this.pci_response[3]});a.io.register_read_consecutive(PCI_CONFIG_ADDRESS,this,function(){return this.pci_status[0]},function(){return this.pci_status[1]},function(){return this.pci_status[2]},function(){return this.pci_status[3]});a.io.register_write_consecutive(PCI_CONFIG_ADDRESS,this,function(c){this.pci_addr[0]= c&252},function(c){2===(this.pci_addr[1]&6)&&6===(c&6)?(dbg_log("CPU reboot via PCI"),a.reboot_internal()):this.pci_addr[1]=c},function(c){this.pci_addr[2]=c},function(c){this.pci_addr[3]=c;this.pci_query()});this.register_device({pci_id:0,pci_space:[134,128,55,18,0,0,0,0,2,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0],pci_bars:[],name:"82441FX PMC"});this.isa_bridge={pci_id:8, pci_space:[134,128,0,112,7,0,0,2,0,0,1,6,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],pci_bars:[],name:"82371SB PIIX3 ISA"};this.isa_bridge_space=this.register_device(this.isa_bridge);this.isa_bridge_space8=new Uint8Array(this.isa_bridge_space.buffer)}PCI.prototype.get_state=function(){for(var a=[],b=0;256>b;b++)a[b]=this.device_spaces[b];a[256]=this.pci_addr;a[257]=this.pci_value;a[258]=this.pci_response;a[259]=this.pci_status;return a}; PCI.prototype.set_state=function(a){for(var b=0;256>b;b++){var c=this.devices[b],d=a[b];if(c&&d){for(var e=0;e>3&31;var d="query enabled="+(this.pci_addr[3]>>7)+(" bdf="+h(a,4));d+=" dev="+h(c,2);d+=" addr="+h(b,2);c=this.device_spaces[a];void 0!==c?(this.pci_status32[0]=-2147483648,this.pci_response32[0]=b>2]:0,d+=" "+h(this.pci_addr32[0]>>>0,8)+" -> "+h(this.pci_response32[0]>>>0,8),b>=c.byteLength&&(d+=" (undef)"),d+=" ("+this.devices[a].name+")",dbg_log(d,LOG_PCI)):(this.pci_response32[0]= -1,this.pci_status32[0]=0)};PCI.prototype.pci_write8=function(a,b){var c=a>>8&65535;a&=255;var d=new Uint8Array(this.device_spaces[c].buffer),e=this.devices[c];d&&(dbg_assert(!(16<=a&&44>a||48<=a&&52>a),"PCI: Expected 32-bit write, got 8-bit (addr: "+h(a)+")"),dbg_log("PCI write8 dev="+h(c>>3,2)+" ("+e.name+") addr="+h(a,4)+" value="+h(b,2),LOG_PCI),d[a]=b)}; PCI.prototype.pci_write16=function(a,b){dbg_assert(0===(a&1));var c=a>>8&65535;a&=255;var d=new Uint16Array(this.device_spaces[c].buffer),e=this.devices[c];d&&(16<=a&&44>a?dbg_log("Warning: PCI: Expected 32-bit write, got 16-bit (addr: "+h(a)+")"):(dbg_assert(!(48<=a&&52>a),"PCI: Expected 32-bit write, got 16-bit (addr: "+h(a)+")"),dbg_log("PCI writ16 dev="+h(c>>3,2)+" ("+e.name+") addr="+h(a,4)+" value="+h(b,4),LOG_PCI),d[a>>>1]=b))}; PCI.prototype.pci_write32=function(a,b){dbg_assert(0===(a&3));var c=a>>8&65535;a&=255;var d=this.device_spaces[c],e=this.devices[c];if(d)if(16<=a&&40>a){var f=a-16>>2,k=e.pci_bars[f];dbg_log("BAR"+f+" exists="+(k?"y":"n")+" changed to "+h(b>>>0)+" dev="+h(c>>3,2)+" ("+e.name+") ",LOG_PCI);k?(dbg_assert(!(k.size&k.size-1),"bar size should be power of 2"),c=a>>2,e=d[c]&1,-1===(b|3|k.size-1)?(b=~(k.size-1)|e,0===e&&(d[c]=b)):0===e&&(f=k.original_bar,(b&-16)!==(f&-16)&&dbg_log("Warning: Changing memory bar not supported, ignored", LOG_PCI),d[c]=f),1===e&&(dbg_assert(1===e),e=d[c]&65534,f=b&65534,dbg_log("io bar changed from "+h(e>>>0,8)+" to "+h(f>>>0,8)+" size="+k.size,LOG_PCI),this.set_io_bars(k,e,f),d[c]=b|1)):d[a>>2]=0;dbg_log("BAR effective value: "+h(d[a>>2]>>>0),LOG_PCI)}else 48===a?(dbg_log("PCI write rom address dev="+h(c>>3,2)+" ("+e.name+") value="+h(b>>>0,8),LOG_PCI),d[a>>2]=e.pci_rom_size?-1===(b|2047)?-e.pci_rom_size|0:e.pci_rom_address|0:0):4===a?dbg_log("PCI write dev="+h(c>>3,2)+" ("+e.name+") addr="+h(a,4)+ " value="+h(b>>>0,8),LOG_PCI):(dbg_log("PCI write dev="+h(c>>3,2)+" ("+e.name+") addr="+h(a,4)+" value="+h(b>>>0,8),LOG_PCI),d[a>>>2]=b)}; PCI.prototype.register_device=function(a){dbg_assert(void 0!==a.pci_id);dbg_assert(void 0!==a.pci_space);dbg_assert(void 0!==a.pci_bars);var b=a.pci_id;dbg_log("PCI register bdf="+h(b)+" ("+a.name+")",LOG_PCI);dbg_assert(!this.devices[b]);dbg_assert(64<=a.pci_space.length);dbg_assert(b>4),LOG_FLOPPY);dbg_log("enable dma: "+!!(a&8),LOG_FLOPPY);dbg_log("reset fdc: "+!!(a&4),LOG_FLOPPY);dbg_log("drive select: "+(a&3),LOG_FLOPPY);dbg_log("DOR = "+h(a),LOG_FLOPPY);this.dor=a};FloppyController.prototype.check_drive_status=function(a){dbg_log("check drive status",LOG_FLOPPY);this.response_index=0;this.response_length=1;this.response_data[0]=32}; FloppyController.prototype.seek=function(a){dbg_log("seek",LOG_FLOPPY);dbg_assert(0===(a[0]&3),"Unhandled seek drive");this.last_cylinder=a[1];this.last_head=a[0]>>2&1;this.raise_irq()};FloppyController.prototype.calibrate=function(a){dbg_log("floppy calibrate",LOG_FLOPPY);this.raise_irq()};FloppyController.prototype.check_interrupt_status=function(){dbg_log("floppy check interrupt status",LOG_FLOPPY);this.response_index=0;this.response_length=2;this.response_data[0]=32;this.response_data[1]=this.last_cylinder}; FloppyController.prototype.do_sector=function(a,b){var c=b[2],d=b[1],e=b[3],f=128<this.sectors_per_track&&(d=1,c++,c>=this.number_of_heads&&(c=0,b++)),this.last_cylinder=b,this.last_head=c,this.last_sector=d,this.response_index=0,this.response_length=7,this.response_data[0]=c<<2|32,this.response_data[1]=0,this.response_data[2]=0,this.response_data[3]=b,this.response_data[4]=c,this.response_data[5]=d,this.response_data[6]=a[4],this.raise_irq())}; FloppyController.prototype.fix_drive_data=function(a){dbg_log("floppy fix drive data "+a,LOG_FLOPPY)};FloppyController.prototype.read_sector_id=function(a){dbg_log("floppy read sector id "+a,LOG_FLOPPY);this.response_index=0;this.response_length=7;this.response_data[0]=0;this.response_data[1]=0;this.response_data[2]=0;this.response_data[3]=0;this.response_data[4]=0;this.response_data[5]=0;this.response_data[6]=0;this.raise_irq()};FloppyController.prototype.raise_irq=function(){this.dor&8&&this.cpu.device_raise_irq(6)};CPU.prototype.mmap_read8=function(a){return this.memory_map_read8[a>>>MMAP_BLOCK_BITS](a)};CPU.prototype.mmap_write8=function(a,b){this.memory_map_write8[a>>>MMAP_BLOCK_BITS](a,b)};CPU.prototype.mmap_read16=function(a){var b=this.memory_map_read8[a>>>MMAP_BLOCK_BITS];return b(a)|b(a+1|0)<<8};CPU.prototype.mmap_write16=function(a,b){var c=this.memory_map_write8[a>>>MMAP_BLOCK_BITS];c(a,b&255);c(a+1|0,b>>8&255)};CPU.prototype.mmap_read32=function(a){return this.memory_map_read32[a>>>MMAP_BLOCK_BITS](a)}; CPU.prototype.mmap_write32=function(a,b){this.memory_map_write32[a>>>MMAP_BLOCK_BITS](a,b)};CPU.prototype.mmap_write64=function(a,b,c){var d=a>>>MMAP_BLOCK_BITS;dbg_assert(d===a+7>>>MMAP_BLOCK_BITS);d=this.memory_map_write32[d];d(a,b);d(a+4,c)};CPU.prototype.mmap_write128=function(a,b,c,d,e){var f=a>>>MMAP_BLOCK_BITS;dbg_assert(f===a+12>>>MMAP_BLOCK_BITS);f=this.memory_map_write32[f];f(a,b);f(a+4,c);f(a+8,d);f(a+12,e)}; CPU.prototype.write_blob=function(a,b){dbg_assert(a&&0<=a.length);a.length&&(dbg_assert(!this.in_mapped_range(b)),dbg_assert(!this.in_mapped_range(b+a.length-1)),this.jit_dirty_cache(b,b+a.length),this.mem8.set(a,b))};CPU.prototype.read_blob=function(a,b){b&&(dbg_assert(!this.in_mapped_range(a)),dbg_assert(!this.in_mapped_range(a+b-1)));return this.mem8.subarray(a,a+b)};function DMA(a){this.cpu=a;this.channel_page=new Uint8Array(8);this.channel_pagehi=new Uint8Array(8);this.channel_addr=new Uint16Array(8);this.channel_addr_init=new Uint16Array(8);this.channel_count=new Uint16Array(8);this.channel_count_init=new Uint16Array(8);this.channel_mask=new Uint8Array(8);this.channel_mode=new Uint8Array(8);this.unmask_listeners=[];this.lsb_msb_flipflop=0;a=a.io;a.register_write(0,this,this.port_addr_write.bind(this,0));a.register_write(2,this,this.port_addr_write.bind(this, 1));a.register_write(4,this,this.port_addr_write.bind(this,2));a.register_write(6,this,this.port_addr_write.bind(this,3));a.register_write(1,this,this.port_count_write.bind(this,0));a.register_write(3,this,this.port_count_write.bind(this,1));a.register_write(5,this,this.port_count_write.bind(this,2));a.register_write(7,this,this.port_count_write.bind(this,3));a.register_read(0,this,this.port_addr_read.bind(this,0));a.register_read(2,this,this.port_addr_read.bind(this,1));a.register_read(4,this,this.port_addr_read.bind(this, 2));a.register_read(6,this,this.port_addr_read.bind(this,3));a.register_read(1,this,this.port_count_read.bind(this,0));a.register_read(3,this,this.port_count_read.bind(this,1));a.register_read(5,this,this.port_count_read.bind(this,2));a.register_read(7,this,this.port_count_read.bind(this,3));a.register_write(192,this,this.port_addr_write.bind(this,4));a.register_write(196,this,this.port_addr_write.bind(this,5));a.register_write(200,this,this.port_addr_write.bind(this,6));a.register_write(204,this, this.port_addr_write.bind(this,7));a.register_write(194,this,this.port_count_write.bind(this,4));a.register_write(198,this,this.port_count_write.bind(this,5));a.register_write(202,this,this.port_count_write.bind(this,6));a.register_write(206,this,this.port_count_write.bind(this,7));a.register_read(192,this,this.port_addr_read.bind(this,4));a.register_read(196,this,this.port_addr_read.bind(this,5));a.register_read(200,this,this.port_addr_read.bind(this,6));a.register_read(204,this,this.port_addr_read.bind(this, 7));a.register_read(194,this,this.port_count_read.bind(this,4));a.register_read(198,this,this.port_count_read.bind(this,5));a.register_read(202,this,this.port_count_read.bind(this,6));a.register_read(206,this,this.port_count_read.bind(this,7));a.register_write(135,this,this.port_page_write.bind(this,0));a.register_write(131,this,this.port_page_write.bind(this,1));a.register_write(129,this,this.port_page_write.bind(this,2));a.register_write(130,this,this.port_page_write.bind(this,3));a.register_write(143, this,this.port_page_write.bind(this,4));a.register_write(139,this,this.port_page_write.bind(this,5));a.register_write(137,this,this.port_page_write.bind(this,6));a.register_write(138,this,this.port_page_write.bind(this,7));a.register_read(135,this,this.port_page_read.bind(this,0));a.register_read(131,this,this.port_page_read.bind(this,1));a.register_read(129,this,this.port_page_read.bind(this,2));a.register_read(130,this,this.port_page_read.bind(this,3));a.register_read(143,this,this.port_page_read.bind(this, 4));a.register_read(139,this,this.port_page_read.bind(this,5));a.register_read(137,this,this.port_page_read.bind(this,6));a.register_read(138,this,this.port_page_read.bind(this,7));a.register_write(1159,this,this.port_pagehi_write.bind(this,0));a.register_write(1155,this,this.port_pagehi_write.bind(this,1));a.register_write(1153,this,this.port_pagehi_write.bind(this,2));a.register_write(1154,this,this.port_pagehi_write.bind(this,3));a.register_write(1163,this,this.port_pagehi_write.bind(this,5)); a.register_write(1161,this,this.port_pagehi_write.bind(this,6));a.register_write(1162,this,this.port_pagehi_write.bind(this,7));a.register_read(1159,this,this.port_pagehi_read.bind(this,0));a.register_read(1155,this,this.port_pagehi_read.bind(this,1));a.register_read(1153,this,this.port_pagehi_read.bind(this,2));a.register_read(1154,this,this.port_pagehi_read.bind(this,3));a.register_read(1163,this,this.port_pagehi_read.bind(this,5));a.register_read(1161,this,this.port_pagehi_read.bind(this,6));a.register_read(1162, this,this.port_pagehi_read.bind(this,7));a.register_write(10,this,this.port_singlemask_write.bind(this,0));a.register_write(212,this,this.port_singlemask_write.bind(this,4));a.register_write(15,this,this.port_multimask_write.bind(this,0));a.register_write(222,this,this.port_multimask_write.bind(this,4));a.register_read(15,this,this.port_multimask_read.bind(this,0));a.register_read(222,this,this.port_multimask_read.bind(this,4));a.register_write(11,this,this.port_mode_write.bind(this,0));a.register_write(214, this,this.port_mode_write.bind(this,4));a.register_write(12,this,this.portC_write);a.register_write(216,this,this.portC_write)}DMA.prototype.get_state=function(){return[this.channel_page,this.channel_pagehi,this.channel_addr,this.channel_addr_init,this.channel_count,this.channel_count_init,this.channel_mask,this.channel_mode,this.lsb_msb_flipflop]}; DMA.prototype.set_state=function(a){this.channel_page=a[0];this.channel_pagehi=a[1];this.channel_addr=a[2];this.channel_addr_init=a[3];this.channel_count=a[4];this.channel_count_init=a[5];this.channel_mask=a[6];this.channel_mode=a[7];this.lsb_msb_flipflop=a[8]};DMA.prototype.port_count_write=function(a,b){dbg_log("count write ["+a+"] = "+h(b),LOG_DMA);this.channel_count[a]=this.flipflop_get(this.channel_count[a],b,!1);this.channel_count_init[a]=this.flipflop_get(this.channel_count_init[a],b,!0)}; DMA.prototype.port_count_read=function(a){dbg_log("count read ["+a+"] -> "+h(this.channel_count[a]),LOG_DMA);return this.flipflop_read(this.channel_count[a])};DMA.prototype.port_addr_write=function(a,b){dbg_log("addr write ["+a+"] = "+h(b),LOG_DMA);this.channel_addr[a]=this.flipflop_get(this.channel_addr[a],b,!1);this.channel_addr_init[a]=this.flipflop_get(this.channel_addr_init[a],b,!0)};DMA.prototype.port_addr_read=function(a){dbg_log("addr read ["+a+"] -> "+h(this.channel_addr[a]),LOG_DMA);return this.flipflop_read(this.channel_addr[a])}; DMA.prototype.port_pagehi_write=function(a,b){dbg_log("pagehi write ["+a+"] = "+h(b),LOG_DMA);this.channel_pagehi[a]=b};DMA.prototype.port_pagehi_read=function(a){dbg_log("pagehi read ["+a+"]",LOG_DMA);return this.channel_pagehi[a]};DMA.prototype.port_page_write=function(a,b){dbg_log("page write ["+a+"] = "+h(b),LOG_DMA);this.channel_page[a]=b};DMA.prototype.port_page_read=function(a){dbg_log("page read ["+a+"]",LOG_DMA);return this.channel_page[a]}; DMA.prototype.port_singlemask_write=function(a,b){a=(b&3)+a;b=b&4?1:0;dbg_log("singlechannel mask write ["+a+"] = "+b,LOG_DMA);this.update_mask(a,b)};DMA.prototype.port_multimask_write=function(a,b){dbg_log("multichannel mask write: "+h(b),LOG_DMA);for(var c=0;4>c;c++)this.update_mask(a+c,b&1<a.byteLength)dbg_log("DMA read outside of buffer",LOG_DMA),e(!0);else{var g=this.cpu;this.channel_addr[d]+=f;a.get(b,f,function(l){g.write_blob(l,k);e(!1)})}}; DMA.prototype.do_write=function(a,b,c,d,e){var f=this.channel_count[d]+1&65535,k=5<=d?2:1,g=f*k,l=this.address_get_8bit(d),m=!1,n=!1,r=this.channel_mode[d]&16;dbg_log("DMA write channel "+d,LOG_DMA);dbg_log("to "+h(l)+" len "+h(g),LOG_DMA);cg&&(dbg_log("DMA attempted to read more than provided",LOG_DMA),n=!0);b+g>a.byteLength?(dbg_log("DMA write outside of buffer",LOG_DMA),e(!0)):(this.channel_addr[d]+=f,this.channel_count[d]-= f,!m&&r&&(dbg_log("DMA autoinit",LOG_DMA),this.channel_addr[d]=this.channel_addr_init[d],this.channel_count[d]=this.channel_count_init[d]),a.set(b,this.cpu.mem8.subarray(l,l+g),()=>{n&&r?(dbg_log("DMA continuing from start",LOG_DMA),this.do_write(a,b+g,c-g,d,e)):e(!1)}))};DMA.prototype.address_get_8bit=function(a){var b=this.channel_addr[a];5<=a&&(b<<=1);b=b&65535|this.channel_page[a]<<16;return b|=this.channel_pagehi[a]<<24}; DMA.prototype.count_get_8bit=function(a){var b=this.channel_count[a]+1;5<=a&&(b*=2);return b};DMA.prototype.flipflop_get=function(a,b,c){c||(this.lsb_msb_flipflop^=1);return this.lsb_msb_flipflop?a&-256|b:a&-65281|b<<8};DMA.prototype.flipflop_read=function(a){return(this.lsb_msb_flipflop^=1)?a&255:a>>8&255};var OSCILLATOR_FREQ=1193.1816666; function PIT(a,b){this.cpu=a;this.bus=b;this.counter_start_time=new Float64Array(3);this.counter_start_value=new Uint16Array(3);this.counter_next_low=new Uint8Array(4);this.counter_enabled=new Uint8Array(4);this.counter_mode=new Uint8Array(4);this.counter_read_mode=new Uint8Array(4);this.counter_latch=new Uint8Array(4);this.counter_latch_value=new Uint16Array(3);this.counter_reload=new Uint16Array(3);a.io.register_read(97,this,function(){var c=v86.microtick(),d=66.66666666666667*c&1;c=this.did_rollover(2, c);return d<<4|c<<5});a.io.register_write(97,this,function(c){c&1?this.bus.send("pcspeaker-enable"):this.bus.send("pcspeaker-disable")});a.io.register_read(64,this,function(){return this.counter_read(0)});a.io.register_read(65,this,function(){return this.counter_read(1)});a.io.register_read(66,this,function(){return this.counter_read(2)});a.io.register_write(64,this,function(c){this.counter_write(0,c)});a.io.register_write(65,this,function(c){this.counter_write(1,c)});a.io.register_write(66,this, function(c){this.counter_write(2,c)});a.io.register_write(67,this,this.port43_write)}PIT.prototype.get_state=function(){var a=[];a[0]=this.counter_next_low;a[1]=this.counter_enabled;a[2]=this.counter_mode;a[3]=this.counter_read_mode;a[4]=this.counter_latch;a[5]=this.counter_latch_value;a[6]=this.counter_reload;a[7]=this.counter_start_time;a[8]=this.counter_start_value;return a}; PIT.prototype.set_state=function(a){this.counter_next_low=a[0];this.counter_enabled=a[1];this.counter_mode=a[2];this.counter_read_mode=a[3];this.counter_latch=a[4];this.counter_latch_value=a[5];this.counter_reload=a[6];this.counter_start_time=a[7];this.counter_start_value=a[8]}; PIT.prototype.timer=function(a,b){b||(this.counter_enabled[0]&&this.did_rollover(0,a)?(this.counter_start_value[0]=this.get_counter_value(0,a),this.counter_start_time[0]=a,dbg_log("pit interrupt. new value: "+this.counter_start_value[0],LOG_PIT),this.cpu.device_lower_irq(0),this.cpu.device_raise_irq(0),0===this.counter_mode[0]&&(this.counter_enabled[0]=0)):this.cpu.device_lower_irq(0));return 0}; PIT.prototype.get_counter_value=function(a,b){if(!this.counter_enabled[a])return 0;var c=b-this.counter_start_time[a],d=Math.floor(c*OSCILLATOR_FREQ);b=this.counter_start_value[a]-d;dbg_log("diff="+c+" dticks="+d+" value="+b+" reload="+this.counter_reload[a],LOG_PIT);c=this.counter_reload[a];b>=c?(dbg_log("Warning: Counter"+a+" value "+b+" is larger than reload "+c,LOG_PIT),b%=c):0>b&&(b=b%c+c);return b}; PIT.prototype.did_rollover=function(a,b){b-=this.counter_start_time[a];return 0>b?(dbg_log("Warning: PIT timer difference is negative, resetting"),!0):this.counter_start_value[a]>8;b=this.counter_next_low[a];3===this.counter_mode[a]&&(this.counter_next_low[a]^=1);a=this.get_counter_value(a,v86.microtick());return b?a&255:a>>8}; PIT.prototype.counter_write=function(a,b){this.counter_reload[a]=this.counter_next_low[a]?this.counter_reload[a]&-256|b:this.counter_reload[a]&255|b<<8;3===this.counter_read_mode[a]&&this.counter_next_low[a]||(this.counter_reload[a]||(this.counter_reload[a]=65535),this.counter_start_value[a]=this.counter_reload[a],this.counter_enabled[a]=!0,this.counter_start_time[a]=v86.microtick(),dbg_log("counter"+a+" reload="+h(this.counter_reload[a])+" tick="+(this.counter_reload[a]||65536)/OSCILLATOR_FREQ+"ms", LOG_PIT));3===this.counter_read_mode[a]&&(this.counter_next_low[a]^=1);this.bus.send("pcspeaker-update",[this.counter_mode[2],this.counter_reload[2]])}; PIT.prototype.port43_write=function(a){var b=a>>1&7,c=a&1,d=a>>6&3;a=a>>4&3;1===d&&dbg_log("Unimplemented timer1",LOG_PIT);3===d?dbg_log("Unimplemented read back",LOG_PIT):0===a?(this.counter_latch[d]=2,b=this.get_counter_value(d,v86.microtick()),dbg_log("latch: "+b,LOG_PIT),this.counter_latch_value[d]=b?b-1:0):(6<=b&&(b&=-5),dbg_log("Control: mode="+b+" ctr="+d+" read_mode="+a+" bcd="+c,LOG_PIT),this.counter_next_low[d]=1===a?0:1,0===d&&this.cpu.device_lower_irq(0),0!==b&&3!==b&&2!==b&&dbg_log("Unimplemented counter mode: "+ h(b),LOG_PIT),this.counter_mode[d]=b,this.counter_read_mode[d]=a,this.bus.send("pcspeaker-update",[this.counter_mode[2],this.counter_reload[2]]))};PIT.prototype.dump=function(){const a=this.counter_reload[0];dbg_log("counter0 ticks every "+(a||65536)/OSCILLATOR_FREQ+"ms (reload="+a+")")};var VGA_BANK_SIZE=65536,MAX_XRES=2560,MAX_YRES=1600,MAX_BPP=32,VGA_LFB_ADDRESS=3758096384,VGA_PIXEL_BUFFER_START=4*VGA_BANK_SIZE,VGA_PIXEL_BUFFER_SIZE=8*VGA_BANK_SIZE,VGA_MIN_MEMORY_SIZE=VGA_PIXEL_BUFFER_START+VGA_PIXEL_BUFFER_SIZE,VGA_HOST_MEMORY_SPACE_START=Uint32Array.from([655360,655360,720896,753664]),VGA_HOST_MEMORY_SPACE_SIZE=Uint32Array.from([131072,65536,32768,32768]); function VGAScreen(a,b,c){this.bus=b;this.vga_memory_size=c;this.cursor_address=0;this.cursor_scanline_start=14;this.cursor_scanline_end=15;this.max_cols=80;this.max_rows=25;this.virtual_height=this.virtual_width=this.screen_height=this.screen_width=0;this.layers=[];this.start_address_latched=this.start_address=0;this.crtc=new Uint8Array(25);this.line_compare=this.offset_register=this.preset_row_scan=this.underline_location_register=this.vertical_blank_start=this.vertical_display_enable_end=this.horizontal_blank_start= this.horizontal_display_enable_end=this.crtc_mode=0;this.graphical_mode_is_linear=!0;this.graphical_mode=!1;setTimeout(()=>{b.send("screen-set-mode",this.graphical_mode)},0);this.vga256_palette=new Int32Array(256);this.svga_height=this.svga_width=this.latch_dword=0;this.svga_enabled=!1;this.svga_bpp=32;this.svga_offset=this.svga_bank_offset=0;this.pci_space=[52,18,17,17,3,1,0,0,2,0,0,3,0,0,0,0,8,VGA_LFB_ADDRESS>>>8,VGA_LFB_ADDRESS>>>16,VGA_LFB_ADDRESS>>>24,0,0,0,0,0,0,191,254,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,244,26,0,17,0,0,190,254,0,0,0,0,0,0,0,0,0,0,0,0];this.pci_id=144;this.pci_bars=[{size:c}];this.pci_rom_size=65536;this.pci_rom_address=4272947200;this.name="vga";this.stats={is_graphical:!1,res_x:0,res_y:0,bpp:0};this.dac_state=this.dac_color_index_read=this.dac_color_index_write=this.index_crtc=0;this.dac_map=new Uint8Array(16);this.attribute_controller_index=-1;this.palette_source=32;this.color_select=this.horizontal_panning=this.color_plane_enable=this.attribute_mode=0;this.sequencer_index= -1;this.plane_write_bm=15;this.clocking_mode=this.sequencer_memory_mode=0;this.graphics_index=-1;this.planar_rotate_reg=this.planar_mode=this.plane_read=0;this.planar_bitmap=255;this.max_scan_line=this.color_dont_care=this.color_compare=this.miscellaneous_graphics_register=this.planar_setreset_enable=this.planar_setreset=0;this.port_3DA_value=this.miscellaneous_output_register=255;c=a.io;c.register_write(960,this,this.port3C0_write);c.register_read(960,this,this.port3C0_read,this.port3C0_read16); c.register_read(961,this,this.port3C1_read);c.register_write(962,this,this.port3C2_write);c.register_write_consecutive(964,this,this.port3C4_write,this.port3C5_write);c.register_read(964,this,this.port3C4_read);c.register_read(965,this,this.port3C5_read);c.register_write_consecutive(974,this,this.port3CE_write,this.port3CF_write);c.register_read(974,this,this.port3CE_read);c.register_read(975,this,this.port3CF_read);c.register_write(967,this,this.port3C7_write);c.register_read(967,this,this.port3C7_read); c.register_write(968,this,this.port3C8_write);c.register_read(968,this,this.port3C8_read);c.register_write(969,this,this.port3C9_write);c.register_read(969,this,this.port3C9_read);c.register_read(972,this,this.port3CC_read);c.register_write_consecutive(980,this,this.port3D4_write,this.port3D5_write);c.register_read(980,this,this.port3D4_read);c.register_read(981,this,this.port3D5_read,()=>{dbg_log("Warning: 16-bit read from 3D5",LOG_VGA);return this.port3D5_read()});c.register_read(970,this,function(){dbg_log("3CA read", LOG_VGA);return 0});c.register_read(986,this,this.port3DA_read);c.register_read(954,this,this.port3DA_read);this.dispi_index=-1;this.dispi_enable_value=0;c.register_write(462,this,void 0,this.port1CE_write);c.register_write(463,this,void 0,this.port1CF_write);c.register_read(463,this,void 0,this.port1CF_read);void 0===this.vga_memory_size||this.vga_memory_size[b.screen_x,b.screen_y,b.buffer_x,b.buffer_y,b.buffer_width,b.buffer_height]);a[7]=this.dac_state;a[8]=this.start_address;a[9]=this.graphical_mode;a[10]=this.vga256_palette;a[11]=this.latch_dword;a[12]=this.color_compare;a[13]=this.color_dont_care;a[14]=this.miscellaneous_graphics_register; a[15]=this.svga_width;a[16]=this.svga_height;a[17]=this.crtc_mode;a[18]=this.svga_enabled;a[19]=this.svga_bpp;a[20]=this.svga_bank_offset;a[21]=this.svga_offset;a[22]=this.index_crtc;a[23]=this.dac_color_index_write;a[24]=this.dac_color_index_read;a[25]=this.dac_map;a[26]=this.sequencer_index;a[27]=this.plane_write_bm;a[28]=this.sequencer_memory_mode;a[29]=this.graphics_index;a[30]=this.plane_read;a[31]=this.planar_mode;a[32]=this.planar_rotate_reg;a[33]=this.planar_bitmap;a[34]=this.max_scan_line; a[35]=this.miscellaneous_output_register;a[36]=this.port_3DA_value;a[37]=this.dispi_index;a[38]=this.dispi_enable_value;a[39]=this.svga_memory;a[40]=this.graphical_mode_is_linear;a[41]=this.attribute_controller_index;a[42]=this.offset_register;a[43]=this.planar_setreset;a[44]=this.planar_setreset_enable;a[45]=this.start_address_latched;a[46]=this.crtc;a[47]=this.horizontal_display_enable_end;a[48]=this.horizontal_blank_start;a[49]=this.vertical_display_enable_end;a[50]=this.vertical_blank_start;a[51]= this.underline_location_register;a[52]=this.preset_row_scan;a[53]=this.offset_register;a[54]=this.palette_source;a[55]=this.attribute_mode;a[56]=this.color_plane_enable;a[57]=this.horizontal_panning;a[58]=this.color_select;a[59]=this.clocking_mode;a[60]=this.line_compare;return a}; VGAScreen.prototype.set_state=function(a){this.vga_memory_size=a[0];this.cursor_address=a[1];this.cursor_scanline_start=a[2];this.cursor_scanline_end=a[3];this.max_cols=a[4];this.max_rows=a[5];this.layers=a[6].map(b=>({screen_x:b[0],screen_y:b[1],buffer_x:b[2],buffer_y:b[3],buffer_width:b[4],buffer_height:b[5]}));this.dac_state=a[7];this.start_address=a[8];this.graphical_mode=a[9];this.vga256_palette=a[10];this.latch_dword=a[11];this.color_compare=a[12];this.color_dont_care=a[13];this.miscellaneous_graphics_register= a[14];this.svga_width=a[15];this.svga_height=a[16];this.crtc_mode=a[17];this.svga_enabled=a[18];this.svga_bpp=a[19];this.svga_bank_offset=a[20];this.svga_offset=a[21];this.index_crtc=a[22];this.dac_color_index_write=a[23];this.dac_color_index_read=a[24];this.dac_map=a[25];this.sequencer_index=a[26];this.plane_write_bm=a[27];this.sequencer_memory_mode=a[28];this.graphics_index=a[29];this.plane_read=a[30];this.planar_mode=a[31];this.planar_rotate_reg=a[32];this.planar_bitmap=a[33];this.max_scan_line= a[34];this.miscellaneous_output_register=a[35];this.port_3DA_value=a[36];this.dispi_index=a[37];this.dispi_enable_value=a[38];this.svga_memory.set(a[39]);this.graphical_mode_is_linear=a[40];this.attribute_controller_index=a[41];this.offset_register=a[42];this.planar_setreset=a[43];this.planar_setreset_enable=a[44];this.start_address_latched=a[45];this.crtc.set(a[46]);this.horizontal_display_enable_end=a[47];this.horizontal_blank_start=a[48];this.vertical_display_enable_end=a[49];this.vertical_blank_start= a[50];this.underline_location_register=a[51];this.preset_row_scan=a[52];this.offset_register=a[53];this.palette_source=a[54];this.attribute_mode=a[55];this.color_plane_enable=a[56];this.horizontal_panning=a[57];this.color_select=a[58];this.clocking_mode=a[59];this.line_compare=a[60];this.bus.send("screen-set-mode",this.graphical_mode);this.graphical_mode?(this.screen_height=this.screen_width=0,this.svga_enabled?(this.set_size_graphical(this.svga_width,this.svga_height,this.svga_bpp,this.svga_width, this.svga_height),this.update_layers()):(this.update_vga_size(),this.complete_replot())):(this.set_size_text(this.max_cols,this.max_rows),this.update_cursor_scanline(),this.update_cursor());this.complete_redraw()}; VGAScreen.prototype.vga_memory_read=function(a){if(this.svga_enabled&&this.graphical_mode_is_linear)return a=a-655360|this.svga_bank_offset,this.svga_memory[a];var b=this.miscellaneous_graphics_register>>2&3;a-=VGA_HOST_MEMORY_SPACE_START[b];if(0>a||a>=VGA_HOST_MEMORY_SPACE_SIZE[b])return dbg_log("vga read outside memory space: addr:"+h(a),LOG_VGA),0;this.latch_dword=this.plane0[a];this.latch_dword|=this.plane1[a]<<8;this.latch_dword|=this.plane2[a]<<16;this.latch_dword|=this.plane3[a]<<24;if(this.planar_mode& 8)return b=255,this.color_dont_care&1&&(b&=this.plane0[a]^~(this.color_compare&1?255:0)),this.color_dont_care&2&&(b&=this.plane1[a]^~(this.color_compare&2?255:0)),this.color_dont_care&4&&(b&=this.plane2[a]^~(this.color_compare&4?255:0)),this.color_dont_care&8&&(b&=this.plane3[a]^~(this.color_compare&8?255:0)),b;b=this.plane_read;this.graphical_mode?this.sequencer_memory_mode&8?(b=a&3,a&=-4):this.planar_mode&16&&(b=a&1,a&=-2):b=0;return this.vga_memory[b<<16|a]}; VGAScreen.prototype.vga_memory_write=function(a,b){if(this.svga_enabled&&this.graphical_mode&&this.graphical_mode_is_linear)this.vga_memory_write_graphical_linear(a-655360,b);else{var c=this.miscellaneous_graphics_register>>2&3;a-=VGA_HOST_MEMORY_SPACE_START[c];0>a||a>=VGA_HOST_MEMORY_SPACE_SIZE[c]?dbg_log("vga write outside memory space: addr:"+h(a)+", value:"+h(b),LOG_VGA):this.graphical_mode?this.vga_memory_write_graphical(a,b):this.plane_write_bm&3&&this.vga_memory_write_text_mode(a,b)}}; VGAScreen.prototype.vga_memory_write_graphical_linear=function(a,b){a|=this.svga_bank_offset;this.diff_addr_min=athis.diff_addr_max?a:this.diff_addr_max;this.svga_memory[a]=b}; VGAScreen.prototype.vga_memory_write_graphical=function(a,b){var c=this.planar_mode&3,d=this.apply_feed(this.planar_bitmap),e=this.apply_expand(this.planar_setreset),f=this.apply_expand(this.planar_setreset_enable);switch(c){case 0:b=this.apply_rotate(b);var k=this.apply_feed(b);k=this.apply_setreset(k,f);k=this.apply_logical(k,this.latch_dword);k=this.apply_bitmask(k,d);break;case 1:k=this.latch_dword;break;case 2:k=this.apply_expand(b);k=this.apply_logical(k,this.latch_dword);k=this.apply_bitmask(k, d);break;case 3:b=this.apply_rotate(b),d&=this.apply_feed(b),k=this.apply_bitmask(e,d)}b=15;switch(this.sequencer_memory_mode&12){case 0:b=5<<(a&1);a&=-2;break;case 8:case 12:b=1<<(a&3),a&=-4}b&=this.plane_write_bm;b&1&&(this.plane0[a]=k>>0&255);b&2&&(this.plane1[a]=k>>8&255);b&4&&(this.plane2[a]=k>>16&255);b&8&&(this.plane3[a]=k>>24&255);a=this.vga_addr_to_pixel(a);this.partial_replot(a,a+7)};VGAScreen.prototype.apply_feed=function(a){return a|a<<8|a<<16|a<<24}; VGAScreen.prototype.apply_expand=function(a){return(a&1?255:0)|(a&2?255:0)<<8|(a&4?255:0)<<16|(a&8?255:0)<<24};VGAScreen.prototype.apply_rotate=function(a){return(a|a<<8)>>>(this.planar_rotate_reg&7)&255};VGAScreen.prototype.apply_setreset=function(a,b){var c=this.apply_expand(this.planar_setreset);return(a|b&c)&(~b|c)};VGAScreen.prototype.apply_logical=function(a,b){switch(this.planar_rotate_reg&24){case 8:return a&b;case 16:return a|b;case 24:return a^b}return a}; VGAScreen.prototype.apply_bitmask=function(a,b){return b&a|~b&this.latch_dword};VGAScreen.prototype.text_mode_redraw=function(){for(var a=this.start_address<<1,b,c,d=0;d>4&15],this.vga256_palette[c&15]]),a+=2}; VGAScreen.prototype.vga_memory_write_text_mode=function(a,b){var c=(a>>1)-this.start_address,d=c/this.max_cols|0;c%=this.max_cols;if(a&1){var e=b;var f=this.vga_memory[a&-2]}else f=b,e=this.vga_memory[a|1];this.bus.send("screen-put-char",[d,c,f,this.vga256_palette[e>>4&15],this.vga256_palette[e&15]]);this.vga_memory[a]=b}; VGAScreen.prototype.update_cursor=function(){var a=(this.cursor_address-this.start_address)/this.max_cols|0,b=(this.cursor_address-this.start_address)%this.max_cols;a=Math.min(this.max_rows-1,a);this.bus.send("screen-update-cursor",[a,b])};VGAScreen.prototype.svga_memory_read8=function(a){return this.svga_memory[a&268435455]}; VGAScreen.prototype.svga_memory_read32=function(a){a&=268435455;return a&3?this.svga_memory[a]|this.svga_memory[a+1]<<8|this.svga_memory[a+2]<<16|this.svga_memory[a+3]<<24:this.svga_memory32[a>>2]};VGAScreen.prototype.svga_memory_write8=function(a,b){a&=268435455;this.svga_memory[a]=b;this.diff_addr_min=athis.diff_addr_max?a:this.diff_addr_max}; VGAScreen.prototype.svga_memory_write32=function(a,b){a&=268435455;this.diff_addr_min=athis.diff_addr_max?a+3:this.diff_addr_max;this.svga_memory[a]=b;this.svga_memory[a+1]=b>>8;this.svga_memory[a+2]=b>>16;this.svga_memory[a+3]=b>>24}; VGAScreen.prototype.complete_redraw=function(){dbg_log("complete redraw",LOG_VGA);this.graphical_mode?(this.diff_addr_min=0,this.diff_addr_max=this.svga_enabled?this.vga_memory_size:VGA_PIXEL_BUFFER_SIZE):this.text_mode_redraw()};VGAScreen.prototype.complete_replot=function(){dbg_log("complete replot",LOG_VGA);this.graphical_mode&&!this.svga_enabled&&(this.diff_plot_min=0,this.diff_plot_max=VGA_PIXEL_BUFFER_SIZE,this.complete_redraw())}; VGAScreen.prototype.partial_redraw=function(a,b){athis.diff_addr_max&&(this.diff_addr_max=b)};VGAScreen.prototype.partial_replot=function(a,b){athis.diff_plot_max&&(this.diff_plot_max=b);this.partial_redraw(a,b)};VGAScreen.prototype.reset_diffs=function(){this.diff_addr_min=this.vga_memory_size;this.diff_addr_max=0;this.diff_plot_min=this.vga_memory_size;this.diff_plot_max=0};VGAScreen.prototype.destroy=function(){}; VGAScreen.prototype.vga_bytes_per_line=function(){var a=this.offset_register<<2;this.underline_location_register&64?a<<=1:this.crtc_mode&64&&(a>>>=1);return a};VGAScreen.prototype.vga_addr_shift_count=function(){var a=128+(~this.underline_location_register&this.crtc_mode&64);a-=this.underline_location_register&64;a-=this.attribute_mode&64;return a>>>6}; VGAScreen.prototype.vga_addr_to_pixel=function(a){var b=this.vga_addr_shift_count();if(~this.crtc_mode&3){var c=a-this.start_address;c&=this.crtc_mode<<13|-24577;c<<=b;var d=c/this.virtual_width|0;c%=this.virtual_width;switch(this.crtc_mode&3){case 2:d=d<<1|a>>13&1;break;case 1:d=d<<1|a>>14&1;break;case 0:d=d<<2|a>>13&3}return d*this.virtual_width+c+(this.start_address<>>=1);a=Math.ceil(a/(1+(this.max_scan_line&31)));this.crtc_mode&1||(a<<=1);this.crtc_mode&2||(a<<=1);return a};VGAScreen.prototype.set_size_text=function(a,b){this.max_cols=a;this.max_rows=b;this.bus.send("screen-set-size-text",[a,b])}; VGAScreen.prototype.set_size_graphical=function(a,b,c,d,e){this.stats.is_graphical&&this.stats.bpp===c&&this.screen_width===a&&this.screen_height===b&&this.virtual_width===d&&this.virtual_height===e||(this.screen_width=a,this.screen_height=b,this.virtual_width=d,this.virtual_height=e,this.stats.bpp=c,this.stats.is_graphical=!0,this.stats.res_x=a,this.stats.res_y=b,this.bus.send("screen-set-size-graphical",[a,b,d,e,c]))}; VGAScreen.prototype.update_vga_size=function(){if(!this.svga_enabled){var a=Math.min(1+this.horizontal_display_enable_end,this.horizontal_blank_start),b=Math.min(1+this.vertical_display_enable_end,this.vertical_blank_start);if(a&&b)if(this.graphical_mode){a<<=3;var c=this.offset_register<<4;this.attribute_mode&64&&(a>>>=1,c>>>=1);b=this.scan_line_to_screen_row(b);var d=Math.ceil(VGA_HOST_MEMORY_SPACE_SIZE[0]/this.vga_bytes_per_line());this.set_size_graphical(a,b,8,c,d);this.update_vertical_retrace(); this.update_layers()}else this.max_scan_line&128&&(b>>>=1),c=b/(1+(this.max_scan_line&31))|0,a&&c&&this.set_size_text(a,c)}}; VGAScreen.prototype.update_layers=function(){this.graphical_mode||this.text_mode_redraw();if(this.svga_enabled)this.layers=[];else if(this.virtual_width&&this.screen_width)if(!this.palette_source||this.clocking_mode&32)this.layers=[],this.bus.send("screen-clear");else{var a=this.start_address_latched,b=this.horizontal_panning;this.attribute_mode&64&&(b>>>=1);var c=this.preset_row_scan>>5&3,d=this.vga_addr_to_pixel(a+c);a=d/this.virtual_width|0;var e=d%this.virtual_width+b;d=this.scan_line_to_screen_row(1+ this.line_compare);d=Math.min(d,this.screen_height);var f=this.screen_height-d;this.layers=[];e=-e;for(var k=0;ethis.attribute_controller_index)dbg_log("internal palette: "+h(this.attribute_controller_index)+" -> "+h(a),LOG_VGA),this.dac_map[this.attribute_controller_index]= a,this.attribute_mode&64||this.complete_redraw();else switch(this.attribute_controller_index){case 16:dbg_log("3C0 / attribute mode control: "+h(a),LOG_VGA);if(this.attribute_mode!==a){var b=this.attribute_mode;this.attribute_mode=a;var c=0<(a&1);this.svga_enabled||this.graphical_mode===c||(this.graphical_mode=c,this.bus.send("screen-set-mode",this.graphical_mode));(b^a)&64&&this.complete_replot();this.update_vga_size();this.complete_redraw()}break;case 18:dbg_log("3C0 / color plane enable: "+h(a), LOG_VGA);this.color_plane_enable!==a&&(this.color_plane_enable=a,this.complete_redraw());break;case 19:dbg_log("3C0 / horizontal panning: "+h(a),LOG_VGA);this.horizontal_panning!==a&&(this.horizontal_panning=a&15,this.update_layers());break;case 20:dbg_log("3C0 / color select: "+h(a),LOG_VGA);this.color_select!==a&&(this.color_select=a,this.complete_redraw());break;default:dbg_log("3C0 / attribute controller write "+h(this.attribute_controller_index)+": "+h(a),LOG_VGA)}this.attribute_controller_index= -1}};VGAScreen.prototype.port3C0_read=function(){dbg_log("3C0 read",LOG_VGA);return this.attribute_controller_index|this.palette_source};VGAScreen.prototype.port3C0_read16=function(){dbg_log("3C0 read16",LOG_VGA);return this.port3C0_read()&255|this.port3C1_read()<<8&65280}; VGAScreen.prototype.port3C1_read=function(){if(16>this.attribute_controller_index)return dbg_log("3C1 / internal palette read: "+h(this.attribute_controller_index)+" -> "+h(this.dac_map[this.attribute_controller_index]),LOG_VGA),this.dac_map[this.attribute_controller_index]&255;switch(this.attribute_controller_index){case 16:return dbg_log("3C1 / attribute mode read: "+h(this.attribute_mode),LOG_VGA),this.attribute_mode;case 18:return dbg_log("3C1 / color plane enable read: "+h(this.color_plane_enable), LOG_VGA),this.color_plane_enable;case 19:return dbg_log("3C1 / horizontal panning read: "+h(this.horizontal_panning),LOG_VGA),this.horizontal_panning;case 20:return dbg_log("3C1 / color select read: "+h(this.color_select),LOG_VGA),this.color_select;default:dbg_log("3C1 / attribute controller read "+h(this.attribute_controller_index),LOG_VGA)}return 255};VGAScreen.prototype.port3C2_write=function(a){dbg_log("3C2 / miscellaneous output register = "+h(a),LOG_VGA);this.miscellaneous_output_register=a}; VGAScreen.prototype.port3C4_write=function(a){this.sequencer_index=a};VGAScreen.prototype.port3C4_read=function(){return this.sequencer_index}; VGAScreen.prototype.port3C5_write=function(a){switch(this.sequencer_index){case 1:dbg_log("clocking mode: "+h(a),LOG_VGA);var b=this.clocking_mode;this.clocking_mode=a;(b^a)&32&&this.update_layers();break;case 2:dbg_log("plane write mask: "+h(a),LOG_VGA);this.plane_write_bm=a;break;case 4:dbg_log("sequencer memory mode: "+h(a),LOG_VGA);this.sequencer_memory_mode=a;break;default:dbg_log("3C5 / sequencer write "+h(this.sequencer_index)+": "+h(a),LOG_VGA)}}; VGAScreen.prototype.port3C5_read=function(){dbg_log("3C5 / sequencer read "+h(this.sequencer_index),LOG_VGA);switch(this.sequencer_index){case 1:return this.clocking_mode;case 2:return this.plane_write_bm;case 4:return this.sequencer_memory_mode;case 6:return 18}return 0};VGAScreen.prototype.port3C7_write=function(a){dbg_log("3C7 write: "+h(a),LOG_VGA);this.dac_color_index_read=3*a;this.dac_state&=0};VGAScreen.prototype.port3C7_read=function(){return this.dac_state}; VGAScreen.prototype.port3C8_write=function(a){this.dac_color_index_write=3*a;this.dac_state|=3};VGAScreen.prototype.port3C8_read=function(){return this.dac_color_index_write/3|0}; VGAScreen.prototype.port3C9_write=function(a){var b=this.dac_color_index_write/3|0,c=this.dac_color_index_write%3,d=this.vga256_palette[b];a=255*(a&63)/63|0;0===c?d=d&-16711681|a<<16:1===c?d=d&-65281|a<<8:(d=d&-256|a,dbg_log("dac set color, index="+h(b)+" value="+h(d),LOG_VGA));this.vga256_palette[b]!==d&&(this.vga256_palette[b]=d,this.complete_redraw());this.dac_color_index_write++}; VGAScreen.prototype.port3C9_read=function(){dbg_log("3C9 read",LOG_VGA);var a=this.dac_color_index_read%3,b=this.vga256_palette[this.dac_color_index_read/3|0];this.dac_color_index_read++;return(b>>8*(2-a)&255)/255*63|0};VGAScreen.prototype.port3CC_read=function(){dbg_log("3CC read",LOG_VGA);return this.miscellaneous_output_register};VGAScreen.prototype.port3CE_write=function(a){this.graphics_index=a};VGAScreen.prototype.port3CE_read=function(){return this.graphics_index}; VGAScreen.prototype.port3CF_write=function(a){switch(this.graphics_index){case 0:this.planar_setreset=a;dbg_log("plane set/reset: "+h(a),LOG_VGA);break;case 1:this.planar_setreset_enable=a;dbg_log("plane set/reset enable: "+h(a),LOG_VGA);break;case 2:this.color_compare=a;dbg_log("color compare: "+h(a),LOG_VGA);break;case 3:this.planar_rotate_reg=a;dbg_log("plane rotate: "+h(a),LOG_VGA);break;case 4:this.plane_read=a;dbg_log("plane read: "+h(a),LOG_VGA);break;case 5:var b=this.planar_mode;this.planar_mode= a;dbg_log("planar mode: "+h(a),LOG_VGA);(b^a)&96&&this.complete_replot();break;case 6:dbg_log("miscellaneous graphics register: "+h(a),LOG_VGA);this.miscellaneous_graphics_register!==a&&(this.miscellaneous_graphics_register=a,this.update_vga_size());break;case 7:this.color_dont_care=a;dbg_log("color don't care: "+h(a),LOG_VGA);break;case 8:this.planar_bitmap=a;dbg_log("planar bitmap: "+h(a),LOG_VGA);break;default:dbg_log("3CF / graphics write "+h(this.graphics_index)+": "+h(a),LOG_VGA)}}; VGAScreen.prototype.port3CF_read=function(){dbg_log("3CF / graphics read "+h(this.graphics_index),LOG_VGA);switch(this.graphics_index){case 0:return this.planar_setreset;case 1:return this.planar_setreset_enable;case 2:return this.color_compare;case 3:return this.planar_rotate_reg;case 4:return this.plane_read;case 5:return this.planar_mode;case 6:return this.miscellaneous_graphics_register;case 7:return this.color_dont_care;case 8:return this.planar_bitmap}return 0}; VGAScreen.prototype.port3D4_write=function(a){dbg_log("3D4 / crtc index: "+a,LOG_VGA);this.index_crtc=a};VGAScreen.prototype.port3D4_read=function(){dbg_log("3D4 read / crtc index: "+this.index_crtc,LOG_VGA);return this.index_crtc}; VGAScreen.prototype.port3D5_write=function(a){switch(this.index_crtc){case 1:dbg_log("3D5 / hdisp enable end write: "+h(a),LOG_VGA);this.horizontal_display_enable_end!==a&&(this.horizontal_display_enable_end=a,this.update_vga_size());break;case 2:this.horizontal_blank_start!==a&&(this.horizontal_blank_start=a,this.update_vga_size());break;case 7:dbg_log("3D5 / overflow register write: "+h(a),LOG_VGA);var b=this.vertical_display_enable_end;this.vertical_display_enable_end&=255;this.vertical_display_enable_end= this.vertical_display_enable_end|a<<3&512|a<<7&256;b!=this.vertical_display_enable_end&&this.update_vga_size();this.line_compare=this.line_compare&767|a<<4&256;b=this.vertical_blank_start;this.vertical_blank_start=this.vertical_blank_start&767|a<<5&256;b!==this.vertical_blank_start&&this.update_vga_size();this.update_layers();break;case 8:dbg_log("3D5 / preset row scan write: "+h(a),LOG_VGA);this.preset_row_scan=a;this.update_layers();break;case 9:dbg_log("3D5 / max scan line write: "+h(a),LOG_VGA); this.max_scan_line=a;this.line_compare=this.line_compare&511|a<<3&512;b=this.vertical_blank_start;this.vertical_blank_start=this.vertical_blank_start&511|a<<4&512;b!==this.vertical_blank_start&&this.update_vga_size();this.update_layers();break;case 10:dbg_log("3D5 / cursor scanline start write: "+h(a),LOG_VGA);this.cursor_scanline_start=a;this.update_cursor_scanline();break;case 11:dbg_log("3D5 / cursor scanline end write: "+h(a),LOG_VGA);this.cursor_scanline_end=a;this.update_cursor_scanline();break; case 12:(this.start_address>>8&255)!==a&&(this.start_address=this.start_address&255|a<<8,this.update_layers(),~this.crtc_mode&3&&this.complete_replot());dbg_log("3D5 / start addr hi write: "+h(a)+" -> "+h(this.start_address,4),LOG_VGA);break;case 13:(this.start_address&255)!==a&&(this.start_address=this.start_address&65280|a,this.update_layers(),~this.crtc_mode&3&&this.complete_replot());dbg_log("3D5 / start addr lo write: "+h(a)+" -> "+h(this.start_address,4),LOG_VGA);break;case 14:dbg_log("3D5 / cursor address hi write: "+ h(a),LOG_VGA);this.cursor_address=this.cursor_address&255|a<<8;this.update_cursor();break;case 15:dbg_log("3D5 / cursor address lo write: "+h(a),LOG_VGA);this.cursor_address=this.cursor_address&65280|a;this.update_cursor();break;case 18:dbg_log("3D5 / vdisp enable end write: "+h(a),LOG_VGA);(this.vertical_display_enable_end&255)!==a&&(this.vertical_display_enable_end=this.vertical_display_enable_end&768|a,this.update_vga_size());break;case 19:dbg_log("3D5 / offset register write: "+h(a),LOG_VGA); this.offset_register!==a&&(this.offset_register=a,this.update_vga_size(),~this.crtc_mode&3&&this.complete_replot());break;case 20:dbg_log("3D5 / underline location write: "+h(a),LOG_VGA);this.underline_location_register!==a&&(b=this.underline_location_register,this.underline_location_register=a,this.update_vga_size(),(b^a)&64&&this.complete_replot());break;case 21:dbg_log("3D5 / vertical blank start write: "+h(a),LOG_VGA);(this.vertical_blank_start&255)!==a&&(this.vertical_blank_start=this.vertical_blank_start& 768|a,this.update_vga_size());break;case 23:dbg_log("3D5 / crtc mode write: "+h(a),LOG_VGA);this.crtc_mode!==a&&(b=this.crtc_mode,this.crtc_mode=a,this.update_vga_size(),(b^a)&67&&this.complete_replot());break;case 24:dbg_log("3D5 / line compare write: "+h(a),LOG_VGA);this.line_compare=this.line_compare&768|a;this.update_layers();break;default:this.index_crtc>7&2|this.vertical_blank_start>>5&8|this.line_compare>>4&16|this.vertical_display_enable_end>>3&64;case 8:return this.preset_row_scan;case 9:return this.max_scan_line;case 10:return this.cursor_scanline_start;case 11:return this.cursor_scanline_end; case 12:return this.start_address&255;case 13:return this.start_address>>8;case 14:return this.cursor_address>>8;case 15:return this.cursor_address&255;case 18:return this.vertical_display_enable_end&255;case 19:return this.offset_register;case 20:return this.underline_location_register;case 21:return this.vertical_blank_start&255;case 23:return this.crtc_mode;case 24:return this.line_compare&255}return this.index_crtcMAX_XRES&&(dbg_log("svga_width reduced from "+this.svga_width+" to "+MAX_XRES,LOG_VGA),this.svga_width=MAX_XRES);break;case 2:this.svga_height=a;this.svga_height>MAX_YRES&&(dbg_log("svga_height reduced from "+this.svga_height+" to "+MAX_YRES,LOG_VGA),this.svga_height=MAX_YRES);break;case 3:this.svga_bpp=a;break;case 4:this.svga_enabled= 1===(a&1);this.dispi_enable_value=a;break;case 5:this.svga_bank_offset=a<<16;break;case 9:this.svga_offset=a*this.svga_bytes_per_line(),dbg_log("SVGA offset: "+h(this.svga_offset)+" y="+h(a),LOG_VGA),this.complete_redraw()}!this.svga_enabled||this.svga_width&&this.svga_height||(dbg_log("SVGA: disabled because of invalid width/height: "+this.svga_width+"x"+this.svga_height,LOG_VGA),this.svga_enabled=!1);dbg_assert(4!==this.svga_bpp,"unimplemented svga bpp: 4");dbg_assert(15!==this.svga_bpp,"unimplemented svga bpp: 15"); dbg_assert(4===this.svga_bpp||8===this.svga_bpp||15===this.svga_bpp||16===this.svga_bpp||24===this.svga_bpp||32===this.svga_bpp,"unexpected svga bpp: "+this.svga_bpp);dbg_log("SVGA: enabled="+this.svga_enabled+", "+this.svga_width+"x"+this.svga_height+"x"+this.svga_bpp,LOG_VGA);this.svga_enabled&&4===this.dispi_index&&(this.set_size_graphical(this.svga_width,this.svga_height,this.svga_bpp,this.svga_width,this.svga_height),this.bus.send("screen-set-mode",!0),this.graphical_mode_is_linear=this.graphical_mode= !0);this.svga_enabled||(this.svga_bank_offset=0);this.update_layers()};VGAScreen.prototype.port1CF_read=function(){dbg_log("1CF / dispi read "+h(this.dispi_index),LOG_VGA);return this.svga_register_read(this.dispi_index)}; VGAScreen.prototype.svga_register_read=function(a){switch(a){case 0:return 45248;case 1:return this.dispi_enable_value&2?MAX_XRES:this.svga_width;case 2:return this.dispi_enable_value&2?MAX_YRES:this.svga_height;case 3:return this.dispi_enable_value&2?MAX_BPP:this.svga_bpp;case 4:return this.dispi_enable_value;case 5:return this.svga_bank_offset>>>16;case 6:return this.screen_width?this.screen_width:1;case 8:return 0;case 10:return this.vga_memory_size/VGA_BANK_SIZE|0}return 255}; VGAScreen.prototype.vga_replot=function(){for(var a=this.diff_plot_min&-16,b=Math.min(this.diff_plot_max|15,VGA_PIXEL_BUFFER_SIZE-1),c=this.vga_addr_shift_count(),d=~this.crtc_mode&3,e=this.planar_mode&96,f=this.attribute_mode&64;a<=b;){var k=a>>>c;if(d){var g=a/this.virtual_width|0,l=a-this.virtual_width*g;switch(d){case 1:k=(g&1)<<13;g>>>=1;break;case 2:k=(g&1)<<14;g>>>=1;break;case 3:k=(g&3)<<13,g>>>=2}k|=(g*this.virtual_width+l>>>c)+this.start_address}g=this.plane0[k];l=this.plane1[k];var m=this.plane2[k], n=this.plane3[k];k=new Uint8Array(8);switch(e){case 0:g<<=0;l<<=1;m<<=2;n<<=3;for(var r=7;0<=r;r--)k[7-r]=g>>r&1|l>>r&2|m>>r&4|n>>r&8;break;case 32:k[0]=g>>6&3|m>>4&12;k[1]=g>>4&3|m>>2&12;k[2]=g>>2&3|m>>0&12;k[3]=g>>0&3|m<<2&12;k[4]=l>>6&3|n>>4&12;k[5]=l>>4&3|n>>2&12;k[6]=l>>2&3|n>>0&12;k[7]=l>>0&3|n<<2&12;break;case 64:case 96:k[0]=g>>4&15,k[1]=g>>0&15,k[2]=l>>4&15,k[3]=l>>0&15,k[4]=m>>4&15,k[5]=m>>0&15,k[6]=n>>4&15,k[7]=n>>0&15}if(f)for(g=r=0;4>r;r++,a++,g+=2)this.pixel_buffer[a]=k[g]<<4|k[g+1]; else for(r=0;8>r;r++,a++)this.pixel_buffer[a]=k[r]}}; VGAScreen.prototype.vga_redraw=function(){var a=this.diff_addr_min,b=Math.min(this.diff_addr_max,VGA_PIXEL_BUFFER_SIZE-1),c=this.dest_buffer;if(c){var d=255,e=0;this.attribute_mode&128&&(d&=207,e|=this.color_select<<4&48);if(this.attribute_mode&64)for(;a<=b;a++){var f=this.pixel_buffer[a]&d|e;f=this.vga256_palette[f];c[a]=f&65280|f<<16|f>>16|4278190080}else for(d&=63,e|=this.color_select<<4&192;a<=b;a++)f=this.dac_map[this.pixel_buffer[a]&this.color_plane_enable]&d|e,f=this.vga256_palette[f],c[a]= f&65280|f<<16|f>>16|4278190080}}; VGAScreen.prototype.screen_fill_buffer=function(){if(this.graphical_mode)if(this.dest_buffer)if(this.diff_addr_max>2,f=(d-this.svga_offset>>2)+1;a=c>>2;for(c=e;c>16&255|d&65280|4278190080;break; case 24:c-=c%3;d+=3-d%3;dbg_assert(0===this.svga_offset%3);e=(c-this.svga_offset)/3|0;f=((d-this.svga_offset)/3|0)+1;a=c;for(c=e;a>1;f=(d-this.svga_offset>>1)+1;a=c>>1;for(c=e;c>11)/31|0,g=255*(d>>5&63)/63|0,k=255*(d&31)/31|0,b[c]=k<<16|g<<8|l|4278190080;break;case 8:e=c-this.svga_offset;f=d-this.svga_offset+1; for(a=c;c<=d;c++)g=this.vga256_palette[this.svga_memory[a++]],b[c]=g&65280|g<<16|g>>16|4278190080;break;default:dbg_assert(!1,"Unsupported BPP: "+a)}b=e/this.svga_width|0;this.bus.send("screen-fill-buffer-end",[{screen_x:0,screen_y:b,buffer_x:0,buffer_y:b,buffer_width:this.svga_width,buffer_height:(f/this.svga_width|0)-b+1}])}else this.vga_replot(),this.vga_redraw(),this.bus.send("screen-fill-buffer-end",this.layers);this.reset_diffs()}else dbg_log("Cannot fill buffer: No destination buffer",LOG_VGA); this.update_vertical_retrace()};let PS2_LOG_VERBOSE=!1; function PS2(a,b){this.cpu=a;this.bus=b;this.use_mouse=this.enable_mouse_stream=!1;this.have_mouse=!0;this.mouse_clicks=this.mouse_delta_y=this.mouse_delta_x=0;this.have_keyboard=!0;this.next_read_resolution=this.next_read_rate=this.next_handle_scan_code_set=this.next_read_led=this.next_read_sample=this.next_is_mouse_command=this.enable_keyboard_stream=!1;this.kbd_buffer=new ByteQueue(1024);this.last_port60_byte=0;this.sample_rate=100;this.resolution=4;this.scaling2=!1;this.last_mouse_packet=-1;this.mouse_buffer= new ByteQueue(1024);this.next_byte_is_aux=this.next_byte_is_ready=!1;this.bus.register("keyboard-code",function(c){this.kbd_send_code(c)},this);this.bus.register("mouse-click",function(c){this.mouse_send_click(c[0],c[1],c[2])},this);this.bus.register("mouse-delta",function(c){this.mouse_send_delta(c[0],c[1])},this);this.bus.register("mouse-wheel",function(c){},this);this.command_register=5;this.read_command_register=this.read_output_register=!1;a.io.register_read(96,this,this.port60_read);a.io.register_read(100, this,this.port64_read);a.io.register_write(96,this,this.port60_write);a.io.register_write(100,this,this.port64_write)} PS2.prototype.get_state=function(){var a=[];a[0]=this.enable_mouse_stream;a[1]=this.use_mouse;a[2]=this.have_mouse;a[3]=this.mouse_delta_x;a[4]=this.mouse_delta_y;a[5]=this.mouse_clicks;a[6]=this.have_keyboard;a[7]=this.enable_keyboard_stream;a[8]=this.next_is_mouse_command;a[9]=this.next_read_sample;a[10]=this.next_read_led;a[11]=this.next_handle_scan_code_set;a[12]=this.next_read_rate;a[13]=this.next_read_resolution;a[15]=this.last_port60_byte;a[16]=this.sample_rate;a[17]=this.resolution;a[18]= this.scaling2;a[20]=this.command_register;a[21]=this.read_output_register;a[22]=this.read_command_register;return a}; PS2.prototype.set_state=function(a){this.enable_mouse_stream=a[0];this.use_mouse=a[1];this.have_mouse=a[2];this.mouse_delta_x=a[3];this.mouse_delta_y=a[4];this.mouse_clicks=a[5];this.have_keyboard=a[6];this.enable_keyboard_stream=a[7];this.next_is_mouse_command=a[8];this.next_read_sample=a[9];this.next_read_led=a[10];this.next_handle_scan_code_set=a[11];this.next_read_rate=a[12];this.next_read_resolution=a[13];this.last_port60_byte=a[15];this.sample_rate=a[16];this.resolution=a[17];this.scaling2= a[18];this.command_register=a[20];this.read_output_register=a[21];this.read_command_register=a[22];this.next_byte_is_aux=this.next_byte_is_ready=!1;this.kbd_buffer.clear();this.mouse_buffer.clear();this.bus.send("mouse-enable",this.use_mouse)};PS2.prototype.raise_irq=function(){this.next_byte_is_ready||(this.kbd_buffer.length?this.kbd_irq():this.mouse_buffer.length&&this.mouse_irq())}; PS2.prototype.mouse_irq=function(){this.next_byte_is_aux=this.next_byte_is_ready=!0;this.command_register&2&&(dbg_log("Mouse irq",LOG_PS2),this.cpu.device_lower_irq(12),this.cpu.device_raise_irq(12))};PS2.prototype.kbd_irq=function(){this.next_byte_is_ready=!0;this.next_byte_is_aux=!1;this.command_register&1&&(dbg_log("Keyboard irq",LOG_PS2),this.cpu.device_lower_irq(1),this.cpu.device_raise_irq(1))}; PS2.prototype.kbd_send_code=function(a){this.enable_keyboard_stream&&(dbg_log("adding kbd code: "+h(a),LOG_PS2),this.kbd_buffer.push(a),this.raise_irq())};PS2.prototype.mouse_send_delta=function(a,b){if(this.have_mouse&&this.use_mouse){var c=this.resolution*this.sample_rate/80;this.mouse_delta_x+=a*c;this.mouse_delta_y+=b*c;this.enable_mouse_stream&&(a=this.mouse_delta_x|0,b=this.mouse_delta_y|0,a||b)&&(Date.now(),this.mouse_delta_x-=a,this.mouse_delta_y-=b,this.send_mouse_packet(a,b))}}; PS2.prototype.mouse_send_click=function(a,b,c){this.have_mouse&&this.use_mouse&&(this.mouse_clicks=a|c<<1|b<<2,this.enable_mouse_stream&&this.send_mouse_packet(0,0))};PS2.prototype.send_mouse_packet=function(a,b){var c=(0>b)<<5|(0>a)<<4|8|this.mouse_clicks;this.last_mouse_packet=Date.now();this.mouse_buffer.push(c);this.mouse_buffer.push(a);this.mouse_buffer.push(b);PS2_LOG_VERBOSE&&dbg_log("adding mouse packets: "+[c,a,b],LOG_PS2);this.raise_irq()}; PS2.prototype.apply_scaling2=function(a){var b=a>>31;switch(Math.abs(a)){case 0:case 1:case 3:return a;case 2:return b;case 4:return 6*b;case 5:return 9*b;default:return a<<1}}; PS2.prototype.port60_read=function(){this.next_byte_is_ready=!1;if(!this.kbd_buffer.length&&!this.mouse_buffer.length)return dbg_log("Port 60 read: Empty",LOG_PS2),this.last_port60_byte;this.next_byte_is_aux?(this.cpu.device_lower_irq(12),this.last_port60_byte=this.mouse_buffer.shift(),dbg_log("Port 60 read (mouse): "+h(this.last_port60_byte),LOG_PS2)):(this.cpu.device_lower_irq(1),this.last_port60_byte=this.kbd_buffer.shift(),dbg_log("Port 60 read (kbd) : "+h(this.last_port60_byte),LOG_PS2));(this.kbd_buffer.length|| this.mouse_buffer.length)&&this.raise_irq();return this.last_port60_byte};PS2.prototype.port64_read=function(){var a=16;this.next_byte_is_ready&&(a|=1);this.next_byte_is_aux&&(a|=32);dbg_log("port 64 read: "+h(a),LOG_PS2);return a}; PS2.prototype.port60_write=function(a){dbg_log("port 60 write: "+h(a),LOG_PS2);if(this.read_command_register)this.command_register=a,this.read_command_register=!1,dbg_log("Keyboard command register = "+h(this.command_register),LOG_PS2);else if(this.read_output_register)this.read_output_register=!1,this.mouse_buffer.clear(),this.mouse_buffer.push(a),this.mouse_irq();else if(this.next_read_sample)this.next_read_sample=!1,this.mouse_buffer.clear(),this.mouse_buffer.push(250),this.sample_rate=a,dbg_log("mouse sample rate: "+ h(a),LOG_PS2),this.sample_rate||(dbg_log("invalid sample rate, reset to 100",LOG_PS2),this.sample_rate=100),this.mouse_irq();else if(this.next_read_resolution)this.next_read_resolution=!1,this.mouse_buffer.clear(),this.mouse_buffer.push(250),3 Already requested irq: "+this.requested_irq, LOG_PIC),this.cpu.handle_irqs();else{var c=this.irr&this.irq_mask;if(c){c&=-c;var d=this.special_mask_mode?this.irq_mask:-1;this.isr&&(this.isr&-this.isr&d)<=c?dbg_log("master> higher prio: isr="+h(this.isr,2)+" mask="+h(this.irq_mask&255,2)+" irq="+h(c,2),LOG_PIC):(dbg_assert(0!==c),d=v86util.int_log2_byte(c),dbg_assert(c===1< request irq "+d,LOG_PIC),this.requested_irq=d,this.cpu.handle_irqs())}else PIC_LOG_VERBOSE&&dbg_log("master> no unmasked irrs. irr="+h(this.irr, 2)+" mask="+h(this.irq_mask&255,2)+" isr="+h(this.isr,2),LOG_PIC)}},this.acknowledge_irq=function(){if(-1!==this.requested_irq)if(0===this.irr)PIC_LOG_VERBOSE&&dbg_log("master> spurious requested="+this.requested_irq,LOG_PIC),this.requested_irq=-1;else{dbg_assert(this.irr);dbg_assert(0<=this.requested_irq);var c=1< acknowledge "+this.requested_irq,LOG_PIC);2===this.requested_irq?this.slave.acknowledge_irq(): this.cpu.pic_call_irq(this.irq_map|this.requested_irq);this.requested_irq=-1;this.check_irqs()}}):(this.check_irqs=function(){if(0<=this.requested_irq)PIC_LOG_VERBOSE&&dbg_log("slave > Already requested irq: "+this.requested_irq,LOG_PIC),this.cpu.handle_irqs();else{var c=this.irr&this.irq_mask;if(c){c&=-c;var d=this.special_mask_mode?this.irq_mask:-1;this.isr&&(this.isr&-this.isr&d)<=c?PIC_LOG_VERBOSE&&dbg_log("slave > higher prio: isr="+h(this.isr,2)+" irq="+h(c,2),LOG_PIC):(dbg_assert(0!==c),d= v86util.int_log2_byte(c),dbg_assert(c===1< request irq "+d,LOG_PIC),this.requested_irq=d,this.master.set_irq(2))}else PIC_LOG_VERBOSE&&dbg_log("slave > no unmasked irrs. irr="+h(this.irr,2)+" mask="+h(this.irq_mask&255,2)+" isr="+h(this.isr,2),LOG_PIC)}},this.acknowledge_irq=function(){if(-1!==this.requested_irq)if(0===this.irr)PIC_LOG_VERBOSE&&dbg_log("slave > spurious requested="+this.requested_irq,LOG_PIC),this.requested_irq=-1,this.master.irq_value&=-5,this.cpu.pic_call_irq(this.irq_map| 7);else{dbg_assert(this.irr);dbg_assert(0<=this.requested_irq);var c=1< acknowledge "+this.requested_irq,LOG_PIC);this.cpu.pic_call_irq(this.irq_map|this.requested_irq);this.requested_irq=-1;this.check_irqs()}});this.dump=function(){dbg_log("mask: "+h(this.irq_mask&255),LOG_PIC);dbg_log("base: "+h(this.irq_map),LOG_PIC);dbg_log("requested: "+h(this.irr),LOG_PIC); dbg_log("serviced: "+h(this.isr),LOG_PIC);this.is_master&&this.slave.dump()};this.is_master?(a=32,b=1232):(a=160,b=1233);this.cpu.io.register_write(a,this,this.port20_write);this.cpu.io.register_read(a,this,this.port20_read);this.cpu.io.register_write(a|1,this,this.port21_write);this.cpu.io.register_read(a|1,this,this.port21_read);this.cpu.io.register_write(b,this,this.port4D0_write);this.cpu.io.register_read(b,this,this.port4D0_read);this.is_master?(this.set_irq=function(c){dbg_assert(0<=c&&16>c); if(8<=c)this.slave.set_irq(c-8);else{var d=1< set irq "+c,LOG_PIC),this.irr|=d,this.irq_value|=d,this.check_irqs()):PIC_LOG_VERBOSE&&dbg_log("master> set irq "+c+": already set!",LOG_PIC)}},this.clear_irq=function(c){dbg_assert(0<=c&&16>c);PIC_LOG_VERBOSE&&dbg_log("master> clear irq "+c,LOG_PIC);8<=c?this.slave.clear_irq(c-8):(c=1<c);var d=1< set irq "+c,LOG_PIC),this.irr|=d,this.irq_value|=d,this.check_irqs()):PIC_LOG_VERBOSE&&dbg_log("slave > set irq "+c+": already set!",LOG_PIC)},this.clear_irq=function(c){dbg_assert(0<=c&&8>c);PIC_LOG_VERBOSE&&dbg_log("slave > clear irq "+c,LOG_PIC);c=1<>5;1===b?(this.isr&= this.isr-1,dbg_log("new isr: "+h(this.isr,2),LOG_PIC)):3===b?this.isr&=~(1<<(a&7)):192===(a&200)?dbg_log("lowest priority: "+h(a&7),LOG_PIC):(dbg_log("Unknown eoi: "+h(a),LOG_PIC),dbg_assert(!1),this.isr&=this.isr-1);this.check_irqs()}};PIC.prototype.port20_read=function(){if(this.read_isr)return dbg_log("read port 20h (isr): "+h(this.isr),LOG_PIC),this.isr;dbg_log("read port 20h (irr): "+h(this.irr),LOG_PIC);return this.irr}; PIC.prototype.port21_write=function(a){0===this.state?this.expect_icw4?(this.expect_icw4=!1,this.auto_eoi=a&2,dbg_log("icw4: "+h(a)+" autoeoi="+this.auto_eoi,LOG_PIC),0===(a&1)&&dbg_assert(!1,"unimplemented: not 8086 mode",LOG_PIC)):(this.irq_mask=~a,PIC_LOG_VERBOSE&&dbg_log("interrupt mask: "+(this.irq_mask&255).toString(2)+" ("+this.name+")",LOG_PIC),this.check_irqs()):1===this.state?(this.irq_map=a,dbg_log("interrupts are mapped to "+h(this.irq_map)+" ("+this.name+")",LOG_PIC),this.state++):2=== this.state&&(this.state=0,dbg_log("icw3: "+h(a),LOG_PIC))};PIC.prototype.port21_read=function(){dbg_log("21h read "+h(~this.irq_mask&255),LOG_PIC);return~this.irq_mask&255};PIC.prototype.port4D0_read=function(){dbg_log("elcr read: "+h(this.elcr,2),LOG_PIC);return this.elcr};PIC.prototype.port4D0_write=function(a){dbg_log("elcr write: "+h(a,2),LOG_PIC);this.elcr=a};var CMOS_RTC_SECONDS=0,CMOS_RTC_SECONDS_ALARM=1,CMOS_RTC_MINUTES=2,CMOS_RTC_MINUTES_ALARM=3,CMOS_RTC_HOURS=4,CMOS_RTC_HOURS_ALARM=5,CMOS_RTC_DAY_WEEK=6,CMOS_RTC_DAY_MONTH=7,CMOS_RTC_MONTH=8,CMOS_RTC_YEAR=9,CMOS_STATUS_A=10,CMOS_STATUS_B=11,CMOS_STATUS_C=12,CMOS_STATUS_D=13,CMOS_RESET_CODE=15,CMOS_FLOPPY_DRIVE_TYPE=16,CMOS_DISK_DATA=18,CMOS_EQUIPMENT_INFO=20,CMOS_MEM_BASE_LOW=21,CMOS_MEM_BASE_HIGH=22,CMOS_MEM_OLD_EXT_LOW=23,CMOS_MEM_OLD_EXT_HIGH=24,CMOS_DISK_DRIVE1_TYPE=25,CMOS_DISK_DRIVE2_TYPE=26, CMOS_DISK_DRIVE1_CYL=27,CMOS_DISK_DRIVE2_CYL=36,CMOS_MEM_EXTMEM_LOW=48,CMOS_MEM_EXTMEM_HIGH=49,CMOS_CENTURY=50,CMOS_MEM_EXTMEM2_LOW=52,CMOS_MEM_EXTMEM2_HIGH=53,CMOS_BIOS_BOOTFLAG1=56,CMOS_BIOS_DISKTRANSFLAG=57,CMOS_BIOS_BOOTFLAG2=61,CMOS_MEM_HIGHMEM_LOW=91,CMOS_MEM_HIGHMEM_MID=92,CMOS_MEM_HIGHMEM_HIGH=93,CMOS_BIOS_SMP_COUNT=95; function RTC(a){this.cpu=a;this.cmos_index=0;this.cmos_data=new Uint8Array(128);this.last_update=this.rtc_time=Date.now();this.next_interrupt_alarm=this.next_interrupt=0;this.periodic_interrupt=!1;this.periodic_interrupt_time=.9765625;this.cmos_a=38;this.cmos_b=2;this.nmi_disabled=this.cmos_c=0;a.io.register_write(112,this,function(b){this.cmos_index=b&127;this.nmi_disabled=b>>7});a.io.register_write(113,this,this.cmos_port_write);a.io.register_read(113,this,this.cmos_port_read)} RTC.prototype.get_state=function(){var a=[];a[0]=this.cmos_index;a[1]=this.cmos_data;a[2]=this.rtc_time;a[3]=this.last_update;a[4]=this.next_interrupt;a[5]=this.next_interrupt_alarm;a[6]=this.periodic_interrupt;a[7]=this.periodic_interrupt_time;a[8]=this.cmos_a;a[9]=this.cmos_b;a[10]=this.cmos_c;a[11]=this.nmi_disabled;return a}; RTC.prototype.set_state=function(a){this.cmos_index=a[0];this.cmos_data=a[1];this.rtc_time=a[2];this.last_update=a[3];this.next_interrupt=a[4];this.next_interrupt_alarm=a[5];this.periodic_interrupt=a[6];this.periodic_interrupt_time=a[7];this.cmos_a=a[8];this.cmos_b=a[9];this.cmos_c=a[10];this.nmi_disabled=a[11]}; RTC.prototype.timer=function(a,b){a=Date.now();this.rtc_time+=a-this.last_update;this.last_update=a;if(this.periodic_interrupt&&this.next_interrupt>4&15;dbg_assert(256>a);dbg_assert(10>b);dbg_assert(10>c);return b+10*c};RTC.prototype.encode_time=function(a){return this.cmos_b&4?a:this.bcd_pack(a)};RTC.prototype.decode_time=function(a){return this.cmos_b&4?a:this.bcd_unpack(a)}; RTC.prototype.cmos_port_read=function(){var a=this.cmos_index;switch(a){case CMOS_RTC_SECONDS:return this.encode_time((new Date(this.rtc_time)).getUTCSeconds());case CMOS_RTC_MINUTES:return this.encode_time((new Date(this.rtc_time)).getUTCMinutes());case CMOS_RTC_HOURS:return this.encode_time((new Date(this.rtc_time)).getUTCHours());case CMOS_RTC_DAY_MONTH:return this.encode_time((new Date(this.rtc_time)).getUTCDate());case CMOS_RTC_MONTH:return this.encode_time((new Date(this.rtc_time)).getUTCMonth()+ 1);case CMOS_RTC_YEAR:return this.encode_time((new Date(this.rtc_time)).getUTCFullYear()%100);case CMOS_STATUS_A:return this.cmos_a;case CMOS_STATUS_B:return this.cmos_b;case CMOS_STATUS_C:return this.cpu.device_lower_irq(8),dbg_log("cmos reg C read",LOG_RTC),a=this.cmos_c,this.cmos_c&=-241,a;case CMOS_STATUS_D:return 255;case CMOS_CENTURY:return this.encode_time((new Date(this.rtc_time)).getUTCFullYear()/100|0);default:return dbg_log("cmos read from index "+h(a),LOG_RTC),this.cmos_data[this.cmos_index]}}; RTC.prototype.cmos_port_write=function(a){switch(this.cmos_index){case 10:this.cmos_a=a&127;this.periodic_interrupt_time=1E3/(32768>>(this.cmos_a&15)-1);dbg_log("Periodic interrupt, a="+h(this.cmos_a,2)+" t="+this.periodic_interrupt_time,LOG_RTC);break;case 11:this.cmos_b=a;this.cmos_b&64&&(this.next_interrupt=Date.now());if(this.cmos_b&32){a=new Date;const b=this.decode_time(this.cmos_data[CMOS_RTC_SECONDS_ALARM]),c=this.decode_time(this.cmos_data[CMOS_RTC_MINUTES_ALARM]),d=this.decode_time(this.cmos_data[CMOS_RTC_HOURS_ALARM]), e=new Date(Date.UTC(a.getUTCFullYear(),a.getUTCMonth(),a.getUTCDate(),d,c,b));dbg_log("RTC alarm scheduled for "+e+" hh:mm:ss="+d+":"+c+":"+b+" ms_from_now="+(e-a),LOG_RTC);this.next_interrupt_alarm=+e}this.cmos_b&16&&dbg_log("Unimplemented: updated interrupt",LOG_RTC);dbg_log("cmos b="+h(this.cmos_b,2),LOG_RTC);break;case CMOS_RTC_SECONDS_ALARM:case CMOS_RTC_MINUTES_ALARM:case CMOS_RTC_HOURS_ALARM:this.cmos_write(this.cmos_index,a);break;default:dbg_log("cmos write index "+h(this.cmos_index)+": "+ h(a),LOG_RTC)}this.periodic_interrupt=64===(this.cmos_b&64)&&0<(this.cmos_a&15)};RTC.prototype.cmos_read=function(a){dbg_assert(128>a);return this.cmos_data[a]};RTC.prototype.cmos_write=function(a,b){dbg_log("cmos "+h(a)+" <- "+h(b),LOG_RTC);dbg_assert(128>a);this.cmos_data[a]=b};var DLAB=128,UART_IER_MSI=8,UART_IER_THRI=2,UART_IER_RDI=1,UART_IIR_MSI=0,UART_IIR_NO_INT=1,UART_IIR_THRI=2,UART_IIR_RDI=4,UART_IIR_RLSI=6,UART_IIR_CTI=12,UART_LSR_DATA_READY=1,UART_LSR_TX_EMPTY=32,UART_LSR_TRANSMITTER_EMPTY=64; function UART(a,b,c){this.bus=c;this.cpu=a;this.ints=1<>8)});a.register_write(b|1,this,function(d){this.line_control&DLAB?(this.baud_rate=this.baud_rate&255|d<<8,dbg_log("baud rate: "+h(this.baud_rate),LOG_SERIAL)):(this.ier=d&15,dbg_log("interrupt enable: "+h(d),LOG_SERIAL),this.CheckInterrupt())});a.register_read(b, this,function(){if(this.line_control&DLAB)return this.baud_rate&255;var d=this.input.shift();-1===d?dbg_log("Read input empty",LOG_SERIAL):dbg_log("Read input: "+h(d),LOG_SERIAL);0===this.input.length&&(this.lsr&=~UART_LSR_DATA_READY,this.ClearInterrupt(UART_IIR_CTI));return d});a.register_read(b|1,this,function(){return this.line_control&DLAB?this.baud_rate>>8:this.ier&15});a.register_read(b|2,this,function(){var d=this.iir&15|192;dbg_log("read interrupt identification: "+h(this.iir),LOG_SERIAL); this.iir==UART_IIR_THRI&&this.ClearInterrupt(UART_IIR_THRI);return d});a.register_write(b|2,this,function(d){dbg_log("fifo control: "+h(d),LOG_SERIAL);this.fifo_control=d});a.register_read(b|3,this,function(){dbg_log("read line control: "+h(this.line_control),LOG_SERIAL);return this.line_control});a.register_write(b|3,this,function(d){dbg_log("line control: "+h(d),LOG_SERIAL);this.line_control=d});a.register_read(b|4,this,function(){return this.modem_control});a.register_write(b|4,this,function(d){dbg_log("modem control: "+ h(d),LOG_SERIAL);this.modem_control=d});a.register_read(b|5,this,function(){dbg_log("read line status: "+h(this.lsr),LOG_SERIAL);return this.lsr});a.register_write(b|5,this,function(d){dbg_log("Factory test write",LOG_SERIAL)});a.register_read(b|6,this,function(){dbg_log("read modem status: "+h(this.modem_status),LOG_SERIAL);return this.modem_status});a.register_write(b|6,this,function(d){dbg_log("Unkown register write (base+6)",LOG_SERIAL)});a.register_read(b|7,this,function(){return this.scratch_register}); a.register_write(b|7,this,function(d){this.scratch_register=d})}UART.prototype.get_state=function(){var a=[];a[0]=this.ints;a[1]=this.baud_rate;a[2]=this.line_control;a[3]=this.lsr;a[4]=this.fifo_control;a[5]=this.ier;a[6]=this.iir;a[7]=this.modem_control;a[8]=this.modem_status;a[9]=this.scratch_register;a[10]=this.irq;return a}; UART.prototype.set_state=function(a){this.ints=a[0];this.baud_rate=a[1];this.line_control=a[2];this.lsr=a[3];this.fifo_control=a[4];this.ier=a[5];this.iir=a[6];this.modem_control=a[7];this.modem_status=a[8];this.scratch_register=a[9];this.irq=a[10]}; UART.prototype.CheckInterrupt=function(){this.ints&1<>>0;for(var u,t,x=0;x>>0,q<=p?t>q&&t<=p:t>q||t<=p)t=u&4,u&2?(t=t&&!(m&1<< x),m|=1<>2&7,t=p-256>>5;if(256>p||t>=HPET_NUM_COUNTERS||5this.timer_last_value),this.timer_last_value+this.timer_imprecision_offset<=a?(this.timer_imprecision_offset=0,this.timer_last_value=a):dbg_log("Warning: Overshot pmtimer, waiting; current="+a+" last="+this.timer_last_value+" offset="+this.timer_imprecision_offset,LOG_ACPI));return this.timer_last_value+ this.timer_imprecision_offset};ACPI.prototype.get_state=function(){var a=[];a[0]=this.status;a[1]=this.pm1_status;a[2]=this.pm1_enable;a[3]=this.gpe;return a};ACPI.prototype.set_state=function(a){this.status=a[0];this.pm1_status=a[1];this.pm1_enable=a[2];this.gpe=a[3]};var APIC_LOG_VERBOSE=!1,APIC_ADDRESS=4276092928,APIC_TIMER_MODE_MASK=393216,APIC_TIMER_MODE_ONE_SHOT=0,APIC_TIMER_MODE_PERIODIC=131072,APIC_TIMER_MODE_TSC=262144,DELIVERY_MODES="Fixed (0);Lowest Prio (1);SMI (2);Reserved (3);NMI (4);INIT (5);Reserved (6);ExtINT (7)".split(";"),DESTINATION_MODES=["physical","logical"]; function APIC(a){this.cpu=a;this.timer_divider=this.apic_id=0;this.timer_divider_shift=1;this.timer_current_count=this.timer_initial_count=0;this.next_tick=v86.microtick();this.lvt_error=this.lvt_int1=this.lvt_int0=this.lvt_perf_counter=this.lvt_timer=IOAPIC_CONFIG_MASKED;this.icr1=this.icr0=this.tpr=0;this.irr=new Int32Array(8);this.isr=new Int32Array(8);this.tmr=new Int32Array(8);this.spurious_vector=254;this.destination_format=-1;this.read_error=this.error=this.local_destination=0;a.io.mmap_register(APIC_ADDRESS, 1048576,b=>{dbg_log("Unsupported read8 from apic: "+h(b>>>0),LOG_APIC);var c=b&3;return this.read32(b&-4)>>8*c&255},(b,c)=>{dbg_log("Unsupported write8 from apic: "+h(b)+" <- "+h(c),LOG_APIC);dbg_trace();dbg_assert(!1)},b=>this.read32(b),(b,c)=>this.write32(b,c))} APIC.prototype.read32=function(a){a=a-APIC_ADDRESS|0;switch(a){case 32:return dbg_log("APIC read id",LOG_APIC),this.apic_id;case 48:return dbg_log("APIC read version",LOG_APIC),327700;case 128:return APIC_LOG_VERBOSE&&dbg_log("APIC read tpr",LOG_APIC),this.tpr;case 208:return dbg_log("Read local destination",LOG_APIC),this.local_destination;case 224:return dbg_log("Read destination format",LOG_APIC),this.destination_format;case 240:return this.spurious_vector;case 256:case 272:case 288:case 304:case 320:case 336:case 352:case 368:return a= a-256>>4,dbg_log("Read isr "+a+": "+h(this.isr[a]>>>0,8),LOG_APIC),this.isr[a];case 384:case 400:case 416:case 432:case 448:case 464:case 480:case 496:return a=a-384>>4,dbg_log("Read tmr "+a+": "+h(this.tmr[a]>>>0,8),LOG_APIC),this.tmr[a];case 512:case 528:case 544:case 560:case 576:case 592:case 608:case 624:return a=a-512>>4,dbg_log("Read irr "+a+": "+h(this.irr[a]>>>0,8),LOG_APIC),this.irr[a];case 640:return dbg_log("Read error: "+h(this.read_error>>>0,8),LOG_APIC),this.read_error;case 768:return APIC_LOG_VERBOSE&& dbg_log("APIC read icr0",LOG_APIC),this.icr0;case 784:return dbg_log("APIC read icr1",LOG_APIC),this.icr1;case 800:return dbg_log("read timer lvt",LOG_APIC),this.lvt_timer;case 832:return dbg_log("read lvt perf counter",LOG_APIC),this.lvt_perf_counter;case 848:return dbg_log("read lvt int0",LOG_APIC),this.lvt_int0;case 864:return dbg_log("read lvt int1",LOG_APIC),this.lvt_int1;case 880:return dbg_log("read lvt error",LOG_APIC),this.lvt_error;case 992:return dbg_log("read timer divider",LOG_APIC), this.timer_divider;case 896:return dbg_log("read timer initial count",LOG_APIC),this.timer_initial_count;case 912:return dbg_log("read timer current count: "+h(this.timer_current_count>>>0,8),LOG_APIC),this.timer_current_count;default:return dbg_log("APIC read "+h(a),LOG_APIC),dbg_assert(!1),0}}; APIC.prototype.write32=function(a,b){a=a-APIC_ADDRESS|0;switch(a){case 48:dbg_log("APIC write version: "+h(b>>>0,8)+", ignored",LOG_APIC);break;case 128:APIC_LOG_VERBOSE&&dbg_log("Set tpr: "+h(b&255,2),LOG_APIC);this.tpr=b&255;this.check_vector();break;case 176:a=this.highest_isr();-1!==a?(APIC_LOG_VERBOSE&&dbg_log("eoi: "+h(b>>>0,8)+" for vector "+h(a),LOG_APIC),this.register_clear_bit(this.isr,a),this.register_get_bit(this.tmr,a)&&this.cpu.devices.ioapic.remote_eoi(a),this.check_vector()):dbg_log("Bad eoi: No isr set", LOG_APIC);break;case 208:dbg_log("Set local destination: "+h(b>>>0,8),LOG_APIC);this.local_destination=b&4278190080;break;case 224:dbg_log("Set destination format: "+h(b>>>0,8),LOG_APIC);this.destination_format=b|16777215;break;case 240:dbg_log("Set spurious vector: "+h(b>>>0,8),LOG_APIC);this.spurious_vector=b;break;case 640:dbg_log("Write error: "+h(b>>>0,8),LOG_APIC);this.read_error=this.error;this.error=0;break;case 768:a=b&255;var c=b>>8&7,d=b>>11&1,e=b>>15&1,f=b>>18&3,k=this.icr1>>>24;dbg_log("APIC write icr0: "+ h(b,8)+" vector="+h(a,2)+" destination_mode="+DESTINATION_MODES[d]+" delivery_mode="+DELIVERY_MODES[c]+" destination_shorthand="+["no","self","all with self","all without self"][f],LOG_APIC);this.icr0=b&-4097;0===f?this.route(a,c,e,k,d):1===f?this.deliver(a,IOAPIC_DELIVERY_FIXED,e):2===f?this.deliver(a,c,e):3!==f&&dbg_assert(!1);break;case 784:dbg_log("APIC write icr1: "+h(b>>>0,8),LOG_APIC);this.icr1=b;break;case 800:dbg_log("timer lvt: "+h(b>>>0,8),LOG_APIC);this.lvt_timer=b;break;case 832:dbg_log("lvt perf counter: "+ h(b>>>0,8),LOG_APIC);this.lvt_perf_counter=b;break;case 848:dbg_log("lvt int0: "+h(b>>>0,8),LOG_APIC);this.lvt_int0=b;break;case 864:dbg_log("lvt int1: "+h(b>>>0,8),LOG_APIC);this.lvt_int1=b;break;case 880:dbg_log("lvt error: "+h(b>>>0,8),LOG_APIC);this.lvt_error=b;break;case 992:dbg_log("timer divider: "+h(b>>>0,8),LOG_APIC);this.timer_divider=b;b=b&3|(b&8)>>1;this.timer_divider_shift=7===b?0:b+1;break;case 896:dbg_log("timer initial: "+h(b>>>0,8),LOG_APIC);this.timer_initial_count=b>>>0;this.timer_current_count= b>>>0;this.next_tick=v86.microtick();this.timer_active=!0;break;case 912:dbg_log("timer current: "+h(b>>>0,8),LOG_APIC);dbg_assert(!1,"read-only register");break;default:dbg_log("APIC write32 "+h(a)+" <- "+h(b>>>0,8),LOG_APIC),dbg_assert(!1)}}; APIC.prototype.timer=function(a){0!==this.timer_current_count&&(a=(a-this.next_tick)*TSC_RATE/(1<>>0,0!==a&&(this.next_tick+=a/TSC_RATE*(1<=this.timer_current_count&&(a=this.lvt_timer&APIC_TIMER_MODE_MASK,a===APIC_TIMER_MODE_PERIODIC?(this.timer_current_count%=this.timer_initial_count,0>=this.timer_current_count&&(this.timer_current_count+=this.timer_initial_count),dbg_assert(0!==this.timer_current_count),0===(this.lvt_timer& IOAPIC_CONFIG_MASKED)&&this.deliver(this.lvt_timer&255,IOAPIC_DELIVERY_FIXED,!1)):a===APIC_TIMER_MODE_ONE_SHOT&&(this.timer_current_count=0,dbg_log("APIC timer one shot end",LOG_APIC),0===(this.lvt_timer&IOAPIC_CONFIG_MASKED)&&this.deliver(this.lvt_timer&255,IOAPIC_DELIVERY_FIXED,!1)))))};APIC.prototype.route=function(a,b,c,d,e){this.deliver(a,b,c)}; APIC.prototype.deliver=function(a,b,c){APIC_LOG_VERBOSE&&dbg_log("Deliver "+h(a,2)+" mode="+b+" level="+c,LOG_APIC);b!==IOAPIC_DELIVERY_INIT&&b!==IOAPIC_DELIVERY_NMI&&((16>a||255===a)&&dbg_assert(!1,"TODO: Invalid vector"),this.register_get_bit(this.irr,a)?dbg_log("Not delivered: irr already set, vector="+h(a,2),LOG_APIC):(this.register_set_bit(this.irr,a),c?this.register_set_bit(this.tmr,a):this.register_clear_bit(this.tmr,a),this.check_vector()))}; APIC.prototype.highest_irr=function(){var a=this.register_get_highest_bit(this.irr);dbg_assert(255!==a);dbg_assert(16<=a||-1===a);return a};APIC.prototype.highest_isr=function(){var a=this.register_get_highest_bit(this.isr);dbg_assert(255!==a);dbg_assert(16<=a||-1===a);return a}; APIC.prototype.check_vector=function(){var a=this.highest_irr();if(-1!==a){var b=this.highest_isr();b>=a?APIC_LOG_VERBOSE&&dbg_log("Higher isr, isr="+h(b)+" irr="+h(a),LOG_APIC):(a&240)<=(this.tpr&240)?APIC_LOG_VERBOSE&&dbg_log("Higher tpr, tpr="+h(this.tpr&240)+" irr="+h(a),LOG_APIC):this.cpu.handle_irqs()}}; APIC.prototype.acknowledge_irq=function(){var a=this.highest_irr();if(-1!==a){var b=this.highest_isr();b>=a?APIC_LOG_VERBOSE&&dbg_log("Higher isr, isr="+h(b)+" irr="+h(a),LOG_APIC):(a&240)<=(this.tpr&240)?APIC_LOG_VERBOSE&&dbg_log("Higher tpr, tpr="+h(this.tpr&240)+" irr="+h(a),LOG_APIC):(this.register_clear_bit(this.irr,a),this.register_set_bit(this.isr,a),APIC_LOG_VERBOSE&&dbg_log("Calling vector "+h(a),LOG_APIC),this.cpu.pic_call_irq(a),this.check_vector())}}; APIC.prototype.get_state=function(){var a=[];a[0]=this.apic_id;a[1]=this.timer_divider;a[2]=this.timer_divider_shift;a[3]=this.timer_initial_count;a[4]=this.timer_current_count;a[5]=this.next_tick;a[6]=this.lvt_timer;a[7]=this.lvt_perf_counter;a[8]=this.lvt_int0;a[9]=this.lvt_int1;a[10]=this.lvt_error;a[11]=this.tpr;a[12]=this.icr0;a[13]=this.icr1;a[14]=this.irr;a[15]=this.isr;a[16]=this.tmr;a[17]=this.spurious_vector;a[18]=this.destination_format;a[19]=this.local_destination;a[20]=this.error;a[21]= this.read_error;return a}; APIC.prototype.set_state=function(a){this.apic_id=a[0];this.timer_divider=a[1];this.timer_divider_shift=a[2];this.timer_initial_count=a[3];this.timer_current_count=a[4];this.next_tick=a[5];this.lvt_timer=a[6];this.lvt_perf_counter=a[7];this.lvt_int0=a[8];this.lvt_int1=a[9];this.lvt_error=a[10];this.tpr=a[11];this.icr0=a[12];this.icr1=a[13];this.irr=a[14];this.isr=a[15];this.tmr=a[16];this.spurious_vector=a[17];this.destination_format=a[18];this.local_destination=a[19];this.error=a[20];this.read_error= a[21]};APIC.prototype.register_get_bit=function(a,b){dbg_assert(0<=b&&256>b);return a[b>>5]>>(b&31)&1};APIC.prototype.register_set_bit=function(a,b){dbg_assert(0<=b&&256>b);a[b>>5]|=1<<(b&31)};APIC.prototype.register_clear_bit=function(a,b){dbg_assert(0<=b&&256>b);a[b>>5]&=~(1<<(b&31))};APIC.prototype.register_get_highest_bit=function(a){for(var b=7;0<=b;b--){var c=a[b];if(c)return v86util.int_log2(c>>>0)|b<<5}return-1};var IOAPIC_ADDRESS=4273995776,IOREGSEL=0,IOWIN=16,IOAPIC_IRQ_COUNT=24,IOAPIC_ID=0,IOAPIC_CONFIG_TRIGGER_MODE_LEVEL=32768,IOAPIC_CONFIG_MASKED=65536,IOAPIC_CONFIG_DELIVS=4096,IOAPIC_CONFIG_REMOTE_IRR=16384,IOAPIC_CONFIG_READONLY_MASK=IOAPIC_CONFIG_REMOTE_IRR|IOAPIC_CONFIG_DELIVS|4294836224,IOAPIC_DELIVERY_FIXED=0,IOAPIC_DELIVERY_LOWEST_PRIORITY=1,IOAPIC_DELIVERY_NMI=4,IOAPIC_DELIVERY_INIT=5; function IOAPIC(a){this.cpu=a;this.ioredtbl_config=new Int32Array(IOAPIC_IRQ_COUNT);this.ioredtbl_destination=new Int32Array(IOAPIC_IRQ_COUNT);for(var b=0;b{c=c-IOAPIC_ADDRESS|0;if(c>=IOWIN&&c>8*c&255;dbg_log("Unexpected IOAPIC register read: "+h(c>>>0),LOG_APIC);dbg_assert(!1);return 0},(c,d)=>{dbg_assert(!1,"unsupported write8 from ioapic: "+h(c>>>0))},c=>{c=c-IOAPIC_ADDRESS|0;if(c===IOREGSEL)return this.ioregsel;if(c===IOWIN)return this.read(this.ioregsel);dbg_log("Unexpected IOAPIC register read: "+h(c>>>0),LOG_APIC);dbg_assert(!1);return 0},(c,d)=>{c=c-IOAPIC_ADDRESS|0;c===IOREGSEL?this.ioregsel=d:c===IOWIN?this.write(this.ioregsel,d):(dbg_log("Unexpected IOAPIC register write: "+ h(c>>>0)+" <- "+h(d>>>0,8),LOG_APIC),dbg_assert(!1))})}IOAPIC.prototype.remote_eoi=function(a){for(var b=0;b=IOAPIC_IRQ_COUNT)dbg_assert(!1,"Bad irq: "+a,LOG_APIC);else{var b=1<=IOAPIC_IRQ_COUNT)dbg_assert(!1,"Bad irq: "+a,LOG_APIC);else{var b=1<>1;a&1?(a=this.ioredtbl_destination[b],dbg_log("IOAPIC Read destination irq="+h(b)+" -> "+h(a,8),LOG_APIC)):(a=this.ioredtbl_config[b],dbg_log("IOAPIC Read config irq="+h(b)+" -> "+h(a,8), LOG_APIC));return a}dbg_log("IOAPIC register read outside of range "+h(a),LOG_APIC);dbg_assert(!1);return 0}; IOAPIC.prototype.write=function(a,b){if(0===a)this.ioapic_id=b>>>24&15;else if(1===a||2===a)dbg_log("Invalid write: "+a,LOG_APIC);else if(16<=a&&a<16+2*IOAPIC_IRQ_COUNT){var c=a-16>>1;if(a&1)this.ioredtbl_destination[c]=b&4278190080,dbg_log("Write destination "+h(b>>>0,8)+" irq="+h(c)+" dest="+h(b>>>24,2),LOG_APIC);else{this.ioredtbl_config[c]=b&~IOAPIC_CONFIG_READONLY_MASK|this.ioredtbl_config[c]&IOAPIC_CONFIG_READONLY_MASK;a=b&255;var d=b>>8&7,e=b>>11&1,f=b>>15&1,k=b>>16&1;dbg_log("Write config "+ h(b>>>0,8)+" irq="+h(c)+" vector="+h(a,2)+" deliverymode="+DELIVERY_MODES[d]+" destmode="+DESTINATION_MODES[e]+" is_level="+f+" disabled="+k,LOG_APIC);this.check_irq(c)}}else dbg_log("IOAPIC register write outside of range "+h(a)+": "+h(b>>>0,8),LOG_APIC),dbg_assert(!1)};IOAPIC.prototype.get_state=function(){var a=[];a[0]=this.ioredtbl_config;a[1]=this.ioredtbl_destination;a[2]=this.ioregsel;a[3]=this.ioapic_id;a[4]=this.irr;a[5]=this.irq_value;return a}; IOAPIC.prototype.set_state=function(a){this.ioredtbl_config=a[0];this.ioredtbl_destination=a[1];this.ioregsel=a[2];this.ioapic_id=a[3];this.irr=a[4];this.irq_value=a[5]};var STATE_VERSION=6,STATE_MAGIC=-2039052682,STATE_INDEX_MAGIC=0,STATE_INDEX_VERSION=1,STATE_INDEX_TOTAL_LEN=2,STATE_INDEX_INFO_LEN=3,STATE_INFO_BLOCK_START=16;const ZSTD_MAGIC=4247762216;function StateLoadError(a){this.message=a}StateLoadError.prototype=Error();const CONSTRUCTOR_TABLE={Uint8Array,Int8Array,Uint16Array,Int16Array,Uint32Array,Int32Array,Float32Array,Float64Array}; function save_object(a,b){if("object"!==typeof a||null===a)return dbg_assert("function"!==typeof a),a;if(a instanceof Array)return a.map(f=>save_object(f,b));a.constructor===Object&&(console.log(a),dbg_assert(a.constructor!==Object,"Expected non-object"));if(a.BYTES_PER_ELEMENT){var c=new Uint8Array(a.buffer,a.byteOffset,a.length*a.BYTES_PER_ELEMENT);a=a.constructor.name.replace("bound ","");dbg_assert(CONSTRUCTOR_TABLE[a]);return{__state_type__:a,buffer_id:b.push(c)-1}}DEBUG&&!a.get_state&&console.log("Object without get_state: ", a);c=a.get_state();a=[];for(var d=0;d>10)+"k");dbg_log("State: Total buffers size "+(f.byteLength>>10)+"k");return d}; CPU.prototype.restore_state=function(a){function b(v,q){const p=v.length;if(p>>0));if(v[STATE_INDEX_VERSION]!==STATE_VERSION)throw new StateLoadError("Version mismatch: dump="+v[STATE_INDEX_VERSION]+" we="+STATE_VERSION);if(q&&v[STATE_INDEX_TOTAL_LEN]!==p)throw new StateLoadError("Length doesn't match header: real="+ p+" header="+v[STATE_INDEX_TOTAL_LEN]);return v[STATE_INDEX_INFO_LEN]}function c(v){v=(new TextDecoder).decode(v);return JSON.parse(v)}a=new Uint8Array(a);if((new Uint32Array(a.buffer,0,1))[0]===ZSTD_MAGIC){var d=this.zstd_create_ctx(a.length);(new Uint8Array(this.wasm_memory.buffer,this.zstd_get_src_ptr(d),a.length)).set(a);var e=this.zstd_read(d,16),f=new Uint8Array(this.wasm_memory.buffer,e,16),k=b(f,!1);this.zstd_read_free(e,16);e=this.zstd_read(d,k);f=new Uint8Array(this.wasm_memory.buffer,e, k);f=c(f);this.zstd_read_free(e,k);e=f.state;var g=f.buffer_infos;f=[];k=STATE_INFO_BLOCK_START+k;for(var l of g){g=(k+3&-4)-k;if(1048576d||d+12>=a.length)throw new StateLoadError("Invalid info block length: "+d);l=a.subarray(STATE_INFO_BLOCK_START,STATE_INFO_BLOCK_START+d);e=c(l);l=e.state;e=e.buffer_infos;let v=STATE_INFO_BLOCK_START+d;v=v+3&-4;d=e.map(q=>{const p=v+q.offset;return a.buffer.slice(p,p+q.length)});l=restore_buffers(l,d);this.set_state(l)}};const NE2K_LOG_VERBOSE=!1; var E8390_CMD=0,EN0_CLDALO=1,EN0_STARTPG=1,EN0_CLDAHI=2,EN0_STOPPG=2,EN0_BOUNDARY=3,EN0_TSR=4,EN0_TPSR=4,EN0_NCR=5,EN0_TCNTLO=5,EN0_FIFO=6,EN0_TCNTHI=6,EN0_ISR=7,EN0_CRDALO=8,EN0_RSARLO=8,EN0_CRDAHI=9,EN0_RSARHI=9,EN0_RCNTLO=10,EN0_RCNTHI=11,EN0_RSR=12,EN0_RXCR=12,EN0_TXCR=13,EN0_COUNTER0=13,EN0_DCFG=14,EN0_COUNTER1=14,EN0_IMR=15,EN0_COUNTER2=15,NE_DATAPORT=16,NE_RESET=31,ENISR_RX=1,ENISR_TX=2,ENISR_RX_ERR=4,ENISR_TX_ERR=8,ENISR_OVER=16,ENISR_COUNTERS=32,ENISR_RDC=64,ENISR_RESET=128,ENISR_ALL=63, ENRSR_RXOK=1,START_PAGE=64,START_RX_PAGE=76,STOP_PAGE=128; function Ne2k(a,b,c){this.cpu=a;this.pci=a.devices.pci;this.preserve_mac_from_state_image=c;this.bus=b;this.bus.register("net0-receive",function(d){this.receive(d)},this);this.port=768;this.name="ne2k";this.pci_space=[236,16,41,128,3,1,0,0,0,0,0,2,0,0,0,0,this.port&255|1,this.port>>8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,26,0,17,0,0,184,254,0,0,0,0,0,0,0,0,0,1,0,0];this.pci_id=40;this.pci_bars=[{size:32}];this.imr=this.isr=0;this.cr=1;this.tpsr=this.tcnt=this.rcnt=this.dcfg=0;this.memory= new Uint8Array(32768);this.txcr=this.rxcr=0;this.tsr=1;this.mac=new Uint8Array([0,34,21,255*Math.random()|0,255*Math.random()|0,255*Math.random()|0]);for(b=0;6>b;b++)this.memory[b<<1]=this.memory[b<<1|1]=this.mac[b];this.memory[28]=this.memory[29]=87;this.memory[30]=this.memory[31]=87;dbg_log("Mac: "+h(this.mac[0],2)+":"+h(this.mac[1],2)+":"+h(this.mac[2],2)+":"+h(this.mac[3],2)+":"+h(this.mac[4],2)+":"+h(this.mac[5],2),LOG_NET);this.rsar=0;this.pstart=START_PAGE;this.pstop=STOP_PAGE;this.boundary= this.curpg=START_RX_PAGE;b=a.io;b.register_read(this.port|E8390_CMD,this,function(){dbg_log("Read cmd",LOG_NET);return this.cr});b.register_write(this.port|E8390_CMD,this,function(d){this.cr=d;dbg_log("Write command: "+h(d,2)+" newpg="+(this.cr>>6)+" txcr="+h(this.txcr,2),LOG_NET);this.cr&1||(d&24&&0===this.rcnt&&this.do_interrupt(ENISR_RDC),d&4&&(d=this.tpsr<<8,d=this.memory.subarray(d,d+this.tcnt),this.bus.send("net0-send",d),this.bus.send("eth-transmit-end",[d.length]),this.cr&=-5,this.do_interrupt(ENISR_TX), dbg_log("Command: Transfer. length="+h(d.byteLength),LOG_NET)))});b.register_read(this.port|EN0_COUNTER0,this,function(){dbg_log("Read counter0",LOG_NET);return 0});b.register_read(this.port|EN0_COUNTER1,this,function(){dbg_log("Read counter1",LOG_NET);return 0});b.register_read(this.port|EN0_COUNTER2,this,function(){dbg_log("Read counter2",LOG_NET);return 0});b.register_read(this.port|NE_RESET,this,function(){var d=this.get_page();0===d?(dbg_log("Read reset",LOG_NET),this.do_interrupt(ENISR_RESET)): (dbg_log("Read pg"+d+"/1f",LOG_NET),dbg_assert(!1));return 0});b.register_write(this.port|NE_RESET,this,function(d){var e=this.get_page();0===e?dbg_log("Write reset: "+h(d,2),LOG_NET):(dbg_log("Write pg"+e+"/1f: "+h(d),LOG_NET),dbg_assert(!1))});b.register_read(this.port|EN0_STARTPG,this,function(){var d=this.get_page();if(0===d)return this.pstart;if(1===d)return dbg_log("Read pg1/01 (mac[0])",LOG_NET),this.mac[0];if(2===d)return this.pstart;dbg_log("Read pg"+d+"/01");dbg_assert(!1);return 0});b.register_write(this.port| EN0_STARTPG,this,function(d){var e=this.get_page();0===e?(dbg_log("start page: "+h(d,2),LOG_NET),this.pstart=d):1===e?(dbg_log("mac[0] = "+h(d),LOG_NET),this.mac[0]=d):3===e?dbg_log("Unimplemented: Write pg3/01 (9346CR): "+h(d),LOG_NET):(dbg_log("Write pg"+e+"/01: "+h(d),LOG_NET),dbg_assert(!1))});b.register_read(this.port|EN0_STOPPG,this,function(){var d=this.get_page();if(0===d)return this.pstop;if(1===d)return dbg_log("Read pg1/02 (mac[1])",LOG_NET),this.mac[1];if(2===d)return this.pstop;dbg_log("Read pg"+ d+"/02",LOG_NET);dbg_assert(!1);return 0});b.register_write(this.port|EN0_STOPPG,this,function(d){var e=this.get_page();0===e?(dbg_log("stop page: "+h(d,2),LOG_NET),d>this.memory.length>>8&&(d=this.memory.length>>8,dbg_log("XXX: Adjusting stop page to "+h(d),LOG_NET)),this.pstop=d):1===e?(dbg_log("mac[1] = "+h(d),LOG_NET),this.mac[1]=d):(dbg_log("Write pg"+e+"/02: "+h(d),LOG_NET),dbg_assert(!1))});b.register_read(this.port|EN0_ISR,this,function(){var d=this.get_page();if(0===d)return dbg_log("Read isr: "+ h(this.isr,2),LOG_NET),this.isr;if(1===d)return dbg_log("Read curpg: "+h(this.curpg,2),LOG_NET),this.curpg;dbg_assert(!1)});b.register_write(this.port|EN0_ISR,this,function(d){var e=this.get_page();0===e?(dbg_log("Write isr: "+h(d,2),LOG_NET),this.isr&=~d,this.update_irq()):1===e?(dbg_log("Write curpg: "+h(d,2),LOG_NET),this.curpg=d):dbg_assert(!1)});b.register_write(this.port|EN0_TXCR,this,function(d){var e=this.get_page();0===e?(this.txcr=d,dbg_log("Write tx config: "+h(d,2),LOG_NET)):dbg_log("Unimplemented: Write pg"+ e+"/0d "+h(d,2),LOG_NET)});b.register_write(this.port|EN0_DCFG,this,function(d){var e=this.get_page();0===e?(dbg_log("Write data configuration: "+h(d,2),LOG_NET),this.dcfg=d):dbg_log("Unimplemented: Write pg"+e+"/0e "+h(d,2),LOG_NET)});b.register_read(this.port|EN0_RCNTLO,this,function(){if(0===this.get_page())return dbg_log("Read pg0/0a",LOG_NET),80;dbg_assert(!1,"TODO");return 0});b.register_write(this.port|EN0_RCNTLO,this,function(d){var e=this.get_page();0===e?(dbg_log("Write remote byte count low: "+ h(d,2),LOG_NET),this.rcnt=this.rcnt&65280|d&255):dbg_log("Unimplemented: Write pg"+e+"/0a "+h(d,2),LOG_NET)});b.register_read(this.port|EN0_RCNTHI,this,function(){if(0===this.get_page())return dbg_log("Read pg0/0b",LOG_NET),67;dbg_assert(!1,"TODO");return 0});b.register_write(this.port|EN0_RCNTHI,this,function(d){var e=this.get_page();0===e?(dbg_log("Write remote byte count high: "+h(d,2),LOG_NET),this.rcnt=this.rcnt&255|d<<8&65280):dbg_log("Unimplemented: Write pg"+e+"/0b "+h(d,2),LOG_NET)});b.register_read(this.port| EN0_RSARLO,this,function(){var d=this.get_page();if(0===d)return dbg_log("Read remote start address low",LOG_NET),this.rsar&255;dbg_log("Unimplemented: Read pg"+d+"/08",LOG_NET);dbg_assert(!1)});b.register_write(this.port|EN0_RSARLO,this,function(d){var e=this.get_page();0===e?(dbg_log("Write remote start address low: "+h(d,2),LOG_NET),this.rsar=this.rsar&65280|d&255):dbg_log("Unimplemented: Write pg"+e+"/08 "+h(d,2),LOG_NET)});b.register_read(this.port|EN0_RSARHI,this,function(){var d=this.get_page(); if(0===d)return dbg_log("Read remote start address high",LOG_NET),this.rsar>>8&255;dbg_log("Unimplemented: Read pg"+d+"/09",LOG_NET);dbg_assert(!1)});b.register_write(this.port|EN0_RSARHI,this,function(d){var e=this.get_page();0===e?(dbg_log("Write remote start address low: "+h(d,2),LOG_NET),this.rsar=this.rsar&255|d<<8&65280):dbg_log("Unimplemented: Write pg"+e+"/09 "+h(d,2),LOG_NET)});b.register_write(this.port|EN0_IMR,this,function(d){var e=this.get_page();0===e?(dbg_log("Write interrupt mask register: "+ h(d,2)+" isr="+h(this.isr,2),LOG_NET),this.imr=d,this.update_irq()):dbg_log("Unimplemented: Write pg"+e+"/0f "+h(d,2),LOG_NET)});b.register_read(this.port|EN0_BOUNDARY,this,function(){var d=this.get_page();if(0===d)return dbg_log("Read boundary: "+h(this.boundary,2),LOG_NET),this.boundary;if(1===d)return dbg_log("Read pg1/03 (mac[2])",LOG_NET),this.mac[2];3===d?dbg_log("Unimplemented: Read pg3/03 (CONFIG0)",LOG_NET):(dbg_log("Read pg"+d+"/03",LOG_NET),dbg_assert(!1));return 0});b.register_write(this.port| EN0_BOUNDARY,this,function(d){var e=this.get_page();0===e?(dbg_log("Write boundary: "+h(d,2),LOG_NET),this.boundary=d):1===e?(dbg_log("mac[2] = "+h(d),LOG_NET),this.mac[2]=d):(dbg_log("Write pg"+e+"/03: "+h(d),LOG_NET),dbg_assert(!1))});b.register_read(this.port|EN0_TSR,this,function(){var d=this.get_page();if(0===d)return this.tsr;if(1===d)return dbg_log("Read pg1/04 (mac[3])",LOG_NET),this.mac[3];dbg_log("Read pg"+d+"/04",LOG_NET);dbg_assert(!1);return 0});b.register_write(this.port|EN0_TPSR,this, function(d){var e=this.get_page();0===e?(dbg_log("Write tpsr: "+h(d,2),LOG_NET),this.tpsr=d):1===e?(dbg_log("mac[3] = "+h(d),LOG_NET),this.mac[3]=d):(dbg_log("Write pg"+e+"/04: "+h(d),LOG_NET),dbg_assert(!1))});b.register_read(this.port|EN0_TCNTLO,this,function(){var d=this.get_page();if(0===d)return dbg_log("Unimplemented: Read pg0/05 (NCR: Number of Collisions Register)",LOG_NET),0;if(1===d)return dbg_log("Read pg1/05 (mac[4])",LOG_NET),this.mac[4];3===d?dbg_log("Unimplemented: Read pg3/05 (CONFIG2)", LOG_NET):(dbg_log("Read pg"+d+"/05",LOG_NET),dbg_assert(!1));return 0});b.register_write(this.port|EN0_TCNTLO,this,function(d){var e=this.get_page();0===e?(dbg_log("Write tcnt low: "+h(d,2),LOG_NET),this.tcnt=this.tcnt&-256|d):1===e?(dbg_log("mac[4] = "+h(d),LOG_NET),this.mac[4]=d):3===e?dbg_log("Unimplemented: Write pg3/05 (CONFIG2): "+h(d),LOG_NET):(dbg_log("Write pg"+e+"/05: "+h(d),LOG_NET),dbg_assert(!1))});b.register_read(this.port|EN0_TCNTHI,this,function(){var d=this.get_page();if(0===d)return dbg_assert(!1, "TODO"),0;if(1===d)return dbg_log("Read pg1/06 (mac[5])",LOG_NET),this.mac[5];3===d?dbg_log("Unimplemented: Read pg3/06 (CONFIG3)",LOG_NET):(dbg_log("Read pg"+d+"/06",LOG_NET),dbg_assert(!1));return 0});b.register_write(this.port|EN0_TCNTHI,this,function(d){var e=this.get_page();0===e?(dbg_log("Write tcnt high: "+h(d,2),LOG_NET),this.tcnt=this.tcnt&255|d<<8):1===e?(dbg_log("mac[5] = "+h(d),LOG_NET),this.mac[5]=d):3===e?dbg_log("Unimplemented: Write pg3/06 (CONFIG3): "+h(d),LOG_NET):(dbg_log("Write pg"+ e+"/06: "+h(d),LOG_NET),dbg_assert(!1))});b.register_read(this.port|EN0_RSR,this,function(){var d=this.get_page();if(0===d)return 9;dbg_log("Unimplemented: Read pg"+d+"/0c",LOG_NET);dbg_assert(!1);return 0});b.register_write(this.port|EN0_RXCR,this,function(d){var e=this.get_page();0===e?(dbg_log("RX configuration reg write: "+h(d,2),LOG_NET),this.rxcr=d):dbg_log("Unimplemented: Write pg"+e+"/0c: "+h(d),LOG_NET)});b.register_read(this.port|NE_DATAPORT|0,this,this.data_port_read8,this.data_port_read16, this.data_port_read32);b.register_write(this.port|NE_DATAPORT|0,this,this.data_port_write16,this.data_port_write16,this.data_port_write32);a.devices.pci.register_device(this)}Ne2k.prototype.get_state=function(){var a=[];a[0]=this.isr;a[1]=this.imr;a[2]=this.cr;a[3]=this.dcfg;a[4]=this.rcnt;a[5]=this.tcnt;a[6]=this.tpsr;a[7]=this.rsar;a[8]=this.pstart;a[9]=this.curpg;a[10]=this.boundary;a[11]=this.pstop;a[12]=this.rxcr;a[13]=this.txcr;a[14]=this.tsr;a[15]=this.mac;a[16]=this.memory;return a}; Ne2k.prototype.set_state=function(a){this.isr=a[0];this.imr=a[1];this.cr=a[2];this.dcfg=a[3];this.rcnt=a[4];this.tcnt=a[5];this.tpsr=a[6];this.rsar=a[7];this.pstart=a[8];this.curpg=a[9];this.boundary=a[10];this.pstop=a[11];this.rxcr=a[12];this.txcr=a[13];this.tsr=a[14];this.preserve_mac_from_state_image&&(this.mac=a[15],this.memory=a[16])};Ne2k.prototype.do_interrupt=function(a){dbg_log("Do interrupt "+h(a,2),LOG_NET);this.isr|=a;this.update_irq()}; Ne2k.prototype.update_irq=function(){this.imr&this.isr?this.pci.raise_irq(this.pci_id):this.pci.lower_irq(this.pci_id)};Ne2k.prototype.data_port_write=function(a){NE2K_LOG_VERBOSE&&dbg_log("Write data port: data="+h(a&255,2)+" rsar="+h(this.rsar,4)+" rcnt="+h(this.rcnt,4),LOG_NET);if(16>=this.rsar||this.rsar>=START_PAGE<<8&&this.rsar=this.pstop<<8&&(this.rsar+=this.pstart-this.pstop<<8);0===this.rcnt&&this.do_interrupt(ENISR_RDC)}; Ne2k.prototype.data_port_write16=function(a){this.data_port_write(a);this.dcfg&1&&this.data_port_write(a>>8)};Ne2k.prototype.data_port_write32=function(a){this.data_port_write(a);this.data_port_write(a>>8);this.data_port_write(a>>16);this.data_port_write(a>>24)}; Ne2k.prototype.data_port_read=function(){let a=0;this.rsar>8),f=b+c,k=1+(c>>8),g=this.boundary>this.curpg?this.boundary-this.curpg:this.pstop- this.curpg+this.boundary-this.pstart;g exit highspeed",LOG_SB16),this.dsp_highspeed=!1):a&&(dbg_log(" -> reset",LOG_SB16),this.dsp_reset());this.read_buffer.clear();this.read_buffer.push(170)};SB16.prototype.port2x7_write=function(a){dbg_log("227 write: undocumented",LOG_SB16)}; SB16.prototype.port2x8_write=function(a){dbg_log("228 write: fm music register port (unimplemented)",LOG_SB16)};SB16.prototype.port2x9_write=function(a){dbg_log("229 write: fm music data port (unimplemented)",LOG_SB16)};SB16.prototype.port2xA_write=function(a){dbg_log("22A write: dsp read data port (read only)",LOG_SB16)};SB16.prototype.port2xB_write=function(a){dbg_log("22B write: undocumented",LOG_SB16)}; SB16.prototype.port2xC_write=function(a){dbg_log("22C write: write command/data",LOG_SB16);this.command===DSP_NO_COMMAND?(dbg_log("22C write: command = "+h(a),LOG_SB16),this.command=a,this.write_buffer.clear(),this.command_size=DSP_COMMAND_SIZES[a]):(dbg_log("22C write: data: "+h(a),LOG_SB16),this.write_buffer.push(a));this.write_buffer.length>=this.command_size&&this.command_do()};SB16.prototype.port2xD_write=function(a){dbg_log("22D write: undocumented",LOG_SB16)}; SB16.prototype.port2xE_write=function(a){dbg_log("22E write: dsp read buffer status (read only)",LOG_SB16)};SB16.prototype.port2xF_write=function(a){dbg_log("22F write: undocumented",LOG_SB16)};SB16.prototype.port3x0_read=function(){dbg_log("330 read: mpu data",LOG_SB16);this.mpu_read_buffer.length&&(this.mpu_read_buffer_lastvalue=this.mpu_read_buffer.shift());dbg_log(" <- "+h(this.mpu_read_buffer_lastvalue),LOG_SB16);return this.mpu_read_buffer_lastvalue}; SB16.prototype.port3x0_write=function(a){dbg_log("330 write: mpu data (unimplemented) : "+h(a),LOG_SB16)};SB16.prototype.port3x1_read=function(){dbg_log("331 read: mpu status",LOG_SB16);return 0|128*!this.mpu_read_buffer.length};SB16.prototype.port3x1_write=function(a){dbg_log("331 write: mpu command: "+h(a),LOG_SB16);255==a&&(this.mpu_read_buffer.clear(),this.mpu_read_buffer.push(254))}; SB16.prototype.command_do=function(){var a=DSP_COMMAND_HANDLERS[this.command];a||(a=this.dsp_default_handler);a.call(this);this.command=DSP_NO_COMMAND;this.command_size=0;this.write_buffer.clear()};SB16.prototype.dsp_default_handler=function(){dbg_log("Unhandled command: "+h(this.command),LOG_SB16)};function register_dsp_command(a,b,c){c||(c=SB16.prototype.dsp_default_handler);for(var d=0;dc;c++)b.push(a+c);return b}register_dsp_command([14],2,function(){this.asp_registers[this.write_buffer.shift()]=this.write_buffer.shift()});register_dsp_command([15],1,function(){this.read_buffer.clear();this.read_buffer.push(this.asp_registers[this.write_buffer.shift()])});register_dsp_command([16],1,function(){var a=audio_normalize(this.write_buffer.shift(),127.5,-1);this.dac_buffers[0].push(a);this.dac_buffers[1].push(a);this.bus.send("dac-enable")}); register_dsp_command([20,21],2,function(){this.dma_irq=SB_IRQ_8BIT;this.dma_channel=this.dma_channel_8bit;this.dsp_highspeed=this.dsp_16bit=this.dsp_signed=this.dma_autoinit=!1;this.dma_transfer_size_set();this.dma_transfer_start()});register_dsp_command([22],2);register_dsp_command([23],2);register_dsp_command([28],0,function(){this.dma_irq=SB_IRQ_8BIT;this.dma_channel=this.dma_channel_8bit;this.dma_autoinit=!0;this.dsp_highspeed=this.dsp_16bit=this.dsp_signed=!1;this.dma_transfer_start()}); register_dsp_command([31],0);register_dsp_command([32],0,function(){this.read_buffer.clear();this.read_buffer.push(127)});register_dsp_command([36],2);register_dsp_command([44],0);register_dsp_command([48],0);register_dsp_command([49],0);register_dsp_command([52],0);register_dsp_command([53],0);register_dsp_command([54],0);register_dsp_command([55],0);register_dsp_command([56],0);register_dsp_command([64],1,function(){this.sampling_rate_change(1E6/(256-this.write_buffer.shift())/this.get_channel_count())}); register_dsp_command([65,66],2,function(){this.sampling_rate_change(this.write_buffer.shift()<<8|this.write_buffer.shift())});register_dsp_command([72],2,function(){this.dma_transfer_size_set()});register_dsp_command([116],2);register_dsp_command([117],2);register_dsp_command([118],2);register_dsp_command([119],2);register_dsp_command([125],0);register_dsp_command([127],0);register_dsp_command([128],2); register_dsp_command([144],0,function(){this.dma_irq=SB_IRQ_8BIT;this.dma_channel=this.dma_channel_8bit;this.dma_autoinit=!0;this.dsp_signed=!1;this.dsp_highspeed=!0;this.dsp_16bit=!1;this.dma_transfer_start()});register_dsp_command([145],0);register_dsp_command([152],0);register_dsp_command([153],0);register_dsp_command([160],0);register_dsp_command([168],0); register_dsp_command(any_first_digit(176),3,function(){if(this.command&8)this.dsp_default_handler();else{var a=this.write_buffer.shift();this.dma_irq=SB_IRQ_16BIT;this.dma_channel=this.dma_channel_16bit;this.dma_autoinit=!!(this.command&4);this.dsp_signed=!!(a&16);this.dsp_stereo=!!(a&32);this.dsp_16bit=!0;this.dma_transfer_size_set();this.dma_transfer_start()}}); register_dsp_command(any_first_digit(192),3,function(){if(this.command&8)this.dsp_default_handler();else{var a=this.write_buffer.shift();this.dma_irq=SB_IRQ_8BIT;this.dma_channel=this.dma_channel_8bit;this.dma_autoinit=!!(this.command&4);this.dsp_signed=!!(a&16);this.dsp_stereo=!!(a&32);this.dsp_16bit=!1;this.dma_transfer_size_set();this.dma_transfer_start()}});register_dsp_command([208],0,function(){this.dma_paused=!0;this.bus.send("dac-disable")}); register_dsp_command([209],0,function(){this.dummy_speaker_enabled=!0});register_dsp_command([211],0,function(){this.dummy_speaker_enabled=!1});register_dsp_command([212],0,function(){this.dma_paused=!1;this.bus.send("dac-enable")});register_dsp_command([213],0,function(){this.dma_paused=!0;this.bus.send("dac-disable")});register_dsp_command([214],0,function(){this.dma_paused=!1;this.bus.send("dac-enable")}); register_dsp_command([216],0,function(){this.read_buffer.clear();this.read_buffer.push(255*this.dummy_speaker_enabled)});register_dsp_command([217,218],0,function(){this.dma_autoinit=!1});register_dsp_command([224],1,function(){this.read_buffer.clear();this.read_buffer.push(~this.write_buffer.shift())});register_dsp_command([225],0,function(){this.read_buffer.clear();this.read_buffer.push(4);this.read_buffer.push(5)});register_dsp_command([226],1); register_dsp_command([227],0,function(){this.read_buffer.clear();for(var a=0;a>>4};MIXER_WRITE_HANDLERS[a]=function(d){this.mixer_registers[a]=d;var e=d<<4&240|this.mixer_registers[c]&15;this.mixer_write(b,d&240|this.mixer_registers[b]&15);this.mixer_write(c,e)}} function register_mixer_volume(a,b,c){MIXER_READ_HANDLERS[a]=SB16.prototype.mixer_default_read;MIXER_WRITE_HANDLERS[a]=function(d){this.mixer_registers[a]=d;this.bus.send("mixer-volume",[b,c,(d>>>2)-62])}}register_mixer_read(0,function(){this.mixer_reset();return 0});register_mixer_write(0);register_mixer_legacy(4,50,51);register_mixer_legacy(34,48,49);register_mixer_legacy(38,52,53);register_mixer_legacy(40,54,55);register_mixer_legacy(46,56,57);register_mixer_volume(48,MIXER_SRC_MASTER,MIXER_CHANNEL_LEFT); register_mixer_volume(49,MIXER_SRC_MASTER,MIXER_CHANNEL_RIGHT);register_mixer_volume(50,MIXER_SRC_DAC,MIXER_CHANNEL_LEFT);register_mixer_volume(51,MIXER_SRC_DAC,MIXER_CHANNEL_RIGHT);register_mixer_read(59);register_mixer_write(59,function(a){this.mixer_registers[59]=a;this.bus.send("mixer-volume",[MIXER_SRC_PCSPEAKER,MIXER_CHANNEL_BOTH,6*(a>>>6)-18])});register_mixer_read(65);register_mixer_write(65,function(a){this.mixer_registers[65]=a;this.bus.send("mixer-gain-left",6*(a>>>6))});register_mixer_read(66); register_mixer_write(66,function(a){this.mixer_registers[66]=a;this.bus.send("mixer-gain-right",6*(a>>>6))});register_mixer_read(68);register_mixer_write(68,function(a){this.mixer_registers[68]=a;a>>>=3;this.bus.send("mixer-treble-left",a-(16>a?14:16))});register_mixer_read(69);register_mixer_write(69,function(a){this.mixer_registers[69]=a;a>>>=3;this.bus.send("mixer-treble-right",a-(16>a?14:16))});register_mixer_read(70); register_mixer_write(70,function(a){this.mixer_registers[70]=a;a>>>=3;this.bus.send("mixer-bass-right",a-(16>a?14:16))});register_mixer_read(71);register_mixer_write(71,function(a){this.mixer_registers[71]=a;a>>>=3;this.bus.send("mixer-bass-right",a-(16>a?14:16))});register_mixer_read(128,function(){switch(this.irq){case SB_IRQ2:return 1;case SB_IRQ5:return 2;case SB_IRQ7:return 4;case SB_IRQ10:return 8;default:return 0}}); register_mixer_write(128,function(a){a&1&&(this.irq=SB_IRQ2);a&2&&(this.irq=SB_IRQ5);a&4&&(this.irq=SB_IRQ7);a&8&&(this.irq=SB_IRQ10)});register_mixer_read(129,function(){var a=0;switch(this.dma_channel_8bit){case SB_DMA0:a|=1;break;case SB_DMA1:a|=2;break;case SB_DMA3:a|=8}switch(this.dma_channel_16bit){case SB_DMA5:a|=32;break;case SB_DMA6:a|=64;break;case SB_DMA7:a|=128}return a}); register_mixer_write(129,function(a){a&1&&(this.dma_channel_8bit=SB_DMA0);a&2&&(this.dma_channel_8bit=SB_DMA1);a&8&&(this.dma_channel_8bit=SB_DMA3);a&32&&(this.dma_channel_16bit=SB_DMA5);a&64&&(this.dma_channel_16bit=SB_DMA6);a&128&&(this.dma_channel_16bit=SB_DMA7)});register_mixer_read(130,function(){for(var a=32,b=0;16>b;b++)a|=b*this.irq_triggered[b];return a});SB16.prototype.fm_default_write=function(a,b,c){dbg_log("unhandled fm register write. addr:"+b+"|"+h(c)+" data:"+h(a),LOG_SB16)}; function register_fm_write(a,b){b||(b=SB16.prototype.fm_default_write);for(var c=0;c>2&-4,32),this.dma_bytes_block);this.dma_waiting_transfer=!0;this.dma.channel_mask[this.dma_channel]||this.dma_on_unmask(this.dma_channel)}; SB16.prototype.dma_on_unmask=function(a){a===this.dma_channel&&this.dma_waiting_transfer&&(this.dma_waiting_transfer=!1,this.dma_bytes_left=this.dma_bytes_count,this.dma_paused=!1,this.bus.send("dac-enable"))}; SB16.prototype.dma_transfer_next=function(){dbg_log("dma transfering next block",LOG_SB16);var a=Math.min(this.dma_bytes_left,this.dma_bytes_block),b=Math.floor(a/this.bytes_per_sample);this.dma.do_write(this.dma_syncbuffer,0,a,this.dma_channel,c=>{dbg_log("dma block transfer "+(c?"unsuccessful":"successful"),LOG_SB16);c||(this.dma_to_dac(b),this.dma_bytes_left-=a,this.dma_bytes_left||(this.raise_irq(this.dma_irq),this.dma_autoinit&&(this.dma_bytes_left=this.dma_bytes_count)))})}; SB16.prototype.dma_to_dac=function(a){var b=this.dsp_16bit?32767.5:127.5,c=this.dsp_signed?0:-1,d=this.dsp_stereo?1:2;var e=this.dsp_16bit?this.dsp_signed?this.dma_buffer_int16:this.dma_buffer_uint16:this.dsp_signed?this.dma_buffer_int8:this.dma_buffer_uint8;for(var f=0,k=0;kc)*c+(b<=a&&a<=c)*a};const VIRTIO_PCI_VENDOR_ID=6900,VIRTIO_PCI_CAP_VENDOR=9,VIRTIO_PCI_CAP_LENGTH=16,VIRTIO_PCI_CAP_COMMON_CFG=1,VIRTIO_PCI_CAP_NOTIFY_CFG=2,VIRTIO_PCI_CAP_ISR_CFG=3,VIRTIO_PCI_CAP_DEVICE_CFG=4,VIRTIO_PCI_CAP_PCI_CFG=5,VIRTIO_STATUS_ACKNOWLEDGE=1,VIRTIO_STATUS_DRIVER=2,VIRTIO_STATUS_DRIVER_OK=4,VIRTIO_STATUS_FEATURES_OK=8,VIRTIO_STATUS_DEVICE_NEEDS_RESET=64,VIRTIO_STATUS_FAILED=128,VIRTIO_ISR_QUEUE=1,VIRTIO_ISR_DEVICE_CFG=2,VIRTIO_F_RING_INDIRECT_DESC=28,VIRTIO_F_RING_EVENT_IDX=29,VIRTIO_F_VERSION_1= 32,VIRTQ_DESC_ENTRYSIZE=16,VIRTQ_AVAIL_BASESIZE=6,VIRTQ_AVAIL_ENTRYSIZE=2,VIRTQ_USED_BASESIZE=6,VIRTQ_USED_ENTRYSIZE=8,VIRTQ_IDX_MASK=65535,VIRTQ_DESC_F_NEXT=1,VIRTQ_DESC_F_WRITE=2,VIRTQ_DESC_F_INDIRECT=4,VIRTQ_AVAIL_F_NO_INTERRUPT=1,VIRTQ_USED_F_NO_NOTIFY=1;var VirtIO_CapabilityStruct,VirtIO_CapabilityInfo,VirtQueue_Options,VirtIO_CommonCapabilityOptions,VirtIO_NotificationCapabilityOptions,VirtIO_ISRCapabilityOptions,VirtIO_DeviceSpecificCapabilityOptions,VirtIO_Options; function VirtIO(a,b){this.cpu=a;this.pci=a.devices.pci;this.device_id=b.device_id;this.pci_space=[VIRTIO_PCI_VENDOR_ID&255,VIRTIO_PCI_VENDOR_ID>>8,b.device_id&255,b.device_id>>8,7,5,16,0,1,0,2,0,0,0,0,0,1,168,0,0,0,16,191,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,VIRTIO_PCI_VENDOR_ID&255,VIRTIO_PCI_VENDOR_ID>>8,b.subsystem_device_id&255,b.subsystem_device_id>>8,0,0,0,0,64,0,0,0,0,0,0,0,0,1,0,0];this.pci_space=this.pci_space.concat(v86util.zeros(256-this.pci_space.length));this.pci_id=b.pci_id;this.pci_bars= [];this.name=b.name;this.driver_feature_select=this.device_feature_select=0;this.device_feature=new Uint32Array(4);this.driver_feature=new Uint32Array(4);for(var c of b.common.features)dbg_assert(0<=c,"VirtIO device<"+this.name+"> feature bit numbers must be non-negative"),dbg_assert(128>c,"VirtIO device<"+this.name+"> feature bit numbers assumed less than 128 in implementation"),this.device_feature[c>>>5]|=1<<(c&31),this.driver_feature[c>>>5]|=1<<(c&31);dbg_assert(b.common.features.includes(VIRTIO_F_VERSION_1), "VirtIO device<"+this.name+"> only non-transitional devices are supported");this.features_ok=!0;this.device_status=0;this.config_has_changed=!1;this.config_generation=0;this.queues=[];for(var d of b.common.queues)this.queues.push(new VirtQueue(a,this,d));this.queue_select=0;this.queue_selected=this.queues[0];this.isr_status=0;if(DEBUG){c=new Set;for(var e of this.queues.map(f=>f.notify_offset))d=b.notification.single_handler?0:e,c.add(d),dbg_assert(b.notification.handlers[d],"VirtIO device<"+this.name+ "> every queue's notifier must exist");for(const [f,k]of b.notification.handlers.entries())dbg_assert(!k||c.has(f),"VirtIO device<"+this.name+"> no defined notify handler should be unused")}e=[];e.push(this.create_common_capability(b.common));e.push(this.create_notification_capability(b.notification));e.push(this.create_isr_capability(b.isr_status));b.device_specific&&e.push(this.create_device_specific_capability(b.device_specific));this.init_capabilities(e);a.devices.pci.register_device(this);this.reset()} VirtIO.prototype.create_common_capability=function(a){return{type:VIRTIO_PCI_CAP_COMMON_CFG,bar:0,port:a.initial_port,use_mmio:!1,offset:0,extra:new Uint8Array(0),struct:[{bytes:4,name:"device_feature_select",read:()=>this.device_feature_select,write:b=>{this.device_feature_select=b}},{bytes:4,name:"device_feature",read:()=>this.device_feature[this.device_feature_select]||0,write:b=>{}},{bytes:4,name:"driver_feature_select",read:()=>this.driver_feature_select,write:b=>{this.driver_feature_select= b}},{bytes:4,name:"driver_feature",read:()=>this.driver_feature[this.driver_feature_select]||0,write:b=>{const c=this.device_feature[this.driver_feature_select];this.driver_feature_select{dbg_log("No msi-x capability supported.",LOG_VIRTIO);return 65535},write:b=>{dbg_log("No msi-x capability supported.",LOG_VIRTIO)}},{bytes:2,name:"num_queues", read:()=>this.queues.length,write:b=>{}},{bytes:1,name:"device_status",read:()=>this.device_status,write:b=>{0===b?(dbg_log("Reset device<"+this.name+">",LOG_VIRTIO),this.reset()):b&VIRTIO_STATUS_FAILED?dbg_log("Warning: Device<"+this.name+"> status failed",LOG_VIRTIO):dbg_log("Device<"+this.name+"> status: "+(b&VIRTIO_STATUS_ACKNOWLEDGE?"ACKNOWLEDGE ":"")+(b&VIRTIO_STATUS_DRIVER?"DRIVER ":"")+(b&VIRTIO_STATUS_DRIVER_OK?"DRIVER_OK":"")+(b&VIRTIO_STATUS_FEATURES_OK?"FEATURES_OK ":"")+(b&VIRTIO_STATUS_DEVICE_NEEDS_RESET? "DEVICE_NEEDS_RESET":""),LOG_VIRTIO);b&~this.device_status&VIRTIO_STATUS_DRIVER_OK&&this.device_status&VIRTIO_STATUS_DEVICE_NEEDS_RESET&&this.notify_config_changes();this.features_ok||(DEBUG&&b&VIRTIO_STATUS_FEATURES_OK&&dbg_log("Removing FEATURES_OK",LOG_VIRTIO),b&=~VIRTIO_STATUS_FEATURES_OK);this.device_status=b;if(b&~this.device_status&VIRTIO_STATUS_DRIVER_OK)a.on_driver_ok()}},{bytes:1,name:"config_generation",read:()=>this.config_generation,write:b=>{}},{bytes:2,name:"queue_select",read:()=> this.queue_select,write:b=>{this.queue_select=b;this.queue_selectthis.queue_selected?this.queue_selected.size:0,write:b=>{this.queue_selected&&(b&b-1&&(dbg_log("Warning: dev<"+this.name+"> Given queue size was not a power of 2. Rounding up to next power of 2.",LOG_VIRTIO),b=1<this.queue_selected.size_supported&&(dbg_log("Warning: dev<"+ this.name+"> Trying to set queue size greater than supported. Clamping to supported size.",LOG_VIRTIO),b=this.queue_selected.size_supported),this.queue_selected.set_size(b))}},{bytes:2,name:"queue_msix_vector",read:()=>{dbg_log("No msi-x capability supported.",LOG_VIRTIO);return 65535},write:b=>{dbg_log("No msi-x capability supported.",LOG_VIRTIO)}},{bytes:2,name:"queue_enable",read:()=>this.queue_selected?this.queue_selected.enabled|0:0,write:b=>{this.queue_selected&&(1===b?this.queue_selected.is_configured()? this.queue_selected.enable():dbg_log("Driver bug: tried enabling unconfigured queue",LOG_VIRTIO):0===b&&dbg_log("Driver bug: tried writing 0 to queue_enable",LOG_VIRTIO))}},{bytes:2,name:"queue_notify_off",read:()=>this.queue_selected?this.queue_selected.notify_offset:0,write:b=>{}},{bytes:4,name:"queue_desc (low dword)",read:()=>this.queue_selected?this.queue_selected.desc_addr:0,write:b=>{this.queue_selected&&(this.queue_selected.desc_addr=b)}},{bytes:4,name:"queue_desc (high dword)",read:()=>0, write:b=>{dbg_log("Warning: High dword of 64 bit queue_desc ignored",LOG_VIRTIO)}},{bytes:4,name:"queue_avail (low dword)",read:()=>this.queue_selected?this.queue_selected.avail_addr:0,write:b=>{this.queue_selected&&(this.queue_selected.avail_addr=b)}},{bytes:4,name:"queue_avail (high dword)",read:()=>0,write:b=>{dbg_log("Warning: High dword of 64 bit queue_avail ignored",LOG_VIRTIO)}},{bytes:4,name:"queue_used (low dword)",read:()=>this.queue_selected?this.queue_selected.used_addr:0,write:b=>{this.queue_selected&& (this.queue_selected.used_addr=b)}},{bytes:4,name:"queue_used (high dword)",read:()=>0,write:b=>{dbg_log("Warning: High dword of 64 bit queue_used ignored",LOG_VIRTIO)}}]}}; VirtIO.prototype.create_notification_capability=function(a){const b=[];let c;a.single_handler?(dbg_assert(1===a.handlers.length,"VirtIO device<"+this.name+"> too many notify handlers specified: expected single handler"),c=0):c=2;for(const [d,e]of a.handlers.entries())b.push({bytes:2,name:"notify"+d,read:()=>65535,write:e||(f=>{})});return{type:VIRTIO_PCI_CAP_NOTIFY_CFG,bar:1,port:a.initial_port,use_mmio:!1,offset:0,extra:new Uint8Array([c&255,c>>8&255,c>>16&255,c>>24]),struct:b}}; VirtIO.prototype.create_isr_capability=function(a){return{type:VIRTIO_PCI_CAP_ISR_CFG,bar:2,port:a.initial_port,use_mmio:!1,offset:0,extra:new Uint8Array(0),struct:[{bytes:1,name:"isr_status",read:()=>{const b=this.isr_status;this.lower_irq();return b},write:b=>{}}]}}; VirtIO.prototype.create_device_specific_capability=function(a){dbg_assert(~a.offset&3,"VirtIO device<"+this.name+"> device specific cap offset must be 4-byte aligned");return{type:VIRTIO_PCI_CAP_DEVICE_CFG,bar:3,port:a.initial_port,use_mmio:!1,offset:0,extra:new Uint8Array(0),struct:a.struct}}; VirtIO.prototype.init_capabilities=function(a){let b=this.pci_space[52]=64;var c=b;for(const e of a){a=VIRTIO_PCI_CAP_LENGTH+e.extra.length;c=b;b=c+a;dbg_assert(256>=b,"VirtIO device<"+this.name+"> can't fit all capabilities into 256byte configspace");dbg_assert(0<=e.bar&&6>e.bar,"VirtIO device<"+this.name+"> capability invalid bar number");var d=e.struct.reduce((f,k)=>f+k.bytes,0);d+=e.offset;d=16>d?16:1< capability port should be aligned to pci bar size"); this.pci_bars[e.bar]={size:d};this.pci_space[c]=VIRTIO_PCI_CAP_VENDOR;this.pci_space[c+1]=b;this.pci_space[c+2]=a;this.pci_space[c+3]=e.type;this.pci_space[c+4]=e.bar;this.pci_space[c+5]=0;this.pci_space[c+6]=0;this.pci_space[c+7]=0;this.pci_space[c+8]=e.offset&255;this.pci_space[c+9]=e.offset>>>8&255;this.pci_space[c+10]=e.offset>>>16&255;this.pci_space[c+11]=e.offset>>>24;this.pci_space[c+12]=d&255;this.pci_space[c+13]=d>>>8&255;this.pci_space[c+14]=d>>>16&255;this.pci_space[c+15]=d>>>24;for(const [f, k]of e.extra.entries())this.pci_space[c+16+f]=k;c=16+4*e.bar;this.pci_space[c]=e.port&254|!e.use_mmio;this.pci_space[c+1]=e.port>>>8&255;this.pci_space[c+2]=e.port>>>16&255;this.pci_space[c+3]=e.port>>>24&255;c=e.port+e.offset;for(const f of e.struct){let k=f.read;a=f.write;DEBUG&&(k=()=>{const g=f.read();dbg_log("Device<"+this.name+"> cap["+e.type+"] read["+f.name+"] => "+h(g,8*f.bytes),LOG_VIRTIO);return g},a=g=>{dbg_log("Device<"+this.name+"> cap["+e.type+"] write["+f.name+"] <= "+h(g,8*f.bytes), LOG_VIRTIO);f.write(g)});if(e.use_mmio)dbg_assert(!1,"VirtIO device <"+this.name+"> mmio capability not implemented.");else{d=function(l){dbg_log("Warning: 8-bit read from 16-bit virtio port",LOG_VIRTIO);return k(l&-2)>>((l&1)<<3)&255};const g=function(l){dbg_log("Warning: 8-bit read from 32-bit virtio port",LOG_VIRTIO);return k(l&-4)>>((l&3)<<3)&255};switch(f.bytes){case 4:this.cpu.io.register_read(c,this,g,void 0,k);this.cpu.io.register_write(c,this,void 0,void 0,a);break;case 2:this.cpu.io.register_read(c, this,d,k);this.cpu.io.register_write(c,this,void 0,a);break;case 1:this.cpu.io.register_read(c,this,k);this.cpu.io.register_write(c,this,a);break;default:dbg_assert(!1,"VirtIO device <"+this.name+"> invalid capability field width of "+f.bytes+" bytes")}}c+=f.bytes}}c=VIRTIO_PCI_CAP_LENGTH+4;dbg_assert(256>=b+c,"VirtIO device<"+this.name+"> can't fit all capabilities into 256byte configspace");this.pci_space[b]=VIRTIO_PCI_CAP_VENDOR;this.pci_space[b+1]=0;this.pci_space[b+2]=c;this.pci_space[b+3]=VIRTIO_PCI_CAP_PCI_CFG; this.pci_space[b+4]=0;this.pci_space[b+5]=0;this.pci_space[b+6]=0;this.pci_space[b+7]=0;this.pci_space[b+8]=0;this.pci_space[b+9]=0;this.pci_space[b+10]=0;this.pci_space[b+11]=0;this.pci_space[b+12]=0;this.pci_space[b+13]=0;this.pci_space[b+14]=0;this.pci_space[b+15]=0;this.pci_space[b+16]=0;this.pci_space[b+17]=0;this.pci_space[b+18]=0;this.pci_space[b+19]=0}; VirtIO.prototype.get_state=function(){let a=[];a[0]=this.device_feature_select;a[1]=this.driver_feature_select;a[2]=this.device_feature;a[3]=this.driver_feature;a[4]=this.features_ok;a[5]=this.device_status;a[6]=this.config_has_changed;a[7]=this.config_generation;a[8]=this.isr_status;a[9]=this.queue_select;return a=a.concat(this.queues)}; VirtIO.prototype.set_state=function(a){this.device_feature_select=a[0];this.driver_feature_select=a[1];this.device_feature=a[2];this.driver_feature=a[3];this.features_ok=a[4];this.device_status=a[5];this.config_has_changed=a[6];this.config_generation=a[7];this.isr_status=a[8];this.queue_select=a[9];let b=0;for(let c of a.slice(10))this.queues[b].set_state(c),b++;this.queue_selected=this.queues[this.queue_select]||null}; VirtIO.prototype.reset=function(){this.driver_feature_select=this.device_feature_select=0;this.driver_feature.set(this.device_feature);this.features_ok=!0;this.queue_select=this.device_status=0;this.queue_selected=this.queues[0];for(const a of this.queues)a.reset();this.config_has_changed=!1;this.config_generation=0;this.lower_irq()}; VirtIO.prototype.notify_config_changes=function(){this.config_has_changed=!0;this.device_status&VIRTIO_STATUS_DRIVER_OK?this.raise_irq(VIRTIO_ISR_DEVICE_CFG):dbg_assert(!1,"VirtIO device<"+this.name+"> attempted to notify driver before DRIVER_OK")};VirtIO.prototype.update_config_generation=function(){this.config_has_changed&&(this.config_generation++,this.config_generation&=255,this.config_has_changed=!1)}; VirtIO.prototype.is_feature_negotiated=function(a){return 0<(this.driver_feature[a>>>5]&1<<(a&31))};VirtIO.prototype.needs_reset=function(){dbg_log("Device<"+this.name+"> experienced error - requires reset",LOG_VIRTIO);this.device_status|=VIRTIO_STATUS_DEVICE_NEEDS_RESET;this.device_status&VIRTIO_STATUS_DRIVER_OK&&this.notify_config_changes()};VirtIO.prototype.raise_irq=function(a){dbg_log("Raise irq "+h(a),LOG_VIRTIO);this.isr_status|=a;this.pci.raise_irq(this.pci_id)}; VirtIO.prototype.lower_irq=function(){dbg_log("Lower irq ",LOG_VIRTIO);this.isr_status=0;this.pci.lower_irq(this.pci_id)};function VirtQueue(a,b,c){this.cpu=a;this.virtio=b;this.size_supported=this.size=c.size_supported;this.mask=this.size-1;this.enabled=!1;this.notify_offset=c.notify_offset;this.num_staged_replies=this.used_addr=this.avail_last_idx=this.avail_addr=this.desc_addr=0;this.reset()} VirtQueue.prototype.get_state=function(){const a=[];a[0]=this.size;a[1]=this.size_supported;a[2]=this.enabled;a[3]=this.notify_offset;a[4]=this.desc_addr;a[5]=this.avail_addr;a[6]=this.avail_last_idx;a[7]=this.used_addr;a[8]=this.num_staged_replies;return a}; VirtQueue.prototype.set_state=function(a){this.size=a[0];this.size_supported=a[1];this.enabled=a[2];this.notify_offset=a[3];this.desc_addr=a[4];this.avail_addr=a[5];this.avail_last_idx=a[6];this.used_addr=a[7];this.num_staged_replies=a[8];this.mask=this.size-1};VirtQueue.prototype.reset=function(){this.enabled=!1;this.num_staged_replies=this.used_addr=this.avail_last_idx=this.avail_addr=this.desc_addr=0;this.set_size(this.size_supported)}; VirtQueue.prototype.is_configured=function(){return this.desc_addr&&this.avail_addr&&this.used_addr};VirtQueue.prototype.enable=function(){dbg_assert(this.is_configured(),"VirtQueue must be configured before enabled");this.enabled=!0};VirtQueue.prototype.set_size=function(a){dbg_assert(0===(a&a-1),"VirtQueue size must be power of 2 or zero");dbg_assert(a<=this.size_supported,"VirtQueue size must be within supported size");this.size=a;this.mask=a-1}; VirtQueue.prototype.count_requests=function(){dbg_assert(this.avail_addr,"VirtQueue addresses must be configured before use");return this.avail_get_idx()-this.avail_last_idx&this.mask};VirtQueue.prototype.has_request=function(){dbg_assert(this.avail_addr,"VirtQueue addresses must be configured before use");return(this.avail_get_idx()&this.mask)!==this.avail_last_idx}; VirtQueue.prototype.pop_request=function(){dbg_assert(this.avail_addr,"VirtQueue addresses must be configured before use");dbg_assert(this.has_request(),"VirtQueue must not pop nonexistent request");var a=this.avail_get_entry(this.avail_last_idx);dbg_log("Pop request: avail_last_idx="+this.avail_last_idx+" desc_idx="+a,LOG_VIRTIO);a=new VirtQueueBufferChain(this,a);this.avail_last_idx=this.avail_last_idx+1&this.mask;return a}; VirtQueue.prototype.push_reply=function(a){dbg_assert(this.used_addr,"VirtQueue addresses must be configured before use");dbg_assert(this.num_staged_repliese){dbg_log("Driver bug: descriptor chain cycle detected",LOG_VIRTIO);break}if(g.flags&VIRTQ_DESC_F_NEXT)b=g.next;else break}}while(1);dbg_log("Descriptor chain end >>>",LOG_VIRTIO)} VirtQueueBufferChain.prototype.get_next_blob=function(a){let b=0,c=a.length;for(;c;){if(this.read_buffer_idx===this.read_buffers.length){dbg_log("Device<"+this.virtio.name+"> Read more than device-readable buffers has",LOG_VIRTIO);break}var d=this.read_buffers[this.read_buffer_idx];const e=d.addr_low+this.read_buffer_offset;d=d.len-this.read_buffer_offset;d>c?(d=c,this.read_buffer_offset+=c):(this.read_buffer_idx++,this.read_buffer_offset=0);a.set(this.cpu.read_blob(e,d),b);b+=d;c-=d}return b}; VirtQueueBufferChain.prototype.set_next_blob=function(a){let b=0,c=a.length;for(;c;){if(this.write_buffer_idx===this.write_buffers.length){dbg_log("Device<"+this.virtio.name+"> Write more than device-writable capacity",LOG_VIRTIO);break}var d=this.write_buffers[this.write_buffer_idx];const e=d.addr_low+this.write_buffer_offset;d=d.len-this.write_buffer_offset;d>c?(d=c,this.write_buffer_offset+=c):(this.write_buffer_idx++,this.write_buffer_offset=0);this.cpu.write_blob(a.subarray(b,b+d),e);b+=d;c-= d}this.length_written+=b;return b};var Bus={};function BusConnector(){this.listeners={};this.pair=void 0}BusConnector.prototype.register=function(a,b,c){var d=this.listeners[a];void 0===d&&(d=this.listeners[a]=[]);d.push({fn:b,this_value:c})};BusConnector.prototype.unregister=function(a,b){var c=this.listeners[a];void 0!==c&&(this.listeners[a]=c.filter(function(d){return d.fn!==b}))}; BusConnector.prototype.send=function(a,b,c){if(this.pair&&(a=this.pair.listeners[a],void 0!==a))for(c=0;cc))return;e=new Date;e=v86util.pad0(e.getHours(),2)+":"+v86util.pad0(e.getMinutes(),2)+":"+v86util.pad0(e.getSeconds(),2)+"+"+v86util.pad0(e.getMilliseconds(),3)+" ";c&&(1===c?do_the_log(e+b):do_the_log("Previous message repeated "+c+" times"),c=0);do_the_log(e+d); b=d}}}();function dbg_trace(a){DEBUG&&dbg_log(Error().stack,a)}function dbg_assert(a,b,c){DEBUG&&(a||dbg_assert_failed(b))}function dbg_assert_failed(a){debugger;console.trace();if(a)throw"Assert failed: "+a;throw"Assert failed";};var CPU_LOG_VERBOSE=!1; function CPU(a,b){this.wm=b;this.wasm_patch();this.create_jit_imports();this.wasm_memory=b=this.wm.exports.memory;this.memory_size=v86util.view(Uint32Array,b,812,1);this.mem8=new Uint8Array(0);this.mem32s=new Int32Array(this.mem8.buffer);this.segment_is_null=v86util.view(Uint8Array,b,724,8);this.segment_offsets=v86util.view(Int32Array,b,736,8);this.segment_limits=v86util.view(Uint32Array,b,768,8);this.protected_mode=v86util.view(Int32Array,b,800,1);this.idtr_size=v86util.view(Int32Array,b,564,1); this.idtr_offset=v86util.view(Int32Array,b,568,1);this.gdtr_size=v86util.view(Int32Array,b,572,1);this.gdtr_offset=v86util.view(Int32Array,b,576,1);this.tss_size_32=v86util.view(Int32Array,b,1128,1);this.page_fault=v86util.view(Uint32Array,b,540,8);this.cr=v86util.view(Int32Array,b,580,8);this.cpl=v86util.view(Uint8Array,b,612,1);this.is_32=v86util.view(Int32Array,b,804,1);this.stack_size_32=v86util.view(Int32Array,b,808,1);this.in_hlt=v86util.view(Uint8Array,b,616,1);this.last_virt_eip=v86util.view(Int32Array, b,620,1);this.eip_phys=v86util.view(Int32Array,b,624,1);this.sysenter_cs=v86util.view(Int32Array,b,636,1);this.sysenter_esp=v86util.view(Int32Array,b,640,1);this.sysenter_eip=v86util.view(Int32Array,b,644,1);this.prefixes=v86util.view(Int32Array,b,648,1);this.flags=v86util.view(Int32Array,b,120,1);this.flags_changed=v86util.view(Int32Array,b,116,1);this.last_op1=v86util.view(Int32Array,b,96,1);this.last_op_size=v86util.view(Int32Array,b,104,1);this.last_result=v86util.view(Int32Array,b,112,1);this.current_tsc= v86util.view(Uint32Array,b,960,2);this.devices={};this.instruction_pointer=v86util.view(Int32Array,b,556,1);this.previous_ip=v86util.view(Int32Array,b,560,1);this.apic_enabled=v86util.view(Uint8Array,b,548,1);this.acpi_enabled=v86util.view(Uint8Array,b,552,1);this.memory_map_read8=[];this.memory_map_write8=[];this.memory_map_read32=[];this.memory_map_write32=[];this.bios={main:null,vga:null};this.instruction_counter=v86util.view(Uint32Array,b,664,1);this.reg32=v86util.view(Int32Array,b,64,8);this.fpu_st= v86util.view(Int32Array,b,1152,32);this.fpu_stack_empty=v86util.view(Uint8Array,b,816,1);this.fpu_stack_empty[0]=255;this.fpu_stack_ptr=v86util.view(Uint8Array,b,1032,1);this.fpu_stack_ptr[0]=0;this.fpu_control_word=v86util.view(Uint16Array,b,1036,1);this.fpu_control_word[0]=895;this.fpu_status_word=v86util.view(Uint16Array,b,1040,1);this.fpu_status_word[0]=0;this.fpu_ip=v86util.view(Int32Array,b,1048,1);this.fpu_ip[0]=0;this.fpu_ip_selector=v86util.view(Int32Array,b,1052,1);this.fpu_ip_selector[0]= 0;this.fpu_opcode=v86util.view(Int32Array,b,1044,1);this.fpu_opcode[0]=0;this.fpu_dp=v86util.view(Int32Array,b,1056,1);this.fpu_dp[0]=0;this.fpu_dp_selector=v86util.view(Int32Array,b,1060,1);this.fpu_dp_selector[0]=0;this.reg_xmm32s=v86util.view(Int32Array,b,832,32);this.mxcsr=v86util.view(Int32Array,b,824,1);this.sreg=v86util.view(Uint16Array,b,668,8);this.dreg=v86util.view(Int32Array,b,684,8);this.fw_value=[];this.fw_pointer=0;this.option_roms=[];this.io=void 0;this.bus=a;this.set_tsc(0,0);this.debug_init()} CPU.prototype.clear_opstats=function(){(new Uint8Array(this.wasm_memory.buffer,32768,131072)).fill(0);this.wm.exports.profiler_init()};CPU.prototype.create_jit_imports=function(){const a=Object.create(null);a.m=this.wm.exports.memory;for(let b of Object.keys(this.wm.exports))b.startsWith("_")||b.startsWith("ZSTD")||b.startsWith("zstd")||b.endsWith("_js")||(a[b]=this.wm.exports[b]);this.jit_imports=a}; CPU.prototype.wasm_patch=function(){const a=c=>this.wm.exports[c],b=c=>{const d=a(c);console.assert(d,"Missing import: "+c);return d};this.getiopl=b("getiopl");this.vm86_mode=b("vm86_mode");this.get_eflags=b("get_eflags");this.get_eflags_no_arith=b("get_eflags_no_arith");this.update_eflags=b("update_eflags");this.trigger_gp=b("trigger_gp");this.trigger_np=b("trigger_np");this.trigger_ss=b("trigger_ss");this.switch_cs_real_mode=b("switch_cs_real_mode");this.pic_call_irq=b("pic_call_irq");this.do_many_cycles_native= b("do_many_cycles_native");this.cycle_internal=b("cycle_internal");this.read8=b("read8");this.read16=b("read16");this.read32s=b("read32s");this.write8=b("write8");this.write16=b("write16");this.write32=b("write32");this.in_mapped_range=b("in_mapped_range");this.push16=b("push16_js");this.push32=b("push32_js");this.set_stack_reg=b("set_stack_reg");this.fpu_load_tag_word=b("fpu_load_tag_word");this.fpu_load_status_word=b("fpu_load_status_word");this.translate_address_system_read=b("translate_address_system_read_js"); this.translate_address_system_write=b("translate_address_system_write_js");this.get_seg_cs=b("get_seg_cs");this.adjust_stack_reg=b("adjust_stack_reg");this.get_real_eip=b("get_real_eip");this.get_stack_pointer=b("get_stack_pointer");this.writable_or_pagefault=b("writable_or_pagefault_js");this.safe_write32=b("safe_write32_js");this.safe_read32s=b("safe_read32s_js");this.safe_write16=b("safe_write16_js");this.safe_read16=b("safe_read16_js");this.clear_tlb=b("clear_tlb");this.full_clear_tlb=b("full_clear_tlb"); this.set_tsc=b("set_tsc");this.store_current_tsc=b("store_current_tsc");this.fpu_get_sti_f64=b("fpu_get_sti_f64");DEBUG&&(this.jit_force_generate_unsafe=a("jit_force_generate_unsafe"));this.jit_clear_cache=b("jit_clear_cache_js");this.jit_dirty_cache=b("jit_dirty_cache");this.codegen_finalize_finished=b("codegen_finalize_finished");this.allocate_memory=b("allocate_memory");this.zero_memory=b("zero_memory");this.zstd_create_ctx=b("zstd_create_ctx");this.zstd_get_src_ptr=b("zstd_get_src_ptr");this.zstd_free_ctx= b("zstd_free_ctx");this.zstd_read=b("zstd_read");this.zstd_read_free=b("zstd_read_free")};CPU.prototype.jit_force_generate=function(a){this.jit_force_generate_unsafe?this.jit_force_generate_unsafe(a):dbg_assert(!1,"Not supported in this wasm build: jit_force_generate_unsafe")};CPU.prototype.jit_clear_func=function(a){dbg_assert(0<=a&&a>2)};goog.exportProperty(CPU.prototype,"create_memory",CPU.prototype.create_memory); CPU.prototype.init=function(a,b){"number"===typeof a.log_level&&(LOG_LEVEL=a.log_level);this.create_memory("number"===typeof a.memory_size?a.memory_size:67108864);this.acpi_enabled[0]=+a.acpi;this.reset();var c=new IO(this);this.io=c;this.bios.main=a.bios;this.bios.vga=a.vga_bios;this.load_bios();if(a.bzimage){const {option_rom:e}=load_kernel(this.mem8,a.bzimage,a.initrd,a.cmdline||"");e&&this.option_roms.push(e)}c.register_read(179,this,function(){dbg_log("port 0xB3 read");return 0});var d=0;c.register_read(146, this,function(){return d});c.register_write(146,this,function(e){d=e});c.register_read(1297,this,function(){if(this.fw_pointer>8|l<<8&65280}function g(l){return l<<24|l<<8&16711680|l>>8&65280|l>>>24}dbg_log("bios config port, index="+h(e));this.fw_pointer= 0;if(e===FW_CFG_SIGNATURE)this.fw_value=f(FW_CFG_SIGNATURE_QEMU);else if(e===FW_CFG_ID)this.fw_value=f(0);else if(e===FW_CFG_RAM_SIZE)this.fw_value=f(this.memory_size[0]);else if(e===FW_CFG_NB_CPUS)this.fw_value=f(1);else if(e===FW_CFG_MAX_CPUS)this.fw_value=f(1);else if(e===FW_CFG_NUMA)this.fw_value=new Uint8Array(16);else if(e===FW_CFG_FILE_DIR){e=new Int32Array(4+64*this.option_roms.length);const l=new Uint8Array(e.buffer);e[0]=g(this.option_roms.length);for(let m=0;mFW_CFG_FILE_START+m);e[v+0>>2]=g(r.length);e[v+4>>2]=k(FW_CFG_FILE_START+m);dbg_assert(56>n.length);for(let q=0;q=FW_CFG_CUSTOM_START&&e=FW_CFG_FILE_START&&e-FW_CFG_FILE_STARTa.byteLength){var b=new Int32Array(2048);(new Uint8Array(b.buffer)).set(new Uint8Array(a))}else b=new Int32Array(a,0,2048);for(var c=0;8192>c;c+=4)if(464367618===b[c>>2]){var d=b[c+4>>2];if(464367618+d+b[c+8>>2]|0)dbg_log("Multiboot checksum check failed",LOG_CPU);else{dbg_log("Multiboot magic found, flags: "+h(d>>>0,8),LOG_CPU);dbg_assert(0===(d&-65537),"TODO");this.reg32[reg_eax]= 732803074;this.reg32[reg_ebx]=31744;this.write32(31744,0);this.cr[0]=1;this.protected_mode[0]=1;this.flags[0]=flags_default;this.update_cs_size(!0);this.stack_size_32[0]=1;for(var e=0;6>e;e++)this.segment_is_null[e]=0,this.segment_offsets[e]=0,this.segment_limits[e]=4294967295,this.sreg[e]=45058;if(d&65536){dbg_log("Multiboot specifies its own address table",LOG_CPU);e=b[c+12>>2];var f=b[c+16>>2];d=b[c+20>>2];var k=b[c+24>>2];b=b[c+28>>2];dbg_log("header="+h(e,8)+" load="+h(f,8)+" load_end="+h(d, 8)+" bss_end="+h(k,8)+" entry="+h(b,8));dbg_assert(f<=e);c-=e-f;0===d?d=void 0:(dbg_assert(d>=f),d-=f);a=new Uint8Array(a,c,d);this.write_blob(a,f);this.instruction_pointer[0]=this.get_seg_cs()+b|0}else if(1179403647===b[0]){dbg_log("Multiboot image is in elf format",LOG_CPU);c=read_elf(a);this.instruction_pointer[0]=this.get_seg_cs()+c.header.entry|0;for(f of c.program_headers)0!==f.type&&(1===f.type?(dbg_assert(f.paddr===f.vaddr),dbg_assert(f.filesz<=f.memsz),f.paddr+f.memsz=g;g++)this.io.register_write(8192+g,this,function(l){dbg_log("kvm-unit-test: Set irq "+h(g)+" to "+h(l,2));l?this.device_raise_irq(g):this.device_lower_irq(g)});dbg_log("Starting multiboot kernel at:",LOG_CPU);this.debug.dump_state();this.debug.dump_regs();break}}}; CPU.prototype.fill_cmos=function(a,b){var c=b.boot_order||531;a.cmos_write(CMOS_BIOS_BOOTFLAG1,1|c>>4&240);a.cmos_write(CMOS_BIOS_BOOTFLAG2,c&255);a.cmos_write(CMOS_MEM_BASE_LOW,128);a.cmos_write(CMOS_MEM_BASE_HIGH,2);c=0;1048576<=this.memory_size[0]&&(c=this.memory_size[0]-1048576>>10,c=Math.min(c,65535));a.cmos_write(CMOS_MEM_OLD_EXT_LOW,c&255);a.cmos_write(CMOS_MEM_OLD_EXT_HIGH,c>>8&255);a.cmos_write(CMOS_MEM_EXTMEM_LOW,c&255);a.cmos_write(CMOS_MEM_EXTMEM_HIGH,c>>8&255);c=0;16777216<=this.memory_size[0]&& (c=this.memory_size[0]-16777216>>16,c=Math.min(c,65535));a.cmos_write(CMOS_MEM_EXTMEM2_LOW,c&255);a.cmos_write(CMOS_MEM_EXTMEM2_HIGH,c>>8&255);a.cmos_write(CMOS_MEM_HIGHMEM_LOW,0);a.cmos_write(CMOS_MEM_HIGHMEM_MID,0);a.cmos_write(CMOS_MEM_HIGHMEM_HIGH,0);a.cmos_write(CMOS_EQUIPMENT_INFO,47);a.cmos_write(CMOS_BIOS_SMP_COUNT,0);b.fastboot&&a.cmos_write(63,1)}; CPU.prototype.load_bios=function(){var a=this.bios.main,b=this.bios.vga;if(a){var c=new Uint8Array(a);this.write_blob(c,1048576-a.byteLength);if(b){var d=new Uint8Array(b);this.write_blob(d,786432);this.io.mmap_register(4272947200,1048576,function(e){e=e-4272947200|0;return e>>=0;e>>>=0;dbg_assert(0<=a&&a{k=k.instance.exports.f;this.codegen_finalize_finished(a,b,c);this.wm.wasm_table.set(a+WASM_TABLE_OFFSET,k);this.test_hook_did_finalize_wasm&& this.test_hook_did_finalize_wasm(f)});DEBUG&&d.catch(k=>{console.log(k);debugger;throw k;})}; CPU.prototype.log_uncompiled_code=function(a,b){if(DEBUG&&DUMP_UNCOMPILED_ASSEMBLY&&100>(seen_code_uncompiled[a]||0)){seen_code_uncompiled[a]=(seen_code_uncompiled[a]||0)+1;b+=8;(a^b)&-4096&&(dbg_log("truncated disassembly start="+h(a>>>0)+" end="+h(b>>>0)),b=(a|4095)+1);b=a);const c=new Uint8Array(b-a);for(let d=a;d>2)+7*f;const k=c[e+0],g=c[e+1];e=c[e+6]&65280;const l=new Uint8Array(g-k);for(let m=k;md.effective_limit)throw this.debug.unimpl("#NP handler"); var k=this.segment_offsets[reg_tr],g=this.get_eflags();f&&(g&=~flag_nt);if(this.writable_or_pagefault(k,102)){this.safe_write32(k+TSR_EIP,this.get_real_eip());this.safe_write32(k+TSR_EFLAGS,g);this.safe_write32(k+TSR_EAX,this.reg32[reg_eax]);this.safe_write32(k+TSR_ECX,this.reg32[reg_ecx]);this.safe_write32(k+TSR_EDX,this.reg32[reg_edx]);this.safe_write32(k+TSR_EBX,this.reg32[reg_ebx]);this.safe_write32(k+TSR_ESP,this.reg32[reg_esp]);this.safe_write32(k+TSR_EBP,this.reg32[reg_ebp]);this.safe_write32(k+ TSR_ESI,this.reg32[reg_esi]);this.safe_write32(k+TSR_EDI,this.reg32[reg_edi]);this.safe_write32(k+TSR_ES,this.sreg[reg_es]);this.safe_write32(k+TSR_CS,this.sreg[reg_cs]);this.safe_write32(k+TSR_SS,this.sreg[reg_ss]);this.safe_write32(k+TSR_DS,this.sreg[reg_ds]);this.safe_write32(k+TSR_FS,this.sreg[reg_fs]);this.safe_write32(k+TSR_GS,this.sreg[reg_gs]);this.write8(d.table_offset+5|0,this.read8(d.table_offset+5|0)|2);f=d.base;dbg_assert(!e,"unimplemented");this.safe_write16(f+TSR_BACKLINK,this.sreg[reg_tr]); g=this.safe_read32s(f+TSR_CR3);this.flags[0]&=~flag_vm;var l=this.safe_read32s(f+TSR_EIP),m=this.safe_read16(f+TSR_CS),n=this.lookup_segment_selector(m);if(n.is_null)throw dbg_log("null cs",LOG_CPU),this.debug.unimpl("#TS handler");if(!n.is_valid)throw dbg_log("invalid cs: "+h(a),LOG_CPU),this.debug.unimpl("#TS handler");if(n.is_system)throw this.debug.unimpl("#TS handler");if(!n.is_executable)throw this.debug.unimpl("#TS handler");if(n.dc_bit&&n.dpl>n.rpl)throw dbg_log("cs conforming and dpl > rpl: "+ h(a),LOG_CPU),this.debug.unimpl("#TS handler");if(!n.dc_bit&&n.dpl!==n.rpl)throw dbg_log("cs non-conforming and dpl != rpl: "+h(a),LOG_CPU),this.debug.unimpl("#TS handler");if(!n.is_present)throw dbg_log("#NP for loading not-present in cs sel="+h(a,4),LOG_CPU),this.debug.unimpl("#TS handler");this.segment_is_null[reg_cs]=0;this.segment_limits[reg_cs]=n.effective_limit;this.segment_offsets[reg_cs]=n.base;this.sreg[reg_cs]=m;this.cpl=n.dpl;this.cpl_changed();dbg_assert((this.sreg[reg_cs]&3)===this.cpl); dbg_assert(l>>>0<=n.effective_limit,"todo: #gp");this.update_cs_size(n.size);m=this.safe_read32s(f+TSR_EFLAGS);this.safe_write32(k+TSR_BACKLINK,a);m|=flag_nt;if(m&flag_vm)throw this.debug.unimpl("task switch to VM mode");this.update_eflags(m);this.flags[0]|=flag_nt;k=this.safe_read16(f+TSR_LDT);this.load_ldt(k);this.reg32[reg_eax]=this.safe_read32s(f+TSR_EAX);this.reg32[reg_ecx]=this.safe_read32s(f+TSR_ECX);this.reg32[reg_edx]=this.safe_read32s(f+TSR_EDX);this.reg32[reg_ebx]=this.safe_read32s(f+TSR_EBX); this.reg32[reg_esp]=this.safe_read32s(f+TSR_ESP);this.reg32[reg_ebp]=this.safe_read32s(f+TSR_EBP);this.reg32[reg_esi]=this.safe_read32s(f+TSR_ESI);this.reg32[reg_edi]=this.safe_read32s(f+TSR_EDI);this.switch_seg(reg_es,this.safe_read16(f+TSR_ES))&&this.switch_seg(reg_ss,this.safe_read16(f+TSR_SS))&&this.switch_seg(reg_ds,this.safe_read16(f+TSR_DS))&&this.switch_seg(reg_fs,this.safe_read16(f+TSR_FS))&&this.switch_seg(reg_gs,this.safe_read16(f+TSR_GS))||dbg_assert(!1);this.instruction_pointer[0]=this.get_seg_cs()+ l|0;this.segment_offsets[reg_tr]=d.base;this.segment_limits[reg_tr]=d.effective_limit;this.sreg[reg_tr]=a;this.cr[3]=g;dbg_assert(0===(this.cr[3]&4095));this.clear_tlb();this.cr[0]|=CR0_TS;!1!==b&&(e?this.push16(c&65535):this.push32(c))}};CPU.prototype.hlt_op=function(){this.cpl[0]?(dbg_log("#gp hlt with cpl != 0",LOG_CPU),this.trigger_gp(0)):(0===(this.get_eflags_no_arith()&flag_interrupt)&&this.bus.send("cpu-event-halt"),this.in_hlt[0]=1,this.hlt_loop())}; CPU.prototype.handle_irqs=function(){this.get_eflags_no_arith()&flag_interrupt&&this.pic_acknowledge()};CPU.prototype.pic_acknowledge=function(){dbg_assert(this.get_eflags_no_arith()&flag_interrupt);this.devices.pic&&this.devices.pic.acknowledge_irq();this.devices.apic&&this.devices.apic.acknowledge_irq()};CPU.prototype.device_raise_irq=function(a){dbg_assert(1===arguments.length);this.devices.pic&&this.devices.pic.set_irq(a);this.devices.ioapic&&this.devices.ioapic.set_irq(a)}; CPU.prototype.device_lower_irq=function(a){this.devices.pic&&this.devices.pic.clear_irq(a);this.devices.ioapic&&this.devices.ioapic.clear_irq(a)}; CPU.prototype.cpuid=function(){var a=0,b=0,c=0,d=0;const e=this.reg32[reg_eax];switch(e){case 0:a=22;d=1970169159;c=1231384169;b=1818588270;break;case 1:a=3939;d=67584;b=1082130432;VMWARE_HYPERVISOR_PORT&&(b|=-2147483648);c=125872441;this.acpi_enabled[0]&&(c|=512);break;case 2:a=1717260289;b=d=0;c=8024064;break;case 4:switch(this.reg32[reg_ecx]){case 0:a=289;d=29360191;b=63;c=1;break;case 1:a=290;d=29360191;b=63;c=1;break;case 2:a=323,d=96469055,b=4095,c=1}break;case 5:d=a=64;b=3;c=1319200;break; case 7:a=0;d=512;c=b=0;break;case -2147483648:a=5;break;case 1073741824:VMWARE_HYPERVISOR_PORT&&(d=1635208534,b=1297507698,c=1701994871);break;case 21:d=a=1;b=1E3*TSC_RATE;dbg_assert(b>>>0===b);break;case 22:a=Math.floor(TSC_RATE/1E3);d=Math.floor(TSC_RATE/1E3);b=10;dbg_assert(65536>a);dbg_assert(65536>d);dbg_assert(65536>b);break;default:dbg_log("cpuid: unimplemented eax: "+h(this.reg32[reg_eax]>>>0),LOG_CPU)}4===e?dbg_log("cpuid: eax="+h(this.reg32[reg_eax]>>>0,8)+" cl="+h(this.reg32[reg_ecx]&255, 2),LOG_CPU):0!==e&&2!==e&&-2147483648!==e&&dbg_log("cpuid: eax="+h(this.reg32[reg_eax]>>>0,8),LOG_CPU);this.reg32[reg_eax]=a;this.reg32[reg_ecx]=b;this.reg32[reg_edx]=c;this.reg32[reg_ebx]=d};CPU.prototype.update_cs_size=function(a){a=!!a;!!this.is_32[0]!==a&&(this.is_32[0]=+a)}; CPU.prototype.lookup_segment_selector=function(a){dbg_assert("number"===typeof a&&0<=a&&65536>a);var b=0===(a&4),c=a&-8;var d={rpl:a&3,from_gdt:b,is_null:!1,is_valid:!0,base:0,access:0,flags:0,type:0,dpl:0,is_system:!1,is_present:!1,is_executable:!1,rw_bit:!1,dc_bit:!1,size:!1,is_conforming_executable:!1,effective_limit:0,is_writable:!1,is_readable:!1,table_offset:0,raw0:0,raw1:0};if(b){var e=this.gdtr_offset[0];var f=this.gdtr_size[0]}else e=this.segment_offsets[reg_ldtr],f=this.segment_limits[reg_ldtr]; if(b&&0===c)return d.is_null=!0,d;if((a|7)>f)return dbg_log("Selector "+h(a,4)+" is outside of the "+(b?"g":"l")+"dt limits",LOG_CPU),d.is_valid=!1,d;e=e+c|0;this.cr[0]&CR0_PG&&(e=this.translate_address_system_read(e));d.table_offset=e;d.base=this.read16(e+2|0)|this.read8(e+4|0)<<16|this.read8(e+7|0)<<24;d.access=this.read8(e+5|0);d.flags=this.read8(e+6|0)>>4;d.raw0=this.read32s(e|0);d.raw1=this.read32s(e+4|0);d.type=d.access&15;d.dpl=d.access>>5&3;d.is_system=0===(d.access&16);d.is_present=128=== (d.access&128);d.is_executable=8===(d.access&8);d.rw_bit=2===(d.access&2);d.dc_bit=4===(d.access&4);d.is_conforming_executable=d.dc_bit&&d.is_executable;d.size=4===(d.flags&4);a=this.read16(e)|(this.read8(e+6|0)&15)<<16;d.effective_limit=d.flags&8?(a<<12|4095)>>>0:a;d.is_writable=d.rw_bit&&!d.is_executable;d.is_readable=d.rw_bit||!d.is_executable;return d}; CPU.prototype.switch_seg=function(a,b){dbg_assert(0<=a&&5>=a);dbg_assert("number"===typeof b&&65536>b&&0<=b);if(!this.protected_mode[0]||this.vm86_mode())return this.sreg[a]=b,this.segment_is_null[a]=0,this.segment_offsets[a]=b<<4,a===reg_ss&&(this.stack_size_32[0]=0),!0;var c=this.lookup_segment_selector(b);if(a===reg_ss){if(c.is_null)return dbg_log("#GP for loading 0 in SS sel="+h(b,4),LOG_CPU),dbg_trace(LOG_CPU),this.trigger_gp(0),!1;if(!c.is_valid||c.is_system||c.rpl!==this.cpl[0]||!c.is_writable|| c.dpl!==this.cpl[0])return dbg_log("#GP for loading invalid in SS sel="+h(b,4),LOG_CPU),dbg_trace(LOG_CPU),this.trigger_gp(b&-4),!1;if(!c.is_present)return dbg_log("#SS for loading non-present in SS sel="+h(b,4),LOG_CPU),dbg_trace(LOG_CPU),this.trigger_ss(b&-4),!1;this.stack_size_32[0]=c.size}else if(a===reg_cs)dbg_assert(!1);else{if(c.is_null)return this.sreg[a]=b,this.segment_is_null[a]=1,!0;if(!c.is_valid||c.is_system||!c.is_readable||!c.is_conforming_executable&&(c.rpl>c.dpl||this.cpl[0]>c.dpl))return dbg_log("#GP for loading invalid in seg "+ a+" sel="+h(b,4),LOG_CPU),this.debug.dump_state(),this.debug.dump_regs(),dbg_trace(LOG_CPU),this.trigger_gp(b&-4),!1;if(!c.is_present)return dbg_log("#NP for loading not-present in seg "+a+" sel="+h(b,4),LOG_CPU),dbg_trace(LOG_CPU),this.trigger_np(b&-4),!1}this.segment_is_null[a]=0;this.segment_limits[a]=c.effective_limit;this.segment_offsets[a]=c.base;this.sreg[a]=b;return!0}; CPU.prototype.load_tr=function(a){var b=this.lookup_segment_selector(a);dbg_assert(b.is_valid);if(!b.from_gdt)throw this.debug.unimpl("TR can only be loaded from GDT");if(b.is_null)throw dbg_log("#GP(0) | tried to load null selector (ltr)"),this.debug.unimpl("#GP handler");if(!b.is_system)throw dbg_log("#GP | ltr: not a system entry"),this.debug.unimpl("#GP handler (happens when running kvm-unit-test without ACPI)");if(9!==b.type&&1!==b.type)throw dbg_log("#GP | ltr: invalid type (type = "+h(b.type)+ ")"),this.debug.unimpl("#GP handler");if(!b.is_present)throw dbg_log("#NT | present bit not set (ltr)"),this.debug.unimpl("#NT handler");this.tss_size_32[0]=9===b.type;this.segment_offsets[reg_tr]=b.base;this.segment_limits[reg_tr]=b.effective_limit;this.sreg[reg_tr]=a;this.write8(b.table_offset+5|0,this.read8(b.table_offset+5|0)|2)}; CPU.prototype.load_ldt=function(a){var b=this.lookup_segment_selector(a);if(b.is_null)this.segment_offsets[reg_ldtr]=0,this.segment_limits[reg_ldtr]=0;else{dbg_assert(b.is_valid);if(!b.from_gdt)throw this.debug.unimpl("LDTR can only be loaded from GDT");if(!b.is_present)throw dbg_log("lldt: present bit not set"),this.debug.unimpl("#GP handler");if(!b.is_system)throw dbg_log("lldt: not a system entry"),this.debug.unimpl("#GP handler");if(2!==b.type)throw dbg_log("lldt: invalid type ("+b.type+")"), this.debug.unimpl("#GP handler");this.segment_offsets[reg_ldtr]=b.base;this.segment_limits[reg_ldtr]=b.effective_limit;this.sreg[reg_ldtr]=a}};"undefined"!==typeof window?window.CPU=CPU:"undefined"!==typeof module&&"undefined"!==typeof module.exports?module.exports.CPU=CPU:"function"===typeof importScripts&&(self.CPU=CPU);CPU.prototype.debug_init=function(){function a(){DEBUG&&(g.running||g.cycle(),d(),Date.now(),g.running=!1,f())}function b(q){if(DEBUG){for(var p=g.protected_mode[0]?"prot":"real",u=g.get_eflags(),t=g.getiopl(),x=g.cpl[0],z=h(g.sreg[reg_cs],4)+":"+h(g.get_real_eip()>>>0,8),A=h(g.sreg[reg_ss],4)+":"+h(g.reg32[reg_es]>>>0,8),E=g.is_32[0]?"32":"16",B=g.flags[0]&flag_interrupt?1:0,I={[flag_carry]:"c",[flag_parity]:"p",[flag_adjust]:"a",[flag_zero]:"z",[flag_sign]:"s",[flag_trap]:"t",[flag_interrupt]:"i", [flag_direction]:"d",[flag_overflow]:"o"},J="",G=0;16>G;G++)I[1<x;x++)u+=p[x]+"="+h(g.reg32[q[p[x]]]>>>0,8)+" ",t+=p[x+4]+"="+h(g.reg32[q[p[x+4]]]>>>0,8)+" ";u+=" ds="+h(g.sreg[reg_ds],4)+" es="+h(g.sreg[reg_es],4)+" fs="+h(g.sreg[reg_fs],4);t+=" gs="+h(g.sreg[reg_gs],4)+" cs="+h(g.sreg[reg_cs],4)+" ss="+h(g.sreg[reg_ss],4);return[u,t]}function d(){if(DEBUG){var q=c();dbg_log(q[0],LOG_CPU);dbg_log(q[1],LOG_CPU)}}function e(){if(DEBUG){l.step_mode=!0;var q,p="";l.trace_all&&l.all_ops?q=l.all_ops:l.ops&&(q=l.ops.toArray());if(!q)return"";for(var u= 0;u>>0}}}var g=this,l={};this.debug=l;l.step_mode=!1;l.ops=void 0;l.all_ops=[];l.trace_all= !1;l.show=function(q){if("undefined"!==typeof document){var p=document.getElementById("log");if(p){p.textContent+=q+"\n";p.style.display="block";p.scrollTop=1E9;return}}console.log(q)};l.init=function(){function q(u){10===u?(dbg_log(p,LOG_BIOS),p=""):p+=String.fromCharCode(u)}if(DEBUG&&(l.ops=new CircularQueue(2E5),g.io)){var p="";g.io.register_write(1026,this,q);g.io.register_write(1280,this,q)}};l.get_regs_short=c;l.dump_regs=d;l.dump_instructions=f;l.get_instructions=e;l.get_state=b;l.dump_state= function(q){DEBUG&&dbg_log(b(q),LOG_CPU)};l.dump_stack=function(q,p){if(DEBUG){var u=g.reg32[reg_esp];dbg_log("========= STACK ==========");if(p>=q||void 0===p)q=5,p=-5;for(;q>p;q--){var t=" ";q||(t="=> ");t+=h(q,2)+" | ";dbg_log(t+h(u+4*q,8)+" | "+h(g.read32s(u+4*q)>>>0))}}};l.dump_page_directory=function(){if(DEBUG)for(var q=0;1024>q;q++){var p=g.read32s(g.cr[3]+4*q),u=k(p,!0);if(u)if(p="",p+=u.size?"S ":" ",p+=u.accessed?"A ":" ",p+=u.cache_disable?"Cd ":" ",p+=u.user?"U ":" ",p+=u.read_write? "Rw ":" ",u.size)dbg_log("=== "+h(q<<22>>>0,8)+" -> "+h(u.address>>>0,8)+" | "+p);else{dbg_log("=== "+h(q<<22>>>0,8)+" | "+p);for(var t=0;1024>t;t++){var x=u.address+4*t;p=g.read32s(x);var z=k(p,!1);z&&(p="",p+=z.cache_disable?"Cd ":" ",p+=z.user?"U ":" ",p+=z.read_write?"Rw ":" ",p+=z.global?"G ":" ",p+=z.accessed?"A ":" ",p+=z.dirty?"Di ":" ",dbg_log("# "+h((q<<22|t<<12)>>>0,8)+" -> "+h(z.address,8)+" | "+p+" (at "+h(x,8)+")"))}}else dbg_log("Not present: "+h(q<<22>>>0,8))}};l.dump_gdt_ldt= function(){function q(p,u){for(var t=0;t>4,B="",I=A>>5&3;B=A&128?B+" P ":B+"NP ";A&16?(B=E&4?B+"32b ":B+"16b ",A&8?(B+="X ",A&4&&(B+="C ")):B+="R ",B+="RW "):B+="sys: "+h(A&15);E&8&&(z=z<<12|4095);dbg_log(h(t&-8,4)+" "+h(x>>>0,8)+" ("+h(z>>>0,8)+" bytes) "+B+"; dpl = "+I+", a = "+A.toString(2)+", f = "+E.toString(2))}}DEBUG&&(dbg_log("gdt: (len = "+h(g.gdtr_size[0])+ ")"),q(g.translate_address_system_read(g.gdtr_offset[0]),g.gdtr_size[0]),dbg_log("\nldt: (len = "+h(g.segment_limits[reg_ldtr])+")"),q(g.translate_address_system_read(g.segment_offsets[reg_ldtr]),g.segment_limits[reg_ldtr]))};l.dump_idt=function(){if(DEBUG)for(var q=0;q>5&3;var z=5===(p&31)?"task gate ":14===(p&31)?"intr gate ":15===(p&31)?"trap gate ": "invalid ";z=p&128?z+" P":z+"NP";dbg_log(h(q>>3,4)+" "+h(u>>>0,8)+", "+h(t,4)+"; "+z+"; dpl = "+x+", t = "+p.toString(2))}};l.get_memory_dump=function(q,p){if(DEBUG)return void 0===q?(q=0,p=g.memory_size[0]):void 0===p&&(p=q,q=0),g.mem8.slice(q,q+p).buffer};l.memory_hex_dump=function(q,p){if(DEBUG){p=p||64;for(var u,t,x=0;x

>4;x++){u=h(q+(x<<4),5)+" ";for(var z=0;16>z;z++)t=g.read8(q+(x<<4)+z),u+=h(t,2)+" ";u+=" ";for(z=0;16>z;z++)t=g.read8(q+(x<<4)+z),u+=33>t||126u;u++){p=h(128*u*q,8)+" | ";for(var t=0;128>t;t++)p+=0>>=0,l.trace_all&&l.all_ops?l.all_ops.push(q,p):l.ops&&(l.ops.add(q),l.ops.add(p)))};l.debug_interrupt=function(q){};let n,r;l.dump_code=function(q,p,u){if(!r){if(void 0===n&&(n="function"===typeof require?require("./capstone-x86.min.js"):window.cs,void 0===n)){dbg_log("Warning: Missing capstone library, disassembly not available");return}r=[new n.Capstone(n.ARCH_X86,n.MODE_16),new n.Capstone(n.ARCH_X86,n.MODE_32)]}try{r[q].disasm(p,u).forEach(function(t){dbg_log(h(t.address>>> 0)+": "+v86util.pads(t.bytes.map(x=>h(x,2).slice(-2)).join(" "),20)+" "+t.mnemonic+" "+t.op_str)}),dbg_log("")}catch(t){dbg_log("Could not disassemble: "+Array.from(p).map(x=>h(x,2)).join(" "))}};let v;l.dump_wasm=function(q){if(void 0===v&&(v="function"===typeof require?require("./libwabt.js"):new window.WabtModule,void 0===v)){dbg_log("Warning: Missing libwabt, wasm dump not available");return}q=q.slice();try{var p=v.readWasm(q,{readDebugNames:!1});p.generateNames();p.applyNames();const x=p.toText({foldExprs:!0, inlineExport:!0});dbg_log(x)}catch(x){var u=new Blob([q]),t=document.createElement("a");t.download="failed.wasm";t.href=window.URL.createObjectURL(u);t.dataset.downloadurl=["application/octet-stream",t.download,t.href].join(":");t.click();window.URL.revokeObjectURL(t.src);console.log(x.toString())}finally{p&&p.destroy()}}};const ELF_MAGIC=1179403647; let types=DataView.prototype,U8={size:1,get:types.getUint8,set:types.setUint8},U16={size:2,get:types.getUint16,set:types.setUint16},U32={size:4,get:types.getUint32,set:types.setUint32},pad=function(a){return{size:a,get:b=>-1}},Header=create_struct([{magic:U32},{class:U8},{data:U8},{version0:U8},{osabi:U8},{abiversion:U8},{pad0:pad(7)},{type:U16},{machine:U16},{version1:U32},{entry:U32},{phoff:U32},{shoff:U32},{flags:U32},{ehsize:U16},{phentsize:U16},{phnum:U16},{shentsize:U16},{shnum:U16},{shstrndx:U16}]); console.assert(52===Header.reduce((a,b)=>a+b.size,0));let ProgramHeader=create_struct([{type:U32},{offset:U32},{vaddr:U32},{paddr:U32},{filesz:U32},{memsz:U32},{flags:U32},{align:U32}]);console.assert(32===ProgramHeader.reduce((a,b)=>a+b.size,0));let SectionHeader=create_struct([{name:U32},{type:U32},{flags:U32},{addr:U32},{offset:U32},{size:U32},{link:U32},{info:U32},{addralign:U32},{entsize:U32}]);console.assert(40===SectionHeader.reduce((a,b)=>a+b.size,0)); function create_struct(a){return a.map(function(b){var c=Object.keys(b);console.assert(1===c.length);c=c[0];b=b[c];console.assert(0>1];if(l!==LINUX_BOOT_HDR_CHECKSUM1)dbg_log("Bad checksum1: "+h(l));else if(l=f[LINUX_BOOT_HDR_HEADER>>1]|f[LINUX_BOOT_HDR_HEADER+2>>1]<<16,l!==LINUX_BOOT_HDR_CHECKSUM2)dbg_log("Bad checksum2: "+h(l));else{l=f[LINUX_BOOT_HDR_VERSION>>1];dbg_assert(514<=l);var m=e[LINUX_BOOT_HDR_LOADFLAGS];dbg_assert(m& LINUX_BOOT_HDR_LOADFLAGS_LOADED_HIGH);var n=f[LINUX_BOOT_HDR_XLOADFLAGS>>1],r=k[LINUX_BOOT_HDR_INITRD_ADDR_MAX>>2],v=k[LINUX_BOOT_HDR_KERNEL_ALIGNMENT>>2],q=e[LINUX_BOOT_HDR_RELOCATABLE_KERNEL],p=e[LINUX_BOOT_HDR_MIN_ALIGNMENT],u=k[LINUX_BOOT_HDR_CMDLINE_SIZE>>2],t=k[LINUX_BOOT_HDR_PAYLOAD_OFFSET>>2],x=k[LINUX_BOOT_HDR_PAYLOAD_LENGTH>>2],z=k[LINUX_BOOT_HDR_PREF_ADDRESS>>2],A=k[LINUX_BOOT_HDR_PREF_ADDRESS+4>>2],E=k[LINUX_BOOT_HDR_INIT_SIZE>>2];dbg_log("kernel boot protocol version: "+h(l));dbg_log("flags="+ h(m)+" xflags="+h(n));dbg_log("code32_start="+h(k[LINUX_BOOT_HDR_CODE32_START>>2]));dbg_log("initrd_addr_max="+h(r));dbg_log("kernel_alignment="+h(v));dbg_log("relocatable="+q);dbg_log("min_alignment="+h(p));dbg_log("cmdline max="+h(u));dbg_log("payload offset="+h(t)+" size="+h(x));dbg_log("pref_address="+h(A)+":"+h(z));dbg_log("init_size="+h(E));e[LINUX_BOOT_HDR_TYPE_OF_LOADER]=LINUX_BOOT_HDR_TYPE_OF_LOADER_NOT_ASSIGNED;e[LINUX_BOOT_HDR_LOADFLAGS]=m&~LINUX_BOOT_HDR_LOADFLAGS_QUIET_FLAG&~LINUX_BOOT_HDR_LOADFLAGS_KEEP_SEGMENTS| LINUX_BOOT_HDR_LOADFLAGS_CAN_USE_HEAPS;f[LINUX_BOOT_HDR_HEAP_END_PTR>>1]=56832;f[LINUX_BOOT_HDR_VIDMODE>>1]=65535;dbg_log("heap_end_ptr="+h(56832));d+="\x00";dbg_assert(d.length>2]=581632;for(e=0;e>2]=g;k[LINUX_BOOT_HDR_RAMDISK_SIZE>>2]=e;dbg_assert(655360>524288+d.length);a.set(d,524288);a.set(b,1048576);return{option_rom:{name:"genroms/kernel.bin",data:make_linux_boot_rom(32768,57344)}}}} function make_linux_boot_rom(a,b){const c=new Uint8Array(256);(new Uint16Array(c.buffer))[0]=43605;c[2]=1;var d=3;c[d++]=250;c[d++]=184;c[d++]=a>>0;c[d++]=a>>8;c[d++]=142;c[d++]=192;c[d++]=142;c[d++]=216;c[d++]=142;c[d++]=224;c[d++]=142;c[d++]=232;c[d++]=142;c[d++]=208;c[d++]=188;c[d++]=b>>0;c[d++]=b>>8;c[d++]=234;c[d++]=0;c[d++]=0;c[d++]=a+32>>0;c[d++]=a+32>>8;dbg_assert(512>d);a=d;b=c[a]=0;for(d=0;d keyCode not found: ",p,q)}};function MouseAdapter(a,b){function c(t){if(!u.enabled||!u.emu_enabled)return!1;var x=b||document.body,z;if(!(z=document.pointerLockElement))a:{for(t=t.target;t.parentNode;){if(t===x){z=!0;break a}t=t.parentNode}z=!1}return z}function d(t){c(t)&&(t=t.changedTouches)&&t.length&&(t=t[t.length-1],q=t.clientX,p=t.clientY)}function e(t){if(n||v||r)u.bus.send("mouse-click",[!1,!1,!1]),n=v=r=!1}function f(t){if(u.bus&&c(t)){var x=0,z=0,A=t.changedTouches;A?A.length&&(A=A[A.length-1],x=A.clientX-q,z=A.clientY- p,q=A.clientX,p=A.clientY,t.preventDefault()):"number"===typeof t.movementX?(x=t.movementX,z=t.movementY):"number"===typeof t.webkitMovementX?(x=t.webkitMovementX,z=t.webkitMovementY):"number"===typeof t.mozMovementX?(x=t.mozMovementX,z=t.mozMovementY):(x=t.clientX-q,z=t.clientY-p,q=t.clientX,p=t.clientY);u.bus.send("mouse-delta",[.15*x,-(.15*z)]);b&&u.bus.send("mouse-absolute",[t.pageX-b.offsetLeft,t.pageY-b.offsetTop,b.offsetWidth,b.offsetHeight])}}function k(t){c(t)&&l(t,!0)}function g(t){c(t)&& l(t,!1)}function l(t,x){u.bus&&(1===t.which?n=x:2===t.which?v=x:3===t.which?r=x:dbg_log("Unknown event.which: "+t.which),u.bus.send("mouse-click",[n,v,r]))}function m(t){if(c(t)){var x=t.wheelDelta||-t.detail;0>x?x=-1:0{switch(n.data.type){case "queue":m.queue_push(n.data.value);break;case "sampling-rate":m.source_samples_per_destination=n.data.value/sampleRate}};return m}var l=[new Float32Array(256),new Float32Array(256)];Reflect.setPrototypeOf(g.prototype,AudioWorkletProcessor.prototype);Reflect.setPrototypeOf(g,AudioWorkletProcessor);g.prototype.process=g.prototype.process=function(m,n,r){for(m=0;mm?(m+=this.source_buffer_previous[0].length,this.source_buffer_previous[n][m]):this.source_buffer_current[n][m]};g.prototype.ensure_enough_data=function(m){var n=this.source_buffer_current[0].length;n-this.source_block_startthis.queued_samples&&this.queue_length&&this.dbg_log("Not enough samples - should not happen during midway of playback");this.source_buffer_previous=this.source_buffer_current;this.source_buffer_current=this.queue_shift();var m=this.source_buffer_current[0].length;if(256>m){for(var n=this.queue_start,r=0;256>m&&rthis.queued_samples/this.source_samples_per_destination&&this.port.postMessage({type:"pump"})};g.prototype.queue_push=function(m){this.queue_length{URL.revokeObjectURL(f);this.node_processor=new AudioWorkletNode(this.audio_context,"dac-processor",{numberOfInputs:0,numberOfOutputs:1,outputChannelCount:[2],parameterData:{},processorOptions:{}});this.node_processor.port.postMessage({type:"sampling-rate",value:this.sampling_rate}); this.node_processor.port.onmessage=k=>{switch(k.data.type){case "pump":this.pump();break;case "debug-log":dbg_log("SpeakerWorkletDAC - Worklet: "+k.data.value)}};this.node_processor.connect(this.node_output)});this.mixer_connection=c.add_source(this.node_output,MIXER_SRC_DAC);this.mixer_connection.set_gain_hidden(3);a.register("dac-send-data",function(k){this.queue(k)},this);a.register("dac-enable",function(k){this.enabled=!0},this);a.register("dac-disable",function(){this.enabled=!1},this);a.register("dac-tell-sampling-rate", function(k){dbg_assert(0this.pump(),1E3*b);a.start(this.buffered_time);this.buffered_time+= c;setTimeout(()=>this.pump(),0)};SpeakerBufferSourceDAC.prototype.pump=function(){this.enabled&&(this.buffered_time-this.audio_context.currentTime>DAC_QUEUE_RESERVE||this.bus.send("dac-request-data"))}; function SpeakerDACDebugger(a,b){this.audio_context=a;this.node_source=b;this.node_processor=null;this.node_gain=this.audio_context.createGain();this.node_gain.gain.setValueAtTime(0,this.audio_context.currentTime);this.node_gain.connect(this.audio_context.destination);this.is_active=!1;this.queued_history=[];this.output_history=[];this.queued=[[],[]];this.output=[[],[]]} SpeakerDACDebugger.prototype.start=function(a){this.is_active=!0;this.queued=[[],[]];this.output=[[],[]];this.queued_history.push(this.queued);this.output_history.push(this.output);this.node_processor=this.audio_context.createScriptProcessor(1024,2,2);this.node_processor.onaudioprocess=b=>{this.output[0].push(b.inputBuffer.getChannelData(0).slice());this.output[1].push(b.inputBuffer.getChannelData(1).slice())};this.node_source.connect(this.node_processor);this.node_processor.connect(this.node_gain); setTimeout(()=>{this.stop()},a)};SpeakerDACDebugger.prototype.stop=function(){this.is_active=!1;this.node_source.disconnect(this.node_processor);this.node_processor.disconnect();this.node_processor=null};SpeakerDACDebugger.prototype.push_queued_data=function(a){this.is_active&&(this.queued[0].push(a[0].slice()),this.queued[1].push(a[1].slice()))};SpeakerDACDebugger.prototype.download_txt=function(a,b){a=this.output_history[a][b].map(c=>c.join(" ")).join(" ");dump_file(a,"dacdata.txt")}; SpeakerDACDebugger.prototype.download_csv=function(a){a=this.output_history[a];for(var b=[],c=0;cl?void 0===this.update_timer&&(this.update_timer=setTimeout(()=>{this.update_timer=void 0;var m=Date.now();dbg_assert(15<=m-this.last_update);this.last_update=m;this.render()},16-l)):(void 0!==this.update_timer&&(clearTimeout(this.update_timer),this.update_timer=void 0),this.last_update=g,this.render())};this.render=function(){a.value=this.text; this.text_new_line&&(this.text_new_line=!1,a.scrollTop=1E9)};this.send_char=function(g){k.bus&&k.bus.send("serial0-input",g)}}function SerialRecordingAdapter(a){this.text="";a.register("serial0-output-char",function(b){this.text+=b},this)} function SerialAdapterXtermJS(a,b){this.element=a;if(window.Terminal){var c=this.term=new window.Terminal;c.setOption("logLevel","off");c.write("This is the serial console. Whatever you type or paste here will be sent to COM1");c.onData(function(d){b.send("serial0-input",d.charCodeAt(0))});b.register("serial0-output-char",function(d){c.write(d)},this)}}SerialAdapterXtermJS.prototype.show=function(){this.term&&this.term.open(this.element)};function NetworkAdapter(a,b){this.bus=b;this.socket=void 0;this.send_queue=[];this.url=a;this.reconnect_interval=1E4;this.last_connect_attempt=Date.now()-this.reconnect_interval;this.send_queue_limit=64;this.bus.register("net0-send",function(c){this.send(c)},this)}NetworkAdapter.prototype.handle_message=function(a){this.bus&&this.bus.send("net0-receive",new Uint8Array(a.data))};NetworkAdapter.prototype.handle_close=function(a){this.connect();setTimeout(this.connect.bind(this),this.reconnect_interval)}; NetworkAdapter.prototype.handle_open=function(a){for(a=0;aa||(this.last_connect_attempt=Date.now(),this.socket=new WebSocket(this.url),this.socket.binaryType="arraybuffer",this.socket.onopen=this.handle_open.bind(this),this.socket.onmessage=this.handle_message.bind(this),this.socket.onclose=this.handle_close.bind(this),this.socket.onerror=this.handle_error.bind(this))}}; NetworkAdapter.prototype.send=function(a){this.socket&&1===this.socket.readyState?this.socket.send(a):(this.send_queue.push(a),this.send_queue.length>2*this.send_queue_limit&&(this.send_queue=this.send_queue.slice(-this.send_queue_limit)),this.connect())};NetworkAdapter.prototype.change_proxy=function(a){this.url=a;this.socket&&(this.socket.onclose=function(){},this.socket.onerror=function(){},this.socket.close(),this.socket=void 0)};var ASYNC_SAFE=!1; (function(){function a(g,l){var m=new XMLHttpRequest;m.open(l.method||"get",g,!0);m.responseType=l.as_json?"json":"arraybuffer";if(l.headers)for(var n=Object.keys(l.headers),r=0;r{if(n)throw n;let v=l.range.length;var q=Buffer.allocUnsafe(v);m.read(r,q,0,v,l.range.start,(p,u)=>{if(p)throw p;dbg_assert(u===v);l.done&&l.done(new Uint8Array(q));m.close(r,t=>{if(t)throw t;})})})):m.readFile(g,{encoding:l.as_json?"utf-8":null},function(n,r){n?console.log("Could not read file:", g,n):(n=r,n=l.as_json?JSON.parse(n):(new Uint8Array(n)).buffer,l.done(n))})}function c(g,l){this.filename=g;this.block_size=256;this.byteLength=l;this.loaded_blocks=Object.create(null);this.onprogress=this.onload=void 0}function d(g,l){const m=g.match(/(.*)(\..*)/);m?(this.basename=m[1],this.extension=m[2]):(this.basename=g,this.extension="");this.block_size=256;this.byteLength=l;this.loaded_blocks=Object.create(null);this.onprogress=this.onload=void 0}function e(g){this.file=g;this.byteLength=g.size; 1073741824>20)+" MB ...");this.buffer=new ArrayBuffer(g.size);this.onprogress=this.onload=void 0}function f(g){this.file=g;this.byteLength=g.size;this.block_size=256;this.loaded_blocks=Object.create(null);this.onprogress=this.onload=void 0}v86util.load_file="undefined"===typeof XMLHttpRequest?b:a;v86util.AsyncXHRBuffer=c;v86util.AsyncXHRPartfileBuffer=d;v86util.AsyncFileBuffer=f;v86util.SyncFileBuffer=e;v86util.read_sized_string_from_mem= function(g,l,m){return String.fromCharCode(...new Uint8Array(g.buffer,l>>>0,m>>>0))};var k="undefined"===typeof XMLHttpRequest?function(g,l){require("fs").stat(g,(m,n)=>{m?l(m):l(null,n.size)})}:function(g,l){v86util.load_file(g,{done:(m,n)=>{m=n.getResponseHeader("Content-Range")||"";(n=m.match(/\/(\d+)\s*$/))?l(null,+n[1]):l("`Range: bytes=...` header not supported (Got `"+m+"`)")},headers:{Range:"bytes=0-0"}})};c.prototype.load=function(){void 0!==this.byteLength?this.onload&&this.onload(Object.create(null)): k(this.filename,(g,l)=>{if(g)throw Error("Cannot use: "+this.filename+". "+g);dbg_assert(0<=l);this.byteLength=l;this.onload&&this.onload(Object.create(null))})};c.prototype.get_from_cache=function(g,l,m){m=l/this.block_size;g/=this.block_size;for(var n=0;n=n);v!==n&&(l.push(this.file.slice(n,v)),n=v);l.push(q);n+=q.length}n!==this.file.size&&l.push(this.file.slice(n));g=new File(l,g);console.assert(g.size===this.file.size);return g}})();function V86Starter(a){this.cpu_is_running=!1;const b=Bus.create();this.bus=b[0];this.emulator_bus=b[1];var c,d;const e=new WebAssembly.Table({element:"anyfunc",initial:WASM_TABLE_SIZE+WASM_TABLE_OFFSET}),f={cpu_exception_hook:l=>this.cpu_exception_hook&&this.cpu_exception_hook(l),hlt_op:function(){return c.hlt_op()},abort:function(){dbg_assert(!1)},logop:function(l,m){return c.debug.logop(l,m)},microtick:v86.microtick,get_rand_int:function(){return v86util.get_rand_int()},pic_acknowledge:function(){c.pic_acknowledge()}, io_port_read8:function(l){return c.io.port_read8(l)},io_port_read16:function(l){return c.io.port_read16(l)},io_port_read32:function(l){return c.io.port_read32(l)},io_port_write8:function(l,m){c.io.port_write8(l,m)},io_port_write16:function(l,m){c.io.port_write16(l,m)},io_port_write32:function(l,m){c.io.port_write32(l,m)},mmap_read8:function(l){return c.mmap_read8(l)},mmap_read16:function(l){return c.mmap_read16(l)},mmap_read32:function(l){return c.mmap_read32(l)},mmap_write8:function(l,m){c.mmap_write8(l, m)},mmap_write16:function(l,m){c.mmap_write16(l,m)},mmap_write32:function(l,m){c.mmap_write32(l,m)},mmap_write64:function(l,m,n){c.mmap_write64(l,m,n)},mmap_write128:function(l,m,n,r,v){c.mmap_write128(l,m,n,r,v)},cpuid:function(){return c.cpuid()},load_ldt:function(){return c.load_ldt.apply(c,arguments)},load_tr:function(){return c.load_tr.apply(c,arguments)},log_from_wasm:function(l,m){l=v86util.read_sized_string_from_mem(d,l,m);dbg_log(l,LOG_CPU)},console_log_from_wasm:function(l,m){l=v86util.read_sized_string_from_mem(d, l,m);console.error(l)},dbg_trace_from_wasm:function(){dbg_trace()},codegen_finalize:(l,m,n,r,v)=>{c.codegen_finalize(l,m,n,r,v)},jit_clear_func:l=>c.jit_clear_func(l),jit_clear_all_funcs:()=>c.jit_clear_all_funcs(),do_task_switch:(l,m,n)=>{c.do_task_switch(l,m,n)},__indirect_function_table:e};let k=DEBUG?"v86-debug.wasm":"v86.wasm",g="v86-fallback.wasm";a.wasm_path?k=a.wasm_path:"undefined"===typeof window&&"string"===typeof __dirname?(k=__dirname+"/"+k,g=__dirname+"/"+g):(k="build/"+k,g="build/"+ g);v86util.load_file(k,{done:l=>{WebAssembly.instantiate(l,{env:f}).then(({instance:m})=>{m=m.exports;d=m.memory;m.rust_init();m=this.v86=new v86(this.emulator_bus,{exports:m,wasm_table:e});c=m.cpu;this.continue_init(m,a)},m=>{v86util.load_file(g,{done:n=>{WebAssembly.instantiate(n,{env:f}).then(({instance:r})=>{r=r.exports;d=r.memory;r.rust_init();r=this.v86=new v86(this.emulator_bus,{exports:r,wasm_table:e});c=r.cpu;this.continue_init(r,a)})}})})},progress:l=>{this.emulator_bus.send("download-progress", {file_index:0,file_count:1,file_name:k,lengthComputable:l.lengthComputable,total:l.total,loaded:l.loaded})}})} V86Starter.prototype.continue_init=async function(a,b){function c(q,p){switch(q){case "hda":f.hda=this.disk_images.hda=p;break;case "hdb":f.hdb=this.disk_images.hdb=p;break;case "cdrom":f.cdrom=this.disk_images.cdrom=p;break;case "fda":f.fda=this.disk_images.fda=p;break;case "fdb":f.fdb=this.disk_images.fdb=p;break;case "multiboot":f.multiboot=this.disk_images.multiboot=p.buffer;break;case "bzimage":f.bzimage=this.disk_images.bzimage=p.buffer;break;case "initrd":f.initrd=this.disk_images.initrd=p.buffer; break;case "bios":f.bios=p.buffer;break;case "vga_bios":f.vga_bios=p.buffer;break;case "initial_state":f.initial_state=p.buffer;break;case "fs9p_json":f.fs9p_json=p;break;default:dbg_assert(!1,q)}}function d(q,p){if(p)if(p.get&&p.set&&p.load)k.push({name:q,loadable:p});else{p={buffer:p.buffer,async:p.async,url:p.url,size:p.size,use_parts:p.use_parts};if("bios"===q||"vga_bios"===q||"initial_state"===q||"multiboot"===q||"bzimage"===q||"initrd"===q)p.async=!1;p.buffer instanceof ArrayBuffer?(p=new SyncBuffer(p.buffer), k.push({name:q,loadable:p})):"undefined"!==typeof File&&p.buffer instanceof File?(void 0===p.async&&(p.async=268435456<=p.buffer.size),p=p.async?new v86util.AsyncFileBuffer(p.buffer):new v86util.SyncFileBuffer(p.buffer),k.push({name:q,loadable:p})):p.url?p.async?(p=p.use_parts?new v86util.AsyncXHRPartfileBuffer(p.url,p.size):new v86util.AsyncXHRBuffer(p.url,p.size),k.push({name:q,loadable:p})):k.push({name:q,url:p.url,size:p.size}):dbg_log("Ignored file: url="+p.url+" buffer="+p.buffer)}}function e(){function q(){this.serial_adapter&& this.serial_adapter.show&&this.serial_adapter.show();this.bus.send("cpu-init",f);f.initial_state&&(a.restore_state(f.initial_state),f.initial_state=void 0);b.autostart&&this.bus.send("cpu-run");this.emulator_bus.send("emulator-loaded")}if(f.fs9p&&f.fs9p_json)if(f.initial_state?dbg_log("Filesystem basefs ignored: Overridden by state image"):f.fs9p.load_from_json(f.fs9p_json),b.bzimage_initrd_from_filesystem){const {bzimage:p,initrd:u}=this.get_bzimage_initrd_from_filesystem(f.fs9p);dbg_log("Found bzimage: "+ p+" and initrd: "+u);Promise.all([f.fs9p.read_file(u),f.fs9p.read_file(p)]).then(([t,x])=>{c.call(this,"initrd",new SyncBuffer(t.buffer));c.call(this,"bzimage",new SyncBuffer(x.buffer));q.call(this)})}else q.call(this);else console.assert(!b.bzimage_initrd_from_filesystem,"bzimage_initrd_from_filesystem: Requires a filesystem"),q.call(this)}this.bus.register("emulator-stopped",function(){this.cpu_is_running=!1},this);this.bus.register("emulator-started",function(){this.cpu_is_running=!0},this);var f= {};this.disk_images={fda:void 0,fdb:void 0,hda:void 0,hdb:void 0,cdrom:void 0};f.acpi=b.acpi;f.load_devices=!0;f.log_level=b.log_level;f.memory_size=b.memory_size||67108864;f.vga_memory_size=b.vga_memory_size||8388608;f.boot_order=b.boot_order||531;f.fastboot=b.fastboot||!1;f.fda=void 0;f.fdb=void 0;f.uart1=b.uart1;f.uart2=b.uart2;f.uart3=b.uart3;f.cmdline=b.cmdline;f.preserve_mac_from_state_image=b.preserve_mac_from_state_image;b.network_adapter?this.network_adapter=b.network_adapter(this.bus):b.network_relay_url&& (this.network_adapter=new NetworkAdapter(b.network_relay_url,this.bus));f.enable_ne2k=!0;b.disable_keyboard||(this.keyboard_adapter=new KeyboardAdapter(this.bus));b.disable_mouse||(this.mouse_adapter=new MouseAdapter(this.bus,b.screen_container));b.screen_container?this.screen_adapter=new ScreenAdapter(b.screen_container,this.bus):b.screen_dummy&&(this.screen_adapter=new DummyScreenAdapter(this.bus));b.serial_container&&(this.serial_adapter=new SerialAdapter(b.serial_container,this.bus));b.serial_container_xtermjs&& (this.serial_adapter=new SerialAdapterXtermJS(b.serial_container_xtermjs,this.bus));b.disable_speaker||(this.speaker_adapter=new SpeakerAdapter(this.bus));var k=[];b.state&&console.warn("Warning: Unknown option 'state'. Did you mean 'initial_state'?");for(var g="bios vga_bios cdrom hda hdb fda fdb initial_state multiboot bzimage initrd".split(" "),l=0;l"/"+e);a=(a.read_dir("/boot/")||[]).map(e=>"/boot/"+e);let c,d;for(let e of[].concat(b,a)){const f=/old/i.test(e)||/fallback/i.test(e),k=/vmlinuz/i.test(e)||/bzimage/i.test(e),g=/initrd/i.test(e)||/initramfs/i.test(e);!k||d&&f||(d=e);!g||c&&f||(c=e)}c&&d||(console.log("Failed to find bzimage or initrd in filesystem. Files:"),console.log(b.join(" ")),console.log(a.join(" ")));return{initrd:c,bzimage:d}}; V86Starter.prototype.run=function(){this.bus.send("cpu-run")};goog.exportProperty(V86Starter.prototype,"run",V86Starter.prototype.run);V86Starter.prototype.stop=function(){this.bus.send("cpu-stop")};goog.exportProperty(V86Starter.prototype,"stop",V86Starter.prototype.stop); V86Starter.prototype.destroy=function(){this.stop();this.v86.destroy();this.keyboard_adapter&&this.keyboard_adapter.destroy();this.network_adapter&&this.network_adapter.destroy();this.mouse_adapter&&this.mouse_adapter.destroy();this.screen_adapter&&this.screen_adapter.destroy();this.serial_adapter&&this.serial_adapter.destroy()};goog.exportProperty(V86Starter.prototype,"destroy",V86Starter.prototype.destroy);V86Starter.prototype.restart=function(){this.bus.send("cpu-restart")}; goog.exportProperty(V86Starter.prototype,"restart",V86Starter.prototype.restart);V86Starter.prototype.add_listener=function(a,b){this.bus.register(a,b,this)};goog.exportProperty(V86Starter.prototype,"add_listener",V86Starter.prototype.add_listener);V86Starter.prototype.remove_listener=function(a,b){this.bus.unregister(a,b)};goog.exportProperty(V86Starter.prototype,"remove_listener",V86Starter.prototype.remove_listener);V86Starter.prototype.restore_state=function(a){this.v86.restore_state(a)}; goog.exportProperty(V86Starter.prototype,"restore_state",V86Starter.prototype.restore_state);V86Starter.prototype.save_state=function(a){setTimeout(function(){try{a(null,this.v86.save_state())}catch(b){a(b,null)}}.bind(this),0)};goog.exportProperty(V86Starter.prototype,"save_state",V86Starter.prototype.save_state); V86Starter.prototype.get_statistics=function(){console.warn("V86Starter.prototype.get_statistics is deprecated. Use events instead.");var a={cpu:{instruction_counter:this.get_instruction_counter()}};if(!this.v86)return a;var b=this.v86.cpu.devices;b.hda&&(a.hda=b.hda.stats);b.cdrom&&(a.cdrom=b.cdrom.stats);b.ps2&&(a.mouse={enabled:b.ps2.use_mouse});b.vga&&(a.vga={is_graphical:b.vga.stats.is_graphical});return a};goog.exportProperty(V86Starter.prototype,"get_statistics",V86Starter.prototype.get_statistics); V86Starter.prototype.get_instruction_counter=function(){return this.v86?this.v86.cpu.instruction_counter[0]>>>0:0};goog.exportProperty(V86Starter.prototype,"get_instruction_counter",V86Starter.prototype.get_instruction_counter);V86Starter.prototype.is_running=function(){return this.cpu_is_running};goog.exportProperty(V86Starter.prototype,"is_running",V86Starter.prototype.is_running);V86Starter.prototype.keyboard_send_scancodes=function(a){for(var b=0;b{const g=this.fs9p.Mount(a,f);d&&(g===-ENOENT?d(new FileNotFoundError):g===-EEXIST?d(new FileExistsError):0>g?(dbg_assert(!1,"Unexpected error code: "+-g),d(Error("Failed to mount. Error number: "+-g))):d(null))};b?(dbg_assert("object"===typeof c,"Filesystem: basefs must be a JSON object"),f.load_from_json(c,()=>k())):k()}; goog.exportProperty(V86Starter.prototype,"mount_fs",V86Starter.prototype.mount_fs);V86Starter.prototype.create_file=function(a,b,c){c=c||function(){};var d=this.fs9p;if(d){var e=a.split("/");e=e[e.length-1];a=d.SearchPath(a).parentid;""!==e&&-1!==a?d.CreateBinaryFile(e,a,b).then(()=>c(null)):setTimeout(function(){c(new FileNotFoundError)},0)}};goog.exportProperty(V86Starter.prototype,"create_file",V86Starter.prototype.create_file); V86Starter.prototype.read_file=function(a,b){var c=this.fs9p;c&&c.read_file(a).then(d=>{d?b(null,d):b(new FileNotFoundError,null)})};goog.exportProperty(V86Starter.prototype,"read_file",V86Starter.prototype.read_file); V86Starter.prototype.automatically=function(a){const b=c=>{const d=c[0];if(d){var e=c.slice(1);if(d.sleep)setTimeout(()=>b(e),1E3*d.sleep);else if(d.vga_text){const f=this.screen_adapter.get_text_screen();for(let k of f)if(k.includes(d.vga_text)){b(e);return}setTimeout(()=>b(c),1E3)}else d.keyboard_send?(d.keyboard_send instanceof Array?this.keyboard_send_scancodes(d.keyboard_send):(dbg_assert("string"===typeof d.keyboard_send),this.keyboard_send_text(d.keyboard_send)),b(e)):d.call?(d.call(),b(e)): console.assert(!1,d)}};b(a)};function FileExistsError(a){this.message=a||"File already exists"}FileExistsError.prototype=Error.prototype;function FileNotFoundError(a){this.message=a||"File not found"}FileNotFoundError.prototype=Error.prototype; "undefined"!==typeof window?(window.V86Starter=V86Starter,window.V86=V86Starter):"undefined"!==typeof module&&"undefined"!==typeof module.exports?(module.exports.V86Starter=V86Starter,module.exports.V86=V86Starter):"function"===typeof importScripts&&(self.V86Starter=V86Starter,self.V86=V86Starter);var WorkerBus={Connector:function(a){this.listeners={};this.pair=a;a.addEventListener("message",function(b){b=b.data;for(var c=this.listeners[b[0]],d=0;d>20)+"m\n";b=b+"Config:\nMAX_PAGES="+(a.wm.exports.get_config(0)+"\n");b+="JIT_USE_LOOP_SAFETY="+a.wm.exports.get_config(1)+"\n";return b+="MAX_EXTRA_BASIC_BLOCKS="+a.wm.exports.get_config(2)+"\n"},print_instruction_counts:function(a){return[print_stats.print_instruction_counts_offset(a, !1,!1,!1,!1),print_stats.print_instruction_counts_offset(a,!0,!1,!1,!1),print_stats.print_instruction_counts_offset(a,!1,!0,!1,!1),print_stats.print_instruction_counts_offset(a,!1,!1,!0,!1),print_stats.print_instruction_counts_offset(a,!1,!1,!1,!0)].join("\n\n")},print_instruction_counts_offset:function(a,b,c,d,e){let f="";var k=[],g=b?"compiled":c?"jit exit":d?"unguarded register":e?"wasm size":"executed";for(let n=0;256>n;n++)for(let r=0;8>r;r++)for(let v of[!1,!0]){var l=a.wm.exports.get_opstats_buffer(b, c,d,e,n,!1,v,r);k.push({opcode:n,count:l,is_mem:v,fixed_g:r});l=a.wm.exports.get_opstats_buffer(b,c,d,e,n,!0,v,r);k.push({opcode:3840|n,count:l,is_mem:v,fixed_g:r})}a=0;b=new Set([38,46,54,62,100,101,102,103,240,242,243]);for(let {count:n,opcode:r}of k)b.has(r)||(a+=n);if(0===a)return"";c=new Uint32Array(256);b=new Uint32Array(256);for(let {opcode:n,count:r}of k)3840==(n&65280)?b[n&255]+=r:c[n&255]+=r;f=f+"------------------\nTotal: "+(a+"\n");const m=1E7 Math.round(n/m)));d=String(d).length;f+=`Instruction counts ${g} (in ${m}):\n`;for(e=0;256>e;e++)f+=h(e,2).slice(2)+":"+v86util.pads(Math.round(c[e]/m),d),f=15==e%16?f+"\n":f+" ";f=f+"\n"+`Instruction counts ${g} (0f, in ${m}):\n`;for(g=0;256>g;g++)f+=h(g&255,2).slice(2)+":"+v86util.pads(Math.round(b[g]/m),d),f=15==g%16?f+"\n":f+" ";f+="\n";k=k.filter(({count:n})=>n).sort(({count:n},{count:r})=>r-n);for(let {opcode:n,is_mem:r,fixed_g:v,count:q}of k.slice(0,200))k=n.toString(16)+"_"+v+(r?"_m":"_r"), f+=k+":"+(q/a*100).toFixed(2)+" ";return f+"\n"}};"undefined"!==typeof module&&"undefined"!==typeof module.exports&&(module.exports.print_stats=print_stats);function FileStorageInterface(){}FileStorageInterface.prototype.read=function(a,b,c){};FileStorageInterface.prototype.cache=function(a,b){};FileStorageInterface.prototype.uncache=function(a){};function MemoryFileStorage(){this.filedata=new Map}MemoryFileStorage.prototype.read=async function(a,b,c){dbg_assert(a,"MemoryFileStorage read: sha256sum should be a non-empty string");return(a=this.filedata.get(a))?a.subarray(b,b+c):null}; MemoryFileStorage.prototype.cache=async function(a,b){dbg_assert(a,"MemoryFileStorage cache: sha256sum should be a non-empty string");this.filedata.set(a,b)};MemoryFileStorage.prototype.uncache=function(a){this.filedata.delete(a)};function ServerFileStorageWrapper(a,b){dbg_assert(b,"ServerMemoryFileStorage: baseurl should not be empty");this.storage=a;this.baseurl=b} ServerFileStorageWrapper.prototype.load_from_server=function(a){return new Promise((b,c)=>{v86util.load_file(this.baseurl+a,{done:d=>{const e=new Uint8Array(d);this.cache(a,e).then(()=>b(e))}})})};ServerFileStorageWrapper.prototype.read=async function(a,b,c){const d=await this.storage.read(a,b,c);return d?d:(await this.load_from_server(a)).subarray(b,b+c)};ServerFileStorageWrapper.prototype.cache=async function(a,b){return await this.storage.cache(a,b)}; ServerFileStorageWrapper.prototype.uncache=function(a){this.storage.uncache(a)};"undefined"!==typeof window?(window.MemoryFileStorage=MemoryFileStorage,window.ServerFileStorageWrapper=ServerFileStorageWrapper):"undefined"!==typeof module&&"undefined"!==typeof module.exports?(module.exports.MemoryFileStorage=MemoryFileStorage,module.exports.ServerFileStorageWrapper=ServerFileStorageWrapper):"function"===typeof importScripts&&(self.MemoryFileStorage=MemoryFileStorage,self.ServerFileStorageWrapper=ServerFileStorageWrapper);var S_IRWXUGO=511,S_IFMT=61440,S_IFSOCK=49152,S_IFLNK=40960,S_IFREG=32768,S_IFBLK=24576,S_IFDIR=16384,S_IFCHR=8192,O_RDONLY=0,O_WRONLY=1,O_RDWR=2,O_ACCMODE=3,STATUS_INVALID=-1,STATUS_OK=0,STATUS_ON_STORAGE=2,STATUS_UNLINKED=4,STATUS_FORWARDING=5,JSONFS_VERSION=3,JSONFS_IDX_NAME=0,JSONFS_IDX_SIZE=1,JSONFS_IDX_MTIME=2,JSONFS_IDX_MODE=3,JSONFS_IDX_UID=4,JSONFS_IDX_GID=5,JSONFS_IDX_TARGET=6,JSONFS_IDX_SHA256=6; function FS(a,b){this.inodes=[];this.events=[];this.storage=a;this.qidcounter=b||{last_qidnumber:0};this.inodedata={};this.total_size=274877906944;this.used_size=0;this.mounts=[];this.CreateDirectory("",-1)}FS.prototype.get_state=function(){let a=[];a[0]=this.inodes;a[1]=this.qidcounter.last_qidnumber;a[2]=[];for(const [b,c]of Object.entries(this.inodedata))0===(this.inodes[b].mode&S_IFDIR)&&a[2].push([b,c]);a[3]=this.total_size;a[4]=this.used_size;return a=a.concat(this.mounts)}; FS.prototype.set_state=function(a){this.inodes=a[0].map(b=>{const c=new Inode(0);c.set_state(b);return c});this.qidcounter.last_qidnumber=a[1];this.inodedata={};for(let [b,c]of a[2])c.buffer.byteLength!==c.byteLength&&(c=c.slice()),this.inodedata[b]=c;this.total_size=a[3];this.used_size=a[4];this.mounts=a.slice(5)}; FS.prototype.AddEvent=function(a,b){var c=this.inodes[a];c.status==STATUS_OK||c.status==STATUS_ON_STORAGE?b():this.is_forwarder(c)?this.follow_fs(c).AddEvent(c.foreign_id,b):this.events.push({id:a,OnEvent:b})};FS.prototype.HandleEvent=function(a){var b=this.inodes[a];this.is_forwarder(b)&&this.follow_fs(b).HandleEvent(b.foreign_id);b=[];for(var c=0;c>8;this.qid.version=a[11];this.qid.path=a[12];this.nlinks=a[13]}; FS.prototype.divert=function(a,b){const c=this.Search(a,b),d=this.inodes[c],e=new Inode(-1);dbg_assert(d,"Filesystem divert: name ("+b+") not found");dbg_assert(this.IsDirectory(c)||1>=d.nlinks,"Filesystem: can't divert hardlinked file '"+b+"' with nlinks="+d.nlinks);Object.assign(e,d);const f=this.inodes.length;this.inodes.push(e);e.fid=f;this.is_forwarder(d)&&this.mounts[d.mount_id].backtrack.set(d.foreign_id,f);this.should_be_linked(d)&&(this.unlink_from_dir(a,b),this.link_under_dir(a,f,b));if(this.IsDirectory(c)&& !this.is_forwarder(d))for(const [k,g]of e.direntries)"."!==k&&".."!==k&&this.IsDirectory(g)&&this.inodes[g].direntries.set("..",f);this.inodedata[f]=this.inodedata[c];delete this.inodedata[c];d.direntries=new Map;d.nlinks=0;return f};FS.prototype.copy_inode=function(a,b){Object.assign(b,a,{fid:b.fid,direntries:b.direntries,nlinks:b.nlinks})};FS.prototype.CreateInode=function(){const a=Math.round(Date.now()/1E3),b=new Inode(++this.qidcounter.last_qidnumber);b.atime=b.ctime=b.mtime=a;return b}; FS.prototype.CreateDirectory=function(a,b){var c=this.inodes[b];if(0<=b&&this.is_forwarder(c))return b=c.foreign_id,a=this.follow_fs(c).CreateDirectory(a,b),this.create_forwarder(c.mount_id,a);c=this.CreateInode();c.mode=511|S_IFDIR;0<=b&&(c.uid=this.inodes[b].uid,c.gid=this.inodes[b].gid,c.mode=this.inodes[b].mode&511|S_IFDIR);c.qid.type=S_IFDIR>>8;this.PushInode(c,b,a);this.NotifyListeners(this.inodes.length-1,"newdir");return this.inodes.length-1}; FS.prototype.CreateFile=function(a,b){var c=this.inodes[b];if(this.is_forwarder(c))return b=c.foreign_id,a=this.follow_fs(c).CreateFile(a,b),this.create_forwarder(c.mount_id,a);c=this.CreateInode();c.uid=this.inodes[b].uid;c.gid=this.inodes[b].gid;c.qid.type=S_IFREG>>8;c.mode=this.inodes[b].mode&438|S_IFREG;this.PushInode(c,b,a);this.NotifyListeners(this.inodes.length-1,"newfile");return this.inodes.length-1}; FS.prototype.CreateNode=function(a,b,c,d){var e=this.inodes[b];if(this.is_forwarder(e))return b=e.foreign_id,a=this.follow_fs(e).CreateNode(a,b,c,d),this.create_forwarder(e.mount_id,a);e=this.CreateInode();e.major=c;e.minor=d;e.uid=this.inodes[b].uid;e.gid=this.inodes[b].gid;e.qid.type=S_IFSOCK>>8;e.mode=this.inodes[b].mode&438;this.PushInode(e,b,a);return this.inodes.length-1}; FS.prototype.CreateSymlink=function(a,b,c){var d=this.inodes[b];if(this.is_forwarder(d))return b=d.foreign_id,a=this.follow_fs(d).CreateSymlink(a,b,c),this.create_forwarder(d.mount_id,a);d=this.CreateInode();d.uid=this.inodes[b].uid;d.gid=this.inodes[b].gid;d.qid.type=S_IFLNK>>8;d.symlink=c;d.mode=S_IFLNK;this.PushInode(d,b,a);return this.inodes.length-1}; FS.prototype.CreateTextFile=async function(a,b,c){var d=this.inodes[b];if(this.is_forwarder(d))return b=d.foreign_id,c=await this.follow_fs(d).CreateTextFile(a,b,c),this.create_forwarder(d.mount_id,c);d=this.CreateFile(a,b);b=this.inodes[d];a=new Uint8Array(c.length);b.size=c.length;for(b=0;bk)return k}var g=this.inodes[e],l=this.inodes[a];k=this.inodes[c];if(this.is_forwarder(l)||this.is_forwarder(k))if(this.is_forwarder(l)&&l.mount_id===k.mount_id){if(a=await this.follow_fs(l).Rename(l.foreign_id,b,k.foreign_id,d),0>a)return a}else{if(this.is_a_root(e))return dbg_log("XXX: Attempted to move mountpoint ("+ b+") - skipped",LOG_9P),-EPERM;if(!this.IsDirectory(e)&&1k)return k;await this.DeleteData(l);a=this.Unlink(a,b);if(0>a)return a}}else this.unlink_from_dir(a,b),this.link_under_dir(c,e,d),g.qid.version++;this.NotifyListeners(e,"rename",{oldpath:f});return 0}; FS.prototype.Write=async function(a,b,c,d){this.NotifyListeners(a,"write");var e=this.inodes[a];if(this.is_forwarder(e))a=e.foreign_id,await this.follow_fs(e).Write(a,b,c,d);else{var f=await this.get_buffer(a);!f||f.lengthb.nlinks&&message.Debug("Error in filesystem: negative nlinks="+b.nlinks+" at id ="+a);if(this.IsDirectory(a)){b=this.GetInode(a);this.IsDirectory(a)&&0>this.GetParent(a)&&message.Debug("Error in filesystem: negative parent id "+a);for(const [c,d]of b.direntries){0===c.length&&message.Debug("Error in filesystem: inode with no name and id "+d);for(const e of c)32>e&& message.Debug("Error in filesystem: Unallowed char in filename")}}}};FS.prototype.FillDirectory=function(a){var b=this.inodes[a];if(this.is_forwarder(b))this.follow_fs(b).FillDirectory(b.foreign_id);else{var c=0;for(const d of b.direntries.keys())c+=24+UTF8.UTF8Length(d);a=this.inodedata[a]=new Uint8Array(c);b.size=c;c=0;for(const [d,e]of b.direntries)b=this.GetInode(e),c+=marshall.Marshall(["Q","d","b","s"],[b.qid,c+13+8+1+2+UTF8.UTF8Length(d),b.mode>>12,d],a,c)}}; FS.prototype.RoundToDirentry=function(a,b){const c=this.inodedata[a];dbg_assert(c,`FS directory data for dirid=${a} should be generated`);dbg_assert(c.length,"FS directory should have at least an entry");if(b>=c.length)return c.length;for(a=0;;){const d=marshall.Unmarshall(["Q","d"],c,{offset:a})[1];if(d>b)break;a=d}return a};FS.prototype.IsDirectory=function(a){a=this.inodes[a];return this.is_forwarder(a)?this.follow_fs(a).IsDirectory(a.foreign_id):(a.mode&S_IFMT)===S_IFDIR}; FS.prototype.IsEmpty=function(a){a=this.inodes[a];if(this.is_forwarder(a))return this.follow_fs(a).IsDirectory(a.foreign_id);for(const b of a.direntries.keys())if("."!==b&&".."!==b)return!1;return!0};FS.prototype.GetChildren=function(a){dbg_assert(this.IsDirectory(a),"Filesystem: cannot get children of non-directory inode");a=this.inodes[a];if(this.is_forwarder(a))return this.follow_fs(a).GetChildren(a.foreign_id);const b=[];for(const c of a.direntries.keys())"."!==c&&".."!==c&&b.push(c);return b}; FS.prototype.GetParent=function(a){dbg_assert(this.IsDirectory(a),"Filesystem: cannot get parent of non-directory inode");a=this.inodes[a];if(this.should_be_linked(a))return a.direntries.get("..");{const b=this.follow_fs(a).GetParent(a.foreign_id);dbg_assert(-1!==b,"Filesystem: should not have invalid parent ids");return this.get_forwarder(a.mount_id,b)}}; FS.prototype.PrepareCAPs=function(a){a=this.GetInode(a);if(a.caps)return a.caps.length;a.caps=new Uint8Array(20);a.caps[0]=0;a.caps[1]=0;a.caps[2]=0;a.caps[3]=2;a.caps[4]=255;a.caps[5]=255;a.caps[6]=255;a.caps[7]=255;a.caps[8]=255;a.caps[9]=255;a.caps[10]=255;a.caps[11]=255;a.caps[12]=63;a.caps[13]=0;a.caps[14]=0;a.caps[15]=0;a.caps[16]=63;a.caps[17]=0;a.caps[18]=0;a.caps[19]=0;return a.caps.length};function FSMountInfo(a){this.fs=a;this.backtrack=new Map} FSMountInfo.prototype.get_state=function(){const a=[];a[0]=this.fs;a[1]=[...this.backtrack];return a};FSMountInfo.prototype.set_state=function(a){this.fs=a[0];this.backtrack=new Map(a[1])}; FS.prototype.set_forwarder=function(a,b,c){const d=this.inodes[a];dbg_assert(0===d.nlinks,"Filesystem: attempted to convert an inode into forwarder before unlinking the inode");this.is_forwarder(d)&&this.mounts[d.mount_id].backtrack.delete(d.foreign_id);d.status=STATUS_FORWARDING;d.mount_id=b;d.foreign_id=c;this.mounts[b].backtrack.set(c,a)};FS.prototype.create_forwarder=function(a,b){const c=this.CreateInode(),d=this.inodes.length;this.inodes.push(c);c.fid=d;this.set_forwarder(d,a,b);return d}; FS.prototype.is_forwarder=function(a){return a.status===STATUS_FORWARDING};FS.prototype.is_a_root=function(a){return 0===this.GetInode(a).fid};FS.prototype.get_forwarder=function(a,b){var c=this.mounts[a];dbg_assert(0<=b,"Filesystem get_forwarder: invalid foreign_id: "+b);dbg_assert(c,"Filesystem get_forwarder: invalid mount number: "+a);c=c.backtrack.get(b);return void 0===c?this.create_forwarder(a,b):c}; FS.prototype.delete_forwarder=function(a){dbg_assert(this.is_forwarder(a),"Filesystem delete_forwarder: expected forwarder");a.status=STATUS_INVALID;this.mounts[a.mount_id].backtrack.delete(a.foreign_id)};FS.prototype.follow_fs=function(a){const b=this.mounts[a.mount_id];dbg_assert(this.is_forwarder(a),"Filesystem follow_fs: inode should be a forwarding inode");dbg_assert(b,"Filesystem follow_fs: inode should point to valid mounted FS");return b.fs}; FS.prototype.Mount=function(a,b){dbg_assert(b.qidcounter===this.qidcounter,"Cannot mount filesystem whose qid numbers aren't synchronised with current filesystem.");var c=this.SearchPath(a);if(-1===c.parentid)return dbg_log("Mount failed: parent for path not found: "+a,LOG_9P),-ENOENT;if(-1!==c.id)return dbg_log("Mount failed: file already exists at path: "+a,LOG_9P),-EEXIST;if(c.forward_path)return a=this.inodes[c.parentid],c=this.follow_fs(a).Mount(c.forward_path,b),0>c?c:this.get_forwarder(a.mount_id, c);a=this.mounts.length;this.mounts.push(new FSMountInfo(b));b=this.create_forwarder(a,0);this.link_under_dir(c.parentid,b,c.name);return b};function FSLockRegion(){this.type=P9_LOCK_TYPE_UNLCK;this.start=0;this.length=Infinity;this.proc_id=-1;this.client_id=""}FSLockRegion.prototype.get_state=function(){const a=[];a[0]=this.type;a[1]=this.start;a[2]=Infinity===this.length?0:this.length;a[3]=this.proc_id;a[4]=this.client_id;return a}; FSLockRegion.prototype.set_state=function(a){this.type=a[0];this.start=a[1];this.length=0===a[2]?Infinity:a[2];this.proc_id=a[3];this.client_id=a[4]};FSLockRegion.prototype.clone=function(){const a=new FSLockRegion;a.set_state(this.get_state());return a}; FSLockRegion.prototype.conflicts_with=function(a){return this.proc_id===a.proc_id&&this.client_id===a.client_id||this.type===P9_LOCK_TYPE_UNLCK||a.type===P9_LOCK_TYPE_UNLCK||this.type!==P9_LOCK_TYPE_WRLCK&&a.type!==P9_LOCK_TYPE_WRLCK||this.start+this.length<=a.start||a.start+a.length<=this.start?!1:!0};FSLockRegion.prototype.is_alike=function(a){return a.proc_id===this.proc_id&&a.client_id===this.client_id&&a.type===this.type}; FSLockRegion.prototype.may_merge_after=function(a){return this.is_alike(a)&&a.start+a.length===this.start};FS.prototype.DescribeLock=function(a,b,c,d,e){dbg_assert(a===P9_LOCK_TYPE_RDLCK||a===P9_LOCK_TYPE_WRLCK||a===P9_LOCK_TYPE_UNLCK,"Filesystem: Invalid lock type: "+a);dbg_assert(0<=b,"Filesystem: Invalid negative lock starting offset: "+b);dbg_assert(0=f&&0=f&&(d.locks.splice(c,1),c--)}if(b.type!==P9_LOCK_TYPE_UNLCK){c=b;a=!1;for(e=0;e"."!==b&&".."!==b)};FS.prototype.read_file=function(a){a=this.SearchPath(a);if(-1===a.id)return Promise.resolve(null);const b=this.GetInode(a.id);return this.Read(a.id,0,b.size)};var VIRTIO_MAGIC_REG=0,VIRTIO_VERSION_REG=4,VIRTIO_DEVICE_REG=8,VIRTIO_VENDOR_REG=12,VIRTIO_HOSTFEATURES_REG=16,VIRTIO_HOSTFEATURESSEL_REG=20,VIRTIO_GUESTFEATURES_REG=32,VIRTIO_GUESTFEATURESSEL_REG=36,VIRTIO_GUEST_PAGE_SIZE_REG=40,VIRTIO_QUEUESEL_REG=48,VIRTIO_QUEUENUMMAX_REG=52,VIRTIO_QUEUENUM_REG=56,VIRTIO_QUEUEALIGN_REG=60,VIRTIO_QUEUEPFN_REG=64,VIRTIO_QUEUENOTIFY_REG=80,VIRTIO_INTERRUPTSTATUS_REG=96,VIRTIO_INTERRUPTACK_REG=100,VIRTIO_STATUS_REG=112,VRING_DESC_F_NEXT=1,VRING_DESC_F_WRITE=2,VRING_DESC_F_INDIRECT= 4;function hex8(a){return h(a)}var message={Debug:function(a){dbg_log([].slice.apply(arguments).join(" "),LOG_9P)},Abort:function(){if(DEBUG)throw Error("message.Abort()");}},LoadBinaryResource; LoadBinaryResource="undefined"!==typeof XMLHttpRequest?function(a,b,c){var d=new XMLHttpRequest;d.open("GET",a,!0);d.responseType="arraybuffer";d.onreadystatechange=function(){if(4==d.readyState)if(200!=d.status&&0!=d.status)c("Error: Could not load file "+a);else{var e=d.response;e?b(e):c("Error: No data received from: "+a)}};d.send(null)}:function(a,b,c){require("fs").readFile(a,function(d,e){d?c(d):b(e.buffer)})};var marshall={Marshall:function(a,b,c,d){for(var e,f=0,k=0;k>8&255;c[d++]=e>>16&255;c[d++]=e>>24&255;f+=4;break;case "d":c[d++]=e&255;c[d++]=e>>8&255;c[d++]=e>>16&255;c[d++]=e>>24&255;c[d++]=0;c[d++]=0;c[d++]=0;c[d++]=0;f+=8;break;case "h":c[d++]=e&255;c[d++]=e>>8;f+=2;break;case "b":c[d++]=e;f+=1;break;case "s":var g=d,l=0;c[d++]=0;c[d++]=0;f+=2;for(var m of e)UnicodeToUTF8Stream(m.charCodeAt(0)).forEach(function(n){c[d++]=n;f+=1;l++}); c[g+0]=l&255;c[g+1]=l>>8&255;break;case "Q":marshall.Marshall(["b","w","d"],[e.type,e.version,e.path],c,d);d+=13;f+=13;break;default:message.Debug("Marshall: Unknown type="+a[k])}return f},Unmarshall:function(a,b,c){let d=c.offset;for(var e=[],f=0;f>>0;e.push(k);break;case "d":k=b[d++];k+=b[d++]<<8;k+=b[d++]<<16;k+=b[d++]<<24>>>0;d+=4;e.push(k);break;case "h":k=b[d++];e.push(k+(b[d++]<<8));break;case "b":e.push(b[d++]); break;case "s":k=b[d++];k+=b[d++]<<8;for(var g="",l=new UTF8StreamToUnicode,m=0;m>>0;c.push(e); break;case "d":e=b();e+=b()<<8;e+=b()<<16;e+=b()<<24>>>0;b();b();b();b();c.push(e);break;case "h":e=b();c.push(e+(b()<<8));break;case "b":c.push(b());break;case "s":e=b();e+=b()<<8;for(var f="",k=new UTF8StreamToUnicode,g=0;g { this.app.openNewTab({ type: DemoTerminalTabComponent }) }) } provide (): ToolbarButton[] { return [ { icon: require('./icons/plus.svg'), title: 'New demo terminal', click: () => { this.app.openNewTab({ type: DemoTerminalTabComponent }) }, }, ] } } ================================================ FILE: tabby-web-demo/src/components/terminalTab.component.ts ================================================ import { Component, Injector } from '@angular/core' import { BaseTerminalProfile, BaseTerminalTabComponent } from 'tabby-terminal' import { Session } from '../session' // eslint-disable-next-line @typescript-eslint/no-type-alias type DemoProfile = BaseTerminalProfile /** @hidden */ @Component({ selector: 'demoTerminalTab', template: BaseTerminalTabComponent.template, styles: BaseTerminalTabComponent.styles, animations: BaseTerminalTabComponent.animations, }) export class DemoTerminalTabComponent extends BaseTerminalTabComponent { session: Session|null = null // eslint-disable-next-line @typescript-eslint/no-useless-constructor constructor ( injector: Injector, ) { super(injector) } ngOnInit (): void { this.logger = this.log.create('terminalTab') this.session = new Session(this.injector, this.logger) super.ngOnInit() } protected onFrontendReady (): void { this.initializeSession() super.onFrontendReady() } initializeSession (): void { this.session!.start() this.attachSessionHandlers(true) this.recoveryStateChangedHint.next() } ngOnDestroy (): void { super.ngOnDestroy() this.session?.destroy() } } ================================================ FILE: tabby-web-demo/src/index.ts ================================================ import { NgModule } from '@angular/core' // import { BrowserModule } from '@angular/platform-browser' import { FormsModule } from '@angular/forms' import { NgbModule } from '@ng-bootstrap/ng-bootstrap' import TabbyCorePlugin, { ProfileProvider, AppService } from 'tabby-core' import TabbyTerminalModule from 'tabby-terminal' import { DemoTerminalTabComponent } from './components/terminalTab.component' import { DemoProfilesService } from './profiles' /** @hidden */ @NgModule({ imports: [ // BrowserModule, FormsModule, NgbModule, TabbyCorePlugin, TabbyTerminalModule, ], providers: [ { provide: ProfileProvider, useClass: DemoProfilesService, multi: true }, ], declarations: [ DemoTerminalTabComponent, ], exports: [ DemoTerminalTabComponent, ], }) // eslint-disable-next-line @typescript-eslint/no-extraneous-class export default class DemoTerminalModule { constructor ( app: AppService, ) { app.ready$.subscribe(() => { app.openNewTab({ type: DemoTerminalTabComponent }) }) } } ================================================ FILE: tabby-web-demo/src/profiles.ts ================================================ import { Injectable } from '@angular/core' import { ProfileProvider, NewTabParameters, Profile, PartialProfile } from 'tabby-core' import { DemoTerminalTabComponent } from './components/terminalTab.component' @Injectable({ providedIn: 'root' }) export class DemoProfilesService extends ProfileProvider { id = 'demo' name = 'Demo' configDefaults = { options: {} } async getBuiltinProfiles (): Promise[]> { return [ { id: 'demo', type: 'demo', name: 'Demo VM terminal', icon: 'fas fa-microchip', isBuiltin: true, }, ] } async getNewTabParameters (_profile: Profile): Promise> { return { type: DemoTerminalTabComponent, } } getDescription (_profile: Profile): string { return '' } } ================================================ FILE: tabby-web-demo/src/session.ts ================================================ /* eslint-disable @typescript-eslint/no-empty-function */ import { Injector, NgZone } from '@angular/core' import * as path from 'path' import { BaseSession } from 'tabby-terminal' import { Logger } from 'tabby-core' const currentScript: any = document.currentScript export class Session extends BaseSession { private dataPath = window['tabbyWebDemoDataPath'] ?? currentScript.src + '../../../data' private vm: any private zone: NgZone static v86Loaded = false constructor ( injector: Injector, logger: Logger, ) { super(logger) this.zone = injector.get(NgZone) } async start (): Promise { this.open = true this.emitMessage('Hey\r\n') if (!Session.v86Loaded) { await new Promise(resolve => { const script = document.createElement('script') script.onload = () => { resolve() Session.v86Loaded = true } script.src = `${this.dataPath}/v86_all.js` document.querySelector('head')?.appendChild(script) }) } this.zone.runOutsideAngular(() => { this.vm = new window['V86Starter']({ bios: { url: `${this.dataPath}/bios.bin`, }, vga_bios: { url: `${this.dataPath}/vgabios.bin`, }, wasm_path: `${this.dataPath}/v86.wasm`, cdrom: { url: `${this.dataPath}/linux.iso`, }, initial_state: { url: `${this.dataPath}/v86state.bin`, }, autostart: true, disable_keyboard: true, disable_speaker: true, }) }) this.vm.add_listener('emulator-ready', () => { this.emitMessage('\r\nVM ready, booting\r\n') setTimeout(() => { this.emitMessage('[Yes, this is a real demo]\r\n') }, 2000) }) this.vm.add_listener('download-progress', (e) => { this.emitMessage(`\rDownloading ${path.basename(e.file_name)}: ${Math.floor(e.loaded / 1024)}/${Math.floor(e.total / 1024)} kB `) }) this.vm.add_listener('download-error', (e) => { this.emitMessage(`\r\nDownload error: ${e}\r\n`) }) this.vm.add_listener('serial0-output-char', char => { this.emitOutput(Buffer.from(char)) }) } resize (_columns: number, _rows: number): void { } write (data: Buffer): void { this.vm.serial0_send(data.toString()) } kill (_signal?: string): void { } emitMessage (msg: string): void { this.emitOutput(Buffer.from(msg)) } async gracefullyKillProcess (): Promise { } supportsWorkingDirectory (): boolean { return false } async getWorkingDirectory (): Promise { return null } } ================================================ FILE: tabby-web-demo/tsconfig.json ================================================ { "extends": "../tsconfig.json", "exclude": ["node_modules", "dist", "typings"], "compilerOptions": { "baseUrl": "src" } } ================================================ FILE: tabby-web-demo/webpack.config.mjs ================================================ import * as path from 'path' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) import config from '../webpack.plugin.config.mjs' export default () => config({ name: 'web-demo', dirname: __dirname, }) ================================================ FILE: tsconfig.json ================================================ { "compilerOptions": { "module": "es2015", "target": "es2016", "moduleResolution": "node", "noImplicitAny": false, "removeComments": false, "emitDeclarationOnly": false, "emitDecoratorMetadata": true, "experimentalDecorators": true, "sourceMap": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, "noUnusedLocals": true, "skipLibCheck": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, "importHelpers": true, "strictNullChecks": true, "lib": [ "DOM", "ES5", "ES6", "ES7", "ES2015", "ES2017", "ES2019", "ES2021" ], "paths": { "*": [ "../node_modules/*", "../../app/node_modules/*", "./app/node_modules/*" ], "tabby-*": ["../../tabby-*/src"], } }, "typeAcquisition": { "include": [ "../node_modules", "../../app/node_modules" ] }, "angularCompilerOptions": { "strictTemplates": true, "enableResourceInlining": true, "strictInjectionParameters": true, }, } ================================================ FILE: typedoc.mjs ================================================ module.exports = { excludePrivate: true, excludeExternals: true } ================================================ FILE: web/entry.preload.ts ================================================ import 'source-sans-pro/source-sans-pro.css' import 'source-code-pro/source-code-pro.css' import '@fortawesome/fontawesome-free/css/solid.css' import '@fortawesome/fontawesome-free/css/brands.css' import '@fortawesome/fontawesome-free/css/regular.css' import '@fortawesome/fontawesome-free/css/fontawesome.css' import '../app/src/preload.scss' // Required before other imports import './polyfills.buffer' const mocks = {} const modules = {} const customRequire = path => { if (mocks[path]) { console.log(':: mock', path) return mocks[path] } if (modules[path]) { return modules[path] } throw new Error(`Attempted to require ${path}`) } customRequire['resolve'] = (() => null) as any customRequire['main'] = { paths: [], } async function webRequire (url) { console.log(`>> Loading ${url}`) const e = document.createElement('script') window['module'] = { exports: {} } as any window['exports'] = window['module'].exports await new Promise(resolve => { e.onload = resolve e.src = url document.querySelector('head').appendChild(e) }) return window['module'].exports } async function prefetchURL (url) { console.log(`:: Prefetching ${url}`) await (await fetch(url)).text() } const Tabby = { registerMock: (name, mod) => { mocks[name] = mod }, registerModule: (name, mod) => { modules[name] = mod }, resolvePluginInfo: async (url): Promise => { const pkg = await (await fetch(url + '/package.json')).json() url += '/' + pkg.main return { ...pkg, url } }, registerPluginModule: (packageName, module) => { Tabby.registerModule(`resources/builtin-plugins/${packageName}`, module) Tabby.registerModule(packageName, module) }, loadPlugin: async (url) => { const info = await Tabby.resolvePluginInfo(url) const module = await webRequire(info.url) Tabby.registerPluginModule(info.name, module) return module }, loadPlugins: async (urls, progressCallback) => { const infos: any[] = await Promise.all(urls.map(Tabby.resolvePluginInfo)) progressCallback?.(0, 1) await Promise.all(infos.map(x => prefetchURL(x.url))) const pluginModules = [] for (const info of infos) { const module = await webRequire(info.url) Tabby.registerPluginModule(info.name, module) pluginModules.push(module) progressCallback?.(infos.indexOf(info), infos.length) } progressCallback?.(1, 1) return pluginModules }, bootstrap: (...args) => window['bootstrapTabby'](...args), webRequire, } Object.assign(window, { require: customRequire, module: { paths: [], }, Tabby, __filename: '', __dirname: '', process: { env: { }, argv: ['tabby'], platform: 'darwin', on: () => null, stdout: {}, stderr: {}, resourcesPath: 'resources', version: '14.0.0', versions: { modules: 0, }, nextTick: (f, ...args) => setTimeout(() => f(...args)), cwd: () => '/', }, global: window, }) ================================================ FILE: web/entry.ts ================================================ import './polyfills' import 'zone.js' import 'core-js/proposals/reflect-metadata' import 'core-js/features/array/flat' import 'rxjs' import '../app/src/global.scss' import '../app/src/toastr.scss' import { enableProdMode, NgModuleRef, ApplicationRef } from '@angular/core' import { enableDebugTools } from '@angular/platform-browser' import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' import { getRootModule } from '../app/src/app.module' import { BootstrapData, BOOTSTRAP_DATA } from '../tabby-core/src/api/mainProcess' interface BootstrapOptions { packageModules: any[] bootstrapData: BootstrapData debugMode: boolean connector: any } window['bootstrapTabby'] = async function bootstrap (options: BootstrapOptions): Promise> { window.parent.postMessage('request-connector', '*') const pluginModules = [] for (const packageModule of options.packageModules) { if (!packageModule.default) { continue } const pluginModule = packageModule.default.forRoot ? packageModule.default.forRoot() : packageModule.default pluginModule.pluginName = packageModule.pluginName pluginModule.bootstrap = packageModule.bootstrap pluginModules.push(pluginModule) } if (!options.debugMode) { enableProdMode() } const module = getRootModule(pluginModules) window['rootModule'] = module const moduleRef = await platformBrowserDynamic([ { provide: BOOTSTRAP_DATA, useValue: options.bootstrapData }, { provide: 'WEB_CONNECTOR', useValue: options.connector }, ]).bootstrapModule(module) if (options.debugMode) { const applicationRef = moduleRef.injector.get(ApplicationRef) const componentRef = applicationRef.components[0] enableDebugTools(componentRef) } return moduleRef } ================================================ FILE: web/package.json ================================================ { "name": "tabby-web-container", "devDependencies": { "assert": "1.5.0", "browserify-zlib": "^0.2.0", "buffer": "^6.0.3", "constants-browserify": "^1.0.0", "crypto-browserify": "^3.12.0", "deepmerge": "^4.2.2", "events": "^3.3.0", "patch-package": "^6.4.7", "path-browserify": "^1.0.1", "readline-browserify": "^0.0.4", "stream-browserify": "^3.0.0", "url": "^0.11.0" }, "resolutions": { "**/util": "^0.12.0" }, "scripts": { "prepare": "patch-package" }, "version": "1.0.231-nightly.0" } ================================================ FILE: web/patches/browserify-sign+4.2.1.patch ================================================ diff --git a/node_modules/browserify-sign/browser/index.js b/node_modules/browserify-sign/browser/index.js index e6df44c..641e18e 100644 --- a/node_modules/browserify-sign/browser/index.js +++ b/node_modules/browserify-sign/browser/index.js @@ -11,6 +11,8 @@ Object.keys(algorithms).forEach(function (key) { algorithms[key.toLowerCase()] = algorithms[key] }) +algorithms['sha1'] = algorithms['RSA-SHA1'] + function Sign (algorithm) { stream.Writable.call(this) ================================================ FILE: web/polyfills.buffer.ts ================================================ /* eslint-disable @typescript-eslint/no-unnecessary-condition */ /* eslint-disable @typescript-eslint/init-declarations */ /* eslint-disable prefer-spread */ /* eslint-disable @typescript-eslint/no-invalid-this */ /* eslint-disable @typescript-eslint/no-use-before-define */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ // Based on http://stackoverflow.com/a/22747272/680742, the browser with // the lowest limit is Chrome, with 0x10000 args. // We go 1 magnitude less, for safety const MAX_ARGUMENTS_LENGTH = 0x1000 const base64 = require('base64-js') function blitBuffer (src, dst, offset, length) { let i for (i = 0; i < length; ++i) { if (i + offset >= dst.length || i >= src.length) {break} dst[i + offset] = src[i] } return i } export function utf8Write (string, offset, length) { return blitBuffer(utf8ToBytes(string, this.length - offset), this, offset, length) } export function base64Slice (start, end) { if (start === 0 && end === this.length) { return base64.fromByteArray(this) } else { return base64.fromByteArray(this.slice(start, end)) } } function decodeCodePointsArray (codePoints) { const len = codePoints.length if (len <= MAX_ARGUMENTS_LENGTH) { return String.fromCharCode.apply(String, codePoints) // avoid extra slice() } // Decode in chunks to avoid "call stack size exceeded". let res = '' let i = 0 while (i < len) { res += String.fromCharCode.apply( String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) ) } return res } export function latin1Slice (start, end) { let ret = '' end = Math.min(this.length, end) for (let i = start; i < end; ++i) { ret += String.fromCharCode(this[i]) } return ret } export function utf8Slice (this, start, end) { end = Math.min(this.length, end) const res: number[] = [] let i = start while (i < end) { const firstByte = this[i] let codePoint: number|null = null let bytesPerSequence = firstByte > 0xEF ? 4 : firstByte > 0xDF ? 3 : firstByte > 0xBF ? 2 : 1 if (i + bytesPerSequence <= end) { let secondByte, thirdByte, fourthByte, tempCodePoint switch (bytesPerSequence) { case 1: if (firstByte < 0x80) { codePoint = firstByte } break case 2: secondByte = this[i + 1] if ((secondByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0x1F) << 0x6 | secondByte & 0x3F if (tempCodePoint > 0x7F) { codePoint = tempCodePoint } } break case 3: secondByte = this[i + 1] thirdByte = this[i + 2] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | thirdByte & 0x3F if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { codePoint = tempCodePoint } } break case 4: secondByte = this[i + 1] thirdByte = this[i + 2] fourthByte = this[i + 3] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | fourthByte & 0x3F if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { codePoint = tempCodePoint } } } } if (codePoint === null) { // we did not generate a valid codePoint so insert a // replacement char (U+FFFD) and advance only 1 byte codePoint = 0xFFFD bytesPerSequence = 1 } else if (codePoint > 0xFFFF) { // encode to utf16 (surrogate pair dance) codePoint -= 0x10000 res.push(codePoint >>> 10 & 0x3FF | 0xD800) codePoint = 0xDC00 | codePoint & 0x3FF } res.push(codePoint) i += bytesPerSequence } return decodeCodePointsArray(res) } function utf8ToBytes (string, units) { units = units || Infinity let codePoint const length = string.length let leadSurrogate = null const bytes: number[] = [] for (let i = 0; i < length; ++i) { codePoint = string.charCodeAt(i) // is surrogate component if (codePoint > 0xD7FF && codePoint < 0xE000) { // last char was a lead if (!leadSurrogate) { // no lead yet if (codePoint > 0xDBFF) { // unexpected trail if ((units -= 3) > -1) {bytes.push(0xEF, 0xBF, 0xBD)} continue } else if (i + 1 === length) { // unpaired lead if ((units -= 3) > -1) {bytes.push(0xEF, 0xBF, 0xBD)} continue } // valid lead leadSurrogate = codePoint continue } // 2 leads in a row if (codePoint < 0xDC00) { if ((units -= 3) > -1) {bytes.push(0xEF, 0xBF, 0xBD)} leadSurrogate = codePoint continue } // valid surrogate pair codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 } else if (leadSurrogate) { // valid bmp char, but last char was a lead if ((units -= 3) > -1) {bytes.push(0xEF, 0xBF, 0xBD)} } leadSurrogate = null // encode utf8 if (codePoint < 0x80) { if ((units -= 1) < 0) {break} bytes.push(codePoint) } else if (codePoint < 0x800) { if ((units -= 2) < 0) {break} bytes.push( codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x10000) { if ((units -= 3) < 0) {break} bytes.push( codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x110000) { if ((units -= 4) < 0) {break} bytes.push( codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else { throw new Error('Invalid code point') } } return bytes } // Create lookup table for `toString('hex')` // See: https://github.com/feross/buffer/issues/219 const hexSliceLookupTable = (function () { const alphabet = '0123456789abcdef' const table = new Array(256) for (let i = 0; i < 16; ++i) { const i16 = i * 16 for (let j = 0; j < 16; ++j) { table[i16 + j] = alphabet[i] + alphabet[j] } } return table })() export function hexSlice (start, end) { const len = this.length if (!start || start < 0) {start = 0} if (!end || end < 0 || end > len) {end = len} let out = '' for (let i = start; i < end; ++i) { out += hexSliceLookupTable[this[i]] } return out } import { Buffer } from 'buffer' Buffer.prototype['latin1Slice'] = latin1Slice Buffer.prototype['utf8Slice'] = utf8Slice Buffer.prototype['base64Slice'] = base64Slice Buffer.prototype['utf8Write'] = utf8Write Buffer.prototype['hexSlice'] = hexSlice window['Buffer'] = Buffer ================================================ FILE: web/polyfills.ts ================================================ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/no-empty-function */ /* eslint-disable @typescript-eslint/no-extraneous-class */ import './polyfills.buffer' import { Duplex } from 'stream-browserify' const Tabby = window['Tabby'] export class SocketProxy extends Duplex { socket: any constructor (...args: any[]) { super({ allowHalfOpen: false, }) this.socket = window['__connector__'].createSocket(...args) this.socket.connect$.subscribe(() => this['emit']('connect')) this.socket.data$.subscribe(data => this['emit']('data', Buffer.from(data))) this.socket.error$.subscribe(error => this['emit']('error', error)) } connect (...args: any[]) { this.socket.connect(...args) } setNoDelay () { } setTimeout () { } _read (_size: number): void { } _write (chunk: Buffer, _encoding: string, callback: (error?: Error | null) => void): void { this.socket.write(chunk) callback() } _destroy (error: Error|null, callback: (error: Error|null) => void): void { this.socket.close(error) callback(error) } } Tabby.registerMock('fs', { rmdirSync: () => null, realpathSync: () => null, readdir: () => null, stat: () => null, appendFile: () => null, constants: {}, }) Tabby.registerMock('fs/promises', {}) Tabby.registerMock('tls', {}) Tabby.registerMock('module', { globalPaths: [], prototype: { require: window['require'] }, }) Tabby.registerMock('http', { Agent: class {}, request: {}, }) Tabby.registerMock('https', { Agent: class {}, request: {}, }) Tabby.registerMock('querystring', {}) Tabby.registerMock('tty', { isatty: () => false }) Tabby.registerMock('child_process', {}) Tabby.registerMock('readable-stream', {}) Tabby.registerMock('os', { arch: () => 'web', platform: () => 'web', homedir: () => '/home', tmpdir: () => '/tmp', constants: { errno: {}, }, }) Tabby.registerModule('buffer', { Buffer: window['Buffer'], }) Tabby.registerModule('crypto', { ...require('crypto-browserify'), getHashes () { return ['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'md5', 'rmd160'] }, timingSafeEqual (a, b) { return a.equals(b) }, }) Tabby.registerMock('dns', {}) Tabby.registerMock('@luminati-io/socksv5', {}) Tabby.registerMock('util', require('util/')) Tabby.registerMock('keytar', { getPassword: () => null, }) Tabby.registerMock('@serialport/bindings', {}) Tabby.registerMock('@serialport/bindings-cpp', {}) Tabby.registerMock('tmp', {}) Tabby.registerModule('net', { Socket: SocketProxy, }) Tabby.registerModule('events', require('events')) Tabby.registerModule('path', require('path-browserify')) Tabby.registerModule('url', { ...require('url'), pathToFileURL: x => `file://${x}`, }) Tabby.registerModule('zlib', { ...require('browserify-zlib'), constants: require('browserify-zlib'), }) Tabby.registerModule('assert', Object.assign( require('assert'), { assertNotStrictEqual: () => true, notStrictEqual: () => true, }, )) Tabby.registerModule('constants', require('constants-browserify')) Tabby.registerModule('stream', require('stream-browserify')) Tabby.registerModule('readline', { ...require('readline-browserify'), cursorTo: () => null, clearLine: stream => stream.write('\r'), }) Tabby.registerModule('@angular/core', require('@angular/core')) Tabby.registerModule('@angular/cdk', require('@angular/cdk')) Tabby.registerModule('@angular/cdk/clipboard', require('@angular/cdk/clipboard')) Tabby.registerModule('@angular/cdk/drag-drop', require('@angular/cdk/drag-drop')) Tabby.registerModule('@angular/compiler', require('@angular/compiler')) Tabby.registerModule('@angular/common', require('@angular/common')) Tabby.registerModule('@angular/forms', require('@angular/forms')) Tabby.registerModule('@angular/platform-browser', require('@angular/platform-browser')) Tabby.registerModule('@angular/platform-browser/animations', require('@angular/platform-browser/animations')) Tabby.registerModule('@angular/platform-browser-dynamic', require('@angular/platform-browser-dynamic')) Tabby.registerModule('@angular/animations', require('@angular/animations')) Tabby.registerModule('@angular/localize', require('@angular/localize')) Tabby.registerModule('@angular/localize/init', require('@angular/localize/init')) Tabby.registerModule('@ng-bootstrap/ng-bootstrap', require('@ng-bootstrap/ng-bootstrap')) Tabby.registerModule('ngx-toastr', require('ngx-toastr')) Tabby.registerModule('deepmerge', require('deepmerge')) Tabby.registerModule('rxjs', require('rxjs')) Tabby.registerModule('rxjs/operators', require('rxjs')) Tabby.registerModule('string_decoder', require('string_decoder')) Tabby.registerModule('js-yaml', require('js-yaml')) Tabby.registerModule('zone.js/dist/zone.js', require('zone.js')) Tabby.registerModule('zone.js', require('zone.js')) Tabby.registerModule('any-promise', require('any-promise')) Object.assign(window, { __dirname: '__dirname', setImmediate: setTimeout as any, }) process.addListener = () => null ================================================ FILE: web/tsconfig.json ================================================ { "compilerOptions": { "baseUrl": "./src", "module": "commonjs", "target": "es2015", "declaration": false, "noImplicitAny": false, "removeComments": false, "emitDecoratorMetadata": true, "experimentalDecorators": true, "sourceMap": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, "noUnusedParameters": true, "noUnusedLocals": true, "lib": [ "dom", "es2015", "es2015.iterable", "es2017", "es2019", "es7" ], "paths": { "*": ["../../app/node_modules/*"] } }, "compileOnSave": false, "exclude": [ "dist", "node_modules", "*/node_modules", "tabby*", "platforms" ] } ================================================ FILE: web/webpack.config.mjs ================================================ import * as path from 'path' import * as url from 'url' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) const externals = {} for (const key of [ 'child_process', 'crypto', 'dns', 'fs', 'http', 'https', 'net', 'path', 'querystring', 'tls', 'tty', 'zlib', '../build/Release/cpufeatures.node', './crypto/build/Release/sshcrypto.node', ]) { externals[key] = `commonjs ${key}` } const config = { name: 'tabby-web-entry', target: 'web', entry: { preload: path.resolve(__dirname, 'entry.preload.ts'), bundle: path.resolve(__dirname, 'entry.ts'), }, mode: process.env.TABBY_DEV ? 'development' : 'production', optimization:{ minimize: false, }, context: __dirname, devtool: 'source-map', output: { path: path.join(__dirname, 'dist'), pathinfo: true, filename: '[name].js', publicPath: 'auto', }, resolve: { modules: ['../app/node_modules', 'node_modules', '../node_modules', '../app/assets/'].map(x => path.join(__dirname, x)), extensions: ['.ts', '.js'], fallback: { stream: path.join(__dirname, 'node_modules/stream-browserify/index.js'), assert: path.join(__dirname, 'node_modules/assert/assert.js'), constants: path.join(__dirname, 'node_modules/constants-browserify/constants.json'), util: path.join(__dirname, 'node_modules/util/util.js'), }, }, module: { rules: [ { test: /\.ts$/, use: { loader: 'ts-loader', options: { configFile: path.resolve(__dirname, 'tsconfig.json'), }, }, }, { test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] }, { test: /\.css$/, use: ['style-loader', 'css-loader', 'sass-loader'] }, { test: /\.(png|svg|ttf|eot|otf|woff|woff2)(\?v=[0-9]\.[0-9]\.[0-9])?$/, type: 'asset', }, ], }, externals, } export default () => config ================================================ FILE: webpack.config.mjs ================================================ import log from 'npmlog' import { builtinPlugins } from './scripts/vars.mjs' const paths = [ './app/webpack.config.mjs', './app/webpack.config.main.mjs', // './web/webpack.config.mjs', // './tabby-web-demo/webpack.config.mjs', ...builtinPlugins.map(x => `./${x}/webpack.config.mjs`), ] paths.forEach(x => log.info(`Using config: ${x}`)) export default () => Promise.all(paths.map(x => import(x).then(x => x.default()))) ================================================ FILE: webpack.plugin.config.mjs ================================================ import * as fs from 'fs' import * as path from 'path' import wp from 'webpack' import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer' import { AngularWebpackPlugin } from '@ngtools/webpack' const bundleAnalyzer = new BundleAnalyzerPlugin({ analyzerPort: 0, }) import { createEs2015LinkerPlugin } from '@angular/compiler-cli/linker/babel' const linkerPlugin = createEs2015LinkerPlugin({ linkerJitMode: true, fileSystem: { resolve: path.resolve, exists: fs.existsSync, dirname: path.dirname, relative: path.relative, readFile: fs.readFileSync, }, }) export default options => { const sourceMapOptions = { exclude: [/node_modules/, /vendor/], filename: '[file].map', moduleFilenameTemplate: `webpack-tabby-${options.name}:///[resource-path]`, } let devtoolPlugin = wp.SourceMapDevToolPlugin if (process.env.CI) { sourceMapOptions.append = '\n//# sourceMappingURL=../../../app.asar.unpacked/assets/webpack/[url]' } if ((process.platform === 'win32' || process.platform === 'linux') && process.env.TABBY_DEV) { devtoolPlugin = wp.EvalSourceMapDevToolPlugin } const isDev = !!process.env.TABBY_DEV const config = { target: 'node', entry: 'src/index.ts', context: options.dirname, devtool: false, output: { path: path.resolve(options.dirname, 'dist'), filename: 'index.js', pathinfo: true, libraryTarget: 'umd', publicPath: 'auto', }, mode: isDev ? 'development' : 'production', optimization:{ minimize: false, }, cache: !isDev ? false : { type: 'filesystem', cacheDirectory: path.resolve(options.dirname, 'node_modules', '.webpack-cache'), }, resolve: { alias: options.alias ?? {}, modules: ['.', 'src', 'node_modules', '../app/node_modules', '../node_modules'].map(x => path.join(options.dirname, x)), extensions: ['.ts', '.js'], mainFields: ['esm2015', 'browser', 'module', 'main'], }, ignoreWarnings: [/Failed to parse source map/], module: { rules: [ ...options.rules ?? [], { test: /\.js$/, enforce: 'pre', use: { loader: 'source-map-loader', options: { filterSourceMappingUrl: (url, resourcePath) => { if (/node_modules/.test(resourcePath) && !resourcePath.includes('xterm')) { return false } return true }, }, }, }, { test: /\.(m?)js$/, loader: 'babel-loader', options: { plugins: [linkerPlugin], compact: false, cacheDirectory: true, }, resolve: { fullySpecified: false, }, }, { test: /\.ts$/, use: [ { loader: '@ngtools/webpack', }, ], }, { test: /\.pug$/, use: [ 'apply-loader', { loader: 'pug-loader', options: { pretty: true, }, }, ], }, { test: /\.scss$/, use: ['@tabby-gang/to-string-loader', 'css-loader', 'sass-loader'], include: /(theme.*|component)\.scss/ }, { test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'], exclude: /(theme.*|component)\.scss/ }, { test: /\.css$/, use: ['@tabby-gang/to-string-loader', 'css-loader'], include: /component\.css/ }, { test: /\.css$/, use: ['style-loader', 'css-loader'], exclude: /component\.css/ }, { test: /\.yaml$/, use: ['yaml-loader'] }, { test: /\.svg/, use: ['svg-inline-loader'] }, { test: /\.(eot|otf|woff|woff2|ogg)(\?v=[0-9]\.[0-9]\.[0-9])?$/, type: 'asset', }, { test: /\.ttf$/, type: 'asset/inline', }, { test: /\.po$/, use: [ { loader: 'json-loader' }, { loader: 'po-gettext-loader' }, ], }, ], }, externals: [ '@electron/remote', '@serialport/bindings', '@serialport/bindings-cpp', 'any-promise', 'child_process', 'electron-promise-ipc', 'electron-updater', 'electron', 'fontmanager-redux', 'fs', 'keytar', 'macos-native-processlist', 'native-process-working-directory', 'net', 'ngx-toastr', 'os', 'path', 'readline', 'russh', '@luminati-io/socksv5', 'stream', 'windows-native-registry', '@tabby-gang/windows-process-tree', '@tabby-gang/windows-process-tree/build/Release/windows_process_tree.node', /^@angular(?!\/common\/locales)/, /^@ng-bootstrap/, /^rxjs/, /^tabby-/, ...options.externals || [], ], plugins: [ new devtoolPlugin(sourceMapOptions), new AngularWebpackPlugin({ tsconfig: path.resolve(options.dirname, 'tsconfig.json'), directTemplateLoading: false, jitMode: true, }) ], } if (process.env.PLUGIN_BUNDLE_ANALYZER === options.name) { config.plugins.push(bundleAnalyzer) config.cache = false } return config }