From 6dd3e67be40d99930480ad4a9fbff2970c21d841 Mon Sep 17 00:00:00 2001 From: Aixzk Date: Wed, 5 Jan 2022 23:18:24 +0800 Subject: [PATCH] v1.0.170 --- .github/FUNDING.yml | 3 - .github/ISSUE_TEMPLATE/feature_request.md | 20 -- .github/ISSUE_TEMPLATE/issue-report.md | 23 -- .github/dependabot.yml | 74 ------ .github/stale.yml | 18 -- .github/workflows/build.yml | 60 ----- .github/workflows/codeql-analysis.yml | 70 ------ .github/workflows/docs.yml | 38 --- .github/workflows/release.yml | 19 -- README.ko-KR.md | 217 ------------------ README.md | 177 ++++++++------ .../components/renameTabModal.component.pug | 4 +- .../components/safeModeModal.component.pug | 4 +- .../components/selectorModal.component.pug | 2 +- .../src/components/startPage.component.pug | 7 +- .../components/unlockVaultModal.component.pug | 8 +- .../src/components/welcomeTab.component.pug | 12 +- tabby-core/src/hotkeys.ts | 94 ++++---- tabby-core/src/services/homeBase.service.ts | 4 + tabby-core/src/tabContextMenu.ts | 40 ++-- tabby-core/src/utils.ts | 14 +- tabby-electron/src/hotkeys.ts | 4 +- tabby-electron/src/sftpContextMenu.ts | 2 +- tabby-linkifier/src/decorator.ts | 4 +- tabby-local/src/buttonProvider.ts | 2 +- .../commandLineEditor.component.pug | 8 +- .../environmentEditor.component.pug | 8 +- .../localProfileSettings.component.pug | 6 +- .../components/shellSettingsTab.component.pug | 8 +- .../src/components/terminalTab.component.ts | 4 +- tabby-local/src/hotkeys.ts | 2 +- tabby-local/src/session.ts | 2 +- tabby-local/src/tabContextMenu.ts | 16 +- .../pluginsSettingsTab.component.pug | 32 +-- tabby-plugin-manager/src/settings.ts | 2 +- .../serialProfileSettings.component.pug | 24 +- .../src/components/serialTab.component.pug | 4 +- tabby-serial/src/hotkeys.ts | 4 +- tabby-serial/src/profiles.ts | 4 +- .../configSyncSettingsTab.component.pug | 36 +-- .../configSyncSettingsTab.component.ts | 12 +- .../components/editProfileModal.component.pug | 18 +- .../components/hotkeyInputModal.component.pug | 4 +- .../hotkeySettingsTab.component.pug | 2 +- .../components/multiHotkeyInput.component.pug | 2 +- .../profilesSettingsTab.component.pug | 22 +- .../profilesSettingsTab.component.ts | 16 +- .../setVaultPassphraseModal.component.pug | 10 +- .../src/components/settingsTab.component.pug | 64 +++--- .../components/vaultSettingsTab.component.pug | 34 +-- .../components/vaultSettingsTab.component.ts | 4 +- .../windowSettingsTab.component.pug | 86 +++---- tabby-settings/src/settings.ts | 10 +- ...keyboardInteractiveAuthPanel.component.pug | 6 +- .../components/sftpDeleteModal.component.pug | 4 +- .../src/components/sftpPanel.component.pug | 8 +- .../sshPortForwardingConfig.component.pug | 20 +- .../sshPortForwardingModal.component.pug | 2 +- .../sshProfileSettings.component.pug | 78 +++---- .../components/sshSettingsTab.component.pug | 14 +- tabby-ssh/src/components/sshTab.component.pug | 8 +- tabby-ssh/src/components/sshTab.component.ts | 16 +- tabby-ssh/src/hotkeys.ts | 4 +- tabby-ssh/src/session/forwards.ts | 2 +- tabby-ssh/src/session/shell.ts | 2 +- tabby-ssh/src/session/ssh.ts | 6 +- tabby-ssh/src/sftpContextMenu.ts | 6 +- tabby-ssh/src/tabContextMenu.ts | 4 +- .../telnetProfileSettings.component.pug | 8 +- .../src/components/telnetTab.component.pug | 2 +- .../src/components/telnetTab.component.ts | 4 +- tabby-telnet/src/hotkeys.ts | 2 +- tabby-telnet/src/session.ts | 6 +- .../appearanceSettingsTab.component.pug | 26 +-- .../components/baseTerminalTab.component.pug | 4 +- .../colorSchemeSettingsTab.component.pug | 14 +- .../colorSchemeSettingsTab.component.ts | 4 +- .../loginScriptsSettings.component.ts | 4 +- .../src/components/searchPanel.component.ts | 4 +- .../streamProcessingSettings.component.pug | 8 +- .../terminalSettingsTab.component.pug | 70 +++--- tabby-terminal/src/features/zmodem.ts | 14 +- tabby-terminal/src/hotkeys.ts | 32 +-- tabby-terminal/src/settings.ts | 6 +- tabby-terminal/src/tabContextMenu.ts | 8 +- 85 files changed, 635 insertions(+), 1125 deletions(-) delete mode 100644 .github/FUNDING.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 .github/ISSUE_TEMPLATE/issue-report.md delete mode 100644 .github/dependabot.yml delete mode 100644 .github/stale.yml delete mode 100644 .github/workflows/codeql-analysis.yml delete mode 100644 .github/workflows/docs.yml delete mode 100644 .github/workflows/release.yml delete mode 100644 README.ko-KR.md diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index c236b04..0000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -github: eugeny -open_collective: tabby -ko_fi: eugeny diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index bbcbbe7..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -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. diff --git a/.github/ISSUE_TEMPLATE/issue-report.md b/.github/ISSUE_TEMPLATE/issue-report.md deleted file mode 100644 index d91310e..0000000 --- a/.github/ISSUE_TEMPLATE/issue-report.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -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] diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index cfc41b1..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,74 +0,0 @@ -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 diff --git a/.github/stale.yml b/.github/stale.yml deleted file mode 100644 index a43af26..0000000 --- a/.github/stale.yml +++ /dev/null @@ -1,18 +0,0 @@ -# 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 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 07ee4ef..0b5892f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -80,35 +80,12 @@ jobs: - run: sed -i '' 's/updateInfo = await/\/\/updateInfo = await/g' node_modules/app-builder-lib/out/targets/ArchiveTarget.js - - name: Build and sign packages - run: scripts/build-macos.js - if: github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')) - env: - ARCH: ${{matrix.arch}} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CSC_LINK: ${{ secrets.CSC_LINK }} - CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} - 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.js - if: "! (github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || 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.js - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - SENTRY_ORG: ${{ secrets.SENTRY_ORG }} - SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} - - name: Package artifacts run: | mkdir artifact-pkg @@ -173,24 +150,6 @@ jobs: - name: Build web resources run: zsh -c 'tar czf tabby-web.tar.gz (tabby-*|web)/dist' - - name: Upload symbols - run: | - sudo npm install -g @sentry/cli --unsafe-perm - ./scripts/sentry-upload.js - 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: Eugeny/packagecloud-action@main - if: github.repository == 'Eugeny/tabby' && github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') - env: - PACKAGECLOUD_TOKEN: ${{ secrets.PACKAGECLOUD_TOKEN }} - with: - repo: 'eugeny/tabby' - dir: 'dist' - - name: Package artifacts run: | mkdir artifact-deb @@ -271,27 +230,8 @@ jobs: yarn run build node scripts/prepackage-plugins.js - - name: Build and sign packages - run: node scripts/build-windows.js - if: github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')) - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }} - WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }} - DEBUG: electron-builder,electron-builder:* - - name: Build packages without signing run: node scripts/build-windows.js - if: "!(github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')))" - - - name: Upload symbols - run: | - npm install @sentry/cli - node scripts/sentry-upload.js - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - SENTRY_ORG: ${{ secrets.SENTRY_ORG }} - SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} - name: Package artifacts run: | diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index ba151cb..0000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,70 +0,0 @@ -# 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@v2 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - 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@v1 - - # ℹ️ 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@v1 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml deleted file mode 100644 index 7f20cb7..0000000 --- a/.github/workflows/docs.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Docs -on: push -jobs: - build: - runs-on: ubuntu-latest - if: ${{ github.actor != 'dependabot[bot]' }} - - steps: - - name: Checkout - uses: actions/checkout@v2.3.4 - with: - fetch-depth: 0 - - - name: Installing Node - uses: actions/setup-node@v2.5.1 - with: - node-version: 14 - - - name: Build - run: | - 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 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 56ee5fd..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -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 diff --git a/README.ko-KR.md b/README.ko-KR.md deleted file mode 100644 index a5955a3..0000000 --- a/README.ko-KR.md +++ /dev/null @@ -1,217 +0,0 @@ -[![](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) - ----- - -**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 V220 터미널 + 다양한 확장 -* 여러 개의 분할 창 중첩 -* 모든 측면에 탭이 위치함 -* 전역 스폰 단축키가 있는 도킹 가능한 윈도우 ("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) - m터미널의 경로 및 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의 탭에서 선택한 텍스트로 기본 시스템 브라우저를 엽니다 - - -# 테마 - -* [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

💻

Austin Warren

💻

Felicia Hummel

💻

Mike MacCana

⚠️ 🎨

Yacine Kanzari

💻

BBJip

💻

Futagirl

🎨

Levin Rickert

💻

OJ Kwon

💻

domain

🔌 💻

James Brumond

🔌

Daniel Imms

💻 🔌 ⚠️

Florian Bachmann

💻

Michael Kühnel

💻 🎨

Tilmann Meyer

💻

PM Extra

🐛

Jonathan

💻

Hans Koch

💻

Dak Smyth

💻

Wang Zhi

💻

jack1142

💻

Howie Douglas

💻

Chris Kaczor

💻

Johannes Kadak

💻

LeSeulArtichaut

💻

Cyril Taylor

💻

nstefanou

💻 🔌

orin220444

💻

Gobius Dolhain

💻

Gwilherm Folliot

💻

Dmitry Pronin

💻

Jonathan Beverley

💻

Zenghai Liang

💻

Mateusz Tracz

💻

pinpin

💻

Takuro Onoda

💻

frauhottelmann

💻

Piotr Patalong

🎨

Clark Wang

💻

iamchating

💻

starxg

🔌

Alisue

🎨

Dominic Yin

💻

Brandon Rothweiler

🎨

Logic Machine

📖

cypherbits

📖

Matthew Davidson

💻

Alexander Wiedemann

💻
- - - - - - -이 프로젝트는 [모든 기여자](https://github.com/all-contributors/all-contributors)의 규격을 따릅니다. 어떠한 종류의 기여도 모두 환영합니다! - - diff --git a/README.md b/README.md index 4920c15..d814993 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,42 @@ +# 关于 TabbyCN + +注意!此仓库并不是官方的,官方的仓库是:[Eugeny/tabby](https://github.com/Eugeny/tabby/) + +此仓库是我个人将官方源码的大部分英文翻译成简体中文后上传的中文版,此版本跟官方版相比: + ++ 大部分英文翻译成中文,少部分超出个人理解,或遗漏而未翻译。 ++ 在主页和设置页面新增加了跳转至此仓库的按钮,方便后续需要新的中文版的人们来下载。 ++ 由 Actions 构建包时没有签名,因此可能会不被操作系统信任。 + +除了以上改动之外没有任何多余的改动(没有广告、没有病毒等),[Releases](https://github.com/Aixzk/tabbyCN/releases) 由 [Actions](https://github.com/Aixzk/tabbyCN/actions) 构建。 + +当然也可能因为我翻译的时候改错地方而产生的新 Bug ,或者翻译错误等问题,欢迎提 issue ,但对于 Tabby 本身的 Bug 或问题我无能为力,请到官方仓库中反馈。 + +请到 [Releases](https://github.com/Aixzk/tabbyCN/releases) 或 [Actions](https://github.com/Aixzk/tabbyCN/actions) 下载此版本。 + +---- + +# About TabbyCN + +Attention! This repository is not official, the official repository: [Eugeny/tabby](https://github.com/Eugeny/tabby/) + + +This repository is the Chinese version that I personally uploaded after translating most of the official source code from English to Simplified Chinese. This version has the following points compared to the official version: + ++ Most of the English is translated into Chinese, a few parts are beyond personal understanding, or missing so that it's not translated. ++ Added a new button to jump to this repository in the home page and settings page, so that people who need a new Chinese version can download it. ++ Packages are built without signature by Actions, so they may not be trusted by the OS. + +Apart from the above changes there are no extra changes (no ads, no viruses or anything else), [Releases](https://github.com/Aixzk/tabbyCN/releases) is built by [Actions](https://github.com/Aixzk/tabbyCN/actions). + +Of course, there may be new bugs or translation errors due to my translation mistakes, feel free to raise issues, but I can't help with Tabby's own bugs or problems, so please give feedback in the official repository. + +Please go to [Releases](https://github.com/Aixzk/tabbyCN/releases) or [Actions](https://github.com/Aixzk/tabbyCN/actions) to download this version. + +(Translated with www.DeepL.com/Translator) + +---- + [![](docs/readme.png)](https://tabby.sh) @@ -13,38 +52,39 @@ ---- -### Downloads: +### 下载: +* [中文版](https://github.com/Aixzk/tabbyCN/releases) * [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: Korean +此文档的其他语言版本(跳转至官方):English | Korean

---- -[**Tabby**](https://tabby.sh) (formerly **Terminus**) is a highly configurable terminal emulator, SSH and serial client for Windows, 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) +[**Tabby**](https://tabby.sh) (前 **Terminus**)是一个高度可配置的,Windows、macOS、Linux 平台的终端模拟器,SSH 和串行终端。 + +* 集成 SSH 和 Telnet 客户端和连接管理器 +* 集成串行终端 +* 主题和颜色方案 +* 完全可配置的快捷键和组合快捷键 +* 拆分窗格 +* 记住标签页 +* 支持 PowerShell(和 PS Core)、WSL、Git-Bash、Cygwin、MSYS2、Cmder 以及 CMD +* 在 SSH 会话通过 Zmodem 直接传输文件 +* 完整 Unicode 支持包括全角字符 +* 不因快速的输出而卡住 +* 在 Windows 上的舒适 shell 体验包括 tab 补全(通过 Clink) +* 集成 SSH 秘钥和配置加密 +* SSH、SFTP 和 Telnet 可用作 [web 应用程序](https://tabby.sh/app) (也可 [自托管](https://github.com/Eugeny/tabby-web)) + +# 目录 + +- Tabby 的是与非 - [Terminal features](#terminal-features) - [SSH Client](#ssh-client) - [Serial Terminal](#serial-terminal) @@ -55,71 +95,70 @@ This README is also available in: Korean -# What Tabby is and isn't - -* **Tabby is** an alternative to Windows' standard terminal (conhost), PowerShell ISE, PuTTY, macOS Terminal.app and iTerm +#

Tabby 的是与非

+* **Tabby 是** 一个 Windows 标准终端(conhost)、PowerShell ISE、PuTTY、macOS Terminal.app 和 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) +* **Tabby 不是** 一个新的 shell 或者 MinGW 或 Cygwin 的替代品。它也不是轻量级的, 如果重视 RAM 占用,考虑 [Conemu](https://conemu.github.io) 或 [Alacritty](https://github.com/jwilm/alacritty) -# Terminal features +# 终端特性 ![](docs/readme-terminal.png) -* A V220 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) +* 一个 V220 终端 + 各种扩展 +* 多个嵌套拆分窗格 +* 标签页在窗口的任意一边 +* 一个带有全局生成热键的可选可停靠窗口(“Quake console”) +* 进度检测 +* 进程完成通知 +* 括号、多行粘贴警告 +* 连体字 +* 自定义 shell 配置文件 +* 可选的 RMB 粘贴和选择复制(PuTTY 风格) -# SSH Client +# SSH 客户端 ![](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 +* 带有连接管理器的 SSH2 客户端 +* X11 和端口转发 +* 自动跳转主机管理 +* 代理转发(包括 Pageant 和 Windows 自带的 OpenSSH 代理) +* 登录脚本 -# Serial Terminal +# 串行终端 -* Saved connections -* Readline input support -* Optional hex byte-by-byte input and hexdump output -* Newline conversion -* Automatic reconnection +* 保存连接 +* 支持读行输入 +* 支持 hex 逐字节输入和 hexdump 输出 +* 换行符转换 +* 自动重连 -# Portable +# 便携版 -Tabby will run as a portable app on Windows, if you create a `data` folder in the same location where `Tabby.exe` lives. +在 Windows 中,如果你在 `Tabby.exe` 所在的位置新建一个 `data` 的文件夹,Tabby 将作为便携版应用程序运行。 -# Plugins +# 插件 -Plugins and themes can be installed directly from the Settings view inside Tabby. +在 Tabby 的设置中可以直接安装插件和主题。 -* [clickable-links](https://github.com/Eugeny/tabby-clickable-links) - makes paths and URLs in the terminal clickable -* [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 +* [clickable-links](https://github.com/Eugeny/tabby-clickable-links) - 使终端中的路径和链接可以被点击 +* [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) - 打开系统默认浏览器搜索选中的文本 -# 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 @@ -127,23 +166,23 @@ Plugins and themes can be installed directly from the Settings view inside Tabby * [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) has provided free Debian/RPM repository hosting +[**packagecloud**](https://packagecloud.io) 提供了免费的 Debian/RPM 存储托管。 -# Contributing +# 贡献 -Pull requests and plugins are welcome! +欢迎 Pull request 和插件! -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. +查看 [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) 和 [API docs](https://docs.tabby.sh/) 以了解此项目布局,和一个非常简短的插件开发教程。 --- -Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): +感谢这些优秀的人们 ([emoji key](https://allcontributors.org/docs/en/emoji-key)): @@ -227,6 +266,6 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d -This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! +此项目遵循 [all-contributors](https://github.com/all-contributors/all-contributors) 规范,欢迎任何的贡献! diff --git a/tabby-core/src/components/renameTabModal.component.pug b/tabby-core/src/components/renameTabModal.component.pug index ddc5c35..c80c397 100644 --- a/tabby-core/src/components/renameTabModal.component.pug +++ b/tabby-core/src/components/renameTabModal.component.pug @@ -2,5 +2,5 @@ input.form-control(type='text', #input, [(ngModel)]='value', (keyup.enter)='save()', autofocus) .modal-footer - button.btn.btn-primary((click)='save()') Save - button.btn.btn-secondary((click)='close()') Cancel + button.btn.btn-primary((click)='save()') 保存 + button.btn.btn-secondary((click)='close()') 取消 diff --git a/tabby-core/src/components/safeModeModal.component.pug b/tabby-core/src/components/safeModeModal.component.pug index fed3c8a..dcf2caa 100644 --- a/tabby-core/src/components/safeModeModal.component.pug +++ b/tabby-core/src/components/safeModeModal.component.pug @@ -1,7 +1,7 @@ .modal-body - .alert.alert-danger Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was: + .alert.alert-danger Tabby 无法启动您的插件,因此在此会话中已禁用所有第三方插件。错误: pre {{error}} .modal-footer - button.btn.btn-primary((click)='close()') Close + button.btn.btn-primary((click)='close()') 关闭 diff --git a/tabby-core/src/components/selectorModal.component.pug b/tabby-core/src/components/selectorModal.component.pug index 20d292b..b675b7a 100644 --- a/tabby-core/src/components/selectorModal.component.pug +++ b/tabby-core/src/components/selectorModal.component.pug @@ -29,4 +29,4 @@ ) .title.mr-2 {{getOptionText(option)}} .description.no-wrap.text-muted {{option.description}} - .no-wrap.badge.badge-secondary.text-muted.ml-auto(*ngIf='selectedIndex == i') Enter + .no-wrap.badge.badge-secondary.text-muted.ml-auto(*ngIf='selectedIndex == i') 确定 diff --git a/tabby-core/src/components/startPage.component.pug b/tabby-core/src/components/startPage.component.pug index fbacf47..2657bd4 100644 --- a/tabby-core/src/components/startPage.component.pug +++ b/tabby-core/src/components/startPage.component.pug @@ -18,6 +18,9 @@ footer.d-flex.align-items-center span GitHub button.btn.btn-dark((click)='homeBase.reportBug()') i.fas.fa-bug - span Report a problem + span 报告问题 + button.btn.btn-dark((click)='homeBase.openTabbyCN()') + i.fab.fa-github + span Tabby 中文版 - .form-control-static.selectable.no-drag Version: {{homeBase.appVersion}} + .form-control-static.selectable.no-drag 版本:{{homeBase.appVersion}} diff --git a/tabby-core/src/components/unlockVaultModal.component.pug b/tabby-core/src/components/unlockVaultModal.component.pug index 75c7778..d0d19d6 100644 --- a/tabby-core/src/components/unlockVaultModal.component.pug +++ b/tabby-core/src/components/unlockVaultModal.component.pug @@ -1,14 +1,14 @@ .modal-body .d-flex.align-items-center.mb-3 - h3.m-0 Vault is locked + h3.m-0 存储库已锁定 .ml-auto(ngbDropdown, placement='bottom-right') button.btn.btn-link(ngbDropdownToggle, (click)='$event.stopPropagation()') - span(*ngIf='rememberFor') Remember for {{getRememberForDisplay(rememberFor)}} - span(*ngIf='!rememberFor') Do not remember + span(*ngIf='rememberFor') 记住 {{getRememberForDisplay(rememberFor)}} + span(*ngIf='!rememberFor') 不要记住 div(ngbDropdownMenu) button.dropdown-item( (click)='rememberFor = 0', - ) Do not remember + ) 不要记住 button.dropdown-item( *ngFor='let x of rememberOptions', (click)='rememberFor = x', diff --git a/tabby-core/src/components/welcomeTab.component.pug b/tabby-core/src/components/welcomeTab.component.pug index 719824a..c3fe430 100644 --- a/tabby-core/src/components/welcomeTab.component.pug +++ b/tabby-core/src/components/welcomeTab.component.pug @@ -4,21 +4,21 @@ h1.tabby-title Tabby sup α - .text-center.mb-5 Thank you for downloading Tabby! + .text-center.mb-5 感谢您下载 Tabby ! .form-line .header - .title Enable analytics - .description Help track the number of Tabby installs across the world! + .title 启用分析 + .description 帮助统计 Tabby 在全世界的安装量! toggle([(ngModel)]='config.store.enableAnalytics') .form-line .header - .title Enable global hotkey (#[strong Ctrl-Space]) - .description Toggles the Tabby window visibility + .title 启用全局热键 (#[strong Ctrl-Space]) + .description 切换 Tabby 显示或隐藏 toggle([(ngModel)]='enableGlobalHotkey') .text-center.mt-5 - button.btn.btn-primary((click)='closeAndDisable()') Close and never show again + button.btn.btn-primary((click)='closeAndDisable()') 关闭并且不再显示 diff --git a/tabby-core/src/hotkeys.ts b/tabby-core/src/hotkeys.ts index 9a809ad..8129888 100644 --- a/tabby-core/src/hotkeys.ts +++ b/tabby-core/src/hotkeys.ts @@ -9,183 +9,183 @@ export class AppHotkeyProvider extends HotkeyProvider { hotkeys: HotkeyDescription[] = [ { id: 'profile-selector', - name: 'Show profile selector', + name: '显示配置文件选择器', }, { id: 'toggle-fullscreen', - name: 'Toggle fullscreen mode', + name: '切换全屏模式', }, { id: 'rename-tab', - name: 'Rename Tab', + name: '重命名标签页', }, { id: 'close-tab', - name: 'Close tab', + name: '关闭标签页', }, { id: 'reopen-tab', - name: 'Reopen last tab', + name: '恢复关闭的标签页', }, { id: 'toggle-last-tab', - name: 'Toggle last tab', + name: '回到上一个标签页', }, { id: 'next-tab', - name: 'Next tab', + name: '切换到下一个标签页', }, { id: 'previous-tab', - name: 'Previous tab', + name: '切换到上一个标签页', }, { id: 'move-tab-left', - name: 'Move tab to the left', + name: '向左移动标签页', }, { id: 'move-tab-right', - name: 'Move tab to the right', + name: '向右移动标签页', }, { id: 'rearrange-panes', - name: 'Show pane labels (for rearranging)', + name: '显示窗格标签页', }, { id: 'duplicate-tab', - name: 'Duplicate tab', + name: '克隆标签页', }, { id: 'tab-1', - name: 'Tab 1', + name: '标签页 1', }, { id: 'tab-2', - name: 'Tab 2', + name: '标签页 2', }, { id: 'tab-3', - name: 'Tab 3', + name: '标签页 3', }, { id: 'tab-4', - name: 'Tab 4', + name: '标签页 4', }, { id: 'tab-5', - name: 'Tab 5', + name: '标签页 5', }, { id: 'tab-6', - name: 'Tab 6', + name: '标签页 6', }, { id: 'tab-7', - name: 'Tab 7', + name: '标签页 7', }, { id: 'tab-8', - name: 'Tab 8', + name: '标签页 8', }, { id: 'tab-9', - name: 'Tab 9', + name: '标签页 9', }, { id: 'tab-10', - name: 'Tab 10', + name: '标签页 10', }, { id: 'tab-11', - name: 'Tab 11', + name: '标签页 11', }, { id: 'tab-12', - name: 'Tab 12', + name: '标签页 12', }, { id: 'tab-13', - name: 'Tab 13', + name: '标签页 13', }, { id: 'tab-14', - name: 'Tab 14', + name: '标签页 14', }, { id: 'tab-15', - name: 'Tab 15', + name: '标签页 15', }, { id: 'tab-16', - name: 'Tab 16', + name: '标签页 16', }, { id: 'tab-17', - name: 'Tab 17', + name: '标签页 17', }, { id: 'tab-18', - name: 'Tab 18', + name: '标签页 18', }, { id: 'tab-19', - name: 'Tab 19', + name: '标签页 19', }, { id: 'tab-20', - name: 'Tab 20', + name: '标签页 20', }, { id: 'split-right', - name: 'Split to the right', + name: '向右拆分', }, { id: 'split-bottom', - name: 'Split to the bottom', + name: '向下拆分', }, { id: 'split-left', - name: 'Split to the left', + name: '向左拆分', }, { id: 'split-top', - name: 'Split to the top', + name: '向上拆分', }, { id: 'pane-maximize', - name: 'Maximize the active pane', + name: '最大化当前窗格', }, { id: 'pane-nav-up', - name: 'Focus the pane above', + name: '聚焦上方窗格', }, { id: 'pane-nav-down', - name: 'Focus the pane below', + name: '聚焦下方窗格', }, { id: 'pane-nav-left', - name: 'Focus the pane on the left', + name: '聚焦左方窗格', }, { id: 'pane-nav-right', - name: 'Focus the pane on the right', + name: '聚焦右方窗格', }, { id: 'pane-nav-previous', - name: 'Focus previous pane', + name: '聚焦上一个窗格', }, { id: 'pane-nav-next', - name: 'Focus next pane', + name: '聚焦下一个窗格', }, { id: 'switch-profile', - name: 'Switch profile in the active pane', + name: '在当前窗格切换配置文件', }, { id: 'close-pane', - name: 'Close focused pane', + name: '关闭当前窗格', }, ] @@ -199,11 +199,11 @@ export class AppHotkeyProvider extends HotkeyProvider { ...this.hotkeys, ...profiles.map(profile => ({ id: `profile.${AppHotkeyProvider.getProfileHotkeyName(profile)}`, - name: `New tab: ${profile.name}`, + name: `新标签页:${profile.name}`, })), ...this.profilesService.getProviders().map(provider => ({ id: `profile-selectors.${provider.id}`, - name: `Show ${provider.name} profile selector`, + name: `显示 ${provider.name} 配置文件选择器`, })), ] } diff --git a/tabby-core/src/services/homeBase.service.ts b/tabby-core/src/services/homeBase.service.ts index cb76fde..cf5fa4f 100644 --- a/tabby-core/src/services/homeBase.service.ts +++ b/tabby-core/src/services/homeBase.service.ts @@ -27,6 +27,10 @@ export class HomeBaseService { this.platform.openExternal('https://github.com/Eugeny/tabby') } + openTabbyCN (): void { + this.platform.openExternal('https://github.com/Aixzk/tabbyCN') + } + openDiscussions (): void { this.platform.openExternal('https://github.com/Eugeny/tabby/discussions') } diff --git a/tabby-core/src/tabContextMenu.ts b/tabby-core/src/tabContextMenu.ts index d620e8a..1ec4442 100644 --- a/tabby-core/src/tabContextMenu.ts +++ b/tabby-core/src/tabContextMenu.ts @@ -29,7 +29,7 @@ export class TabManagementContextMenu extends TabContextMenuItemProvider { async getItems (tab: BaseTabComponent, tabHeader?: TabHeaderComponent): Promise { let items: MenuItemOptions[] = [ { - label: 'Close', + label: '关闭', click: () => { if (this.app.tabs.includes(tab)) { this.app.closeTab(tab, true) @@ -43,7 +43,7 @@ export class TabManagementContextMenu extends TabContextMenuItemProvider { items = [ ...items, { - label: 'Close other tabs', + label: '关闭其他标签页', click: () => { for (const t of this.app.tabs.filter(x => x !== tab)) { this.app.closeTab(t, true) @@ -51,7 +51,7 @@ export class TabManagementContextMenu extends TabContextMenuItemProvider { }, }, { - label: 'Close tabs to the right', + label: '关闭右边的标签页', click: () => { for (const t of this.app.tabs.slice(this.app.tabs.indexOf(tab) + 1)) { this.app.closeTab(t, true) @@ -59,7 +59,7 @@ export class TabManagementContextMenu extends TabContextMenuItemProvider { }, }, { - label: 'Close tabs to the left', + label: '关闭左边的标签页', click: () => { for (const t of this.app.tabs.slice(0, this.app.tabs.indexOf(tab))) { this.app.closeTab(t, true) @@ -71,13 +71,13 @@ export class TabManagementContextMenu extends TabContextMenuItemProvider { if (tab.parent instanceof SplitTabComponent) { const directions: SplitDirection[] = ['r', 'b', 'l', 't'] items.push({ - label: 'Split', + label: '拆分', submenu: directions.map(dir => ({ label: { - r: 'Right', - b: 'Down', - l: 'Left', - t: 'Up', + r: '向右', + b: '向下', + l: '向左', + t: '向上', }[dir], click: () => { (tab.parent as SplitTabComponent).splitTab(tab, dir) @@ -109,15 +109,15 @@ export class CommonOptionsContextMenu extends TabContextMenuItemProvider { items = [ ...items, { - label: 'Rename', + label: '重命名', click: () => tabHeader.showRenameTabModal(), }, { - label: 'Duplicate', + label: '克隆', click: () => this.app.duplicateTab(tab), }, { - label: 'Color', + label: '颜色', sublabel: TAB_COLORS.find(x => x.value === tab.color)?.name, submenu: TAB_COLORS.map(color => ({ label: color.name, @@ -132,10 +132,10 @@ export class CommonOptionsContextMenu extends TabContextMenuItemProvider { if (tab instanceof SplitTabComponent && tab.getAllTabs().length > 1) { items.push({ - label: 'Save layout as profile', + label: '保存布局为配置文件', click: async () => { const modal = this.ngbModal.open(PromptModalComponent) - modal.componentInstance.prompt = 'Profile name' + modal.componentInstance.prompt = '配置文件名' const name = (await modal.result)?.value if (!name) { return @@ -167,10 +167,10 @@ export class TaskCompletionContextMenu extends TabContextMenuItemProvider { if (process) { items.push({ enabled: false, - label: 'Current process: ' + process.name, + label: '当前进程:' + process.name, }) items.push({ - label: 'Notify when done', + label: '完成时通知', type: 'checkbox', checked: extTab.__completionNotificationEnabled, click: () => { @@ -178,7 +178,7 @@ export class TaskCompletionContextMenu extends TabContextMenuItemProvider { if (extTab.__completionNotificationEnabled) { this.app.observeTabCompletion(tab).subscribe(() => { - new Notification('Process completed', { + new Notification('进程完成', { body: process.name, }).addEventListener('click', () => { this.app.selectTab(tab) @@ -192,7 +192,7 @@ export class TaskCompletionContextMenu extends TabContextMenuItemProvider { }) } items.push({ - label: 'Notify on activity', + label: '活跃时通知', type: 'checkbox', checked: !!extTab.__outputNotificationSubscription, click: () => { @@ -204,7 +204,7 @@ export class TaskCompletionContextMenu extends TabContextMenuItemProvider { if (extTab.__outputNotificationSubscription && active) { extTab.__outputNotificationSubscription.unsubscribe() extTab.__outputNotificationSubscription = null - new Notification('Tab activity', { + new Notification('标签页活跃', { body: tab.title, }).addEventListener('click', () => { this.app.selectTab(tab) @@ -270,7 +270,7 @@ export class ProfilesContextMenu extends TabContextMenuItemProvider { if (!tabHeader && tab.parent instanceof SplitTabComponent && tab.parent.getAllTabs().length > 1) { return [ { - label: 'Switch profile', + label: '切换配置文件', click: () => this.switchTabProfile(tab), }, ] diff --git a/tabby-core/src/utils.ts b/tabby-core/src/utils.ts index 082bc13..73b86c8 100644 --- a/tabby-core/src/utils.ts +++ b/tabby-core/src/utils.ts @@ -56,13 +56,13 @@ export class ResettableTimeout { } 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' }, + { name: '无色', value: null }, + { name: '蓝色', value: '#0275d8' }, + { name: '绿色', value: '#5cb85c' }, + { name: '橙色', value: '#f0ad4e' }, + { name: '紫色', value: '#613d7c' }, + { name: '红色', value: '#d9534f' }, + { name: '黄色', value: '#ffd500' }, ] export function serializeFunction Promise> (fn: T): T { diff --git a/tabby-electron/src/hotkeys.ts b/tabby-electron/src/hotkeys.ts index 5d2e478..501fb0d 100644 --- a/tabby-electron/src/hotkeys.ts +++ b/tabby-electron/src/hotkeys.ts @@ -7,11 +7,11 @@ export class ElectronHotkeyProvider extends HotkeyProvider { hotkeys: HotkeyDescription[] = [ { id: 'new-window', - name: 'New window', + name: '新建窗口', }, { id: 'toggle-window', - name: 'Toggle terminal window', + name: '切换终端窗口', }, ] diff --git a/tabby-electron/src/sftpContextMenu.ts b/tabby-electron/src/sftpContextMenu.ts index 26203c3..1f221ba 100644 --- a/tabby-electron/src/sftpContextMenu.ts +++ b/tabby-electron/src/sftpContextMenu.ts @@ -26,7 +26,7 @@ export class EditSFTPContextMenu extends SFTPContextMenuItemProvider { return [ { click: () => this.edit(item, panel.sftp), - label: 'Edit locally', + label: '在本地编辑', }, ] } diff --git a/tabby-linkifier/src/decorator.ts b/tabby-linkifier/src/decorator.ts index 25abcf3..c6a583d 100644 --- a/tabby-linkifier/src/decorator.ts +++ b/tabby-linkifier/src/decorator.ts @@ -42,13 +42,13 @@ export class LinkHighlighterDecorator extends TerminalDecorator { this.platform.popupContextMenu([ { click: () => openLink(uri), - label: 'Open', + label: '打开', }, { click: async () => { this.platform.setClipboard({ text: await getLink(uri) }) }, - label: 'Copy', + label: '复制', }, ]) return false diff --git a/tabby-local/src/buttonProvider.ts b/tabby-local/src/buttonProvider.ts index 68eff2b..aa7c83f 100644 --- a/tabby-local/src/buttonProvider.ts +++ b/tabby-local/src/buttonProvider.ts @@ -16,7 +16,7 @@ export class ButtonProvider extends ToolbarButtonProvider { return [ { icon: require('./icons/plus.svg'), - title: 'New terminal', + title: '新终端', touchBarNSImage: 'NSTouchBarAddDetailTemplate', click: () => { this.terminal.openTab() diff --git a/tabby-local/src/components/commandLineEditor.component.pug b/tabby-local/src/components/commandLineEditor.component.pug index a5f70e6..df56124 100644 --- a/tabby-local/src/components/commandLineEditor.component.pug +++ b/tabby-local/src/components/commandLineEditor.component.pug @@ -1,6 +1,6 @@ ng-container(*ngIf='!argvMode') .form-group - label Command line + label 命令行 .input-group .input-group-prepend a.input-group-text( @@ -16,7 +16,7 @@ ng-container(*ngIf='!argvMode') ng-container(*ngIf='argvMode') .form-group - label Program + label 程序 .input-group .input-group-prepend a.input-group-text( @@ -31,7 +31,7 @@ ng-container(*ngIf='argvMode') ) .form-group - label Arguments + label 参数 .input-group( *ngFor='let arg of _model.args; index as i; trackBy: trackByIndex', ) @@ -46,4 +46,4 @@ ng-container(*ngIf='argvMode') .mt-2 button.btn.btn-secondary((click)='_model.args.push("")') i.fas.fa-plus.mr-2 - | Add + | 添加 diff --git a/tabby-local/src/components/environmentEditor.component.pug b/tabby-local/src/components/environmentEditor.component.pug index 222c546..a90db5f 100644 --- a/tabby-local/src/components/environmentEditor.component.pug +++ b/tabby-local/src/components/environmentEditor.component.pug @@ -11,10 +11,10 @@ .d-flex button.btn.btn-secondary((click)='addEnvironmentVar()') i.fas.fa-plus.mr-2 - span Add + span 添加 .ml-auto - .text-muted Substitutions allowed. + .text-muted 允许被替换。 .d-flex.ml-1(*ngIf='shouldShowExample()') - .text-muted Example: - a.ml-1((click)='addExample()', href='#') extend PATH + .text-muted 例如: + a.ml-1((click)='addExample()', href='#') 扩展路径 diff --git a/tabby-local/src/components/localProfileSettings.component.pug b/tabby-local/src/components/localProfileSettings.component.pug index 9002eca..5435eb5 100644 --- a/tabby-local/src/components/localProfileSettings.component.pug +++ b/tabby-local/src/components/localProfileSettings.component.pug @@ -2,13 +2,13 @@ command-line-editor([model]='profile.options') .form-line(*ngIf='uac.isAvailable') .header - .title Run as administrator + .title 以管理员身份运行 toggle( [(ngModel)]='profile.options.runAsAdministrator', ) .form-group - label Working directory + label 工作目录 .input-group input.form-control( @@ -21,7 +21,7 @@ command-line-editor([model]='profile.options') i.fas.fa-folder-open .form-group - label Environment + label 环境 environment-editor( type='text', [(model)]='profile.options.env', diff --git a/tabby-local/src/components/shellSettingsTab.component.pug b/tabby-local/src/components/shellSettingsTab.component.pug index 33ff751..28aac6e 100644 --- a/tabby-local/src/components/shellSettingsTab.component.pug +++ b/tabby-local/src/components/shellSettingsTab.component.pug @@ -2,8 +2,8 @@ h3.mb-3 Shell .form-line(*ngIf='isConPTYAvailable') .header - .title Use ConPTY - .description Enables the experimental Windows ConPTY API + .title 使用 ConPTY + .description 启用实验性 Windows ConPTY API toggle( [(ngModel)]='config.store.terminal.useConPTY', @@ -11,7 +11,7 @@ h3.mb-3 Shell ) .alert.alert-info.d-flex.align-items-center(*ngIf='config.store.terminal.useConPTY && isConPTYAvailable && !isConPTYStable') - .mr-auto Windows 10 build 18309 or above is recommended for ConPTY + .mr-auto Windows 10 build 18309 及以上推荐使用 ConPTY .alert.alert-info.d-flex.align-items-center(*ngIf='config.store.terminal.profile.startsWith("WSL") && (!config.store.terminal.useConPTY)') - .mr-auto WSL terminal only supports TrueColor with ConPTY + .mr-auto WSL 终端只支持 TrueColor 真彩 diff --git a/tabby-local/src/components/terminalTab.component.ts b/tabby-local/src/components/terminalTab.component.ts index 1348979..e2f9633 100644 --- a/tabby-local/src/components/terminalTab.component.ts +++ b/tabby-local/src/components/terminalTab.component.ts @@ -108,8 +108,8 @@ export class TerminalTabComponent extends BaseTerminalTabComponent { return (await this.platform.showMessageBox( { type: 'warning', - message: `"${children[0].command}" is still running. Close?`, - buttons: ['Kill', 'Cancel'], + message: `"${children[0].command}" 正在运行中,是否关闭?`, + buttons: ['关闭', '取消'], defaultId: 0, cancelId: 1, } diff --git a/tabby-local/src/hotkeys.ts b/tabby-local/src/hotkeys.ts index a553464..4432f7d 100644 --- a/tabby-local/src/hotkeys.ts +++ b/tabby-local/src/hotkeys.ts @@ -7,7 +7,7 @@ export class LocalTerminalHotkeyProvider extends HotkeyProvider { hotkeys: HotkeyDescription[] = [ { id: 'new-tab', - name: 'New tab', + name: '新标签页', }, ] diff --git a/tabby-local/src/session.ts b/tabby-local/src/session.ts index da4ec3e..3ee5a6f 100644 --- a/tabby-local/src/session.ts +++ b/tabby-local/src/session.ts @@ -223,7 +223,7 @@ export class Session extends BaseSession { this.pty.subscribe('close', () => { this.ptyClosed = true if (this.pauseAfterExit) { - this.emitOutput(Buffer.from('\r\nPress any key to close\r\n')) + this.emitOutput(Buffer.from('\r\n按任意键关闭\r\n')) } else if (this.open) { this.destroy() } diff --git a/tabby-local/src/tabContextMenu.ts b/tabby-local/src/tabContextMenu.ts index 57577ce..c4299bd 100644 --- a/tabby-local/src/tabContextMenu.ts +++ b/tabby-local/src/tabContextMenu.ts @@ -23,10 +23,10 @@ export class SaveAsProfileContextMenu extends TabContextMenuItemProvider { } const items: MenuItemOptions[] = [ { - label: 'Save as profile', + label: '另存为配置文件', click: async () => { const modal = this.ngbModal.open(PromptModalComponent) - modal.componentInstance.prompt = 'New profile name' + modal.componentInstance.prompt = '新配置文件名' const name = (await modal.result)?.value if (!name) { return @@ -44,7 +44,7 @@ export class SaveAsProfileContextMenu extends TabContextMenuItemProvider { profile, ] this.config.save() - this.notifications.info('Saved') + this.notifications.info('已保存') }, }, ] @@ -72,7 +72,7 @@ export class NewTabContextMenu extends TabContextMenuItemProvider { const items: MenuItemOptions[] = [ { - label: 'New terminal', + label: '新终端', click: () => { if (tab instanceof TerminalTabComponent) { this.profilesService.openNewTabForProfile(tab.profile) @@ -82,7 +82,7 @@ export class NewTabContextMenu extends TabContextMenuItemProvider { }, }, { - label: 'New with profile', + label: '打开配置文件', submenu: profiles.map(profile => ({ label: profile.name, click: async () => { @@ -98,7 +98,7 @@ export class NewTabContextMenu extends TabContextMenuItemProvider { if (this.uac.isAvailable) { items.push({ - label: 'New admin tab', + label: '打开配置文件(管理员权限)', submenu: profiles.map(profile => ({ label: profile.name, click: () => { @@ -116,7 +116,7 @@ export class NewTabContextMenu extends TabContextMenuItemProvider { if (tab instanceof TerminalTabComponent && tabHeader && this.uac.isAvailable) { items.push({ - label: 'Duplicate as administrator', + label: '以管理员身份克隆', click: () => { this.profilesService.openNewTabForProfile({ ...tab.profile, @@ -131,7 +131,7 @@ export class NewTabContextMenu extends TabContextMenuItemProvider { if (tab instanceof TerminalTabComponent && tab.parent instanceof SplitTabComponent && tab.parent.getAllTabs().length > 1) { items.push({ - label: 'Focus all panes', + label: '聚焦所有窗格', click: () => { tab.focusAllPanes() }, diff --git a/tabby-plugin-manager/src/components/pluginsSettingsTab.component.pug b/tabby-plugin-manager/src/components/pluginsSettingsTab.component.pug index 8332a34..8ed0228 100644 --- a/tabby-plugin-manager/src/components/pluginsSettingsTab.component.pug +++ b/tabby-plugin-manager/src/components/pluginsSettingsTab.component.pug @@ -1,16 +1,16 @@ .d-flex.mb-3 - h3 Plugins + h3 插件 button.btn.btn-secondary.btn-sm.ml-auto((click)='openPluginsFolder()') i.fas.fa-folder - span Plugins folder + span 插件目录 .alert.alert-danger(*ngIf='errorMessage') - strong Error in {{erroredPlugin}}: + strong 错误 {{erroredPlugin}}: pre {{errorMessage}} ul.nav-tabs.mb-2(ngbNav, #nav='ngbNav') li(ngbNavItem) - a(ngbNavLink) Available + a(ngbNavLink) 未安装 ng-template(ngbNavContent) .input-group.mb-3.mt-3 .input-group-prepend @@ -40,14 +40,14 @@ ul.nav-tabs.mb-2(ngbNav, #nav='ngbNav') ) 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.ml-2 Get + span.ml-2 安装 button.btn.btn-secondary.btn-block.justify-content-center( *ngIf='plugin.homepage', (click)='showPluginHomepage(plugin)' ) i.fas.fa-fw.fa-external-link-alt - span.ml-2 Homepage + span.ml-2 主页 .col-8 ng-container(*ngTemplateOutlet='pluginInfo; context: { plugin }') @@ -55,7 +55,7 @@ ul.nav-tabs.mb-2(ngbNav, #nav='ngbNav') .mt-2 {{plugin.description}} li(ngbNavItem) - a(ngbNavLink) Installed + a(ngbNavLink) 已安装 ng-template(ngbNavContent) ngb-accordion.mb-4([closeOthers]='true') ng-container(*ngFor='let plugin of pluginManager.installedPlugins') @@ -64,8 +64,8 @@ ul.nav-tabs.mb-2(ngbNav, #nav='ngbNav') .text-left.mr-auto div strong {{plugin.name}} - small.text-muted.ml-2(*ngIf='plugin.isBuiltin') Built-in - small.text-warning.ml-2(*ngIf='!isPluginEnabled(plugin)') Disabled + small.text-muted.ml-2(*ngIf='plugin.isBuiltin') 内置 + small.text-warning.ml-2(*ngIf='!isPluginEnabled(plugin)') 已停用 small.d-block.text-muted {{plugin.description}} button.btn.btn-primary.ml-2( @@ -75,7 +75,7 @@ ul.nav-tabs.mb-2(ngbNav, #nav='ngbNav') ) 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 Upgrade to {{knownUpgrades[plugin.name].version}} + span 升级到 {{knownUpgrades[plugin.name].version}} ng-template(ngbPanelContent) .row @@ -84,12 +84,12 @@ ul.nav-tabs.mb-2(ngbNav, #nav='ngbNav') (click)='togglePlugin(plugin)', *ngIf='isPluginEnabled(plugin)', [disabled]='!canDisablePlugin(plugin)' - ) Disable + ) 停用 button.btn.btn-success.btn-block.justify-content-center( (click)='togglePlugin(plugin)', *ngIf='canDisablePlugin(plugin) && !isPluginEnabled(plugin)' - ) Enable + ) 启用 button.btn.btn-danger.btn-block.justify-content-center( (click)='uninstallPlugin(plugin)', @@ -98,7 +98,7 @@ ul.nav-tabs.mb-2(ngbNav, #nav='ngbNav') ) 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 Uninstall + span 卸载 .col-8 ng-container(*ngTemplateOutlet='pluginInfo; context: { plugin }') @@ -108,16 +108,16 @@ ul.nav-tabs.mb-2(ngbNav, #nav='ngbNav') ng-template(#pluginInfo, let-plugin='plugin') .row.align-items-center .col-4 - strong Version + strong 版本 .col-8 span {{plugin.version}} .row.align-items-center .col-4 - strong Author + strong 作者 .col-8 .badge.badge-success(*ngIf='plugin.isOfficial') i.fas.fa-check - span.ml-1 Official + span.ml-1 官方的 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.ml-2 diff --git a/tabby-plugin-manager/src/settings.ts b/tabby-plugin-manager/src/settings.ts index a8d565d..d2454cf 100644 --- a/tabby-plugin-manager/src/settings.ts +++ b/tabby-plugin-manager/src/settings.ts @@ -7,7 +7,7 @@ import { PluginsSettingsTabComponent } from './components/pluginsSettingsTab.com @Injectable() export class PluginsSettingsTabProvider extends SettingsTabProvider { id = 'plugins' - title = 'Plugins' + title = '插件' getComponentType (): any { return PluginsSettingsTabComponent diff --git a/tabby-serial/src/components/serialProfileSettings.component.pug b/tabby-serial/src/components/serialProfileSettings.component.pug index 72e38d5..5c64ae9 100644 --- a/tabby-serial/src/components/serialProfileSettings.component.pug +++ b/tabby-serial/src/components/serialProfileSettings.component.pug @@ -1,11 +1,11 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') li(ngbNavItem) - a(ngbNavLink) General + a(ngbNavLink) 常规 ng-template(ngbNavContent) .row .col-6(ng:if='hostApp.platform !== Platform.Web') .form-group - label Device + label 设备 input.form-control( type='text', alwaysVisibleTypeahead, @@ -16,11 +16,11 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') .col-6 .form-group - label Baud Rate + label 波特率(传输速率) input.form-control( type='number', alwaysVisibleTypeahead, - placeholder='Ask every time', + placeholder='每次打开填写', [(ngModel)]='profile.options.baudrate', [ngbTypeahead]='baudratesAutocomplete' ) @@ -28,11 +28,11 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') stream-processing-settings([options]='profile.options') li(ngbNavItem) - a(ngbNavLink) Advanced + a(ngbNavLink) 高级 ng-template(ngbNavContent) .form-line .header - .title Data bits + .title 数据位(Data bits) input.form-control( type='number', placeholder='8', @@ -41,7 +41,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') .form-line .header - .title Stop bits + .title 停止位(Stop bits) input.form-control( type='number', placeholder='1', @@ -50,14 +50,14 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') .form-line .header - .title Parity + .title 奇偶校验(Parity) select.form-control( type='text', [(ngModel)]='profile.options.parity' ) option(value='none') None - option(value='even') Even - option(value='odd') Odd + 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 @@ -84,11 +84,11 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') .form-line .header .title Slow feed - .description Sends data one byte at a time + .description 每次只发送一个字节 toggle([(ngModel)]='profile.options.slowFeed') li(ngbNavItem) - a(ngbNavLink) Login scripts + a(ngbNavLink) 登陆脚本 ng-template(ngbNavContent) login-scripts-settings([options]='profile.options') diff --git a/tabby-serial/src/components/serialTab.component.pug b/tabby-serial/src/components/serialTab.component.pug index 274d25f..4ffe127 100644 --- a/tabby-serial/src/components/serialTab.component.pug +++ b/tabby-serial/src/components/serialTab.component.pug @@ -9,8 +9,8 @@ .mr-auto button.btn.btn-sm.btn-link.mr-3((click)='changeBaudRate()', *ngIf='session && session.open && hostApp.platform !== Platform.Web') - span Change baud rate + span 更改波特率(传输速率) button.btn.btn-sm.btn-link((click)='reconnect()', *ngIf='!session || !session.open') i.fas.fa-redo - span Reconnect + span 重新连接 diff --git a/tabby-serial/src/hotkeys.ts b/tabby-serial/src/hotkeys.ts index b0ab3a0..11f1435 100644 --- a/tabby-serial/src/hotkeys.ts +++ b/tabby-serial/src/hotkeys.ts @@ -7,11 +7,11 @@ export class SerialHotkeyProvider extends HotkeyProvider { hotkeys: HotkeyDescription[] = [ { id: 'serial', - name: 'Show Serial connections', + name: '显示串口连接', }, { id: 'restart-serial-session', - name: 'Restart current serial session', + name: '重新启动当前串行会话', }, ] diff --git a/tabby-serial/src/profiles.ts b/tabby-serial/src/profiles.ts index d32e1d5..0fdb5cf 100644 --- a/tabby-serial/src/profiles.ts +++ b/tabby-serial/src/profiles.ts @@ -12,7 +12,7 @@ import { BAUD_RATES, SerialProfile } from './api' @Injectable({ providedIn: 'root' }) export class SerialProfilesService extends ProfileProvider { id = 'serial' - name = 'Serial' + name = '串口' settingsComponent = SerialProfileSettingsComponent configDefaults = { options: { @@ -51,7 +51,7 @@ export class SerialProfilesService extends ProfileProvider { { id: `serial:web`, type: 'serial', - name: 'Serial connection', + name: '串口连接', icon: 'fas fa-microchip', isBuiltin: true, } as SerialProfile, diff --git a/tabby-settings/src/components/configSyncSettingsTab.component.pug b/tabby-settings/src/components/configSyncSettingsTab.component.pug index 7a19632..c44a72c 100644 --- a/tabby-settings/src/components/configSyncSettingsTab.component.pug +++ b/tabby-settings/src/components/configSyncSettingsTab.component.pug @@ -1,12 +1,12 @@ -h3.mb-3 Config sync +h3.mb-3 同步配置 ul.nav-tabs(ngbNav, #nav='ngbNav') li(ngbNavItem) - a(ngbNavLink) Sync + a(ngbNavLink) 同步 ng-template(ngbNavContent) .form-line .header - .title Sync host + .title 同步主机 .input-group.w-50 input.form-control( @@ -21,7 +21,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') .form-line .header .title Secret sync token - .description Get it from the Tabby Web settings window + .description 从 Tabby Web 设置中获取 .input-group input.form-control( @@ -38,16 +38,16 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') ng-container(*ngIf='config.store.configSync.token') .alert.alert-danger(*ngIf='connectionSuccessful === false') i.fas.fa-exclamation-triangle - span.ml-2 Connection failed: {{connectionError}} + span.ml-2 连接失败:{{connectionError}} ng-container(*ngIf='connectionSuccessful') .form-line .header - .title Configs + .title 配置 div(*ngIf='configs === null') i.fas.fa-fw.fa-circle-notch.fa-spin - span.ml-2 Loading configs... + span.ml-2 加载配置中…… ng-container(*ngIf='configs !== null') .list-group-light @@ -59,34 +59,34 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') i.fas.fa-fw.fa-file .ml-2.d-flex.flex-column.align-items-start div {{cfg.name}} - small.text-muted Modified on {{cfg.modified_at|date:'medium'}} + small.text-muted 修改于 {{cfg.modified_at|date:'medium'}} .mr-auto button.btn.btn-link.ml-1( (click)='uploadAndSync(cfg)', [class.hover-reveal]='!isActiveConfig(cfg)' ) i.fas.fa-arrow-up - span.ml-2(*ngIf='isActiveConfig(cfg)') Upload - span.ml-2(*ngIf='!isActiveConfig(cfg)') Replace + span.ml-2(*ngIf='isActiveConfig(cfg)') 上传 + span.ml-2(*ngIf='!isActiveConfig(cfg)') 替换 button.btn.btn-link.ml-1( (click)='downloadAndSync(cfg)', [class.hover-reveal]='!isActiveConfig(cfg)' ) i.fas.fa-arrow-down - span.ml-2 Download + span.ml-2 下载 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 - .ml-2 Upload as a new config + .ml-2 上传为新配置 ng-container(*ngIf='hasMatchingRemoteConfig()') .form-line .header - .title Sync automatically - .description Automatically upload changes and check for updates every minute + .title 自动同步 + .description 每分钟自动上传变更并检查更新 toggle( [(ngModel)]='config.store.configSync.auto', @@ -94,11 +94,11 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') ) li(ngbNavItem) - a(ngbNavLink) Advanced + a(ngbNavLink) 高级 ng-template(ngbNavContent) .form-line .header - .title Sync hotkeys + .title 同步热键 toggle( [(ngModel)]='config.store.configSync.parts.hotkeys', (ngModelChange)='config.save()', @@ -106,7 +106,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') .form-line .header - .title Sync window settings + .title 同步窗口设置 toggle( [(ngModel)]='config.store.configSync.parts.appearance', (ngModelChange)='config.save()', @@ -114,7 +114,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') .form-line .header - .title Sync Vault + .title 同步保管库 toggle( [(ngModel)]='config.store.configSync.parts.vault', (ngModelChange)='config.save()', diff --git a/tabby-settings/src/components/configSyncSettingsTab.component.ts b/tabby-settings/src/components/configSyncSettingsTab.component.ts index 1d0a186..196c727 100644 --- a/tabby-settings/src/components/configSyncSettingsTab.component.ts +++ b/tabby-settings/src/components/configSyncSettingsTab.component.ts @@ -72,8 +72,8 @@ export class ConfigSyncSettingsTabComponent extends BaseComponent { if (this.config.store.configSync.configID !== cfg.id) { if ((await this.platform.showMessageBox({ type: 'warning', - message: 'Overwrite the config on the remote side and start syncing?', - buttons: ['Overwrite remote and sync', 'Cancel'], + message: '确定覆盖远程配置并开始同步?', + buttons: ['确定', '取消'], defaultId: 1, cancelId: 1, })).response === 1) { @@ -83,14 +83,14 @@ export class ConfigSyncSettingsTabComponent extends BaseComponent { this.configSync.setConfig(cfg) await this.configSync.upload() this.loadConfigs() - this.notifications.info('Config uploaded') + this.notifications.info('已上传配置') } async downloadAndSync (cfg: Config) { if ((await this.platform.showMessageBox({ type: 'warning', - message: 'Overwrite the local config and start syncing?', - buttons: ['Overwrite local and sync', 'Cancel'], + message: '确定覆盖本地配置并开始同步?', + buttons: ['确定', '取消'], defaultId: 1, cancelId: 1, })).response === 1) { @@ -98,7 +98,7 @@ export class ConfigSyncSettingsTabComponent extends BaseComponent { } this.configSync.setConfig(cfg) await this.configSync.download() - this.notifications.info('Config downloaded') + this.notifications.info('已下载配置') } hasMatchingRemoteConfig () { diff --git a/tabby-settings/src/components/editProfileModal.component.pug b/tabby-settings/src/components/editProfileModal.component.pug index eef3168..da4fd66 100644 --- a/tabby-settings/src/components/editProfileModal.component.pug +++ b/tabby-settings/src/components/editProfileModal.component.pug @@ -2,13 +2,13 @@ h3.m-0 {{profile.name}} .modal-header(*ngIf='defaultsMode') - h3.m-0 Defaults for {{profileProvider.name}} + h3.m-0 默认为 {{profileProvider.name}} .modal-body .row .col-12.col-lg-4 .form-group(*ngIf='!defaultsMode') - label Name + label 名字 input.form-control( type='text', autofocus, @@ -16,7 +16,7 @@ ) .form-group(*ngIf='!defaultsMode') - label Group + label 分组 input.form-control( type='text', alwaysVisibleTypeahead, @@ -26,7 +26,7 @@ ) .form-group(*ngIf='!defaultsMode') - label Icon + label 图标 .input-group input.form-control( type='text', @@ -45,7 +45,7 @@ .form-line .header - .title Color + .title 颜色 input.form-control.w-50( type='text', [(ngModel)]='profile.color', @@ -56,8 +56,8 @@ .form-line .header - .title Disable dynamic tab title - .description Connection name will be used instead + .title 禁用动态标签页名 + .description 将使用连接名 toggle([(ngModel)]='profile.disableDynamicTitle') .mb-4 @@ -66,5 +66,5 @@ ng-template(#placeholder) .modal-footer - button.btn.btn-primary((click)='save()') Save - button.btn.btn-danger((click)='cancel()') Cancel + button.btn.btn-primary((click)='save()') 保存 + button.btn.btn-danger((click)='cancel()') 取消 diff --git a/tabby-settings/src/components/hotkeyInputModal.component.pug b/tabby-settings/src/components/hotkeyInputModal.component.pug index 6c28b4d..665b88a 100644 --- a/tabby-settings/src/components/hotkeyInputModal.component.pug +++ b/tabby-settings/src/components/hotkeyInputModal.component.pug @@ -1,5 +1,5 @@ .modal-header - h5 Press the key now + h5 等待输入按键 .modal-body .input @@ -9,4 +9,4 @@ div([style.width]='timeoutProgress + "%"') .modal-footer - button.btn.btn-primary((click)='close()') Cancel + button.btn.btn-primary((click)='close()') 取消 diff --git a/tabby-settings/src/components/hotkeySettingsTab.component.pug b/tabby-settings/src/components/hotkeySettingsTab.component.pug index 0f9f246..be4c79e 100644 --- a/tabby-settings/src/components/hotkeySettingsTab.component.pug +++ b/tabby-settings/src/components/hotkeySettingsTab.component.pug @@ -1,4 +1,4 @@ -h3.mb-3 Hotkeys +h3.mb-3 热键 .input-group.mb-4 .input-group-prepend diff --git a/tabby-settings/src/components/multiHotkeyInput.component.pug b/tabby-settings/src/components/multiHotkeyInput.component.pug index 9d4af73..3daca53 100644 --- a/tabby-settings/src/components/multiHotkeyInput.component.pug +++ b/tabby-settings/src/components/multiHotkeyInput.component.pug @@ -3,4 +3,4 @@ .stroke(*ngFor='let stroke of item') {{stroke}} .remove((click)='removeItem(item)') × -.add((click)='addItem()') Add... +.add((click)='addItem()') 添加…… diff --git a/tabby-settings/src/components/profilesSettingsTab.component.pug b/tabby-settings/src/components/profilesSettingsTab.component.pug index 6800919..eec4534 100644 --- a/tabby-settings/src/components/profilesSettingsTab.component.pug +++ b/tabby-settings/src/components/profilesSettingsTab.component.pug @@ -1,12 +1,12 @@ -h3.mb-3 Profiles +h3.mb-3 配置文件 ul.nav-tabs(ngbNav, #nav='ngbNav') li(ngbNavItem) - a(ngbNavLink) Profiles + a(ngbNavLink) 配置文件 ng-template(ngbNavContent) .form-line .header - .title Default profile for new tabs + .title 新标签页默认配置文件 select.form-control( [(ngModel)]='config.store.terminal.profile', @@ -30,7 +30,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') button.btn.btn-primary.flex-shrink-0.ml-3((click)='newProfile()') i.fas.fa-fw.fa-plus - | New profile + | 新建配置文件 .list-group.mt-3.mb-3 ng-container(*ngFor='let group of profileGroups') @@ -88,12 +88,12 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') .ml-1(class='badge badge-{{getTypeColorClass(profile)}}') {{getTypeLabel(profile)}} li(ngbNavItem) - a(ngbNavLink) Advanced + a(ngbNavLink) 高级 ng-template(ngbNavContent) .form-line(*ngIf='config.store.profiles.length > 0') .header - .title Show recent profiles in selector - .description Set to 0 to disable recent profiles + .title 在选择器中显示最近的配置文件数 + .description 设置 0 为不显示 input.form-control( type='number', @@ -105,8 +105,8 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') .form-line(*ngIf='config.store.profiles.length > 0') .header - .title Show built-in profiles in selector - .description If disabled, only custom profiles will show up in the profile selector + .title 在选择器中显示内置配置文件 + .description 如果禁用,选择器中仅显示自定义配置文件 toggle( [(ngModel)]='config.store.terminal.showBuiltinProfiles', @@ -115,8 +115,8 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') .form-line .header - .title Default profile settings - .description These apply to all profiles of a given type + .title 默认配置文件设置 + .description 将应用于给定类型的所有配置文件 .list-group.mt-3.mb-3 a.list-group-item.list-group-item-action( diff --git a/tabby-settings/src/components/profilesSettingsTab.component.ts b/tabby-settings/src/components/profilesSettingsTab.component.ts index 961fd80..45f039a 100644 --- a/tabby-settings/src/components/profilesSettingsTab.component.ts +++ b/tabby-settings/src/components/profilesSettingsTab.component.ts @@ -58,7 +58,7 @@ export class ProfilesSettingsTabComponent extends BaseComponent { const profiles = [...this.templateProfiles, ...this.builtinProfiles, ...this.profiles] profiles.sort((a, b) => (a.weight ?? 0) - (b.weight ?? 0)) base = await this.selector.show( - 'Select a base profile to use as a template', + '选择要用作模板的基本配置文件', profiles.map(p => ({ icon: p.icon, description: this.profilesService.getDescription(p) ?? undefined, @@ -98,7 +98,7 @@ export class ProfilesSettingsTabComponent extends BaseComponent { ) const provider = this.profilesService.providerForProfile(profile) if (!provider) { - throw new Error('Cannot edit a profile without a provider') + throw new Error('没有提供程序,无法编辑配置文件') } modal.componentInstance.profile = deepClone(profile) modal.componentInstance.profileProvider = provider @@ -122,8 +122,8 @@ export class ProfilesSettingsTabComponent extends BaseComponent { if ((await this.platform.showMessageBox( { type: 'warning', - message: `Delete "${profile.name}"?`, - buttons: ['Delete', 'Keep'], + message: `确定删除 "${profile.name}" ?`, + buttons: ['确定', '取消'], defaultId: 1, cancelId: 1, } @@ -181,8 +181,8 @@ export class ProfilesSettingsTabComponent extends BaseComponent { if ((await this.platform.showMessageBox( { type: 'warning', - message: `Delete "${group.name}"?`, - buttons: ['Delete', 'Keep'], + message: `确定删除 "${group.name}" ?`, + buttons: ['确定', '取消'], defaultId: 1, cancelId: 1, } @@ -190,8 +190,8 @@ export class ProfilesSettingsTabComponent extends BaseComponent { if ((await this.platform.showMessageBox( { type: 'warning', - message: `Delete the group's profiles?`, - buttons: ['Move to "Ungrouped"', 'Delete'], + message: `删除分组中的所有配置文件?`, + buttons: ['移动至 "Ungrouped" 分组', '删除'], defaultId: 0, cancelId: 0, } diff --git a/tabby-settings/src/components/setVaultPassphraseModal.component.pug b/tabby-settings/src/components/setVaultPassphraseModal.component.pug index f2e3b2f..afbb0ac 100644 --- a/tabby-settings/src/components/setVaultPassphraseModal.component.pug +++ b/tabby-settings/src/components/setVaultPassphraseModal.component.pug @@ -1,13 +1,13 @@ -h3.modal-header.m-0.pb-0 Set master passphrase +h3.modal-header.m-0.pb-0 设置主密码 .modal-body - .mb-2 You can change it later, but it's unrecoverable if forgotten. + .mb-2 您可以在以后更改主密码,但忘记后不能恢复。 .input-group input.form-control.form-control-lg( [type]='showPassphrase ? "text" : "password"', autofocus, [(ngModel)]='passphrase', #input, - placeholder='Master passphrase', + placeholder='输入主密码', (keyup.enter)='ok()', (keyup.esc)='cancel()', ) @@ -16,5 +16,5 @@ h3.modal-header.m-0.pb-0 Set master passphrase i.fas.fa-eye .modal-footer - button.btn.btn-primary((click)='ok()') Set passphrase - button.btn.btn-danger((click)='cancel()') Cancel + button.btn.btn-primary((click)='ok()') 设置主密码 + button.btn.btn-danger((click)='cancel()') 取消 diff --git a/tabby-settings/src/components/settingsTab.component.pug b/tabby-settings/src/components/settingsTab.component.pug index ab7cd17..b0ef7bf 100644 --- a/tabby-settings/src/components/settingsTab.component.pug +++ b/tabby-settings/src/components/settingsTab.component.pug @@ -3,7 +3,7 @@ li(ngbNavItem='application') a(ngbNavLink) i.fas.fa-fw.fa-window-maximize.mr-2 - | Application + | 程序 ng-template(ngbNavContent) .content-box .row @@ -23,59 +23,65 @@ i.fas.fa-sync( [class.fa-spin]='checkingForUpdate' ) - span Check for updates + span 检查更新 button.btn.btn-info.mt-3.mb-2( *ngIf='updateAvailable', (click)='updater.update()', ) i.fas.fa-sync - span Update + span 更新 .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 Report a problem - small.text-muted Generate a pre-filled GitHub issue + div 报告问题 + small.text-muted GitHub issue button.list-group-item.list-group-item-action.link-card((click)='homeBase.openDiscussions()') i.fas.fa-fw.fa-comments div - div Ask a question - small.text-muted On GitHub Discussions + div 提出问题 + small.text-muted GitHub Discussions 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 Source code + small.text-muted 源码 + + button.list-group-item.list-group-item-action.link-card((click)='homeBase.openTabbyCN()') + i.fab.fa-fw.fa-github + div + div Tabby 中文版 + small.text-muted 了解与提出建议 button.list-group-item.list-group-item-action.link-card((click)='showReleaseNotes()') i.fas.fa-fw.fa-book div - div What's new - small.text-muted Show release notes + div 更新日志 + small.text-muted 显示发行说明 button.list-group-item.list-group-item-action.link-card((click)='homeBase.openTwitter()') i.fab.fa-fw.fa-twitter div - div Subscribe to updates - small.text-muted Tabby news and updates on Twitter + div 订阅更新 + small.text-muted Tabby 在 Twitter 上的新闻和更新 - h3 Application settings + h3 程序设置 .form-line(*ngIf='platform.isShellIntegrationSupported()') .header - .title Shell integration - .description Allows quickly opening a terminal in the selected folder + .title Shell 集成 + .description 允许在选择的文件夹中快速打开一个终端 toggle([ngModel]='isShellIntegrationInstalled', (ngModelChange)='toggleShellIntegration()') .form-line(*ngIf='hostApp.platform !== Platform.Web') .header - .title Enable analytics - .description We're only tracking your Tabby and OS versions. + .title 启用分析 + .description 我们只分析您的 Tabby 和操作系统版本 toggle( [(ngModel)]='config.store.enableAnalytics', (ngModelChange)='saveConfiguration(true)', @@ -83,17 +89,17 @@ .form-line(*ngIf='hostApp.platform !== Platform.Web') .header - .title Automatic Updates - .description Enable automatic installation of updates when they become available. + .title 自动更新 + .description 当有更新的版本的时自动更新 toggle([(ngModel)]='config.store.enableAutomaticUpdates', (ngModelChange)='saveConfiguration()') .form-line(*ngIf='hostApp.platform !== Platform.Web') .header - .title Debugging + .title 调试 button.btn.btn-secondary((click)='hostWindow.openDevTools()') i.fas.fa-bug - span Open DevTools + span 打开 DevTools ng-container(*ngFor='let provider of settingsProviders') li(*ngIf='provider.prioritized', [ngbNavItem]='provider.id') @@ -116,17 +122,17 @@ li(ngbNavItem='config-file') a(ngbNavLink) i.fas.fa-fw.fa-code.mr-2 - | 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 Config file + h3 配置文件 textarea.form-control.h-100( [(ngModel)]='configFile' ) .w-100.d-flex.flex-column(*ngIf='showConfigDefaults') - h3 Defaults + h3 默认 textarea.form-control.h-100( [(ngModel)]='configDefaults', readonly @@ -134,20 +140,20 @@ .mt-3.d-flex button.btn.btn-primary((click)='saveConfigFile()', *ngIf='isConfigFileValid()') i.fas.fa-check.mr-2 - | Save and apply + | 保存和应用 button.btn.btn-primary(disabled, *ngIf='!isConfigFileValid()') i.fas.fa-exclamation-triangle.mr-2 - | Invalid syntax + | 无效语法 button.btn.btn-secondary.ml-auto( (click)='showConfigDefaults = !showConfigDefaults' - ) Show defaults + ) 显示默认 button.btn.btn-secondary.ml-3( *ngIf='platform.getConfigPath()', (click)='showConfigFile()' ) i.fas.fa-external-link-square-alt.mr-2 - | Show config file + | 显示配置文件 div([ngbNavOutlet]='nav') -button.btn.btn-warning.btn-block(*ngIf='config.restartRequested', '(click)'='restartApp()') Restart the app to apply changes +button.btn.btn-warning.btn-block(*ngIf='config.restartRequested', '(click)'='restartApp()') 重启程序以应用更改 diff --git a/tabby-settings/src/components/vaultSettingsTab.component.pug b/tabby-settings/src/components/vaultSettingsTab.component.pug index f610803..af3e662 100644 --- a/tabby-settings/src/components/vaultSettingsTab.component.pug +++ b/tabby-settings/src/components/vaultSettingsTab.component.pug @@ -1,27 +1,27 @@ .text-center(*ngIf='!vault.isEnabled()') i.fas.fa-key.fa-3x.m-3 - h3.m-3 Vault is not configured - .m-3 Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases. - button.btn.btn-primary.m-2((click)='enableVault()') Set master passphrase + h3.m-3 未配置保管库 + .m-3 保管库是一个始终加密的容器,用于保管 secrets 例如 SSH 和私钥等. + button.btn.btn-primary.m-2((click)='enableVault()') 设置主密码 div(*ngIf='vault.isEnabled()') .d-flex.align-items-center.mb-3 - h3.m-0 Vault + h3.m-0 保管库 .d-flex.ml-auto(ngbDropdown, *ngIf='vault.isEnabled()') - button.btn.btn-secondary(ngbDropdownToggle) Options + button.btn.btn-secondary(ngbDropdownToggle) 选项 div(ngbDropdownMenu) a(ngbDropdownItem, (click)='changePassphrase()') i.fas.fa-fw.fa-key - span Change the master passphrase + span 更改主密码 a(ngbDropdownItem, (click)='disableVault()') i.fas.fa-fw.fa-radiation-alt - span Erase the vault + span 清除保管库 div(*ngIf='vaultContents') .text-center(*ngIf='!vaultContents.secrets.length') i.fas.fa-empty-set.fa-3x - h3.m-3 Vault is empty + h3.m-3 保管库为空 .list-group .list-group-item.d-flex.align-items-center.p-1.pl-3(*ngFor='let secret of vaultContents.secrets') @@ -38,30 +38,30 @@ div(*ngIf='vault.isEnabled()') (click)='renameFile(secret)' ) i.fas.fa-fw.fa-pencil-alt - span Rename + span 重命名 button( ngbDropdownItem, *ngIf='secret.type === VAULT_SECRET_TYPE_FILE', (click)='replaceFileContent(secret)' ) i.fas.fa-fw.fa-file-import - span Replace + span 替换 button( ngbDropdownItem, *ngIf='secret.type === VAULT_SECRET_TYPE_FILE', (click)='exportFile(secret)' ) i.fas.fa-fw.fa-file-export - span Export + span 导出 button(ngbDropdownItem, (click)='removeSecret(secret)') i.fas.fa-fw.fa-trash - span Delete + span 删除 - h3.mt-5 Options + h3.mt-5 选项 .form-line .header - .title Encrypt config file - .description Puts all of Tabby's configuration into the vault + .title 加密配置文件 + .description 将 Tabby 的所有配置保存到保管库 toggle( [ngModel]='config.store.encrypted', (click)='toggleConfigEncrypted()', @@ -69,5 +69,5 @@ div(*ngIf='vault.isEnabled()') .text-center(*ngIf='!vaultContents') i.fas.fa-key.fa-3x - h3.m-3 Vault is locked - button.btn.btn-primary.m-2((click)='loadVault()') Show vault contents + h3.m-3 保管库已锁定 + button.btn.btn-primary.m-2((click)='loadVault()') 显示保管库内容 diff --git a/tabby-settings/src/components/vaultSettingsTab.component.ts b/tabby-settings/src/components/vaultSettingsTab.component.ts index 1520c00..4e80fe2 100644 --- a/tabby-settings/src/components/vaultSettingsTab.component.ts +++ b/tabby-settings/src/components/vaultSettingsTab.component.ts @@ -43,8 +43,8 @@ export class VaultSettingsTabComponent extends BaseComponent { if ((await this.platform.showMessageBox( { type: 'warning', - message: 'Delete vault contents?', - buttons: ['Delete', 'Keep'], + message: '删除保管库内容?', + buttons: ['删除', '取消'], defaultId: 1, cancelId: 1, } diff --git a/tabby-settings/src/components/windowSettingsTab.component.pug b/tabby-settings/src/components/windowSettingsTab.component.pug index a4c1ae9..2d7aec8 100644 --- a/tabby-settings/src/components/windowSettingsTab.component.pug +++ b/tabby-settings/src/components/windowSettingsTab.component.pug @@ -1,8 +1,8 @@ -h3.mb-3 Window +h3.mb-3 窗口 .form-line .header - .title Theme + .title 主题 select.form-control( [(ngModel)]='config.store.appearance.theme', (ngModelChange)='saveConfiguration()', @@ -12,8 +12,8 @@ h3.mb-3 Window .form-line(*ngIf='hostApp.platform === Platform.Web') .header - .title Ask before closing the browser tab - .description Prevents accidental closing + .title 关闭标签页时询问 + .description 防止意外关闭 toggle( [(ngModel)]='config.store.web.preventAccidentalTabClosure', (ngModelChange)='saveConfiguration()', @@ -22,9 +22,9 @@ h3.mb-3 Window .form-line(*ngIf='platform.supportsWindowControls') .header - .title(*ngIf='hostApp.platform !== Platform.macOS') Acrylic background + .title(*ngIf='hostApp.platform !== Platform.macOS') Acrylic 背景 .title(*ngIf='hostApp.platform === Platform.macOS') Vibrancy - .description Gives the window a blurred transparent background + .description 给窗口一个模糊透明的背景 toggle( [(ngModel)]='config.store.appearance.vibrancy', @@ -33,7 +33,7 @@ h3.mb-3 Window .form-line(*ngIf='config.store.appearance.vibrancy && isFluentVibrancySupported') .header - .title Background type + .title 背景类型 .btn-group( [(ngModel)]='config.store.appearance.vibrancyType', (ngModelChange)='saveConfiguration()', @@ -56,7 +56,7 @@ h3.mb-3 Window .form-line(*ngIf='platform.supportsWindowControls') .header - .title Opacity + .title 不透明度 input( type='range', [(ngModel)]='config.store.appearance.opacity', @@ -68,8 +68,8 @@ h3.mb-3 Window .form-line(*ngIf='platform.supportsWindowControls') .header - .title Window frame - .description Whether a custom window or an OS native window should be used + .title Window 框架 + .description 应该使用自定义窗口还是操作系统原生窗口 .btn-group( [(ngModel)]='config.store.appearance.frame', @@ -82,28 +82,28 @@ h3.mb-3 Window ngbButton, [value]='"native"' ) - | Native + | 原生 label.btn.btn-secondary(ngbButtonLabel) input( type='radio', ngbButton, [value]='"thin"' ) - | Thin + | 细的 label.btn.btn-secondary(ngbButtonLabel) input( type='radio', ngbButton, [value]='"full"' ) - | Full + | 完全 -h3.mt-4 Docking +h3.mt-4 停靠 .form-line(*ngIf='docking') .header - .title Dock the terminal - .description Snaps the window to a side of the screen + .title 停靠终端 + .description 将窗口贴到屏幕的某一边 .btn-group( [(ngModel)]='config.store.appearance.dock', @@ -116,40 +116,40 @@ h3.mt-4 Docking ngbButton, [value]='"off"' ) - | Off + | 关闭 label.btn.btn-secondary(ngbButtonLabel) input( type='radio', ngbButton, [value]='"top"' ) - | Top + | 顶部 label.btn.btn-secondary(ngbButtonLabel) input( type='radio', ngbButton, [value]='"left"' ) - | Left + | 左边 label.btn.btn-secondary(ngbButtonLabel) input( type='radio', ngbButton, [value]='"right"' ) - | Right + | 右边 label.btn.btn-secondary(ngbButtonLabel) input( type='radio', ngbButton, [value]='"bottom"' ) - | Bottom + | 底部 .ml-5.form-line(*ngIf='docking && config.store.appearance.dock != "off"') .header - .title Display on - .description Snaps the window to a side of the screen + .title 显示于 + .description 作用范围 div( [(ngModel)]='config.store.appearance.dockScreen', @@ -162,7 +162,7 @@ h3.mt-4 Docking ngbButton, value='current' ) - | Current + | 当前 label.btn.btn-secondary(*ngFor='let screen of screens', ngbButtonLabel) input( type='radio', @@ -173,8 +173,8 @@ h3.mt-4 Docking .ml-5.form-line(*ngIf='docking && config.store.appearance.dock != "off"') .header - .title Dock always on top - .description Keep docked terminal always on top + .title 置顶窗口 + .description 总是保持终端在最上 toggle( [(ngModel)]='config.store.appearance.dockAlwaysOnTop', (ngModelChange)='saveConfiguration(); docking.dock()', @@ -182,7 +182,7 @@ h3.mt-4 Docking .ml-5.form-line(*ngIf='docking && config.store.appearance.dock != "off"') .header - .title Docked terminal size + .title 停靠终端大小 input( type='range', [(ngModel)]='config.store.appearance.dockFill', @@ -194,7 +194,7 @@ h3.mt-4 Docking .ml-5.form-line(*ngIf='docking && config.store.appearance.dock != "off"') .header - .title Docked terminal space + .title 停靠终端空间 input( type='range', [(ngModel)]='config.store.appearance.dockSpace', @@ -206,18 +206,18 @@ h3.mt-4 Docking .ml-5.form-line(*ngIf='docking && config.store.appearance.dock != "off"') .header - .title Hide dock on blur - .description Hides the docked terminal when you click away. + .title 模糊时隐藏停靠点 + .description 点击别处时隐藏停靠的终端 toggle( [(ngModel)]='config.store.appearance.dockHideOnBlur', (ngModelChange)='saveConfiguration(); ', ) -h3.mt-4 Tabs +h3.mt-4 标签页 .form-line .header - .title Tabs location + .title 标签页位置 .btn-group( [(ngModel)]='config.store.appearance.tabsLocation', (ngModelChange)='saveConfiguration()', @@ -229,32 +229,32 @@ h3.mt-4 Tabs ngbButton, [value]='"top"' ) - | Top + | 顶部 label.btn.btn-secondary(ngbButtonLabel) input( type='radio', ngbButton, [value]='"bottom"' ) - | Bottom + | 底部 label.btn.btn-secondary(ngbButtonLabel) input( type='radio', ngbButton, [value]='"left"' ) - | Left + | 左边 label.btn.btn-secondary(ngbButtonLabel) input( type='radio', ngbButton, [value]='"right"' ) - | Right + | 右边 .form-line .header - .title Tabs width + .title 标签页宽度 .btn-group( [(ngModel)]='config.store.appearance.flexTabs', (ngModelChange)='saveConfiguration()', @@ -266,18 +266,18 @@ h3.mt-4 Tabs ngbButton, [value]='true' ) - | Dynamic + | 动态 label.btn.btn-secondary(ngbButtonLabel) input( type='radio', ngbButton, [value]='false' ) - | Fixed + | 固定 .form-line .header - .title Hide tab index + .title 隐藏标签页序号 toggle( [(ngModel)]='config.store.terminal.hideTabIndex', @@ -286,7 +286,7 @@ h3.mt-4 Tabs .form-line .header - .title Hide tab close button + .title 隐藏标签页关闭按钮 toggle( [(ngModel)]='config.store.terminal.hideCloseButton', @@ -297,8 +297,8 @@ h3.mt-4 Hacks .form-line .header - .title Disable GPU acceleration - .description Tick this if you're experiencing aliasing, ghosting or other visual issues + .title 关闭 GPU 加速 + .description 如果您遇到重叠、重影或其他视觉问题就勾选 toggle( [(ngModel)]='config.store.hacks.disableGPU', diff --git a/tabby-settings/src/settings.ts b/tabby-settings/src/settings.ts index b10a425..a93dc4a 100644 --- a/tabby-settings/src/settings.ts +++ b/tabby-settings/src/settings.ts @@ -11,7 +11,7 @@ import { ProfilesSettingsTabComponent } from './components/profilesSettingsTab.c export class HotkeySettingsTabProvider extends SettingsTabProvider { id = 'hotkeys' icon = 'keyboard' - title = 'Hotkeys' + title = '热键' getComponentType (): any { return HotkeySettingsTabComponent @@ -24,7 +24,7 @@ export class HotkeySettingsTabProvider extends SettingsTabProvider { export class WindowSettingsTabProvider extends SettingsTabProvider { id = 'window' icon = 'window-maximize' - title = 'Window' + title = '窗口' getComponentType (): any { return WindowSettingsTabComponent @@ -37,7 +37,7 @@ export class WindowSettingsTabProvider extends SettingsTabProvider { export class VaultSettingsTabProvider extends SettingsTabProvider { id = 'vault' icon = 'key' - title = 'Vault' + title = '保管库' getComponentType (): any { return VaultSettingsTabComponent @@ -50,7 +50,7 @@ export class VaultSettingsTabProvider extends SettingsTabProvider { export class ProfilesSettingsTabProvider extends SettingsTabProvider { id = 'profiles' icon = 'window-restore' - title = 'Profiles & connections' + title = '配置文件和连接' prioritized = true getComponentType (): any { @@ -63,7 +63,7 @@ export class ProfilesSettingsTabProvider extends SettingsTabProvider { export class ConfigSyncSettingsTabProvider extends SettingsTabProvider { id = 'config-sync' icon = 'cloud' - title = 'Config sync' + title = '同步配置' getComponentType (): any { return ConfigSyncSettingsTabComponent diff --git a/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.pug b/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.pug index 793c3c6..dc234d5 100644 --- a/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.pug +++ b/tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.pug @@ -1,5 +1,5 @@ .d-flex - strong Keyboard-interactive auth + strong 键盘交互认证 .ml-2 {{prompt.name}} .prompt-text {{prompt.prompts[step].prompt}} @@ -22,5 +22,5 @@ input.form-control.mt-2( button.btn.btn-primary( (click)='next()' ) - span(*ngIf='step < prompt.prompts.length - 1') Next - span(*ngIf='step == prompt.prompts.length - 1') Finish + span(*ngIf='step < prompt.prompts.length - 1') 下一个 + span(*ngIf='step == prompt.prompts.length - 1') 完成 diff --git a/tabby-ssh/src/components/sftpDeleteModal.component.pug b/tabby-ssh/src/components/sftpDeleteModal.component.pug index 0c9913e..b2f65d5 100644 --- a/tabby-ssh/src/components/sftpDeleteModal.component.pug +++ b/tabby-ssh/src/components/sftpDeleteModal.component.pug @@ -1,6 +1,6 @@ .modal-body - label Deleting + label 删除中 .no-wrap {{progressMessage}} .modal-footer - button.btn.btn-danger((click)='cancel()') Cancel + button.btn.btn-danger((click)='cancel()') 取消 diff --git a/tabby-ssh/src/components/sftpPanel.component.pug b/tabby-ssh/src/components/sftpPanel.component.pug index 54df59f..3593df9 100644 --- a/tabby-ssh/src/components/sftpPanel.component.pug +++ b/tabby-ssh/src/components/sftpPanel.component.pug @@ -8,21 +8,21 @@ button.btn.btn-link.btn-sm.d-flex((click)='upload()') i.fas.fa-upload.mr-1 - div Upload + div 上传 button.btn.btn-link.btn-close((click)='close()') !{require('../../../tabby-core/src/icons/times.svg')} .body(dropZone, (transfer)='uploadOne($event)') - div(*ngIf='!sftp') Connecting + div(*ngIf='!sftp') 连接中 div(*ngIf='sftp') - div(*ngIf='fileList === null') Loading + div(*ngIf='fileList === null') 加载中 .list-group.list-group-light(*ngIf='fileList !== null') .list-group-item.list-group-item-action.d-flex.align-items-center( *ngIf='path !== "/"', (click)='goUp()' ) i.fas.fa-fw.fa-level-up-alt - div Go up + div 增加 .list-group-item.list-group-item-action.d-flex.align-items-center( *ngFor='let item of fileList', (contextmenu)='showContextMenu(item, $event)', diff --git a/tabby-ssh/src/components/sshPortForwardingConfig.component.pug b/tabby-ssh/src/components/sshPortForwardingConfig.component.pug index 9174700..5ed7c30 100644 --- a/tabby-ssh/src/components/sshPortForwardingConfig.component.pug +++ b/tabby-ssh/src/components/sshPortForwardingConfig.component.pug @@ -2,18 +2,18 @@ .list-group-item.d-flex.align-items-center(*ngFor='let fw of model') div .ms-2.d-flex.align-items-center - strong(*ngIf='fw.type === PortForwardType.Local') Local - strong(*ngIf='fw.type === PortForwardType.Remote') Remote - strong(*ngIf='fw.type === PortForwardType.Dynamic') Dynamic + strong(*ngIf='fw.type === PortForwardType.Local') 本地 + strong(*ngIf='fw.type === PortForwardType.Remote') 远程 + strong(*ngIf='fw.type === PortForwardType.Dynamic') 动态 .ml-3 {{fw.host}}:{{fw.port}} .ml-2 → .ml-2(*ngIf='fw.type !== PortForwardType.Dynamic') {{fw.targetAddress}}:{{fw.targetPort}} - .ml-2(*ngIf='fw.type === PortForwardType.Dynamic') SOCKS proxy + .ml-2(*ngIf='fw.type === PortForwardType.Dynamic') SOCKS 代理 div {{fw.description}} button.btn.btn-link.hover-reveal.ml-auto((click)='remove(fw)') i.fas.fa-trash-alt -h5 Add a port forward +h5 添加端口转发 .input-group.mb-2(*ngIf='newForward.type === PortForwardType.Dynamic') input.form-control(type='text', [(ngModel)]='newForward.host') @@ -22,7 +22,7 @@ h5 Add a port forward input.form-control(type='number', [(ngModel)]='newForward.port') .input-group-append .input-group-text → - .input-group-append.input-group-text(style='flex: 3 1 0') SOCKS proxy + .input-group-append.input-group-text(style='flex: 3 1 0') SOCKS 代理 .input-group.mb-2(*ngIf='newForward.type !== PortForwardType.Dynamic') input.form-control(type='text', [(ngModel)]='newForward.host') @@ -50,22 +50,22 @@ h5 Add a port forward ngbButton, [value]='PortForwardType.Local' ) - | Local + | 本地 label.btn.btn-secondary.m-0(ngbButtonLabel) input( type='radio', ngbButton, [value]='PortForwardType.Remote' ) - | Remote + | 远程 label.btn.btn-secondary.m-0(ngbButtonLabel) input( type='radio', ngbButton, [value]='PortForwardType.Dynamic' ) - | Dynamic + | 动态 button.btn.btn-primary((click)='addForward()') i.fas.fa-check.mr-2 - span Forward port + span 转发端口 diff --git a/tabby-ssh/src/components/sshPortForwardingModal.component.pug b/tabby-ssh/src/components/sshPortForwardingModal.component.pug index e4a3f2f..628df38 100644 --- a/tabby-ssh/src/components/sshPortForwardingModal.component.pug +++ b/tabby-ssh/src/components/sshPortForwardingModal.component.pug @@ -1,5 +1,5 @@ .modal-header(*ngIf='session.forwardedPorts.length') - h5.m-0 Forwarded ports + h5.m-0 端口转发 .modal-body.pt-0 ssh-port-forwarding-config( diff --git a/tabby-ssh/src/components/sshProfileSettings.component.pug b/tabby-ssh/src/components/sshProfileSettings.component.pug index 099fb06..6a6ad8a 100644 --- a/tabby-ssh/src/components/sshProfileSettings.component.pug +++ b/tabby-ssh/src/components/sshProfileSettings.component.pug @@ -1,50 +1,50 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') li(ngbNavItem) - a(ngbNavLink) General + a(ngbNavLink) 常规 ng-template(ngbNavContent) .d-flex.w-100.mt-3 .form-group.mr-2( ngbDropdown ) - label Connection + label 连接 button.btn.btn-secondary.d-block(ngbDropdownToggle) {{getConnectionDropdownTitle()}} div(ngbDropdownMenu) button.dropdown-item( (click)='connectionMode = "direct"', - ) Direct + ) 直接连接 button.dropdown-item( *ngIf='hostApp.platform !== Platform.Web', (click)='connectionMode = "proxyCommand"', ) div Proxy command - .text-muted Command's stdin/stdout is used instead of a network connection + .text-muted 使用标准输入/输出的命令而不是网络连接 button.dropdown-item( (click)='connectionMode = "jumpHost"', ) div Jump host - .text-muted Connect to a different host first and use it as a proxy + .text-muted 连接到一个不同的主机并使其作为代理 button.dropdown-item( (click)='connectionMode = "socksProxy"', ) div SOCKS proxy - .text-muted Connect through a proxy server + .text-muted 连接到代理服务器 .form-group.w-100(*ngIf='connectionMode === "proxyCommand"') - label Proxy command + label 代理命令 input.form-control( type='text', [(ngModel)]='profile.options.proxyCommand', ) .form-group.w-100.mr-2(*ngIf='connectionMode !== "proxyCommand"') - label Host + label 主机 input.form-control( type='text', [(ngModel)]='profile.options.host', ) .form-group(*ngIf='connectionMode !== "proxyCommand"') - label Port + label 端口 input.form-control( type='number', placeholder='22', @@ -52,22 +52,22 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') ) .form-group(*ngIf='connectionMode === "jumpHost"') - label Jump host + label 跳转主机 select.form-control([(ngModel)]='profile.options.jumpHost') - option([ngValue]='null') Select + option([ngValue]='null') 选择 option([ngValue]='x.id', *ngFor='let x of jumpHosts') {{x.name}} .d-flex.w-100(*ngIf='connectionMode === "socksProxy"') .form-group.w-100.mr-2 - label SOCKS proxy host + label SOCKS 代理主机 input.form-control( type='text', [(ngModel)]='profile.options.socksProxyHost', ) .form-group - label SOCKS proxy port + label SOCKS 代理端口 input.form-control( type='number', placeholder='5000', @@ -83,7 +83,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') ) .form-group - label Authentication method + label 认证方法 .btn-group.mt-1.w-100( [(ngModel)]='profile.options.auth', @@ -92,38 +92,38 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') label.btn.btn-secondary(ngbButtonLabel) input(type='radio', ngbButton, [value]='null') i.far.fa-lightbulb - .m-0 Auto + .m-0 自动 label.btn.btn-secondary(ngbButtonLabel) input(type='radio', ngbButton, [value]='"password"') i.fas.fa-font - .m-0 Password + .m-0 密码 label.btn.btn-secondary(ngbButtonLabel) input(type='radio', ngbButton, [value]='"publicKey"') i.fas.fa-key - .m-0 Key + .m-0 秘钥 label.btn.btn-secondary(ngbButtonLabel, ng:if='hostApp.platform !== Platform.Web') input(type='radio', ngbButton, [value]='"agent"') i.fas.fa-user-secret - .m-0 Agent + .m-0 代理 label.btn.btn-secondary(ngbButtonLabel) input(type='radio', ngbButton, [value]='"keyboardInteractive"') i.far.fa-keyboard - .m-0 Interactive + .m-0 交互 .form-line(*ngIf='profile.options.user && (!profile.options.auth || profile.options.auth === "password")') .header - .title Password - .description(*ngIf='!hasSavedPassword') Save a password in the keychain - .description(*ngIf='hasSavedPassword') There is a saved password for this connection + .title 密码 + .description(*ngIf='!hasSavedPassword') 保存密码 + .description(*ngIf='hasSavedPassword') 此连接有一个已保存的密码 button.btn.btn-success.ml-4(*ngIf='!hasSavedPassword', (click)='setPassword()') i.fas.fa-key - span Set password + span 设置密码 button.btn.btn-danger.ml-4(*ngIf='hasSavedPassword', (click)='clearSavedPassword()') i.fas.fa-trash-alt - span Forget + span 忘记 .form-group(*ngIf='!profile.options.auth || profile.options.auth === "publicKey"') - label Private keys + label 私钥 .list-group.mb-2 .list-group-item.d-flex.align-items-center.p-1.pl-3(*ngFor='let path of profile.options.privateKeys') i.fas.fa-key @@ -132,10 +132,10 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') i.fas.fa-trash button.btn.btn-secondary((click)='addPrivateKey()') i.fas.fa-folder-open - span Add a private key + span 添加私钥 li(ngbNavItem) - a(ngbNavLink) Ports + a(ngbNavLink) 端口转发 ng-template(ngbNavContent) ssh-port-forwarding-config( [model]='profile.options.forwardedPorts', @@ -144,33 +144,33 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') ) li(ngbNavItem) - a(ngbNavLink) Advanced + a(ngbNavLink) 高级 ng-template(ngbNavContent) .form-line(ng:if='hostApp.platform !== Platform.Web') .header - .title X11 forwarding + .title X11 转发 toggle([(ngModel)]='profile.options.x11') .form-line(ng:if='hostApp.platform !== Platform.Web') .header - .title Agent forwarding + .title Agent 转发 toggle([(ngModel)]='profile.options.agentForward') .form-line .header - .title Skip MoTD/banner - .description Will prevent the SSH greeting from showing up + .title 跳过 MoTD/banner + .description 将会阻止 SSH 问候 toggle([(ngModel)]='profile.options.skipBanner') .form-line .header - .title Reuse session for multiple tabs - .description Multiplex multiple shells through the same connection + .title 在多个标签页中复用会话 + .description 多个 shell 同属一个连接 toggle([(ngModel)]='profile.options.reuseSession') .form-line .header - .title Keep Alive Interval (Milliseconds) + .title 保活间隔时间(ms) input.form-control( type='number', placeholder='0', @@ -179,7 +179,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') .form-line .header - .title Max Keep Alive Count + .title 最大尝试保活次数 input.form-control( type='number', placeholder='3', @@ -188,7 +188,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') .form-line .header - .title Ready Timeout (Milliseconds) + .title 读取超时时间(ms) input.form-control( type='number', placeholder='20000', @@ -196,7 +196,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') ) li(ngbNavItem) - a(ngbNavLink) Ciphers + a(ngbNavLink) 加密算法 ng-template(ngbNavContent) .form-line.align-items-start .header @@ -227,7 +227,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') checkbox([text]='alg', [(ngModel)]='algorithms.serverHostKey[alg]') li(ngbNavItem) - a(ngbNavLink) Login scripts + a(ngbNavLink) 登录脚本 ng-template(ngbNavContent) login-scripts-settings([options]='profile.options', #loginScriptsSettings) diff --git a/tabby-ssh/src/components/sshSettingsTab.component.pug b/tabby-ssh/src/components/sshSettingsTab.component.pug index 2f49e9e..e39e2cc 100644 --- a/tabby-ssh/src/components/sshSettingsTab.component.pug +++ b/tabby-ssh/src/components/sshSettingsTab.component.pug @@ -2,7 +2,7 @@ h3 SSH .form-line .header - .title Warn when closing active connections + .title 关闭活动的连接时警告 toggle( [(ngModel)]='config.store.ssh.warnOnClose', (ngModelChange)='config.save()', @@ -10,8 +10,8 @@ h3 SSH .form-line(*ngIf='hostApp.platform === Platform.Windows') .header - .title WinSCP path - .description When WinSCP is detected, you can launch an SCP session from the context menu. + .title WinSCP 路径 + .description 当检测到 WinSCP 时您可以从菜单中启动一个 SCP 会话 input.form-control( type='text', placeholder='Auto-detect', @@ -21,19 +21,19 @@ h3 SSH .form-line(*ngIf='hostApp.platform === Platform.Windows') .header - .title Agent type - .description Forces a specific SSH agent connection type. + .title Agent 类型 + .description 强制指定 SSH 代理连接类型 select.form-control( [(ngModel)]='config.store.ssh.agentType', (ngModelChange)='config.save()', ) - option(value='auto') Automatic + option(value='auto') 自动 option(value='pageant') Pageant option(value='pipe') Named pipe .form-line(*ngIf='config.store.ssh.agentType === "pipe"') .header - .title Agent pipe path + .title Agent pipe 路径 .description Sets the SSH agent's named pipe path. input.form-control( type='text', diff --git a/tabby-ssh/src/components/sshTab.component.pug b/tabby-ssh/src/components/sshTab.component.pug index 136211f..40d9d85 100644 --- a/tabby-ssh/src/components/sshTab.component.pug +++ b/tabby-ssh/src/components/sshTab.component.pug @@ -17,13 +17,13 @@ .bg-dark(ngbDropdownMenu) a.d-flex.align-items-center(ngbDropdownItem, (click)='platform.openExternal("https://tabby.sh/go/cwd-detection")') .mr-auto - strong Working directory detection - div Learn how to allow Tabby to detect remote shell's working directory. + strong 检测工作目录 + div 了解如何让 Tabby 检测远程 Shell 程序的工作目录 i.fas.fa-arrow-right.ml-4 button.btn.btn-sm.btn-link.mr-2((click)='reconnect()') i.fas.fa-redo - span Reconnect + span 重新连接 button.btn.btn-sm.btn-link.mr-2((click)='openSFTP()', *ngIf='session && session.open') i.far.fa-folder-open @@ -34,7 +34,7 @@ (click)='showPortForwarding()' ) i.fas.fa-plug - span Ports + span 端口转发 sftp-panel.bg-dark( diff --git a/tabby-ssh/src/components/sshTab.component.ts b/tabby-ssh/src/components/sshTab.component.ts index 822c2f3..309fd74 100644 --- a/tabby-ssh/src/components/sshTab.component.ts +++ b/tabby-ssh/src/components/sshTab.component.ts @@ -45,7 +45,7 @@ export class SSHTabComponent extends BaseTerminalTabComponent { ngOnInit (): void { if (!this.profile) { - throw new Error('Profile not set') + throw new Error('未设置配置文件') } this.logger = this.log.create('terminalTab') @@ -138,9 +138,9 @@ export class SSHTabComponent extends BaseTerminalTabComponent { }) if (!session.open) { - this.write('\r\n' + colors.black.bgWhite(' SSH ') + ` Connecting to ${session.profile.options.host}\r\n`) + this.write('\r\n' + colors.black.bgWhite(' SSH ') + ` 连接到 ${session.profile.options.host}\r\n`) - this.startSpinner('Connecting') + this.startSpinner('连接中') try { await session.start() @@ -169,10 +169,10 @@ export class SSHTabComponent extends BaseTerminalTabComponent { this.destroy() } else if (this.frontend) { // Session was closed abruptly - this.write('\r\n' + colors.black.bgWhite(' SSH ') + ` ${this.sshSession?.profile.options.host}: session closed\r\n`) + this.write('\r\n' + colors.black.bgWhite(' SSH ') + ` ${this.sshSession?.profile.options.host}: 会话关闭\r\n`) if (!this.reconnectOffered) { this.reconnectOffered = true - this.write('Press any key to reconnect\r\n') + this.write('按任意键重新连接\r\n') this.input$.pipe(first()).subscribe(() => { if (!this.session?.open && this.reconnectOffered) { this.reconnect() @@ -187,7 +187,7 @@ export class SSHTabComponent extends BaseTerminalTabComponent { async initializeSession (): Promise { this.reconnectOffered = false if (!this.profile) { - this.logger.error('No SSH connection info supplied') + this.logger.error('未提供 SSH 连接信息') return } @@ -239,8 +239,8 @@ export class SSHTabComponent extends BaseTerminalTabComponent { return (await this.platform.showMessageBox( { type: 'warning', - message: `Disconnect from ${this.profile?.options.host}?`, - buttons: ['Disconnect', 'Do not close'], + message: `确定与 ${this.profile?.options.host} 断开连接?`, + buttons: ['确定', '取消'], defaultId: 0, cancelId: 1, } diff --git a/tabby-ssh/src/hotkeys.ts b/tabby-ssh/src/hotkeys.ts index 658d06c..6a7a0e8 100644 --- a/tabby-ssh/src/hotkeys.ts +++ b/tabby-ssh/src/hotkeys.ts @@ -7,11 +7,11 @@ export class SSHHotkeyProvider extends HotkeyProvider { hotkeys: HotkeyDescription[] = [ { id: 'restart-ssh-session', - name: 'Restart current SSH session', + name: '重新打开当前 SSH 会话', }, { id: 'launch-winscp', - name: 'Launch WinSCP for current SSH session', + name: '为当前 SSH 会话启动 WinSCP', }, ] diff --git a/tabby-ssh/src/session/forwards.ts b/tabby-ssh/src/session/forwards.ts index 8220e3a..8db4949 100644 --- a/tabby-ssh/src/session/forwards.ts +++ b/tabby-ssh/src/session/forwards.ts @@ -45,7 +45,7 @@ export class ForwardedPort implements ForwardedPortConfig { this.listener['useAuth'](socksv5.auth.None()) }) } else { - throw new Error('Invalid forward type for a local listener') + throw new Error('无效的本地监听器转发类型') } } diff --git a/tabby-ssh/src/session/shell.ts b/tabby-ssh/src/session/shell.ts index 3669175..3061ad3 100644 --- a/tabby-ssh/src/session/shell.ts +++ b/tabby-ssh/src/session/shell.ts @@ -28,7 +28,7 @@ export class SSHShellSession extends BaseSession { async start (): Promise { if (!this.ssh) { - throw new Error('SSH session not set') + throw new Error('未设置 SSH 会话') } this.ssh.ref() diff --git a/tabby-ssh/src/session/ssh.ts b/tabby-ssh/src/session/ssh.ts index 7ae5080..6ac06fd 100644 --- a/tabby-ssh/src/session/ssh.ts +++ b/tabby-ssh/src/session/ssh.ts @@ -393,12 +393,12 @@ export class SSHSession { } if (methodsLeft && !methodsLeft.includes(method.type) && method.type !== 'agent') { // Agent can still be used even if not in methodsLeft - this.logger.info('Server does not support auth method', method.type) + this.logger.info('服务器不支持认证方法', method.type) continue } if (method.type === 'password') { if (this.profile.options.password) { - this.emitServiceMessage('Using preset password') + this.emitServiceMessage('使用预设密码') return { type: 'password', username: this.authUsername, @@ -409,7 +409,7 @@ export class SSHSession { if (!this.keychainPasswordUsed && this.profile.options.user) { const password = await this.passwordStorage.loadPassword(this.profile) if (password) { - this.emitServiceMessage('Trying saved password') + this.emitServiceMessage('尝试保存密码') this.keychainPasswordUsed = true return { type: 'password', diff --git a/tabby-ssh/src/sftpContextMenu.ts b/tabby-ssh/src/sftpContextMenu.ts index 726a449..cb50ce8 100644 --- a/tabby-ssh/src/sftpContextMenu.ts +++ b/tabby-ssh/src/sftpContextMenu.ts @@ -25,16 +25,16 @@ export class CommonSFTPContextMenu extends SFTPContextMenuItemProvider { click: async () => { if ((await this.platform.showMessageBox({ type: 'warning', - message: `Delete ${item.fullPath}?`, + message: `确定删除 ${item.fullPath} ?`, defaultId: 0, cancelId: 1, - buttons: ['Delete', 'Cancel'], + buttons: ['确定', '取消'], })).response === 0) { await this.deleteItem(item, panel.sftp) panel.navigate(panel.path) } }, - label: 'Delete', + label: '删除', }, ] } diff --git a/tabby-ssh/src/tabContextMenu.ts b/tabby-ssh/src/tabContextMenu.ts index bf96a32..a67b60e 100644 --- a/tabby-ssh/src/tabContextMenu.ts +++ b/tabby-ssh/src/tabContextMenu.ts @@ -21,14 +21,14 @@ export class SFTPContextMenu extends TabContextMenuItemProvider { return [] } const items = [{ - label: 'Open SFTP panel', + label: '打开 SFTP 面板', click: () => { tab.openSFTP() }, }] if (this.hostApp.platform === Platform.Windows && this.ssh.getWinSCPPath()) { items.push({ - label: 'Launch WinSCP', + label: '启动 WinSCP', click: (): void => { this.ssh.launchWinSCP(tab.sshSession!) }, diff --git a/tabby-telnet/src/components/telnetProfileSettings.component.pug b/tabby-telnet/src/components/telnetProfileSettings.component.pug index 35cc448..8b761f4 100644 --- a/tabby-telnet/src/components/telnetProfileSettings.component.pug +++ b/tabby-telnet/src/components/telnetProfileSettings.component.pug @@ -1,16 +1,16 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') li(ngbNavItem) - a(ngbNavLink) General + a(ngbNavLink) 常规 ng-template(ngbNavContent) .form-group - label Host + label 主机 input.form-control( type='text', [(ngModel)]='profile.options.host', ) .form-group - label Port + label 端口 input.form-control( type='number', placeholder='22', @@ -20,7 +20,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') stream-processing-settings([options]='profile.options') li(ngbNavItem) - a(ngbNavLink) Login scripts + a(ngbNavLink) 登录脚本 ng-template(ngbNavContent) login-scripts-settings([options]='profile.options') diff --git a/tabby-telnet/src/components/telnetTab.component.pug b/tabby-telnet/src/components/telnetTab.component.pug index a3e8dd1..f9c179c 100644 --- a/tabby-telnet/src/components/telnetTab.component.pug +++ b/tabby-telnet/src/components/telnetTab.component.pug @@ -8,4 +8,4 @@ button.btn.btn-sm.btn-link.mr-2((click)='reconnect()') i.fas.fa-redo - span Reconnect + span 重新连接 diff --git a/tabby-telnet/src/components/telnetTab.component.ts b/tabby-telnet/src/components/telnetTab.component.ts index 9643869..9e578e8 100644 --- a/tabby-telnet/src/components/telnetTab.component.ts +++ b/tabby-telnet/src/components/telnetTab.component.ts @@ -118,8 +118,8 @@ export class TelnetTabComponent extends BaseTerminalTabComponent { return (await this.platform.showMessageBox( { type: 'warning', - message: `Disconnect from ${this.profile?.options.host}?`, - buttons: ['Disconnect', 'Do not close'], + message: `确定与 ${this.profile?.options.host} 断开连接?`, + buttons: ['确定', '取消'], defaultId: 0, cancelId: 1, } diff --git a/tabby-telnet/src/hotkeys.ts b/tabby-telnet/src/hotkeys.ts index 9e2bb6b..68a3cbb 100644 --- a/tabby-telnet/src/hotkeys.ts +++ b/tabby-telnet/src/hotkeys.ts @@ -7,7 +7,7 @@ export class TelnetHotkeyProvider extends HotkeyProvider { hotkeys: HotkeyDescription[] = [ { id: 'restart-telnet-session', - name: 'Restart current Telnet session', + name: '重新打开当前 Telnet 会话', }, ] diff --git a/tabby-telnet/src/session.ts b/tabby-telnet/src/session.ts index a7f2b92..4ccd501 100644 --- a/tabby-telnet/src/session.ts +++ b/tabby-telnet/src/session.ts @@ -79,7 +79,7 @@ export class TelnetSession extends BaseSession { async start (): Promise { this.socket = new Socket() - this.emitServiceMessage(`Connecting to ${this.profile.options.host}`) + this.emitServiceMessage(`连接到 ${this.profile.options.host}`) return new Promise((resolve, reject) => { this.socket.on('error', err => { @@ -88,12 +88,12 @@ export class TelnetSession extends BaseSession { this.destroy() }) this.socket.on('close', () => { - this.emitServiceMessage('Connection closed') + this.emitServiceMessage('连接已关闭') 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.emitServiceMessage('已连接') this.open = true setTimeout(() => this.streamProcessor.start()) this.loginScriptProcessor?.executeUnconditionalScripts() diff --git a/tabby-terminal/src/components/appearanceSettingsTab.component.pug b/tabby-terminal/src/components/appearanceSettingsTab.component.pug index 215e1ef..b58451b 100644 --- a/tabby-terminal/src/components/appearanceSettingsTab.component.pug +++ b/tabby-terminal/src/components/appearanceSettingsTab.component.pug @@ -1,9 +1,9 @@ -h3.mb-3 Appearance +h3.mb-3 外观 .row .col-12.col-md-6 .form-line .header - .title Font + .title 字体 .input-group.w-75 input.form-control.w-75( @@ -22,7 +22,7 @@ h3.mb-3 Appearance .form-line .header - .title Enable font ligatures + .title 启用连体字 toggle( [(ngModel)]='config.store.terminal.ligatures', (ngModelChange)='config.save()', @@ -34,7 +34,7 @@ h3.mb-3 Appearance .content-box .form-line .header - .title Terminal background + .title 终端背景 .btn-group( [(ngModel)]='config.store.terminal.background', @@ -47,18 +47,18 @@ h3.mb-3 Appearance ngbButton, [value]='"theme"' ) - | From theme + | 根据主题 label.btn.btn-secondary(ngbButtonLabel) input( type='radio', ngbButton, [value]='"colorScheme"' ) - | From color scheme + | 根据配色方案 .form-line .header - .title Cursor shape + .title 光标形状 .btn-group( [(ngModel)]='config.store.terminal.cursor', @@ -89,7 +89,7 @@ h3.mb-3 Appearance .form-line .header - .title Blink cursor + .title 闪烁光标 toggle( [(ngModel)]='config.store.terminal.cursorBlink', @@ -98,8 +98,8 @@ h3.mb-3 Appearance .form-line .header - .title Fallback font - .description A second font family used to display characters missing in the main font + .title 备用字体 + .description 第二种字体,用于显示主字体中缺失的字符 input.form-control( type='text', @@ -110,8 +110,8 @@ h3.mb-3 Appearance .form-line .header - .title Line padding - .description Additional space between lines + .title 行间距 + .description 行与行之间的间隙 input.form-control( type='number', [(ngModel)]='config.store.terminal.linePadding', @@ -121,7 +121,7 @@ h3.mb-3 Appearance .form-line .header - .title Custom CSS + .title 自定义 CSS textarea.form-control.mb-5( [(ngModel)]='config.store.appearance.css', diff --git a/tabby-terminal/src/components/baseTerminalTab.component.pug b/tabby-terminal/src/components/baseTerminalTab.component.pug index 2ff8fc9..25d485f 100644 --- a/tabby-terminal/src/components/baseTerminalTab.component.pug +++ b/tabby-terminal/src/components/baseTerminalTab.component.pug @@ -15,5 +15,5 @@ button.btn.btn-sm.btn-link.toolbar-pin-button( ) i.fas.fa-thumbtack(*ngIf='revealToolbar || pinToolbar') i.fas.fa-wrench.mr-3(*ngIf='!revealToolbar && !pinToolbar') - span(*ngIf='pinToolbar') Unpin - span(*ngIf='!pinToolbar && revealToolbar') Pin + span(*ngIf='pinToolbar') 取消置顶 + span(*ngIf='!pinToolbar && revealToolbar') 置顶 diff --git a/tabby-terminal/src/components/colorSchemeSettingsTab.component.pug b/tabby-terminal/src/components/colorSchemeSettingsTab.component.pug index 210bff6..110f2aa 100644 --- a/tabby-terminal/src/components/colorSchemeSettingsTab.component.pug +++ b/tabby-terminal/src/components/colorSchemeSettingsTab.component.pug @@ -1,5 +1,5 @@ .head - h3.mb-3 Current color scheme + h3.mb-3 当前配色方案 .d-flex.align-items-center(*ngIf='!editing') span {{getCurrentSchemeName()}} @@ -7,18 +7,18 @@ .btn-toolbar button.btn.btn-secondary((click)='editScheme()') i.fas.fa-pen - span Edit + span 编辑 .mr-1 button.btn.btn-danger( (click)='deleteScheme(config.store.terminal.colorScheme)', *ngIf='currentCustomScheme' ) i.fas.fa-trash - span Delete + span 删除 div(*ngIf='editing') .form-group - label Name + label 名字 input.form-control(type='text', [(ngModel)]='config.store.terminal.colorScheme.name') .form-group @@ -60,11 +60,11 @@ .mr-auto button.btn.btn-primary((click)='saveScheme()') i.fas.fa-check - span Save + span 保存 .mr-1 button.btn.btn-secondary((click)='cancelEditing()') i.fas.fa-times - span Cancel + span 取消 hr.mt-3.mb-4 @@ -89,7 +89,7 @@ .mr-auto span {{scheme.name}} - .badge.badge-info.ml-2(*ngIf='customColorSchemes.includes(scheme)') Custom + .badge.badge-info.ml-2(*ngIf='customColorSchemes.includes(scheme)') 自定义 div .d-flex diff --git a/tabby-terminal/src/components/colorSchemeSettingsTab.component.ts b/tabby-terminal/src/components/colorSchemeSettingsTab.component.ts index 8497411..4dbf20d 100644 --- a/tabby-terminal/src/components/colorSchemeSettingsTab.component.ts +++ b/tabby-terminal/src/components/colorSchemeSettingsTab.component.ts @@ -80,8 +80,8 @@ export class ColorSchemeSettingsTabComponent { if ((await this.platform.showMessageBox( { type: 'warning', - message: `Delete "${scheme.name}"?`, - buttons: ['Delete', 'Keep'], + message: `确定删除 "${scheme.name}" ?`, + buttons: ['确定', '取消'], defaultId: 1, cancelId: 1, } diff --git a/tabby-terminal/src/components/loginScriptsSettings.component.ts b/tabby-terminal/src/components/loginScriptsSettings.component.ts index 9736e7f..6f6e772 100644 --- a/tabby-terminal/src/components/loginScriptsSettings.component.ts +++ b/tabby-terminal/src/components/loginScriptsSettings.component.ts @@ -25,9 +25,9 @@ export class LoginScriptsSettingsComponent { if ((await this.platform.showMessageBox( { type: 'warning', - message: 'Delete this script?', + message: '删除此脚本', detail: script.expect, - buttons: ['Delete', 'Keep'], + buttons: ['确定', '取消'], defaultId: 0, cancelId: 1, } diff --git a/tabby-terminal/src/components/searchPanel.component.ts b/tabby-terminal/src/components/searchPanel.component.ts index a853774..45589f4 100644 --- a/tabby-terminal/src/components/searchPanel.component.ts +++ b/tabby-terminal/src/components/searchPanel.component.ts @@ -43,7 +43,7 @@ export class SearchPanelComponent { } if (!this.frontend.findNext(this.query, { ...this.options, incremental: incremental || undefined })) { this.notFound = true - this.notifications.notice('Not found') + this.notifications.notice('未找到') } } @@ -53,7 +53,7 @@ export class SearchPanelComponent { } if (!this.frontend.findPrevious(this.query, { ...this.options, incremental: incremental || undefined })) { this.notFound = true - this.notifications.notice('Not found') + this.notifications.notice('未找到') } } diff --git a/tabby-terminal/src/components/streamProcessingSettings.component.pug b/tabby-terminal/src/components/streamProcessingSettings.component.pug index c64c93b..d2fac10 100644 --- a/tabby-terminal/src/components/streamProcessingSettings.component.pug +++ b/tabby-terminal/src/components/streamProcessingSettings.component.pug @@ -1,6 +1,6 @@ .form-line .header - .title Input mode + .title 输入模式 .d-flex(ngbDropdown) button.btn.btn-secondary.btn-tab-bar( @@ -18,7 +18,7 @@ .form-line .header - .title Input newlines + .title 输入换行 select.form-control( [(ngModel)]='options.inputNewlines', @@ -27,7 +27,7 @@ .form-line .header - .title Output mode + .title 输出模式 .d-flex(ngbDropdown) button.btn.btn-secondary.btn-tab-bar( @@ -45,7 +45,7 @@ .form-line .header - .title Output newlines + .title 输出换行 select.form-control( [(ngModel)]='options.outputNewlines', diff --git a/tabby-terminal/src/components/terminalSettingsTab.component.pug b/tabby-terminal/src/components/terminalSettingsTab.component.pug index 53b54ba..30ce1b1 100644 --- a/tabby-terminal/src/components/terminalSettingsTab.component.pug +++ b/tabby-terminal/src/components/terminalSettingsTab.component.pug @@ -1,10 +1,10 @@ div - h3.mb-3 Rendering + h3.mb-3 渲染 .form-line(*ngIf='hostApp.platform !== Platform.Web') .header - .title Frontend - .description Switches terminal frontend implementation (experimental) + .title 前端 + .description 切换终端前端实现(实验性) select.form-control( [(ngModel)]='config.store.terminal.frontend', @@ -15,8 +15,8 @@ div .form-line .header - .title Scrollback - .description Number of lines kept in the buffer + .title 回滚 + .description 保持缓冲区行数 input.form-control( type='number', [(ngModel)]='config.store.terminal.scrollbackLines', @@ -24,12 +24,12 @@ div ) div.mt-4 - h3 Keyboard + h3 键盘 .form-line .header - .title Use {{altKeyName}} as the Meta key - .description Lets the shell handle Meta key instead of OS + .title 使用 {{altKeyName}} 作为主按键 + .description 让 shell 替代 os 处理主按键 toggle( [(ngModel)]='config.store.terminal.altIsMeta', (ngModelChange)='config.save()', @@ -37,20 +37,20 @@ div.mt-4 .form-line .header - .title Scroll on input - .description Scrolls the terminal to the bottom on user input + .title 滚动时输入 + .description 滚动到用户输入的位置 toggle( [(ngModel)]='config.store.terminal.scrollOnInput', (ngModelChange)='config.save()', ) div.mt-4 - h3 Mouse + h3 鼠标 .form-line .header - .title Right click - .description(*ngIf='config.store.terminal.rightClick == "paste"') Long-click for context menu + .title 右键 + .description(*ngIf='config.store.terminal.rightClick == "paste"') 长按右键弹出菜单 .btn-group( [(ngModel)]='config.store.terminal.rightClick', (ngModelChange)='config.save()', @@ -62,25 +62,25 @@ div.mt-4 ngbButton, value='off' ) - | Off + | 关闭 label.btn.btn-secondary(ngbButtonLabel) input( type='radio', ngbButton, value='menu' ) - | Context menu + | 菜单 label.btn.btn-secondary(ngbButtonLabel) input( type='radio', ngbButton, value='paste' ) - | Paste + | 粘贴 .form-line .header - .title Paste on middle-click + .title 单击中键粘贴 toggle( [(ngModel)]='config.store.terminal.pasteOnMiddleClick', @@ -89,8 +89,8 @@ div.mt-4 .form-line .header - .title Word separators - .description Double-click selection will stop at these characters + .title 分隔符 + .description 双击时选区将停在这些字符 input.form-control( type='text', placeholder=' ()[]{}\'"', @@ -100,8 +100,8 @@ div.mt-4 .form-line .header - .title Require a key to click links - .description When enabled, links are only clickable while holding this key + .title 点击链接时需要按键 + .description 启用后需要按着该按键才能使链接能被点击 select.form-control( [(ngModel)]='config.store.clickableLinks.modifier', @@ -114,11 +114,11 @@ div.mt-4 option(value='metaKey') {{metaKeyName}} div.mt-4 - h3 Clipboard + h3 剪贴板 .form-line .header - .title Copy on select + .title 选择时复制 toggle( [(ngModel)]='config.store.terminal.copyOnSelect', (ngModelChange)='config.save()', @@ -126,8 +126,8 @@ div.mt-4 .form-line .header - .title Bracketed paste (requires shell support) - .description Prevents accidental execution of pasted commands + .title Bracketed 粘贴(需要 shell 支持) + .description 防止意外执行粘贴的代码和破坏粘贴代码的结构 toggle( [(ngModel)]='config.store.terminal.bracketedPaste', (ngModelChange)='config.save()', @@ -135,19 +135,19 @@ div.mt-4 .form-line .header - .title Warn on multi-line paste - .description Show a confirmation box when pasting multiple lines + .title 多行粘贴时警告 + .description 当粘贴多行时显示一个确认框 toggle( [(ngModel)]='config.store.terminal.warnOnMultilinePaste', (ngModelChange)='config.save()', ) div.mt-4 - h3 Sound + h3 声音 .form-line .header - .title Terminal bell + .title 终端铃声 .btn-group( [(ngModel)]='config.store.terminal.bell', (ngModelChange)='config.save()', @@ -176,15 +176,15 @@ div.mt-4 | Audible .alert.alert-info.d-flex.align-items-center(*ngIf='config.store.terminal.bell != "audible" && (config.store.terminal.profile || "").startsWith("wsl")') - .mr-auto WSL terminal bell can only be muted via Volume Mixer + .mr-auto WSL 终端铃声只能通过音量混合器静音 button.btn.btn-secondary((click)='openWSLVolumeMixer()') Show Mixer div.mt-4 - h3 Startup + h3 启动 .form-line(*ngIf='hostApp.platform !== Platform.Web') .header - .title Auto-open a terminal on app start + .title 启动时自动打开一个终端 toggle( [(ngModel)]='config.store.terminal.autoOpen', @@ -193,7 +193,7 @@ div.mt-4 .form-line .header - .title Restore terminal tabs on app start + .title 启动时恢复终端标签页 toggle( [(ngModel)]='config.store.recoverTabs', @@ -205,8 +205,8 @@ div.mt-4(*ngIf='hostApp.platform === Platform.Windows') .form-line .header - .title Set Tabby as %COMSPEC% - .description Allows opening .bat files in tabs, but breaks some shells + .title 设置 Tabby 为 %COMSPEC% + .description 允许在标签页中打开 .bat 文件,但可能会打断一些 sheel toggle( [(ngModel)]='config.store.terminal.setComSpec', (ngModelChange)='config.save()', diff --git a/tabby-terminal/src/features/zmodem.ts b/tabby-terminal/src/features/zmodem.ts index cd5d660..5f8226d 100644 --- a/tabby-terminal/src/features/zmodem.ts +++ b/tabby-terminal/src/features/zmodem.ts @@ -42,7 +42,7 @@ export class ZModemDecorator extends TerminalDecorator { } }, on_retract: () => { - this.showMessage(terminal, 'transfer cancelled') + this.showMessage(terminal, '传输已取消') }, }) setTimeout(() => { @@ -147,13 +147,13 @@ export class ZModemDecorator extends TerminalDecorator { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (canceled) { transfer.cancel() - this.showMessage(terminal, colors.bgRed.black(' Canceled ') + ' ' + details.name) + this.showMessage(terminal, colors.bgRed.black(' 已取消 ') + ' ' + details.name) } else { transfer.close() - this.showMessage(terminal, colors.bgGreen.black(' Received ') + ' ' + details.name) + this.showMessage(terminal, colors.bgGreen.black(' 已接收 ') + ' ' + details.name) } } catch { - this.showMessage(terminal, colors.bgRed.black(' Error ') + ' ' + details.name) + this.showMessage(terminal, colors.bgRed.black(' 错误 ') + ' ' + details.name) } cancelSubscription.unsubscribe() @@ -201,15 +201,15 @@ export class ZModemDecorator extends TerminalDecorator { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (canceled) { - this.showMessage(terminal, colors.bgRed.black(' Canceled ') + ' ' + offer.name) + this.showMessage(terminal, colors.bgRed.black(' 已取消 ') + ' ' + offer.name) } else { - this.showMessage(terminal, colors.bgGreen.black(' Sent ') + ' ' + offer.name) + this.showMessage(terminal, colors.bgGreen.black(' 已发送 ') + ' ' + offer.name) } cancelSubscription.unsubscribe() } else { transfer.cancel() - this.showMessage(terminal, colors.bgRed.black(' Rejected ') + ' ' + offer.name) + this.showMessage(terminal, colors.bgRed.black(' 已拒绝 ') + ' ' + offer.name) this.logger.warn('rejected by the other side') } } diff --git a/tabby-terminal/src/hotkeys.ts b/tabby-terminal/src/hotkeys.ts index dcaac5f..74a7887 100644 --- a/tabby-terminal/src/hotkeys.ts +++ b/tabby-terminal/src/hotkeys.ts @@ -7,67 +7,67 @@ export class TerminalHotkeyProvider extends HotkeyProvider { hotkeys: HotkeyDescription[] = [ { id: 'copy', - name: 'Copy to clipboard', + name: '复制到剪贴板', }, { id: 'paste', - name: 'Paste from clipboard', + name: '从剪贴板粘贴', }, { id: 'home', - name: 'Beginning of the line', + name: '跳到行首', }, { id: 'end', - name: 'End of the line', + name: '跳到行尾', }, { id: 'previous-word', - name: 'Jump to previous word', + name: '跳到上一个单词', }, { id: 'next-word', - name: 'Jump to next word', + name: '跳到下一个单词', }, { id: 'delete-previous-word', - name: 'Delete previous word', + name: '删除上一个单词', }, { id: 'delete-next-word', - name: 'Delete next word', + name: '删除后一个单词', }, { id: 'clear', - name: 'Clear terminal', + name: '清空终端', }, { id: 'zoom-in', - name: 'Zoom in', + name: '放大', }, { id: 'zoom-out', - name: 'Zoom out', + name: '缩小', }, { id: 'reset-zoom', - name: 'Reset zoom', + name: '重置缩放', }, { id: 'ctrl-c', - name: 'Intelligent Ctrl-C (copy/abort)', + name: '智能 Ctrl-C (copy/abort)', }, { id: 'copy-current-path', - name: 'Copy current path', + name: '复制当前路径', }, { id: 'search', - name: 'Search', + name: '搜索', }, { id: 'pane-focus-all', - name: 'Focus all panes at once (broadcast)', + name: '聚焦所有窗格(广播)', }, ] diff --git a/tabby-terminal/src/settings.ts b/tabby-terminal/src/settings.ts index a34c341..2f1935e 100644 --- a/tabby-terminal/src/settings.ts +++ b/tabby-terminal/src/settings.ts @@ -10,7 +10,7 @@ import { ColorSchemeSettingsTabComponent } from './components/colorSchemeSetting export class AppearanceSettingsTabProvider extends SettingsTabProvider { id = 'terminal-appearance' icon = 'swatchbook' - title = 'Appearance' + title = '外观' prioritized = true getComponentType (): any { @@ -23,7 +23,7 @@ export class AppearanceSettingsTabProvider extends SettingsTabProvider { export class ColorSchemeSettingsTabProvider extends SettingsTabProvider { id = 'terminal-color-scheme' icon = 'palette' - title = 'Color scheme' + title = '配色方案' getComponentType (): any { return ColorSchemeSettingsTabComponent @@ -35,7 +35,7 @@ export class ColorSchemeSettingsTabProvider extends SettingsTabProvider { export class TerminalSettingsTabProvider extends SettingsTabProvider { id = 'terminal' icon = 'terminal' - title = 'Terminal' + title = '终端' prioritized = true getComponentType (): any { diff --git a/tabby-terminal/src/tabContextMenu.ts b/tabby-terminal/src/tabContextMenu.ts index 92c3c6f..ec465b4 100644 --- a/tabby-terminal/src/tabContextMenu.ts +++ b/tabby-terminal/src/tabContextMenu.ts @@ -21,16 +21,16 @@ export class CopyPasteContextMenu extends TabContextMenuItemProvider { if (tab instanceof BaseTerminalTabComponent) { return [ { - label: 'Copy', + label: '复制', click: (): void => { setTimeout(() => { tab.frontend?.copySelection() - this.notifications.notice('Copied') + this.notifications.notice('已复制') }) }, }, { - label: 'Paste', + label: '粘贴', click: () => tab.paste(), }, ] @@ -47,7 +47,7 @@ export class MiscContextMenu extends TabContextMenuItemProvider { async getItems (tab: BaseTabComponent): Promise { if (tab instanceof BaseTerminalTabComponent && tab.session?.supportsWorkingDirectory()) { return [{ - label: 'Copy current path', + label: '复制当前路径', click: () => tab.copyCurrentPath(), }] }