mirror of
https://github.com/Eugeny/tabby.git
synced 2025-08-01 06:56:59 +00:00
Compare commits
214 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
8d715ab36b | ||
![]() |
bc63068af5 | ||
![]() |
f71a58ea85 | ||
![]() |
6f451ab735 | ||
![]() |
3145429856 | ||
![]() |
83794ede72 | ||
![]() |
44b2757975 | ||
![]() |
ac8dd9f290 | ||
![]() |
0f3aeb6a40 | ||
![]() |
c3df6be8c7 | ||
![]() |
c7ca4d6aa1 | ||
![]() |
fa4c544c9c | ||
![]() |
ace5ac79a4 | ||
![]() |
b0fbc33963 | ||
![]() |
af0e25ea09 | ||
![]() |
f0d228bb60 | ||
![]() |
2a9d5816fc | ||
![]() |
0241623d27 | ||
![]() |
1dc6a627fd | ||
![]() |
f4992c3f70 | ||
![]() |
5fca7ccf7b | ||
![]() |
3740166ace | ||
![]() |
82013e3139 | ||
![]() |
4d60ae2e90 | ||
![]() |
d6c2c5de31 | ||
![]() |
2671e55fbf | ||
![]() |
49b70680c8 | ||
![]() |
054e1948a5 | ||
![]() |
4470851d12 | ||
![]() |
ccb59c3eae | ||
![]() |
2966c1fdad | ||
![]() |
42eefe8ef0 | ||
![]() |
1c62438f9d | ||
![]() |
e9f17ea597 | ||
![]() |
838d4afb94 | ||
![]() |
09194a964e | ||
![]() |
a5188f4cf5 | ||
![]() |
d7b7e6bcfd | ||
![]() |
37b1c1c750 | ||
![]() |
09b261e265 | ||
![]() |
df75f2bdb7 | ||
![]() |
ccee879b16 | ||
![]() |
5587e10dc8 | ||
![]() |
856a800cb2 | ||
![]() |
3c5f2ba28c | ||
![]() |
aa105bdf4d | ||
![]() |
b0dcc5f9df | ||
![]() |
f369998452 | ||
![]() |
581d7a66c3 | ||
![]() |
fdda602a76 | ||
![]() |
f630b53e0a | ||
![]() |
89dd0773ee | ||
![]() |
deaa529c07 | ||
![]() |
3aa9aad854 | ||
![]() |
b0e0709a36 | ||
![]() |
b5975f045a | ||
![]() |
b9c6bbf748 | ||
![]() |
a1e54b8410 | ||
![]() |
c42ea8ae08 | ||
![]() |
69fc7803b8 | ||
![]() |
a3cc85627d | ||
![]() |
8928fa1737 | ||
![]() |
ca2cf0ffa0 | ||
![]() |
76d72a5f32 | ||
![]() |
3f0b78edd0 | ||
![]() |
7c2793f157 | ||
![]() |
6af8469ac6 | ||
![]() |
1bf8fdc339 | ||
![]() |
a2b80ff742 | ||
![]() |
0a94c971cf | ||
![]() |
e4d896f02e | ||
![]() |
4330317dea | ||
![]() |
f1fed5feb6 | ||
![]() |
6e1d8868f8 | ||
![]() |
8514f3308b | ||
![]() |
c2d437d407 | ||
![]() |
237f78edf7 | ||
![]() |
a4438d74e4 | ||
![]() |
0634eb4cee | ||
![]() |
8550f95a84 | ||
![]() |
b45f74ff83 | ||
![]() |
a378b94324 | ||
![]() |
672f85e4d9 | ||
![]() |
794a940d2b | ||
![]() |
9c0352f9cc | ||
![]() |
c2922c960b | ||
![]() |
f523b114ca | ||
![]() |
af98505ea4 | ||
![]() |
6c9754c967 | ||
![]() |
92bce02f3c | ||
![]() |
72a5da5ac3 | ||
![]() |
4485e9a917 | ||
![]() |
3d7308cea0 | ||
![]() |
b4c3ac8ab6 | ||
![]() |
a769fdd036 | ||
![]() |
9d11730417 | ||
![]() |
ec8ccb5d43 | ||
![]() |
1f2bf12ed7 | ||
![]() |
c8d5b7ab61 | ||
![]() |
d265b5f8ab | ||
![]() |
4d63422b78 | ||
![]() |
e9ae253a6c | ||
![]() |
ff49b50d7d | ||
![]() |
b436eac973 | ||
![]() |
64195940a1 | ||
![]() |
a01d693eec | ||
![]() |
69dd2993af | ||
![]() |
2b65bb4b14 | ||
![]() |
4ed4d756c9 | ||
![]() |
fa9ee756d2 | ||
![]() |
223d8549ad | ||
![]() |
1e6c2cba76 | ||
![]() |
bba72b4bb8 | ||
![]() |
3739455f32 | ||
![]() |
ab4899043f | ||
![]() |
1776b840f4 | ||
![]() |
3ea1b7f561 | ||
![]() |
cee39b3b9f | ||
![]() |
218fb8130c | ||
![]() |
d718f437f0 | ||
![]() |
defe30781b | ||
![]() |
a3a6e3d137 | ||
![]() |
a5f4f23301 | ||
![]() |
bdcfba10a3 | ||
![]() |
e120031cb0 | ||
![]() |
5adfdd432a | ||
![]() |
897e06d329 | ||
![]() |
db2280e147 | ||
![]() |
8a49c738b4 | ||
![]() |
439a7a8d44 | ||
![]() |
c681902929 | ||
![]() |
a3fd6f5846 | ||
![]() |
de81f12a17 | ||
![]() |
242f136a41 | ||
![]() |
9425920f94 | ||
![]() |
d15b67a05f | ||
![]() |
8237785409 | ||
![]() |
8f68105460 | ||
![]() |
66b7632958 | ||
![]() |
c906af5bec | ||
![]() |
24c64a5e24 | ||
![]() |
ebf0d89b07 | ||
![]() |
bacb458df3 | ||
![]() |
49d05cc23b | ||
![]() |
0894c305ad | ||
![]() |
c3baad4525 | ||
![]() |
3b15b35447 | ||
![]() |
fc72b4d160 | ||
![]() |
eaf335fe29 | ||
![]() |
68ca4ac9c0 | ||
![]() |
3f160eee46 | ||
![]() |
5d8ff72850 | ||
![]() |
e247ff73b2 | ||
![]() |
ed5ff1113c | ||
![]() |
a5fcb83ad0 | ||
![]() |
da5342b4a7 | ||
![]() |
3c7f1079dd | ||
![]() |
c7e01eab0f | ||
![]() |
ffddc36ee0 | ||
![]() |
b2671826c6 | ||
![]() |
fec5d809b7 | ||
![]() |
cf09d95602 | ||
![]() |
266dfe15a3 | ||
![]() |
868f7ba70e | ||
![]() |
b7f8652f5f | ||
![]() |
1f06800c39 | ||
![]() |
7239193a4b | ||
![]() |
35cb81c854 | ||
![]() |
614c1adf96 | ||
![]() |
eb15fe6aa6 | ||
![]() |
afe716fcf4 | ||
![]() |
2e50c18dba | ||
![]() |
209d3a9c5b | ||
![]() |
efc462ee4e | ||
![]() |
7b4af46bd4 | ||
![]() |
c9339ea76a | ||
![]() |
ac95f550d9 | ||
![]() |
cc3af1aa03 | ||
![]() |
a6ac5a2898 | ||
![]() |
353e5a9550 | ||
![]() |
2507317d6b | ||
![]() |
78a64a9025 | ||
![]() |
1369b5b299 | ||
![]() |
76931e69ad | ||
![]() |
e4ceb3ee6a | ||
![]() |
dd9a13c917 | ||
![]() |
9da21a82a8 | ||
![]() |
f0a83c68dc | ||
![]() |
7fbe3405fe | ||
![]() |
59c5491432 | ||
![]() |
9b985698ff | ||
![]() |
7af6a31f55 | ||
![]() |
50c534789a | ||
![]() |
64d9c98538 | ||
![]() |
86196c9f7d | ||
![]() |
62e54cbf6e | ||
![]() |
cd8e414fc0 | ||
![]() |
60be3722a2 | ||
![]() |
4e4ee4fc98 | ||
![]() |
d3b5a53179 | ||
![]() |
2a51ce556f | ||
![]() |
62dc3e04d0 | ||
![]() |
db9d90e9b0 | ||
![]() |
86469334a0 | ||
![]() |
eec294fa2e | ||
![]() |
aac1976baa | ||
![]() |
a4aa07c1f1 | ||
![]() |
2437dc5bdc | ||
![]() |
a8ef5963c3 | ||
![]() |
2dc64ae51b | ||
![]() |
0ba5517a31 | ||
![]() |
9f6263f3d4 | ||
![]() |
f80db81857 | ||
![]() |
3794081cef |
@@ -635,10 +635,10 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "X-0x01",
|
||||
"name": "X-0x01",
|
||||
"login": "0x973",
|
||||
"name": "0x973",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/19320096?v=4",
|
||||
"profile": "http://pingbase.cn",
|
||||
"profile": "https://github.com/0x973",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
@@ -1256,6 +1256,78 @@
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "kimbob13",
|
||||
"name": "ChangHwan Kim",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/26755098?v=4",
|
||||
"profile": "https://github.com/kimbob13",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "ashneilson",
|
||||
"name": "Ash Neilson",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/35913512?v=4",
|
||||
"profile": "https://github.com/ashneilson",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "cfs4819",
|
||||
"name": "Chen Fansong",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/53071761?v=4",
|
||||
"profile": "https://github.com/cfs4819",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Mxmilu666",
|
||||
"name": "Mxmilu",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/82694310?v=4",
|
||||
"profile": "https://5k.work/",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "C41M50N",
|
||||
"name": "Charles Buffington",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/29805363?v=4",
|
||||
"profile": "https://cbuff.dev",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "GeminiLn",
|
||||
"name": "Yu Qin",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/12425057?v=4",
|
||||
"profile": "https://github.com/GeminiLn",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "fireblue",
|
||||
"name": "fireblue",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/1034929?v=4",
|
||||
"profile": "https://github.com/fireblue",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "marko1616",
|
||||
"name": "marko1616",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/45327989?v=4",
|
||||
"profile": "https://github.com/marko1616",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
}
|
||||
],
|
||||
"contributorsPerLine": 7,
|
||||
|
183
.github/workflows/build.yml
vendored
183
.github/workflows/build.yml
vendored
@@ -13,11 +13,11 @@ jobs:
|
||||
- name: Installing Node
|
||||
uses: actions/setup-node@v3.7.0
|
||||
with:
|
||||
node-version: 16
|
||||
node-version: 18
|
||||
|
||||
- name: Install deps
|
||||
run: |
|
||||
npm i -g yarn@1.19.1
|
||||
npm i -g yarn
|
||||
cd app
|
||||
yarn
|
||||
cd ..
|
||||
@@ -37,9 +37,15 @@ jobs:
|
||||
matrix:
|
||||
include:
|
||||
- arch: x86_64
|
||||
rust_triple: x86_64-apple-darwin
|
||||
- arch: arm64
|
||||
rust_triple: aarch64-apple-darwin
|
||||
fail-fast: false
|
||||
|
||||
env:
|
||||
ARCH: ${{matrix.arch}}
|
||||
RUST_TARGET_TRIPLE: ${{matrix.rust_triple}}
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
@@ -49,23 +55,18 @@ jobs:
|
||||
- name: Installing Node
|
||||
uses: actions/setup-node@v3.7.0
|
||||
with:
|
||||
node-version: 16
|
||||
node-version: 18
|
||||
|
||||
- run: rustup target add ${{matrix.rust_triple}}
|
||||
|
||||
- name: Install deps
|
||||
run: |
|
||||
sudo -H pip3 install setuptools
|
||||
npm config set python python3
|
||||
sudo npm i -g yarn@1.22.1
|
||||
sudo npm i -g yarn
|
||||
yarn --network-timeout 1000000
|
||||
env:
|
||||
ARCH: ${{matrix.arch}}
|
||||
|
||||
- name: Fix cross build
|
||||
run: |
|
||||
rm -rf app/node_modules/cpu-features
|
||||
rm -rf app/node_modules/ssh2/crypto/build
|
||||
if: matrix.arch == 'arm64'
|
||||
|
||||
- name: Webpack
|
||||
run: yarn run build
|
||||
|
||||
@@ -137,18 +138,24 @@ jobs:
|
||||
include:
|
||||
- build-arch: x64
|
||||
arch: amd64
|
||||
rust_triple: x86_64-unknown-linux-gnu
|
||||
- build-arch: arm64
|
||||
arch: arm64
|
||||
rust_triple: aarch64-unknown-linux-gnu
|
||||
triplet: aarch64-linux-gnu-
|
||||
- build-arch: arm
|
||||
arch: armhf
|
||||
rust_triple: arm-unknown-linux-gnueabihf
|
||||
triplet: arm-linux-gnueabihf-
|
||||
fail-fast: false
|
||||
|
||||
env:
|
||||
CC: ${{matrix.triplet}}gcc
|
||||
CXX: ${{matrix.triplet}}g++
|
||||
ARCH: ${{matrix.build-arch}}
|
||||
npm_config_arch: ${{matrix.build-arch}}
|
||||
npm_config_target_arch: ${{matrix.build-arch}}
|
||||
RUST_TARGET_TRIPLE: ${{matrix.rust_triple}}
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
@@ -161,52 +168,51 @@ jobs:
|
||||
with:
|
||||
node-version: 18
|
||||
|
||||
- name: Install deps (amd64)
|
||||
- run: rustup target add ${{matrix.rust_triple}}
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install libarchive-tools zsh python3-distutils
|
||||
sudo apt-get install libarchive-tools zsh crossbuild-essential-${{matrix.arch}}
|
||||
|
||||
- name: Setup tar to run as root
|
||||
run: sudo chmod u+s "$(command -v tar)"
|
||||
if: matrix.build-arch != 'x64'
|
||||
|
||||
- name: Download cached sysroot
|
||||
uses: actions/cache@v3
|
||||
id: dl-cached-sysroot
|
||||
if: matrix.build-arch !='x64'
|
||||
with:
|
||||
key: sysroot-${{matrix.build-arch}}
|
||||
path: /${{matrix.build-arch}}-sysroot
|
||||
|
||||
- name: Setup crossbuild sysroot
|
||||
run: |
|
||||
sudo apt-get update -y && sudo apt-get install debootstrap qemu-user-static binfmt-support -y
|
||||
sudo qemu-debootstrap --include=libfontconfig1-dev,libsecret-1-dev,libnss3,libatk1.0-0,libatk-bridge2.0-0,libgdk-pixbuf2.0-0,libgtk-3-0,libgbm1 --variant=buildd --exclude=snapd --components=main,restricted,universe,multiverse --extractor=dpkg-deb --arch ${{matrix.arch}} bionic /${{matrix.build-arch}}-sysroot/ http://ports.ubuntu.com/ubuntu-ports/
|
||||
sudo find /${{matrix.build-arch}}-sysroot -type l -lname '/*' -exec sh -c 'file="$0"; dir=$(dirname "$file"); target=$(readlink "$0"); prefix=$(dirname "$dir" | sed 's@[^/]*@\.\.@g'); newtarget="$prefix$target"; ln -snf $newtarget $file' {} \; ;
|
||||
if: matrix.build-arch != 'x64' && steps.dl-cached-sysroot.outputs.cache-hit != 'true'
|
||||
|
||||
- name: Setup env to use ${{matrix.build-arch}} sysroot
|
||||
run: |
|
||||
echo "CFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV
|
||||
echo "CXXFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV
|
||||
echo "LDFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV
|
||||
|
||||
[[ ${npm_config_arch} == 'arm' ]] && echo "npm_config_arch=armv7l" >> $GITHUB_ENV
|
||||
|
||||
if [[ ${{matrix.arch}} == 'armhf' ]]; then
|
||||
echo "PKG_CONFIG_PATH=/${{matrix.build-arch}}-sysroot/usr/lib/pkgconfig/:/${{matrix.build-arch}}-sysroot/usr/lib/arm-linux-gnueabihf/pkgconfig/" >> $GITHUB_ENV
|
||||
elif [[ ${{matrix.arch}} == 'arm64' ]]; then
|
||||
echo "PKG_CONFIG_PATH=/${{matrix.build-arch}}-sysroot/usr/lib/pkgconfig/:/${{matrix.build-arch}}-sysroot/usr/lib/aarch64-linux-gnu/pkgconfig/" >> $GITHUB_ENV
|
||||
fi
|
||||
if: matrix.build-arch != 'x64'
|
||||
|
||||
- name: Install npm_modules (amd64)
|
||||
run: |
|
||||
npm i -g yarn
|
||||
yarn --network-timeout 1000000
|
||||
if: matrix.build-arch == 'x64'
|
||||
|
||||
- name: Setup Crossbuild (${{matrix.arch}})
|
||||
run: |
|
||||
sudo apt-get update -y && sudo apt-get install schroot sbuild debootstrap -y
|
||||
sudo debootstrap --include=git,curl,gnupg,ca-certificates,crossbuild-essential-${{matrix.arch}},python-dev,python3-dev,libarchive-tools,cmake --variant=buildd --exclude=snapd --components=main,restricted,universe,multiverse --extractor=dpkg-deb bionic /build-chroot/
|
||||
echo 'deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu bionic main restricted universe multiverse' | sudo tee /build-chroot/etc/apt/sources.list >/dev/null
|
||||
echo 'deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports bionic main restricted universe multiverse' | sudo tee -a /build-chroot/etc/apt/sources.list >/dev/null
|
||||
curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor | sudo tee /build-chroot/etc/apt/trusted.gpg.d/nodesource.gpg >/dev/null
|
||||
echo 'deb http://deb.nodesource.com/node_16.x bionic main' | sudo tee /build-chroot/etc/apt/sources.list.d/nodesource.list >/dev/null
|
||||
echo "[build-chroot]
|
||||
description=Ubuntu 18.04 Build chroot
|
||||
type=directory
|
||||
directory=/build-chroot
|
||||
root-groups=root,sudo
|
||||
profile=buildd
|
||||
personality=linux
|
||||
union-type=overlay" | sudo tee /etc/schroot/chroot.d/build-chroot.pref >/dev/null
|
||||
echo "/home /home none rw,bind 0 0" | sudo tee -a /etc/schroot/buildd/fstab >/dev/null
|
||||
|
||||
if: matrix.build-arch != 'x64'
|
||||
|
||||
- name: Install node_modules & CrossBuild native modules for ${{matrix.arch}}
|
||||
run: |
|
||||
sudo schroot -c build-chroot -u root -- bash -c "apt-get update -y
|
||||
dpkg --add-architecture ${{matrix.arch}}
|
||||
apt-get install -y nodejs libfontconfig-dev:${{matrix.arch}} libsecret-1-dev:${{matrix.arch}} libnss3:${{matrix.arch}} libatk1.0-0:${{matrix.arch}} libatk-bridge2.0-0:${{matrix.arch}} libgdk-pixbuf2.0-0:${{matrix.arch}} libgtk-3-0:${{matrix.arch}} libgbm1:${{matrix.arch}}
|
||||
export CC=${{matrix.triplet}}gcc CXX=${{matrix.triplet}}g++ LD=${{matrix.triplet}}ld
|
||||
if [[ ${{matrix.arch}} == 'arm64' ]]; then
|
||||
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/aarch64-linux-gnu/pkgconfig/
|
||||
elif [[ ${{matrix.arch}} == 'armhf' ]]; then
|
||||
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/arm-linux-gnueabihf/pkgconfig/
|
||||
fi
|
||||
export ARCH=${{matrix.build-arch}} npm_config_arch=${{matrix.build-arch}} npm_config_target_arch=${{matrix.build-arch}}
|
||||
npm i -g yarn
|
||||
yarn --network-timeout 1000000 --arch=${{matrix.build-arch}} --target_arch=${{matrix.build-arch}}"
|
||||
if: matrix.build-arch != 'x64'
|
||||
npm i -g yarn node-gyp
|
||||
yarn --network-timeout 1000000 --arch=${{matrix.build-arch}} --target-arch=${{matrix.build-arch}}
|
||||
|
||||
- name: Webpack (${{matrix.arch}})
|
||||
run: yarn run build --arch=${{matrix.build-arch}} --target_arch=${{matrix.build-arch}}
|
||||
@@ -222,57 +228,10 @@ jobs:
|
||||
USE_HARD_LINKS: false
|
||||
# DEBUG: electron-builder,electron-builder:*
|
||||
|
||||
- name: Build web resources
|
||||
- name: Build web resources (amd64 only)
|
||||
run: zsh -c 'tar czf tabby-web.tar.gz (tabby-*|web)/dist'
|
||||
if: matrix.build-arch == 'x64'
|
||||
|
||||
# - name: Install deps and Build (arm64)
|
||||
# uses: docker://multiarch/ubuntu-core:arm64-bionic
|
||||
# with:
|
||||
# args: >
|
||||
# bash -c
|
||||
# "apt update && apt install curl lsb-release gnupg -y &&
|
||||
# curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &&
|
||||
# apt install make build-essential git ruby libarchive-tools nodejs rpm libsecret-1-dev libfontconfig1-dev -y &&
|
||||
# git config --global --add safe.directory /github/workspace &&
|
||||
# gem install public_suffix -v 4.0.7 &&
|
||||
# gem install fpm --no-document &&
|
||||
# npm i -g yarn &&
|
||||
# cd /github/workspace &&
|
||||
# yarn --network-timeout 1000000 &&
|
||||
# yarn run build &&
|
||||
# scripts/prepackage-plugins.mjs &&
|
||||
# USE_SYSTEM_FPM=true scripts/build-linux.mjs"
|
||||
# env:
|
||||
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
# KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
|
||||
# USE_HARD_LINKS: false
|
||||
# if: matrix.build-arch == 'arm64' && github.repository == 'Eugeny/tabby' && startsWith(github.ref, 'refs/tags')
|
||||
|
||||
# - name: Install deps and Build (armv7l)
|
||||
# uses: docker://multiarch/ubuntu-core:armhf-bionic
|
||||
# with:
|
||||
# args: >
|
||||
# bash -c
|
||||
# "apt update && apt install curl lsb-release gnupg -y &&
|
||||
# curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &&
|
||||
# apt install make build-essential git ruby libarchive-tools nodejs rpm libsecret-1-dev libfontconfig1-dev -y &&
|
||||
# git config --global --add safe.directory /github/workspace &&
|
||||
# gem install public_suffix -v 4.0.7 &&
|
||||
# gem install fpm --no-document &&
|
||||
# npm i -g yarn &&
|
||||
# cd /github/workspace &&
|
||||
# sed -i '/ \"electron\":/c\ \"electron\": \"17.0.0\",' package.json &&
|
||||
# yarn --network-timeout 1000000 &&
|
||||
# yarn run build &&
|
||||
# scripts/prepackage-plugins.mjs &&
|
||||
# USE_SYSTEM_FPM=true scripts/build-linux.mjs"
|
||||
# env:
|
||||
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
# KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
|
||||
# USE_HARD_LINKS: false
|
||||
# if: matrix.build-arch == 'arm' && github.repository == 'Eugeny/tabby' && startsWith(github.ref, 'refs/tags')
|
||||
|
||||
- name: Upload symbols (amd64 only)
|
||||
run: |
|
||||
sudo npm install -g @sentry/cli --unsafe-perm
|
||||
@@ -284,13 +243,15 @@ jobs:
|
||||
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
|
||||
|
||||
- name: Upload packages to packagecloud.io
|
||||
uses: Eugeny/packagecloud-action@main
|
||||
uses: TykTechnologies/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'
|
||||
rpmvers: 'el/9 el/8 ol/6 ol/7'
|
||||
debvers: 'ubuntu/bionic ubuntu/focal ubuntu/hirsute ubuntu/impish ubuntu/jammy ubuntu/kinetic ubuntu/noble debian/jessie debian/stretch debian/buster'
|
||||
|
||||
- uses: actions/upload-artifact@master
|
||||
name: Upload AppImage (${{matrix.arch}})
|
||||
@@ -329,17 +290,22 @@ jobs:
|
||||
path: tabby-web.tar.gz
|
||||
if: matrix.build-arch == 'x64'
|
||||
|
||||
|
||||
Windows-Build:
|
||||
runs-on: windows-2022
|
||||
runs-on: windows-latest
|
||||
needs: Lint
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- arch: x64
|
||||
rust_triple: x86_64-pc-windows-msvc
|
||||
- arch: arm64
|
||||
rust_triple: aarch64-pc-windows-msvc
|
||||
fail-fast: false
|
||||
|
||||
env:
|
||||
RUST_TARGET_TRIPLE: ${{matrix.rust_triple}}
|
||||
ARCH: ${{matrix.arch}}
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
@@ -349,17 +315,20 @@ jobs:
|
||||
- name: Installing Node
|
||||
uses: actions/setup-node@v3.7.0
|
||||
with:
|
||||
node-version: 16
|
||||
node-version: 18
|
||||
|
||||
- run: npm i -g npx
|
||||
- run: rustup target add ${{matrix.rust_triple}}
|
||||
|
||||
- name: Update node-gyp
|
||||
run: |
|
||||
npm install --global node-gyp@8.4.1
|
||||
npm install --global node-gyp@10.2.0
|
||||
npm prefix -g | % {npm config set node_gyp "$_\node_modules\node-gyp\bin\node-gyp.js"}
|
||||
|
||||
- name: Build
|
||||
shell: powershell
|
||||
run: |
|
||||
npm i -g yarn@1.19.1
|
||||
npm i -g yar node-gyp
|
||||
yarn --network-timeout 1000000
|
||||
yarn run build
|
||||
node scripts/prepackage-plugins.mjs
|
||||
@@ -379,7 +348,7 @@ jobs:
|
||||
|
||||
- name: Build packages without signing
|
||||
run: node scripts/build-windows.mjs
|
||||
if: "!(github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')))"
|
||||
if: "! (github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')))"
|
||||
env:
|
||||
ARCH: ${{matrix.arch}}
|
||||
|
||||
|
2
.github/workflows/docs.yml
vendored
2
.github/workflows/docs.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
||||
- name: Installing Node
|
||||
uses: actions/setup-node@v3.7.0
|
||||
with:
|
||||
node-version: 16
|
||||
node-version: 20
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
|
15
.github/workflows/issue-translator.yml
vendored
15
.github/workflows/issue-translator.yml
vendored
@@ -1,15 +0,0 @@
|
||||
name: 'issue-translator'
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
issues:
|
||||
types: [opened]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: tomsun28/issues-translate-action@v2.7
|
||||
with:
|
||||
IS_MODIFY_TITLE: true
|
||||
CUSTOM_BOT_NOTE: The translator bot has detected that this issue body's language is not English, and has translated it automatically.
|
2
.gitignore
vendored
2
.gitignore
vendored
@@ -33,7 +33,7 @@ docs/api
|
||||
sentry.properties
|
||||
sentry-symbols.js
|
||||
|
||||
tabby-ssh/util/pagent.exe
|
||||
*.psd
|
||||
|
||||
crowdin.yml
|
||||
.crowdin.env
|
||||
|
@@ -23,6 +23,8 @@ sudo apt install libfontconfig-dev libsecret-1-dev libarchive-tools libnss3 liba
|
||||
yarn
|
||||
```
|
||||
|
||||
_⚠️Note: If you forked this repository, you may need to pull down the tags from this repository before installing node modules. `git pull --tags upstream master`_
|
||||
|
||||
Build Tabby:
|
||||
|
||||
```
|
||||
|
@@ -20,7 +20,7 @@
|
||||
|
||||
<br/>
|
||||
<p align="center">
|
||||
Diese README ist auch verfügbar in: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:br: Português</a>
|
||||
Diese README ist auch verfügbar in: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||
</p>
|
||||
|
||||
----
|
||||
@@ -243,7 +243,7 @@ Dank geht an diese wunderbaren Menschen ([emoji key](https://allcontributors.org
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -332,6 +332,16 @@ Dank geht an diese wunderbaren Menschen ([emoji key](https://allcontributors.org
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -21,7 +21,7 @@
|
||||
|
||||
<br/>
|
||||
<p align="center">
|
||||
Este fichero README está disponible en: <a href="./README.md">:gb: English</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:br: Português</a>
|
||||
Este fichero README está disponible en: <a href="./README.md">:gb: English</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||
</p>
|
||||
|
||||
----
|
||||
@@ -245,7 +245,7 @@ Gracias a estas maravillosas personas ([emoji key](https://allcontributors.org/d
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -334,6 +334,16 @@ Gracias a estas maravillosas personas ([emoji key](https://allcontributors.org/d
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -21,7 +21,7 @@
|
||||
|
||||
<br/>
|
||||
<p align="center">
|
||||
This README is also available in: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.pt-BR.md">:br: Português</a>
|
||||
This README is also available in: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||
</p>
|
||||
|
||||
----
|
||||
@@ -242,7 +242,7 @@ Terima kasih kepada mereka yang telah membantu ([emoji key](https://allcontribut
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -331,6 +331,16 @@ Terima kasih kepada mereka yang telah membantu ([emoji key](https://allcontribut
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -21,7 +21,7 @@
|
||||
|
||||
<br/>
|
||||
<p align="center">
|
||||
Questo README è disponibile anche in: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:br: Português</a>
|
||||
Questo README è disponibile anche in: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||
|
||||
----
|
||||
|
||||
@@ -238,7 +238,7 @@ Grazie a queste persone meravigliose ([emoji key](https://allcontributors.org/do
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -327,6 +327,16 @@ Grazie a queste persone meravigliose ([emoji key](https://allcontributors.org/do
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -28,7 +28,7 @@
|
||||
|
||||
<br/>
|
||||
<p align="center">
|
||||
このREADMEは次の言語でもご覧いただけます: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:br: Português</a>
|
||||
このREADMEは次の言語でもご覧いただけます: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||
</p>
|
||||
|
||||
----
|
||||
@@ -253,7 +253,7 @@ Windows上では、`Tabby.exe`がある場所と同じ場所に`data`フォル
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -342,6 +342,16 @@ Windows上では、`Tabby.exe`がある場所と同じ場所に`data`フォル
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -19,6 +19,11 @@
|
||||
* [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)
|
||||
|
||||
<br/>
|
||||
<p align="center">
|
||||
This README is also available in: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||
</p>
|
||||
|
||||
----
|
||||
|
||||
**Tabby** (구 **Terminus**)는 Windows, macOS 및 Linux용으로 뛰어난 구성의 터미널 에뮬레이터, SSH 및 시리얼 클라이언트입니다.
|
||||
@@ -232,7 +237,7 @@ Pull requests and plugins are welcome!
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -321,6 +326,16 @@ Pull requests and plugins are welcome!
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
25
README.md
25
README.md
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a> <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a> <a href="https://matrix.to/#/#tabby-general:matrix.org"><img alt="Matrix" src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a>   <a href="https://translate.tabby.sh/"><img alt="Translate" src="https://shields.io/badge/Translate-UI-white?logo=googletranslate&style=for-the-badge&color=white&logoColor=fff"></a> <a href="https://twitter.com/eugeeeeny"><img alt="Twitter" src="https://shields.io/badge/Subscribe-News-blue?logo=twitter&style=for-the-badge&color=blue"></a>
|
||||
<a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a> <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a> <a href="https://discord.gg/Vn7BjmzhtF"><img alt="Discord" src="https://img.shields.io/discord/1280890060195233934?style=for-the-badge&color=blue&logo=discord&logoColor=white&label=Discord"></a>   <a href="https://translate.tabby.sh/"><img alt="Translate" src="https://shields.io/badge/Translate-UI-white?logo=googletranslate&style=for-the-badge&color=white&logoColor=fff"></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
@@ -16,9 +16,6 @@
|
||||
|
||||
> 👋 Managing remote environments? Check out [Warpgate, my smart SSH/HTTP/MySQL bastion server](https://github.com/warp-tech/warpgate), it works great with Tabby, you'll love it.
|
||||
|
||||
> 👋 [Tabby-web](https://github.com/Eugeny/tabby-web) is looking for sponsors. As I can't afford to host it myself any longer, I'm looking for a sponsor to cover the hosting costs. If you're interested, please [get in touch](https://twitter.com/eugeeeeny)!
|
||||
|
||||
|
||||
----
|
||||
|
||||
### Downloads:
|
||||
@@ -29,7 +26,7 @@
|
||||
|
||||
<br/>
|
||||
<p align="center">
|
||||
This README is also available in: <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">🇧🇷 Português</a>
|
||||
This README is also available in: <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||
</p>
|
||||
|
||||
----
|
||||
@@ -131,6 +128,7 @@ Plugins and themes can be installed directly from the Settings view inside Tabby
|
||||
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
|
||||
* [background](https://github.com/moemoechu/tabby-background) - change Tabby background image and more...
|
||||
* [highlight](https://github.com/moemoechu/tabby-highlight) - Tabby terminal keyword highlight plugin
|
||||
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - In-app web authentication popups (Built primarily for warpgate in-browser auth)
|
||||
|
||||
<a name="themes"></a>
|
||||
|
||||
@@ -154,6 +152,11 @@ Plugins and themes can be installed directly from the Settings view inside Tabby
|
||||
|
||||
[**keygen**](https://keygen.sh/?via=eugene) has provided free release & auto-update hosting
|
||||
|
||||
<a href="https://iqhive.com/"><img src="https://private-user-images.githubusercontent.com/161476/361584584-ed292436-1d50-46bc-b479-78222c83ed22.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ3MDg3NjgsIm5iZiI6MTcyNDcwODQ2OCwicGF0aCI6Ii8xNjE0NzYvMzYxNTg0NTg0LWVkMjkyNDM2LTFkNTAtNDZiYy1iNDc5LTc4MjIyYzgzZWQyMi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODI2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgyNlQyMTQxMDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iYzNlZjIxN2JiYzBkYTU5NGE4YmZlZDJiNmIxZWE1ZTAyOTNhYjJlZTRhOGZjYTk4N2E4MzMzZjg0ZTNkZWQ0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.pQzR2d71YV4TIxOH3Lg20HpNKrm_r2D-xfkEM_F2DTs" width="100"></a>
|
||||
|
||||
[**IQ Hive**](https://iqhive.com) is providing financial support for the project development
|
||||
|
||||
|
||||
<a name="contributing"></a>
|
||||
# Contributing
|
||||
|
||||
@@ -258,7 +261,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -347,6 +350,16 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
363
README.pl-PL.md
Normal file
363
README.pl-PL.md
Normal file
@@ -0,0 +1,363 @@
|
||||
[](https://tabby.sh)
|
||||
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="Wszystkie wydania na GitHubie" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=POBRANIA&logo=github&style=for-the-badge"></a> <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a> <a href="https://matrix.to/#/#tabby-general:matrix.org"><img alt="Matrix" src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a>   <a href="https://translate.tabby.sh/"><img alt="Przetłumacz" src="https://shields.io/badge/Translate-UI-white?logo=googletranslate&style=for-the-badge&color=white&logoColor=fff"></a> <a href="https://twitter.com/eugeeeeny"><img alt="Twitter" src="https://shields.io/badge/Subscribe-News-blue?logo=twitter&style=for-the-badge&color=blue"></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://ko-fi.com/J3J8KWTF">
|
||||
<img src="https://cdn.ko-fi.com/cdn/kofi3.png?v=2" width="150">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
|
||||
> 👋 Zarządzasz zdalnymi środowiskami? Rzuć okiem na [WarpGate, inteligentny serwer typu bastion SSH/HTTP/MySQL](https://github.com/warp-tech/warpgate), świetnie współdziała z Tabby, pokochasz go!
|
||||
|
||||
> 👋 [Tabby-Web](https://github.com/Eugeny/tabby-web) poszukuje sponsorów. Nie jestem w stanie pokryć kosztów hostowania całej infrastruktury, jeśli jesteś zainteresowany wsparciem, proszę [skontakuj się ze mną!](https://twitter.com/eugeeeeny)
|
||||
|
||||
|
||||
----
|
||||
|
||||
### Pobieranie:
|
||||
|
||||
* [Ostatnie wydania](https://github.com/Eugeny/tabby/releases/latest)
|
||||
* [Repozytoria](https://packagecloud.io/eugeny/tabby): [Systemy Debian/Ubuntu](https://packagecloud.io/eugeny/tabby/install#bash-deb), [Środowiska RPM](https://packagecloud.io/eugeny/tabby/install#bash-rpm)
|
||||
* [Ostatnie wydania developerskie](https://nightly.link/Eugeny/tabby/workflows/build/master)
|
||||
|
||||
<br/>
|
||||
<p align="center">
|
||||
Ten plik README jest również dostępny w językach: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">🇧🇷 Português</a>
|
||||
</p>
|
||||
|
||||
----
|
||||
|
||||
[**Tabby**](https://tabby.sh) (formalnie **Terminus**) to wysoce konfigurowalny emulator konsoli, SSH oraz klienta konsoli szeregowej na systemy Windows 10, macOS oraz Linux
|
||||
|
||||
* Zintegrowany klient SSH i Telnet oraz menedżer sesji
|
||||
* Zintegrowany klient terminala szeregowego
|
||||
* Motywy and palety kolorów
|
||||
* W pełni konfigurowalne skróty klawiszowe
|
||||
* Dzielenie ekranu
|
||||
* Zapamiętywanie okien z poprzednich sesji
|
||||
* PowerShell (oraz PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder i wsparcie dla CMD
|
||||
* Bezpośredni transfer plików sesji SSH przez Zmodem
|
||||
* Pełne wsparcie dla znaków Unicode wraz z podwójnymi znakami
|
||||
* Nie zawieszanie się przy szybko wyświetlanych wynikach
|
||||
* Pełne doświadczenie powłoki na systemie Windows zawierającej podpowiedzi (przez Clink)
|
||||
* Zintegrowany zaszyfrowany kontener na klucze SSH i jego konfigurację
|
||||
* Klient SSH, SFTP oraz Telnet dostępny jako [aplikacja webowa](https://tabby.sh/app) (również jako [własna instacja](https://github.com/Eugeny/tabby-web)).
|
||||
|
||||
# Spis treści <!-- omit in toc -->
|
||||
|
||||
- [Czym jest, a czym nie jest Tabby](#what-tabby-is-and-isnt)
|
||||
- [Funkcje konsoli](#terminal-features)
|
||||
- [Klient SSH](#ssh-client)
|
||||
- [Konsola szeregowa](#serial-terminal)
|
||||
- [Wersja przenośna](#portable)
|
||||
- [Wtyczki](#plugins)
|
||||
- [Motywy i palety kolorów](#themes)
|
||||
- [Współtworzenie](#contributing)
|
||||
|
||||
<a name="about"></a>
|
||||
|
||||
# Czym jest, a czym nie jest Tabby
|
||||
|
||||
* **Tabby jest** alternatywą dla standardowej konsoli Windows (conhost), PowerShell ISE, PuTTY, Terminal.app oraz iTerm z macOS
|
||||
|
||||
* **Tabby nie jest** nową powłoką lub zamiennikiem dla MinGW czy Cygwin. Nie jest również zatrważająco szybki - jeśli ważne jest dla Ciebie użycie pamięci RAM, rozważ użycie [Conemu](https://conemu.github.io) lub [Alacritty](https://github.com/jwilm/alacritty)
|
||||
|
||||
<a name="terminal"></a>
|
||||
|
||||
# Funkcje konsoli
|
||||
|
||||

|
||||
|
||||
* Konsola V220 + wiele rozszerzeń
|
||||
* Wiele nakładających się podzielonych okien
|
||||
* Okna na każdej stronie ekranu
|
||||
* Opcjonalne dokowanie okna za pomocą skrótu ("Quake console")
|
||||
* Wykrywanie postępu (Pasek)
|
||||
* Powiadomienia przy ukończeniu procesu podczas postępu
|
||||
* Wklejanie z nawiasami, ostrzeżenie przy wielu liniach
|
||||
* Wsparcie różnych czcionek
|
||||
* Niestandardowe profile powłoki
|
||||
* Opcjonalne wklejanie PPM oraz kopiowanie na zaznaczeniu (Styl PuTTY)
|
||||
|
||||
<a name="ssh"></a>
|
||||
|
||||
# Klient SSH
|
||||
|
||||

|
||||
|
||||
* Klient SSH2 z zarządzaniem połączeń
|
||||
* X11 oraz przekierowywanie portów
|
||||
* Automatyczne przejście między hostami
|
||||
* Przekierowanie agenta (Pageant oraz Windowsowy natywny "OpenSSH Agent")
|
||||
* Skrypty logowania
|
||||
|
||||
<a name="serial"></a>
|
||||
|
||||
# Konsola Szeregowa
|
||||
|
||||
* Zapisane połączenia
|
||||
* Wczytywanie danych wejścia linii
|
||||
* Opcjonalna konwersja danych wejścia i wyjścia na szesnastkowe "byte-by-byte"
|
||||
* Konwersja na nową linię
|
||||
* Automatyczne połączenie po rozłączeniu
|
||||
|
||||
<a name="portable"></a>
|
||||
|
||||
# Wersja przenośna
|
||||
|
||||
Tabby będzie uruchamiał się jako aplikacja przenośna, tylko wtedy, kiedy utworzysz folder `data` w tej samej lokacji, w której znajduje się `Tabby.exe`.
|
||||
|
||||
<a name="plugins"></a>
|
||||
|
||||
# Wtyczki
|
||||
|
||||
Wtyczki (jak i motywy) mogą być instalowane bezpośrednio z widoku ustawień w środku aplikacji Tabby.
|
||||
|
||||
* [docker](https://github.com/Eugeny/tabby-docker) - połączenie z kontenerami Docker
|
||||
* [title-control](https://github.com/kbjr/terminus-title-control) - pozwala na zmienianie tytułu konsoli jako prefiks, sufiks lub/albo tekst do usunięcia
|
||||
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - szybko wysyłaj komendy z jednej konsoli do wielu
|
||||
* [save-output](https://github.com/Eugeny/tabby-save-output) - zapisuj dane wyjściowe do pliku
|
||||
* [sync-config](https://github.com/starxg/terminus-sync-config) - synchronizuj konfigurację przez Gista lub Gitee
|
||||
* [clippy](https://github.com/Eugeny/tabby-clippy) - przykładowa wtyczka, która zwyczajnie denerwuje
|
||||
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - pozwala na utworzenie niestandardowego profilu pracy w aplikacji odpowiednio do konfiguracji
|
||||
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - otwiera domyślną przeglądarkę z zaznaczonym tekstem w oknie Tabby
|
||||
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - otwiera okno z połączeniem SFTP dla połączeń SSH jak SecureCRT
|
||||
* [background](https://github.com/moemoechu/tabby-background) - zmień tło Tabby oraz wiele więcej
|
||||
* [highlight](https://github.com/moemoechu/tabby-highlight) - Tabby terminal keyword highlight plugin
|
||||
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - okienka autoryzacji wewnątrz konsoli (Zbudowany głównie pod autoryzację projektu Warpgate w przeglądarce)
|
||||
|
||||
<a name="themes"></a>
|
||||
|
||||
# Motywy i palety kolorów
|
||||
|
||||
* [hype](https://github.com/Eugeny/tabby-theme-hype) - Motyw zainspirowany konsolą "Hyper"
|
||||
* [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - Motyw "pełnej relaksacji"
|
||||
* [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox) - Motyw zainspirowany konsolą "Hyper" (kolejny)
|
||||
* [windows10](https://www.npmjs.com/package/terminus-theme-windows10) - Motyw zainspirowany Microsoftem
|
||||
* [altair](https://github.com/yxuko/terminus-altair) - Motwy autorstwa Yacine Kanzari
|
||||
* [catppuccin](https://github.com/catppuccin/tabby) - Paleta pastelowa dla Tabby
|
||||
* [noctis](https://github.com/aaronhuggins/tabby-colors-noctis) - Paleta kolorów zainspirowana motywem Noctis z VS Code
|
||||
|
||||
# Sponsorzy <!-- omit in toc -->
|
||||
|
||||
[](https://packagecloud.io)
|
||||
|
||||
[**packagecloud**](https://packagecloud.io) zapewnia darmowe utrzymanie repozytorium Debian/RPM
|
||||
|
||||
[](https://keygen.sh/?via=eugene)
|
||||
|
||||
[**keygen**](https://keygen.sh/?via=eugene) zapewnia darmowe wydawanie oraz automatycznie utrzymywanie strony
|
||||
|
||||
<a name="contributing"></a>
|
||||
# Współtworzenie
|
||||
|
||||
Pull requesty and dodawanie nowych wtyczek jest mile widziane!
|
||||
|
||||
Zobacz plik [HAKOWANIE.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) oraz [Dokumentację API](https://docs.tabby.sh/), aby poznać, jak projekt jest prowadzony wraz ze wstępnym poradnikiem jak tworzyć wtyczki.
|
||||
|
||||
---
|
||||
<a name="contributors"></a>
|
||||
|
||||
Dziękujemy wszystkim osobom współtworzącym ten projekt ([emotki są specjalizacją](https://allcontributors.org/docs/en/emoji-key)):
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://www.russellmyers.com"><img src="https://avatars2.githubusercontent.com/u/184085?v=4?s=100" width="100px;" alt="Russell Myers"/><br /><sub><b>Russell Myers</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mezner" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://www.morwire.com"><img src="https://avatars1.githubusercontent.com/u/3991658?v=4?s=100" width="100px;" alt="Austin Warren"/><br /><sub><b>Austin Warren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ehwarren" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Drachenkaetzchen"><img src="https://avatars1.githubusercontent.com/u/162974?v=4?s=100" width="100px;" alt="Felicia Hummel"/><br /><sub><b>Felicia Hummel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Drachenkaetzchen" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mikemaccana"><img src="https://avatars2.githubusercontent.com/u/172594?v=4?s=100" width="100px;" alt="Mike MacCana"/><br /><sub><b>Mike MacCana</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mikemaccana" title="Tests">⚠️</a> <a href="#design-mikemaccana" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yxuko"><img src="https://avatars1.githubusercontent.com/u/1786317?v=4?s=100" width="100px;" alt="Yacine Kanzari"/><br /><sub><b>Yacine Kanzari</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yxuko" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BBJip"><img src="https://avatars2.githubusercontent.com/u/32908927?v=4?s=100" width="100px;" alt="BBJip"/><br /><sub><b>BBJip</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BBJip" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Futagirl"><img src="https://avatars2.githubusercontent.com/u/33533958?v=4?s=100" width="100px;" alt="Futagirl"/><br /><sub><b>Futagirl</b></sub></a><br /><a href="#design-Futagirl" title="Design">🎨</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.levrik.io"><img src="https://avatars3.githubusercontent.com/u/9491603?v=4?s=100" width="100px;" alt="Levin Rickert"/><br /><sub><b>Levin Rickert</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=levrik" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://kwonoj.github.io"><img src="https://avatars2.githubusercontent.com/u/1210596?v=4?s=100" width="100px;" alt="OJ Kwon"/><br /><sub><b>OJ Kwon</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kwonoj" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Domain"><img src="https://avatars2.githubusercontent.com/u/903197?v=4?s=100" width="100px;" alt="domain"/><br /><sub><b>domain</b></sub></a><br /><a href="#plugin-Domain" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Domain" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://www.jbrumond.me"><img src="https://avatars1.githubusercontent.com/u/195127?v=4?s=100" width="100px;" alt="James Brumond"/><br /><sub><b>James Brumond</b></sub></a><br /><a href="#plugin-kbjr" title="Plugin/utility libraries">🔌</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://www.growingwiththeweb.com"><img src="https://avatars0.githubusercontent.com/u/2193314?v=4?s=100" width="100px;" alt="Daniel Imms"/><br /><sub><b>Daniel Imms</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Code">💻</a> <a href="#plugin-Tyriar" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Tests">⚠️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/baflo"><img src="https://avatars2.githubusercontent.com/u/834350?v=4?s=100" width="100px;" alt="Florian Bachmann"/><br /><sub><b>Florian Bachmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=baflo" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://michael-kuehnel.de"><img src="https://avatars2.githubusercontent.com/u/441011?v=4?s=100" width="100px;" alt="Michael Kühnel"/><br /><sub><b>Michael Kühnel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mischah" title="Code">💻</a> <a href="#design-mischah" title="Design">🎨</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/NieLeben"><img src="https://avatars3.githubusercontent.com/u/47182955?v=4?s=100" width="100px;" alt="Tilmann Meyer"/><br /><sub><b>Tilmann Meyer</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NieLeben" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://www.jubeat.net"><img src="https://avatars3.githubusercontent.com/u/11289158?v=4?s=100" width="100px;" alt="PM Extra"/><br /><sub><b>PM Extra</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/issues?q=author%3APMExtra" title="Bug reports">🐛</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://jjuhas.keybase.pub//"><img src="https://avatars1.githubusercontent.com/u/6438760?v=4?s=100" width="100px;" alt="Jonathan"/><br /><sub><b>Jonathan</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=IgnusG" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://hans-koch.me"><img src="https://avatars0.githubusercontent.com/u/1093709?v=4?s=100" width="100px;" alt="Hans Koch"/><br /><sub><b>Hans Koch</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hammster" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://thepuzzlemaker.info"><img src="https://avatars3.githubusercontent.com/u/12666617?v=4?s=100" width="100px;" alt="Dak Smyth"/><br /><sub><b>Dak Smyth</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ThePuzzlemaker" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://yfwz100.github.io"><img src="https://avatars2.githubusercontent.com/u/983211?v=4?s=100" width="100px;" alt="Wang Zhi"/><br /><sub><b>Wang Zhi</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yfwz100" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jack1142"><img src="https://avatars0.githubusercontent.com/u/6032823?v=4?s=100" width="100px;" alt="jack1142"/><br /><sub><b>jack1142</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=jack1142" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hdougie"><img src="https://avatars1.githubusercontent.com/u/450799?v=4?s=100" width="100px;" alt="Howie Douglas"/><br /><sub><b>Howie Douglas</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hdougie" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://chriskaczor.com"><img src="https://avatars2.githubusercontent.com/u/180906?v=4?s=100" width="100px;" alt="Chris Kaczor"/><br /><sub><b>Chris Kaczor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ckaczor" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.boxmein.net"><img src="https://avatars1.githubusercontent.com/u/358714?v=4?s=100" width="100px;" alt="Johannes Kadak"/><br /><sub><b>Johannes Kadak</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boxmein" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LeSeulArtichaut"><img src="https://avatars1.githubusercontent.com/u/38361244?v=4?s=100" width="100px;" alt="LeSeulArtichaut"/><br /><sub><b>LeSeulArtichaut</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LeSeulArtichaut" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/CyrilTaylor"><img src="https://avatars0.githubusercontent.com/u/12631466?v=4?s=100" width="100px;" alt="Cyril Taylor"/><br /><sub><b>Cyril Taylor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=CyrilTaylor" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nstefanou"><img src="https://avatars3.githubusercontent.com/u/51129173?v=4?s=100" width="100px;" alt="nstefanou"/><br /><sub><b>nstefanou</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nstefanou" title="Code">💻</a> <a href="#plugin-nstefanou" title="Plugin/utility libraries">🔌</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/orin220444"><img src="https://avatars3.githubusercontent.com/u/30747229?v=4?s=100" width="100px;" alt="orin220444"/><br /><sub><b>orin220444</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=orin220444" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Goobles"><img src="https://avatars3.githubusercontent.com/u/8776771?v=4?s=100" width="100px;" alt="Gobius Dolhain"/><br /><sub><b>Gobius Dolhain</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Goobles" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/3l0w"><img src="https://avatars2.githubusercontent.com/u/37798980?v=4?s=100" width="100px;" alt="Gwilherm Folliot"/><br /><sub><b>Gwilherm Folliot</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=3l0w" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Dimitory"><img src="https://avatars0.githubusercontent.com/u/475955?v=4?s=100" width="100px;" alt="Dmitry Pronin"/><br /><sub><b>Dmitry Pronin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=dimitory" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JonathanBeverley"><img src="https://avatars1.githubusercontent.com/u/20328966?v=4?s=100" width="100px;" alt="Jonathan Beverley"/><br /><sub><b>Jonathan Beverley</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=JonathanBeverley" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zend"><img src="https://avatars1.githubusercontent.com/u/25160?v=4?s=100" width="100px;" alt="Zenghai Liang"/><br /><sub><b>Zenghai Liang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zend" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://about.me/matishadow"><img src="https://avatars0.githubusercontent.com/u/9083085?v=4?s=100" width="100px;" alt="Mateusz Tracz"/><br /><sub><b>Mateusz Tracz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=matishadow" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://zergpool.com"><img src="https://avatars3.githubusercontent.com/u/36234677?v=4?s=100" width="100px;" alt="pinpin"/><br /><sub><b>pinpin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=pinpins" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TakuroOnoda"><img src="https://avatars0.githubusercontent.com/u/1407926?v=4?s=100" width="100px;" alt="Takuro Onoda"/><br /><sub><b>Takuro Onoda</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TakuroOnoda" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/frauhottelmann"><img src="https://avatars2.githubusercontent.com/u/902705?v=4?s=100" width="100px;" alt="frauhottelmann"/><br /><sub><b>frauhottelmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=frauhottelmann" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://patalong.pl"><img src="https://avatars.githubusercontent.com/u/29167842?v=4?s=100" width="100px;" alt="Piotr Patalong"/><br /><sub><b>Piotr Patalong</b></sub></a><br /><a href="#design-VectorKappa" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/clarkwang"><img src="https://avatars.githubusercontent.com/u/157076?v=4?s=100" width="100px;" alt="Clark Wang"/><br /><sub><b>Clark Wang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=clarkwang" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/iamchating"><img src="https://avatars.githubusercontent.com/u/7088153?v=4?s=100" width="100px;" alt="iamchating"/><br /><sub><b>iamchating</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=iamchating" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/starxg"><img src="https://avatars.githubusercontent.com/u/34997494?v=4?s=100" width="100px;" alt="starxg"/><br /><sub><b>starxg</b></sub></a><br /><a href="#plugin-starxg" title="Plugin/utility libraries">🔌</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://hashnote.net/"><img src="https://avatars.githubusercontent.com/u/546312?v=4?s=100" width="100px;" alt="Alisue"/><br /><sub><b>Alisue</b></sub></a><br /><a href="#design-lambdalisue" title="Design">🎨</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ydcool"><img src="https://avatars.githubusercontent.com/u/5668295?v=4?s=100" width="100px;" alt="Dominic Yin"/><br /><sub><b>Dominic Yin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ydcool" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bdr99"><img src="https://avatars.githubusercontent.com/u/2292715?v=4?s=100" width="100px;" alt="Brandon Rothweiler"/><br /><sub><b>Brandon Rothweiler</b></sub></a><br /><a href="#design-bdr99" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://git.io/JnP49"><img src="https://avatars.githubusercontent.com/u/63876444?v=4?s=100" width="100px;" alt="Logic Machine"/><br /><sub><b>Logic Machine</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=logicmachine123" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cypherbits"><img src="https://avatars.githubusercontent.com/u/10424900?v=4?s=100" width="100px;" alt="cypherbits"/><br /><sub><b>cypherbits</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cypherbits" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://modulolotus.net"><img src="https://avatars.githubusercontent.com/u/946421?v=4?s=100" width="100px;" alt="Matthew Davidson"/><br /><sub><b>Matthew Davidson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=KingMob" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/al-wi"><img src="https://avatars.githubusercontent.com/u/11092199?v=4?s=100" width="100px;" alt="Alexander Wiedemann"/><br /><sub><b>Alexander Wiedemann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=al-wi" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375"><img src="https://avatars.githubusercontent.com/u/59506394?v=4?s=100" width="100px;" alt="장보연"/><br /><sub><b>장보연</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BoYeonJang" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Me1onRind"><img src="https://avatars.githubusercontent.com/u/19531270?v=4?s=100" width="100px;" alt="zZ"/><br /><sub><b>zZ</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Me1onRind" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/tainoNZ"><img src="https://avatars.githubusercontent.com/u/49261322?v=4?s=100" width="100px;" alt="Aaron Davison"/><br /><sub><b>Aaron Davison</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=tainoNZ" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/composer404"><img src="https://avatars.githubusercontent.com/u/58251560?v=4?s=100" width="100px;" alt="Przemyslaw Kozik"/><br /><sub><b>Przemyslaw Kozik</b></sub></a><br /><a href="#design-composer404" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/highfredo"><img src="https://avatars.githubusercontent.com/u/5951524?v=4?s=100" width="100px;" alt="Alfredo Arellano de la Fuente"/><br /><sub><b>Alfredo Arellano de la Fuente</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=highfredo" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/NessunKim"><img src="https://avatars.githubusercontent.com/u/12974079?v=4?s=100" width="100px;" alt="MH Kim"/><br /><sub><b>MH Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NessunKim" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://discord.gg/4c5EVTBhtp"><img src="https://avatars.githubusercontent.com/u/40345645?v=4?s=100" width="100px;" alt="Marmota"/><br /><sub><b>Marmota</b></sub></a><br /><a href="#design-jaimeadf" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://ares.zone"><img src="https://avatars.githubusercontent.com/u/40336192?v=4?s=100" width="100px;" alt="Ares Andrew"/><br /><sub><b>Ares Andrew</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TENX-S" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://usual.io/"><img src="https://avatars.githubusercontent.com/u/780052?v=4?s=100" width="100px;" alt="George Korsnick"/><br /><sub><b>George Korsnick</b></sub></a><br /><a href="#financial-gkor" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://about.me/ulu"><img src="https://avatars.githubusercontent.com/u/872764?v=4?s=100" width="100px;" alt="Artem Smirnov"/><br /><sub><b>Artem Smirnov</b></sub></a><br /><a href="#financial-uluhonolulu" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nevotheless"><img src="https://avatars.githubusercontent.com/u/779797?v=4?s=100" width="100px;" alt="Tim Kopplow"/><br /><sub><b>Tim Kopplow</b></sub></a><br /><a href="#financial-nevotheless" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mrthock"><img src="https://avatars.githubusercontent.com/u/88901709?v=4?s=100" width="100px;" alt="mrthock"/><br /><sub><b>mrthock</b></sub></a><br /><a href="#financial-mrthock" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lrottach"><img src="https://avatars.githubusercontent.com/u/50323692?v=4?s=100" width="100px;" alt="Lukas Rottach"/><br /><sub><b>Lukas Rottach</b></sub></a><br /><a href="#financial-lrottach" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/boonkerz"><img src="https://avatars.githubusercontent.com/u/277321?v=4?s=100" width="100px;" alt="boonkerz"/><br /><sub><b>boonkerz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boonkerz" title="Code">💻</a> <a href="#translation-boonkerz" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/milotype"><img src="https://avatars.githubusercontent.com/u/43657314?v=4?s=100" width="100px;" alt="Milo Ivir"/><br /><sub><b>Milo Ivir</b></sub></a><br /><a href="#translation-milotype" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JasonCubic"><img src="https://avatars.githubusercontent.com/u/8921015?v=4?s=100" width="100px;" alt="JasonCubic"/><br /><sub><b>JasonCubic</b></sub></a><br /><a href="#design-JasonCubic" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MaxWaldorf"><img src="https://avatars.githubusercontent.com/u/15877853?v=4?s=100" width="100px;" alt="MaxWaldorf"/><br /><sub><b>MaxWaldorf</b></sub></a><br /><a href="#infra-MaxWaldorf" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt="Matheus Castello"/><br /><sub><b>Matheus Castello</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=microhobby" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt="Jai A P"/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt="Richard Yu"/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt="artu-ole"/><br /><sub><b>artu-ole</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=artu-ole" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt="Timofey Gribanov"/><br /><sub><b>Timofey Gribanov</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TimaGribanov" title="Documentation">📖</a> <a href="#translation-TimaGribanov" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://git.christianbingman.com"><img src="https://avatars.githubusercontent.com/u/42191425?v=4?s=100" width="100px;" alt="Christian Bingman"/><br /><sub><b>Christian Bingman</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ChristianBingman" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://zhangzhipeng2023.cn/"><img src="https://avatars.githubusercontent.com/u/5310853?v=4?s=100" width="100px;" alt="zhipeng"/><br /><sub><b>zhipeng</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Ox0400" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/woodmeal"><img src="https://avatars.githubusercontent.com/u/104011197?v=4?s=100" width="100px;" alt="woodmeal"/><br /><sub><b>woodmeal</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=woodmeal" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://magiclike.codeberg.page/"><img src="https://avatars.githubusercontent.com/u/82117109?v=4?s=100" width="100px;" alt="MagicLike"/><br /><sub><b>MagicLike</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=MagicLike" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hisamafahri"><img src="https://avatars.githubusercontent.com/u/65691613?v=4?s=100" width="100px;" alt="Hisam Fahri"/><br /><sub><b>Hisam Fahri</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hisamafahri" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://liangchengj.com"><img src="https://avatars.githubusercontent.com/u/48881023?v=4?s=100" width="100px;" alt="Liangcheng Juves"/><br /><sub><b>Liangcheng Juves</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LiangchengJ" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/attet"><img src="https://avatars.githubusercontent.com/u/1911416?v=4?s=100" width="100px;" alt="Atte Timonen"/><br /><sub><b>Atte Timonen</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=attet" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/joaolmpinto/"><img src="https://avatars.githubusercontent.com/u/1143125?v=4?s=100" width="100px;" alt="João Pinto"/><br /><sub><b>João Pinto</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=joaompinto" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Qiming-Liu"><img src="https://avatars.githubusercontent.com/u/68600416?v=4?s=100" width="100px;" alt="Alan"/><br /><sub><b>Alan</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Qiming-Liu" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://74th.tech/"><img src="https://avatars.githubusercontent.com/u/1060011?v=4?s=100" width="100px;" alt="Atsushi Morimoto"/><br /><sub><b>Atsushi Morimoto</b></sub></a><br /><a href="#financial-74th" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://arles.red/"><img src="https://avatars.githubusercontent.com/u/5369096?v=4?s=100" width="100px;" alt="Arles"/><br /><sub><b>Arles</b></sub></a><br /><a href="#financial-aarles" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://pentestbook.six2dez.com/"><img src="https://avatars.githubusercontent.com/u/24670991?v=4?s=100" width="100px;" alt="six2dez"/><br /><sub><b>six2dez</b></sub></a><br /><a href="#financial-six2dez" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/CandiceJoy"><img src="https://avatars.githubusercontent.com/u/8854890?v=4?s=100" width="100px;" alt="Candice"/><br /><sub><b>Candice</b></sub></a><br /><a href="#financial-CandiceJoy" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kingrowen"><img src="https://avatars.githubusercontent.com/u/13178700?v=4?s=100" width="100px;" alt="Rowen Willabus"/><br /><sub><b>Rowen Willabus</b></sub></a><br /><a href="#financial-kingrowen" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://hengy1.top/"><img src="https://avatars.githubusercontent.com/u/98681454?v=4?s=100" width="100px;" alt="HengY1Coding✨"/><br /><sub><b>HengY1Coding✨</b></sub></a><br /><a href="#financial-HengY1Sky" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FrancisHG"><img src="https://avatars.githubusercontent.com/u/1611626?v=4?s=100" width="100px;" alt="Francis Gelderloos"/><br /><sub><b>Francis Gelderloos</b></sub></a><br /><a href="#financial-FrancisHG" title="Financial">💵</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/astromasoud"><img src="https://avatars.githubusercontent.com/u/18737721?v=4?s=100" width="100px;" alt="astromasoud"/><br /><sub><b>astromasoud</b></sub></a><br /><a href="#financial-astromasoud" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://spirit55555.dk/"><img src="https://avatars.githubusercontent.com/u/2357565?v=4?s=100" width="100px;" alt="Anders G. Jørgensen"/><br /><sub><b>Anders G. Jørgensen</b></sub></a><br /><a href="#financial-Spirit55555" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/djradon"><img src="https://avatars.githubusercontent.com/u/5224156?v=4?s=100" width="100px;" alt="Dave Richardson"/><br /><sub><b>Dave Richardson</b></sub></a><br /><a href="#financial-djradon" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/tpberntsen"><img src="https://avatars.githubusercontent.com/u/922318?v=4?s=100" width="100px;" alt="Thomas Peter Berntsen"/><br /><sub><b>Thomas Peter Berntsen</b></sub></a><br /><a href="#financial-tpberntsen" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://bandism.net/"><img src="https://avatars.githubusercontent.com/u/22633385?v=4?s=100" width="100px;" alt="Ikko Ashimine"/><br /><sub><b>Ikko Ashimine</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=eltociear" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/giejqf"><img src="https://avatars.githubusercontent.com/u/9211230?v=4?s=100" width="100px;" alt="giejqf"/><br /><sub><b>giejqf</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=giejqf" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LacazeThomas"><img src="https://avatars.githubusercontent.com/u/19855907?v=4?s=100" width="100px;" alt="Thomas LACAZE"/><br /><sub><b>Thomas LACAZE</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LacazeThomas" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://pochen.me/"><img src="https://avatars.githubusercontent.com/u/1329716?v=4?s=100" width="100px;" alt="Po Chen"/><br /><sub><b>Po Chen</b></sub></a><br /><a href="#financial-princemaple" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://victorchandra.carrd.co/"><img src="https://avatars.githubusercontent.com/u/41635105?v=4?s=100" width="100px;" alt="Victor Chandra"/><br /><sub><b>Victor Chandra</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mzmznasipadang" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/daniel347x"><img src="https://avatars.githubusercontent.com/u/309746?v=4?s=100" width="100px;" alt="Dan Nissenbaum"/><br /><sub><b>Dan Nissenbaum</b></sub></a><br /><a href="#financial-daniel347x" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DunklerPhoenix"><img src="https://avatars.githubusercontent.com/u/1261305?v=4?s=100" width="100px;" alt="RogueThorn"/><br /><sub><b>RogueThorn</b></sub></a><br /><a href="#financial-DunklerPhoenix" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://spenserblack.github.io"><img src="https://avatars.githubusercontent.com/u/8546709?v=4?s=100" width="100px;" alt="Spenser Black"/><br /><sub><b>Spenser Black</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=spenserblack" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zuedev"><img src="https://avatars.githubusercontent.com/u/24614929?v=4?s=100" width="100px;" alt="Alex"/><br /><sub><b>Alex</b></sub></a><br /><a href="#financial-zuedev" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://hengy1.top/"><img src="https://avatars.githubusercontent.com/u/98681454?v=4?s=100" width="100px;" alt="HengY1Coding✨"/><br /><sub><b>HengY1Coding✨</b></sub></a><br /><a href="#financial-HengY1Cola" title="Financial">💵</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.stackscale.com/"><img src="https://avatars.githubusercontent.com/u/195768?v=4?s=100" width="100px;" alt="David Carrero"/><br /><sub><b>David Carrero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=dcarrero" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zhoro"><img src="https://avatars.githubusercontent.com/u/1105687?v=4?s=100" width="100px;" alt="Andrii Zhovtiak"/><br /><sub><b>Andrii Zhovtiak</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zhoro" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JohnMasoner"><img src="https://avatars.githubusercontent.com/u/42313377?v=4?s=100" width="100px;" alt="Mason Ma"/><br /><sub><b>Mason Ma</b></sub></a><br /><a href="#financial-JohnMasoner" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ntimo"><img src="https://avatars.githubusercontent.com/u/6145026?v=4?s=100" width="100px;" alt="Timo"/><br /><sub><b>Timo</b></sub></a><br /><a href="#financial-ntimo" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/evinwatson/"><img src="https://avatars.githubusercontent.com/u/24227251?v=4?s=100" width="100px;" alt="Evin Watson"/><br /><sub><b>Evin Watson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=EvinRWatson" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://t.me/hendrjl"><img src="https://avatars.githubusercontent.com/u/15981200?v=4?s=100" width="100px;" alt="Hendra Juli"/><br /><sub><b>Hendra Juli</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=deulizealand" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wkricowski"><img src="https://avatars.githubusercontent.com/u/36803521?v=4?s=100" width="100px;" alt="Wellinton Kricowski"/><br /><sub><b>Wellinton Kricowski</b></sub></a><br /><a href="#financial-wkricowski" title="Financial">💵</a> <a href="https://github.com/Eugeny/tabby/commits?author=wkricowski" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/almzau"><img src="https://avatars.githubusercontent.com/u/29115846?v=4?s=100" width="100px;" alt="Allan"/><br /><sub><b>Allan</b></sub></a><br /><a href="#design-almzau" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://oidamo.de"><img src="https://avatars.githubusercontent.com/u/17959794?v=4?s=100" width="100px;" alt="Benjamin Brandmeier"/><br /><sub><b>Benjamin Brandmeier</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BenjaminBrandmeier" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/patric1025"><img src="https://avatars.githubusercontent.com/u/65654040?v=4?s=100" width="100px;" alt="patric1025"/><br /><sub><b>patric1025</b></sub></a><br /><a href="#translation-patric1025" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hermitpopcorn"><img src="https://avatars.githubusercontent.com/u/16042129?v=4?s=100" width="100px;" alt="hermitpopcorn"/><br /><sub><b>hermitpopcorn</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hermitpopcorn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://joshuatz.com/"><img src="https://avatars.githubusercontent.com/u/17817563?v=4?s=100" width="100px;" alt="Joshua Tzucker"/><br /><sub><b>Joshua Tzucker</b></sub></a><br /><a href="#financial-joshuatz" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/luxifr"><img src="https://avatars.githubusercontent.com/u/665715?v=4?s=100" width="100px;" alt="luxifr"/><br /><sub><b>luxifr</b></sub></a><br /><a href="#financial-luxifr" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ukulanne"><img src="https://avatars.githubusercontent.com/u/28586666?v=4?s=100" width="100px;" alt="Anne Summers"/><br /><sub><b>Anne Summers</b></sub></a><br /><a href="#financial-ukulanne" title="Financial">💵</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Clem-Fern"><img src="https://avatars.githubusercontent.com/u/20025949?v=4?s=100" width="100px;" alt="Clem"/><br /><sub><b>Clem</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Clem-Fern" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/elizabeth-dev"><img src="https://avatars.githubusercontent.com/u/13015727?v=4?s=100" width="100px;" alt="Elizabeth Martín Campos"/><br /><sub><b>Elizabeth Martín Campos</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=elizabeth-dev" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/siccous"><img src="https://avatars.githubusercontent.com/u/7812885?v=4?s=100" width="100px;" alt="Tomáš Hruška"/><br /><sub><b>Tomáš Hruška</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siccous" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/karaketir16"><img src="https://avatars.githubusercontent.com/u/27349806?v=4?s=100" width="100px;" alt="Osman Karaketir"/><br /><sub><b>Osman Karaketir</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=karaketir16" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.gnomegarden.io/"><img src="https://avatars.githubusercontent.com/u/33667144?v=4?s=100" width="100px;" alt="Crypto Gnome"/><br /><sub><b>Crypto Gnome</b></sub></a><br /><a href="#financial-CryptoGnome" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/rbukovansky"><img src="https://avatars.githubusercontent.com/u/1004491?v=4?s=100" width="100px;" alt="Richard Bukovansky"/><br /><sub><b>Richard Bukovansky</b></sub></a><br /><a href="#financial-rbukovansky" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/pseudocc"><img src="https://avatars.githubusercontent.com/u/85104110?v=4?s=100" width="100px;" alt="catlas"/><br /><sub><b>catlas</b></sub></a><br /><a href="#financial-pseudocc" title="Financial">💵</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://kapocsi.ca"><img src="https://avatars.githubusercontent.com/u/84490604?v=4?s=100" width="100px;" alt="Thomas Kapocsi"/><br /><sub><b>Thomas Kapocsi</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Kapocsi" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://dylhack.dev/"><img src="https://avatars.githubusercontent.com/u/27179786?v=4?s=100" width="100px;" alt="Dylan Hackworth"/><br /><sub><b>Dylan Hackworth</b></sub></a><br /><a href="#financial-dylhack" title="Financial">💵</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/echo304"><img src="https://avatars.githubusercontent.com/u/16456651?v=4?s=100" width="100px;" alt="Sangboak Lee"/><br /><sub><b>Sangboak Lee</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=echo304" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/qyecst"><img src="https://avatars.githubusercontent.com/u/13901864?v=4?s=100" width="100px;" alt="qyecst"/><br /><sub><b>qyecst</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=qyecst" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DehanLUO"><img src="https://avatars.githubusercontent.com/u/53093688?v=4?s=100" width="100px;" alt="Han"/><br /><sub><b>Han</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=DehanLUO" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://siebsie23.nl/"><img src="https://avatars.githubusercontent.com/u/25083973?v=4?s=100" width="100px;" alt="Sibren"/><br /><sub><b>Sibren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siebsie23" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
|
||||
Ten projekt podlega specyfikacji [dla współautorów](https://github.com/all-contributors/all-contributors). Wszelkiego rodzaju przyczynianie się do rozwoju jest tu mile widziane!
|
@@ -21,7 +21,7 @@
|
||||
|
||||
<br/>
|
||||
<p align="center">
|
||||
Esse README também está disponível em: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a>
|
||||
Esse README também está disponível em: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||
</p>
|
||||
|
||||
----
|
||||
@@ -246,7 +246,7 @@ Obrigado vai para essas pessoas maravilhosas ([emoji key](https://allcontributor
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -335,6 +335,16 @@ Obrigado vai para essas pessoas maravilhosas ([emoji key](https://allcontributor
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -21,7 +21,7 @@
|
||||
|
||||
<br/>
|
||||
<p align="center">
|
||||
Этот README также доступен на: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:br: Português</a>
|
||||
Этот README также доступен на: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||
</p>
|
||||
|
||||
----
|
||||
@@ -29,7 +29,7 @@
|
||||
[**Tabby**](https://tabby.sh) (ранее **Terminus**) — широко конфигурируемый эмулятор терминала, SSH- и COM-клиент для Windows, macOS и Linux:
|
||||
|
||||
* Встроенный SSH- и Telnet-клиент и менеджер подключений;
|
||||
* Встроенный последовтаельный терминал;
|
||||
* Встроенный последовательный терминал;
|
||||
* Темы и цветовые схемы;
|
||||
* Полностью настраеваемые сочетания клавиш;
|
||||
* Панели;
|
||||
@@ -39,7 +39,7 @@
|
||||
* Полная поддержка Unicode, включая символы двойной ширины;
|
||||
* Не задыхается при быстром выводе;
|
||||
* Полноценный опыт работы с shell на Windows, включая дополнение слов и команд по Tab (при помощи Clink);
|
||||
* Втроенное защищённое хранилище для SSH-ключей и настроек;
|
||||
* Встроенное защищённое хранилище для SSH-ключей и настроек;
|
||||
* SSH-, SFTP- и Telnet-клиент доступен как [веб-приложение](https://tabby.sh/app) (также для [самостоятелньного хостинга](https://github.com/Eugeny/tabby-web)).
|
||||
|
||||
# Содержание <!-- omit in toc -->
|
||||
@@ -71,7 +71,7 @@
|
||||
* Деление окна на несколько панелей;
|
||||
* Вкладки на любой стороне окна;
|
||||
* Опционально закрепляемое окно с глобальной горячей клавишей для вызова («Quake console»);
|
||||
* Определение прогресса процесса;
|
||||
* Определение прогресса выполняемого процесса;
|
||||
* Уведомления о завершении процессов;
|
||||
* Защита от выполнения команд при вставке, предупреждения о вставке нескольких строк;
|
||||
* Лигатуры шрифтов;
|
||||
@@ -94,7 +94,7 @@
|
||||
|
||||
* Сохранение соединений;
|
||||
* Поддержка ввода readline;
|
||||
* Опциональый побатный ввод HEX и вывод hexdump;
|
||||
* Опциональный побатный ввод HEX и вывод hexdump;
|
||||
* Преобразование newline;
|
||||
* Автоматическое восстановление соединения.
|
||||
|
||||
@@ -115,9 +115,9 @@
|
||||
* [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) — позволяет создавать пользовательские провили рабочего окружеиня на основе конфига;
|
||||
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) — позволяет создавать пользовательские профили рабочего окружения на основе конфига;
|
||||
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) — открывает браузер по умолчанию с текстом, выделенном во вкладке Tabby.
|
||||
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - open sftp tab for ssh connection like SecureCRT
|
||||
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - открывает sftp вкладку для ssh соединения, похож на SecureCRT
|
||||
|
||||
<a name="themes"></a>
|
||||
# Темы
|
||||
@@ -238,7 +238,7 @@ Pull-запросы и плагины приветствуются!
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -327,6 +327,16 @@ Pull-запросы и плагины приветствуются!
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -21,7 +21,7 @@
|
||||
|
||||
<br/>
|
||||
<p align="center">
|
||||
本 README 还适用于以下语言: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:br: Português</a>
|
||||
本 README 还适用于以下语言: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
|
||||
</p>
|
||||
|
||||
----
|
||||
@@ -237,7 +237,7 @@
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://pingbase.cn"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="X-0x01"/><br /><sub><b>X-0x01</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=X-0x01" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -326,6 +326,16 @@
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -183,9 +183,10 @@ export class Application {
|
||||
}
|
||||
|
||||
enableTray (): void {
|
||||
if (!!this.tray || process.platform === 'linux') {
|
||||
if (!!this.tray || process.platform === 'linux' || (this.configStore.hideTray ?? false) === true) {
|
||||
return
|
||||
}
|
||||
|
||||
if (process.platform === 'darwin') {
|
||||
this.tray = new Tray(`${app.getAppPath()}/assets/tray-darwinTemplate.png`)
|
||||
this.tray.setPressedImage(`${app.getAppPath()}/assets/tray-darwinHighlightTemplate.png`)
|
||||
|
@@ -28,6 +28,16 @@ export function parseArgs (argv: string[], cwd: string): any {
|
||||
.command('recent [index]', 'open a tab with a recent profile', {
|
||||
profileNumber: { type: 'number' },
|
||||
})
|
||||
.command('quickConnect <providerId> <query>', 'open a tab for specified quick connect provider', yargs => {
|
||||
return yargs.positional('providerId', {
|
||||
describe: 'The name of a quick connect profile provider',
|
||||
type: 'string',
|
||||
choices: ['ssh', 'telnet'],
|
||||
}).positional('query', {
|
||||
describe: 'The quick connect query string',
|
||||
type: 'string',
|
||||
})
|
||||
})
|
||||
.version(app.getVersion())
|
||||
.option('debug', {
|
||||
alias: 'd',
|
||||
|
@@ -31,6 +31,8 @@ try {
|
||||
app.exit(1)
|
||||
}
|
||||
|
||||
process.mainModule = module
|
||||
|
||||
const application = new Application(configStore)
|
||||
|
||||
ipcMain.on('app:new-window', () => {
|
||||
|
@@ -1,5 +1,5 @@
|
||||
import * as glasstron from 'glasstron'
|
||||
|
||||
import { autoUpdater } from 'electron-updater'
|
||||
import { Subject, Observable, debounceTime } from 'rxjs'
|
||||
import { BrowserWindow, app, ipcMain, Rectangle, Menu, screen, BrowserWindowConstructorOptions, TouchBar, nativeImage, WebContents } from 'electron'
|
||||
import ElectronConfig = require('electron-config')
|
||||
@@ -26,7 +26,7 @@ abstract class GlasstronWindow extends BrowserWindow {
|
||||
abstract setBlur (_: boolean)
|
||||
}
|
||||
|
||||
const macOSVibrancyType: any = process.platform === 'darwin' ? compareVersions(macOSRelease().version || '0.0', '10.14', '>=') ? 'under-window' : 'dark' : null
|
||||
const macOSVibrancyType: any = process.platform === 'darwin' ? compareVersions(macOSRelease().version || '0.0', '10.14', '>=') ? 'fullscreen-ui' : 'dark' : null
|
||||
|
||||
const activityIcon = nativeImage.createFromPath(`${app.getAppPath()}/assets/activity.png`)
|
||||
|
||||
@@ -159,6 +159,7 @@ export class Window {
|
||||
}
|
||||
|
||||
this.setupWindowManagement()
|
||||
this.setupUpdater()
|
||||
|
||||
this.ready = new Promise(resolve => {
|
||||
const listener = event => {
|
||||
@@ -346,11 +347,8 @@ export class Window {
|
||||
this.send('host:window-focused')
|
||||
})
|
||||
|
||||
ipcMain.on('ready', event => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
this.window.webContents.send('start', {
|
||||
this.on('ready', () => {
|
||||
this.window?.webContents.send('start', {
|
||||
config: this.configStore,
|
||||
executable: app.getPath('exe'),
|
||||
windowID: this.window.id,
|
||||
@@ -359,42 +357,26 @@ export class Window {
|
||||
})
|
||||
})
|
||||
|
||||
ipcMain.on('window-minimize', event => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
this.window.minimize()
|
||||
this.on('window-minimize', () => {
|
||||
this.window?.minimize()
|
||||
})
|
||||
|
||||
ipcMain.on('window-set-bounds', (event, bounds) => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
this.window.setBounds(bounds)
|
||||
this.on('window-set-bounds', (_, bounds) => {
|
||||
this.window?.setBounds(bounds)
|
||||
})
|
||||
|
||||
ipcMain.on('window-set-always-on-top', (event, flag) => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
this.window.setAlwaysOnTop(flag)
|
||||
this.on('window-set-always-on-top', (_, flag) => {
|
||||
this.window?.setAlwaysOnTop(flag)
|
||||
})
|
||||
|
||||
ipcMain.on('window-set-vibrancy', (event, enabled, type) => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
this.on('window-set-vibrancy', (_, enabled, type) => {
|
||||
this.setVibrancy(enabled, type)
|
||||
})
|
||||
|
||||
ipcMain.on('window-set-window-controls-color', (event, theme) => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
|
||||
this.on('window-set-window-controls-color', (_, theme) => {
|
||||
if (process.platform === 'win32') {
|
||||
const symbolColor: string = theme.foreground
|
||||
this.window.setTitleBarOverlay(
|
||||
this.window?.setTitleBarOverlay(
|
||||
{
|
||||
symbolColor: symbolColor,
|
||||
height: 32,
|
||||
@@ -403,32 +385,23 @@ export class Window {
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.on('window-set-title', (event, title) => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
this.window.setTitle(title)
|
||||
this.on('window-set-title', (_, title) => {
|
||||
this.window?.setTitle(title)
|
||||
})
|
||||
|
||||
ipcMain.on('window-bring-to-front', event => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
if (this.window.isMinimized()) {
|
||||
this.on('window-bring-to-front', () => {
|
||||
if (this.window?.isMinimized()) {
|
||||
this.window.restore()
|
||||
}
|
||||
this.present()
|
||||
})
|
||||
|
||||
ipcMain.on('window-close', event => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
this.on('window-close', () => {
|
||||
this.closing = true
|
||||
this.window.close()
|
||||
})
|
||||
|
||||
ipcMain.on('window-set-touch-bar', (_event, segments, selectedIndex) => {
|
||||
this.on('window-set-touch-bar', (_, segments, selectedIndex) => {
|
||||
this.touchBarControl.segments = segments.map(s => ({
|
||||
label: s.label,
|
||||
icon: s.hasActivity ? activityIcon : undefined,
|
||||
@@ -468,8 +441,46 @@ export class Window {
|
||||
this.window.setOpacity(opacity)
|
||||
})
|
||||
|
||||
ipcMain.on('window-set-progress-bar', (_event, value) => {
|
||||
this.window.setProgressBar(value, { mode: value < 0 ? 'none' : 'normal' })
|
||||
this.on('window-set-progress-bar', (_, value) => {
|
||||
this.window?.setProgressBar(value, { mode: value < 0 ? 'none' : 'normal' })
|
||||
})
|
||||
}
|
||||
|
||||
on (event: string, listener: (...args: any[]) => void): void {
|
||||
ipcMain.on(event, (e, ...args) => {
|
||||
if (!this.window || e.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
listener(e, ...args)
|
||||
})
|
||||
}
|
||||
|
||||
private setupUpdater () {
|
||||
autoUpdater.autoDownload = true
|
||||
autoUpdater.autoInstallOnAppQuit = true
|
||||
|
||||
autoUpdater.on('update-available', () => {
|
||||
this.send('updater:update-available')
|
||||
})
|
||||
|
||||
autoUpdater.on('update-not-available', () => {
|
||||
this.send('updater:update-not-available')
|
||||
})
|
||||
|
||||
autoUpdater.on('error', err => {
|
||||
this.send('updater:error', err)
|
||||
})
|
||||
|
||||
autoUpdater.on('update-downloaded', () => {
|
||||
this.send('updater:update-downloaded')
|
||||
})
|
||||
|
||||
this.on('updater:check-for-updates', () => {
|
||||
autoUpdater.checkForUpdates()
|
||||
})
|
||||
|
||||
this.on('updater:quit-and-install', () => {
|
||||
autoUpdater.quitAndInstall()
|
||||
})
|
||||
}
|
||||
|
||||
|
@@ -15,8 +15,8 @@
|
||||
"watch": "webpack --progress --color --watch"
|
||||
},
|
||||
"dependencies": {
|
||||
"@electron/remote": "2.0.10",
|
||||
"node-pty": "^1.0",
|
||||
"@electron/remote": "^2",
|
||||
"node-pty": "^1.1.0-beta.14",
|
||||
"any-promise": "^1.3.0",
|
||||
"electron-config": "2.0.0",
|
||||
"electron-debug": "^3.2.0",
|
||||
@@ -30,6 +30,7 @@
|
||||
"native-process-working-directory": "^1.0.2",
|
||||
"npm": "6",
|
||||
"rxjs": "^7.5.7",
|
||||
"russh": "0.0.3",
|
||||
"source-map-support": "^0.5.20",
|
||||
"v8-compile-cache": "^2.3.0",
|
||||
"yargs": "^17.7.2"
|
||||
@@ -63,8 +64,7 @@
|
||||
"tabby-terminal": "*"
|
||||
},
|
||||
"resolutions": {
|
||||
"*/node-abi": "^2.20.0",
|
||||
"node-gyp": "^10.0.0",
|
||||
"nan": "github:jkleinsc/nan#remove_accessor_signature"
|
||||
"*/node-abi": "^3",
|
||||
"node-gyp": "^10.0.0"
|
||||
}
|
||||
}
|
||||
|
@@ -42,6 +42,7 @@ const config = {
|
||||
'electron-config': 'commonjs electron-config',
|
||||
'electron-debug': 'commonjs electron-debug',
|
||||
'electron-promise-ipc': 'commonjs electron-promise-ipc',
|
||||
'electron-updater': 'commonjs electron-updater',
|
||||
fs: 'commonjs fs',
|
||||
glasstron: 'commonjs glasstron',
|
||||
mz: 'commonjs mz',
|
||||
|
128
app/yarn.lock
128
app/yarn.lock
@@ -2,10 +2,10 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@electron/remote@2.0.10":
|
||||
version "2.0.10"
|
||||
resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-2.0.10.tgz#133e2f607b1861ac249bd78b5abd1e961feed713"
|
||||
integrity sha512-3SFKKaQXcyWgwmibud+UqJl/XlHOgLcI3fwtB9pNelPSJAcTxocOJrF6FaxBIQaj1+R05Di6xuAswZpXAW7xhA==
|
||||
"@electron/remote@^2":
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-2.1.2.tgz#52a97c8faa5b769155b649ef262f2f8c851776e6"
|
||||
integrity sha512-EPwNx+nhdrTBxyCqXt/pftoQg/ybtWDW3DUWHafejvnB1ZGGfMpv6e15D8KeempocjXe78T7WreyGGb3mlZxdA==
|
||||
|
||||
"@iarna/cli@^1.2.0":
|
||||
version "1.2.0"
|
||||
@@ -28,6 +28,11 @@
|
||||
wrap-ansi "^8.1.0"
|
||||
wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
|
||||
|
||||
"@napi-rs/cli@^2.18.3":
|
||||
version "2.18.4"
|
||||
resolved "https://registry.yarnpkg.com/@napi-rs/cli/-/cli-2.18.4.tgz#12bebfb7995902fa7ab43cc0b155a7f5a2caa873"
|
||||
integrity sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==
|
||||
|
||||
"@ngx-translate/core@^14.0.0":
|
||||
version "14.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@ngx-translate/core/-/core-14.0.0.tgz#af421d0e1a28376843f0fed375cd2fae7630a5ff"
|
||||
@@ -1490,25 +1495,26 @@ glasstron@0.1.1:
|
||||
x11 "^2.3.0"
|
||||
|
||||
glob@^10.2.2, glob@^10.3.10:
|
||||
version "10.3.10"
|
||||
resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b"
|
||||
integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==
|
||||
version "10.4.5"
|
||||
resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956"
|
||||
integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==
|
||||
dependencies:
|
||||
foreground-child "^3.1.0"
|
||||
jackspeak "^2.3.5"
|
||||
minimatch "^9.0.1"
|
||||
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
|
||||
path-scurry "^1.10.1"
|
||||
jackspeak "^3.1.2"
|
||||
minimatch "^9.0.4"
|
||||
minipass "^7.1.2"
|
||||
package-json-from-dist "^1.0.0"
|
||||
path-scurry "^1.11.1"
|
||||
|
||||
glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
|
||||
version "7.1.6"
|
||||
resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz"
|
||||
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
|
||||
version "7.2.3"
|
||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
|
||||
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
|
||||
dependencies:
|
||||
fs.realpath "^1.0.0"
|
||||
inflight "^1.0.4"
|
||||
inherits "2"
|
||||
minimatch "^3.0.4"
|
||||
minimatch "^3.1.1"
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
@@ -1931,10 +1937,10 @@ isstream@~0.1.2:
|
||||
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz"
|
||||
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
|
||||
|
||||
jackspeak@^2.3.5:
|
||||
version "2.3.6"
|
||||
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8"
|
||||
integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==
|
||||
jackspeak@^3.1.2:
|
||||
version "3.4.3"
|
||||
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a"
|
||||
integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==
|
||||
dependencies:
|
||||
"@isaacs/cliui" "^8.0.2"
|
||||
optionalDependencies:
|
||||
@@ -2286,13 +2292,18 @@ lowercase-keys@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
|
||||
integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
|
||||
|
||||
lru-cache@^10.0.1, "lru-cache@^9.1.1 || ^10.0.0":
|
||||
lru-cache@^10.0.1:
|
||||
version "10.0.2"
|
||||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.2.tgz#34504678cc3266b09b8dfd6fab4e1515258271b7"
|
||||
integrity sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==
|
||||
dependencies:
|
||||
semver "^7.3.5"
|
||||
|
||||
lru-cache@^10.2.0:
|
||||
version "10.4.3"
|
||||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
|
||||
integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
|
||||
|
||||
lru-cache@^4.0.1:
|
||||
version "4.1.5"
|
||||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
|
||||
@@ -2412,10 +2423,17 @@ minimatch@^3.0.4:
|
||||
dependencies:
|
||||
brace-expansion "^1.1.7"
|
||||
|
||||
minimatch@^9.0.1:
|
||||
version "9.0.3"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825"
|
||||
integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
|
||||
minimatch@^3.1.1:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
|
||||
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
|
||||
dependencies:
|
||||
brace-expansion "^1.1.7"
|
||||
|
||||
minimatch@^9.0.4:
|
||||
version "9.0.5"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
|
||||
integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
|
||||
dependencies:
|
||||
brace-expansion "^2.0.1"
|
||||
|
||||
@@ -2488,6 +2506,11 @@ minipass@^5.0.0:
|
||||
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c"
|
||||
integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==
|
||||
|
||||
minipass@^7.1.2:
|
||||
version "7.1.2"
|
||||
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
|
||||
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
|
||||
|
||||
minizlib@^1.3.3:
|
||||
version "1.3.3"
|
||||
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
|
||||
@@ -2577,9 +2600,10 @@ mz@^2.7.0:
|
||||
object-assign "^4.0.1"
|
||||
thenify-all "^1.0.0"
|
||||
|
||||
nan@^2.17.0, "nan@github:jkleinsc/nan#remove_accessor_signature":
|
||||
version "2.16.0"
|
||||
resolved "https://codeload.github.com/jkleinsc/nan/tar.gz/6a2f95a6a2209d8aa7542fb18099fd808a802059"
|
||||
nan@^2.17.0:
|
||||
version "2.20.0"
|
||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3"
|
||||
integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==
|
||||
|
||||
napi-build-utils@^1.0.1:
|
||||
version "1.0.2"
|
||||
@@ -2610,12 +2634,12 @@ nice-try@^1.0.4:
|
||||
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
|
||||
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
|
||||
|
||||
node-abi@^2.20.0:
|
||||
version "2.30.1"
|
||||
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf"
|
||||
integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==
|
||||
node-abi@^3:
|
||||
version "3.65.0"
|
||||
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.65.0.tgz#ca92d559388e1e9cab1680a18c1a18757cdac9d3"
|
||||
integrity sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==
|
||||
dependencies:
|
||||
semver "^5.4.1"
|
||||
semver "^7.3.5"
|
||||
|
||||
node-abi@^3.3.0:
|
||||
version "3.8.0"
|
||||
@@ -2639,6 +2663,11 @@ node-addon-api@^4.0.0, node-addon-api@^4.3.0:
|
||||
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f"
|
||||
integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==
|
||||
|
||||
node-addon-api@^7.1.0:
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558"
|
||||
integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==
|
||||
|
||||
node-fetch-npm@^2.0.2:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz#6507d0e17a9ec0be3bec516958a497cec54bf5a4"
|
||||
@@ -2669,12 +2698,12 @@ node-gyp@^10.0.0, node-gyp@^5.0.2, node-gyp@^5.1.0:
|
||||
tar "^6.1.2"
|
||||
which "^4.0.0"
|
||||
|
||||
node-pty@^1.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-1.0.0.tgz#7daafc0aca1c4ca3de15c61330373af4af5861fd"
|
||||
integrity sha512-wtBMWWS7dFZm/VgqElrTvtfMq4GzJ6+edFI0Y0zyzygUSZMgZdraDUMUhCIvkjhJjme15qWmbyJbtAx4ot4uZA==
|
||||
node-pty@^1.1.0-beta.14:
|
||||
version "1.1.0-beta9"
|
||||
resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-1.1.0-beta9.tgz#ed643cb3b398d031b4e31c216e8f3b0042435f1d"
|
||||
integrity sha512-/Ue38pvXJdgRZ3+me1FgfglLd301GhJN0NStiotdt61tm43N5htUyR/IXOUzOKuNaFmCwIhy6nwb77Ky41LMbw==
|
||||
dependencies:
|
||||
nan "^2.17.0"
|
||||
node-addon-api "^7.1.0"
|
||||
|
||||
nopt@^4.0.3:
|
||||
version "4.0.3"
|
||||
@@ -3096,6 +3125,11 @@ p-try@^2.0.0:
|
||||
resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"
|
||||
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
|
||||
|
||||
package-json-from-dist@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00"
|
||||
integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==
|
||||
|
||||
package-json@^4.0.0:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
|
||||
@@ -3208,12 +3242,12 @@ path-parse@^1.0.6:
|
||||
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
|
||||
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
|
||||
|
||||
path-scurry@^1.10.1:
|
||||
version "1.10.1"
|
||||
resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698"
|
||||
integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==
|
||||
path-scurry@^1.11.1:
|
||||
version "1.11.1"
|
||||
resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2"
|
||||
integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==
|
||||
dependencies:
|
||||
lru-cache "^9.1.1 || ^10.0.0"
|
||||
lru-cache "^10.2.0"
|
||||
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
|
||||
|
||||
path-type@^2.0.0:
|
||||
@@ -3602,6 +3636,13 @@ run-queue@^1.0.0, run-queue@^1.0.3:
|
||||
dependencies:
|
||||
aproba "^1.1.1"
|
||||
|
||||
russh@0.0.3:
|
||||
version "0.0.3"
|
||||
resolved "https://registry.yarnpkg.com/russh/-/russh-0.0.3.tgz#bcb53d2efbe2b216857171bc5ca2131001ddfa46"
|
||||
integrity sha512-iTW4M5W856zYjbjQYjlDFaSFSQ6pLBy+zsCYFwhivYuj8U5mZ7kF7TeGOUat9t4l25HVxAS36ivCt5l79p9lcQ==
|
||||
dependencies:
|
||||
"@napi-rs/cli" "^2.18.3"
|
||||
|
||||
rxjs@^7.5.2, rxjs@^7.5.7:
|
||||
version "7.5.7"
|
||||
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39"
|
||||
@@ -3909,6 +3950,7 @@ strict-uri-encode@^2.0.0:
|
||||
integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
|
||||
|
||||
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
|
||||
name string-width-cjs
|
||||
version "4.2.3"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||
@@ -3986,6 +4028,7 @@ stringify-package@^1.0.0, stringify-package@^1.0.1:
|
||||
integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==
|
||||
|
||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1:
|
||||
name strip-ansi-cjs
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||
@@ -4432,6 +4475,7 @@ worker-farm@^1.6.0, worker-farm@^1.7.0:
|
||||
errno "~0.1.7"
|
||||
|
||||
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
|
||||
name wrap-ansi-cjs
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
||||
|
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash
|
||||
cat > '/usr/bin/${executable}' << END
|
||||
#!/bin/sh
|
||||
'/opt/${productFilename}/${executable}' --no-sandbox $@
|
||||
'/opt/${productFilename}/${executable}' --no-sandbox \$@
|
||||
END
|
||||
|
||||
chmod +x '/usr/bin/${executable}'
|
||||
|
@@ -2,6 +2,8 @@
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.automation.apple-events</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-jit</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
||||
|
@@ -51,6 +51,7 @@ mac:
|
||||
entitlements: "./build/mac/entitlements.plist"
|
||||
entitlementsInherit: "./build/mac/entitlements.plist"
|
||||
extendInfo:
|
||||
ElectronTeamID: ${teamId}
|
||||
NSRequiresAquaSystemAppearance: false
|
||||
NSCameraUsageDescription: "A subprocess requests access to the device's camera."
|
||||
NSMicrophoneUsageDescription: "A subprocess requests access to the device's microphone."
|
||||
@@ -60,6 +61,7 @@ mac:
|
||||
NSDownloadsFolderUsageDescription: "A subprocess requests access to the user's Downloads folder."
|
||||
NSNetworkVolumesUsageDescription: 'A subprocess requests access to files on a network volume.'
|
||||
NSRemovableVolumesUsageDescription: 'A subprocess requests access to files on a removable volume.'
|
||||
NSAppleEventsUsageDescription: 'A subprocess requests permission to send AppleScript events to another application.'
|
||||
|
||||
linux:
|
||||
category: "Utility;TerminalEmulator;System"
|
||||
@@ -76,8 +78,6 @@ snap:
|
||||
- system-observe
|
||||
deb:
|
||||
depends:
|
||||
- gconf2
|
||||
- gconf-service
|
||||
- gnome-keyring
|
||||
- libnotify4
|
||||
- libsecret-1-0
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Afrikaans\n"
|
||||
"Language: af_ZA\n"
|
||||
"PO-Revision-Date: 2023-10-06 11:30\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -100,12 +100,12 @@ msgstr "Laat toe om 'n terminaal vinnig oop te maak in die geselekteerde vouer"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11
|
||||
msgid "Always dark"
|
||||
msgstr ""
|
||||
msgstr "Altyd Donker"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13
|
||||
msgid "Always light"
|
||||
msgstr ""
|
||||
msgstr "Altyd Lig"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2
|
||||
#: tabby-terminal/src/settings.ts:14
|
||||
@@ -185,7 +185,7 @@ msgstr "Agtergrond tipe"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4
|
||||
msgid "Backspace key mode"
|
||||
msgstr ""
|
||||
msgstr "Terugspasie-sleutelmodus"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14
|
||||
#: tabby-serial/src/components/serialTab.component.ts:93
|
||||
@@ -284,7 +284,7 @@ msgstr "Maak terminaal skoon"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58
|
||||
msgid "Clear terminal after connection"
|
||||
msgstr ""
|
||||
msgstr "Maak terminaal skoon na verbinding"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94
|
||||
msgid "Clipboard"
|
||||
@@ -337,12 +337,12 @@ msgstr "Kleur skema"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2
|
||||
msgid "Color schemes"
|
||||
msgstr ""
|
||||
msgstr "Kleurskemas"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216
|
||||
msgid "Colors"
|
||||
msgstr ""
|
||||
msgstr "Kleure"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:72
|
||||
msgid "Combine all tabs into the current tab"
|
||||
@@ -362,7 +362,7 @@ msgstr "Bevele"
|
||||
|
||||
#: tabby-core/src/theme.ts:16
|
||||
msgid "Compact (legacy)"
|
||||
msgstr ""
|
||||
msgstr "Kompak (erfenis)"
|
||||
|
||||
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:126
|
||||
msgid "Config deleted"
|
||||
@@ -428,7 +428,7 @@ msgstr "Kontekskieslys"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14
|
||||
msgid "Controls the amount of space between elements"
|
||||
msgstr ""
|
||||
msgstr "Beheer die hoeveelheid spasie tussen elemente"
|
||||
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:240
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:248
|
||||
@@ -449,7 +449,7 @@ msgstr "Kopieer huidige pad"
|
||||
|
||||
#: tabby-electron/src/sftpContextMenu.ts:29
|
||||
msgid "Copy full path"
|
||||
msgstr ""
|
||||
msgstr "Kopieer volle pad"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97
|
||||
msgid "Copy on select"
|
||||
@@ -506,7 +506,7 @@ msgstr "Pasgemaakte CSS"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17
|
||||
msgid "Dark mode"
|
||||
msgstr ""
|
||||
msgstr "Donker modus"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26
|
||||
msgid "Data bits"
|
||||
@@ -526,11 +526,11 @@ msgstr "Verminder die vertikale verdelingsgrootte"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92
|
||||
msgid "Default \"Connect to\" type"
|
||||
msgstr ""
|
||||
msgstr "Standaard \"Koppel aan\" tiepe"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93
|
||||
msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)"
|
||||
msgstr ""
|
||||
msgstr "Standaard verbindingssoort gebruik deur die vinnige koppelingsfunksie (bv. SSH, Telnet)"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8
|
||||
msgid "Default profile for new tabs"
|
||||
@@ -538,7 +538,7 @@ msgstr "Verstekprofiel vir nuwe oortjies"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16
|
||||
msgid "Default profile group settings"
|
||||
msgstr ""
|
||||
msgstr "Standaard profielgroepinstellings"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101
|
||||
msgid "Default profile settings"
|
||||
@@ -594,7 +594,7 @@ msgstr "Skrap vorige woord"
|
||||
|
||||
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:114
|
||||
msgid "Delete the config on the remote side?"
|
||||
msgstr ""
|
||||
msgstr "Verwyder die konfigurasie aan die afgeleë kant?"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:226
|
||||
msgid "Delete the group's profiles?"
|
||||
@@ -651,7 +651,7 @@ msgstr "Ontkoppel"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:106
|
||||
msgid "Disconnect current tab (Serial/Telnet/SSH)"
|
||||
msgstr ""
|
||||
msgstr "Ontkoppel huidige oortjie (Serieel/Telnet/SSH)"
|
||||
|
||||
#: tabby-ssh/src/components/sshTab.component.ts:198
|
||||
#: tabby-telnet/src/components/telnetTab.component.ts:81
|
||||
@@ -757,7 +757,7 @@ msgstr "Aktiveer outomatiese installasie van opdaterings wanneer hulle beskikbaa
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211
|
||||
msgid "Enable fluent background option"
|
||||
msgstr ""
|
||||
msgstr "Aktiveer vloeiende agtergrondopsie"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16
|
||||
msgid "Enable font ligatures"
|
||||
@@ -806,7 +806,7 @@ msgstr "Voorbeeld:"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:212
|
||||
msgid "Experimental Windows 10 background style known to cause issues"
|
||||
msgstr ""
|
||||
msgstr "Eksperimentele Windows 10 agtergrondstyl wat bekend is om probleme te veroorsaak"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:28
|
||||
msgid "Export"
|
||||
@@ -894,7 +894,7 @@ msgstr "Fokus die ruit aan die regterkant"
|
||||
|
||||
#: tabby-core/src/theme.ts:34
|
||||
msgid "Follow the color scheme"
|
||||
msgstr ""
|
||||
msgstr "Volg die kleurskema"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5
|
||||
msgid "Font"
|
||||
@@ -939,7 +939,7 @@ msgstr "Van kleurskema"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9
|
||||
msgid "From system"
|
||||
msgstr ""
|
||||
msgstr "Van stelsel"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44
|
||||
msgid "From theme"
|
||||
@@ -1006,7 +1006,7 @@ msgstr "Heksadesimaal"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49
|
||||
msgid "Hide"
|
||||
msgstr ""
|
||||
msgstr "Versteek"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176
|
||||
msgid "Hide tab close button"
|
||||
@@ -1052,7 +1052,7 @@ msgstr "Sneltoetse"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83
|
||||
msgid "How Tabby presents itself through environment vars"
|
||||
msgstr ""
|
||||
msgstr "Hoe Tabby homself deur omgewingsveranderlikes voorstel"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24
|
||||
msgid "HTTP proxy"
|
||||
@@ -1094,7 +1094,7 @@ msgstr "Verhoog die vertikale verdelingsgrootte"
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226
|
||||
#: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21
|
||||
msgid "Input"
|
||||
msgstr ""
|
||||
msgstr "Invoer"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:18
|
||||
msgid "Input is sent as you type"
|
||||
@@ -1215,7 +1215,7 @@ msgstr "Laat die dop Meta-sleutel hanteer in plaas van BS"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22
|
||||
msgid "Light mode"
|
||||
msgstr ""
|
||||
msgstr "Ligte modus"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:27
|
||||
msgid "Line by line"
|
||||
@@ -1321,7 +1321,7 @@ msgstr "Inheems"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21
|
||||
msgid "New"
|
||||
msgstr ""
|
||||
msgstr "Nuwe"
|
||||
|
||||
#: tabby-local/src/tabContextMenu.ts:53
|
||||
msgid "New admin tab"
|
||||
@@ -1333,7 +1333,7 @@ msgstr "Nuwe opstelling op {platform}"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:144
|
||||
msgid "New group name"
|
||||
msgstr ""
|
||||
msgstr "Nuwe groepnaam"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16
|
||||
msgid "New item"
|
||||
@@ -1349,7 +1349,7 @@ msgstr "Nuwe profiel"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24
|
||||
msgid "New profile Group"
|
||||
msgstr ""
|
||||
msgstr "Nuwe profielgroep"
|
||||
|
||||
#: tabby-terminal/src/tabContextMenu.ts:176
|
||||
msgid "New profile name"
|
||||
@@ -1438,7 +1438,7 @@ msgstr "Op GitHub-besprekings"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47
|
||||
msgid "Only close the tab when session is explicitly terminated"
|
||||
msgstr ""
|
||||
msgstr "Sluit net die oortjie wanneer die sessie uitdruklik beëindig is"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46
|
||||
msgid "Opacity"
|
||||
@@ -1527,7 +1527,7 @@ msgstr "Panele"
|
||||
|
||||
#: tabby-core/src/theme.ts:26
|
||||
msgid "Paper (legacy)"
|
||||
msgstr ""
|
||||
msgstr "Papier (erfenis)"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38
|
||||
msgid "Parity"
|
||||
@@ -1539,7 +1539,7 @@ msgstr "Gedeeltelike opstelling-sinkronisering is nie moontlik wanneer die opste
|
||||
|
||||
#: tabby-terminal/src/components/inputProcessingSettings.component.ts:17
|
||||
msgid "Pass-through"
|
||||
msgstr ""
|
||||
msgstr "Deurlaat"
|
||||
|
||||
#: tabby-settings/src/components/vaultSettingsTab.component.ts:92
|
||||
msgid "Passphrase for a private key with hash {hash}..."
|
||||
@@ -1697,7 +1697,7 @@ msgstr "Herkoppel"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:102
|
||||
msgid "Reconnect current tab (Serial/Telnet/SSH)"
|
||||
msgstr ""
|
||||
msgstr "Herkoppel huidige oortjie (Serieel/Telnet/SSH)"
|
||||
|
||||
#: tabby-core/src/utils.ts:64
|
||||
msgid "Red"
|
||||
@@ -1782,11 +1782,11 @@ msgstr "Herbegin die toep om veranderinge toe te pas"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:316
|
||||
msgid "Restore settings to defaults ?"
|
||||
msgstr ""
|
||||
msgstr "Herstel instellings na verstek ?"
|
||||
|
||||
#: tabby-settings/src/components/editProfileGroupModal.component.ts:36
|
||||
msgid "Restore settings to inherited defaults ?"
|
||||
msgstr ""
|
||||
msgstr "Herstel instellings na oorgeërfde verstekwaardes ?"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159
|
||||
msgid "Restore terminal tabs on app start"
|
||||
@@ -1982,7 +1982,7 @@ msgstr "Dop Integrasies"
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25
|
||||
msgid "Show"
|
||||
msgstr ""
|
||||
msgstr "Wys"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:275
|
||||
msgid "Show {type} profile selector"
|
||||
@@ -2038,7 +2038,7 @@ msgstr "Show Serie verbindings"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152
|
||||
msgid "Show tabs in fullscreen mode"
|
||||
msgstr ""
|
||||
msgstr "Wys oortjies in volskermmodus"
|
||||
|
||||
#: tabby-terminal/src/tabContextMenu.ts:62
|
||||
msgid "Show toolbar"
|
||||
@@ -2089,7 +2089,7 @@ msgstr "Bronkode"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13
|
||||
msgid "Spaciness"
|
||||
msgstr ""
|
||||
msgstr "Ruimtelikheid"
|
||||
|
||||
#: tabby-core/src/tabContextMenu.ts:75
|
||||
msgid "Split"
|
||||
@@ -2135,7 +2135,7 @@ msgstr "SSH-wagwoord vir {user}@{host}:{port}"
|
||||
|
||||
#: tabby-core/src/theme.ts:8
|
||||
msgid "Standard (legacy)"
|
||||
msgstr ""
|
||||
msgstr "Standaard (erfenis)"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150
|
||||
msgid "Startup"
|
||||
@@ -2160,7 +2160,7 @@ msgstr "Plaasvervangers toegelaat."
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5
|
||||
msgid "Switch color scheme"
|
||||
msgstr ""
|
||||
msgstr "Skakel kleurskema"
|
||||
|
||||
#: tabby-core/src/tabContextMenu.ts:290
|
||||
msgid "Switch profile"
|
||||
@@ -2264,7 +2264,7 @@ msgstr "Terminaal klok"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82
|
||||
msgid "Terminal identification"
|
||||
msgstr ""
|
||||
msgstr "Terminale identifikasie"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7
|
||||
msgid "Thank you for downloading Tabby!"
|
||||
@@ -2288,7 +2288,7 @@ msgstr "Dit is van toepassing op alle profiele van 'n gegewe tipe"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17
|
||||
msgid "These apply to all profiles of a given type in this group"
|
||||
msgstr ""
|
||||
msgstr "Dit is van toepassing op alle profiele van 'n gegewe tipe in hierdie groep"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59
|
||||
msgid "Thin"
|
||||
@@ -2474,7 +2474,7 @@ msgstr "Wat's nuut"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46
|
||||
msgid "When a session ends"
|
||||
msgstr ""
|
||||
msgstr "Wanneer 'n sessie eindig"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82
|
||||
msgid "When enabled, links are only clickable while holding this key"
|
||||
@@ -2490,7 +2490,7 @@ msgstr "Of 'n pasgemaakte venster of 'n OS-inheemse venster gebruik moet word"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141
|
||||
msgid "Will prevent the SSH greeting from showing up"
|
||||
msgstr ""
|
||||
msgstr "Sal voorkom dat die SSH-groet verskyn"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2
|
||||
#: tabby-settings/src/settings.ts:30
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Bulgarian\n"
|
||||
"Language: bg_BG\n"
|
||||
"PO-Revision-Date: 2023-10-06 11:30\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -100,12 +100,12 @@ msgstr "Разрешава бързо отваряне на терминал в
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11
|
||||
msgid "Always dark"
|
||||
msgstr ""
|
||||
msgstr "Винаги тъмно"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13
|
||||
msgid "Always light"
|
||||
msgstr ""
|
||||
msgstr "Винаги светло"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2
|
||||
#: tabby-terminal/src/settings.ts:14
|
||||
@@ -185,7 +185,7 @@ msgstr "Тип на фона"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4
|
||||
msgid "Backspace key mode"
|
||||
msgstr ""
|
||||
msgstr "Режим на клавиша Backspace"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14
|
||||
#: tabby-serial/src/components/serialTab.component.ts:93
|
||||
@@ -337,12 +337,12 @@ msgstr "Цветови схеми"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2
|
||||
msgid "Color schemes"
|
||||
msgstr ""
|
||||
msgstr "Цветова схема"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216
|
||||
msgid "Colors"
|
||||
msgstr ""
|
||||
msgstr "Цветове"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:72
|
||||
msgid "Combine all tabs into the current tab"
|
||||
@@ -362,7 +362,7 @@ msgstr "Команди"
|
||||
|
||||
#: tabby-core/src/theme.ts:16
|
||||
msgid "Compact (legacy)"
|
||||
msgstr ""
|
||||
msgstr "Компактен (наследен)"
|
||||
|
||||
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:126
|
||||
msgid "Config deleted"
|
||||
@@ -428,7 +428,7 @@ msgstr "Контекстно меню"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14
|
||||
msgid "Controls the amount of space between elements"
|
||||
msgstr ""
|
||||
msgstr "Контролира разстоянието между елементите"
|
||||
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:240
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:248
|
||||
@@ -506,7 +506,7 @@ msgstr "Персонализиран CSS"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17
|
||||
msgid "Dark mode"
|
||||
msgstr ""
|
||||
msgstr "Тъмен режим"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26
|
||||
msgid "Data bits"
|
||||
@@ -526,11 +526,11 @@ msgstr "Намали размера на вертикалното разделя
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92
|
||||
msgid "Default \"Connect to\" type"
|
||||
msgstr ""
|
||||
msgstr "Тип по подразбиране \"Свързване към\""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93
|
||||
msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)"
|
||||
msgstr ""
|
||||
msgstr "Тип връзка по подразбиране, използване на функцията за бързо свързване (например SSH, Telnet)"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8
|
||||
msgid "Default profile for new tabs"
|
||||
@@ -538,7 +538,7 @@ msgstr "Профил по подразбиране за нов таб"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16
|
||||
msgid "Default profile group settings"
|
||||
msgstr ""
|
||||
msgstr "Настройки по подразбиране на групата профили"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101
|
||||
msgid "Default profile settings"
|
||||
@@ -651,7 +651,7 @@ msgstr "Прекъсни"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:106
|
||||
msgid "Disconnect current tab (Serial/Telnet/SSH)"
|
||||
msgstr ""
|
||||
msgstr "Прекъсване на връзката с текущия tab (Serial/Telnet/SSH)"
|
||||
|
||||
#: tabby-ssh/src/components/sshTab.component.ts:198
|
||||
#: tabby-telnet/src/components/telnetTab.component.ts:81
|
||||
@@ -894,7 +894,7 @@ msgstr "Фокусирай десния панел"
|
||||
|
||||
#: tabby-core/src/theme.ts:34
|
||||
msgid "Follow the color scheme"
|
||||
msgstr ""
|
||||
msgstr "Следване на цветовата схема"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5
|
||||
msgid "Font"
|
||||
@@ -939,7 +939,7 @@ msgstr "От цветова схема"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9
|
||||
msgid "From system"
|
||||
msgstr ""
|
||||
msgstr "От система"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44
|
||||
msgid "From theme"
|
||||
@@ -1006,7 +1006,7 @@ msgstr "Шестнайсетичен"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49
|
||||
msgid "Hide"
|
||||
msgstr ""
|
||||
msgstr "Скрий"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176
|
||||
msgid "Hide tab close button"
|
||||
@@ -1094,7 +1094,7 @@ msgstr "Увеличи размера на вертикалното раздел
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226
|
||||
#: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21
|
||||
msgid "Input"
|
||||
msgstr ""
|
||||
msgstr "Вход"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:18
|
||||
msgid "Input is sent as you type"
|
||||
@@ -1215,7 +1215,7 @@ msgstr "Позволява на shell да обработва мета клав
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22
|
||||
msgid "Light mode"
|
||||
msgstr ""
|
||||
msgstr "Светъл режим"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:27
|
||||
msgid "Line by line"
|
||||
@@ -1321,7 +1321,7 @@ msgstr "Системна"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21
|
||||
msgid "New"
|
||||
msgstr ""
|
||||
msgstr "Нов"
|
||||
|
||||
#: tabby-local/src/tabContextMenu.ts:53
|
||||
msgid "New admin tab"
|
||||
@@ -1333,7 +1333,7 @@ msgstr "Нова конфигурация на {platform}"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:144
|
||||
msgid "New group name"
|
||||
msgstr ""
|
||||
msgstr "Име на нова група"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16
|
||||
msgid "New item"
|
||||
@@ -1349,7 +1349,7 @@ msgstr "Нов профил"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24
|
||||
msgid "New profile Group"
|
||||
msgstr ""
|
||||
msgstr "Нов профил на групата"
|
||||
|
||||
#: tabby-terminal/src/tabContextMenu.ts:176
|
||||
msgid "New profile name"
|
||||
@@ -1438,7 +1438,7 @@ msgstr "В GitHub Discussions"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47
|
||||
msgid "Only close the tab when session is explicitly terminated"
|
||||
msgstr ""
|
||||
msgstr "Затваряне на tab само при изрично прекратяване на сесията"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46
|
||||
msgid "Opacity"
|
||||
@@ -1527,7 +1527,7 @@ msgstr "Панели"
|
||||
|
||||
#: tabby-core/src/theme.ts:26
|
||||
msgid "Paper (legacy)"
|
||||
msgstr ""
|
||||
msgstr "Хартия (наследена)"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38
|
||||
msgid "Parity"
|
||||
@@ -1539,7 +1539,7 @@ msgstr "Частична синхронизация на конфигураци
|
||||
|
||||
#: tabby-terminal/src/components/inputProcessingSettings.component.ts:17
|
||||
msgid "Pass-through"
|
||||
msgstr ""
|
||||
msgstr "Пропускане"
|
||||
|
||||
#: tabby-settings/src/components/vaultSettingsTab.component.ts:92
|
||||
msgid "Passphrase for a private key with hash {hash}..."
|
||||
@@ -1697,7 +1697,7 @@ msgstr "Повторно свързване"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:102
|
||||
msgid "Reconnect current tab (Serial/Telnet/SSH)"
|
||||
msgstr ""
|
||||
msgstr "Повторно свързване на текущия раздел (Serial/Telnet/SSH)"
|
||||
|
||||
#: tabby-core/src/utils.ts:64
|
||||
msgid "Red"
|
||||
@@ -1782,11 +1782,11 @@ msgstr "Рестартирайте приложението, за да прил
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:316
|
||||
msgid "Restore settings to defaults ?"
|
||||
msgstr ""
|
||||
msgstr "Възстановяване на настройките по подразбиране ?"
|
||||
|
||||
#: tabby-settings/src/components/editProfileGroupModal.component.ts:36
|
||||
msgid "Restore settings to inherited defaults ?"
|
||||
msgstr ""
|
||||
msgstr "Възстановяване на унаследените настройки по подразбиране ?"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159
|
||||
msgid "Restore terminal tabs on app start"
|
||||
@@ -1982,7 +1982,7 @@ msgstr "Shell интеграция"
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25
|
||||
msgid "Show"
|
||||
msgstr ""
|
||||
msgstr "Покажи"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:275
|
||||
msgid "Show {type} profile selector"
|
||||
@@ -2089,7 +2089,7 @@ msgstr "Програмен код"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:13
|
||||
msgid "Spaciness"
|
||||
msgstr ""
|
||||
msgstr "Пространство"
|
||||
|
||||
#: tabby-core/src/tabContextMenu.ts:75
|
||||
msgid "Split"
|
||||
@@ -2135,7 +2135,7 @@ msgstr "SSH парола за {user}@{host}:{port}"
|
||||
|
||||
#: tabby-core/src/theme.ts:8
|
||||
msgid "Standard (legacy)"
|
||||
msgstr ""
|
||||
msgstr "Стандартен (наследен)"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150
|
||||
msgid "Startup"
|
||||
@@ -2160,7 +2160,7 @@ msgstr "Заместванията са разрешени."
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5
|
||||
msgid "Switch color scheme"
|
||||
msgstr ""
|
||||
msgstr "Промяна на цветовата схема"
|
||||
|
||||
#: tabby-core/src/tabContextMenu.ts:290
|
||||
msgid "Switch profile"
|
||||
@@ -2288,7 +2288,7 @@ msgstr "Прилага се за всички профили от дадения
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17
|
||||
msgid "These apply to all profiles of a given type in this group"
|
||||
msgstr ""
|
||||
msgstr "Те се прилагат за всички профили от даден тип в тази група"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59
|
||||
msgid "Thin"
|
||||
@@ -2474,7 +2474,7 @@ msgstr "Какво ново"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46
|
||||
msgid "When a session ends"
|
||||
msgstr ""
|
||||
msgstr "Когато дадена сесия приключи"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82
|
||||
msgid "When enabled, links are only clickable while holding this key"
|
||||
@@ -2490,7 +2490,7 @@ msgstr "Дали да се използва потребителски проз
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:141
|
||||
msgid "Will prevent the SSH greeting from showing up"
|
||||
msgstr ""
|
||||
msgstr "Ще предотврати появата на SSH поздрава"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:2
|
||||
#: tabby-settings/src/settings.ts:30
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Czech\n"
|
||||
"Language: cs_CZ\n"
|
||||
"PO-Revision-Date: 2023-11-04 21:09\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -1935,7 +1935,7 @@ msgstr "Sériové připojení"
|
||||
|
||||
#: tabby-serial/src/profiles.ts:73
|
||||
msgid "Serial: {description}"
|
||||
msgstr "Seriální: {description}"
|
||||
msgstr "Sériový: {description}"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:2
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:5
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Danish\n"
|
||||
"Language: da_DK\n"
|
||||
"PO-Revision-Date: 2023-10-06 11:30\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -100,12 +100,12 @@ msgstr "Tillader hurtigt at åbne en terminal i den valgte mappe"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11
|
||||
msgid "Always dark"
|
||||
msgstr ""
|
||||
msgstr "Altid mørk"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13
|
||||
msgid "Always light"
|
||||
msgstr ""
|
||||
msgstr "Altid lys"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2
|
||||
#: tabby-terminal/src/settings.ts:14
|
||||
@@ -272,7 +272,7 @@ msgstr "Ciphers"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5
|
||||
msgid "Clear"
|
||||
msgstr ""
|
||||
msgstr "Ryd"
|
||||
|
||||
#: tabby-core/src/services/profiles.service.ts:248
|
||||
msgid "Clear recent profiles"
|
||||
@@ -324,7 +324,7 @@ msgstr "Luk faner til højre"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:182
|
||||
msgid "Close the window after closing the last tab"
|
||||
msgstr ""
|
||||
msgstr "Luk vinduet efter lukningen af den sidste fane"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:33
|
||||
#: tabby-core/src/tabContextMenu.ts:132
|
||||
@@ -337,16 +337,16 @@ msgstr "Farvetema"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2
|
||||
msgid "Color schemes"
|
||||
msgstr ""
|
||||
msgstr "Farveskemaer"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216
|
||||
msgid "Colors"
|
||||
msgstr ""
|
||||
msgstr "Farver"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:72
|
||||
msgid "Combine all tabs into the current tab"
|
||||
msgstr ""
|
||||
msgstr "Kombinér alle faner til den aktuelle fane"
|
||||
|
||||
#: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4
|
||||
msgid "Command line"
|
||||
@@ -358,15 +358,15 @@ msgstr "Kommandoens stdin/stdout bruges i stedet for en netværksforbindelse"
|
||||
|
||||
#: tabby-core/src/services/commands.service.ts:105
|
||||
msgid "Commands"
|
||||
msgstr ""
|
||||
msgstr "Kommandoer"
|
||||
|
||||
#: tabby-core/src/theme.ts:16
|
||||
msgid "Compact (legacy)"
|
||||
msgstr ""
|
||||
msgstr "Kompakt (ældre)"
|
||||
|
||||
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:126
|
||||
msgid "Config deleted"
|
||||
msgstr ""
|
||||
msgstr "Konfig slettet"
|
||||
|
||||
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:108
|
||||
msgid "Config downloaded"
|
||||
@@ -428,7 +428,7 @@ msgstr "Kontekstmenu"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:14
|
||||
msgid "Controls the amount of space between elements"
|
||||
msgstr ""
|
||||
msgstr "Styrer mængden af mellemrum mellem elementer"
|
||||
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:240
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:248
|
||||
@@ -449,7 +449,7 @@ msgstr "Kopiér nuværende sti"
|
||||
|
||||
#: tabby-electron/src/sftpContextMenu.ts:29
|
||||
msgid "Copy full path"
|
||||
msgstr ""
|
||||
msgstr "Kopiér hele stien"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:97
|
||||
msgid "Copy on select"
|
||||
@@ -461,7 +461,7 @@ msgstr "Kopiér til udklipsholder"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:103
|
||||
msgid "Copy with formatting"
|
||||
msgstr ""
|
||||
msgstr "Kopiér med formatering"
|
||||
|
||||
#: tabby-core/src/services/config.service.ts:425
|
||||
msgid "Could not decrypt config"
|
||||
@@ -469,12 +469,12 @@ msgstr "Kunne ikke dekryptere konfiguration"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpCreateDirectoryModal.component.html:9
|
||||
msgid "Create"
|
||||
msgstr ""
|
||||
msgstr "Opret"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:7
|
||||
#: tabby-ssh/src/sftpContextMenu.ts:29
|
||||
msgid "Create directory"
|
||||
msgstr ""
|
||||
msgstr "Opret mappe"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:90
|
||||
msgid "Current"
|
||||
@@ -498,7 +498,7 @@ msgstr "Markørens form"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46
|
||||
msgid "Custom"
|
||||
msgstr ""
|
||||
msgstr "Tilpasset"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90
|
||||
msgid "Custom CSS"
|
||||
@@ -506,7 +506,7 @@ msgstr "Brugerdefineret CSS"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17
|
||||
msgid "Dark mode"
|
||||
msgstr ""
|
||||
msgstr "Mørk tilstand"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26
|
||||
msgid "Data bits"
|
||||
@@ -518,15 +518,15 @@ msgstr "Fejlfinding"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:256
|
||||
msgid "Decrease horizontal split size"
|
||||
msgstr ""
|
||||
msgstr "Reducér den vandrette splitstørrelse"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:248
|
||||
msgid "Decrease vertical split size"
|
||||
msgstr ""
|
||||
msgstr "Reducér den lodrette splitstørrelse"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92
|
||||
msgid "Default \"Connect to\" type"
|
||||
msgstr ""
|
||||
msgstr "Standard \"Forbind til\"-type"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93
|
||||
msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)"
|
||||
@@ -582,7 +582,7 @@ msgstr "Slet {fullPath}?"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:42
|
||||
msgid "Delete entire line"
|
||||
msgstr ""
|
||||
msgstr "Slet hele linjen"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:46
|
||||
msgid "Delete next word"
|
||||
@@ -594,7 +594,7 @@ msgstr "Slet forrige ord"
|
||||
|
||||
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:114
|
||||
msgid "Delete the config on the remote side?"
|
||||
msgstr ""
|
||||
msgstr "Slet konfigurationen på fjernsiden?"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:226
|
||||
msgid "Delete the group's profiles?"
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: German\n"
|
||||
"Language: de_DE\n"
|
||||
"PO-Revision-Date: 2023-11-04 21:09\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -35,7 +35,7 @@ msgstr "Schlüssel akzeptieren und merken"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25
|
||||
msgid "Accept just this once"
|
||||
msgstr "Nur einmal akzeptieren"
|
||||
msgstr "Nur diesmal akzeptieren"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84
|
||||
msgid "Accessibility"
|
||||
@@ -100,12 +100,12 @@ msgstr "Ermöglicht das schnelle Öffnen eines Terminals im ausgewählten Ordner
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11
|
||||
msgid "Always dark"
|
||||
msgstr ""
|
||||
msgstr "Immer dunkel"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13
|
||||
msgid "Always light"
|
||||
msgstr ""
|
||||
msgstr "Immer hell"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2
|
||||
#: tabby-terminal/src/settings.ts:14
|
||||
@@ -185,7 +185,7 @@ msgstr "Hintergrundtyp"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4
|
||||
msgid "Backspace key mode"
|
||||
msgstr ""
|
||||
msgstr "Backspace-Tastenmodus"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14
|
||||
#: tabby-serial/src/components/serialTab.component.ts:93
|
||||
@@ -1539,7 +1539,7 @@ msgstr "Teilweise Konfigurations-Synchronisation ist nicht möglich, wenn die Ko
|
||||
|
||||
#: tabby-terminal/src/components/inputProcessingSettings.component.ts:17
|
||||
msgid "Pass-through"
|
||||
msgstr ""
|
||||
msgstr "Pass-through"
|
||||
|
||||
#: tabby-settings/src/components/vaultSettingsTab.component.ts:92
|
||||
msgid "Passphrase for a private key with hash {hash}..."
|
||||
@@ -1786,7 +1786,7 @@ msgstr "Standard Einstellungen wiederherstellen?"
|
||||
|
||||
#: tabby-settings/src/components/editProfileGroupModal.component.ts:36
|
||||
msgid "Restore settings to inherited defaults ?"
|
||||
msgstr ""
|
||||
msgstr "Standard Einstellungen wiederherstellen?"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159
|
||||
msgid "Restore terminal tabs on app start"
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: English, United Kingdom\n"
|
||||
"Language: en_GB\n"
|
||||
"PO-Revision-Date: 2023-10-06 11:30\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -337,7 +337,7 @@ msgstr "Colour scheme"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2
|
||||
msgid "Color schemes"
|
||||
msgstr ""
|
||||
msgstr "Colour schemes"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216
|
||||
@@ -2160,7 +2160,7 @@ msgstr ""
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5
|
||||
msgid "Switch color scheme"
|
||||
msgstr ""
|
||||
msgstr "Switch colour scheme"
|
||||
|
||||
#: tabby-core/src/tabContextMenu.ts:290
|
||||
msgid "Switch profile"
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Spanish\n"
|
||||
"Language: es_ES\n"
|
||||
"PO-Revision-Date: 2023-10-06 11:30\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -100,12 +100,12 @@ msgstr "Permite abrir rápidamente un terminal en la carpeta seleccionada"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11
|
||||
msgid "Always dark"
|
||||
msgstr ""
|
||||
msgstr "Siempre a oscuras"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13
|
||||
msgid "Always light"
|
||||
msgstr ""
|
||||
msgstr "Siempre ligero"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2
|
||||
#: tabby-terminal/src/settings.ts:14
|
||||
@@ -185,7 +185,7 @@ msgstr "Tipo de fondo"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4
|
||||
msgid "Backspace key mode"
|
||||
msgstr ""
|
||||
msgstr "Modo de tecla de retroceso"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14
|
||||
#: tabby-serial/src/components/serialTab.component.ts:93
|
||||
@@ -337,7 +337,7 @@ msgstr "Esquema de color"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2
|
||||
msgid "Color schemes"
|
||||
msgstr ""
|
||||
msgstr "Esquemas de color"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216
|
||||
@@ -506,7 +506,7 @@ msgstr "CSS personalizado"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17
|
||||
msgid "Dark mode"
|
||||
msgstr ""
|
||||
msgstr "Modo oscuro"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26
|
||||
msgid "Data bits"
|
||||
@@ -526,11 +526,11 @@ msgstr "Reducir tamaño de división vertical"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92
|
||||
msgid "Default \"Connect to\" type"
|
||||
msgstr ""
|
||||
msgstr "Tipo predeterminado \"Conectar a\""
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93
|
||||
msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)"
|
||||
msgstr ""
|
||||
msgstr "Tipo de conexión predeterminado utilizado por la función de conexión rápida (por ejemplo, SSH, Telnet)"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8
|
||||
msgid "Default profile for new tabs"
|
||||
@@ -538,7 +538,7 @@ msgstr "Perfil predeterminado para nuevas pestañas"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16
|
||||
msgid "Default profile group settings"
|
||||
msgstr ""
|
||||
msgstr "Configuración predeterminada del grupo de perfiles"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101
|
||||
msgid "Default profile settings"
|
||||
@@ -651,7 +651,7 @@ msgstr "Desconectar"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:106
|
||||
msgid "Disconnect current tab (Serial/Telnet/SSH)"
|
||||
msgstr ""
|
||||
msgstr "Desconectar pestaña actual (Serial/Telnet/SSH)"
|
||||
|
||||
#: tabby-ssh/src/components/sshTab.component.ts:198
|
||||
#: tabby-telnet/src/components/telnetTab.component.ts:81
|
||||
@@ -939,7 +939,7 @@ msgstr "Desde un color de esquema"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9
|
||||
msgid "From system"
|
||||
msgstr ""
|
||||
msgstr "Del sistema"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44
|
||||
msgid "From theme"
|
||||
@@ -1006,7 +1006,7 @@ msgstr "Hexadecimal"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49
|
||||
msgid "Hide"
|
||||
msgstr ""
|
||||
msgstr "Ocultar"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176
|
||||
msgid "Hide tab close button"
|
||||
@@ -1094,7 +1094,7 @@ msgstr "Aumentar tamaño de división vertical"
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226
|
||||
#: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21
|
||||
msgid "Input"
|
||||
msgstr ""
|
||||
msgstr "Entrada"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:18
|
||||
msgid "Input is sent as you type"
|
||||
@@ -1215,7 +1215,7 @@ msgstr "Permita que la shell maneje la tecla Meta en lugar del sistema operativo
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22
|
||||
msgid "Light mode"
|
||||
msgstr ""
|
||||
msgstr "Modo claro"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:27
|
||||
msgid "Line by line"
|
||||
@@ -1321,7 +1321,7 @@ msgstr "Nativo"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21
|
||||
msgid "New"
|
||||
msgstr ""
|
||||
msgstr "Nuevo"
|
||||
|
||||
#: tabby-local/src/tabContextMenu.ts:53
|
||||
msgid "New admin tab"
|
||||
@@ -1333,7 +1333,7 @@ msgstr "Nueva configuración en {platform}"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:144
|
||||
msgid "New group name"
|
||||
msgstr ""
|
||||
msgstr "Nuevo nombre del grupo"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16
|
||||
msgid "New item"
|
||||
@@ -1349,7 +1349,7 @@ msgstr "Nuevo perfil"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24
|
||||
msgid "New profile Group"
|
||||
msgstr ""
|
||||
msgstr "Nuevo grupo de perfiles"
|
||||
|
||||
#: tabby-terminal/src/tabContextMenu.ts:176
|
||||
msgid "New profile name"
|
||||
@@ -1438,7 +1438,7 @@ msgstr "En discusiones de GitHub"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47
|
||||
msgid "Only close the tab when session is explicitly terminated"
|
||||
msgstr ""
|
||||
msgstr "Cierre la pestaña solo cuando la sesión finalice explícitamente"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46
|
||||
msgid "Opacity"
|
||||
@@ -1539,7 +1539,7 @@ msgstr "La sincronización parcial de configuración no es posible cuando la con
|
||||
|
||||
#: tabby-terminal/src/components/inputProcessingSettings.component.ts:17
|
||||
msgid "Pass-through"
|
||||
msgstr ""
|
||||
msgstr "Pasado-por-clave"
|
||||
|
||||
#: tabby-settings/src/components/vaultSettingsTab.component.ts:92
|
||||
msgid "Passphrase for a private key with hash {hash}..."
|
||||
@@ -1697,7 +1697,7 @@ msgstr "Reconectar"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:102
|
||||
msgid "Reconnect current tab (Serial/Telnet/SSH)"
|
||||
msgstr ""
|
||||
msgstr "Reconecta la pestaña actual (Serial/Telnet/SSH)"
|
||||
|
||||
#: tabby-core/src/utils.ts:64
|
||||
msgid "Red"
|
||||
@@ -1782,11 +1782,11 @@ msgstr "Reiniciar la aplicación para aplicar cambios"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:316
|
||||
msgid "Restore settings to defaults ?"
|
||||
msgstr ""
|
||||
msgstr "¿Restaurar los ajustes de fábrica?"
|
||||
|
||||
#: tabby-settings/src/components/editProfileGroupModal.component.ts:36
|
||||
msgid "Restore settings to inherited defaults ?"
|
||||
msgstr ""
|
||||
msgstr "¿Restaurar los ajustes a los heredados por defecto?"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159
|
||||
msgid "Restore terminal tabs on app start"
|
||||
@@ -1982,7 +1982,7 @@ msgstr "Integración con la Shell"
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25
|
||||
msgid "Show"
|
||||
msgstr ""
|
||||
msgstr "Mostrar"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:275
|
||||
msgid "Show {type} profile selector"
|
||||
@@ -2160,7 +2160,7 @@ msgstr "Sustituciones permitidas."
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5
|
||||
msgid "Switch color scheme"
|
||||
msgstr ""
|
||||
msgstr "Cambiar esquema de colores"
|
||||
|
||||
#: tabby-core/src/tabContextMenu.ts:290
|
||||
msgid "Switch profile"
|
||||
@@ -2288,7 +2288,7 @@ msgstr "Estos se aplican a todos los perfiles de un tipo determinado"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17
|
||||
msgid "These apply to all profiles of a given type in this group"
|
||||
msgstr ""
|
||||
msgstr "Estos aplican a todos los perfiles de un tipo en este grupo"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59
|
||||
msgid "Thin"
|
||||
@@ -2474,7 +2474,7 @@ msgstr "Qué hay de nuevo"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46
|
||||
msgid "When a session ends"
|
||||
msgstr ""
|
||||
msgstr "Cuando una sesión finalice"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82
|
||||
msgid "When enabled, links are only clickable while holding this key"
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: French\n"
|
||||
"Language: fr_FR\n"
|
||||
"PO-Revision-Date: 2023-11-04 21:09\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -526,7 +526,7 @@ msgstr "Diminuer la taille de la séparation verticale"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92
|
||||
msgid "Default \"Connect to\" type"
|
||||
msgstr ""
|
||||
msgstr "Type de connexion par défaut"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93
|
||||
msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)"
|
||||
@@ -1539,7 +1539,7 @@ msgstr "La synchronisation partielle de la configuration n'est pas possible lors
|
||||
|
||||
#: tabby-terminal/src/components/inputProcessingSettings.component.ts:17
|
||||
msgid "Pass-through"
|
||||
msgstr ""
|
||||
msgstr "Passage à travers"
|
||||
|
||||
#: tabby-settings/src/components/vaultSettingsTab.component.ts:92
|
||||
msgid "Passphrase for a private key with hash {hash}..."
|
||||
@@ -1786,7 +1786,7 @@ msgstr "Restaurer les paramètres par défaut ?"
|
||||
|
||||
#: tabby-settings/src/components/editProfileGroupModal.component.ts:36
|
||||
msgid "Restore settings to inherited defaults ?"
|
||||
msgstr ""
|
||||
msgstr "Restaurer les paramètres par défaut hérités ?"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159
|
||||
msgid "Restore terminal tabs on app start"
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Croatian\n"
|
||||
"Language: hr_HR\n"
|
||||
"PO-Revision-Date: 2023-10-06 11:30\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -100,12 +100,12 @@ msgstr "Omogućuje brzo otvaranje terminala u odabranoj mapi"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11
|
||||
msgid "Always dark"
|
||||
msgstr ""
|
||||
msgstr "Uvijek tamno"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13
|
||||
msgid "Always light"
|
||||
msgstr ""
|
||||
msgstr "Uvijek svijetlo"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2
|
||||
#: tabby-terminal/src/settings.ts:14
|
||||
@@ -337,7 +337,7 @@ msgstr "Shema boja"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2
|
||||
msgid "Color schemes"
|
||||
msgstr ""
|
||||
msgstr "Sheme boja"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216
|
||||
@@ -506,7 +506,7 @@ msgstr "Prilagođeni CSS"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17
|
||||
msgid "Dark mode"
|
||||
msgstr ""
|
||||
msgstr "Tamni modus"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26
|
||||
msgid "Data bits"
|
||||
@@ -538,7 +538,7 @@ msgstr "Standardni profil za nove kartice"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16
|
||||
msgid "Default profile group settings"
|
||||
msgstr ""
|
||||
msgstr "Postavke standardnog profila grupe"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101
|
||||
msgid "Default profile settings"
|
||||
@@ -651,7 +651,7 @@ msgstr "Odspoji"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:106
|
||||
msgid "Disconnect current tab (Serial/Telnet/SSH)"
|
||||
msgstr ""
|
||||
msgstr "Odspoji trenutačnu karticu (Serial/Telnet/SSH)"
|
||||
|
||||
#: tabby-ssh/src/components/sshTab.component.ts:198
|
||||
#: tabby-telnet/src/components/telnetTab.component.ts:81
|
||||
@@ -939,7 +939,7 @@ msgstr "Iz sheme boja"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9
|
||||
msgid "From system"
|
||||
msgstr ""
|
||||
msgstr "Od sustava"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44
|
||||
msgid "From theme"
|
||||
@@ -1006,7 +1006,7 @@ msgstr "Heksadecimalni"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49
|
||||
msgid "Hide"
|
||||
msgstr ""
|
||||
msgstr "Sakrij"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176
|
||||
msgid "Hide tab close button"
|
||||
@@ -1094,7 +1094,7 @@ msgstr "Povećaj veličinu okomite podjele"
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226
|
||||
#: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21
|
||||
msgid "Input"
|
||||
msgstr ""
|
||||
msgstr "Unos"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:18
|
||||
msgid "Input is sent as you type"
|
||||
@@ -1215,7 +1215,7 @@ msgstr "Omogućuje ljusci baratanje meta-tipkom umjesto OS-a"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22
|
||||
msgid "Light mode"
|
||||
msgstr ""
|
||||
msgstr "Svijetli modus"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:27
|
||||
msgid "Line by line"
|
||||
@@ -1321,7 +1321,7 @@ msgstr "Izvorni"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21
|
||||
msgid "New"
|
||||
msgstr ""
|
||||
msgstr "Nova"
|
||||
|
||||
#: tabby-local/src/tabContextMenu.ts:53
|
||||
msgid "New admin tab"
|
||||
@@ -1333,7 +1333,7 @@ msgstr "Nova konfiguracija na {platform}"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:144
|
||||
msgid "New group name"
|
||||
msgstr ""
|
||||
msgstr "Novo ime grupe"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16
|
||||
msgid "New item"
|
||||
@@ -1697,7 +1697,7 @@ msgstr "Ponovo spoji"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:102
|
||||
msgid "Reconnect current tab (Serial/Telnet/SSH)"
|
||||
msgstr ""
|
||||
msgstr "Ponovo poveži trenutačnu karticu (Serial/Telnet/SSH)"
|
||||
|
||||
#: tabby-core/src/utils.ts:64
|
||||
msgid "Red"
|
||||
@@ -1782,11 +1782,11 @@ msgstr "Za primjenu promjena ponovo pokreni program"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:316
|
||||
msgid "Restore settings to defaults ?"
|
||||
msgstr ""
|
||||
msgstr "Obnoviti na standardne postavke?"
|
||||
|
||||
#: tabby-settings/src/components/editProfileGroupModal.component.ts:36
|
||||
msgid "Restore settings to inherited defaults ?"
|
||||
msgstr ""
|
||||
msgstr "Obnoviti postavke na naslijeđene standardne vrijednosti?"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159
|
||||
msgid "Restore terminal tabs on app start"
|
||||
@@ -1982,7 +1982,7 @@ msgstr "Integracija ljuske"
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25
|
||||
msgid "Show"
|
||||
msgstr ""
|
||||
msgstr "Prikaži"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:275
|
||||
msgid "Show {type} profile selector"
|
||||
@@ -2160,7 +2160,7 @@ msgstr "Zamjene su dozvoljene."
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5
|
||||
msgid "Switch color scheme"
|
||||
msgstr ""
|
||||
msgstr "Promijeni shemu boja"
|
||||
|
||||
#: tabby-core/src/tabContextMenu.ts:290
|
||||
msgid "Switch profile"
|
||||
@@ -2288,7 +2288,7 @@ msgstr "Primjenjuju se na sve profile zadane vrste"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17
|
||||
msgid "These apply to all profiles of a given type in this group"
|
||||
msgstr ""
|
||||
msgstr "Primjenjuju se na sve profile zadane vrste u ovoj grupi"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59
|
||||
msgid "Thin"
|
||||
@@ -2474,7 +2474,7 @@ msgstr "Novosti"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46
|
||||
msgid "When a session ends"
|
||||
msgstr ""
|
||||
msgstr "Kada sesija završi"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82
|
||||
msgid "When enabled, links are only clickable while holding this key"
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Indonesian\n"
|
||||
"Language: id_ID\n"
|
||||
"PO-Revision-Date: 2023-10-06 11:30\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -1762,11 +1762,11 @@ msgstr "Ukuran Semula"
|
||||
|
||||
#: tabby-serial/src/hotkeys.ts:14
|
||||
msgid "Restart current serial session"
|
||||
msgstr ""
|
||||
msgstr "Mulai ulang sesi serial saat ini"
|
||||
|
||||
#: tabby-ssh/src/hotkeys.ts:10
|
||||
msgid "Restart current SSH session"
|
||||
msgstr ""
|
||||
msgstr "Mulai ulang sesi SSH saat ini"
|
||||
|
||||
#: tabby-telnet/src/hotkeys.ts:10
|
||||
msgid "Restart current Telnet session"
|
||||
@@ -2401,7 +2401,7 @@ msgstr ""
|
||||
|
||||
#: tabby-ssh/src/session/ssh.ts:465
|
||||
msgid "Using preset password"
|
||||
msgstr ""
|
||||
msgstr "Gunakan kata sandi yang telah disetel sebelumnya"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9
|
||||
msgid "Vault"
|
||||
|
246
locale/it-IT.po
246
locale/it-IT.po
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Italian\n"
|
||||
"Language: it_IT\n"
|
||||
"PO-Revision-Date: 2023-11-04 21:09\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -23,7 +23,7 @@ msgstr "{name} copia"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77
|
||||
msgid "A second font family used to display characters missing in the main font"
|
||||
msgstr "Un set di caratteri secondario usato per mostrare quelli mancanti nel principale"
|
||||
msgstr "Una famiglia di font secondaria usata per visualizzare quelle mancanti nella font principale"
|
||||
|
||||
#: tabby-core/src/components/transfersMenu.component.ts:49
|
||||
msgid "Abort all"
|
||||
@@ -31,7 +31,7 @@ msgstr "Annulla tutto"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:24
|
||||
msgid "Accept and remember key"
|
||||
msgstr "Accetta e ricorda la chiave"
|
||||
msgstr "Accetta e ricorda chiave"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25
|
||||
msgid "Accept just this once"
|
||||
@@ -43,7 +43,7 @@ msgstr "Accessibilità"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27
|
||||
msgid "Acrylic background"
|
||||
msgstr "Sfondo traslucido"
|
||||
msgstr "Sfondo acrilico"
|
||||
|
||||
#: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:24
|
||||
#: locale/tmp-html/tabby-local/src/components/environmentEditor.component.html:11
|
||||
@@ -79,19 +79,19 @@ msgstr "Agente"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134
|
||||
msgid "Agent forwarding"
|
||||
msgstr "Inoltro dell'Agente"
|
||||
msgstr "Inoltro dell'agente"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35
|
||||
msgid "Agent pipe path"
|
||||
msgstr "Percorso pipe dell'Agente"
|
||||
msgstr "Percorso pipe agente"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24
|
||||
msgid "Agent type"
|
||||
msgstr "Tipo di Agente"
|
||||
msgstr "Tipo di agente"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169
|
||||
msgid "Allows opening .bat files in tabs, but breaks some shells"
|
||||
msgstr "Permette l'apertura di file .bat nelle schede, potrebbe bloccare alcune shell"
|
||||
msgstr "Permetti l'apertura di file .bat nelle schede, potrebbe bloccare alcune shell"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:60
|
||||
msgid "Allows quickly opening a terminal in the selected folder"
|
||||
@@ -122,7 +122,8 @@ msgstr "Impostazioni applicazione"
|
||||
|
||||
#: tabby-web/src/services/hostWindow.service.ts:19
|
||||
msgid "Are you sure you want to close Tabby? You can disable this prompt in Settings -> Window."
|
||||
msgstr "Sei sicuro di voler chiudere Tabby? Puoi disabilitare questo avviso in Impostazioni -> Finestra."
|
||||
msgstr "Sei sicuro di voler chiudere Tabby? \n"
|
||||
"Puoi disabilitare questo avviso in Impostazioni -> Finestra."
|
||||
|
||||
#: tabby-core/src/services/config.service.ts:440
|
||||
msgid "Are you sure?"
|
||||
@@ -224,7 +225,7 @@ msgstr "Incolla tra parentesi (richiede una shell che lo supporti)"
|
||||
|
||||
#: tabby-terminal/src/services/multifocus.service.ts:19
|
||||
msgid "Broadcast mode. Click anywhere to cancel."
|
||||
msgstr "Modalità broadcast. Clicca ovunque per annullare."
|
||||
msgstr "Modalità broadcast. Fai clic ovunque per disabilitare."
|
||||
|
||||
#: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:50
|
||||
#: tabby-core/src/services/profiles.service.ts:411
|
||||
@@ -272,7 +273,7 @@ msgstr "Crittografie"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSelector.component.html:5
|
||||
msgid "Clear"
|
||||
msgstr "Pulisci"
|
||||
msgstr "Azzera"
|
||||
|
||||
#: tabby-core/src/services/profiles.service.ts:248
|
||||
msgid "Clear recent profiles"
|
||||
@@ -280,11 +281,11 @@ msgstr "Cancella profili recenti"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:50
|
||||
msgid "Clear terminal"
|
||||
msgstr "Pulisci il terminale"
|
||||
msgstr "Azzera contenuto terminale"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:58
|
||||
msgid "Clear terminal after connection"
|
||||
msgstr "Pulisci il terminale dopo la connessione"
|
||||
msgstr "Azzera contenuto terminale dopo la connessione"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:94
|
||||
msgid "Clipboard"
|
||||
@@ -299,7 +300,7 @@ msgstr "Chiudi"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:45
|
||||
msgid "Close and never show again"
|
||||
msgstr "Chiudi e non mostrare più"
|
||||
msgstr "Chiudi e non visualizzare più"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:240
|
||||
msgid "Close focused pane"
|
||||
@@ -333,11 +334,11 @@ msgstr "Colore"
|
||||
|
||||
#: tabby-terminal/src/settings.ts:29
|
||||
msgid "Color scheme"
|
||||
msgstr "Tema del terminale"
|
||||
msgstr "Tema terminale"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2
|
||||
msgid "Color schemes"
|
||||
msgstr "Tema del terminale"
|
||||
msgstr "Schemi colore"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216
|
||||
@@ -346,7 +347,7 @@ msgstr "Colori"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:72
|
||||
msgid "Combine all tabs into the current tab"
|
||||
msgstr "Unisci tutte le schede all'interno della scheda corrente"
|
||||
msgstr "Unisci tutte le schede all'interno della scheda attuale"
|
||||
|
||||
#: locale/tmp-html/tabby-local/src/components/commandLineEditor.component.html:4
|
||||
msgid "Command line"
|
||||
@@ -354,7 +355,7 @@ msgstr "Riga di comando"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13
|
||||
msgid "Command's stdin/stdout is used instead of a network connection"
|
||||
msgstr "Viene utilizzato lo stdin/stdout invece di una connessione di rete"
|
||||
msgstr "Viene usato lo stdin/stdout invece di una connessione di rete"
|
||||
|
||||
#: tabby-core/src/services/commands.service.ts:105
|
||||
msgid "Commands"
|
||||
@@ -375,7 +376,7 @@ msgstr "Configurazione scaricata"
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:115
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:120
|
||||
msgid "Config file"
|
||||
msgstr "File di configurazione"
|
||||
msgstr "File configurazione"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:2
|
||||
#: tabby-settings/src/settings.ts:73
|
||||
@@ -445,7 +446,7 @@ msgstr "Copia"
|
||||
#: tabby-terminal/src/hotkeys.ts:70
|
||||
#: tabby-terminal/src/tabContextMenu.ts:70
|
||||
msgid "Copy current path"
|
||||
msgstr "Copia percorso corrente"
|
||||
msgstr "Copia percorso attuale"
|
||||
|
||||
#: tabby-electron/src/sftpContextMenu.ts:29
|
||||
msgid "Copy full path"
|
||||
@@ -486,11 +487,11 @@ msgstr "Tema in uso"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17
|
||||
msgid "Current host key fingerprint"
|
||||
msgstr "Firma della chiave host corrente"
|
||||
msgstr "Firma della chiave host attuale"
|
||||
|
||||
#: tabby-core/src/tabContextMenu.ts:184
|
||||
msgid "Current process: {name}"
|
||||
msgstr "Processo corrente: {name}"
|
||||
msgstr "Processo attuale: {name}"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:51
|
||||
msgid "Cursor shape"
|
||||
@@ -506,7 +507,7 @@ msgstr "CSS personalizzato"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17
|
||||
msgid "Dark mode"
|
||||
msgstr "Modalità scura"
|
||||
msgstr "Tema scuro"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26
|
||||
msgid "Data bits"
|
||||
@@ -530,7 +531,7 @@ msgstr "\"Connetti a\" predefinito"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93
|
||||
msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)"
|
||||
msgstr "Tipo di connessione predefinito utilizzato dalla funzione di connessione rapida (es. SSH, Telnet)"
|
||||
msgstr "Tipo di connessione predefinito usato dalla funzione di connessione rapida (es. SSH, Telnet)"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8
|
||||
msgid "Default profile for new tabs"
|
||||
@@ -574,11 +575,11 @@ msgstr "Elimina"
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:213
|
||||
#: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:90
|
||||
msgid "Delete \"{name}\"?"
|
||||
msgstr "Eliminare \"{name}\"?"
|
||||
msgstr "Vuoi eliminare \"{name}\"?"
|
||||
|
||||
#: tabby-ssh/src/sftpContextMenu.ts:35
|
||||
msgid "Delete {fullPath}?"
|
||||
msgstr "Eliminare {fullPath}?"
|
||||
msgstr "Vuoi eliminare {fullPath}?"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:42
|
||||
msgid "Delete entire line"
|
||||
@@ -594,19 +595,19 @@ msgstr "Elimina parola precedente"
|
||||
|
||||
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:114
|
||||
msgid "Delete the config on the remote side?"
|
||||
msgstr "Eliminare la configurazione sul dispositivo remoto?"
|
||||
msgstr "Vuoi eliminare la configurazione sul dispositivo remoto?"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:226
|
||||
msgid "Delete the group's profiles?"
|
||||
msgstr "Eliminare i profili del gruppo?"
|
||||
msgstr "Vuoi eliminare i profili del gruppo?"
|
||||
|
||||
#: tabby-terminal/src/components/loginScriptsSettings.component.ts:29
|
||||
msgid "Delete this script?"
|
||||
msgstr "Eliminare questo script?"
|
||||
msgstr "Vuoi eliminare questo script?"
|
||||
|
||||
#: tabby-settings/src/components/vaultSettingsTab.component.ts:50
|
||||
msgid "Delete vault contents?"
|
||||
msgstr "Eliminare il contenuto della Cassaforte?"
|
||||
msgstr "Vuoi eliminare il contenuto della cassaforte?"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpDeleteModal.component.html:3
|
||||
msgid "Deleting"
|
||||
@@ -651,12 +652,12 @@ msgstr "Disconnetti"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:106
|
||||
msgid "Disconnect current tab (Serial/Telnet/SSH)"
|
||||
msgstr "Disconnetti la scheda corrente (Serial/Telnet/SSH)"
|
||||
msgstr "Disconnetti la scheda attuale (serial/telnet/SSH)"
|
||||
|
||||
#: tabby-ssh/src/components/sshTab.component.ts:198
|
||||
#: tabby-telnet/src/components/telnetTab.component.ts:81
|
||||
msgid "Disconnect from {host}?"
|
||||
msgstr "Disconnetti da {host}?"
|
||||
msgstr "Vuoi disconnetti da {host}?"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:30
|
||||
msgid "Display images via Sixel escape sequences"
|
||||
@@ -664,7 +665,7 @@ msgstr "Visualizza le immagini tramite sequenze di escape di Sixel"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:85
|
||||
msgid "Display on"
|
||||
msgstr "Mostra su"
|
||||
msgstr "Visualizza in"
|
||||
|
||||
#: tabby-core/src/components/transfersMenu.component.ts:50
|
||||
msgid "Do not abort"
|
||||
@@ -682,7 +683,7 @@ msgstr "Non ricordare"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:97
|
||||
msgid "Dock always on top"
|
||||
msgstr "Mostra sempre in primo piano"
|
||||
msgstr "Visualizza sempre in primo piano"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:67
|
||||
msgid "Dock the terminal"
|
||||
@@ -706,7 +707,7 @@ msgstr "La selezione con doppio clic si fermerà a questi caratteri"
|
||||
|
||||
#: tabby-core/src/tabContextMenu.ts:79
|
||||
msgid "Down"
|
||||
msgstr "Giù"
|
||||
msgstr "In basso"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:43
|
||||
msgid "Download"
|
||||
@@ -753,15 +754,15 @@ msgstr "Abilita animazioni"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:74
|
||||
msgid "Enable automatic installation of updates when they become available."
|
||||
msgstr "Abilita l'installazione automatica degli aggiornamenti quando sono disponibili."
|
||||
msgstr "Abilita l'installazione automatica degli aggiornamenti quando disponibili."
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:211
|
||||
msgid "Enable fluent background option"
|
||||
msgstr "Abilita l'opzione di sfondo fluente"
|
||||
msgstr "Abilita opzione di sfondo fluente"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:16
|
||||
msgid "Enable font ligatures"
|
||||
msgstr "Abilita le legature tra caratteri"
|
||||
msgstr "Abilita le legature tra font"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:39
|
||||
msgid "Enable global hotkey (Ctrl-Space)"
|
||||
@@ -790,7 +791,7 @@ msgstr "Cancella configurazione"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:12
|
||||
msgid "Erase the Vault"
|
||||
msgstr "Cancella la Cassaforte"
|
||||
msgstr "Cancella la cassaforte"
|
||||
|
||||
#: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:6
|
||||
msgid "Error in {plugin}:"
|
||||
@@ -894,7 +895,7 @@ msgstr "Evidenzia il riquadro a destra"
|
||||
|
||||
#: tabby-core/src/theme.ts:34
|
||||
msgid "Follow the color scheme"
|
||||
msgstr "Segui lo schema dei colori"
|
||||
msgstr "Segui il tema di sistema"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:5
|
||||
msgid "Font"
|
||||
@@ -918,7 +919,7 @@ msgstr "Forza LF"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:25
|
||||
msgid "Forces a specific SSH agent connection type."
|
||||
msgstr "Forza un tipo specifico di agente per la connessione SSH."
|
||||
msgstr "Per la connessione SSH forza un tipo specifico di agente ."
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:105
|
||||
msgid "Forget"
|
||||
@@ -977,7 +978,7 @@ msgstr "Dona alla finestra una trasparenza sfocata per lo sfondo"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:24
|
||||
msgid "Go up"
|
||||
msgstr "Vai su"
|
||||
msgstr "Livello superiore"
|
||||
|
||||
#: tabby-core/src/utils.ts:61
|
||||
msgid "Green"
|
||||
@@ -1030,7 +1031,7 @@ msgstr "Nasconde il terminale agganciato quando si fa click fuori."
|
||||
|
||||
#: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:26
|
||||
msgid "Homepage"
|
||||
msgstr "Homepage"
|
||||
msgstr "Pagina home"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:34
|
||||
#: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:6
|
||||
@@ -1048,7 +1049,7 @@ msgstr "Verifica della chiave host"
|
||||
#: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2
|
||||
#: tabby-settings/src/settings.ts:15
|
||||
msgid "Hotkeys"
|
||||
msgstr "Tasti di scelta rapida"
|
||||
msgstr "Tasti scelta rapida"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83
|
||||
msgid "How Tabby presents itself through environment vars"
|
||||
@@ -1080,7 +1081,7 @@ msgstr "Se disabilitato, solo i profili personalizzati verranno visualizzati nel
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:23
|
||||
msgid "Immediately echoes your input locally"
|
||||
msgstr "Riporta immediatamente i tuoi input locali"
|
||||
msgstr "Riporta immediatamente gli input locali"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:252
|
||||
msgid "Increase horizontal split size"
|
||||
@@ -1106,7 +1107,7 @@ msgstr "Modalità di inserimento"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:15
|
||||
msgid "Input newlines"
|
||||
msgstr "Input newlines"
|
||||
msgstr "Input ritorni a capo"
|
||||
|
||||
#: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:39
|
||||
msgid "Installed"
|
||||
@@ -1114,11 +1115,11 @@ msgstr "Installato"
|
||||
|
||||
#: tabby-electron/src/services/updater.service.ts:131
|
||||
msgid "Installing the update will close all tabs and restart Tabby."
|
||||
msgstr "Installare l'aggiornamento chiuderà tutte le schede e riavvierà Tabby."
|
||||
msgstr "L'installazione dell'aggiornamento chiuderà tutte le schede e riavvierà Tabby."
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:66
|
||||
msgid "Intelligent Ctrl-C (copy/abort)"
|
||||
msgstr "Ctrl-C Intelligente (copia/annulla)"
|
||||
msgstr "Ctrl-C intelligente (copia/annulla)"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:94
|
||||
msgid "Interactive"
|
||||
@@ -1155,7 +1156,7 @@ msgstr "Mantieni"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:154
|
||||
msgid "Keep Alive Interval (Milliseconds)"
|
||||
msgstr "Keep Alive Interval (Millisecondi)"
|
||||
msgstr "Intervallo keep alive (Millisecondi)"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:98
|
||||
msgid "Keep docked terminal always on top"
|
||||
@@ -1196,7 +1197,7 @@ msgstr "Avvia WinSCP"
|
||||
|
||||
#: tabby-ssh/src/hotkeys.ts:14
|
||||
msgid "Launch WinSCP for current SSH session"
|
||||
msgstr "Avvia WinSCP per la sessione SSH corrente"
|
||||
msgstr "Avvia WinSCP per la sessione SSH attuale"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7
|
||||
@@ -1207,7 +1208,7 @@ msgstr "Scopri come consentire a Tabby di rilevare la cartella di lavoro della s
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76
|
||||
#: tabby-core/src/tabContextMenu.ts:80
|
||||
msgid "Left"
|
||||
msgstr "Sinistra"
|
||||
msgstr "A sinistra"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:40
|
||||
msgid "Lets the shell handle Meta key instead of OS"
|
||||
@@ -1227,7 +1228,7 @@ msgstr "Editor in linea, l'input viene inviato dopo aver premuto Invio"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83
|
||||
msgid "Line padding"
|
||||
msgstr "Spessore della riga"
|
||||
msgstr "Riempimento riga"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21
|
||||
msgid "Loading"
|
||||
@@ -1254,11 +1255,11 @@ msgstr "Terminale locale"
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:221
|
||||
#: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:16
|
||||
msgid "Login scripts"
|
||||
msgstr "Script di login"
|
||||
msgstr "Script di accesso"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:57
|
||||
msgid "Long-click for context menu"
|
||||
msgstr "Click prolungato per il menu contestuale"
|
||||
msgstr "Clic prolungato per il menu contestuale"
|
||||
|
||||
#: tabby-core/src/services/profiles.service.ts:279
|
||||
msgid "Manage profiles"
|
||||
@@ -1266,7 +1267,7 @@ msgstr "Gestione profili"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:160
|
||||
msgid "Max Keep Alive Count"
|
||||
msgstr "Numero massimo di Keep Alive"
|
||||
msgstr "Numero massimo keep Alive"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:172
|
||||
msgid "Maximize the active pane"
|
||||
@@ -1329,11 +1330,11 @@ msgstr "Nuova scheda amministratore"
|
||||
|
||||
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:58
|
||||
msgid "New config on {platform}"
|
||||
msgstr "Nuova configurazione su {platform}"
|
||||
msgstr "Nuova configurazione IN {platform}"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:144
|
||||
msgid "New group name"
|
||||
msgstr "Nome del nuovo gruppo"
|
||||
msgstr "Nome nuovo gruppo"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16
|
||||
msgid "New item"
|
||||
@@ -1403,7 +1404,7 @@ msgstr "Normale"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:22
|
||||
msgid "Normal font weight"
|
||||
msgstr "Peso del carattere normale"
|
||||
msgstr "Peso font normale"
|
||||
|
||||
#: tabby-terminal/src/components/searchPanel.component.ts:54
|
||||
#: tabby-terminal/src/components/searchPanel.component.ts:64
|
||||
@@ -1446,7 +1447,7 @@ msgstr "Opacità"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:82
|
||||
msgid "Open DevTools"
|
||||
msgstr "Apri Strumenti di Sviluppo"
|
||||
msgstr "Apri strumenti di sviluppo"
|
||||
|
||||
#: tabby-settings/src/hotkeys.ts:11
|
||||
msgid "Open Settings"
|
||||
@@ -1483,11 +1484,11 @@ msgstr "Predefinito del OS ({name})"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:46
|
||||
msgid "Output is shown as a hexdump"
|
||||
msgstr "L'output è mostrato come un hexdump"
|
||||
msgstr "L'output è visualizzato come un dump esadecimale"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:41
|
||||
msgid "Output is shown as it is received"
|
||||
msgstr "L'output è mostrato come viene ricevuto"
|
||||
msgstr "L'output è visualizzato come viene ricevuto"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:23
|
||||
msgid "Output mode"
|
||||
@@ -1495,7 +1496,7 @@ msgstr "Modalità di output"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/streamProcessingSettings.component.html:34
|
||||
msgid "Output newlines"
|
||||
msgstr "Output newlines"
|
||||
msgstr "Output ritorni a capo"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:42
|
||||
msgid "Override X11 display"
|
||||
@@ -1535,7 +1536,7 @@ msgstr "Parità"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64
|
||||
msgid "Partial config sync is not possible when the config is encrypted via Vault."
|
||||
msgstr "La sincronizzazione parziale della configurazione non è possibile quando questa è cifrata all'interno della Cassaforte."
|
||||
msgstr "La sincronizzazione parziale della configurazione non è possibile quando questa è cifrata all'interno della cassaforte."
|
||||
|
||||
#: tabby-terminal/src/components/inputProcessingSettings.component.ts:17
|
||||
msgid "Pass-through"
|
||||
@@ -1566,7 +1567,7 @@ msgstr "Incolla quando non selezionato, altrimenti copia"
|
||||
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:528
|
||||
msgid "Paste multiple lines?"
|
||||
msgstr "Incollare righe multiple?"
|
||||
msgstr "Vuoi incollare righe multiple?"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68
|
||||
msgid "Paste on middle-click"
|
||||
@@ -1586,7 +1587,7 @@ msgstr "Plugin"
|
||||
|
||||
#: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:4
|
||||
msgid "Plugins folder"
|
||||
msgstr "Cartella dei plugin"
|
||||
msgstr "Cartella plugin"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:38
|
||||
#: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:10
|
||||
@@ -1604,7 +1605,7 @@ msgstr "Porte"
|
||||
|
||||
#: tabby-terminal/src/api/connectableTerminalTab.component.ts:87
|
||||
msgid "Press any key to reconnect"
|
||||
msgstr "Premi un tasto per riconnettersi"
|
||||
msgstr "Premi un tasto per riconnetterti"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/hotkeyInputModal.component.html:3
|
||||
msgid "Press the key now"
|
||||
@@ -1616,7 +1617,7 @@ msgstr "Previene la chiusura accidentale"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:110
|
||||
msgid "Prevents accidental execution of pasted commands"
|
||||
msgstr "Impedisce l'esecuzione accidentale di comandi incollati"
|
||||
msgstr "Impedisci l'esecuzione accidentale di comandi incollati"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:44
|
||||
msgid "Previous tab"
|
||||
@@ -1659,7 +1660,7 @@ msgstr "Viola"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:38
|
||||
msgid "Puts all of Tabby's configuration into the vault"
|
||||
msgstr "Trasferisce tutta la configurazione di Tabby all'interno della Cassaforte"
|
||||
msgstr "Trasferisci tutta la configurazione di Tabby all'interno della cassaforte"
|
||||
|
||||
#: tabby-core/src/index.ts:219
|
||||
#: tabby-core/src/services/profiles.service.ts:295
|
||||
@@ -1697,7 +1698,7 @@ msgstr "Riconetti"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:102
|
||||
msgid "Reconnect current tab (Serial/Telnet/SSH)"
|
||||
msgstr "Riconnetti la scheda corrente (Serial/Telnet/SSH)"
|
||||
msgstr "Riconnetti la scheda attuale (serial/telnet/SSH)"
|
||||
|
||||
#: tabby-core/src/utils.ts:64
|
||||
msgid "Red"
|
||||
@@ -1722,7 +1723,7 @@ msgstr "Remoto"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:124
|
||||
msgid "Remove whitespace and newlines around the copied text"
|
||||
msgstr "Rimuovi spazi bianchi e a capo dal testo copiato"
|
||||
msgstr "Rimuovi spazi bianchi e a riorni a capo dal testo copiato"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:26
|
||||
#: tabby-core/src/tabContextMenu.ts:120
|
||||
@@ -1754,7 +1755,7 @@ msgstr "Segnala un problema"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:81
|
||||
msgid "Require a key to click links"
|
||||
msgstr "Richiede una chiave per fare clic sui collegamenti"
|
||||
msgstr "Richiedi una chiave per fare clic sui collegamenti"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:62
|
||||
msgid "Reset zoom"
|
||||
@@ -1762,15 +1763,15 @@ msgstr "Reimposta zoom"
|
||||
|
||||
#: tabby-serial/src/hotkeys.ts:14
|
||||
msgid "Restart current serial session"
|
||||
msgstr "Riavvia la sessione seriale corrente"
|
||||
msgstr "Riavvia la sessione seriale attuale"
|
||||
|
||||
#: tabby-ssh/src/hotkeys.ts:10
|
||||
msgid "Restart current SSH session"
|
||||
msgstr "Riavvia la sessione SSH corrente"
|
||||
msgstr "Riavvia la sessione SSH attuale"
|
||||
|
||||
#: tabby-telnet/src/hotkeys.ts:10
|
||||
msgid "Restart current Telnet session"
|
||||
msgstr "Riavvia la sessione Telnet corrente"
|
||||
msgstr "Riavvia la sessione telnet attuale"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:64
|
||||
msgid "Restart tab"
|
||||
@@ -1782,11 +1783,11 @@ msgstr "Riavvia l'app per applicare le modifiche"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:316
|
||||
msgid "Restore settings to defaults ?"
|
||||
msgstr "Ripristinare le impostazioni predefinite?"
|
||||
msgstr "Vuoi ripristinare le impostazioni predefinite?"
|
||||
|
||||
#: tabby-settings/src/components/editProfileGroupModal.component.ts:36
|
||||
msgid "Restore settings to inherited defaults ?"
|
||||
msgstr "Ripristinare le impostazioni predefinite ereditate?"
|
||||
msgstr "Vuoi ripristinare le impostazioni predefinite ereditate?"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159
|
||||
msgid "Restore terminal tabs on app start"
|
||||
@@ -1794,17 +1795,17 @@ msgstr "Ripristina le schede del terminale all'avvio dell'app"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:147
|
||||
msgid "Reuse session for multiple tabs"
|
||||
msgstr "Riutilizzare la sessione per più schede"
|
||||
msgstr "Riusa la sessione per più schede"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:136
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:78
|
||||
#: tabby-core/src/tabContextMenu.ts:78
|
||||
msgid "Right"
|
||||
msgstr "Destra"
|
||||
msgstr "A destra"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:56
|
||||
msgid "Right click"
|
||||
msgstr "Click destro"
|
||||
msgstr "Clic destro"
|
||||
|
||||
#: locale/tmp-html/tabby-local/src/components/localProfileSettings.component.html:5
|
||||
msgid "Run as administrator"
|
||||
@@ -1867,7 +1868,7 @@ msgstr "Scorrimento"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:47
|
||||
msgid "Scrolls the terminal to the bottom on user input"
|
||||
msgstr "Scorre il terminale in basso durante l'input dell'utente"
|
||||
msgstr "Scorri il terminale in basso durante l'input utente"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:74
|
||||
msgid "Search"
|
||||
@@ -1876,7 +1877,7 @@ msgstr "Cerca"
|
||||
#: tabby-terminal/src/components/colorSchemeSelector.component.ts:9
|
||||
#: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts:10
|
||||
msgid "Search color schemes"
|
||||
msgstr "Ricerca tema del terminale"
|
||||
msgstr "Cerca tema terminale"
|
||||
|
||||
#: tabby-settings/src/components/hotkeySettingsTab.component.ts:12
|
||||
msgid "Search hotkeys"
|
||||
@@ -1973,7 +1974,7 @@ msgstr "Shell"
|
||||
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:593
|
||||
msgid "Shell does not support current path detection"
|
||||
msgstr "La shell non supporta il rilevamento del percorso corrente"
|
||||
msgstr "La shell non supporta il rilevamento del percorso attuale"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:59
|
||||
msgid "Shell integration"
|
||||
@@ -1982,71 +1983,71 @@ msgstr "Integrazione shell"
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25
|
||||
msgid "Show"
|
||||
msgstr "Mostra"
|
||||
msgstr "Visualizza"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:275
|
||||
msgid "Show {type} profile selector"
|
||||
msgstr "Mostra il selettore profilo {type}"
|
||||
msgstr "Visualizza il selettore profilo {type}"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117
|
||||
msgid "Show a confirmation box when pasting multiple lines"
|
||||
msgstr "Mostra una casella di conferma quando incolli più righe"
|
||||
msgstr "Visualizza una casella di conferma quando incolli più righe"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75
|
||||
msgid "Show built-in profiles in selector"
|
||||
msgstr "Mostra profili integrati nel selettore"
|
||||
msgstr "Visualizza profili integrati nel selettore"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:12
|
||||
msgid "Show command selector"
|
||||
msgstr "Mostra selettore comandi"
|
||||
msgstr "Visualizza selettore comandi"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:132
|
||||
msgid "Show config file"
|
||||
msgstr "Mostra file di configurazione"
|
||||
msgstr "Visualizza file di configurazione"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:131
|
||||
msgid "Show defaults"
|
||||
msgstr "Mostra predefiniti"
|
||||
msgstr "Visualizza predefiniti"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146
|
||||
msgid "Show Mixer"
|
||||
msgstr "Mostra Mixer"
|
||||
msgstr "Visualizza Mixer"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:56
|
||||
msgid "Show pane labels (for rearranging)"
|
||||
msgstr "Mostra etichette riquadro (per riorganizzare)"
|
||||
msgstr "Visualizza etichette riquadro (per riorganizzare)"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164
|
||||
msgid "Show profile icon on tab"
|
||||
msgstr "Mostra l'icona del profilo nella scheda"
|
||||
msgstr "Visualizza l'icona del profilo nella scheda"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:16
|
||||
msgid "Show profile selector"
|
||||
msgstr "Mostra selettore profilo"
|
||||
msgstr "Visualizza selettore profilo"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:68
|
||||
msgid "Show recent profiles in selector"
|
||||
msgstr "Mostra i profili recenti nel selettore"
|
||||
msgstr "Visualizza i profili recenti nel selettore"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:36
|
||||
msgid "Show release notes"
|
||||
msgstr "Mostra note di rilascio"
|
||||
msgstr "Visualizza note di rilascio"
|
||||
|
||||
#: tabby-serial/src/hotkeys.ts:10
|
||||
msgid "Show Serial connections"
|
||||
msgstr "Mostra connessioni seriali"
|
||||
msgstr "Visualizza connessioni seriali"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:152
|
||||
msgid "Show tabs in fullscreen mode"
|
||||
msgstr "Mostra schede in modalità schermo intero"
|
||||
msgstr "Visualizza schede in modalità schermo intero"
|
||||
|
||||
#: tabby-terminal/src/tabContextMenu.ts:62
|
||||
msgid "Show toolbar"
|
||||
msgstr "Mostra barra degli strumenti"
|
||||
msgstr "Visualizza barra degli strumenti"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:45
|
||||
msgid "Show vault contents"
|
||||
msgstr "Mostra contenuto della Cassaforte"
|
||||
msgstr "Visualizza contenuto della cassaforte"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:29
|
||||
msgid "Sixel graphics support (experimental)"
|
||||
@@ -2143,7 +2144,7 @@ msgstr "Avvio"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:32
|
||||
msgid "Stop bits"
|
||||
msgstr "Ferma i bit"
|
||||
msgstr "Bit stop"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:52
|
||||
msgid "Strip"
|
||||
@@ -2192,7 +2193,7 @@ msgstr "Sincronizza tasti di scelta rapida"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:80
|
||||
msgid "Sync Vault"
|
||||
msgstr "Sincronizza Cassaforte"
|
||||
msgstr "Sincronizza cassaforte"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:74
|
||||
msgid "Sync window settings"
|
||||
@@ -2227,7 +2228,8 @@ msgstr "Attività della scheda"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/safeModeModal.component.html:3
|
||||
msgid "Tabby could not start with your plugins, so all third party plugins have been disabled in this session. The error was:"
|
||||
msgstr "Tabby non può avviarsi con i tuoi plugin, quindi tutti i plugin di terze parti sono stati disabilitati in questa sessione. L'errore era:"
|
||||
msgstr "Tabby non può avviarsi con i plugin, quindi tutti i plugin di terze parti sono stati disabilitati in questa sessione. \n"
|
||||
"L'errore era:"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41
|
||||
msgid "Tabby news and updates on Twitter"
|
||||
@@ -2247,7 +2249,7 @@ msgstr "Larghezza schede"
|
||||
|
||||
#: tabby-telnet/src/profiles.ts:34
|
||||
msgid "Telnet session"
|
||||
msgstr "Sessione Telnet"
|
||||
msgstr "Sessione telnet"
|
||||
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:210
|
||||
#: tabby-terminal/src/settings.ts:43
|
||||
@@ -2280,7 +2282,7 @@ msgstr "Ci sono trasferimenti di file attivi"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102
|
||||
msgid "There is a saved password for this connection"
|
||||
msgstr "È presente una password salvata per questa connessione"
|
||||
msgstr "Per questa connessione è presente una password salvata"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102
|
||||
msgid "These apply to all profiles of a given type"
|
||||
@@ -2300,7 +2302,7 @@ msgstr "Seleziona se stai sperimentando aliasing, ghosting o altri problemi visi
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:20
|
||||
msgid "Toggle fullscreen mode"
|
||||
msgstr "Attiva/Disattiva schermo intero"
|
||||
msgstr "Attiva/disattiva schermo intero"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:36
|
||||
msgid "Toggle last tab"
|
||||
@@ -2308,11 +2310,11 @@ msgstr "Attiva/disattiva ultima scheda"
|
||||
|
||||
#: tabby-electron/src/hotkeys.ts:14
|
||||
msgid "Toggle terminal window"
|
||||
msgstr "Attiva/disattiva finestra del terminale"
|
||||
msgstr "Attiva/disattiva finestra terminale"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40
|
||||
msgid "Toggles the Tabby window visibility"
|
||||
msgstr "Attiva/disattiva la visibilità della finestra di Tabby"
|
||||
msgstr "Attiva/disattiva visibilità della finestra di Tabby"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74
|
||||
@@ -2358,7 +2360,7 @@ msgstr "Sgancia"
|
||||
|
||||
#: tabby-core/src/tabContextMenu.ts:81
|
||||
msgid "Up"
|
||||
msgstr "Su"
|
||||
msgstr "In alto"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:14
|
||||
#: tabby-electron/src/services/updater.service.ts:133
|
||||
@@ -2367,7 +2369,7 @@ msgstr "Aggiorna"
|
||||
|
||||
#: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:52
|
||||
msgid "Upgrade to {version}"
|
||||
msgstr "Aggiornamento alla {version}"
|
||||
msgstr "Aggiorna alla {version}"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:42
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:10
|
||||
@@ -2401,7 +2403,7 @@ msgstr "Attraverso il metodo CONNECT"
|
||||
|
||||
#: tabby-ssh/src/session/ssh.ts:465
|
||||
msgid "Using preset password"
|
||||
msgstr "Usare password preimpostata"
|
||||
msgstr "Usa password preimpostata"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:9
|
||||
msgid "Vault"
|
||||
@@ -2409,11 +2411,11 @@ msgstr "Cassaforte"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:4
|
||||
msgid "Vault is an always-encrypted container for secrets such as SSH passwords and private key passphrases."
|
||||
msgstr "La Cassaforte è un contenitore protetto da cifratura per proteggere password SSH e frasi segrete delle chiavi private."
|
||||
msgstr "La cassaforte è un contenitore protetto da cifratura per proteggere password SSH e frasi segrete delle chiavi private."
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:17
|
||||
msgid "Vault is empty"
|
||||
msgstr "La Cassaforte è vuota"
|
||||
msgstr "La cassaforte è vuota"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/unlockVaultModal.component.html:4
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:44
|
||||
@@ -2422,11 +2424,11 @@ msgstr "Cassaforte bloccata"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:3
|
||||
msgid "Vault is not configured"
|
||||
msgstr "La Cassaforte non è configurata"
|
||||
msgstr "La cassaforte non è configurata"
|
||||
|
||||
#: tabby-core/src/services/fileProviders.service.ts:40
|
||||
msgid "Vault master passphrase needs to be set to allow storing secrets"
|
||||
msgstr "La frase segreta principale della Cassaforte deve essere impostata per consentire la memorizzazione di dati cifrati"
|
||||
msgstr "Per consentire la memorizzazione di dati cifrati deve essere impostata la frase segreta principale della cassaforte"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11
|
||||
msgid "Verify host keys when connecting"
|
||||
@@ -2450,11 +2452,11 @@ msgstr "Visive"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:116
|
||||
msgid "Warn on multi-line paste"
|
||||
msgstr "Avviso prima di incollare righe multiple"
|
||||
msgstr "Avvisa prima di incollare righe multiple"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:5
|
||||
msgid "Warn when closing active connections"
|
||||
msgstr "Avverti quando chiudi le connessioni attive"
|
||||
msgstr "Avvisa quando chiudi le connessioni attive"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:6
|
||||
msgid "Warning: remote host's key has suddenly changed!"
|
||||
@@ -2478,11 +2480,11 @@ msgstr "Quando termina una sessione"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82
|
||||
msgid "When enabled, links are only clickable while holding this key"
|
||||
msgstr "Quando abilitato, i link sono cliccabili solo tenendo premuto questo tasto"
|
||||
msgstr "Quando abilitato, i collegamentisono cliccabili solo tenendo premuto questo tasto"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18
|
||||
msgid "When WinSCP is detected, you can launch an SCP session from the context menu."
|
||||
msgstr "Quando si rileva WinSCP, è possibile avviare una sessione SCP dal menu contestuale."
|
||||
msgstr "Quando viene rilevato WinSCP, è possibile avviare una sessione SCP dal menu contestuale."
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:53
|
||||
msgid "Whether a custom window or an OS native window should be used"
|
||||
@@ -2503,7 +2505,7 @@ msgstr "Dimensione finestra lungo il bordo"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:105
|
||||
msgid "Window dimension away from the edge"
|
||||
msgstr "Dimensione della finestra fuori dal bordo"
|
||||
msgstr "Dimensione finestra fuori dal bordo"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:52
|
||||
msgid "Window frame"
|
||||
@@ -2519,7 +2521,7 @@ msgstr "Windows 10 build 18309 o superiore è raccomandato per ConPTY"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:17
|
||||
msgid "WinSCP path"
|
||||
msgstr "Posizione di WinSCP"
|
||||
msgstr "Percorso WinSCP"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:74
|
||||
msgid "Word separators"
|
||||
@@ -2552,11 +2554,11 @@ msgstr "Giallo"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/setVaultPassphraseModal.component.html:4
|
||||
msgid "You can change it later, but it's unrecoverable if forgotten."
|
||||
msgstr "Si può cambiare più tardi, ma è irrecuperabile se dimenticato."
|
||||
msgstr "Si può cambiare più tardi, ma è irrecuperabile se dimenticata."
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7
|
||||
msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed."
|
||||
msgstr "Potresti essere sotto un attacco man-in-the-middle in questo momento, o la chiave dell'host potrebbe essere stata appena cambiata."
|
||||
msgstr "In questo momento potresti essere sotto un attacco man-in-the-middle, o la chiave dell'host potrebbe essere stata appena cambiata."
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:54
|
||||
msgid "Zoom in"
|
||||
|
@@ -10,11 +10,11 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Japanese\n"
|
||||
"Language: ja_JP\n"
|
||||
"PO-Revision-Date: 2023-11-04 21:09\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
msgstr "\"{command}\"が実行中です。閉じますか?"
|
||||
msgstr "\"{command}\"が実行中です。閉じてもよろしいですか?"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:78
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:88
|
||||
@@ -23,7 +23,7 @@ msgstr "{name} コピー"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:77
|
||||
msgid "A second font family used to display characters missing in the main font"
|
||||
msgstr "既定フォントに不足している文字を表示する際に使用されます"
|
||||
msgstr "メインフォントに不足している文字を表示する際に使用されます"
|
||||
|
||||
#: tabby-core/src/components/transfersMenu.component.ts:49
|
||||
msgid "Abort all"
|
||||
@@ -64,7 +64,7 @@ msgstr "追加..."
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:84
|
||||
msgid "Additional space between lines"
|
||||
msgstr "行間にスペースを空けます"
|
||||
msgstr "行と行の間隔を広げます"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:22
|
||||
#: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:61
|
||||
@@ -79,15 +79,15 @@ msgstr "SSHエージェント"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:134
|
||||
msgid "Agent forwarding"
|
||||
msgstr "SSHエージェントの転送"
|
||||
msgstr "SSHエージェント転送"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:35
|
||||
msgid "Agent pipe path"
|
||||
msgstr "SSHエージェントのパイプのパス"
|
||||
msgstr "SSHエージェントのパイプ名"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:24
|
||||
msgid "Agent type"
|
||||
msgstr "SSHエージェントの種類"
|
||||
msgstr "SSHエージェントの指定"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:169
|
||||
msgid "Allows opening .bat files in tabs, but breaks some shells"
|
||||
@@ -354,7 +354,7 @@ msgstr "コマンドライン"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:13
|
||||
msgid "Command's stdin/stdout is used instead of a network connection"
|
||||
msgstr "ネットワーク接続の代わりにコマンドの stdin/stdout が使用されます"
|
||||
msgstr "ネットワーク接続の代わりにコマンドの stdin/stdout を使用します"
|
||||
|
||||
#: tabby-core/src/services/commands.service.ts:105
|
||||
msgid "Commands"
|
||||
@@ -486,7 +486,7 @@ msgstr "使用中の配色"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:17
|
||||
msgid "Current host key fingerprint"
|
||||
msgstr "使用中のホストキーのフィンガープリント"
|
||||
msgstr "現在のホスト鍵のフィンガープリント"
|
||||
|
||||
#: tabby-core/src/tabContextMenu.ts:184
|
||||
msgid "Current process: {name}"
|
||||
@@ -618,7 +618,7 @@ msgstr "デバイス"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:10
|
||||
msgid "Direct"
|
||||
msgstr "直接"
|
||||
msgstr "直接接続"
|
||||
|
||||
#: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:57
|
||||
msgid "Disable"
|
||||
@@ -1039,11 +1039,11 @@ msgstr "ホスト"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206
|
||||
msgid "Host key"
|
||||
msgstr "ホストキー"
|
||||
msgstr "ホスト鍵"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3
|
||||
msgid "Host key verification"
|
||||
msgstr "ホストキーの検証"
|
||||
msgstr "ホスト鍵の検証"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/hotkeySettingsTab.component.html:2
|
||||
#: tabby-settings/src/settings.ts:15
|
||||
@@ -1131,7 +1131,7 @@ msgstr "無効な構文"
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:16
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:43
|
||||
msgid "Jump host"
|
||||
msgstr "ジャンプサーバー"
|
||||
msgstr "踏み台サーバー"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:34
|
||||
msgid "Jump to next word"
|
||||
@@ -1188,7 +1188,7 @@ msgstr "言語"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:11
|
||||
msgid "Last known host key fingerprint"
|
||||
msgstr "最後に使用したホストキーのフィンガープリント"
|
||||
msgstr "最後に使われたホスト鍵のフィンガープリント"
|
||||
|
||||
#: tabby-ssh/src/tabContextMenu.ts:32
|
||||
msgid "Launch WinSCP"
|
||||
@@ -1201,7 +1201,7 @@ msgstr "現在のSSHセッションでWinSCPを起動"
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:16
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshTab.component.html:7
|
||||
msgid "Learn how to allow Tabby to detect remote shell's working directory."
|
||||
msgstr "Tabbyにリモート側の作業ディレクトリを検出させる方法をご紹介します。"
|
||||
msgstr "リモート上の作業ディレクトリを自動検出する方法をご紹介します。"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:134
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:76
|
||||
@@ -1227,7 +1227,7 @@ msgstr "Enterキーを押すと入力が送信されます"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:83
|
||||
msgid "Line padding"
|
||||
msgstr "行間の大きさ"
|
||||
msgstr "行間"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sftpPanel.component.html:21
|
||||
msgid "Loading"
|
||||
@@ -1325,7 +1325,7 @@ msgstr "新規"
|
||||
|
||||
#: tabby-local/src/tabContextMenu.ts:53
|
||||
msgid "New admin tab"
|
||||
msgstr "新しい管理者タブ"
|
||||
msgstr "新しい管理者権限タブ"
|
||||
|
||||
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:58
|
||||
msgid "New config on {platform}"
|
||||
@@ -1511,11 +1511,11 @@ msgstr "リモートを上書きして同期"
|
||||
|
||||
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:76
|
||||
msgid "Overwrite the config on the remote side and start syncing?"
|
||||
msgstr "リモート上の設定を上書きして同期を開始しますか?"
|
||||
msgstr "リモート上の設定を上書きして、同期を開始しますか?"
|
||||
|
||||
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:96
|
||||
msgid "Overwrite the local config and start syncing?"
|
||||
msgstr "これまでのローカル上の設定を上書きして、同期を開始しますか?"
|
||||
msgstr "現在のローカル上の設定を上書きして、同期を開始しますか?"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:189
|
||||
msgid "Pane resize step"
|
||||
@@ -1535,7 +1535,7 @@ msgstr "パリティ"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/configSyncSettingsTab.component.html:64
|
||||
msgid "Partial config sync is not possible when the config is encrypted via Vault."
|
||||
msgstr "設定ファイルがVaultによって暗号化されている場合、部分的な設定の同期はできません。"
|
||||
msgstr "Vaultによって設定ファイルを暗号化した場合、設定の一部だけを同期から外すことはできません。"
|
||||
|
||||
#: tabby-terminal/src/components/inputProcessingSettings.component.ts:17
|
||||
msgid "Pass-through"
|
||||
@@ -1562,11 +1562,11 @@ msgstr "クリップボードから貼り付け"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:63
|
||||
msgid "Paste if no selection, else copy"
|
||||
msgstr "通常は貼り付け、テキスト選択時のみコピー、"
|
||||
msgstr "通常は貼り付け、テキスト選択時のみコピー"
|
||||
|
||||
#: tabby-terminal/src/api/baseTerminalTab.component.ts:528
|
||||
msgid "Paste multiple lines?"
|
||||
msgstr "複数行の貼り付けを実行してもよろしいですか?"
|
||||
msgstr "複数行貼り付けを実行してもよろしいですか?"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:68
|
||||
msgid "Paste on middle-click"
|
||||
@@ -1960,7 +1960,7 @@ msgstr "最近使用したプロファイルをセレクターに表示しない
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:36
|
||||
msgid "Sets the SSH agent's named pipe path."
|
||||
msgstr "SSHエージェントの名前付きパイプのパスを設定"
|
||||
msgstr "SSHエージェントの名前付きパイプのパスを指定します。"
|
||||
|
||||
#: tabby-settings/src/buttonProvider.ts:28
|
||||
#: tabby-settings/src/components/settingsTab.component.ts:57
|
||||
@@ -1990,7 +1990,7 @@ msgstr "{type} プロファイルセレクターを表示"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:117
|
||||
msgid "Show a confirmation box when pasting multiple lines"
|
||||
msgstr "複数行を貼り付ける際に確認ボックスを表示します"
|
||||
msgstr "複数行の貼り付けをする際に確認画面を表示します"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:75
|
||||
msgid "Show built-in profiles in selector"
|
||||
@@ -2268,7 +2268,7 @@ msgstr "端末の識別情報"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7
|
||||
msgid "Thank you for downloading Tabby!"
|
||||
msgstr "Tabbyをダウンロードしていただきありがとうございます!"
|
||||
msgstr "Tabbyをダウンロードしてくださり、ありがとうございます!"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:5
|
||||
msgid "Theme"
|
||||
@@ -2280,7 +2280,7 @@ msgstr "ファイル転送を使用中"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102
|
||||
msgid "There is a saved password for this connection"
|
||||
msgstr "この接続に利用可能なパスワードが保存されています。"
|
||||
msgstr "この接続に使用するパスワードを保存しています。"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:102
|
||||
msgid "These apply to all profiles of a given type"
|
||||
@@ -2397,7 +2397,7 @@ msgstr "ユーザー名"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:25
|
||||
msgid "Using CONNECT method"
|
||||
msgstr "CONNECTメソッドの使用"
|
||||
msgstr "CONNECTメソッドを使用します"
|
||||
|
||||
#: tabby-ssh/src/session/ssh.ts:465
|
||||
msgid "Using preset password"
|
||||
@@ -2426,11 +2426,11 @@ msgstr "Vaultが設定されていません"
|
||||
|
||||
#: tabby-core/src/services/fileProviders.service.ts:40
|
||||
msgid "Vault master passphrase needs to be set to allow storing secrets"
|
||||
msgstr "機密性の高い情報を保存するには、Vaultのマスターパスフレーズを設定する必要があります"
|
||||
msgstr "機密性の高い情報を保存するには、Vaultにマスターパスフレーズを設定する必要があります"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:11
|
||||
msgid "Verify host keys when connecting"
|
||||
msgstr "接続時にホストキーを確認"
|
||||
msgstr "接続時にホスト鍵を検証"
|
||||
|
||||
#: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:75
|
||||
msgid "Version"
|
||||
@@ -2478,7 +2478,7 @@ msgstr "セッション終了時"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82
|
||||
msgid "When enabled, links are only clickable while holding this key"
|
||||
msgstr "有効にすると、特定のキーを押しながらクリックした時のみリンクが開けるようになります"
|
||||
msgstr "有効にすると、特定のキーを押しながらクリックした時のみリンクを開きます"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshSettingsTab.component.html:18
|
||||
msgid "When WinSCP is detected, you can launch an SCP session from the context menu."
|
||||
@@ -2556,7 +2556,7 @@ msgstr "後から変更できますが、忘れた場合復元することはで
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:7
|
||||
msgid "You could be under a man-in-the-middle attack right now, or the host key could have just been changed."
|
||||
msgstr "現在中間者攻撃を受けているか、もしくは、ホストキーが変更された可能性があります。"
|
||||
msgstr "現在中間者攻撃を受けているか、もしくはホスト鍵が変更された可能性があります。"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:54
|
||||
msgid "Zoom in"
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Korean\n"
|
||||
"Language: ko_KR\n"
|
||||
"PO-Revision-Date: 2023-11-04 21:09\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -362,7 +362,7 @@ msgstr "명령어"
|
||||
|
||||
#: tabby-core/src/theme.ts:16
|
||||
msgid "Compact (legacy)"
|
||||
msgstr ""
|
||||
msgstr "컴팩트 (레거시)"
|
||||
|
||||
#: tabby-settings/src/components/configSyncSettingsTab.component.ts:126
|
||||
msgid "Config deleted"
|
||||
@@ -1052,7 +1052,7 @@ msgstr "단축키"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:83
|
||||
msgid "How Tabby presents itself through environment vars"
|
||||
msgstr ""
|
||||
msgstr "Tabby가 환경 변수에서 표시되는 방식"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:24
|
||||
msgid "HTTP proxy"
|
||||
@@ -1088,13 +1088,13 @@ msgstr "가로 분할 크기 크게"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:244
|
||||
msgid "Increase vertical split size"
|
||||
msgstr "세로 분할 크기 작게"
|
||||
msgstr "세로 분할 크기 크게"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:91
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226
|
||||
#: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21
|
||||
msgid "Input"
|
||||
msgstr ""
|
||||
msgstr "입력"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:18
|
||||
msgid "Input is sent as you type"
|
||||
@@ -1471,7 +1471,7 @@ msgstr "옵션"
|
||||
|
||||
#: tabby-core/src/utils.ts:62
|
||||
msgid "Orange"
|
||||
msgstr ""
|
||||
msgstr "주황색"
|
||||
|
||||
#: tabby-electron/src/shells/macDefault.ts:25
|
||||
msgid "OS default"
|
||||
@@ -1527,7 +1527,7 @@ msgstr "패널"
|
||||
|
||||
#: tabby-core/src/theme.ts:26
|
||||
msgid "Paper (legacy)"
|
||||
msgstr ""
|
||||
msgstr "종이 (레거시)"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:38
|
||||
msgid "Parity"
|
||||
@@ -1539,11 +1539,11 @@ msgstr "구성이 Vault를 통해 암호화된 경우 부분 구성 동기화를
|
||||
|
||||
#: tabby-terminal/src/components/inputProcessingSettings.component.ts:17
|
||||
msgid "Pass-through"
|
||||
msgstr ""
|
||||
msgstr "왼쪽 글자 삭제"
|
||||
|
||||
#: tabby-settings/src/components/vaultSettingsTab.component.ts:92
|
||||
msgid "Passphrase for a private key with hash {hash}..."
|
||||
msgstr ""
|
||||
msgstr "해시 {hash} 의 개인 키(Private key) 암호..."
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:100
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:82
|
||||
@@ -1683,7 +1683,7 @@ msgstr "타임아웃 (밀리초)"
|
||||
#: tabby-core/src/services/profiles.service.ts:249
|
||||
#: tabby-electron/src/services/dockMenu.service.ts:28
|
||||
msgid "Recent"
|
||||
msgstr ""
|
||||
msgstr "최근"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialTab.component.html:5
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:52
|
||||
@@ -2010,11 +2010,11 @@ msgstr "기본값 표시"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:146
|
||||
msgid "Show Mixer"
|
||||
msgstr ""
|
||||
msgstr "믹서 표시"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:56
|
||||
msgid "Show pane labels (for rearranging)"
|
||||
msgstr ""
|
||||
msgstr "항목 라벨 표시 (재배열 용도)"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:164
|
||||
msgid "Show profile icon on tab"
|
||||
@@ -2135,7 +2135,7 @@ msgstr "{user}@{host}:{port} 의 SSH 비밀번호"
|
||||
|
||||
#: tabby-core/src/theme.ts:8
|
||||
msgid "Standard (legacy)"
|
||||
msgstr ""
|
||||
msgstr "기본 (레거시)"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:150
|
||||
msgid "Startup"
|
||||
@@ -2147,7 +2147,7 @@ msgstr "정지 비트"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:52
|
||||
msgid "Strip"
|
||||
msgstr ""
|
||||
msgstr "스트립(Strip)"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:41
|
||||
msgid "Subscribe to updates"
|
||||
@@ -2264,7 +2264,7 @@ msgstr "터미널 벨"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:82
|
||||
msgid "Terminal identification"
|
||||
msgstr ""
|
||||
msgstr "터미널 식별 방식"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:7
|
||||
msgid "Thank you for downloading Tabby!"
|
||||
@@ -2276,7 +2276,7 @@ msgstr "테마"
|
||||
|
||||
#: tabby-core/src/components/transfersMenu.component.ts:47
|
||||
msgid "There are active file transfers"
|
||||
msgstr ""
|
||||
msgstr "활성화된 파일 전송이 있습니다"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:102
|
||||
msgid "There is a saved password for this connection"
|
||||
@@ -2288,7 +2288,7 @@ msgstr "이와 같은 유형의 모든 프로필에 적용됩니다."
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17
|
||||
msgid "These apply to all profiles of a given type in this group"
|
||||
msgstr ""
|
||||
msgstr "이 그룹의 해당 유형을 가진 모든 프로필에 적용됩니다"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59
|
||||
msgid "Thin"
|
||||
@@ -2312,7 +2312,7 @@ msgstr "터미널 창 전환"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:40
|
||||
msgid "Toggles the Tabby window visibility"
|
||||
msgstr ""
|
||||
msgstr "Tabby 창 표시 전환"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:130
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:74
|
||||
@@ -2350,7 +2350,7 @@ msgstr "알 수 없음"
|
||||
|
||||
#: tabby-settings/src/components/vaultSettingsTab.component.ts:98
|
||||
msgid "Unknown secret of type {type} for {key}"
|
||||
msgstr ""
|
||||
msgstr "{key} 에 대한 알 수 없는 타입 {type}"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalToolbar.component.html:4
|
||||
msgid "Unpin"
|
||||
@@ -2540,7 +2540,7 @@ msgstr "WSL 터미널의 벨은 오직 볼륨 믹서를 통해서만 음소거
|
||||
|
||||
#: locale/tmp-html/tabby-local/src/components/shellSettingsTab.component.html:14
|
||||
msgid "WSL terminal only supports TrueColor with ConPTY"
|
||||
msgstr ""
|
||||
msgstr "WSL terminal의 TrueColor는 ConPTY가 활성화 되어있을 때만 지원됨"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:128
|
||||
msgid "X11 forwarding"
|
||||
@@ -2570,5 +2570,5 @@ msgstr "축소"
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshPortForwardingConfig.component.html:5
|
||||
msgctxt "[Dynamic] port forwarding"
|
||||
msgid "id.port-forwarding.dynamic"
|
||||
msgstr ""
|
||||
msgstr "동적"
|
||||
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Polish\n"
|
||||
"Language: pl_PL\n"
|
||||
"PO-Revision-Date: 2023-10-06 11:30\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -100,12 +100,12 @@ msgstr "Pozwala na szybkie otwarcie terminalu w wybranym folderze"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11
|
||||
msgid "Always dark"
|
||||
msgstr ""
|
||||
msgstr "Zawsze ciemny"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13
|
||||
msgid "Always light"
|
||||
msgstr ""
|
||||
msgstr "Zawsze jasny"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2
|
||||
#: tabby-terminal/src/settings.ts:14
|
||||
@@ -538,7 +538,7 @@ msgstr "Domyślny profil dla nowych kart"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16
|
||||
msgid "Default profile group settings"
|
||||
msgstr ""
|
||||
msgstr "Domyślne ustawienia profilu grupy"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101
|
||||
msgid "Default profile settings"
|
||||
@@ -745,7 +745,7 @@ msgstr "Włącz"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:32
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:66
|
||||
msgid "Enable analytics"
|
||||
msgstr "Wyłącz Analitykę"
|
||||
msgstr "Włącz Analitykę"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:87
|
||||
msgid "Enable animations"
|
||||
@@ -939,7 +939,7 @@ msgstr "Ze schematu kolorów"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9
|
||||
msgid "From system"
|
||||
msgstr ""
|
||||
msgstr "Z systemu"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44
|
||||
msgid "From theme"
|
||||
@@ -1321,7 +1321,7 @@ msgstr "Natywna"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21
|
||||
msgid "New"
|
||||
msgstr ""
|
||||
msgstr "Nowy"
|
||||
|
||||
#: tabby-local/src/tabContextMenu.ts:53
|
||||
msgid "New admin tab"
|
||||
@@ -1333,7 +1333,7 @@ msgstr "Nowa konfiguracja na {platform}"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:144
|
||||
msgid "New group name"
|
||||
msgstr ""
|
||||
msgstr "Nazwa nowej grupy"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16
|
||||
msgid "New item"
|
||||
@@ -1349,7 +1349,7 @@ msgstr "Nowy profil"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24
|
||||
msgid "New profile Group"
|
||||
msgstr ""
|
||||
msgstr "Nowy grupa profili"
|
||||
|
||||
#: tabby-terminal/src/tabContextMenu.ts:176
|
||||
msgid "New profile name"
|
||||
@@ -1782,11 +1782,11 @@ msgstr "Zresetuj aplikację, aby zastosować zmiany"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:316
|
||||
msgid "Restore settings to defaults ?"
|
||||
msgstr ""
|
||||
msgstr "Przywrócić ustawienia domyślne?"
|
||||
|
||||
#: tabby-settings/src/components/editProfileGroupModal.component.ts:36
|
||||
msgid "Restore settings to inherited defaults ?"
|
||||
msgstr ""
|
||||
msgstr "Przywrócić ustawienia do odziedziczonych domyślnych?"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159
|
||||
msgid "Restore terminal tabs on app start"
|
||||
@@ -2160,7 +2160,7 @@ msgstr "Zastępstwa dozwolone."
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5
|
||||
msgid "Switch color scheme"
|
||||
msgstr ""
|
||||
msgstr "Zmień schemat kolorów"
|
||||
|
||||
#: tabby-core/src/tabContextMenu.ts:290
|
||||
msgid "Switch profile"
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Portuguese, Brazilian\n"
|
||||
"Language: pt_BR\n"
|
||||
"PO-Revision-Date: 2023-10-06 11:30\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -100,12 +100,12 @@ msgstr "Permite abrir rapidamente um terminal na pasta selecionada"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11
|
||||
msgid "Always dark"
|
||||
msgstr ""
|
||||
msgstr "Sempre escuro"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13
|
||||
msgid "Always light"
|
||||
msgstr ""
|
||||
msgstr "Sempre claro"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2
|
||||
#: tabby-terminal/src/settings.ts:14
|
||||
@@ -185,7 +185,7 @@ msgstr "Tipo de fundo"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4
|
||||
msgid "Backspace key mode"
|
||||
msgstr ""
|
||||
msgstr "Modo botão Backspace"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14
|
||||
#: tabby-serial/src/components/serialTab.component.ts:93
|
||||
@@ -337,7 +337,7 @@ msgstr "Esquema de cores"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2
|
||||
msgid "Color schemes"
|
||||
msgstr ""
|
||||
msgstr "Esquema de cores"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216
|
||||
@@ -506,7 +506,7 @@ msgstr "CSS Personalizado"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17
|
||||
msgid "Dark mode"
|
||||
msgstr ""
|
||||
msgstr "Modo escuro"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26
|
||||
msgid "Data bits"
|
||||
@@ -526,11 +526,11 @@ msgstr "Diminuir tamanho de divisão horizontal"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92
|
||||
msgid "Default \"Connect to\" type"
|
||||
msgstr ""
|
||||
msgstr "Tipo de \"Conectar a \" padrão"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93
|
||||
msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)"
|
||||
msgstr ""
|
||||
msgstr "Tipo de conexão padrão usado pelo recurso de conexão rápida (ex. SSH, Telnet)"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8
|
||||
msgid "Default profile for new tabs"
|
||||
@@ -538,7 +538,7 @@ msgstr "Perfil padrão para novas abas"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16
|
||||
msgid "Default profile group settings"
|
||||
msgstr ""
|
||||
msgstr "Configurações de grupo de perfil padrão"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101
|
||||
msgid "Default profile settings"
|
||||
@@ -651,7 +651,7 @@ msgstr "Desconectar"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:106
|
||||
msgid "Disconnect current tab (Serial/Telnet/SSH)"
|
||||
msgstr ""
|
||||
msgstr "Desconectar aba atual (Serial/Telnet/SSH)"
|
||||
|
||||
#: tabby-ssh/src/components/sshTab.component.ts:198
|
||||
#: tabby-telnet/src/components/telnetTab.component.ts:81
|
||||
@@ -939,7 +939,7 @@ msgstr "Do esquema de cores"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9
|
||||
msgid "From system"
|
||||
msgstr ""
|
||||
msgstr "Do sistema"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44
|
||||
msgid "From theme"
|
||||
@@ -1006,7 +1006,7 @@ msgstr "Hexadecimal"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49
|
||||
msgid "Hide"
|
||||
msgstr ""
|
||||
msgstr "Ocultar"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176
|
||||
msgid "Hide tab close button"
|
||||
@@ -1094,7 +1094,7 @@ msgstr "Aumentar o tamanho da divisão vertical"
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226
|
||||
#: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21
|
||||
msgid "Input"
|
||||
msgstr ""
|
||||
msgstr "Entrada"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:18
|
||||
msgid "Input is sent as you type"
|
||||
@@ -1215,7 +1215,7 @@ msgstr "Permite que o shell manipule Meta key em vez de S.O"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22
|
||||
msgid "Light mode"
|
||||
msgstr ""
|
||||
msgstr "Modo claro"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:27
|
||||
msgid "Line by line"
|
||||
@@ -1321,7 +1321,7 @@ msgstr "Nativo"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21
|
||||
msgid "New"
|
||||
msgstr ""
|
||||
msgstr "Novo"
|
||||
|
||||
#: tabby-local/src/tabContextMenu.ts:53
|
||||
msgid "New admin tab"
|
||||
@@ -1333,7 +1333,7 @@ msgstr "Nova configuração em {platform}"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:144
|
||||
msgid "New group name"
|
||||
msgstr ""
|
||||
msgstr "Nome do novo grupo"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16
|
||||
msgid "New item"
|
||||
@@ -1349,7 +1349,7 @@ msgstr "Novo perfil"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24
|
||||
msgid "New profile Group"
|
||||
msgstr ""
|
||||
msgstr "Novo Grupo de Perfil"
|
||||
|
||||
#: tabby-terminal/src/tabContextMenu.ts:176
|
||||
msgid "New profile name"
|
||||
@@ -1438,7 +1438,7 @@ msgstr "Nas discussões no GitHub"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47
|
||||
msgid "Only close the tab when session is explicitly terminated"
|
||||
msgstr ""
|
||||
msgstr "Só fechar a aba quando a sessão for terminada explicitamente"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46
|
||||
msgid "Opacity"
|
||||
@@ -1539,7 +1539,7 @@ msgstr "Sincronização parcial de configuração não é possível quando a con
|
||||
|
||||
#: tabby-terminal/src/components/inputProcessingSettings.component.ts:17
|
||||
msgid "Pass-through"
|
||||
msgstr ""
|
||||
msgstr "Passar"
|
||||
|
||||
#: tabby-settings/src/components/vaultSettingsTab.component.ts:92
|
||||
msgid "Passphrase for a private key with hash {hash}..."
|
||||
@@ -1697,7 +1697,7 @@ msgstr "Reconectar"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:102
|
||||
msgid "Reconnect current tab (Serial/Telnet/SSH)"
|
||||
msgstr ""
|
||||
msgstr "Reconectar a aba atual (Serial/Telnet/SSH)"
|
||||
|
||||
#: tabby-core/src/utils.ts:64
|
||||
msgid "Red"
|
||||
@@ -1782,11 +1782,11 @@ msgstr "Reinicie o aplicativo para aplicar as alterações"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:316
|
||||
msgid "Restore settings to defaults ?"
|
||||
msgstr ""
|
||||
msgstr "Restaurar as configurações para o padrão?"
|
||||
|
||||
#: tabby-settings/src/components/editProfileGroupModal.component.ts:36
|
||||
msgid "Restore settings to inherited defaults ?"
|
||||
msgstr ""
|
||||
msgstr "Restaurar configurações para padrões herdados ?"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159
|
||||
msgid "Restore terminal tabs on app start"
|
||||
@@ -1982,7 +1982,7 @@ msgstr "Integração com o Shell"
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25
|
||||
msgid "Show"
|
||||
msgstr ""
|
||||
msgstr "Mostrar"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:275
|
||||
msgid "Show {type} profile selector"
|
||||
@@ -2160,7 +2160,7 @@ msgstr "Substituições permitidas."
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5
|
||||
msgid "Switch color scheme"
|
||||
msgstr ""
|
||||
msgstr "Alternar esquema de cores"
|
||||
|
||||
#: tabby-core/src/tabContextMenu.ts:290
|
||||
msgid "Switch profile"
|
||||
@@ -2288,7 +2288,7 @@ msgstr "Estas se aplicam a todos os perfis de um determinado tipo"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17
|
||||
msgid "These apply to all profiles of a given type in this group"
|
||||
msgstr ""
|
||||
msgstr "Estas se aplicam a todos os perfis de um determinado tipo neste grupo"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59
|
||||
msgid "Thin"
|
||||
@@ -2474,7 +2474,7 @@ msgstr "Novidades"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46
|
||||
msgid "When a session ends"
|
||||
msgstr ""
|
||||
msgstr "Quando uma sessão termina"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82
|
||||
msgid "When enabled, links are only clickable while holding this key"
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Portuguese\n"
|
||||
"Language: pt_PT\n"
|
||||
"PO-Revision-Date: 2023-10-06 11:30\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -39,7 +39,7 @@ msgstr "Aceitar apenas desta vez"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84
|
||||
msgid "Accessibility"
|
||||
msgstr ""
|
||||
msgstr "acessibilidade"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:27
|
||||
msgid "Acrylic background"
|
||||
@@ -100,12 +100,12 @@ msgstr "Permite abrir um terminal rapidamente na pasta selecionada"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11
|
||||
msgid "Always dark"
|
||||
msgstr ""
|
||||
msgstr "sempre escuro"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13
|
||||
msgid "Always light"
|
||||
msgstr ""
|
||||
msgstr "Sempre luminoso"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2
|
||||
#: tabby-terminal/src/settings.ts:14
|
||||
@@ -498,7 +498,7 @@ msgstr "Formato do cursor"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsForMode.component.html:46
|
||||
msgid "Custom"
|
||||
msgstr ""
|
||||
msgstr "Personalizado"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:90
|
||||
msgid "Custom CSS"
|
||||
@@ -538,7 +538,7 @@ msgstr "Perfil padrão para novas abas"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16
|
||||
msgid "Default profile group settings"
|
||||
msgstr ""
|
||||
msgstr "Parâmetros do grupo de perfis por defeito"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101
|
||||
msgid "Default profile settings"
|
||||
@@ -736,7 +736,7 @@ msgstr "Editar"
|
||||
|
||||
#: tabby-electron/src/sftpContextMenu.ts:35
|
||||
msgid "Edit locally"
|
||||
msgstr ""
|
||||
msgstr "Editar localmente"
|
||||
|
||||
#: locale/tmp-html/tabby-plugin-manager/src/components/pluginsSettingsTab.component.html:58
|
||||
msgid "Enable"
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Russian\n"
|
||||
"Language: ru_RU\n"
|
||||
"PO-Revision-Date: 2023-10-06 11:30\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -100,12 +100,12 @@ msgstr "Позволяет быстро открыть терминал в вы
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11
|
||||
msgid "Always dark"
|
||||
msgstr ""
|
||||
msgstr "Всегда тёмная"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13
|
||||
msgid "Always light"
|
||||
msgstr ""
|
||||
msgstr "Всегда светлая"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2
|
||||
#: tabby-terminal/src/settings.ts:14
|
||||
@@ -185,7 +185,7 @@ msgstr "Тип фона"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4
|
||||
msgid "Backspace key mode"
|
||||
msgstr ""
|
||||
msgstr "Режим работы клавиши Backspace"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14
|
||||
#: tabby-serial/src/components/serialTab.component.ts:93
|
||||
@@ -337,7 +337,7 @@ msgstr "Цветовая схема"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:2
|
||||
msgid "Color schemes"
|
||||
msgstr ""
|
||||
msgstr "Цветовая схема"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:81
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:216
|
||||
@@ -506,7 +506,7 @@ msgstr "Пользовательский CSS"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:17
|
||||
msgid "Dark mode"
|
||||
msgstr ""
|
||||
msgstr "Тёмная тема"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:26
|
||||
msgid "Data bits"
|
||||
@@ -526,11 +526,11 @@ msgstr "Уменьшить размер разделения по вертика
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:92
|
||||
msgid "Default \"Connect to\" type"
|
||||
msgstr ""
|
||||
msgstr "«Подключиться к» по умолчанию"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93
|
||||
msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)"
|
||||
msgstr ""
|
||||
msgstr "Подключение по умолчанию, используемое быстрым подключением (например, SSH, Telnet)"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8
|
||||
msgid "Default profile for new tabs"
|
||||
@@ -538,7 +538,7 @@ msgstr "Профиль по умолчанию для новых вкладок"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16
|
||||
msgid "Default profile group settings"
|
||||
msgstr ""
|
||||
msgstr "Настройки группы профилей по умолчанию"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101
|
||||
msgid "Default profile settings"
|
||||
@@ -651,7 +651,7 @@ msgstr "Отсоединиться"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:106
|
||||
msgid "Disconnect current tab (Serial/Telnet/SSH)"
|
||||
msgstr ""
|
||||
msgstr "Отключиться в текущей вкладке (Serial/Telnet/SSH)"
|
||||
|
||||
#: tabby-ssh/src/components/sshTab.component.ts:198
|
||||
#: tabby-telnet/src/components/telnetTab.component.ts:81
|
||||
@@ -939,7 +939,7 @@ msgstr "Из цветовой схемы"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9
|
||||
msgid "From system"
|
||||
msgstr ""
|
||||
msgstr "Системная"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44
|
||||
msgid "From theme"
|
||||
@@ -1006,7 +1006,7 @@ msgstr "Шестнадцатеричный"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:49
|
||||
msgid "Hide"
|
||||
msgstr ""
|
||||
msgstr "Скрыть"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:176
|
||||
msgid "Hide tab close button"
|
||||
@@ -1094,7 +1094,7 @@ msgstr "Увеличить размер разделения по вертика
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226
|
||||
#: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21
|
||||
msgid "Input"
|
||||
msgstr ""
|
||||
msgstr "Ввод"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:18
|
||||
msgid "Input is sent as you type"
|
||||
@@ -1215,7 +1215,7 @@ msgstr "Позволяет оболочке обрабатывать клави
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:22
|
||||
msgid "Light mode"
|
||||
msgstr ""
|
||||
msgstr "Светлая тема"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:27
|
||||
msgid "Line by line"
|
||||
@@ -1321,7 +1321,7 @@ msgstr "Системная"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21
|
||||
msgid "New"
|
||||
msgstr ""
|
||||
msgstr "Новый"
|
||||
|
||||
#: tabby-local/src/tabContextMenu.ts:53
|
||||
msgid "New admin tab"
|
||||
@@ -1333,7 +1333,7 @@ msgstr "Новая конфигурация на {platform}"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:144
|
||||
msgid "New group name"
|
||||
msgstr ""
|
||||
msgstr "Имя новой группы"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16
|
||||
msgid "New item"
|
||||
@@ -1349,7 +1349,7 @@ msgstr "Новый профиль"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24
|
||||
msgid "New profile Group"
|
||||
msgstr ""
|
||||
msgstr "Новая группа профилей"
|
||||
|
||||
#: tabby-terminal/src/tabContextMenu.ts:176
|
||||
msgid "New profile name"
|
||||
@@ -1438,7 +1438,7 @@ msgstr "На GitHub Discussions"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47
|
||||
msgid "Only close the tab when session is explicitly terminated"
|
||||
msgstr ""
|
||||
msgstr "Закрывать вкладки только при явном закрытии сеанса"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46
|
||||
msgid "Opacity"
|
||||
@@ -1539,7 +1539,7 @@ msgstr "Частичная синхронизация конфигурации
|
||||
|
||||
#: tabby-terminal/src/components/inputProcessingSettings.component.ts:17
|
||||
msgid "Pass-through"
|
||||
msgstr ""
|
||||
msgstr "Пропускать насквозь"
|
||||
|
||||
#: tabby-settings/src/components/vaultSettingsTab.component.ts:92
|
||||
msgid "Passphrase for a private key with hash {hash}..."
|
||||
@@ -1697,7 +1697,7 @@ msgstr "Переподключение"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:102
|
||||
msgid "Reconnect current tab (Serial/Telnet/SSH)"
|
||||
msgstr ""
|
||||
msgstr "Переподключиться в текущей вкладке (Serial/Telnet/SSH)"
|
||||
|
||||
#: tabby-core/src/utils.ts:64
|
||||
msgid "Red"
|
||||
@@ -1782,11 +1782,11 @@ msgstr "Перезапустите приложение, чтобы примен
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:316
|
||||
msgid "Restore settings to defaults ?"
|
||||
msgstr ""
|
||||
msgstr "Восстановить настройки по умолчанию?"
|
||||
|
||||
#: tabby-settings/src/components/editProfileGroupModal.component.ts:36
|
||||
msgid "Restore settings to inherited defaults ?"
|
||||
msgstr ""
|
||||
msgstr "Восстановить унаследованные настройки по умолчанию?"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159
|
||||
msgid "Restore terminal tabs on app start"
|
||||
@@ -1982,7 +1982,7 @@ msgstr "Интеграция в систему"
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:50
|
||||
#: locale/tmp-html/tabby-settings/src/components/vaultSettingsTab.component.html:25
|
||||
msgid "Show"
|
||||
msgstr ""
|
||||
msgstr "Показать"
|
||||
|
||||
#: tabby-core/src/hotkeys.ts:275
|
||||
msgid "Show {type} profile selector"
|
||||
@@ -2160,7 +2160,7 @@ msgstr "Допускаются подстановки."
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5
|
||||
msgid "Switch color scheme"
|
||||
msgstr ""
|
||||
msgstr "Переключить цветовую схему"
|
||||
|
||||
#: tabby-core/src/tabContextMenu.ts:290
|
||||
msgid "Switch profile"
|
||||
@@ -2288,7 +2288,7 @@ msgstr "Применяются для всех профилей данного
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17
|
||||
msgid "These apply to all profiles of a given type in this group"
|
||||
msgstr ""
|
||||
msgstr "Они применяются ко всем профилям данного типа в группе"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59
|
||||
msgid "Thin"
|
||||
@@ -2474,7 +2474,7 @@ msgstr "Что нового"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46
|
||||
msgid "When a session ends"
|
||||
msgstr ""
|
||||
msgstr "При завершении сеанса"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82
|
||||
msgid "When enabled, links are only clickable while holding this key"
|
||||
|
2574
locale/sr-SP.po
Normal file
2574
locale/sr-SP.po
Normal file
File diff suppressed because it is too large
Load Diff
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Swedish\n"
|
||||
"Language: sv_SE\n"
|
||||
"PO-Revision-Date: 2023-11-04 21:09\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -35,7 +35,7 @@ msgstr "Acceptera och kom ihåg nyckel"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:25
|
||||
msgid "Accept just this once"
|
||||
msgstr "Acceptera bara denna gång"
|
||||
msgstr "Acceptera bara den här gången"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/settingsTab.component.html:84
|
||||
msgid "Accessibility"
|
||||
|
2575
locale/tr-TR.po
Normal file
2575
locale/tr-TR.po
Normal file
File diff suppressed because it is too large
Load Diff
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Ukrainian\n"
|
||||
"Language: uk_UA\n"
|
||||
"PO-Revision-Date: 2023-10-06 11:30\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -100,12 +100,12 @@ msgstr "Дозволяє швидко відкрити термінал у ви
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11
|
||||
msgid "Always dark"
|
||||
msgstr ""
|
||||
msgstr "Завжди темно"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13
|
||||
msgid "Always light"
|
||||
msgstr ""
|
||||
msgstr "Завжди світити"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:2
|
||||
#: tabby-terminal/src/settings.ts:14
|
||||
@@ -185,7 +185,7 @@ msgstr "Тип фону"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/inputProcessingSettings.component.html:4
|
||||
msgid "Backspace key mode"
|
||||
msgstr ""
|
||||
msgstr "Режим клавіші Backspace"
|
||||
|
||||
#: locale/tmp-html/tabby-serial/src/components/serialProfileSettings.component.html:14
|
||||
#: tabby-serial/src/components/serialTab.component.ts:93
|
||||
@@ -530,7 +530,7 @@ msgstr "За замовчуванням \"Під'єднатись до\" тип"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:93
|
||||
msgid "Default connection type used by quick connect feature (ex. SSH, Telnet)"
|
||||
msgstr ""
|
||||
msgstr "Тип підключення за замовчуванням використовується для швидкого з'єднання (напр., SSH, Telnet)"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:8
|
||||
msgid "Default profile for new tabs"
|
||||
@@ -538,7 +538,7 @@ msgstr "Зменшити розмір поділу по вертикалі"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:16
|
||||
msgid "Default profile group settings"
|
||||
msgstr ""
|
||||
msgstr "Налаштування групи за замовчуванням"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:101
|
||||
msgid "Default profile settings"
|
||||
@@ -651,7 +651,7 @@ msgstr "Від'єднатися"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:106
|
||||
msgid "Disconnect current tab (Serial/Telnet/SSH)"
|
||||
msgstr ""
|
||||
msgstr "Відключити поточну вкладку (Serial/Telnet/SSH)"
|
||||
|
||||
#: tabby-ssh/src/components/sshTab.component.ts:198
|
||||
#: tabby-telnet/src/components/telnetTab.component.ts:81
|
||||
@@ -939,7 +939,7 @@ msgstr "З колірної схеми"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:23
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:9
|
||||
msgid "From system"
|
||||
msgstr ""
|
||||
msgstr "З системи"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/appearanceSettingsTab.component.html:44
|
||||
msgid "From theme"
|
||||
@@ -1094,7 +1094,7 @@ msgstr "Збільшити розмір поділу по вертикалі"
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:226
|
||||
#: locale/tmp-html/tabby-telnet/src/components/telnetProfileSettings.component.html:21
|
||||
msgid "Input"
|
||||
msgstr ""
|
||||
msgstr "Input"
|
||||
|
||||
#: tabby-terminal/src/components/streamProcessingSettings.component.ts:18
|
||||
msgid "Input is sent as you type"
|
||||
@@ -1321,7 +1321,7 @@ msgstr "Рідний"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:21
|
||||
msgid "New"
|
||||
msgstr ""
|
||||
msgstr "Новий"
|
||||
|
||||
#: tabby-local/src/tabContextMenu.ts:53
|
||||
msgid "New admin tab"
|
||||
@@ -1333,7 +1333,7 @@ msgstr "Нова конфігурація на {platform}"
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:144
|
||||
msgid "New group name"
|
||||
msgstr ""
|
||||
msgstr "Нова назва групи"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/loginScriptsSettings.component.html:16
|
||||
msgid "New item"
|
||||
@@ -1349,7 +1349,7 @@ msgstr "Новий профіль"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/profilesSettingsTab.component.html:24
|
||||
msgid "New profile Group"
|
||||
msgstr ""
|
||||
msgstr "Нова група профілів"
|
||||
|
||||
#: tabby-terminal/src/tabContextMenu.ts:176
|
||||
msgid "New profile name"
|
||||
@@ -1438,7 +1438,7 @@ msgstr "На GitHub Discussions"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:47
|
||||
msgid "Only close the tab when session is explicitly terminated"
|
||||
msgstr ""
|
||||
msgstr "Закривати вкладку при явному припиненні сеансу"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:46
|
||||
msgid "Opacity"
|
||||
@@ -1539,7 +1539,7 @@ msgstr "Часткова синхронізація конфігурації н
|
||||
|
||||
#: tabby-terminal/src/components/inputProcessingSettings.component.ts:17
|
||||
msgid "Pass-through"
|
||||
msgstr ""
|
||||
msgstr "Дохід"
|
||||
|
||||
#: tabby-settings/src/components/vaultSettingsTab.component.ts:92
|
||||
msgid "Passphrase for a private key with hash {hash}..."
|
||||
@@ -1697,7 +1697,7 @@ msgstr "Відновити з'єднання"
|
||||
|
||||
#: tabby-terminal/src/hotkeys.ts:102
|
||||
msgid "Reconnect current tab (Serial/Telnet/SSH)"
|
||||
msgstr ""
|
||||
msgstr "Повторне підключення поточної вкладки (Serial/Telnet/SSH)"
|
||||
|
||||
#: tabby-core/src/utils.ts:64
|
||||
msgid "Red"
|
||||
@@ -1782,11 +1782,11 @@ msgstr "Перезапустіть програму, щоб застосуват
|
||||
|
||||
#: tabby-settings/src/components/profilesSettingsTab.component.ts:316
|
||||
msgid "Restore settings to defaults ?"
|
||||
msgstr ""
|
||||
msgstr "Відновити налаштування за замовчуванням?"
|
||||
|
||||
#: tabby-settings/src/components/editProfileGroupModal.component.ts:36
|
||||
msgid "Restore settings to inherited defaults ?"
|
||||
msgstr ""
|
||||
msgstr "Відновити параметри до типових значень?"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:159
|
||||
msgid "Restore terminal tabs on app start"
|
||||
@@ -2160,7 +2160,7 @@ msgstr "Допускаються заміни."
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:19
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:5
|
||||
msgid "Switch color scheme"
|
||||
msgstr ""
|
||||
msgstr "Переключити колірну схему"
|
||||
|
||||
#: tabby-core/src/tabContextMenu.ts:290
|
||||
msgid "Switch profile"
|
||||
@@ -2288,7 +2288,7 @@ msgstr "Це застосовується до всіх профілів зад
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileGroupModal.component.html:17
|
||||
msgid "These apply to all profiles of a given type in this group"
|
||||
msgstr ""
|
||||
msgstr "До всіх профілів даного типу в цій групі"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/windowSettingsTab.component.html:59
|
||||
msgid "Thin"
|
||||
@@ -2474,7 +2474,7 @@ msgstr "Що нового"
|
||||
|
||||
#: locale/tmp-html/tabby-settings/src/components/editProfileModal.component.html:46
|
||||
msgid "When a session ends"
|
||||
msgstr ""
|
||||
msgstr "Коли сесія закінчиться"
|
||||
|
||||
#: locale/tmp-html/tabby-terminal/src/components/terminalSettingsTab.component.html:82
|
||||
msgid "When enabled, links are only clickable while holding this key"
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Chinese Simplified\n"
|
||||
"Language: zh_CN\n"
|
||||
"PO-Revision-Date: 2023-10-06 11:30\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -100,7 +100,7 @@ msgstr "允许在选定的文件夹中快速打开终端"
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:25
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:11
|
||||
msgid "Always dark"
|
||||
msgstr ""
|
||||
msgstr "始终使用暗色"
|
||||
|
||||
#: locale/tmp-html/tabby-core/src/components/welcomeTab.component.html:27
|
||||
#: locale/tmp-html/tabby-terminal/src/components/colorSchemeSettingsTab.component.html:13
|
||||
|
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"Project-Id-Version: tabby\n"
|
||||
"Language-Team: Chinese Traditional\n"
|
||||
"Language: zh_TW\n"
|
||||
"PO-Revision-Date: 2023-11-04 21:09\n"
|
||||
"PO-Revision-Date: 2024-07-10 09:04\n"
|
||||
|
||||
#: tabby-local/src/components/terminalTab.component.ts:113
|
||||
msgid "\"{command}\" is still running. Close?"
|
||||
@@ -1039,7 +1039,7 @@ msgstr "主機"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/sshProfileSettings.component.html:206
|
||||
msgid "Host key"
|
||||
msgstr "快速鍵"
|
||||
msgstr "主機金鑰"
|
||||
|
||||
#: locale/tmp-html/tabby-ssh/src/components/hostKeyPromptModal.component.html:3
|
||||
msgid "Host key verification"
|
||||
|
@@ -39,7 +39,7 @@
|
||||
"cross-env": "7.0.3",
|
||||
"css-loader": "^6.7.3",
|
||||
"deep-equal": "2.0.5",
|
||||
"electron": "^27.0.4",
|
||||
"electron": "^29",
|
||||
"electron-builder": "^24.6.4",
|
||||
"electron-download": "^4.1.1",
|
||||
"electron-installer-snap": "^5.1.0",
|
||||
@@ -53,9 +53,9 @@
|
||||
"html-loader": "4.2.0",
|
||||
"json-loader": "^0.5.7",
|
||||
"lru-cache": "^6.0.0",
|
||||
"macos-release": "^3.1.0",
|
||||
"macos-release": "^3.3.0",
|
||||
"ngx-toastr": "^16.0.2",
|
||||
"node-abi": "^3.51.0",
|
||||
"node-abi": "^3.65.0",
|
||||
"npmlog": "6.0.2",
|
||||
"npx": "^10.2.2",
|
||||
"patch-package": "^6.4.7",
|
||||
@@ -76,7 +76,6 @@
|
||||
"source-code-pro": "^2.38.0",
|
||||
"source-map-loader": "^4.0.1",
|
||||
"source-sans-pro": "3.6.0",
|
||||
"ssh2": "^1.14.0",
|
||||
"style-loader": "^3.3.1",
|
||||
"svg-inline-loader": "^0.8.2",
|
||||
"thenby": "^1.3.4",
|
||||
|
@@ -1,39 +0,0 @@
|
||||
diff --git a/node_modules/ssh2/lib/protocol/keyParser.js b/node_modules/ssh2/lib/protocol/keyParser.js
|
||||
index 9860e3f..ee82e51 100644
|
||||
--- a/node_modules/ssh2/lib/protocol/keyParser.js
|
||||
+++ b/node_modules/ssh2/lib/protocol/keyParser.js
|
||||
@@ -15,6 +15,7 @@ const {
|
||||
sign: sign_,
|
||||
verify: verify_,
|
||||
} = require('crypto');
|
||||
+const { createVerify: createVerifyDSS } = require('browserify-sign')
|
||||
const supportedOpenSSLCiphers = getCiphers();
|
||||
|
||||
const { Ber } = require('asn1');
|
||||
@@ -404,6 +405,17 @@ const BaseKey = {
|
||||
return new Error('No public key available');
|
||||
if (!algo || typeof algo !== 'string')
|
||||
algo = this[SYM_HASH_ALGO];
|
||||
+
|
||||
+ if (algo === 'dss1') {
|
||||
+ const verifier = createVerifyDSS('DSA-SHA1');
|
||||
+ verifier.update(data);
|
||||
+ try {
|
||||
+ return verifier.verify(pem, signature);
|
||||
+ } catch (ex) {
|
||||
+ return ex;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
try {
|
||||
return verify_(algo, data, pem, signature);
|
||||
} catch (ex) {
|
||||
@@ -1343,7 +1355,7 @@ function parseDER(data, baseType, comment, fullType) {
|
||||
return new Error('Malformed OpenSSH public key');
|
||||
pubPEM = genOpenSSLDSAPub(p, q, g, y);
|
||||
pubSSH = genOpenSSHDSAPub(p, q, g, y);
|
||||
- algo = 'sha1';
|
||||
+ algo = 'dss1';
|
||||
break;
|
||||
}
|
||||
case 'ssh-ed25519': {
|
@@ -24,6 +24,7 @@ builder({
|
||||
config: {
|
||||
extraMetadata: {
|
||||
version: vars.version,
|
||||
teamId: process.env.APPLE_TEAM_ID,
|
||||
},
|
||||
mac: {
|
||||
identity: !process.env.CI || process.env.CSC_LINK ? undefined : null,
|
||||
|
@@ -3,7 +3,7 @@ import * as fs from 'fs'
|
||||
import * as semver from 'semver'
|
||||
import * as childProcess from 'child_process'
|
||||
|
||||
process.env.ARCH = ((process.env.ARCH || process.arch) === 'arm') ? 'armv7l' : process.env.ARCH || process.arch
|
||||
process.env.ARCH = ((process.env.ARCH || process.arch) === 'arm') ? 'armv7l' : (process.env.ARCH || process.arch)
|
||||
|
||||
import * as url from 'url'
|
||||
const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
|
||||
|
@@ -10,7 +10,7 @@ export { Theme } from './theme'
|
||||
export { TabContextMenuItemProvider } from './tabContextMenuProvider'
|
||||
export { SelectorOption } from './selector'
|
||||
export { CLIHandler, CLIEvent } from './cli'
|
||||
export { PlatformService, ClipboardContent, MessageBoxResult, MessageBoxOptions, FileDownload, FileUpload, FileTransfer, HTMLFileUpload, FileUploadOptions } from './platform'
|
||||
export { PlatformService, ClipboardContent, MessageBoxResult, MessageBoxOptions, FileDownload, FileUpload, FileTransfer, HTMLFileUpload, FileUploadOptions, DirectoryUpload } from './platform'
|
||||
export { MenuItemOptions } from './menu'
|
||||
export { BootstrapData, PluginInfo, BOOTSTRAP_DATA } from './mainProcess'
|
||||
export { HostWindowService } from './hostWindow'
|
||||
|
@@ -63,22 +63,24 @@ export abstract class FileTransfer {
|
||||
}
|
||||
|
||||
export abstract class FileDownload extends FileTransfer {
|
||||
abstract write (buffer: Buffer): Promise<void>
|
||||
abstract write (buffer: Uint8Array): Promise<void>
|
||||
}
|
||||
|
||||
export abstract class FileUpload extends FileTransfer {
|
||||
abstract read (): Promise<Buffer>
|
||||
abstract read (): Promise<Uint8Array>
|
||||
|
||||
async readAll (): Promise<Buffer> {
|
||||
const buffers: Buffer[] = []
|
||||
async readAll (): Promise<Uint8Array> {
|
||||
const result = new Uint8Array(this.getSize())
|
||||
let pos = 0
|
||||
while (true) {
|
||||
const buf = await this.read()
|
||||
if (!buf.length) {
|
||||
break
|
||||
}
|
||||
buffers.push(Buffer.from(buf))
|
||||
result.set(buf, pos)
|
||||
pos += buf.length
|
||||
}
|
||||
return Buffer.concat(buffers)
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,6 +88,26 @@ export interface FileUploadOptions {
|
||||
multiple: boolean
|
||||
}
|
||||
|
||||
export class DirectoryUpload {
|
||||
private childrens: (FileUpload|DirectoryUpload)[] = []
|
||||
|
||||
constructor (private name = '') {
|
||||
// Just set name for now.
|
||||
}
|
||||
|
||||
getName (): string {
|
||||
return this.name
|
||||
}
|
||||
|
||||
getChildrens (): (FileUpload|DirectoryUpload)[] {
|
||||
return this.childrens
|
||||
}
|
||||
|
||||
pushChildren (item: FileUpload|DirectoryUpload): void {
|
||||
this.childrens.push(item)
|
||||
}
|
||||
}
|
||||
|
||||
export type PlatformTheme = 'light'|'dark'
|
||||
|
||||
export abstract class PlatformService {
|
||||
@@ -106,23 +128,54 @@ export abstract class PlatformService {
|
||||
|
||||
abstract startDownload (name: string, mode: number, size: number): Promise<FileDownload|null>
|
||||
abstract startUpload (options?: FileUploadOptions): Promise<FileUpload[]>
|
||||
abstract startUploadDirectory (paths?: string[]): Promise<DirectoryUpload>
|
||||
|
||||
async startUploadFromDragEvent (event: DragEvent, multiple = false): Promise<DirectoryUpload> {
|
||||
const result = new DirectoryUpload()
|
||||
|
||||
startUploadFromDragEvent (event: DragEvent, multiple = false): FileUpload[] {
|
||||
const result: FileUpload[] = []
|
||||
if (!event.dataTransfer) {
|
||||
return []
|
||||
return Promise.resolve(result)
|
||||
}
|
||||
|
||||
const traverseFileTree = (item: any, root: DirectoryUpload = result): Promise<void> => {
|
||||
return new Promise((resolve) => {
|
||||
if (item.isFile) {
|
||||
item.file((file: File) => {
|
||||
const transfer = new HTMLFileUpload(file)
|
||||
this.fileTransferStarted.next(transfer)
|
||||
root.pushChildren(transfer)
|
||||
resolve()
|
||||
})
|
||||
} else if (item.isDirectory) {
|
||||
const dirReader = item.createReader()
|
||||
const childrenFolder = new DirectoryUpload(item.name)
|
||||
dirReader.readEntries(async (entries: any[]) => {
|
||||
for (const entry of entries) {
|
||||
await traverseFileTree(entry, childrenFolder)
|
||||
}
|
||||
resolve()
|
||||
})
|
||||
root.pushChildren(childrenFolder)
|
||||
} else {
|
||||
resolve()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const promises: Promise<void>[] = []
|
||||
|
||||
const items = event.dataTransfer.items
|
||||
// eslint-disable-next-line @typescript-eslint/prefer-for-of
|
||||
for (let i = 0; i < event.dataTransfer.files.length; i++) {
|
||||
const file = event.dataTransfer.files[i]
|
||||
const transfer = new HTMLFileUpload(file)
|
||||
this.fileTransferStarted.next(transfer)
|
||||
result.push(transfer)
|
||||
if (!multiple) {
|
||||
break
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
const item = items[i].webkitGetAsEntry()
|
||||
if (item) {
|
||||
promises.push(traverseFileTree(item))
|
||||
if (!multiple) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
return result
|
||||
return Promise.all(promises).then(() => result)
|
||||
}
|
||||
|
||||
getConfigPath (): string|null {
|
||||
@@ -210,12 +263,12 @@ export class HTMLFileUpload extends FileUpload {
|
||||
return this.file.size
|
||||
}
|
||||
|
||||
async read (): Promise<Buffer> {
|
||||
async read (): Promise<Uint8Array> {
|
||||
const result: any = await this.reader.read()
|
||||
if (result.done || !result.value) {
|
||||
return Buffer.from('')
|
||||
return new Uint8Array(0)
|
||||
}
|
||||
const chunk = Buffer.from(result.value)
|
||||
const chunk = new Uint8Array(result.value)
|
||||
this.increaseProgress(chunk.length)
|
||||
return chunk
|
||||
}
|
||||
|
@@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'
|
||||
import { HostAppService } from './api/hostApp'
|
||||
import { CLIHandler, CLIEvent } from './api/cli'
|
||||
import { HostWindowService } from './api/hostWindow'
|
||||
import { QuickConnectProfileProvider } from './api/profileProvider'
|
||||
import { ProfilesService } from './services/profiles.service'
|
||||
|
||||
@Injectable()
|
||||
@@ -27,6 +28,10 @@ export class ProfileCLIHandler extends CLIHandler {
|
||||
this.handleOpenRecentProfile(event.argv.profileNumber)
|
||||
return true
|
||||
}
|
||||
if (op === 'quickConnect') {
|
||||
this.handleOpenQuickConnect(event.argv.providerId, event.argv.query)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -48,6 +53,21 @@ export class ProfileCLIHandler extends CLIHandler {
|
||||
this.profiles.openNewTabForProfile(profiles[profileNumber])
|
||||
this.hostWindow.bringToFront()
|
||||
}
|
||||
|
||||
private async handleOpenQuickConnect (providerId: string, query: string) {
|
||||
const provider = this.profiles.getProviders().find(x => x.id === providerId)
|
||||
if(!provider || !(provider instanceof QuickConnectProfileProvider)) {
|
||||
console.error(`Requested provider "${providerId}" not found`)
|
||||
return
|
||||
}
|
||||
const profile = provider.quickConnect(query)
|
||||
if(!profile) {
|
||||
console.error(`Could not parse quick connect query "${query}"`)
|
||||
return
|
||||
}
|
||||
this.profiles.openNewTabForProfile(profile)
|
||||
this.hostWindow.bringToFront()
|
||||
}
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
|
@@ -1,4 +1,4 @@
|
||||
import { Observable, Subject, distinctUntilChanged, filter, debounceTime } from 'rxjs'
|
||||
import { Observable, Subject, BehaviorSubject, distinctUntilChanged, filter, debounceTime } from 'rxjs'
|
||||
import { EmbeddedViewRef, Injector, ViewContainerRef, ViewRef } from '@angular/core'
|
||||
import { RecoveryToken } from '../api/tabRecovery'
|
||||
import { BaseComponent } from './base.component'
|
||||
@@ -75,9 +75,9 @@ export abstract class BaseTabComponent extends BaseComponent {
|
||||
private titleChange = new Subject<string>()
|
||||
private focused = new Subject<void>()
|
||||
private blurred = new Subject<void>()
|
||||
private visibility = new Subject<boolean>()
|
||||
private progress = new Subject<number|null>()
|
||||
private activity = new Subject<boolean>()
|
||||
protected visibility = new BehaviorSubject<boolean>(false)
|
||||
protected progress = new BehaviorSubject<number|null>(null)
|
||||
protected activity = new BehaviorSubject<boolean>(false)
|
||||
private destroyed = new Subject<void>()
|
||||
|
||||
private _destroyCalled = false
|
||||
@@ -128,7 +128,7 @@ export abstract class BaseTabComponent extends BaseComponent {
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the acticity marker on the tab header
|
||||
* Shows the activity marker on the tab header
|
||||
*/
|
||||
displayActivity (): void {
|
||||
if (!this.hasActivity) {
|
||||
@@ -138,7 +138,7 @@ export abstract class BaseTabComponent extends BaseComponent {
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the acticity marker from the tab header
|
||||
* Removes the activity marker from the tab header
|
||||
*/
|
||||
clearActivity (): void {
|
||||
if (this.hasActivity) {
|
||||
@@ -195,7 +195,10 @@ export abstract class BaseTabComponent extends BaseComponent {
|
||||
if (!this.viewContainer || !this.viewContainerEmbeddedRef) {
|
||||
return
|
||||
}
|
||||
this.viewContainer.detach(this.viewContainer.indexOf(this.viewContainerEmbeddedRef))
|
||||
const viewIndex = this.viewContainer.indexOf(this.viewContainerEmbeddedRef)
|
||||
if (viewIndex !== -1) {
|
||||
this.viewContainer.detach(viewIndex)
|
||||
}
|
||||
this.viewContainerEmbeddedRef = undefined
|
||||
this.viewContainer = undefined
|
||||
}
|
||||
@@ -226,7 +229,6 @@ export abstract class BaseTabComponent extends BaseComponent {
|
||||
this.destroyed.next()
|
||||
}
|
||||
this.destroyed.complete()
|
||||
this.hostView.destroy()
|
||||
}
|
||||
|
||||
/** @hidden */
|
||||
|
@@ -1,4 +1,4 @@
|
||||
import { Observable, Subject } from 'rxjs'
|
||||
import { Observable, Subject, takeWhile } from 'rxjs'
|
||||
import { Component, Injectable, ViewChild, ViewContainerRef, EmbeddedViewRef, AfterViewInit, OnDestroy, Injector } from '@angular/core'
|
||||
import { BaseTabComponent, BaseTabProcess, GetRecoveryTokenOptions } from './baseTab.component'
|
||||
import { TabRecoveryProvider, RecoveryToken } from '../api/tabRecovery'
|
||||
@@ -350,7 +350,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
}
|
||||
break
|
||||
case 'close-pane':
|
||||
this.removeTab(this.focusedTab)
|
||||
this.focusedTab.destroy()
|
||||
break
|
||||
case 'pane-increase-vertical':
|
||||
this.resizePane('v')
|
||||
@@ -381,6 +381,9 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
}
|
||||
}
|
||||
}, 100)
|
||||
|
||||
// Propagate visibility to new children
|
||||
this.emitVisibility(this.visibility.value)
|
||||
}
|
||||
this.initialized.next()
|
||||
this.initialized.complete()
|
||||
@@ -471,11 +474,13 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
}
|
||||
tab.removeFromContainer()
|
||||
tab.parent = this
|
||||
|
||||
tab.emitVisibility(this.visibility.value)
|
||||
}
|
||||
|
||||
let target = relative ? this.getParentOf(relative) : null
|
||||
if (!target) {
|
||||
// Rewrap the root container just in case the orientation isn't compatibile
|
||||
// Rewrap the root container just in case the orientation isn't compatible
|
||||
target = new SplitContainer()
|
||||
target.orientation = ['l', 'r'].includes(side) ? 'h' : 'v'
|
||||
target.children = [this.root]
|
||||
@@ -767,10 +772,10 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
}
|
||||
|
||||
destroy (): void {
|
||||
super.destroy()
|
||||
for (const x of this.getAllTabs()) {
|
||||
x.destroy()
|
||||
}
|
||||
super.destroy()
|
||||
}
|
||||
|
||||
layout (): void {
|
||||
@@ -816,7 +821,13 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
if (this.disableDynamicTitle) {
|
||||
return
|
||||
}
|
||||
this.setTitle([...new Set(this.getAllTabs().map(x => x.title))].join(' | '))
|
||||
const titles = [
|
||||
this.getFocusedTab()?.title,
|
||||
...this.getAllTabs()
|
||||
.filter(x => x !== this.getFocusedTab())
|
||||
.map(x => x.title),
|
||||
]
|
||||
this.setTitle([...new Set(titles)].join(' | '))
|
||||
}
|
||||
|
||||
private attachTabView (tab: BaseTabComponent) {
|
||||
@@ -832,20 +843,42 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
})
|
||||
}
|
||||
|
||||
tab.subscribeUntilDestroyed(tab.titleChange$, () => this.updateTitle())
|
||||
tab.subscribeUntilDestroyed(tab.activity$, a => a ? this.displayActivity() : this.clearActivity())
|
||||
tab.subscribeUntilDestroyed(tab.progress$, p => this.setProgress(p))
|
||||
tab.subscribeUntilDestroyed(
|
||||
this.observeUntilChildDetached(tab, tab.focused$),
|
||||
() => this.updateTitle(),
|
||||
)
|
||||
tab.subscribeUntilDestroyed(
|
||||
this.observeUntilChildDetached(tab, tab.titleChange$),
|
||||
() => this.updateTitle(),
|
||||
)
|
||||
tab.subscribeUntilDestroyed(
|
||||
this.observeUntilChildDetached(tab, tab.activity$),
|
||||
a => a ? this.displayActivity() : this.clearActivity(),
|
||||
)
|
||||
tab.subscribeUntilDestroyed(
|
||||
this.observeUntilChildDetached(tab, tab.progress$),
|
||||
p => this.setProgress(p),
|
||||
)
|
||||
if (tab.title) {
|
||||
this.updateTitle()
|
||||
}
|
||||
tab.subscribeUntilDestroyed(tab.recoveryStateChangedHint$, () => {
|
||||
this.recoveryStateChangedHint.next()
|
||||
})
|
||||
tab.subscribeUntilDestroyed(tab.destroyed$, () => {
|
||||
tab.subscribeUntilDestroyed(
|
||||
this.observeUntilChildDetached(tab, tab.recoveryStateChangedHint$),
|
||||
() => {
|
||||
this.recoveryStateChangedHint.next()
|
||||
},
|
||||
)
|
||||
tab.destroyed$.subscribe(() => {
|
||||
this.removeTab(tab)
|
||||
})
|
||||
}
|
||||
|
||||
private observeUntilChildDetached<T> (tab: BaseTabComponent, event: Observable<T>): Observable<T> {
|
||||
return event.pipe(takeWhile(() => {
|
||||
return this.getAllTabs().includes(tab)
|
||||
}))
|
||||
}
|
||||
|
||||
private onAfterTabAdded (tab: BaseTabComponent) {
|
||||
setImmediate(() => {
|
||||
this.layout()
|
||||
|
@@ -43,6 +43,7 @@ enableWelcomeTab: true
|
||||
electronFlags:
|
||||
- ['force_discrete_gpu', '0']
|
||||
enableAutomaticUpdates: true
|
||||
hideTray: false
|
||||
version: 1
|
||||
vault: null
|
||||
encrypted: false
|
||||
|
@@ -1,5 +1,5 @@
|
||||
import { Directive, Output, ElementRef, EventEmitter, AfterViewInit } from '@angular/core'
|
||||
import { FileUpload, PlatformService } from '../api/platform'
|
||||
import { DirectoryUpload, PlatformService } from '../api/platform'
|
||||
import './dropZone.directive.scss'
|
||||
|
||||
/** @hidden */
|
||||
@@ -7,7 +7,7 @@ import './dropZone.directive.scss'
|
||||
selector: '[dropZone]',
|
||||
})
|
||||
export class DropZoneDirective implements AfterViewInit {
|
||||
@Output() transfer = new EventEmitter<FileUpload>()
|
||||
@Output() transfer = new EventEmitter<DirectoryUpload>()
|
||||
private dropHint?: HTMLElement
|
||||
|
||||
constructor (
|
||||
@@ -27,11 +27,9 @@ export class DropZoneDirective implements AfterViewInit {
|
||||
})
|
||||
}
|
||||
})
|
||||
this.el.nativeElement.addEventListener('drop', (event: DragEvent) => {
|
||||
this.el.nativeElement.addEventListener('drop', async (event: DragEvent) => {
|
||||
this.removeHint()
|
||||
for (const transfer of this.platform.startUploadFromDragEvent(event, true)) {
|
||||
this.transfer.emit(transfer)
|
||||
}
|
||||
this.transfer.emit(await this.platform.startUploadFromDragEvent(event, true))
|
||||
})
|
||||
this.el.nativeElement.addEventListener('dragleave', () => {
|
||||
this.removeHint()
|
||||
|
@@ -27,12 +27,8 @@ export class HomeBaseService {
|
||||
this.platform.openExternal('https://github.com/Eugeny/tabby')
|
||||
}
|
||||
|
||||
openDiscussions (): void {
|
||||
this.platform.openExternal('https://github.com/Eugeny/tabby/discussions')
|
||||
}
|
||||
|
||||
openTwitter (): void {
|
||||
this.platform.openExternal('https://twitter.com/eugeeeeny')
|
||||
openDiscord (): void {
|
||||
this.platform.openExternal('https://discord.gg/4c5EVTBhtp')
|
||||
}
|
||||
|
||||
openTranslations (): void {
|
||||
|
@@ -20,7 +20,9 @@ import localeKO from '@angular/common/locales/ko'
|
||||
import localePL from '@angular/common/locales/pl'
|
||||
import localePT from '@angular/common/locales/pt'
|
||||
import localeRU from '@angular/common/locales/ru'
|
||||
import localeSRSP from '@angular/common/locales/sr-Cyrl'
|
||||
import localeSV from '@angular/common/locales/sv'
|
||||
import localeTR from '@angular/common/locales/tr'
|
||||
import localeUK from '@angular/common/locales/uk'
|
||||
import localeZH from '@angular/common/locales/zh'
|
||||
import { Observable, Subject } from 'rxjs'
|
||||
@@ -45,7 +47,9 @@ registerLocaleData(localeKO)
|
||||
registerLocaleData(localePL)
|
||||
registerLocaleData(localePT)
|
||||
registerLocaleData(localeRU)
|
||||
registerLocaleData(localeSRSP)
|
||||
registerLocaleData(localeSV)
|
||||
registerLocaleData(localeTR)
|
||||
registerLocaleData(localeUK)
|
||||
registerLocaleData(localeZH)
|
||||
|
||||
@@ -136,6 +140,10 @@ export class LocaleService {
|
||||
code: 'sv-SE',
|
||||
name: 'Svenska',
|
||||
},
|
||||
{
|
||||
code: 'tr-TR',
|
||||
name: 'Türkçe',
|
||||
},
|
||||
{
|
||||
code: 'bg-BG',
|
||||
name: 'Български',
|
||||
@@ -144,6 +152,10 @@ export class LocaleService {
|
||||
code: 'ru-RU',
|
||||
name: 'Русский',
|
||||
},
|
||||
{
|
||||
code: 'sr-SP',
|
||||
name: 'Српски',
|
||||
},
|
||||
{
|
||||
code: 'uk-UA',
|
||||
name: 'Українська',
|
||||
|
@@ -40,7 +40,7 @@ export class ProfilesService {
|
||||
) { }
|
||||
|
||||
/*
|
||||
* Methods used to interract with ProfileProvider
|
||||
* Methods used to interact with ProfileProvider
|
||||
*/
|
||||
|
||||
getProviders (): ProfileProvider<Profile>[] {
|
||||
@@ -58,7 +58,7 @@ export class ProfilesService {
|
||||
}
|
||||
|
||||
/*
|
||||
* Methods used to interract with Profile
|
||||
* Methods used to interact with Profile
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -206,7 +206,7 @@ export class ProfilesService {
|
||||
}
|
||||
|
||||
/*
|
||||
* Methods used to interract with Profile Selector
|
||||
* Methods used to interact with Profile Selector
|
||||
*/
|
||||
|
||||
selectorOptionForProfile <P extends Profile, T> (profile: PartialProfile<P>): SelectorOption<T> {
|
||||
@@ -332,7 +332,7 @@ export class ProfilesService {
|
||||
}
|
||||
|
||||
/*
|
||||
* Methods used to interract with Profile/ProfileGroup/Global defaults
|
||||
* Methods used to interact with Profile/ProfileGroup/Global defaults
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -370,7 +370,7 @@ export class ProfilesService {
|
||||
}
|
||||
|
||||
/*
|
||||
* Methods used to interract with ProfileGroup
|
||||
* Methods used to interact with ProfileGroup
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@@ -37,6 +37,7 @@ export class TabsService {
|
||||
const componentRef = componentFactory.create(this.injector)
|
||||
const tab = componentRef.instance
|
||||
tab.hostView = componentRef.hostView
|
||||
tab.destroyed$.subscribe(() => componentRef.destroy())
|
||||
Object.assign(tab, params.inputs ?? {})
|
||||
return tab
|
||||
}
|
||||
|
@@ -306,7 +306,7 @@ export class VaultFileProvider extends FileProvider {
|
||||
id,
|
||||
description: `${description} (${transfer.getName()})`,
|
||||
},
|
||||
value: (await transfer.readAll()).toString('base64'),
|
||||
value: Buffer.from(await transfer.readAll()).toString('base64'),
|
||||
})
|
||||
return `${this.prefix}${id}`
|
||||
}
|
||||
|
@@ -16,7 +16,6 @@ export class ElectronService {
|
||||
clipboard: Clipboard
|
||||
globalShortcut: GlobalShortcut
|
||||
screen: Screen
|
||||
remote = remote
|
||||
process: any
|
||||
autoUpdater: AutoUpdater
|
||||
powerSaveBlocker: PowerSaveBlocker
|
||||
@@ -44,7 +43,6 @@ export class ElectronService {
|
||||
this.BrowserWindow = remote.BrowserWindow
|
||||
this.Menu = remote.Menu
|
||||
this.MenuItem = remote.MenuItem
|
||||
this.MenuItem = remote.MenuItem
|
||||
this.nativeTheme = remote.nativeTheme
|
||||
}
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@ import * as os from 'os'
|
||||
import promiseIpc, { RendererProcessType } from 'electron-promise-ipc'
|
||||
import { execFile } from 'mz/child_process'
|
||||
import { Injectable, NgZone } from '@angular/core'
|
||||
import { PlatformService, ClipboardContent, Platform, MenuItemOptions, MessageBoxOptions, MessageBoxResult, FileUpload, FileDownload, FileUploadOptions, wrapPromise, TranslateService } from 'tabby-core'
|
||||
import { PlatformService, ClipboardContent, Platform, MenuItemOptions, MessageBoxOptions, MessageBoxResult, DirectoryUpload, FileUpload, FileDownload, FileUploadOptions, wrapPromise, TranslateService } from 'tabby-core'
|
||||
import { ElectronService } from '../services/electron.service'
|
||||
import { ElectronHostWindow } from './hostWindow.service'
|
||||
import { ShellIntegrationService } from './shellIntegration.service'
|
||||
@@ -48,6 +48,21 @@ export class ElectronPlatformService extends PlatformService {
|
||||
})
|
||||
}
|
||||
|
||||
async getAllFiles (dir: string, root: DirectoryUpload): Promise<DirectoryUpload> {
|
||||
const items = await fs.readdir(dir, { withFileTypes: true })
|
||||
for (const item of items) {
|
||||
if (item.isDirectory()) {
|
||||
root.pushChildren(await this.getAllFiles(path.join(dir, item.name), new DirectoryUpload(item.name)))
|
||||
} else {
|
||||
const file = new ElectronFileUpload(path.join(dir, item.name), this.electron)
|
||||
root.pushChildren(file)
|
||||
await wrapPromise(this.zone, file.open())
|
||||
this.fileTransferStarted.next(file)
|
||||
}
|
||||
}
|
||||
return root
|
||||
}
|
||||
|
||||
readClipboard (): string {
|
||||
return this.electron.clipboard.readText()
|
||||
}
|
||||
@@ -216,6 +231,28 @@ export class ElectronPlatformService extends PlatformService {
|
||||
}))
|
||||
}
|
||||
|
||||
async startUploadDirectory (paths?: string[]): Promise<DirectoryUpload> {
|
||||
const properties: any[] = ['openFile', 'treatPackageAsDirectory', 'openDirectory']
|
||||
|
||||
if (!paths) {
|
||||
const result = await this.electron.dialog.showOpenDialog(
|
||||
this.hostWindow.getWindow(),
|
||||
{
|
||||
buttonLabel: this.translate.instant('Select'),
|
||||
properties,
|
||||
},
|
||||
)
|
||||
if (result.canceled) {
|
||||
return new DirectoryUpload()
|
||||
}
|
||||
paths = result.filePaths
|
||||
}
|
||||
|
||||
const root = new DirectoryUpload()
|
||||
root.pushChildren(await this.getAllFiles(paths[0].split(path.sep).join(path.posix.sep), new DirectoryUpload(path.basename(paths[0]))))
|
||||
return root
|
||||
}
|
||||
|
||||
async startDownload (name: string, mode: number, size: number, filePath?: string): Promise<FileDownload|null> {
|
||||
if (!filePath) {
|
||||
const result = await this.electron.dialog.showSaveDialog(
|
||||
@@ -263,12 +300,12 @@ class ElectronFileUpload extends FileUpload {
|
||||
private size: number
|
||||
private mode: number
|
||||
private file: fs.FileHandle
|
||||
private buffer: Buffer
|
||||
private buffer: Uint8Array
|
||||
private powerSaveBlocker = 0
|
||||
|
||||
constructor (private filePath: string, private electron: ElectronService) {
|
||||
super()
|
||||
this.buffer = Buffer.alloc(256 * 1024)
|
||||
this.buffer = new Uint8Array(256 * 1024)
|
||||
this.powerSaveBlocker = electron.powerSaveBlocker.start('prevent-app-suspension')
|
||||
}
|
||||
|
||||
@@ -291,7 +328,7 @@ class ElectronFileUpload extends FileUpload {
|
||||
return this.size
|
||||
}
|
||||
|
||||
async read (): Promise<Buffer> {
|
||||
async read (): Promise<Uint8Array> {
|
||||
const result = await this.file.read(this.buffer, 0, this.buffer.length, null)
|
||||
this.increaseProgress(result.bytesRead)
|
||||
return this.buffer.slice(0, result.bytesRead)
|
||||
@@ -333,7 +370,7 @@ class ElectronFileDownload extends FileDownload {
|
||||
return this.size
|
||||
}
|
||||
|
||||
async write (buffer: Buffer): Promise<void> {
|
||||
async write (buffer: Uint8Array): Promise<void> {
|
||||
let pos = 0
|
||||
while (pos < buffer.length) {
|
||||
const result = await this.file.write(buffer, pos, buffer.length - pos, null)
|
||||
|
@@ -1,4 +1,3 @@
|
||||
import type { AppUpdater } from 'electron-updater'
|
||||
import { Injectable } from '@angular/core'
|
||||
import axios from 'axios'
|
||||
|
||||
@@ -13,7 +12,6 @@ export class ElectronUpdaterService extends UpdaterService {
|
||||
private downloaded: Promise<boolean>
|
||||
private electronUpdaterAvailable = true
|
||||
private updateURL: string
|
||||
private autoUpdater: AppUpdater
|
||||
|
||||
constructor (
|
||||
log: LogService,
|
||||
@@ -30,32 +28,28 @@ export class ElectronUpdaterService extends UpdaterService {
|
||||
return
|
||||
}
|
||||
|
||||
this.autoUpdater = electron.remote.require('electron-updater').autoUpdater
|
||||
this.autoUpdater.autoDownload = true
|
||||
this.autoUpdater.autoInstallOnAppQuit = false
|
||||
|
||||
this.autoUpdater.on('update-available', () => {
|
||||
this.electron.ipcRenderer.on('updater:update-available', () => {
|
||||
this.logger.info('Update available')
|
||||
})
|
||||
|
||||
this.autoUpdater.on('update-not-available', () => {
|
||||
this.electron.ipcRenderer.on('updater:update-not-available', () => {
|
||||
this.logger.info('No updates')
|
||||
})
|
||||
|
||||
this.autoUpdater.on('error', err => {
|
||||
this.electron.ipcRenderer.on('updater:error', err => {
|
||||
this.logger.error(err)
|
||||
this.electronUpdaterAvailable = false
|
||||
})
|
||||
|
||||
this.downloaded = new Promise<boolean>(resolve => {
|
||||
this.autoUpdater.once('update-downloaded', () => resolve(true))
|
||||
this.electron.ipcRenderer.once('updater:update-downloaded', () => resolve(true))
|
||||
})
|
||||
|
||||
config.ready$.toPromise().then(() => {
|
||||
if (config.store.enableAutomaticUpdates && this.electronUpdaterAvailable && !process.env.TABBY_DEV) {
|
||||
this.logger.debug('Checking for updates')
|
||||
try {
|
||||
this.autoUpdater.checkForUpdates()
|
||||
this.electron.ipcRenderer.send('updater:check-for-updates')
|
||||
} catch (e) {
|
||||
this.electronUpdaterAvailable = false
|
||||
this.logger.info('Electron updater unavailable, falling back', e)
|
||||
@@ -82,26 +76,26 @@ export class ElectronUpdaterService extends UpdaterService {
|
||||
reject(err)
|
||||
}
|
||||
cancel = () => {
|
||||
this.autoUpdater.off('error', onError)
|
||||
this.autoUpdater.off('update-not-available', onNoUpdate)
|
||||
this.autoUpdater.off('update-available', onUpdate)
|
||||
this.electron.ipcRenderer.off('updater:error', onError)
|
||||
this.electron.ipcRenderer.off('updater:update-not-available', onNoUpdate)
|
||||
this.electron.ipcRenderer.off('updater:update-available', onUpdate)
|
||||
}
|
||||
this.autoUpdater.on('error', onError)
|
||||
this.autoUpdater.on('update-not-available', onNoUpdate)
|
||||
this.autoUpdater.on('update-available', onUpdate)
|
||||
this.electron.ipcRenderer.on('updater:error', onError)
|
||||
this.electron.ipcRenderer.on('updater:update-not-available', onNoUpdate)
|
||||
this.electron.ipcRenderer.on('updater:update-available', onUpdate)
|
||||
try {
|
||||
this.autoUpdater.checkForUpdates()
|
||||
this.electron.ipcRenderer.send('updater:check-for-updates')
|
||||
} catch (e) {
|
||||
this.electronUpdaterAvailable = false
|
||||
this.logger.info('Electron updater unavailable, falling back', e)
|
||||
}
|
||||
})
|
||||
|
||||
this.autoUpdater.on('update-available', () => {
|
||||
this.electron.ipcRenderer.on('updater:update-available', () => {
|
||||
this.logger.info('Update available')
|
||||
})
|
||||
|
||||
this.autoUpdater.once('update-not-available', () => {
|
||||
this.electron.ipcRenderer.once('updater:update-not-available', () => {
|
||||
this.logger.info('No updates')
|
||||
})
|
||||
|
||||
@@ -138,7 +132,7 @@ export class ElectronUpdaterService extends UpdaterService {
|
||||
},
|
||||
)).response === 0) {
|
||||
await this.downloaded
|
||||
this.autoUpdater.quitAndInstall()
|
||||
this.electron.ipcRenderer.send('updater:quit-and-install')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -49,19 +49,24 @@ export class EditSFTPContextMenu extends SFTPContextMenuItemProvider {
|
||||
this.platform.openPath(tempPath)
|
||||
|
||||
const events = new Subject<string>()
|
||||
const watcher = fs.watch(tempPath, event => events.next(event))
|
||||
events.pipe(debounceTime(1000), debounce(async event => {
|
||||
if (event === 'rename') {
|
||||
watcher.close()
|
||||
}
|
||||
const upload = await this.platform.startUpload({ multiple: false }, [tempPath])
|
||||
if (!upload.length) {
|
||||
return
|
||||
}
|
||||
await sftp.upload(item.fullPath, upload[0])
|
||||
await sftp.chmod(item.fullPath, item.mode)
|
||||
})).subscribe()
|
||||
watcher.on('close', () => events.complete())
|
||||
sftp.closed$.subscribe(() => watcher.close())
|
||||
fs.chmodSync(tempPath, 0o700)
|
||||
|
||||
// skip the first burst of events
|
||||
setTimeout(() => {
|
||||
const watcher = fs.watch(tempPath, event => events.next(event))
|
||||
events.pipe(debounceTime(1000), debounce(async event => {
|
||||
if (event === 'rename') {
|
||||
watcher.close()
|
||||
}
|
||||
const upload = await this.platform.startUpload({ multiple: false }, [tempPath])
|
||||
if (!upload.length) {
|
||||
return
|
||||
}
|
||||
await sftp.upload(item.fullPath, upload[0])
|
||||
await sftp.chmod(item.fullPath, item.mode)
|
||||
})).subscribe()
|
||||
watcher.on('close', () => events.complete())
|
||||
sftp.closed$.subscribe(() => watcher.close())
|
||||
}, 1000)
|
||||
}
|
||||
}
|
||||
|
@@ -18,7 +18,7 @@
|
||||
"author": "Eugene Pankov",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"untildify": "^4.0.0",
|
||||
"xterm-addon-web-links": "^0.7.0"
|
||||
"@xterm/addon-web-links": "^0.10.0",
|
||||
"untildify": "^4.0.0"
|
||||
}
|
||||
}
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import { Inject, Injectable } from '@angular/core'
|
||||
import { ConfigService, PlatformService } from 'tabby-core'
|
||||
import { TerminalDecorator, BaseTerminalTabComponent, XTermFrontend } from 'tabby-terminal'
|
||||
import { WebLinksAddon } from 'xterm-addon-web-links'
|
||||
import { WebLinksAddon } from '@xterm/addon-web-links'
|
||||
import { LinkHandler } from './api'
|
||||
|
||||
@Injectable()
|
||||
|
@@ -2,12 +2,12 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@xterm/addon-web-links@^0.10.0":
|
||||
version "0.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@xterm/addon-web-links/-/addon-web-links-0.10.0.tgz#be3eccaf1cbd4063161458205cd4bbee2b0f34f9"
|
||||
integrity sha512-QhrHCUr8w6ATGviyXwcAIM1qN3nD1hdxwMC8fsW7z/6aaQlb2nt7zmByJt4eOn7ZzrHOzczljqV5S2pkdQp2xw==
|
||||
|
||||
untildify@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b"
|
||||
integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==
|
||||
|
||||
xterm-addon-web-links@^0.7.0:
|
||||
version "0.7.0"
|
||||
resolved "https://registry.yarnpkg.com/xterm-addon-web-links/-/xterm-addon-web-links-0.7.0.tgz#dceac36170605f9db10a01d716bd83ee38f65c17"
|
||||
integrity sha512-6PqoqzzPwaeSq22skzbvyboDvSnYk5teUYEoKBwMYvhbkwOQkemZccjWHT5FnNA8o1aInTc4PRYAl4jjPucCKA==
|
||||
|
@@ -132,7 +132,9 @@ export class AutoOpenTabCLIHandler extends CLIHandler {
|
||||
async handle (event: CLIEvent): Promise<boolean> {
|
||||
if (!event.secondInstance && this.config.store.terminal.autoOpen && !this.config.store.enableWelcomeTab) {
|
||||
this.app.ready$.subscribe(() => {
|
||||
this.terminal.openTab()
|
||||
if (this.app.tabs.length === 0) {
|
||||
this.terminal.openTab()
|
||||
}
|
||||
})
|
||||
return true
|
||||
}
|
||||
|
@@ -40,11 +40,11 @@
|
||||
div(translate) Report a problem
|
||||
small.text-muted(translate) Generate a pre-filled GitHub issue
|
||||
|
||||
button.list-group-item.list-group-item-action.link-card((click)='homeBase.openDiscussions()')
|
||||
i.fas.fa-fw.fa-comments
|
||||
button.list-group-item.list-group-item-action.link-card((click)='homeBase.openDiscord()')
|
||||
i.fab.fa-fw.fa-discord
|
||||
div
|
||||
div(translate) Ask a question
|
||||
small.text-muted(translate) On GitHub Discussions
|
||||
div(translate) Community
|
||||
small.text-muted(translate) On Discord
|
||||
|
||||
button.list-group-item.list-group-item-action.link-card((click)='homeBase.openGitHub()')
|
||||
i.fab.fa-fw.fa-github
|
||||
@@ -58,12 +58,6 @@
|
||||
div(translate) What's new
|
||||
small.text-muted(translate) Show release notes
|
||||
|
||||
button.list-group-item.list-group-item-action.link-card((click)='homeBase.openTwitter()')
|
||||
i.fab.fa-fw.fa-twitter
|
||||
div
|
||||
div(translate) Subscribe to updates
|
||||
small.text-muted(translate) Tabby news and updates on Twitter
|
||||
|
||||
|
||||
h3(translate) Application settings
|
||||
.form-line
|
||||
|
@@ -123,7 +123,7 @@ export class VaultSettingsTabComponent extends BaseComponent {
|
||||
}
|
||||
await this.vault.updateSecret(secret, {
|
||||
...secret,
|
||||
value: (await transfers[0].readAll()).toString('base64'),
|
||||
value: Buffer.from(await transfers[0].readAll()).toString('base64'),
|
||||
})
|
||||
this.loadVault()
|
||||
}
|
||||
|
@@ -121,6 +121,15 @@ h3.mb-3(translate) Window
|
||||
label.btn.btn-secondary(for='frameFull')
|
||||
span(translate) Full
|
||||
|
||||
.form-line(*ngIf='hostApp.platform !== Platform.Web && hostApp.platform !== Platform.Linux')
|
||||
.header
|
||||
.title(translate) Hide tray
|
||||
.description(translate) Hide Tabby in tray or menu bar.
|
||||
toggle(
|
||||
[(ngModel)]='config.store.hideTray',
|
||||
(ngModelChange)='saveConfiguration(true)'
|
||||
)
|
||||
|
||||
h3.mt-4(translate) Docking
|
||||
|
||||
.form-line(*ngIf='docking')
|
||||
|
@@ -184,13 +184,17 @@ export class ConfigSyncService {
|
||||
|
||||
private async autoSync () {
|
||||
while (true) {
|
||||
if (this.isEnabled() && this.config.store.configSync.auto) {
|
||||
const cfg = await this.getConfig(this.config.store.configSync.configID)
|
||||
if (new Date(cfg.modified_at) > this.lastRemoteChange) {
|
||||
this.logger.info('Remote config changed, downloading')
|
||||
this.download()
|
||||
this.lastRemoteChange = new Date(cfg.modified_at)
|
||||
try {
|
||||
if (this.isEnabled() && this.config.store.configSync.auto) {
|
||||
const cfg = await this.getConfig(this.config.store.configSync.configID)
|
||||
if (new Date(cfg.modified_at) > this.lastRemoteChange) {
|
||||
this.logger.info('Remote config changed, downloading')
|
||||
this.download()
|
||||
this.lastRemoteChange = new Date(cfg.modified_at)
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
this.logger.debug('Recovering from autoSync network error')
|
||||
}
|
||||
await new Promise(resolve => setTimeout(resolve, 60000))
|
||||
}
|
||||
|
@@ -11,22 +11,17 @@
|
||||
"build": "webpack --progress --color",
|
||||
"watch": "webpack --progress --color --watch",
|
||||
"postinstall": "run-script-os",
|
||||
"postinstall:darwin:linux": "exit",
|
||||
"postinstall:win32": "xcopy /i /y ..\\node_modules\\ssh2\\util\\pagent.exe util\\"
|
||||
"postinstall:darwin:linux": "exit"
|
||||
},
|
||||
"files": [
|
||||
"dist",
|
||||
"util/pagent.exe",
|
||||
"typings"
|
||||
],
|
||||
"author": "Eugene Pankov",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@types/node": "20.3.1",
|
||||
"@types/ssh2": "^0.5.46",
|
||||
"ansi-colors": "^4.1.1",
|
||||
"diffie-hellman": "^5.0.3",
|
||||
"sshpk": "Eugeny/node-sshpk#c2b71d1243714d2daf0988f84c3323d180817136",
|
||||
"strip-ansi": "^7.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
@@ -45,5 +40,8 @@
|
||||
"tabby-core": "*",
|
||||
"tabby-settings": "*",
|
||||
"tabby-terminal": "*"
|
||||
},
|
||||
"resolutions": {
|
||||
"glob": "7.2.3"
|
||||
}
|
||||
}
|
||||
|
@@ -1,20 +1,45 @@
|
||||
import * as ALGORITHMS from 'ssh2/lib/protocol/constants'
|
||||
import { ALGORITHM_BLACKLIST, SSHAlgorithmType } from './api'
|
||||
import * as russh from 'russh'
|
||||
import { SSHAlgorithmType } from './api'
|
||||
|
||||
// Counteracts https://github.com/mscdex/ssh2/commit/f1b5ac3c81734c194740016eab79a699efae83d8
|
||||
ALGORITHMS.DEFAULT_CIPHER.push('aes128-gcm')
|
||||
ALGORITHMS.DEFAULT_CIPHER.push('aes256-gcm')
|
||||
ALGORITHMS.SUPPORTED_CIPHER.push('aes128-gcm')
|
||||
ALGORITHMS.SUPPORTED_CIPHER.push('aes256-gcm')
|
||||
|
||||
export const supportedAlgorithms: Record<string, string> = {}
|
||||
|
||||
for (const k of Object.values(SSHAlgorithmType)) {
|
||||
const supportedAlg = {
|
||||
[SSHAlgorithmType.KEX]: 'SUPPORTED_KEX',
|
||||
[SSHAlgorithmType.HOSTKEY]: 'SUPPORTED_SERVER_HOST_KEY',
|
||||
[SSHAlgorithmType.CIPHER]: 'SUPPORTED_CIPHER',
|
||||
[SSHAlgorithmType.HMAC]: 'SUPPORTED_MAC',
|
||||
}[k]
|
||||
supportedAlgorithms[k] = ALGORITHMS[supportedAlg].filter(x => !ALGORITHM_BLACKLIST.includes(x)).sort()
|
||||
export const supportedAlgorithms = {
|
||||
[SSHAlgorithmType.KEX]: russh.getSupportedKexAlgorithms().filter(x => x !== 'none'),
|
||||
[SSHAlgorithmType.HOSTKEY]: russh.getSupportedKeyTypes().filter(x => x !== 'none'),
|
||||
[SSHAlgorithmType.CIPHER]: russh.getSupportedCiphers().filter(x => x !== 'clear'),
|
||||
[SSHAlgorithmType.HMAC]: russh.getSupportedMACs().filter(x => x !== 'none'),
|
||||
}
|
||||
|
||||
export const defaultAlgorithms = {
|
||||
[SSHAlgorithmType.KEX]: [
|
||||
'curve25519-sha256',
|
||||
'curve25519-sha256@libssh.org',
|
||||
'diffie-hellman-group16-sha512',
|
||||
'diffie-hellman-group14-sha256',
|
||||
'ext-info-c',
|
||||
'ext-info-s',
|
||||
'kex-strict-c-v00@openssh.com',
|
||||
'kex-strict-s-v00@openssh.com',
|
||||
],
|
||||
[SSHAlgorithmType.HOSTKEY]: [
|
||||
'ssh-ed25519',
|
||||
'ecdsa-sha2-nistp256',
|
||||
'ecdsa-sha2-nistp521',
|
||||
'rsa-sha2-256',
|
||||
'rsa-sha2-512',
|
||||
'ssh-rsa',
|
||||
],
|
||||
[SSHAlgorithmType.CIPHER]: [
|
||||
'chacha20-poly1305@openssh.com',
|
||||
'aes256-gcm@openssh.com',
|
||||
'aes256-ctr',
|
||||
'aes192-ctr',
|
||||
'aes128-ctr',
|
||||
],
|
||||
[SSHAlgorithmType.HMAC]: [
|
||||
'hmac-sha2-512-etm@openssh.com',
|
||||
'hmac-sha2-256-etm@openssh.com',
|
||||
'hmac-sha2-512',
|
||||
'hmac-sha2-256',
|
||||
'hmac-sha1-etm@openssh.com',
|
||||
'hmac-sha1',
|
||||
],
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
export * from './contextMenu'
|
||||
export * from './interfaces'
|
||||
export * from './importer'
|
||||
export * from './proxyStream'
|
||||
export { SSHMultiplexerService } from '../services/sshMultiplexer.service'
|
||||
|
@@ -51,13 +51,3 @@ export interface ForwardedPortConfig {
|
||||
targetPort: number
|
||||
description: string
|
||||
}
|
||||
|
||||
export let ALGORITHM_BLACKLIST = [
|
||||
// cause native crashes in node crypto, use EC instead
|
||||
'diffie-hellman-group-exchange-sha256',
|
||||
'diffie-hellman-group-exchange-sha1',
|
||||
]
|
||||
|
||||
if (!process.env.TABBY_ENABLE_SSH_ALG_BLACKLIST) {
|
||||
ALGORITHM_BLACKLIST = []
|
||||
}
|
||||
|
@@ -1,61 +0,0 @@
|
||||
import { Observable, Subject } from 'rxjs'
|
||||
import { Duplex } from 'stream'
|
||||
|
||||
export class SSHProxyStreamSocket extends Duplex {
|
||||
constructor (private parent: SSHProxyStream) {
|
||||
super({
|
||||
allowHalfOpen: false,
|
||||
})
|
||||
}
|
||||
|
||||
_read (size: number): void {
|
||||
this.parent.requestData(size)
|
||||
}
|
||||
|
||||
_write (chunk: Buffer, _encoding: string, callback: (error?: Error | null) => void): void {
|
||||
this.parent.consumeInput(chunk).then(() => callback(null), e => callback(e))
|
||||
}
|
||||
|
||||
_destroy (error: Error|null, callback: (error: Error|null) => void): void {
|
||||
this.parent.handleStopRequest(error).then(() => callback(null), e => callback(e))
|
||||
}
|
||||
}
|
||||
|
||||
export abstract class SSHProxyStream {
|
||||
get message$ (): Observable<string> { return this.message }
|
||||
get destroyed$ (): Observable<Error|null> { return this.destroyed }
|
||||
get socket (): SSHProxyStreamSocket|null { return this._socket }
|
||||
private message = new Subject<string>()
|
||||
private destroyed = new Subject<Error|null>()
|
||||
private _socket: SSHProxyStreamSocket|null = null
|
||||
|
||||
async start (): Promise<SSHProxyStreamSocket> {
|
||||
if (!this._socket) {
|
||||
this._socket = new SSHProxyStreamSocket(this)
|
||||
}
|
||||
return this._socket
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
abstract requestData (size: number): void
|
||||
|
||||
abstract consumeInput (data: Buffer): Promise<void>
|
||||
|
||||
protected emitMessage (message: string): void {
|
||||
this.message.next(message)
|
||||
}
|
||||
|
||||
protected emitOutput (data: Buffer): void {
|
||||
this._socket?.push(data)
|
||||
}
|
||||
|
||||
async handleStopRequest (error: Error|null): Promise<void> {
|
||||
this.destroyed.next(error)
|
||||
this.destroyed.complete()
|
||||
this.message.complete()
|
||||
}
|
||||
|
||||
stop (error?: Error): void {
|
||||
this._socket?.destroy(error)
|
||||
}
|
||||
}
|
@@ -14,11 +14,19 @@ input.form-control.mt-2(
|
||||
)
|
||||
|
||||
.d-flex.mt-3
|
||||
button.btn.btn-secondary(
|
||||
checkbox(
|
||||
*ngIf='isPassword()',
|
||||
[(ngModel)]='remember',
|
||||
[text]='"Save password"|translate'
|
||||
)
|
||||
|
||||
.ms-auto
|
||||
|
||||
button.btn.btn-secondary.me-3(
|
||||
*ngIf='step > 0',
|
||||
(click)='previous()'
|
||||
)
|
||||
.ms-auto
|
||||
|
||||
button.btn.btn-primary(
|
||||
(click)='next()'
|
||||
)
|
||||
|
@@ -1,6 +1,7 @@
|
||||
import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, ChangeDetectionStrategy } from '@angular/core'
|
||||
import { KeyboardInteractivePrompt } from '../session/ssh'
|
||||
|
||||
import { SSHProfile } from '../api'
|
||||
import { PasswordStorageService } from '../services/passwordStorage.service'
|
||||
|
||||
@Component({
|
||||
selector: 'keyboard-interactive-auth-panel',
|
||||
@@ -9,13 +10,17 @@ import { KeyboardInteractivePrompt } from '../session/ssh'
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class KeyboardInteractiveAuthComponent {
|
||||
@Input() profile: SSHProfile
|
||||
@Input() prompt: KeyboardInteractivePrompt
|
||||
@Input() step = 0
|
||||
@Output() done = new EventEmitter()
|
||||
@ViewChild('input') input: ElementRef
|
||||
remember = false
|
||||
|
||||
constructor (private passwordStorage: PasswordStorageService) {}
|
||||
|
||||
isPassword (): boolean {
|
||||
return this.prompt.prompts[this.step].prompt.toLowerCase().includes('password') || !this.prompt.prompts[this.step].echo
|
||||
return this.prompt.isAPasswordPrompt(this.step)
|
||||
}
|
||||
|
||||
previous (): void {
|
||||
@@ -26,6 +31,10 @@ export class KeyboardInteractiveAuthComponent {
|
||||
}
|
||||
|
||||
next (): void {
|
||||
if (this.isPassword() && this.remember) {
|
||||
this.passwordStorage.savePassword(this.profile, this.prompt.responses[this.step])
|
||||
}
|
||||
|
||||
if (this.step === this.prompt.prompts.length - 1) {
|
||||
this.prompt.respond()
|
||||
this.done.emit()
|
||||
|
@@ -23,11 +23,15 @@
|
||||
|
||||
button.btn.btn-link.btn-sm.flex-shrink-0.d-flex((click)='upload()')
|
||||
i.fas.fa-upload.me-1
|
||||
div(translate) Upload
|
||||
div(translate) Upload files
|
||||
|
||||
button.btn.btn-link.btn-sm.flex-shrink-0.d-flex((click)='uploadFolder()')
|
||||
i.fas.fa-upload.me-1
|
||||
div(translate) Upload folder
|
||||
|
||||
button.btn.btn-link.text-decoration-none((click)='close()') !{require('../../../tabby-core/src/icons/times.svg')}
|
||||
|
||||
.body(dropZone, (transfer)='uploadOne($event)')
|
||||
.body(dropZone, (transfer)='uploadOneFolder($event)')
|
||||
a.alert.alert-info.d-flex.align-items-center(
|
||||
*ngIf='shouldShowCWDTip && !cwdDetectionAvailable',
|
||||
(click)='platform.openExternal("https://tabby.sh/go/cwd-detection")'
|
||||
|
@@ -29,6 +29,12 @@
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.list-group-item-action {
|
||||
&:hover {
|
||||
background: rgba(white, .05);
|
||||
}
|
||||
}
|
||||
|
||||
.mode, .size, .date {
|
||||
font-family: monospace;
|
||||
opacity: .5;
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import * as C from 'constants'
|
||||
import { posix as path } from 'path'
|
||||
import { Component, Input, Output, EventEmitter, Inject, Optional } from '@angular/core'
|
||||
import { FileUpload, MenuItemOptions, NotificationsService, PlatformService } from 'tabby-core'
|
||||
import { FileUpload, DirectoryUpload, MenuItemOptions, NotificationsService, PlatformService } from 'tabby-core'
|
||||
import { SFTPSession, SFTPFile } from '../session/sftp'
|
||||
import { SSHSession } from '../session/ssh'
|
||||
import { SFTPContextMenuItemProvider } from '../api'
|
||||
@@ -81,6 +81,45 @@ export class SFTPPanelComponent {
|
||||
a.name.localeCompare(b.name))
|
||||
}
|
||||
|
||||
getFileType (fileExtension: string): string {
|
||||
const codeExtensions = ['js', 'ts', 'py', 'java', 'cpp', 'h', 'cs', 'html', 'css', 'rb', 'php', 'swift', 'go', 'kt', 'sh', 'json', 'cc', 'c', 'xml']
|
||||
const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp']
|
||||
const pdfExtensions = ['pdf']
|
||||
const archiveExtensions = ['zip', 'rar', 'tar', 'gz']
|
||||
const wordExtensions = ['doc', 'docx']
|
||||
const videoExtensions = ['mp4', 'avi', 'mkv', 'mov']
|
||||
const powerpointExtensions = ['ppt', 'pptx']
|
||||
const textExtensions = ['txt', 'log']
|
||||
const audioExtensions = ['mp3', 'wav', 'flac']
|
||||
const excelExtensions = ['xls', 'xlsx']
|
||||
|
||||
const lowerCaseExtension = fileExtension.toLowerCase()
|
||||
|
||||
if (codeExtensions.includes(lowerCaseExtension)) {
|
||||
return 'code'
|
||||
} else if (imageExtensions.includes(lowerCaseExtension)) {
|
||||
return 'image'
|
||||
} else if (pdfExtensions.includes(lowerCaseExtension)) {
|
||||
return 'pdf'
|
||||
} else if (archiveExtensions.includes(lowerCaseExtension)) {
|
||||
return 'archive'
|
||||
} else if (wordExtensions.includes(lowerCaseExtension)) {
|
||||
return 'word'
|
||||
} else if (videoExtensions.includes(lowerCaseExtension)) {
|
||||
return 'video'
|
||||
} else if (powerpointExtensions.includes(lowerCaseExtension)) {
|
||||
return 'powerpoint'
|
||||
} else if (textExtensions.includes(lowerCaseExtension)) {
|
||||
return 'text'
|
||||
} else if (audioExtensions.includes(lowerCaseExtension)) {
|
||||
return 'audio'
|
||||
} else if (excelExtensions.includes(lowerCaseExtension)) {
|
||||
return 'excel'
|
||||
} else {
|
||||
return 'unknown'
|
||||
}
|
||||
}
|
||||
|
||||
getIcon (item: SFTPFile): string {
|
||||
if (item.isDirectory) {
|
||||
return 'fas fa-folder text-info'
|
||||
@@ -88,6 +127,18 @@ export class SFTPPanelComponent {
|
||||
if (item.isSymlink) {
|
||||
return 'fas fa-link text-warning'
|
||||
}
|
||||
const fileMatch = /\.([^.]+)$/.exec(item.name)
|
||||
const extension = fileMatch ? fileMatch[1] : null
|
||||
if (extension !== null) {
|
||||
const fileType = this.getFileType(extension)
|
||||
|
||||
switch (fileType) {
|
||||
case 'unknown':
|
||||
return 'fas fa-file'
|
||||
default:
|
||||
return `fa-solid fa-file-${fileType} `
|
||||
}
|
||||
}
|
||||
return 'fas fa-file'
|
||||
}
|
||||
|
||||
@@ -129,6 +180,30 @@ export class SFTPPanelComponent {
|
||||
await Promise.all(transfers.map(t => this.uploadOne(t)))
|
||||
}
|
||||
|
||||
async uploadFolder (): Promise<void> {
|
||||
const transfer = await this.platform.startUploadDirectory()
|
||||
await this.uploadOneFolder(transfer)
|
||||
}
|
||||
|
||||
async uploadOneFolder (transfer: DirectoryUpload, accumPath = ''): Promise<void> {
|
||||
const savedPath = this.path
|
||||
for(const t of transfer.getChildrens()) {
|
||||
if (t instanceof DirectoryUpload) {
|
||||
try {
|
||||
await this.sftp.mkdir(path.posix.join(this.path, accumPath, t.getName()))
|
||||
} catch {
|
||||
// Intentionally ignoring errors from making duplicate dirs.
|
||||
}
|
||||
await this.uploadOneFolder(t, path.posix.join(accumPath, t.getName()))
|
||||
} else {
|
||||
await this.sftp.upload(path.posix.join(this.path, accumPath, t.getName()), t)
|
||||
}
|
||||
}
|
||||
if (this.path === savedPath) {
|
||||
await this.navigate(this.path)
|
||||
}
|
||||
}
|
||||
|
||||
async uploadOne (transfer: FileUpload): Promise<void> {
|
||||
const savedPath = this.path
|
||||
await this.sftp.upload(path.join(this.path, transfer.getName()), transfer)
|
||||
|
@@ -3,7 +3,7 @@ import { Component, ViewChild } from '@angular/core'
|
||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||
import { firstBy } from 'thenby'
|
||||
|
||||
import { ConfigService, FileProvidersService, Platform, HostAppService, PromptModalComponent, PartialProfile } from 'tabby-core'
|
||||
import { FileProvidersService, Platform, HostAppService, PromptModalComponent, PartialProfile, ProfilesService } from 'tabby-core'
|
||||
import { LoginScriptsSettingsComponent } from 'tabby-terminal'
|
||||
import { PasswordStorageService } from '../services/passwordStorage.service'
|
||||
import { ForwardedPortConfig, SSHAlgorithmType, SSHProfile } from '../api'
|
||||
@@ -27,14 +27,14 @@ export class SSHProfileSettingsComponent {
|
||||
|
||||
constructor (
|
||||
public hostApp: HostAppService,
|
||||
private config: ConfigService,
|
||||
private profilesService: ProfilesService,
|
||||
private passwordStorage: PasswordStorageService,
|
||||
private ngbModal: NgbModal,
|
||||
private fileProviders: FileProvidersService,
|
||||
) { }
|
||||
|
||||
async ngOnInit () {
|
||||
this.jumpHosts = this.config.store.profiles.filter(x => x.type === 'ssh' && x !== this.profile)
|
||||
this.jumpHosts = (await this.profilesService.getProfiles({ includeBuiltin: false })).filter(x => x.type === 'ssh' && x !== this.profile)
|
||||
this.jumpHosts.sort(firstBy(x => this.getJumpHostLabel(x)))
|
||||
|
||||
for (const k of Object.values(SSHAlgorithmType)) {
|
||||
@@ -67,7 +67,7 @@ export class SSHProfileSettingsComponent {
|
||||
}
|
||||
|
||||
getJumpHostLabel (p: PartialProfile<SSHProfile>) {
|
||||
return p.group ? `${p.group} / ${p.name}` : p.name
|
||||
return p.group ? `${this.profilesService.resolveProfileGroupName(p.group)} / ${p.name}` : p.name
|
||||
}
|
||||
|
||||
async setPassword () {
|
||||
|
@@ -1,7 +1,10 @@
|
||||
terminal-toolbar([tab]='this')
|
||||
i.fas.fa-xs.fa-circle.text-success.me-2(*ngIf='session && session.open')
|
||||
i.fas.fa-xs.fa-circle.text-danger.me-2(*ngIf='!session || !session.open')
|
||||
strong.me-auto {{profile.options.user}}@{{profile.options.host}}:{{profile.options.port}}
|
||||
strong.me-auto(
|
||||
style='user-select: text; cursor: text;'
|
||||
onclick='event.stopPropagation()'
|
||||
) {{profile.options.user}}@{{profile.options.host}}:{{profile.options.port}}
|
||||
|
||||
.me-2(
|
||||
ngbDropdown,
|
||||
@@ -48,6 +51,7 @@ sftp-panel.bg-dark(
|
||||
keyboard-interactive-auth-panel.bg-dark(
|
||||
*ngIf='activeKIPrompt',
|
||||
[prompt]='activeKIPrompt',
|
||||
[profile]='profile',
|
||||
(click)='$event.stopPropagation()',
|
||||
(done)='activeKIPrompt = null; frontend?.focus()'
|
||||
)
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import * as russh from 'russh'
|
||||
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'
|
||||
import colors from 'ansi-colors'
|
||||
import { Component, Injector, HostListener } from '@angular/core'
|
||||
@@ -94,17 +95,21 @@ export class SSHTabComponent extends ConnectableTerminalTabComponent<SSHProfile>
|
||||
}
|
||||
})
|
||||
|
||||
session.jumpStream = await new Promise((resolve, reject) => jumpSession.ssh.forwardOut(
|
||||
'127.0.0.1', 0, profile.options.host, profile.options.port ?? 22,
|
||||
(err, stream) => {
|
||||
if (err) {
|
||||
jumpSession.emitServiceMessage(colors.bgRed.black(' X ') + ` Could not set up port forward on ${jumpConnection.name}`)
|
||||
reject(err)
|
||||
return
|
||||
}
|
||||
resolve(stream)
|
||||
},
|
||||
))
|
||||
if (!(jumpSession.ssh instanceof russh.AuthenticatedSSHClient)) {
|
||||
throw new Error('Jump session is not authenticated yet somehow')
|
||||
}
|
||||
|
||||
try {
|
||||
session.jumpChannel = await jumpSession.ssh.openTCPForwardChannel({
|
||||
addressToConnectTo: profile.options.host,
|
||||
portToConnectTo: profile.options.port ?? 22,
|
||||
originatorAddress: '127.0.0.1',
|
||||
originatorPort: 0,
|
||||
})
|
||||
} catch (err) {
|
||||
jumpSession.emitServiceMessage(colors.bgRed.black(' X ') + ` Could not set up port forward on ${jumpConnection.name}`)
|
||||
throw err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -125,7 +130,7 @@ export class SSHTabComponent extends ConnectableTerminalTabComponent<SSHProfile>
|
||||
})
|
||||
|
||||
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 ') + ` Connecting to ${session.profile.name}\r\n`)
|
||||
|
||||
this.startSpinner(this.translate.instant(_('Connecting')))
|
||||
|
||||
|
@@ -1,5 +1,3 @@
|
||||
import './polyfills'
|
||||
|
||||
import { NgModule } from '@angular/core'
|
||||
import { CommonModule } from '@angular/common'
|
||||
import { FormsModule } from '@angular/forms'
|
||||
|
@@ -1,4 +0,0 @@
|
||||
const nodeCrypto = require('crypto')
|
||||
const browserDH = require('diffie-hellman/browser')
|
||||
nodeCrypto.createDiffieHellmanGroup = browserDH.createDiffieHellmanGroup
|
||||
nodeCrypto.createDiffieHellman = browserDH.createDiffieHellman
|
@@ -1,11 +1,11 @@
|
||||
import { Injectable, InjectFlags, Injector } from '@angular/core'
|
||||
import { NewTabParameters, PartialProfile, TranslateService, QuickConnectProfileProvider } from 'tabby-core'
|
||||
import * as ALGORITHMS from 'ssh2/lib/protocol/constants'
|
||||
import { SSHProfileSettingsComponent } from './components/sshProfileSettings.component'
|
||||
import { SSHTabComponent } from './components/sshTab.component'
|
||||
import { PasswordStorageService } from './services/passwordStorage.service'
|
||||
import { ALGORITHM_BLACKLIST, SSHAlgorithmType, SSHProfile } from './api'
|
||||
import { SSHAlgorithmType, SSHProfile } from './api'
|
||||
import { SSHProfileImporter } from './api/importer'
|
||||
import { defaultAlgorithms } from './algorithms'
|
||||
|
||||
@Injectable({ providedIn: 'root' })
|
||||
export class SSHProfilesService extends QuickConnectProfileProvider<SSHProfile> {
|
||||
@@ -29,10 +29,10 @@ export class SSHProfilesService extends QuickConnectProfileProvider<SSHProfile>
|
||||
agentForward: false,
|
||||
warnOnClose: null,
|
||||
algorithms: {
|
||||
hmac: [],
|
||||
kex: [],
|
||||
cipher: [],
|
||||
serverHostKey: [],
|
||||
hmac: [] as string[],
|
||||
kex: [] as string[],
|
||||
cipher: [] as string[],
|
||||
serverHostKey: [] as string[],
|
||||
},
|
||||
proxyCommand: null,
|
||||
forwardedPorts: [],
|
||||
@@ -54,13 +54,7 @@ export class SSHProfilesService extends QuickConnectProfileProvider<SSHProfile>
|
||||
) {
|
||||
super()
|
||||
for (const k of Object.values(SSHAlgorithmType)) {
|
||||
const defaultAlg = {
|
||||
[SSHAlgorithmType.KEX]: 'DEFAULT_KEX',
|
||||
[SSHAlgorithmType.HOSTKEY]: 'DEFAULT_SERVER_HOST_KEY',
|
||||
[SSHAlgorithmType.CIPHER]: 'DEFAULT_CIPHER',
|
||||
[SSHAlgorithmType.HMAC]: 'DEFAULT_MAC',
|
||||
}[k]
|
||||
this.configDefaults.options.algorithms[k] = ALGORITHMS[defaultAlg].filter(x => !ALGORITHM_BLACKLIST.includes(x))
|
||||
this.configDefaults.options.algorithms[k] = [...defaultAlgorithms[k]]
|
||||
this.configDefaults.options.algorithms[k].sort()
|
||||
}
|
||||
}
|
||||
|
@@ -1,15 +1,9 @@
|
||||
import * as shellQuote from 'shell-quote'
|
||||
import * as net from 'net'
|
||||
import * as fs from 'fs/promises'
|
||||
// import * as fs from 'fs/promises'
|
||||
import * as tmp from 'tmp-promise'
|
||||
import socksv5 from '@luminati-io/socksv5'
|
||||
import { Duplex } from 'stream'
|
||||
import { Injectable } from '@angular/core'
|
||||
import { spawn } from 'child_process'
|
||||
import { ChildProcess } from 'node:child_process'
|
||||
import { ConfigService, HostAppService, Platform, PlatformService } from 'tabby-core'
|
||||
import { SSHSession } from '../session/ssh'
|
||||
import { SSHProfile, SSHProxyStream, SSHProxyStreamSocket } from '../api'
|
||||
import { SSHProfile } from '../api'
|
||||
import { PasswordStorageService } from './passwordStorage.service'
|
||||
|
||||
@Injectable({ providedIn: 'root' })
|
||||
@@ -37,7 +31,11 @@ export class SSHService {
|
||||
if (password) {
|
||||
uri += ':' + encodeURIComponent(password)
|
||||
}
|
||||
uri += `@${profile.options.host}:${profile.options.port}${cwd ?? '/'}`
|
||||
if (profile.options.host.includes(':')) {
|
||||
uri += `@[${profile.options.host}]:${profile.options.port}${cwd ?? '/'}`
|
||||
}else {
|
||||
uri += `@${profile.options.host}:${profile.options.port}${cwd ?? '/'}`
|
||||
}
|
||||
return uri
|
||||
}
|
||||
|
||||
@@ -51,7 +49,7 @@ export class SSHService {
|
||||
let tmpFile: tmp.FileResult|null = null
|
||||
if (session.activePrivateKey) {
|
||||
tmpFile = await tmp.file()
|
||||
await fs.writeFile(tmpFile.path, session.activePrivateKey)
|
||||
// await fs.writeFile(tmpFile.path, session.activePrivateKey)
|
||||
const winSCPcom = path.slice(0, -3) + 'com'
|
||||
await this.platform.exec(winSCPcom, ['/keygen', tmpFile.path, `/output=${tmpFile.path}`])
|
||||
args.push(`/privatekey=${tmpFile.path}`)
|
||||
@@ -60,171 +58,3 @@ export class SSHService {
|
||||
tmpFile?.cleanup()
|
||||
}
|
||||
}
|
||||
|
||||
export class ProxyCommandStream extends SSHProxyStream {
|
||||
private process: ChildProcess|null
|
||||
|
||||
constructor (private command: string) {
|
||||
super()
|
||||
}
|
||||
|
||||
async start (): Promise<SSHProxyStreamSocket> {
|
||||
const argv = shellQuote.parse(this.command)
|
||||
this.process = spawn(argv[0], argv.slice(1), {
|
||||
windowsHide: true,
|
||||
stdio: ['pipe', 'pipe', 'pipe'],
|
||||
})
|
||||
this.process.on('error', error => {
|
||||
this.stop(new Error(`Proxy command has failed to start: ${error.message}`))
|
||||
})
|
||||
this.process.on('exit', code => {
|
||||
this.stop(new Error(`Proxy command has exited with code ${code}`))
|
||||
})
|
||||
this.process.stdout?.on('data', data => {
|
||||
this.emitOutput(data)
|
||||
})
|
||||
this.process.stdout?.on('error', (err) => {
|
||||
this.stop(err)
|
||||
})
|
||||
this.process.stderr?.on('data', data => {
|
||||
this.emitMessage(data.toString())
|
||||
})
|
||||
return super.start()
|
||||
}
|
||||
|
||||
requestData (size: number): void {
|
||||
this.process?.stdout?.read(size)
|
||||
}
|
||||
|
||||
async consumeInput (data: Buffer): Promise<void> {
|
||||
const process = this.process
|
||||
if (process) {
|
||||
await new Promise(resolve => process.stdin?.write(data, resolve))
|
||||
}
|
||||
}
|
||||
|
||||
async stop (error?: Error): Promise<void> {
|
||||
this.process?.kill()
|
||||
super.stop(error)
|
||||
}
|
||||
}
|
||||
|
||||
export class SocksProxyStream extends SSHProxyStream {
|
||||
private client: Duplex|null
|
||||
private header: Buffer|null
|
||||
|
||||
constructor (private profile: SSHProfile) {
|
||||
super()
|
||||
}
|
||||
|
||||
async start (): Promise<SSHProxyStreamSocket> {
|
||||
this.client = await new Promise((resolve, reject) => {
|
||||
const connector = socksv5.connect({
|
||||
host: this.profile.options.host,
|
||||
port: this.profile.options.port,
|
||||
proxyHost: this.profile.options.socksProxyHost ?? '127.0.0.1',
|
||||
proxyPort: this.profile.options.socksProxyPort ?? 5000,
|
||||
auths: [socksv5.auth.None()],
|
||||
strictLocalDNS: false,
|
||||
}, s => {
|
||||
resolve(s)
|
||||
this.header = s.read()
|
||||
if (this.header) {
|
||||
this.emitOutput(this.header)
|
||||
}
|
||||
})
|
||||
connector.on('error', (err) => {
|
||||
reject(err)
|
||||
this.stop(new Error(`SOCKS connection failed: ${err.message}`))
|
||||
})
|
||||
})
|
||||
this.client?.on('data', data => {
|
||||
if (!this.header || data !== this.header) {
|
||||
// socksv5 doesn't reliably emit the first data event
|
||||
this.emitOutput(data)
|
||||
this.header = null
|
||||
}
|
||||
})
|
||||
this.client?.on('close', error => {
|
||||
this.stop(error)
|
||||
})
|
||||
|
||||
return super.start()
|
||||
}
|
||||
|
||||
requestData (size: number): void {
|
||||
this.client?.read(size)
|
||||
}
|
||||
|
||||
async consumeInput (data: Buffer): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.client?.write(data, undefined, err => err ? reject(err) : resolve())
|
||||
})
|
||||
}
|
||||
|
||||
async stop (error?: Error): Promise<void> {
|
||||
this.client?.destroy()
|
||||
super.stop(error)
|
||||
}
|
||||
}
|
||||
|
||||
export class HTTPProxyStream extends SSHProxyStream {
|
||||
private client: Duplex|null
|
||||
private connected = false
|
||||
|
||||
constructor (private profile: SSHProfile) {
|
||||
super()
|
||||
}
|
||||
|
||||
async start (): Promise<SSHProxyStreamSocket> {
|
||||
this.client = await new Promise((resolve, reject) => {
|
||||
const connector = net.createConnection({
|
||||
host: this.profile.options.httpProxyHost!,
|
||||
port: this.profile.options.httpProxyPort!,
|
||||
}, () => resolve(connector))
|
||||
connector.on('error', error => {
|
||||
reject(error)
|
||||
this.stop(new Error(`Proxy connection failed: ${error.message}`))
|
||||
})
|
||||
})
|
||||
this.client?.write(Buffer.from(`CONNECT ${this.profile.options.host}:${this.profile.options.port} HTTP/1.1\r\n\r\n`))
|
||||
this.client?.on('data', (data: Buffer) => {
|
||||
if (this.connected) {
|
||||
this.emitOutput(data)
|
||||
} else {
|
||||
if (data.slice(0, 5).equals(Buffer.from('HTTP/'))) {
|
||||
const idx = data.indexOf('\n\n')
|
||||
const headers = data.slice(0, idx).toString()
|
||||
const code = parseInt(headers.split(' ')[1])
|
||||
if (code >= 200 && code < 300) {
|
||||
this.emitMessage('Connected')
|
||||
this.emitOutput(data.slice(idx + 2))
|
||||
this.connected = true
|
||||
} else {
|
||||
this.stop(new Error(`Connection failed, code ${code}`))
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
this.client?.on('close', error => {
|
||||
this.stop(error)
|
||||
})
|
||||
|
||||
return super.start()
|
||||
}
|
||||
|
||||
requestData (size: number): void {
|
||||
this.client?.read(size)
|
||||
}
|
||||
|
||||
async consumeInput (data: Buffer): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.client?.write(data, undefined, err => err ? reject(err) : resolve())
|
||||
})
|
||||
}
|
||||
|
||||
async stop (error?: Error): Promise<void> {
|
||||
this.client?.destroy()
|
||||
super.stop(error)
|
||||
}
|
||||
}
|
||||
|
@@ -1,12 +1,9 @@
|
||||
import * as C from 'constants'
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
import { Subject, Observable } from 'rxjs'
|
||||
import { posix as posixPath } from 'path'
|
||||
import { Injector, NgZone } from '@angular/core'
|
||||
import { FileDownload, FileUpload, Logger, LogService, wrapPromise } from 'tabby-core'
|
||||
import { SFTPWrapper } from 'ssh2'
|
||||
import { promisify } from 'util'
|
||||
|
||||
import type { FileEntry, Stats } from 'ssh2-streams'
|
||||
import { Injector } from '@angular/core'
|
||||
import { FileDownload, FileUpload, Logger, LogService } from 'tabby-core'
|
||||
import * as russh from 'russh'
|
||||
|
||||
export interface SFTPFile {
|
||||
name: string
|
||||
@@ -22,63 +19,37 @@ export class SFTPFileHandle {
|
||||
position = 0
|
||||
|
||||
constructor (
|
||||
private sftp: SFTPWrapper,
|
||||
private handle: Buffer,
|
||||
private zone: NgZone,
|
||||
private inner: russh.SFTPFile|null,
|
||||
) { }
|
||||
|
||||
read (): Promise<Buffer> {
|
||||
const buffer = Buffer.alloc(256 * 1024)
|
||||
return wrapPromise(this.zone, new Promise((resolve, reject) => {
|
||||
while (true) {
|
||||
const wait = this.sftp.read(this.handle, buffer, 0, buffer.length, this.position, (err, read) => {
|
||||
if (err) {
|
||||
reject(err)
|
||||
return
|
||||
}
|
||||
this.position += read
|
||||
resolve(buffer.slice(0, read))
|
||||
})
|
||||
if (!wait) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}))
|
||||
async read (): Promise<Uint8Array> {
|
||||
if (!this.inner) {
|
||||
return Promise.resolve(new Uint8Array(0))
|
||||
}
|
||||
return this.inner.read(256 * 1024)
|
||||
}
|
||||
|
||||
write (chunk: Buffer): Promise<void> {
|
||||
return wrapPromise(this.zone, new Promise<void>((resolve, reject) => {
|
||||
while (true) {
|
||||
const wait = this.sftp.write(this.handle, chunk, 0, chunk.length, this.position, err => {
|
||||
if (err) {
|
||||
reject(err)
|
||||
return
|
||||
}
|
||||
this.position += chunk.length
|
||||
resolve()
|
||||
})
|
||||
if (!wait) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}))
|
||||
async write (chunk: Uint8Array): Promise<void> {
|
||||
if (!this.inner) {
|
||||
throw new Error('File handle is closed')
|
||||
}
|
||||
await this.inner.writeAll(chunk)
|
||||
}
|
||||
|
||||
close (): Promise<void> {
|
||||
return wrapPromise(this.zone, promisify(this.sftp.close.bind(this.sftp))(this.handle))
|
||||
async close (): Promise<void> {
|
||||
await this.inner?.shutdown()
|
||||
this.inner = null
|
||||
}
|
||||
}
|
||||
|
||||
export class SFTPSession {
|
||||
get closed$ (): Observable<void> { return this.closed }
|
||||
private closed = new Subject<void>()
|
||||
private zone: NgZone
|
||||
private logger: Logger
|
||||
|
||||
constructor (private sftp: SFTPWrapper, injector: Injector) {
|
||||
this.zone = injector.get(NgZone)
|
||||
constructor (private sftp: russh.SFTP, injector: Injector) {
|
||||
this.logger = injector.get(LogService).create('sftp')
|
||||
sftp.on('close', () => {
|
||||
sftp.closed$.subscribe(() => {
|
||||
this.closed.next()
|
||||
this.closed.complete()
|
||||
})
|
||||
@@ -86,67 +57,64 @@ export class SFTPSession {
|
||||
|
||||
async readdir (p: string): Promise<SFTPFile[]> {
|
||||
this.logger.debug('readdir', p)
|
||||
const entries = await wrapPromise(this.zone, promisify<FileEntry[]>(f => this.sftp.readdir(p, f))())
|
||||
const entries = await this.sftp.readDirectory(p)
|
||||
return entries.map(entry => this._makeFile(
|
||||
posixPath.join(p, entry.filename), entry,
|
||||
posixPath.join(p, entry.name), entry,
|
||||
))
|
||||
}
|
||||
|
||||
readlink (p: string): Promise<string> {
|
||||
this.logger.debug('readlink', p)
|
||||
return wrapPromise(this.zone, promisify<string>(f => this.sftp.readlink(p, f))())
|
||||
return this.sftp.readlink(p)
|
||||
}
|
||||
|
||||
async stat (p: string): Promise<SFTPFile> {
|
||||
this.logger.debug('stat', p)
|
||||
const stats = await wrapPromise(this.zone, promisify<Stats>(f => this.sftp.stat(p, f))())
|
||||
const stats = await this.sftp.stat(p)
|
||||
return {
|
||||
name: posixPath.basename(p),
|
||||
fullPath: p,
|
||||
isDirectory: stats.isDirectory(),
|
||||
isSymlink: stats.isSymbolicLink(),
|
||||
mode: stats.mode,
|
||||
isDirectory: stats.type === russh.SFTPFileType.Directory,
|
||||
isSymlink: stats.type === russh.SFTPFileType.Symlink,
|
||||
mode: stats.permissions ?? 0,
|
||||
size: stats.size,
|
||||
modified: new Date(stats.mtime * 1000),
|
||||
modified: new Date((stats.mtime ?? 0) * 1000),
|
||||
}
|
||||
}
|
||||
|
||||
async open (p: string, mode: string): Promise<SFTPFileHandle> {
|
||||
this.logger.debug('open', p)
|
||||
const handle = await wrapPromise(this.zone, promisify<Buffer>(f => this.sftp.open(p, mode, f))())
|
||||
return new SFTPFileHandle(this.sftp, handle, this.zone)
|
||||
async open (p: string, mode: number): Promise<SFTPFileHandle> {
|
||||
this.logger.debug('open', p, mode)
|
||||
const handle = await this.sftp.open(p, mode)
|
||||
return new SFTPFileHandle(handle)
|
||||
}
|
||||
|
||||
async rmdir (p: string): Promise<void> {
|
||||
this.logger.debug('rmdir', p)
|
||||
await promisify((f: any) => this.sftp.rmdir(p, f))()
|
||||
await this.sftp.removeDirectory(p)
|
||||
}
|
||||
|
||||
async mkdir (p: string): Promise<void> {
|
||||
this.logger.debug('mkdir', p)
|
||||
await promisify((f: any) => this.sftp.mkdir(p, f))()
|
||||
await this.sftp.createDirectory(p)
|
||||
}
|
||||
|
||||
async rename (oldPath: string, newPath: string): Promise<void> {
|
||||
this.logger.debug('rename', oldPath, newPath)
|
||||
await promisify((f: any) => this.sftp.rename(oldPath, newPath, f))()
|
||||
await this.sftp.rename(oldPath, newPath)
|
||||
}
|
||||
|
||||
async unlink (p: string): Promise<void> {
|
||||
this.logger.debug('unlink', p)
|
||||
await promisify((f: any) => this.sftp.unlink(p, f))()
|
||||
await this.sftp.removeFile(p)
|
||||
}
|
||||
|
||||
async chmod (p: string, mode: string|number): Promise<void> {
|
||||
this.logger.debug('chmod', p, mode)
|
||||
await promisify((f: any) => this.sftp.chmod(p, mode, f))()
|
||||
await this.sftp.chmod(p, mode)
|
||||
}
|
||||
|
||||
async upload (path: string, transfer: FileUpload): Promise<void> {
|
||||
this.logger.info('Uploading into', path)
|
||||
const tempPath = path + '.tabby-upload'
|
||||
try {
|
||||
const handle = await this.open(tempPath, 'w')
|
||||
const handle = await this.open(tempPath, russh.OPEN_WRITE | russh.OPEN_CREATE)
|
||||
while (true) {
|
||||
const chunk = await transfer.read()
|
||||
if (!chunk.length) {
|
||||
@@ -154,15 +122,13 @@ export class SFTPSession {
|
||||
}
|
||||
await handle.write(chunk)
|
||||
}
|
||||
handle.close()
|
||||
try {
|
||||
await this.unlink(path)
|
||||
} catch { }
|
||||
await handle.close()
|
||||
await this.unlink(path).catch(() => null)
|
||||
await this.rename(tempPath, path)
|
||||
transfer.close()
|
||||
} catch (e) {
|
||||
transfer.cancel()
|
||||
this.unlink(tempPath)
|
||||
this.unlink(tempPath).catch(() => null)
|
||||
throw e
|
||||
}
|
||||
}
|
||||
@@ -170,7 +136,7 @@ export class SFTPSession {
|
||||
async download (path: string, transfer: FileDownload): Promise<void> {
|
||||
this.logger.info('Downloading', path)
|
||||
try {
|
||||
const handle = await this.open(path, 'r')
|
||||
const handle = await this.open(path, russh.OPEN_READ)
|
||||
while (true) {
|
||||
const chunk = await handle.read()
|
||||
if (!chunk.length) {
|
||||
@@ -186,15 +152,15 @@ export class SFTPSession {
|
||||
}
|
||||
}
|
||||
|
||||
private _makeFile (p: string, entry: FileEntry): SFTPFile {
|
||||
private _makeFile (p: string, entry: russh.SFTPDirectoryEntry): SFTPFile {
|
||||
return {
|
||||
fullPath: p,
|
||||
name: posixPath.basename(p),
|
||||
isDirectory: (entry.attrs.mode & C.S_IFDIR) === C.S_IFDIR,
|
||||
isSymlink: (entry.attrs.mode & C.S_IFLNK) === C.S_IFLNK,
|
||||
mode: entry.attrs.mode,
|
||||
size: entry.attrs.size,
|
||||
modified: new Date(entry.attrs.mtime * 1000),
|
||||
isDirectory: entry.metadata.type === russh.SFTPFileType.Directory,
|
||||
isSymlink: entry.metadata.type === russh.SFTPFileType.Symlink,
|
||||
mode: entry.metadata.permissions ?? 0,
|
||||
size: entry.metadata.size,
|
||||
modified: new Date((entry.metadata.mtime ?? 0) * 1000),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,15 +1,15 @@
|
||||
import { Observable, Subject } from 'rxjs'
|
||||
import stripAnsi from 'strip-ansi'
|
||||
import { ClientChannel } from 'ssh2'
|
||||
import { Injector } from '@angular/core'
|
||||
import { LogService } from 'tabby-core'
|
||||
import { BaseSession, UTF8SplitterMiddleware, InputProcessor } from 'tabby-terminal'
|
||||
import { SSHSession } from './ssh'
|
||||
import { SSHProfile } from '../api'
|
||||
import * as russh from 'russh'
|
||||
|
||||
|
||||
export class SSHShellSession extends BaseSession {
|
||||
shell?: ClientChannel
|
||||
shell?: russh.Channel
|
||||
get serviceMessage$ (): Observable<string> { return this.serviceMessage }
|
||||
private serviceMessage = new Subject<string>()
|
||||
private ssh: SSHSession|null
|
||||
@@ -53,19 +53,11 @@ export class SSHShellSession extends BaseSession {
|
||||
|
||||
this.loginScriptProcessor?.executeUnconditionalScripts()
|
||||
|
||||
this.shell.on('greeting', greeting => {
|
||||
this.emitServiceMessage(`Shell greeting: ${greeting}`)
|
||||
this.shell.data$.subscribe(data => {
|
||||
this.emitOutput(Buffer.from(data))
|
||||
})
|
||||
|
||||
this.shell.on('banner', banner => {
|
||||
this.emitServiceMessage(`Shell banner: ${banner}`)
|
||||
})
|
||||
|
||||
this.shell.on('data', data => {
|
||||
this.emitOutput(data)
|
||||
})
|
||||
|
||||
this.shell.on('end', () => {
|
||||
this.shell.eof$.subscribe(() => {
|
||||
this.logger.info('Shell session ended')
|
||||
if (this.open) {
|
||||
this.destroy()
|
||||
@@ -79,19 +71,22 @@ export class SSHShellSession extends BaseSession {
|
||||
}
|
||||
|
||||
resize (columns: number, rows: number): void {
|
||||
if (this.shell) {
|
||||
this.shell.setWindow(rows, columns, rows, columns)
|
||||
}
|
||||
this.shell?.resizePTY({
|
||||
columns,
|
||||
rows,
|
||||
pixHeight: 0,
|
||||
pixWidth: 0,
|
||||
})
|
||||
}
|
||||
|
||||
write (data: Buffer): void {
|
||||
if (this.shell) {
|
||||
this.shell.write(data)
|
||||
this.shell.write(new Uint8Array(data))
|
||||
}
|
||||
}
|
||||
|
||||
kill (signal?: string): void {
|
||||
this.shell?.signal(signal ?? 'TERM')
|
||||
kill (_signal?: string): void {
|
||||
// this.shell?.signal(signal ?? 'TERM')
|
||||
}
|
||||
|
||||
async destroy (): Promise<void> {
|
||||
|
@@ -1,24 +1,22 @@
|
||||
import * as fs from 'mz/fs'
|
||||
import * as crypto from 'crypto'
|
||||
import * as sshpk from 'sshpk'
|
||||
import colors from 'ansi-colors'
|
||||
import stripAnsi from 'strip-ansi'
|
||||
import { Injector, NgZone } from '@angular/core'
|
||||
import * as shellQuote from 'shell-quote'
|
||||
import { Injector } from '@angular/core'
|
||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||
import { ConfigService, FileProvidersService, HostAppService, NotificationsService, Platform, PlatformService, wrapPromise, PromptModalComponent, LogService, Logger, TranslateService } from 'tabby-core'
|
||||
import { ConfigService, FileProvidersService, NotificationsService, PromptModalComponent, LogService, Logger, TranslateService, Platform, HostAppService } from 'tabby-core'
|
||||
import { Socket } from 'net'
|
||||
import { Client, ClientChannel, SFTPWrapper } from 'ssh2'
|
||||
import { Subject, Observable } from 'rxjs'
|
||||
import { HostKeyPromptModalComponent } from '../components/hostKeyPromptModal.component'
|
||||
import { HTTPProxyStream, ProxyCommandStream, SocksProxyStream } from '../services/ssh.service'
|
||||
import { PasswordStorageService } from '../services/passwordStorage.service'
|
||||
import { SSHKnownHostsService } from '../services/sshKnownHosts.service'
|
||||
import { promisify } from 'util'
|
||||
import { SFTPSession } from './sftp'
|
||||
import { SSHAlgorithmType, PortForwardType, SSHProfile, SSHProxyStream, AutoPrivateKeyLocator } from '../api'
|
||||
import { SSHAlgorithmType, SSHProfile, AutoPrivateKeyLocator, PortForwardType } from '../api'
|
||||
import { ForwardedPort } from './forwards'
|
||||
import { X11Socket } from './x11'
|
||||
import { supportedAlgorithms } from '../algorithms'
|
||||
import * as russh from 'russh'
|
||||
|
||||
const WINDOWS_OPENSSH_AGENT_PIPE = '\\\\.\\pipe\\openssh-ssh-agent'
|
||||
|
||||
@@ -27,48 +25,74 @@ export interface Prompt {
|
||||
echo?: boolean
|
||||
}
|
||||
|
||||
interface AuthMethod {
|
||||
type: 'none'|'publickey'|'agent'|'password'|'keyboard-interactive'|'hostbased'
|
||||
name?: string
|
||||
contents?: Buffer
|
||||
}
|
||||
|
||||
interface Handshake {
|
||||
kex: string
|
||||
serverHostKey: string
|
||||
type AuthMethod = {
|
||||
type: 'none'|'prompt-password'|'hostbased'
|
||||
} | {
|
||||
type: 'keyboard-interactive',
|
||||
savedPassword?: string
|
||||
} | {
|
||||
type: 'saved-password',
|
||||
password: string
|
||||
} | {
|
||||
type: 'publickey'
|
||||
name: string
|
||||
contents: Buffer
|
||||
} | {
|
||||
type: 'agent',
|
||||
kind: 'unix-socket',
|
||||
path: string
|
||||
} | {
|
||||
type: 'agent',
|
||||
kind: 'named-pipe',
|
||||
path: string
|
||||
} | {
|
||||
type: 'agent',
|
||||
kind: 'pageant',
|
||||
}
|
||||
|
||||
export class KeyboardInteractivePrompt {
|
||||
responses: string[] = []
|
||||
readonly responses: string[] = []
|
||||
|
||||
private _resolve: (value: string[]) => void
|
||||
private _reject: (reason: any) => void
|
||||
readonly promise = new Promise<string[]>((resolve, reject) => {
|
||||
this._resolve = resolve
|
||||
this._reject = reject
|
||||
})
|
||||
|
||||
constructor (
|
||||
public name: string,
|
||||
public instruction: string,
|
||||
public prompts: Prompt[],
|
||||
private callback: (_: string[]) => void,
|
||||
) {
|
||||
this.responses = new Array(this.prompts.length).fill('')
|
||||
}
|
||||
|
||||
isAPasswordPrompt (index: number): boolean {
|
||||
return this.prompts[index].prompt.toLowerCase().includes('password') && !this.prompts[index].echo
|
||||
}
|
||||
|
||||
respond (): void {
|
||||
this.callback(this.responses)
|
||||
this._resolve(this.responses)
|
||||
}
|
||||
|
||||
reject (): void {
|
||||
this._reject(new Error('Keyboard-interactive auth rejected'))
|
||||
}
|
||||
}
|
||||
|
||||
export class SSHSession {
|
||||
shell?: ClientChannel
|
||||
ssh: Client
|
||||
sftp?: SFTPWrapper
|
||||
shell?: russh.Channel
|
||||
ssh: russh.SSHClient|russh.AuthenticatedSSHClient
|
||||
sftp?: russh.SFTP
|
||||
forwardedPorts: ForwardedPort[] = []
|
||||
jumpStream: any
|
||||
proxyCommandStream: SSHProxyStream|null = null
|
||||
jumpChannel: russh.Channel|null = null
|
||||
savedPassword?: string
|
||||
get serviceMessage$ (): Observable<string> { return this.serviceMessage }
|
||||
get keyboardInteractivePrompt$ (): Observable<KeyboardInteractivePrompt> { return this.keyboardInteractivePrompt }
|
||||
get willDestroy$ (): Observable<void> { return this.willDestroy }
|
||||
|
||||
agentPath?: string
|
||||
activePrivateKey: string|null = null
|
||||
activePrivateKey: russh.KeyPair|null = null
|
||||
authUsername: string|null = null
|
||||
|
||||
open = false
|
||||
@@ -79,15 +103,11 @@ export class SSHSession {
|
||||
private serviceMessage = new Subject<string>()
|
||||
private keyboardInteractivePrompt = new Subject<KeyboardInteractivePrompt>()
|
||||
private willDestroy = new Subject<void>()
|
||||
private keychainPasswordUsed = false
|
||||
private hostKeyDigest = ''
|
||||
|
||||
private passwordStorage: PasswordStorageService
|
||||
private ngbModal: NgbModal
|
||||
private hostApp: HostAppService
|
||||
private platform: PlatformService
|
||||
private notifications: NotificationsService
|
||||
private zone: NgZone
|
||||
private fileProviders: FileProvidersService
|
||||
private config: ConfigService
|
||||
private translate: TranslateService
|
||||
@@ -103,9 +123,7 @@ export class SSHSession {
|
||||
this.passwordStorage = injector.get(PasswordStorageService)
|
||||
this.ngbModal = injector.get(NgbModal)
|
||||
this.hostApp = injector.get(HostAppService)
|
||||
this.platform = injector.get(PlatformService)
|
||||
this.notifications = injector.get(NotificationsService)
|
||||
this.zone = injector.get(NgZone)
|
||||
this.fileProviders = injector.get(FileProvidersService)
|
||||
this.config = injector.get(ConfigService)
|
||||
this.translate = injector.get(TranslateService)
|
||||
@@ -120,27 +138,6 @@ export class SSHSession {
|
||||
}
|
||||
|
||||
async init (): Promise<void> {
|
||||
if (this.hostApp.platform === Platform.Windows) {
|
||||
if (this.config.store.ssh.agentType === 'auto') {
|
||||
if (await fs.exists(WINDOWS_OPENSSH_AGENT_PIPE)) {
|
||||
this.agentPath = WINDOWS_OPENSSH_AGENT_PIPE
|
||||
} else {
|
||||
if (
|
||||
await this.platform.isProcessRunning('pageant.exe') ||
|
||||
await this.platform.isProcessRunning('gpg-agent.exe')
|
||||
) {
|
||||
this.agentPath = 'pageant'
|
||||
}
|
||||
}
|
||||
} else if (this.config.store.ssh.agentType === 'pageant') {
|
||||
this.agentPath = 'pageant'
|
||||
} else {
|
||||
this.agentPath = this.config.store.ssh.agentPath || WINDOWS_OPENSSH_AGENT_PIPE
|
||||
}
|
||||
} else {
|
||||
this.agentPath = process.env.SSH_AUTH_SOCK!
|
||||
}
|
||||
|
||||
this.remainingAuthMethods = [{ type: 'none' }]
|
||||
if (!this.profile.options.auth || this.profile.options.auth === 'publicKey') {
|
||||
if (this.profile.options.privateKeys?.length) {
|
||||
@@ -167,181 +164,192 @@ export class SSHSession {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!this.profile.options.auth || this.profile.options.auth === 'agent') {
|
||||
if (!this.agentPath) {
|
||||
this.emitServiceMessage(colors.bgYellow.yellow.black(' ! ') + ` Agent auth selected, but no running agent is detected`)
|
||||
const spec = await this.getAgentConnectionSpec()
|
||||
if (!spec) {
|
||||
this.emitServiceMessage(colors.bgYellow.yellow.black(' ! ') + ` Agent auth selected, but no running Agent process is found`)
|
||||
} else {
|
||||
this.remainingAuthMethods.push({ type: 'agent' })
|
||||
this.remainingAuthMethods.push({
|
||||
type: 'agent',
|
||||
...spec,
|
||||
})
|
||||
}
|
||||
}
|
||||
if (!this.profile.options.auth || this.profile.options.auth === 'password') {
|
||||
this.remainingAuthMethods.push({ type: 'password' })
|
||||
if (this.profile.options.password) {
|
||||
this.remainingAuthMethods.push({ type: 'saved-password', password: this.profile.options.password })
|
||||
}
|
||||
const password = await this.passwordStorage.loadPassword(this.profile)
|
||||
if (password) {
|
||||
this.remainingAuthMethods.push({ type: 'saved-password', password })
|
||||
}
|
||||
this.remainingAuthMethods.push({ type: 'prompt-password' })
|
||||
}
|
||||
if (!this.profile.options.auth || this.profile.options.auth === 'keyboardInteractive') {
|
||||
const savedPassword = this.profile.options.password ?? await this.passwordStorage.loadPassword(this.profile)
|
||||
if (savedPassword) {
|
||||
this.remainingAuthMethods.push({ type: 'keyboard-interactive', savedPassword })
|
||||
}
|
||||
this.remainingAuthMethods.push({ type: 'keyboard-interactive' })
|
||||
}
|
||||
this.remainingAuthMethods.push({ type: 'hostbased' })
|
||||
}
|
||||
|
||||
private async getAgentConnectionSpec (): Promise<russh.AgentConnectionSpec|null> {
|
||||
if (this.hostApp.platform === Platform.Windows) {
|
||||
if (this.config.store.ssh.agentType === 'auto') {
|
||||
if (await fs.exists(WINDOWS_OPENSSH_AGENT_PIPE)) {
|
||||
return {
|
||||
kind: 'named-pipe',
|
||||
path: WINDOWS_OPENSSH_AGENT_PIPE,
|
||||
}
|
||||
} else if (russh.isPageantRunning()) {
|
||||
return {
|
||||
kind: 'pageant',
|
||||
}
|
||||
} else {
|
||||
this.emitServiceMessage(colors.bgYellow.yellow.black(' ! ') + ` Agent auth selected, but no running Agent process is found`)
|
||||
}
|
||||
} else if (this.config.store.ssh.agentType === 'pageant') {
|
||||
return {
|
||||
kind: 'pageant',
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
kind: 'named-pipe',
|
||||
path: this.config.store.ssh.agentPath || WINDOWS_OPENSSH_AGENT_PIPE,
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
kind: 'unix-socket',
|
||||
path: process.env.SSH_AUTH_SOCK!,
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
async openSFTP (): Promise<SFTPSession> {
|
||||
if (!(this.ssh instanceof russh.AuthenticatedSSHClient)) {
|
||||
throw new Error('Cannot open SFTP session before auth')
|
||||
}
|
||||
if (!this.sftp) {
|
||||
this.sftp = await wrapPromise(this.zone, promisify<SFTPWrapper>(f => this.ssh.sftp(f))())
|
||||
this.sftp = await this.ssh.openSFTPChannel()
|
||||
}
|
||||
return new SFTPSession(this.sftp, this.injector)
|
||||
}
|
||||
|
||||
|
||||
async start (): Promise<void> {
|
||||
const log = (s: any) => this.emitServiceMessage(s)
|
||||
|
||||
const ssh = new Client()
|
||||
this.ssh = ssh
|
||||
await this.init()
|
||||
|
||||
let connected = false
|
||||
const algorithms = {}
|
||||
for (const key of Object.values(SSHAlgorithmType)) {
|
||||
algorithms[key] = this.profile.options.algorithms![key].filter(x => supportedAlgorithms[key].includes(x))
|
||||
}
|
||||
|
||||
const hostVerifiedPromise: Promise<void> = new Promise((resolve, reject) => {
|
||||
ssh.on('handshake', async handshake => {
|
||||
if (!await this.verifyHostKey(handshake)) {
|
||||
this.ssh.end()
|
||||
reject(new Error('Host key verification failed'))
|
||||
}
|
||||
this.logger.info('Handshake complete:', handshake)
|
||||
resolve()
|
||||
})
|
||||
})
|
||||
// eslint-disable-next-line @typescript-eslint/init-declarations
|
||||
let transport: russh.SshTransport
|
||||
if (this.profile.options.proxyCommand) {
|
||||
this.emitServiceMessage(colors.bgBlue.black(' Proxy command ') + ` Using ${this.profile.options.proxyCommand}`)
|
||||
|
||||
const resultPromise: Promise<void> = new Promise(async (resolve, reject) => {
|
||||
ssh.on('ready', () => {
|
||||
connected = true
|
||||
if (this.savedPassword) {
|
||||
this.passwordStorage.savePassword(this.profile, this.savedPassword)
|
||||
}
|
||||
|
||||
this.zone.run(resolve)
|
||||
})
|
||||
ssh.on('error', error => {
|
||||
if (error.message === 'All configured authentication methods failed') {
|
||||
this.passwordStorage.deletePassword(this.profile)
|
||||
}
|
||||
this.zone.run(() => {
|
||||
if (connected) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-base-to-string
|
||||
this.notifications.error(error.toString())
|
||||
} else {
|
||||
reject(error)
|
||||
}
|
||||
})
|
||||
})
|
||||
ssh.on('close', () => {
|
||||
if (this.open) {
|
||||
this.destroy()
|
||||
}
|
||||
})
|
||||
|
||||
ssh.on('keyboard-interactive', (name, instructions, instructionsLang, prompts, finish) => this.zone.run(async () => {
|
||||
this.emitKeyboardInteractivePrompt(new KeyboardInteractivePrompt(
|
||||
name,
|
||||
instructions,
|
||||
prompts,
|
||||
finish,
|
||||
))
|
||||
}))
|
||||
|
||||
ssh.on('greeting', greeting => {
|
||||
if (!this.profile.options.skipBanner) {
|
||||
log('Greeting: ' + greeting)
|
||||
}
|
||||
})
|
||||
|
||||
ssh.on('banner', banner => {
|
||||
if (!this.profile.options.skipBanner) {
|
||||
log(banner)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
try {
|
||||
if (this.profile.options.socksProxyHost) {
|
||||
this.emitServiceMessage(colors.bgBlue.black(' Proxy ') + ` Using ${this.profile.options.socksProxyHost}:${this.profile.options.socksProxyPort}`)
|
||||
this.proxyCommandStream = new SocksProxyStream(this.profile)
|
||||
}
|
||||
if (this.profile.options.httpProxyHost) {
|
||||
this.emitServiceMessage(colors.bgBlue.black(' Proxy ') + ` Using ${this.profile.options.httpProxyHost}:${this.profile.options.httpProxyPort}`)
|
||||
this.proxyCommandStream = new HTTPProxyStream(this.profile)
|
||||
}
|
||||
if (this.profile.options.proxyCommand) {
|
||||
this.emitServiceMessage(colors.bgBlue.black(' Proxy command ') + ` Using ${this.profile.options.proxyCommand}`)
|
||||
this.proxyCommandStream = new ProxyCommandStream(this.profile.options.proxyCommand)
|
||||
}
|
||||
if (this.proxyCommandStream) {
|
||||
this.proxyCommandStream.destroyed$.subscribe(err => {
|
||||
if (err) {
|
||||
this.emitServiceMessage(colors.bgRed.black(' X ') + ` ${err.message}`)
|
||||
this.destroy()
|
||||
}
|
||||
})
|
||||
|
||||
this.proxyCommandStream.message$.subscribe(message => {
|
||||
this.emitServiceMessage(colors.bgBlue.black(' Proxy ') + ' ' + message.trim())
|
||||
})
|
||||
|
||||
await this.proxyCommandStream.start()
|
||||
}
|
||||
|
||||
this.authUsername ??= this.profile.options.user
|
||||
if (!this.authUsername) {
|
||||
const modal = this.ngbModal.open(PromptModalComponent)
|
||||
modal.componentInstance.prompt = `Username for ${this.profile.options.host}`
|
||||
try {
|
||||
const result = await modal.result.catch(() => null)
|
||||
this.authUsername = result?.value ?? null
|
||||
} catch {
|
||||
this.authUsername = 'root'
|
||||
}
|
||||
}
|
||||
if (this.authUsername?.startsWith('$')) {
|
||||
try {
|
||||
const result = process.env[this.authUsername.slice(1)]
|
||||
this.authUsername = result ?? this.authUsername
|
||||
} catch {
|
||||
this.authUsername = 'root'
|
||||
}
|
||||
}
|
||||
|
||||
ssh.connect({
|
||||
host: this.profile.options.host.trim(),
|
||||
port: this.profile.options.port ?? 22,
|
||||
sock: this.proxyCommandStream?.socket ?? this.jumpStream,
|
||||
username: this.authUsername ?? undefined,
|
||||
tryKeyboard: true,
|
||||
agent: this.agentPath,
|
||||
agentForward: this.profile.options.agentForward && !!this.agentPath,
|
||||
keepaliveInterval: this.profile.options.keepaliveInterval ?? 15000,
|
||||
keepaliveCountMax: this.profile.options.keepaliveCountMax,
|
||||
readyTimeout: this.profile.options.readyTimeout,
|
||||
hostVerifier: (key: any) => {
|
||||
this.hostKeyDigest = crypto.createHash('sha256').update(key).digest('base64')
|
||||
return true
|
||||
},
|
||||
algorithms,
|
||||
authHandler: (methodsLeft, partialSuccess, callback) => {
|
||||
this.zone.run(async () => {
|
||||
callback(await this.handleAuth(methodsLeft))
|
||||
})
|
||||
},
|
||||
})
|
||||
} catch (e) {
|
||||
this.notifications.error(e.message)
|
||||
throw e
|
||||
const argv = shellQuote.parse(this.profile.options.proxyCommand)
|
||||
transport = await russh.SshTransport.newCommand(argv[0], argv.slice(1))
|
||||
} else if (this.jumpChannel) {
|
||||
transport = await russh.SshTransport.newSshChannel(await this.jumpChannel.take())
|
||||
this.jumpChannel = null
|
||||
} else if (this.profile.options.socksProxyHost) {
|
||||
this.emitServiceMessage(colors.bgBlue.black(' Proxy ') + ` Using ${this.profile.options.socksProxyHost}:${this.profile.options.socksProxyPort}`)
|
||||
transport = await russh.SshTransport.newSocksProxy(
|
||||
this.profile.options.socksProxyHost,
|
||||
this.profile.options.socksProxyPort ?? 1080,
|
||||
this.profile.options.host,
|
||||
this.profile.options.port ?? 22,
|
||||
)
|
||||
} else if (this.profile.options.httpProxyHost) {
|
||||
this.emitServiceMessage(colors.bgBlue.black(' Proxy ') + ` Using ${this.profile.options.httpProxyHost}:${this.profile.options.httpProxyPort}`)
|
||||
transport = await russh.SshTransport.newHttpProxy(
|
||||
this.profile.options.httpProxyHost,
|
||||
this.profile.options.httpProxyPort ?? 8080,
|
||||
this.profile.options.host,
|
||||
this.profile.options.port ?? 22,
|
||||
)
|
||||
} else {
|
||||
transport = await russh.SshTransport.newSocket(`${this.profile.options.host.trim()}:${this.profile.options.port ?? 22}`)
|
||||
}
|
||||
|
||||
await resultPromise
|
||||
await hostVerifiedPromise
|
||||
this.ssh = await russh.SSHClient.connect(
|
||||
transport,
|
||||
async key => {
|
||||
if (!await this.verifyHostKey(key)) {
|
||||
return false
|
||||
}
|
||||
this.logger.info('Host key verified')
|
||||
return true
|
||||
},
|
||||
{
|
||||
preferred: {
|
||||
ciphers: this.profile.options.algorithms?.[SSHAlgorithmType.CIPHER]?.filter(x => supportedAlgorithms[SSHAlgorithmType.CIPHER].includes(x)),
|
||||
kex: this.profile.options.algorithms?.[SSHAlgorithmType.KEX]?.filter(x => supportedAlgorithms[SSHAlgorithmType.KEX].includes(x)),
|
||||
mac: this.profile.options.algorithms?.[SSHAlgorithmType.HMAC]?.filter(x => supportedAlgorithms[SSHAlgorithmType.HMAC].includes(x)),
|
||||
key: this.profile.options.algorithms?.[SSHAlgorithmType.HOSTKEY]?.filter(x => supportedAlgorithms[SSHAlgorithmType.HOSTKEY].includes(x)),
|
||||
},
|
||||
keepaliveIntervalSeconds: Math.round((this.profile.options.keepaliveInterval ?? 15000) / 1000),
|
||||
keepaliveCountMax: this.profile.options.keepaliveCountMax,
|
||||
connectionTimeoutSeconds: this.profile.options.readyTimeout ? Math.round(this.profile.options.readyTimeout / 1000) : undefined,
|
||||
},
|
||||
)
|
||||
|
||||
this.ssh.banner$.subscribe(banner => {
|
||||
if (!this.profile.options.skipBanner) {
|
||||
this.emitServiceMessage(banner)
|
||||
}
|
||||
})
|
||||
|
||||
this.ssh.disconnect$.subscribe(() => {
|
||||
if (this.open) {
|
||||
this.destroy()
|
||||
}
|
||||
})
|
||||
|
||||
// Authentication
|
||||
|
||||
this.authUsername ??= this.profile.options.user
|
||||
if (!this.authUsername) {
|
||||
const modal = this.ngbModal.open(PromptModalComponent)
|
||||
modal.componentInstance.prompt = `Username for ${this.profile.options.host}`
|
||||
try {
|
||||
const result = await modal.result.catch(() => null)
|
||||
this.authUsername = result?.value ?? null
|
||||
} catch {
|
||||
this.authUsername = 'root'
|
||||
}
|
||||
}
|
||||
|
||||
if (this.authUsername?.startsWith('$')) {
|
||||
try {
|
||||
const result = process.env[this.authUsername.slice(1)]
|
||||
this.authUsername = result ?? this.authUsername
|
||||
} catch {
|
||||
this.authUsername = 'root'
|
||||
}
|
||||
}
|
||||
|
||||
const authenticatedClient = await this.handleAuth()
|
||||
if (authenticatedClient) {
|
||||
this.ssh = authenticatedClient
|
||||
} else {
|
||||
this.ssh.disconnect()
|
||||
this.passwordStorage.deletePassword(this.profile)
|
||||
// eslint-disable-next-line @typescript-eslint/no-base-to-string
|
||||
throw new Error('Authentication rejected')
|
||||
}
|
||||
|
||||
// auth success
|
||||
|
||||
if (this.savedPassword) {
|
||||
this.passwordStorage.savePassword(this.profile, this.savedPassword)
|
||||
}
|
||||
|
||||
for (const fw of this.profile.options.forwardedPorts ?? []) {
|
||||
this.addPortForward(Object.assign(new ForwardedPort(), fw))
|
||||
@@ -349,12 +357,11 @@ export class SSHSession {
|
||||
|
||||
this.open = true
|
||||
|
||||
this.ssh.on('tcp connection', (details, accept, reject) => {
|
||||
this.logger.info(`Incoming forwarded connection: (remote) ${details.srcIP}:${details.srcPort} -> (local) ${details.destIP}:${details.destPort}`)
|
||||
const forward = this.forwardedPorts.find(x => x.port === details.destPort)
|
||||
this.ssh.tcpChannelOpen$.subscribe(async event => {
|
||||
this.logger.info(`Incoming forwarded connection: ${event.clientAddress}:${event.clientPort} -> ${event.targetAddress}:${event.targetPort}`)
|
||||
const forward = this.forwardedPorts.find(x => x.port === event.targetPort && x.host === event.targetAddress)
|
||||
if (!forward) {
|
||||
this.emitServiceMessage(colors.bgRed.black(' X ') + ` Rejected incoming forwarded connection for unrecognized port ${details.destPort}`)
|
||||
reject()
|
||||
this.emitServiceMessage(colors.bgRed.black(' X ') + ` Rejected incoming forwarded connection for unrecognized port ${event.targetAddress}:${event.targetPort}`)
|
||||
return
|
||||
}
|
||||
const socket = new Socket()
|
||||
@@ -362,24 +369,19 @@ export class SSHSession {
|
||||
socket.on('error', e => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-base-to-string
|
||||
this.emitServiceMessage(colors.bgRed.black(' X ') + ` Could not forward the remote connection to ${forward.targetAddress}:${forward.targetPort}: ${e}`)
|
||||
reject()
|
||||
event.channel.close()
|
||||
})
|
||||
event.channel.data$.subscribe(data => socket.write(data))
|
||||
socket.on('data', data => event.channel.write(Uint8Array.from(data)))
|
||||
event.channel.closed$.subscribe(() => socket.destroy())
|
||||
socket.on('close', () => event.channel.close())
|
||||
socket.on('connect', () => {
|
||||
this.logger.info('Connection forwarded')
|
||||
const stream = accept()
|
||||
stream.pipe(socket)
|
||||
socket.pipe(stream)
|
||||
stream.on('close', () => {
|
||||
socket.destroy()
|
||||
})
|
||||
socket.on('close', () => {
|
||||
stream.close()
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
this.ssh.on('x11', async (details, accept, reject) => {
|
||||
this.logger.info(`Incoming X11 connection from ${details.srcIP}:${details.srcPort}`)
|
||||
this.ssh.x11ChannelOpen$.subscribe(async event => {
|
||||
this.logger.info(`Incoming X11 connection from ${event.clientAddress}:${event.clientPort}`)
|
||||
const displaySpec = (this.config.store.ssh.x11Display || process.env.DISPLAY) ?? 'localhost:0'
|
||||
this.logger.debug(`Trying display ${displaySpec}`)
|
||||
|
||||
@@ -387,14 +389,18 @@ export class SSHSession {
|
||||
try {
|
||||
const x11Stream = await socket.connect(displaySpec)
|
||||
this.logger.info('Connection forwarded')
|
||||
const stream = accept()
|
||||
stream.pipe(x11Stream)
|
||||
x11Stream.pipe(stream)
|
||||
stream.on('close', () => {
|
||||
|
||||
event.channel.data$.subscribe(data => {
|
||||
x11Stream.write(data)
|
||||
})
|
||||
x11Stream.on('data', data => {
|
||||
event.channel.write(Uint8Array.from(data))
|
||||
})
|
||||
event.channel.closed$.subscribe(() => {
|
||||
socket.destroy()
|
||||
})
|
||||
x11Stream.on('close', () => {
|
||||
stream.close()
|
||||
event.channel.close()
|
||||
})
|
||||
} catch (e) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-base-to-string
|
||||
@@ -405,27 +411,43 @@ export class SSHSession {
|
||||
this.emitServiceMessage(' * VcXsrv: https://sourceforge.net/projects/vcxsrv/')
|
||||
this.emitServiceMessage(' * Xming: https://sourceforge.net/projects/xming/')
|
||||
}
|
||||
reject()
|
||||
event.channel.close()
|
||||
}
|
||||
})
|
||||
|
||||
this.ssh.agentChannelOpen$.subscribe(async channel => {
|
||||
const spec = await this.getAgentConnectionSpec()
|
||||
if (!spec) {
|
||||
await channel.close()
|
||||
return
|
||||
}
|
||||
|
||||
const agent = await russh.SSHAgentStream.connect(spec)
|
||||
channel.data$.subscribe(data => agent.write(data))
|
||||
agent.data$.subscribe(data => channel.write(data), undefined, () => channel.close())
|
||||
channel.closed$.subscribe(() => agent.close())
|
||||
})
|
||||
}
|
||||
|
||||
private async verifyHostKey (handshake: Handshake): Promise<boolean> {
|
||||
private async verifyHostKey (key: russh.SshPublicKey): Promise<boolean> {
|
||||
this.emitServiceMessage('Host key fingerprint:')
|
||||
this.emitServiceMessage(colors.white.bgBlack(` ${handshake.serverHostKey} `) + colors.bgBlackBright(' ' + this.hostKeyDigest + ' '))
|
||||
this.emitServiceMessage(colors.white.bgBlack(` ${key.algorithm()} `) + colors.bgBlackBright(' ' + key.fingerprint() + ' '))
|
||||
if (!this.config.store.ssh.verifyHostKeys) {
|
||||
return true
|
||||
}
|
||||
const selector = {
|
||||
host: this.profile.options.host,
|
||||
port: this.profile.options.port ?? 22,
|
||||
type: handshake.serverHostKey,
|
||||
type: key.algorithm(),
|
||||
}
|
||||
|
||||
const keyDigest = crypto.createHash('sha256').update(key.bytes()).digest('base64')
|
||||
|
||||
const knownHost = this.knownHosts.getFor(selector)
|
||||
if (!knownHost || knownHost.digest !== this.hostKeyDigest) {
|
||||
if (!knownHost || knownHost.digest !== keyDigest) {
|
||||
const modal = this.ngbModal.open(HostKeyPromptModalComponent)
|
||||
modal.componentInstance.selector = selector
|
||||
modal.componentInstance.digest = this.hostKeyDigest
|
||||
modal.componentInstance.digest = keyDigest
|
||||
return modal.result.catch(() => false)
|
||||
}
|
||||
return true
|
||||
@@ -447,57 +469,49 @@ export class SSHSession {
|
||||
this.keyboardInteractivePrompt.next(prompt)
|
||||
}
|
||||
|
||||
async handleAuth (methodsLeft?: string[] | null): Promise<any> {
|
||||
async handleAuth (methodsLeft?: string[] | null): Promise<russh.AuthenticatedSSHClient|null> {
|
||||
this.activePrivateKey = null
|
||||
|
||||
if (!(this.ssh instanceof russh.SSHClient)) {
|
||||
throw new Error('Wrong state for auth handling')
|
||||
}
|
||||
|
||||
if (!this.authUsername) {
|
||||
throw new Error('No username')
|
||||
}
|
||||
|
||||
while (true) {
|
||||
const method = this.remainingAuthMethods.shift()
|
||||
if (!method) {
|
||||
return false
|
||||
return null
|
||||
}
|
||||
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)
|
||||
continue
|
||||
}
|
||||
if (method.type === 'password') {
|
||||
if (this.profile.options.password) {
|
||||
this.emitServiceMessage(this.translate.instant('Using preset password'))
|
||||
return {
|
||||
type: 'password',
|
||||
username: this.authUsername,
|
||||
password: this.profile.options.password,
|
||||
}
|
||||
if (method.type === 'saved-password') {
|
||||
this.emitServiceMessage(this.translate.instant('Using saved password'))
|
||||
const result = await this.ssh.authenticateWithPassword(this.authUsername, method.password)
|
||||
if (result) {
|
||||
return result
|
||||
}
|
||||
|
||||
if (!this.keychainPasswordUsed && this.profile.options.user) {
|
||||
const password = await this.passwordStorage.loadPassword(this.profile)
|
||||
if (password) {
|
||||
this.emitServiceMessage(this.translate.instant('Trying saved password'))
|
||||
this.keychainPasswordUsed = true
|
||||
return {
|
||||
type: 'password',
|
||||
username: this.authUsername,
|
||||
password,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if (method.type === 'prompt-password') {
|
||||
const modal = this.ngbModal.open(PromptModalComponent)
|
||||
modal.componentInstance.prompt = `Password for ${this.authUsername}@${this.profile.options.host}`
|
||||
modal.componentInstance.password = true
|
||||
modal.componentInstance.showRememberCheckbox = true
|
||||
|
||||
try {
|
||||
const result = await modal.result.catch(() => null)
|
||||
if (result) {
|
||||
if (result.remember) {
|
||||
this.savedPassword = result.value
|
||||
const promptResult = await modal.result.catch(() => null)
|
||||
if (promptResult) {
|
||||
if (promptResult.remember) {
|
||||
this.savedPassword = promptResult.value
|
||||
}
|
||||
return {
|
||||
type: 'password',
|
||||
username: this.authUsername,
|
||||
password: result.value,
|
||||
const result = await this.ssh.authenticateWithPassword(this.authUsername, promptResult.value)
|
||||
if (result) {
|
||||
return result
|
||||
}
|
||||
} else {
|
||||
continue
|
||||
@@ -506,50 +520,104 @@ export class SSHSession {
|
||||
continue
|
||||
}
|
||||
}
|
||||
if (method.type === 'publickey' && method.contents) {
|
||||
if (method.type === 'publickey') {
|
||||
try {
|
||||
const key = await this.loadPrivateKey(method.name!, method.contents)
|
||||
return {
|
||||
type: 'publickey',
|
||||
username: this.authUsername,
|
||||
key,
|
||||
const key = await this.loadPrivateKey(method.name, method.contents)
|
||||
const result = await this.ssh.authenticateWithKeyPair(this.authUsername, key)
|
||||
if (result) {
|
||||
return result
|
||||
}
|
||||
} catch (e) {
|
||||
this.emitServiceMessage(colors.bgYellow.yellow.black(' ! ') + ` Failed to load private key ${method.name}: ${e}`)
|
||||
continue
|
||||
}
|
||||
}
|
||||
return method.type
|
||||
if (method.type === 'keyboard-interactive') {
|
||||
let state: russh.AuthenticatedSSHClient|russh.KeyboardInteractiveAuthenticationState = await this.ssh.startKeyboardInteractiveAuthentication(this.authUsername)
|
||||
|
||||
while (true) {
|
||||
if (state.state === 'failure') {
|
||||
break
|
||||
}
|
||||
|
||||
const prompts = state.prompts()
|
||||
|
||||
let responses: string[] = []
|
||||
// OpenSSH can send a k-i request without prompts
|
||||
// just respond ok to it
|
||||
if (prompts.length > 0) {
|
||||
const prompt = new KeyboardInteractivePrompt(
|
||||
state.name,
|
||||
state.instructions,
|
||||
state.prompts(),
|
||||
)
|
||||
|
||||
if (method.savedPassword) {
|
||||
// eslint-disable-next-line max-depth
|
||||
for (let i = 0; i < prompt.prompts.length; i++) {
|
||||
// eslint-disable-next-line max-depth
|
||||
if (prompt.isAPasswordPrompt(i)) {
|
||||
prompt.responses[i] = method.savedPassword
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.emitKeyboardInteractivePrompt(prompt)
|
||||
|
||||
try {
|
||||
// eslint-disable-next-line @typescript-eslint/await-thenable
|
||||
responses = await prompt.promise
|
||||
} catch {
|
||||
break // this loop
|
||||
}
|
||||
}
|
||||
|
||||
state = await this.ssh .continueKeyboardInteractiveAuthentication(responses)
|
||||
|
||||
if (state instanceof russh.AuthenticatedSSHClient) {
|
||||
return state
|
||||
}
|
||||
}
|
||||
}
|
||||
if (method.type === 'agent') {
|
||||
try {
|
||||
const result = await this.ssh.authenticateWithAgent(this.authUsername, method)
|
||||
if (result) {
|
||||
return result
|
||||
}
|
||||
} catch (e) {
|
||||
this.emitServiceMessage(colors.bgYellow.yellow.black(' ! ') + ` Failed to authenticate using agent: ${e}`)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
async addPortForward (fw: ForwardedPort): Promise<void> {
|
||||
if (fw.type === PortForwardType.Local || fw.type === PortForwardType.Dynamic) {
|
||||
await fw.startLocalListener((accept, reject, sourceAddress, sourcePort, targetAddress, targetPort) => {
|
||||
await fw.startLocalListener(async (accept, reject, sourceAddress, sourcePort, targetAddress, targetPort) => {
|
||||
this.logger.info(`New connection on ${fw}`)
|
||||
this.ssh.forwardOut(
|
||||
sourceAddress ?? '127.0.0.1',
|
||||
sourcePort ?? 0,
|
||||
targetAddress,
|
||||
targetPort,
|
||||
(err, stream) => {
|
||||
if (err) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-base-to-string
|
||||
this.emitServiceMessage(colors.bgRed.black(' X ') + ` Remote has rejected the forwarded connection to ${targetAddress}:${targetPort} via ${fw}: ${err}`)
|
||||
reject()
|
||||
return
|
||||
}
|
||||
const socket = accept()
|
||||
stream.pipe(socket)
|
||||
socket.pipe(stream)
|
||||
stream.on('close', () => {
|
||||
socket.destroy()
|
||||
})
|
||||
socket.on('close', () => {
|
||||
stream.close()
|
||||
})
|
||||
},
|
||||
)
|
||||
if (!(this.ssh instanceof russh.AuthenticatedSSHClient)) {
|
||||
this.logger.error(`Connection while unauthenticated on ${fw}`)
|
||||
reject()
|
||||
return
|
||||
}
|
||||
const channel = await this.ssh.openTCPForwardChannel({
|
||||
addressToConnectTo: targetAddress,
|
||||
portToConnectTo: targetPort,
|
||||
originatorAddress: sourceAddress ?? '127.0.0.1',
|
||||
originatorPort: sourcePort ?? 0,
|
||||
}).catch(err => {
|
||||
this.emitServiceMessage(colors.bgRed.black(' X ') + ` Remote has rejected the forwarded connection to ${targetAddress}:${targetPort} via ${fw}: ${err}`)
|
||||
reject()
|
||||
throw err
|
||||
})
|
||||
const socket = accept()
|
||||
channel.data$.subscribe(data => socket.write(data))
|
||||
socket.on('data', data => channel.write(Uint8Array.from(data)))
|
||||
channel.closed$.subscribe(() => socket.destroy())
|
||||
socket.on('close', () => channel.close())
|
||||
}).then(() => {
|
||||
this.emitServiceMessage(colors.bgGreen.black(' -> ') + ` Forwarded ${fw}`)
|
||||
this.forwardedPorts.push(fw)
|
||||
@@ -559,17 +627,16 @@ export class SSHSession {
|
||||
})
|
||||
}
|
||||
if (fw.type === PortForwardType.Remote) {
|
||||
await new Promise<void>((resolve, reject) => {
|
||||
this.ssh.forwardIn(fw.host, fw.port, err => {
|
||||
if (err) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-base-to-string
|
||||
this.emitServiceMessage(colors.bgRed.black(' X ') + ` Remote rejected port forwarding for ${fw}: ${err}`)
|
||||
reject(err)
|
||||
return
|
||||
}
|
||||
resolve()
|
||||
})
|
||||
})
|
||||
if (!(this.ssh instanceof russh.AuthenticatedSSHClient)) {
|
||||
throw new Error('Cannot add remote port forward before auth')
|
||||
}
|
||||
try {
|
||||
await this.ssh.forwardTCPPort(fw.host, fw.port)
|
||||
} catch (err) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-base-to-string
|
||||
this.emitServiceMessage(colors.bgRed.black(' X ') + ` Remote rejected port forwarding for ${fw}: ${err}`)
|
||||
return
|
||||
}
|
||||
this.emitServiceMessage(colors.bgGreen.black(' <- ') + ` Forwarded ${fw}`)
|
||||
this.forwardedPorts.push(fw)
|
||||
}
|
||||
@@ -581,7 +648,10 @@ export class SSHSession {
|
||||
this.forwardedPorts = this.forwardedPorts.filter(x => x !== fw)
|
||||
}
|
||||
if (fw.type === PortForwardType.Remote) {
|
||||
this.ssh.unforwardIn(fw.host, fw.port)
|
||||
if (!(this.ssh instanceof russh.AuthenticatedSSHClient)) {
|
||||
throw new Error('Cannot remove remote port forward before auth')
|
||||
}
|
||||
this.ssh.stopForwardingTCPPort(fw.host, fw.port)
|
||||
this.forwardedPorts = this.forwardedPorts.filter(x => x !== fw)
|
||||
}
|
||||
this.emitServiceMessage(`Stopped forwarding ${fw}`)
|
||||
@@ -592,43 +662,55 @@ export class SSHSession {
|
||||
this.willDestroy.next()
|
||||
this.willDestroy.complete()
|
||||
this.serviceMessage.complete()
|
||||
this.proxyCommandStream?.stop()
|
||||
this.ssh.end()
|
||||
this.ssh.disconnect()
|
||||
}
|
||||
|
||||
openShellChannel (options: { x11: boolean }): Promise<ClientChannel> {
|
||||
return new Promise<ClientChannel>((resolve, reject) => {
|
||||
this.ssh.shell({ term: 'xterm-256color' }, options, (err, shell) => {
|
||||
if (err) {
|
||||
reject(err)
|
||||
} else {
|
||||
resolve(shell)
|
||||
}
|
||||
})
|
||||
async openShellChannel (options: { x11: boolean }): Promise<russh.Channel> {
|
||||
if (!(this.ssh instanceof russh.AuthenticatedSSHClient)) {
|
||||
throw new Error('Cannot open shell channel before auth')
|
||||
}
|
||||
const ch = await this.ssh.openSessionChannel()
|
||||
await ch.requestPTY('xterm-256color', {
|
||||
columns: 80,
|
||||
rows: 24,
|
||||
pixHeight: 0,
|
||||
pixWidth: 0,
|
||||
})
|
||||
if (options.x11) {
|
||||
await ch.requestX11Forwarding({
|
||||
singleConnection: false,
|
||||
authProtocol: 'MIT-MAGIC-COOKIE-1',
|
||||
authCookie: crypto.randomBytes(16).toString('hex'),
|
||||
screenNumber: 0,
|
||||
})
|
||||
}
|
||||
if (this.profile.options.agentForward) {
|
||||
await ch.requestAgentForwarding()
|
||||
}
|
||||
await ch.requestShell()
|
||||
return ch
|
||||
}
|
||||
|
||||
async loadPrivateKey (name: string, privateKeyContents: Buffer): Promise<string|null> {
|
||||
async loadPrivateKey (name: string, privateKeyContents: Buffer): Promise<russh.KeyPair> {
|
||||
this.emitServiceMessage(`Loading private key: ${name}`)
|
||||
const parsedKey = await this.parsePrivateKey(privateKeyContents.toString())
|
||||
this.activePrivateKey = parsedKey.toString('openssh')
|
||||
this.activePrivateKey = await this.loadPrivateKeyWithPassphraseMaybe(privateKeyContents.toString())
|
||||
return this.activePrivateKey
|
||||
}
|
||||
|
||||
async parsePrivateKey (privateKey: string): Promise<any> {
|
||||
async loadPrivateKeyWithPassphraseMaybe (privateKey: string): Promise<russh.KeyPair> {
|
||||
const keyHash = crypto.createHash('sha512').update(privateKey).digest('hex')
|
||||
let triedSavedPassphrase = false
|
||||
let passphrase: string|null = null
|
||||
while (true) {
|
||||
try {
|
||||
return sshpk.parsePrivateKey(privateKey, 'auto', { passphrase })
|
||||
return await russh.KeyPair.parse(privateKey, passphrase ?? undefined)
|
||||
} catch (e) {
|
||||
if (!triedSavedPassphrase) {
|
||||
passphrase = await this.passwordStorage.loadPrivateKeyPassword(keyHash)
|
||||
triedSavedPassphrase = true
|
||||
continue
|
||||
}
|
||||
if (e instanceof sshpk.KeyEncryptedError || e instanceof sshpk.KeyParseError) {
|
||||
if (e.toString() === 'Error: Keys(KeyIsEncrypted)' || e.toString() === 'Error: Keys(SshKey(Crypto))') {
|
||||
await this.passwordStorage.deletePrivateKeyPassword(keyHash)
|
||||
|
||||
const modal = this.ngbModal.open(PromptModalComponent)
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user