mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-02-25 12:08:38 +08:00
Compare commits
94 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e6aefcfa30 | ||
|
|
4c5ec42100 | ||
|
|
f61728e24c | ||
|
|
2d7d1d0545 | ||
|
|
968a9deee5 | ||
|
|
e79f254e50 | ||
|
|
8f712a51a3 | ||
|
|
7d20e0f26f | ||
|
|
c1b46b6b9d | ||
|
|
dd0e6c31ba | ||
|
|
54cf1c8225 | ||
|
|
a73be6fc94 | ||
|
|
2c976eb1e2 | ||
|
|
9dbb6217f7 | ||
|
|
1a8e3005cd | ||
|
|
e9b4e4d170 | ||
|
|
fb1661c897 | ||
|
|
ca7b4872d9 | ||
|
|
9475743b4e | ||
|
|
86bbdf7a5d | ||
|
|
4f6818477f | ||
|
|
d46862e47d | ||
|
|
61cdb60362 | ||
|
|
419bb3f0b0 | ||
|
|
0869ceb5da | ||
|
|
36e52e41ad | ||
|
|
bd85e9c322 | ||
|
|
6ffbcd1375 | ||
|
|
a7d0f3b149 | ||
|
|
5e60a47408 | ||
|
|
aa30f68c05 | ||
|
|
eee5b5f64c | ||
|
|
5298a5f83b | ||
|
|
d56df22838 | ||
|
|
ca00706a38 | ||
|
|
62276b4f4f | ||
|
|
e55722308e | ||
|
|
7c8d2daaf6 | ||
|
|
04e2792f5f | ||
|
|
7196dbed6e | ||
|
|
ec1de6413a | ||
|
|
d30ead1d96 | ||
|
|
20fcddffbd | ||
|
|
83aae23ba6 | ||
|
|
df847e9a60 | ||
|
|
2ad1c907b8 | ||
|
|
c626c2414d | ||
|
|
2864e1984a | ||
|
|
f0c5580f57 | ||
|
|
abde556695 | ||
|
|
c9d5e15ac0 | ||
|
|
16e9e716b6 | ||
|
|
f438bf582b | ||
|
|
c0789a5fc0 | ||
|
|
198967ea35 | ||
|
|
279fb72a4f | ||
|
|
5c2538e7af | ||
|
|
296aa7f8a0 | ||
|
|
2cb096178a | ||
|
|
57ee031827 | ||
|
|
52b6541dd0 | ||
|
|
86d9e62780 | ||
|
|
a8c822ee5d | ||
|
|
bc1f629c17 | ||
|
|
66a9882e30 | ||
|
|
978ead4c42 | ||
|
|
56010344b7 | ||
|
|
c853dd4279 | ||
|
|
f1f504f9f1 | ||
|
|
f34f962b73 | ||
|
|
ded19ce5b9 | ||
|
|
3f9ba53dca | ||
|
|
3e82b99f8e | ||
|
|
98e9e2a0e8 | ||
|
|
375cede605 | ||
|
|
838decccc4 | ||
|
|
b7742ff806 | ||
|
|
36815e9a02 | ||
|
|
581313341b | ||
|
|
d9109560a7 | ||
|
|
d7dc49f1f7 | ||
|
|
f9af3e3a0c | ||
|
|
3b73ee3a23 | ||
|
|
d8eb23a571 | ||
|
|
cc0761446f | ||
|
|
d972c0eda1 | ||
|
|
2d403913b5 | ||
|
|
62a83ad319 | ||
|
|
a7aacc7855 | ||
|
|
9ddeab9be2 | ||
|
|
d808bb2947 | ||
|
|
c19f33a137 | ||
|
|
11d3ea5f24 | ||
|
|
ca1b35440b |
6
.github/workflows/bridge.yml
vendored
6
.github/workflows/bridge.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
||||
job:
|
||||
- {
|
||||
target: x86_64-unknown-linux-gnu,
|
||||
os: ubuntu-20.04,
|
||||
os: ubuntu-22.04,
|
||||
extra-build-args: "",
|
||||
}
|
||||
steps:
|
||||
@@ -40,9 +40,9 @@ jobs:
|
||||
gcc \
|
||||
git \
|
||||
g++ \
|
||||
libclang-10-dev \
|
||||
libclang-11-dev \
|
||||
libgtk-3-dev \
|
||||
llvm-10-dev \
|
||||
llvm-11-dev \
|
||||
nasm \
|
||||
ninja-build \
|
||||
pkg-config \
|
||||
|
||||
6
.github/workflows/ci.yml
vendored
6
.github/workflows/ci.yml
vendored
@@ -4,9 +4,8 @@ env:
|
||||
# MIN_SUPPORTED_RUST_VERSION: "1.46.0"
|
||||
# CICD_INTERMEDIATES_DIR: "_cicd-intermediates"
|
||||
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
|
||||
# vcpkg version: 2024.11.16
|
||||
# for multiarch gcc compatibility
|
||||
VCPKG_COMMIT_ID: "b2cb0da531c2f1f740045bfe7c4dac59f0b2b69c"
|
||||
VCPKG_COMMIT_ID: "6f29f12e82a8293156836ad81cc9bf5af41fe836"
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
@@ -82,7 +81,7 @@ jobs:
|
||||
# - { target: x86_64-apple-darwin , os: macos-10.15 }
|
||||
# - { target: x86_64-pc-windows-gnu , os: windows-2022 }
|
||||
# - { target: x86_64-pc-windows-msvc , os: windows-2022 }
|
||||
- { target: x86_64-unknown-linux-gnu , os: ubuntu-20.04 }
|
||||
- { target: x86_64-unknown-linux-gnu , os: ubuntu-22.04 }
|
||||
# - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
|
||||
steps:
|
||||
- name: Export GitHub Actions cache environment variables
|
||||
@@ -112,6 +111,7 @@ jobs:
|
||||
g++ \
|
||||
libpam0g-dev \
|
||||
libasound2-dev \
|
||||
libunwind-dev \
|
||||
libgstreamer1.0-dev \
|
||||
libgstreamer-plugins-base1.0-dev \
|
||||
libgtk-3-dev \
|
||||
|
||||
40
.github/workflows/flutter-build.yml
vendored
40
.github/workflows/flutter-build.yml
vendored
@@ -32,8 +32,13 @@ env:
|
||||
TAG_NAME: "${{ inputs.upload-tag }}"
|
||||
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
|
||||
# vcpkg version: 2025.01.13
|
||||
# If we change the `VCPKG COMMIT_ID`, please remember:
|
||||
# 1. Call `$VCPKG_ROOT/vcpkg x-update-baseline` to update the baseline in `vcpkg.json`.
|
||||
# Or we may face build issue like
|
||||
# https://github.com/rustdesk/rustdesk/actions/runs/14414119794/job/40427970174
|
||||
# 2. Update the `VCPKG_COMMIT_ID` in `ci.yml` and `playground.yml`.
|
||||
VCPKG_COMMIT_ID: "6f29f12e82a8293156836ad81cc9bf5af41fe836"
|
||||
VERSION: "1.3.9"
|
||||
VERSION: "1.4.0"
|
||||
NDK_VERSION: "r27c"
|
||||
#signing keys env variable checks
|
||||
ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
|
||||
@@ -924,21 +929,21 @@ jobs:
|
||||
- {
|
||||
arch: aarch64,
|
||||
target: aarch64-linux-android,
|
||||
os: ubuntu-20.04,
|
||||
os: ubuntu-22.04,
|
||||
reltype: release,
|
||||
suffix: "",
|
||||
}
|
||||
- {
|
||||
arch: armv7,
|
||||
target: armv7-linux-androideabi,
|
||||
os: ubuntu-20.04,
|
||||
os: ubuntu-22.04,
|
||||
reltype: release,
|
||||
suffix: "",
|
||||
}
|
||||
- {
|
||||
arch: x86_64,
|
||||
target: x86_64-linux-android,
|
||||
os: ubuntu-20.04,
|
||||
os: ubuntu-22.04,
|
||||
reltype: release,
|
||||
suffix: "",
|
||||
}
|
||||
@@ -975,7 +980,8 @@ jobs:
|
||||
libayatana-appindicator3-dev \
|
||||
libasound2-dev \
|
||||
libc6-dev \
|
||||
libclang-10-dev \
|
||||
libclang-11-dev \
|
||||
libunwind-dev \
|
||||
libgstreamer1.0-dev \
|
||||
libgstreamer-plugins-base1.0-dev \
|
||||
libgtk-3-dev \
|
||||
@@ -987,7 +993,7 @@ jobs:
|
||||
libxcb-xfixes0-dev \
|
||||
libxdo-dev \
|
||||
libxfixes-dev \
|
||||
llvm-10-dev \
|
||||
llvm-11-dev \
|
||||
nasm \
|
||||
ninja-build \
|
||||
openjdk-17-jdk-headless \
|
||||
@@ -1206,7 +1212,7 @@ jobs:
|
||||
needs: [build-rustdesk-android]
|
||||
name: build rustdesk android universal apk
|
||||
if: ${{ inputs.upload-artifact }}
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
env:
|
||||
reltype: release
|
||||
x86_target: "" # can be ",android-x86"
|
||||
@@ -1244,7 +1250,8 @@ jobs:
|
||||
libayatana-appindicator3-dev \
|
||||
libasound2-dev \
|
||||
libc6-dev \
|
||||
libclang-10-dev \
|
||||
libclang-11-dev \
|
||||
libunwind-dev \
|
||||
libgstreamer1.0-dev \
|
||||
libgstreamer-plugins-base1.0-dev \
|
||||
libgtk-3-dev \
|
||||
@@ -1256,7 +1263,7 @@ jobs:
|
||||
libxcb-xfixes0-dev \
|
||||
libxdo-dev \
|
||||
libxfixes-dev \
|
||||
llvm-10-dev \
|
||||
llvm-11-dev \
|
||||
nasm \
|
||||
ninja-build \
|
||||
openjdk-17-jdk-headless \
|
||||
@@ -1396,7 +1403,7 @@ jobs:
|
||||
arch: x86_64,
|
||||
target: x86_64-unknown-linux-gnu,
|
||||
distro: ubuntu18.04,
|
||||
on: ubuntu-20.04,
|
||||
on: ubuntu-22.04,
|
||||
deb_arch: amd64,
|
||||
vcpkg-triplet: x64-linux,
|
||||
}
|
||||
@@ -1731,7 +1738,7 @@ jobs:
|
||||
- {
|
||||
arch: x86_64,
|
||||
target: x86_64-unknown-linux-gnu,
|
||||
on: ubuntu-20.04,
|
||||
on: ubuntu-22.04,
|
||||
distro: ubuntu18.04,
|
||||
deb_arch: amd64,
|
||||
sciter_arch: x64,
|
||||
@@ -1939,7 +1946,7 @@ jobs:
|
||||
build-appimage:
|
||||
name: Build appimage ${{ matrix.job.target }}
|
||||
needs: [build-rustdesk-linux]
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
if: ${{ inputs.upload-artifact }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
@@ -1968,7 +1975,8 @@ jobs:
|
||||
run: |
|
||||
# install libarchive-tools for bsdtar command used in AppImageBuilder.yml
|
||||
sudo apt-get update -y
|
||||
sudo apt-get install -y libarchive-tools
|
||||
# https://github.com/AppImage/AppImageKit/wiki/FUSE
|
||||
sudo apt-get install -y libarchive-tools libfuse2
|
||||
# set-up appimage-builder
|
||||
pushd /tmp
|
||||
wget -O appimage-builder-x86_64.AppImage https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-x86_64.AppImage
|
||||
@@ -2002,14 +2010,14 @@ jobs:
|
||||
- {
|
||||
target: x86_64-unknown-linux-gnu,
|
||||
distro: ubuntu18.04,
|
||||
on: ubuntu-20.04,
|
||||
on: ubuntu-22.04,
|
||||
arch: x86_64,
|
||||
suffix: "",
|
||||
}
|
||||
- {
|
||||
target: x86_64-unknown-linux-gnu,
|
||||
distro: ubuntu18.04,
|
||||
on: ubuntu-20.04,
|
||||
on: ubuntu-22.04,
|
||||
arch: x86_64,
|
||||
suffix: "-sciter",
|
||||
}
|
||||
@@ -2075,7 +2083,7 @@ jobs:
|
||||
build-rustdesk-web:
|
||||
if: False
|
||||
name: build-rustdesk-web
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
fail-fast: false
|
||||
env:
|
||||
|
||||
12
.github/workflows/playground.yml
vendored
12
.github/workflows/playground.yml
vendored
@@ -16,9 +16,8 @@ env:
|
||||
FLUTTER_ELINUX_VERSION: "3.16.9"
|
||||
TAG_NAME: "nightly"
|
||||
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
|
||||
# vcpkg version: 2024.11.16
|
||||
VCPKG_COMMIT_ID: "b2cb0da531c2f1f740045bfe7c4dac59f0b2b69c"
|
||||
VERSION: "1.3.9"
|
||||
VCPKG_COMMIT_ID: "6f29f12e82a8293156836ad81cc9bf5af41fe836"
|
||||
VERSION: "1.4.0"
|
||||
NDK_VERSION: "r26d"
|
||||
#signing keys env variable checks
|
||||
ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
|
||||
@@ -242,7 +241,7 @@ jobs:
|
||||
- {
|
||||
arch: aarch64,
|
||||
target: aarch64-linux-android,
|
||||
os: ubuntu-20.04,
|
||||
os: ubuntu-22.04,
|
||||
openssl-arch: android-arm64,
|
||||
ref: master, # latest
|
||||
}
|
||||
@@ -267,7 +266,8 @@ jobs:
|
||||
libayatana-appindicator3-dev\
|
||||
libasound2-dev \
|
||||
libc6-dev \
|
||||
libclang-10-dev \
|
||||
libclang-11-dev \
|
||||
libunwind-dev \
|
||||
libgstreamer1.0-dev \
|
||||
libgstreamer-plugins-base1.0-dev \
|
||||
libgtk-3-dev \
|
||||
@@ -280,7 +280,7 @@ jobs:
|
||||
libxcb-xfixes0-dev \
|
||||
libxdo-dev \
|
||||
libxfixes-dev \
|
||||
llvm-10-dev \
|
||||
llvm-11-dev \
|
||||
nasm \
|
||||
yasm \
|
||||
ninja-build \
|
||||
|
||||
594
Cargo.lock
generated
594
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
18
Cargo.toml
18
Cargo.toml
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "rustdesk"
|
||||
version = "1.3.9"
|
||||
version = "1.4.0"
|
||||
authors = ["rustdesk <info@rustdesk.com>"]
|
||||
edition = "2021"
|
||||
build= "build.rs"
|
||||
@@ -46,7 +46,6 @@ screencapturekit = ["cpal/screencapturekit"]
|
||||
|
||||
[dependencies]
|
||||
async-trait = "0.1"
|
||||
whoami = "1.5.0"
|
||||
scrap = { path = "libs/scrap", features = ["wayland"] }
|
||||
hbb_common = { path = "libs/hbb_common" }
|
||||
serde_derive = "1.0"
|
||||
@@ -95,7 +94,7 @@ sys-locale = "0.3"
|
||||
enigo = { path = "libs/enigo", features = [ "with_serde" ] }
|
||||
clipboard = { path = "libs/clipboard" }
|
||||
ctrlc = "3.2"
|
||||
# arboard = { version = "3.4.0", features = ["wayland-data-control"] }
|
||||
# arboard = { version = "3.4", features = ["wayland-data-control"] }
|
||||
arboard = { git = "https://github.com/rustdesk-org/arboard", features = ["wayland-data-control"] }
|
||||
clipboard-master = { git = "https://github.com/rustdesk-org/clipboard-master" }
|
||||
|
||||
@@ -118,13 +117,20 @@ winapi = { version = "0.3", features = [
|
||||
"ioapiset",
|
||||
"winspool",
|
||||
] }
|
||||
windows = { version = "0.61", features = [
|
||||
"Win32",
|
||||
"Win32_System",
|
||||
"Win32_System_Diagnostics",
|
||||
"Win32_System_Threading",
|
||||
"Win32_System_Diagnostics_ToolHelp",
|
||||
] }
|
||||
winreg = "0.11"
|
||||
windows-service = "0.6"
|
||||
virtual_display = { path = "libs/virtual_display" }
|
||||
remote_printer = { path = "libs/remote_printer" }
|
||||
impersonate_system = { git = "https://github.com/rustdesk-org/impersonate-system" }
|
||||
shared_memory = "0.12"
|
||||
tauri-winrt-notification = "0.1.2"
|
||||
tauri-winrt-notification = "0.1"
|
||||
runas = "1.2"
|
||||
|
||||
[target.'cfg(target_os = "macos")'.dependencies]
|
||||
@@ -215,7 +221,3 @@ panic = 'abort'
|
||||
strip = true
|
||||
#opt-level = 'z' # only have smaller size after strip
|
||||
rpath = true
|
||||
|
||||
[profile.dev]
|
||||
split-debuginfo = '...' # Platform-specific.
|
||||
#strip = "debuginfo"
|
||||
|
||||
@@ -117,7 +117,7 @@ cd
|
||||
```sh
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
||||
source $HOME/.cargo/env
|
||||
git clone https://github.com/rustdesk/rustdesk
|
||||
git clone --recurse-submodules https://github.com/rustdesk/rustdesk
|
||||
cd rustdesk
|
||||
mkdir -p target/debug
|
||||
wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so
|
||||
|
||||
@@ -18,7 +18,7 @@ AppDir:
|
||||
id: rustdesk
|
||||
name: rustdesk
|
||||
icon: rustdesk
|
||||
version: 1.3.9
|
||||
version: 1.4.0
|
||||
exec: usr/share/rustdesk/rustdesk
|
||||
exec_args: $@
|
||||
apt:
|
||||
|
||||
@@ -18,7 +18,7 @@ AppDir:
|
||||
id: rustdesk
|
||||
name: rustdesk
|
||||
icon: rustdesk
|
||||
version: 1.3.9
|
||||
version: 1.4.0
|
||||
exec: usr/share/rustdesk/rustdesk
|
||||
exec_args: $@
|
||||
apt:
|
||||
|
||||
@@ -1,42 +1,42 @@
|
||||
# Beitr<EFBFBD>ge zu RustDesk
|
||||
# Beiträge zu RustDesk
|
||||
|
||||
RustDesk begr<EFBFBD><EFBFBD>t Beitr<EFBFBD>ge von jedem. Hier sind die Richtlinien, wenn Sie uns
|
||||
helfen m<EFBFBD>chten:
|
||||
RustDesk begrüßt Beiträge von jedem. Hier sind die Richtlinien, wenn Sie uns
|
||||
helfen möchten:
|
||||
|
||||
## Beitr<EFBFBD>ge
|
||||
## Beiträge
|
||||
|
||||
Beitr<EFBFBD>ge zu RustDesk oder seinen Abh<EFBFBD>ngigkeiten sollten in Form von Pull
|
||||
Beiträge zu RustDesk oder seinen Abhängigkeiten sollten in Form von Pull
|
||||
Requests auf GitHub erfolgen. Jeder Pull Request wird von einem Hauptakteur
|
||||
(jemand mit der Erlaubnis, Korrekturen einzubringen) gepr<EFBFBD>ft und entweder in den
|
||||
Hauptbaum eingef<EFBFBD>gt oder Feedback f<EFBFBD>r notwendige <EFBFBD>nderungen gegeben. Alle
|
||||
Beitr<EFBFBD>ge sollten diesem Format folgen, auch die von Hauptakteuren.
|
||||
(jemand mit der Erlaubnis, Korrekturen einzubringen) geprüft und entweder in den
|
||||
Hauptbaum eingefügt oder Feedback für notwendige Änderungen gegeben. Alle
|
||||
Beiträge sollten diesem Format folgen, auch die von Hauptakteuren.
|
||||
|
||||
Wenn Sie an einem Problem arbeiten m<EFBFBD>chten, melden Sie es bitte zuerst an, indem
|
||||
Sie auf GitHub erkl<EFBFBD>ren, dass Sie daran arbeiten m<EFBFBD>chten. Damit soll verhindert
|
||||
werden, dass Beitr<EFBFBD>ge zum gleichen Thema doppelt bearbeitet werden.
|
||||
Wenn Sie an einem Problem arbeiten möchten, melden Sie es bitte zuerst an, indem
|
||||
Sie auf GitHub erklären, dass Sie daran arbeiten möchten. Damit soll verhindert
|
||||
werden, dass Beiträge zum gleichen Thema doppelt bearbeitet werden.
|
||||
|
||||
## Checkliste f<EFBFBD>r Pull Requests
|
||||
## Checkliste für Pull Requests
|
||||
|
||||
- Verzweigen Sie sich vom Master-Branch und, falls n<EFBFBD>tig, wechseln Sie zum
|
||||
- Verzweigen Sie sich vom Master-Branch und, falls nötig, wechseln Sie zum
|
||||
aktuellen Master-Branch, bevor Sie Ihren Pull Request einreichen. Wenn das
|
||||
Zusammenf<EFBFBD>hren mit dem Master nicht reibungslos funktioniert, werden Sie
|
||||
m<EFBFBD>glicherweise aufgefordert, Ihre <EFBFBD>nderungen zu <EFBFBD>berarbeiten.
|
||||
Zusammenführen mit dem Master nicht reibungslos funktioniert, werden Sie
|
||||
möglicherweise aufgefordert, Ihre Änderungen zu überarbeiten.
|
||||
|
||||
- Commits sollten so klein wie m<EFBFBD>glich sein und gleichzeitig sicherstellen, dass
|
||||
jeder Commit unabh<EFBFBD>ngig voneinander korrekt ist (d. h., jeder Commit sollte
|
||||
sich <EFBFBD>bersetzen lassen und Tests bestehen).
|
||||
- Commits sollten so klein wie möglich sein und gleichzeitig sicherstellen, dass
|
||||
jeder Commit unabhängig voneinander korrekt ist (d. h., jeder Commit sollte
|
||||
sich übersetzen lassen und Tests bestehen).
|
||||
|
||||
- Commits sollten von einem "Herkunftszertifikat f<EFBFBD>r Entwickler"
|
||||
- Commits sollten von einem "Herkunftszertifikat für Entwickler"
|
||||
(https://developercertificate.org) begleitet werden, das besagt, dass Sie (und
|
||||
ggf. Ihr Arbeitgeber) mit den Bedingungen der [Projektlizenz](../LICENCE)
|
||||
einverstanden sind. In Git ist dies die Option `-s` f<EFBFBD>r `git commit`.
|
||||
einverstanden sind. In Git ist dies die Option `-s` für `git commit`.
|
||||
|
||||
- Wenn Ihr Patch nicht begutachtet wird oder Sie eine bestimmte Person zur
|
||||
Begutachtung ben<EFBFBD>tigen, k<EFBFBD>nnen Sie einem Gutachter mit @ antworten und um eine
|
||||
Begutachtung des Pull Requests oder einen Kommentar bitten. Sie k<EFBFBD>nnen auch
|
||||
Begutachtung benötigen, können Sie einem Gutachter mit @ antworten und um eine
|
||||
Begutachtung des Pull Requests oder einen Kommentar bitten. Sie können auch
|
||||
per [E-Mail](mailto:info@rustdesk.com) um eine Begutachtung bitten.
|
||||
|
||||
- F<EFBFBD>gen Sie Tests hinzu, die sich auf den behobenen Fehler oder die neue
|
||||
- Fügen Sie Tests hinzu, die sich auf den behobenen Fehler oder die neue
|
||||
Funktion beziehen.
|
||||
|
||||
Spezifische Git-Anweisungen finden Sie im [GitHub-Workflow](https://github.com/servo/servo/wiki/GitHub-workflow).
|
||||
@@ -47,4 +47,4 @@ https://github.com/rustdesk/rustdesk/blob/master/docs/CODE_OF_CONDUCT.md
|
||||
|
||||
## Kommunikation
|
||||
|
||||
RustDesk-Mitarbeiter arbeiten h<EFBFBD>ufig im [Discord](https://discord.gg/nDceKgxnkV).
|
||||
RustDesk-Mitarbeiter arbeiten häufig im [Discord](https://discord.gg/nDceKgxnkV).
|
||||
|
||||
@@ -9,12 +9,18 @@
|
||||
<b>Necesitamos tu ayuda para traducir este README a tu idioma</b>
|
||||
</p>
|
||||
|
||||
> [!Caution]
|
||||
> **Descargo de responsabilidad por mal uso:** <br>
|
||||
> Los desarrolladores de RustDesk no aprueban ni apoyan ningún uso no ético o ilegal de este software. El mal uso, como el acceso no autorizado, el control o la invasión de la privacidad, va estrictamente en contra de nuestras directrices. Los autores no se hacen responsables de ningún uso indebido de la aplicación.
|
||||
|
||||
Chatea con nosotros: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
|
||||
|
||||
[](https://ko-fi.com/I2I04VU09)
|
||||
|
||||
Otro software de escritorio remoto, escrito en Rust. Funciona de forma inmediata, sin necesidad de configuración. Tienes el control total de tus datos, sin preocupaciones sobre la seguridad. Puedes utilizar nuestro servidor de rendezvous/relay, [instalar el tuyo](https://rustdesk.com/server), o [escribir tu propio servidor rendezvous/relay](https://github.com/rustdesk/rustdesk-server-demo).
|
||||
|
||||

|
||||
|
||||
RustDesk agradece la contribución de todo el mundo. Lee [`docs/CONTRIBUTING.md`](CONTRIBUTING.md) para ayuda para empezar.
|
||||
|
||||
[**¿Cómo funciona rustdesk?**](https://github.com/rustdesk/rustdesk/wiki/How-does-RustDesk-work%3F)
|
||||
@@ -24,12 +30,15 @@ RustDesk agradece la contribución de todo el mundo. Lee [`docs/CONTRIBUTING.md`
|
||||
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
||||
alt="Get it on F-Droid"
|
||||
height="80">](https://f-droid.org/en/packages/com.carriez.flutter_hbb)
|
||||
[<img src="https://flathub.org/api/badge?svg&locale=en"
|
||||
alt="Get it on Flathub"
|
||||
height="80">](https://flathub.org/apps/com.rustdesk.RustDesk)
|
||||
|
||||
## Dependencias
|
||||
|
||||
La versión Desktop usa [Sciter](https://sciter.com/) o Flutter para el GUI, este tutorial es solo para Sciter.
|
||||
Las versiones de escritorio utilizan Flutter o Sciter (obsoleto) para GUI, este tutorial es sólo para Sciter, ya que es más fácil y más amigable para empezar. Echa un vistazo a nuestro [CI](https://github.com/rustdesk/rustdesk/blob/master/.github/workflows/flutter-build.yml) para la construcción de la versión Flutter.
|
||||
|
||||
Por favor descarga la librería dinámica de Sciter tu mismo.
|
||||
Por favor descarga la librería dinámica de Sciter tú mismo.
|
||||
|
||||
[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) |
|
||||
[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) |
|
||||
@@ -51,13 +60,21 @@ Por favor descarga la librería dinámica de Sciter tu mismo.
|
||||
### Ubuntu 18 (Debian 10)
|
||||
|
||||
```sh
|
||||
sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake
|
||||
sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \
|
||||
libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \
|
||||
libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libpam0g-dev
|
||||
```
|
||||
|
||||
### openSUSE Tumbleweed
|
||||
|
||||
```sh
|
||||
sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel pam-devel
|
||||
```
|
||||
|
||||
### Fedora 28 (CentOS 8)
|
||||
|
||||
```sh
|
||||
sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel
|
||||
sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel gstreamer1-devel gstreamer1-plugins-base-devel pam-devel
|
||||
```
|
||||
|
||||
### Arch (Manjaro)
|
||||
@@ -96,12 +113,12 @@ cd
|
||||
```sh
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
||||
source $HOME/.cargo/env
|
||||
git clone https://github.com/rustdesk/rustdesk
|
||||
git clone --recurse-submodules https://github.com/rustdesk/rustdesk
|
||||
cd rustdesk
|
||||
mkdir -p target/debug
|
||||
wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so
|
||||
mv libsciter-gtk.so target/debug
|
||||
cargo run
|
||||
VCPKG_ROOT=$HOME/vcpkg cargo run
|
||||
```
|
||||
|
||||
## Como compilar con Docker
|
||||
@@ -111,10 +128,11 @@ Empieza clonando el repositorio y compilando el contenedor de docker:
|
||||
```sh
|
||||
git clone https://github.com/rustdesk/rustdesk
|
||||
cd rustdesk
|
||||
git submodule update --init --recursive
|
||||
docker build -t "rustdesk-builder" .
|
||||
```
|
||||
|
||||
Entonces, cada vez que necesites compilar una modificación, ejecuta el siguiente comando:
|
||||
Entonces, cada vez que necesites compilar la aplicación, ejecuta el siguiente comando:
|
||||
|
||||
```sh
|
||||
docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder
|
||||
@@ -153,10 +171,10 @@ Por favor, asegurate de que estás ejecutando estos comandos desde la raíz del
|
||||
|
||||
## Capturas de pantalla
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
6
docs/SECURITY-KR.md
Normal file
6
docs/SECURITY-KR.md
Normal file
@@ -0,0 +1,6 @@
|
||||
보안 정책
|
||||
취약점 보고
|
||||
|
||||
저희는 프로젝트의 보안을 매우 중요하게 생각합니다. 모든 사용자가 발견한 취약점을 저희에게 보고할 것을 권장합니다. RustDesk 프로젝트에서 보안 취약점이 발견되면 info@rustdesk.com 로 이메일을 보내 책임감 있게 보고해 주시기 바랍니다.
|
||||
|
||||
현재로서는 버그 현상금 프로그램이 없습니다. 저희는 큰 문제를 해결하기 위해 노력하는 소규모 팀입니다. 전체 커뮤니티를 위한 안전한 애플리케이션을 계속 구축할 수 있도록 취약점을 책임감 있게 신고해 주시기 바랍니다.
|
||||
@@ -1 +1 @@
|
||||
An open-source remote desktop application, the open source TeamViewer alternative.
|
||||
An open-source remote desktop application, the TeamViewer alternative
|
||||
|
||||
@@ -4,4 +4,5 @@
|
||||
# no obfuscate, because no easy to check errors
|
||||
cd $(dirname $(dirname $(which flutter)))
|
||||
git apply ~/rustdesk/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff
|
||||
cd -
|
||||
flutter build ipa --release
|
||||
|
||||
@@ -1,4 +1,2 @@
|
||||
#!/usr/bin/env bash
|
||||
cd $(dirname $(dirname $(which flutter)))
|
||||
git apply ~/rustdesk/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff
|
||||
cargo build --features flutter,hwcodec --release --target aarch64-apple-ios --lib
|
||||
|
||||
@@ -1152,15 +1152,23 @@ Widget createDialogContent(String text) {
|
||||
|
||||
void msgBox(SessionID sessionId, String type, String title, String text,
|
||||
String link, OverlayDialogManager dialogManager,
|
||||
{bool? hasCancel, ReconnectHandle? reconnect, int? reconnectTimeout}) {
|
||||
{bool? hasCancel,
|
||||
ReconnectHandle? reconnect,
|
||||
int? reconnectTimeout,
|
||||
VoidCallback? onSubmit,
|
||||
int? submitTimeout}) {
|
||||
dialogManager.dismissAll();
|
||||
List<Widget> buttons = [];
|
||||
bool hasOk = false;
|
||||
submit() {
|
||||
dialogManager.dismissAll();
|
||||
// https://github.com/rustdesk/rustdesk/blob/5e9a31340b899822090a3731769ae79c6bf5f3e5/src/ui/common.tis#L263
|
||||
if (!type.contains("custom") && desktopType != DesktopType.portForward) {
|
||||
closeConnection();
|
||||
if (onSubmit != null) {
|
||||
onSubmit.call();
|
||||
} else {
|
||||
// https://github.com/rustdesk/rustdesk/blob/5e9a31340b899822090a3731769ae79c6bf5f3e5/src/ui/common.tis#L263
|
||||
if (!type.contains("custom") && desktopType != DesktopType.portForward) {
|
||||
closeConnection();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1176,7 +1184,18 @@ void msgBox(SessionID sessionId, String type, String title, String text,
|
||||
|
||||
if (type != "connecting" && type != "success" && !type.contains("nook")) {
|
||||
hasOk = true;
|
||||
buttons.insert(0, dialogButton('OK', onPressed: submit));
|
||||
late final Widget btn;
|
||||
if (submitTimeout != null) {
|
||||
btn = _CountDownButton(
|
||||
text: 'OK',
|
||||
second: submitTimeout,
|
||||
onPressed: submit,
|
||||
submitOnTimeout: true,
|
||||
);
|
||||
} else {
|
||||
btn = dialogButton('OK', onPressed: submit);
|
||||
}
|
||||
buttons.insert(0, btn);
|
||||
}
|
||||
hasCancel ??= !type.contains("error") &&
|
||||
!type.contains("nocancel") &&
|
||||
@@ -1197,7 +1216,8 @@ void msgBox(SessionID sessionId, String type, String title, String text,
|
||||
reconnectTimeout != null) {
|
||||
// `enabled` is used to disable the dialog button once the button is clicked.
|
||||
final enabled = true.obs;
|
||||
final button = Obx(() => _ReconnectCountDownButton(
|
||||
final button = Obx(() => _CountDownButton(
|
||||
text: 'Reconnect',
|
||||
second: reconnectTimeout,
|
||||
onPressed: enabled.isTrue
|
||||
? () {
|
||||
@@ -3183,21 +3203,24 @@ parseParamScreenRect(Map<String, dynamic> params) {
|
||||
|
||||
get isInputSourceFlutter => stateGlobal.getInputSource() == "Input source 2";
|
||||
|
||||
class _ReconnectCountDownButton extends StatefulWidget {
|
||||
_ReconnectCountDownButton({
|
||||
class _CountDownButton extends StatefulWidget {
|
||||
_CountDownButton({
|
||||
Key? key,
|
||||
required this.text,
|
||||
required this.second,
|
||||
required this.onPressed,
|
||||
this.submitOnTimeout = false,
|
||||
}) : super(key: key);
|
||||
final String text;
|
||||
final VoidCallback? onPressed;
|
||||
final int second;
|
||||
final bool submitOnTimeout;
|
||||
|
||||
@override
|
||||
State<_ReconnectCountDownButton> createState() =>
|
||||
_ReconnectCountDownButtonState();
|
||||
State<_CountDownButton> createState() => _CountDownButtonState();
|
||||
}
|
||||
|
||||
class _ReconnectCountDownButtonState extends State<_ReconnectCountDownButton> {
|
||||
class _CountDownButtonState extends State<_CountDownButton> {
|
||||
late int _countdownSeconds = widget.second;
|
||||
|
||||
Timer? _timer;
|
||||
@@ -3218,6 +3241,9 @@ class _ReconnectCountDownButtonState extends State<_ReconnectCountDownButton> {
|
||||
_timer = Timer.periodic(Duration(seconds: 1), (timer) {
|
||||
if (_countdownSeconds <= 0) {
|
||||
timer.cancel();
|
||||
if (widget.submitOnTimeout) {
|
||||
widget.onPressed?.call();
|
||||
}
|
||||
} else {
|
||||
setState(() {
|
||||
_countdownSeconds--;
|
||||
@@ -3229,7 +3255,7 @@ class _ReconnectCountDownButtonState extends State<_ReconnectCountDownButton> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return dialogButton(
|
||||
'${translate('Reconnect')} (${_countdownSeconds}s)',
|
||||
'${translate(widget.text)} (${_countdownSeconds}s)',
|
||||
onPressed: widget.onPressed,
|
||||
isOutline: true,
|
||||
);
|
||||
|
||||
@@ -27,6 +27,7 @@ class UserPayload {
|
||||
String name = '';
|
||||
String email = '';
|
||||
String note = '';
|
||||
String? verifier;
|
||||
UserStatus status;
|
||||
bool isAdmin = false;
|
||||
|
||||
@@ -34,6 +35,7 @@ class UserPayload {
|
||||
: name = json['name'] ?? '',
|
||||
email = json['email'] ?? '',
|
||||
note = json['note'] ?? '',
|
||||
verifier = json['verifier'],
|
||||
status = json['status'] == 0
|
||||
? UserStatus.kDisabled
|
||||
: json['status'] == -1
|
||||
|
||||
@@ -1623,6 +1623,28 @@ customImageQualityDialog(SessionID sessionId, String id, FFI ffi) async {
|
||||
msgBoxCommon(ffi.dialogManager, 'Custom Image Quality', content, [btnClose]);
|
||||
}
|
||||
|
||||
trackpadSpeedDialog(SessionID sessionId, FFI ffi) async {
|
||||
int initSpeed = ffi.inputModel.trackpadSpeed;
|
||||
final curSpeed = SimpleWrapper(initSpeed);
|
||||
final btnClose = dialogButton('Close', onPressed: () async {
|
||||
if (curSpeed.value <= kMaxTrackpadSpeed &&
|
||||
curSpeed.value >= kMinTrackpadSpeed &&
|
||||
curSpeed.value != initSpeed) {
|
||||
await bind.sessionSetTrackpadSpeed(
|
||||
sessionId: sessionId, value: curSpeed.value);
|
||||
await ffi.inputModel.updateTrackpadSpeed();
|
||||
}
|
||||
ffi.dialogManager.dismissAll();
|
||||
});
|
||||
msgBoxCommon(
|
||||
ffi.dialogManager,
|
||||
'Trackpad speed',
|
||||
TrackpadSpeedWidget(
|
||||
value: curSpeed,
|
||||
),
|
||||
[btnClose]);
|
||||
}
|
||||
|
||||
void deleteConfirmDialog(Function onSubmit, String title) async {
|
||||
gFFI.dialogManager.show(
|
||||
(setState, close, context) {
|
||||
|
||||
@@ -501,6 +501,7 @@ class DiscoveredPeersView extends BasePeersView {
|
||||
Widget build(BuildContext context) {
|
||||
final widget = super.build(context);
|
||||
bind.mainLoadLanPeers();
|
||||
bind.mainDiscover();
|
||||
return widget;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -248,3 +248,93 @@ List<(String, String)> otherDefaultSettings() {
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
class TrackpadSpeedWidget extends StatefulWidget {
|
||||
final SimpleWrapper<int> value;
|
||||
// If null, no debouncer will be applied.
|
||||
final Function(int)? onDebouncer;
|
||||
|
||||
TrackpadSpeedWidget({Key? key, required this.value, this.onDebouncer});
|
||||
|
||||
@override
|
||||
TrackpadSpeedWidgetState createState() => TrackpadSpeedWidgetState();
|
||||
}
|
||||
|
||||
class TrackpadSpeedWidgetState extends State<TrackpadSpeedWidget> {
|
||||
final TextEditingController _controller = TextEditingController();
|
||||
late final Debouncer<int> debouncerSpeed;
|
||||
|
||||
set value(int v) => widget.value.value = v;
|
||||
int get value => widget.value.value;
|
||||
|
||||
void updateValue(int newValue) {
|
||||
setState(() {
|
||||
value = newValue.clamp(kMinTrackpadSpeed, kMaxTrackpadSpeed);
|
||||
// Scale the trackpad speed value to a percentage for display purposes.
|
||||
_controller.text = value.toString();
|
||||
if (widget.onDebouncer != null) {
|
||||
debouncerSpeed.setValue(value);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
debouncerSpeed = Debouncer<int>(
|
||||
Duration(milliseconds: 1000),
|
||||
onChanged: widget.onDebouncer,
|
||||
initialValue: widget.value.value,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (_controller.text.isEmpty) {
|
||||
_controller.text = value.toString();
|
||||
}
|
||||
return Row(
|
||||
children: [
|
||||
Expanded(
|
||||
flex: 3,
|
||||
child: Slider(
|
||||
value: value.toDouble(),
|
||||
min: kMinTrackpadSpeed.toDouble(),
|
||||
max: kMaxTrackpadSpeed.toDouble(),
|
||||
divisions: ((kMaxTrackpadSpeed - kMinTrackpadSpeed) / 10).round(),
|
||||
onChanged: (double v) => updateValue(v.round()),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
flex: 1,
|
||||
child: Row(
|
||||
children: [
|
||||
SizedBox(
|
||||
width: 56,
|
||||
child: TextField(
|
||||
controller: _controller,
|
||||
keyboardType: TextInputType.number,
|
||||
textAlign: TextAlign.center,
|
||||
onSubmitted: (text) {
|
||||
int? v = int.tryParse(text);
|
||||
if (v != null) {
|
||||
updateValue(v);
|
||||
}
|
||||
},
|
||||
style: const TextStyle(fontSize: 13),
|
||||
decoration: InputDecoration(
|
||||
contentPadding:
|
||||
EdgeInsets.symmetric(vertical: 8.0, horizontal: 12.0),
|
||||
),
|
||||
),
|
||||
).marginOnly(right: 8.0),
|
||||
Text(
|
||||
'%',
|
||||
style: const TextStyle(fontSize: 15),
|
||||
)
|
||||
],
|
||||
)),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
@@ -15,7 +16,7 @@ bool isEditOsPassword = false;
|
||||
|
||||
class TTextMenu {
|
||||
final Widget child;
|
||||
final VoidCallback onPressed;
|
||||
final VoidCallback? onPressed;
|
||||
Widget? trailingIcon;
|
||||
bool divider;
|
||||
TTextMenu(
|
||||
@@ -294,6 +295,41 @@ List<TTextMenu> toolbarControls(BuildContext context, String id, FFI ffi) {
|
||||
),
|
||||
onPressed: () => ffi.recordingModel.toggle()));
|
||||
}
|
||||
|
||||
// to-do:
|
||||
// 1. Web desktop
|
||||
// 2. Mobile, copy the image to the clipboard
|
||||
if (isDesktop) {
|
||||
final isScreenshotSupported = bind.sessionGetCommonSync(
|
||||
sessionId: sessionId, key: 'is_screenshot_supported', param: '');
|
||||
if ('true' == isScreenshotSupported) {
|
||||
v.add(TTextMenu(
|
||||
child: Text(ffi.ffiModel.timerScreenshot != null
|
||||
? '${translate('Taking screenshot')} ...'
|
||||
: translate('Take screenshot')),
|
||||
onPressed: ffi.ffiModel.timerScreenshot != null
|
||||
? null
|
||||
: () {
|
||||
if (pi.currentDisplay == kAllDisplayValue) {
|
||||
msgBox(
|
||||
sessionId,
|
||||
'custom-nook-nocancel-hasclose-info',
|
||||
'Take screenshot',
|
||||
'screenshot-merged-screen-not-supported-tip',
|
||||
'',
|
||||
ffi.dialogManager);
|
||||
} else {
|
||||
bind.sessionTakeScreenshot(
|
||||
sessionId: sessionId, display: pi.currentDisplay);
|
||||
ffi.ffiModel.timerScreenshot =
|
||||
Timer(Duration(seconds: 30), () {
|
||||
ffi.ffiModel.timerScreenshot = null;
|
||||
});
|
||||
}
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
||||
// fingerprint
|
||||
if (!(isDesktop || isWebDesktop)) {
|
||||
v.add(TTextMenu(
|
||||
|
||||
@@ -139,6 +139,7 @@ const String kOptionCurrentAbName = "current-ab-name";
|
||||
const String kOptionEnableConfirmClosingTabs = "enable-confirm-closing-tabs";
|
||||
const String kOptionAllowAlwaysSoftwareRender = "allow-always-software-render";
|
||||
const String kOptionEnableCheckUpdate = "enable-check-update";
|
||||
const String kOptionAllowAutoUpdate = "allow-auto-update";
|
||||
const String kOptionAllowLinuxHeadless = "allow-linux-headless";
|
||||
const String kOptionAllowRemoveWallpaper = "allow-remove-wallpaper";
|
||||
const String kOptionStopService = "stop-service";
|
||||
@@ -146,9 +147,14 @@ const String kOptionDirectxCapture = "enable-directx-capture";
|
||||
const String kOptionAllowRemoteCmModification = "allow-remote-cm-modification";
|
||||
const String kOptionEnableTrustedDevices = "enable-trusted-devices";
|
||||
|
||||
// network options
|
||||
const String kOptionAllowWebSocket = "allow-websocket";
|
||||
|
||||
// buildin opitons
|
||||
const String kOptionHideServerSetting = "hide-server-settings";
|
||||
const String kOptionHideProxySetting = "hide-proxy-settings";
|
||||
const String kOptionHideWebSocketSetting = "hide-websocket-settings";
|
||||
const String kOptionHideRemotePrinterSetting = "hide-remote-printer-settings";
|
||||
const String kOptionHideSecuritySetting = "hide-security-settings";
|
||||
const String kOptionHideNetworkSetting = "hide-network-settings";
|
||||
const String kOptionRemovePresetPasswordWarning =
|
||||
@@ -220,7 +226,14 @@ const double kDefaultQuality = 50;
|
||||
const double kMaxQuality = 100;
|
||||
const double kMaxMoreQuality = 2000;
|
||||
|
||||
const String kKeyPrinterIncommingJobAction = 'printer-incomming-job-action';
|
||||
// trackpad speed
|
||||
const String kKeyTrackpadSpeed = 'trackpad-speed';
|
||||
const int kMinTrackpadSpeed = 10;
|
||||
const int kDefaultTrackpadSpeed = 100;
|
||||
const int kMaxTrackpadSpeed = 1000;
|
||||
|
||||
// incomming (should be incoming) is kept, because change it will break the previous setting.
|
||||
const String kKeyPrinterIncomingJobAction = 'printer-incomming-job-action';
|
||||
const String kValuePrinterIncomingJobDismiss = 'dismiss';
|
||||
const String kValuePrinterIncomingJobDefault = '';
|
||||
const String kValuePrinterIncomingJobSelected = 'selected';
|
||||
|
||||
@@ -12,6 +12,7 @@ import 'package:flutter_hbb/consts.dart';
|
||||
import 'package:flutter_hbb/desktop/pages/connection_page.dart';
|
||||
import 'package:flutter_hbb/desktop/pages/desktop_setting_page.dart';
|
||||
import 'package:flutter_hbb/desktop/pages/desktop_tab_page.dart';
|
||||
import 'package:flutter_hbb/desktop/widgets/update_progress.dart';
|
||||
import 'package:flutter_hbb/models/platform_model.dart';
|
||||
import 'package:flutter_hbb/models/server_model.dart';
|
||||
import 'package:flutter_hbb/models/state_model.dart';
|
||||
@@ -22,7 +23,6 @@ import 'package:provider/provider.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
import 'package:window_manager/window_manager.dart';
|
||||
import 'package:window_size/window_size.dart' as window_size;
|
||||
|
||||
import '../widgets/button.dart';
|
||||
|
||||
class DesktopHomePage extends StatefulWidget {
|
||||
@@ -433,13 +433,23 @@ class _DesktopHomePageState extends State<DesktopHomePage>
|
||||
updateUrl.isNotEmpty &&
|
||||
!isCardClosed &&
|
||||
bind.mainUriPrefixSync().contains('rustdesk')) {
|
||||
final isToUpdate = (isWindows || isMacOS) && bind.mainIsInstalled();
|
||||
String btnText = isToUpdate ? 'Click to update' : 'Click to download';
|
||||
GestureTapCallback onPressed = () async {
|
||||
final Uri url = Uri.parse('https://rustdesk.com/download');
|
||||
await launchUrl(url);
|
||||
};
|
||||
if (isToUpdate) {
|
||||
onPressed = () {
|
||||
handleUpdate(updateUrl);
|
||||
};
|
||||
}
|
||||
return buildInstallCard(
|
||||
"Status",
|
||||
"${translate("new-version-of-{${bind.mainGetAppNameSync()}}-tip")} (${bind.mainGetNewVersion()}).",
|
||||
"Click to download", () async {
|
||||
final Uri url = Uri.parse('https://rustdesk.com/download');
|
||||
await launchUrl(url);
|
||||
}, closeButton: true);
|
||||
btnText,
|
||||
onPressed,
|
||||
closeButton: true);
|
||||
}
|
||||
if (systemError.isNotEmpty) {
|
||||
return buildInstallCard("", systemError, "", () {});
|
||||
|
||||
@@ -76,7 +76,9 @@ class DesktopSettingPage extends StatefulWidget {
|
||||
if (!isWeb && !bind.isIncomingOnly() && bind.pluginFeatureIsEnabled())
|
||||
SettingsTabKey.plugin,
|
||||
if (!bind.isDisableAccount()) SettingsTabKey.account,
|
||||
if (isWindows) SettingsTabKey.printer,
|
||||
if (isWindows &&
|
||||
bind.mainGetBuildinOption(key: kOptionHideRemotePrinterSetting) != 'Y')
|
||||
SettingsTabKey.printer,
|
||||
SettingsTabKey.about,
|
||||
];
|
||||
|
||||
@@ -470,6 +472,8 @@ class _GeneralState extends State<_General> {
|
||||
}
|
||||
|
||||
Widget other() {
|
||||
final showAutoUpdate =
|
||||
isWindows && bind.mainIsInstalled() && !bind.isCustomClient();
|
||||
final children = <Widget>[
|
||||
if (!isWeb && !bind.isIncomingOnly())
|
||||
_OptionCheckBox(context, 'Confirm before closing multiple tabs',
|
||||
@@ -523,12 +527,19 @@ class _GeneralState extends State<_General> {
|
||||
kOptionEnableCheckUpdate,
|
||||
isServer: false,
|
||||
),
|
||||
if (showAutoUpdate)
|
||||
_OptionCheckBox(
|
||||
context,
|
||||
'Auto update',
|
||||
kOptionAllowAutoUpdate,
|
||||
isServer: true,
|
||||
),
|
||||
if (isWindows && !bind.isOutgoingOnly())
|
||||
_OptionCheckBox(
|
||||
context,
|
||||
'Capture screen using DirectX',
|
||||
kOptionDirectxCapture,
|
||||
)
|
||||
),
|
||||
],
|
||||
];
|
||||
if (!isWeb && bind.mainShowOption(key: kOptionAllowLinuxHeadless)) {
|
||||
@@ -1466,11 +1477,70 @@ class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin {
|
||||
bind.mainGetBuildinOption(key: kOptionHideServerSetting) == 'Y';
|
||||
final hideProxy =
|
||||
isWeb || bind.mainGetBuildinOption(key: kOptionHideProxySetting) == 'Y';
|
||||
// final hideWebSocket = isWeb ||
|
||||
// bind.mainGetBuildinOption(key: kOptionHideWebSocketSetting) == 'Y';
|
||||
final hideWebSocket = true;
|
||||
|
||||
if (hideServer && hideProxy) {
|
||||
if (hideServer && hideProxy && hideWebSocket) {
|
||||
return Offstage();
|
||||
}
|
||||
|
||||
// Helper function to create network setting ListTiles
|
||||
Widget listTile({
|
||||
required IconData icon,
|
||||
required String title,
|
||||
VoidCallback? onTap,
|
||||
Widget? trailing,
|
||||
bool showTooltip = false,
|
||||
String tooltipMessage = '',
|
||||
}) {
|
||||
final titleWidget = showTooltip
|
||||
? Row(
|
||||
children: [
|
||||
Tooltip(
|
||||
waitDuration: Duration(milliseconds: 1000),
|
||||
message: translate(tooltipMessage),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
translate(title),
|
||||
style: TextStyle(fontSize: _kContentFontSize),
|
||||
),
|
||||
SizedBox(width: 5),
|
||||
Icon(
|
||||
Icons.help_outline,
|
||||
size: 14,
|
||||
color: Theme.of(context)
|
||||
.textTheme
|
||||
.titleLarge
|
||||
?.color
|
||||
?.withOpacity(0.7),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
: Text(
|
||||
translate(title),
|
||||
style: TextStyle(fontSize: _kContentFontSize),
|
||||
);
|
||||
|
||||
return ListTile(
|
||||
leading: Icon(icon, color: _accentColor),
|
||||
title: titleWidget,
|
||||
enabled: !locked,
|
||||
onTap: onTap,
|
||||
trailing: trailing,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
contentPadding: EdgeInsets.symmetric(horizontal: 16),
|
||||
minLeadingWidth: 0,
|
||||
horizontalTitleGap: 10,
|
||||
);
|
||||
}
|
||||
|
||||
return _Card(
|
||||
title: 'Network',
|
||||
children: [
|
||||
@@ -1479,39 +1549,36 @@ class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin {
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (!hideServer)
|
||||
ListTile(
|
||||
leading: Icon(Icons.dns_outlined, color: _accentColor),
|
||||
title: Text(
|
||||
translate('ID/Relay Server'),
|
||||
style: TextStyle(fontSize: _kContentFontSize),
|
||||
),
|
||||
enabled: !locked,
|
||||
listTile(
|
||||
icon: Icons.dns_outlined,
|
||||
title: 'ID/Relay Server',
|
||||
onTap: () => showServerSettings(gFFI.dialogManager),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
contentPadding: EdgeInsets.symmetric(horizontal: 16),
|
||||
minLeadingWidth: 0,
|
||||
horizontalTitleGap: 10,
|
||||
),
|
||||
if (!hideServer && !hideProxy)
|
||||
if (!hideServer && (!hideProxy || !hideWebSocket))
|
||||
Divider(height: 1, indent: 16, endIndent: 16),
|
||||
if (!hideProxy)
|
||||
ListTile(
|
||||
leading:
|
||||
Icon(Icons.network_ping_outlined, color: _accentColor),
|
||||
title: Text(
|
||||
translate('Socks5/Http(s) Proxy'),
|
||||
style: TextStyle(fontSize: _kContentFontSize),
|
||||
),
|
||||
enabled: !locked,
|
||||
listTile(
|
||||
icon: Icons.network_ping_outlined,
|
||||
title: 'Socks5/Http(s) Proxy',
|
||||
onTap: changeSocks5Proxy,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
if (!hideProxy && !hideWebSocket)
|
||||
Divider(height: 1, indent: 16, endIndent: 16),
|
||||
if (!hideWebSocket)
|
||||
listTile(
|
||||
icon: Icons.web_asset_outlined,
|
||||
title: 'Use WebSocket',
|
||||
showTooltip: true,
|
||||
tooltipMessage: 'websocket_tip',
|
||||
trailing: Switch(
|
||||
value: mainGetBoolOptionSync(kOptionAllowWebSocket),
|
||||
onChanged: locked
|
||||
? null
|
||||
: (value) {
|
||||
mainSetBoolOption(kOptionAllowWebSocket, value);
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
contentPadding: EdgeInsets.symmetric(horizontal: 16),
|
||||
minLeadingWidth: 0,
|
||||
horizontalTitleGap: 10,
|
||||
),
|
||||
],
|
||||
),
|
||||
@@ -1537,6 +1604,7 @@ class _DisplayState extends State<_Display> {
|
||||
scrollStyle(context),
|
||||
imageQuality(context),
|
||||
codec(context),
|
||||
if (isDesktop) trackpadSpeed(context),
|
||||
if (!isWeb) privacyModeImpl(context),
|
||||
other(context),
|
||||
]).marginOnly(bottom: _kListViewBottomMargin);
|
||||
@@ -1624,6 +1692,26 @@ class _DisplayState extends State<_Display> {
|
||||
]);
|
||||
}
|
||||
|
||||
Widget trackpadSpeed(BuildContext context) {
|
||||
final initSpeed = (int.tryParse(
|
||||
bind.mainGetUserDefaultOption(key: kKeyTrackpadSpeed)) ??
|
||||
kDefaultTrackpadSpeed);
|
||||
final curSpeed = SimpleWrapper(initSpeed);
|
||||
void onDebouncer(int v) {
|
||||
bind.mainSetUserDefaultOption(
|
||||
key: kKeyTrackpadSpeed, value: v.toString());
|
||||
// It's better to notify all sessions that the default speed is changed.
|
||||
// But it may also be ok to take effect in the next connection.
|
||||
}
|
||||
|
||||
return _Card(title: 'Default trackpad speed', children: [
|
||||
TrackpadSpeedWidget(
|
||||
value: curSpeed,
|
||||
onDebouncer: onDebouncer,
|
||||
),
|
||||
]);
|
||||
}
|
||||
|
||||
Widget codec(BuildContext context) {
|
||||
onChanged(String value) async {
|
||||
await bind.mainSetUserDefaultOption(
|
||||
@@ -1908,7 +1996,7 @@ class __PrinterState extends State<_Printer> {
|
||||
final scrollController = ScrollController();
|
||||
return ListView(controller: scrollController, children: [
|
||||
outgoing(context),
|
||||
incomming(context),
|
||||
incoming(context),
|
||||
]).marginOnly(bottom: _kListViewBottomMargin);
|
||||
}
|
||||
|
||||
@@ -1979,7 +2067,7 @@ class __PrinterState extends State<_Printer> {
|
||||
final installed = bind.mainIsInstalled();
|
||||
// `is-printer-installed` may fail, but it's rare case.
|
||||
// Add additional error message here if it's really needed.
|
||||
final driver_installed =
|
||||
final isPrinterInstalled =
|
||||
bind.mainGetCommonSync(key: 'is-printer-installed') == 'true';
|
||||
|
||||
final List<Widget> children = [];
|
||||
@@ -1988,22 +2076,22 @@ class __PrinterState extends State<_Printer> {
|
||||
} else {
|
||||
children.addAll([
|
||||
if (!installed) tipClientNotInstalled(),
|
||||
if (installed && !driver_installed) tipPrinterNotInstalled(),
|
||||
if (installed && driver_installed) tipReady()
|
||||
if (installed && !isPrinterInstalled) tipPrinterNotInstalled(),
|
||||
if (installed && isPrinterInstalled) tipReady()
|
||||
]);
|
||||
}
|
||||
return _Card(title: 'Outgoing Print Jobs', children: children);
|
||||
}
|
||||
|
||||
Widget incomming(BuildContext context) {
|
||||
Widget incoming(BuildContext context) {
|
||||
onRadioChanged(String value) async {
|
||||
await bind.mainSetLocalOption(
|
||||
key: kKeyPrinterIncommingJobAction, value: value);
|
||||
key: kKeyPrinterIncomingJobAction, value: value);
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
PrinterOptions printerOptions = PrinterOptions.load();
|
||||
return _Card(title: 'Incomming Print Jobs', children: [
|
||||
return _Card(title: 'Incoming Print Jobs', children: [
|
||||
_Radio(context,
|
||||
value: kValuePrinterIncomingJobDismiss,
|
||||
groupValue: printerOptions.action,
|
||||
|
||||
@@ -4,6 +4,7 @@ import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_hbb/common/widgets/audio_input.dart';
|
||||
import 'package:flutter_hbb/common/widgets/dialog.dart';
|
||||
import 'package:flutter_hbb/common/widgets/toolbar.dart';
|
||||
import 'package:flutter_hbb/models/chat_model.dart';
|
||||
import 'package:flutter_hbb/models/state_model.dart';
|
||||
@@ -1594,10 +1595,28 @@ class _KeyboardMenu extends StatelessWidget {
|
||||
viewMode(),
|
||||
Divider(),
|
||||
...toolbarToggles(),
|
||||
...mouseSpeed(),
|
||||
...mobileActions(),
|
||||
]);
|
||||
}
|
||||
|
||||
mouseSpeed() {
|
||||
final speedWidgets = [];
|
||||
final sessionId = ffi.sessionId;
|
||||
if (isDesktop) {
|
||||
if (ffi.ffiModel.keyboard) {
|
||||
final enabled = !ffi.ffiModel.viewOnly;
|
||||
final trackpad = MenuButton(
|
||||
child: Text(translate('Trackpad speed')).paddingOnly(left: 26.0),
|
||||
onPressed: enabled ? () => trackpadSpeedDialog(sessionId, ffi) : null,
|
||||
ffi: ffi,
|
||||
);
|
||||
speedWidgets.add(trackpad);
|
||||
}
|
||||
}
|
||||
return speedWidgets;
|
||||
}
|
||||
|
||||
keyboardMode() {
|
||||
return futureBuilder(future: () async {
|
||||
return await bind.sessionGetKeyboardMode(sessionId: ffi.sessionId) ??
|
||||
|
||||
@@ -651,7 +651,9 @@ class _DesktopTabState extends State<DesktopTab>
|
||||
controller.state.value.scrollController;
|
||||
if (!sc.canScroll) return;
|
||||
_scrollDebounce.call(() {
|
||||
sc.animateTo(sc.offset + e.scrollDelta.dy,
|
||||
double adjust = 2.5;
|
||||
sc.animateTo(
|
||||
sc.offset + e.scrollDelta.dy * adjust,
|
||||
duration: Duration(milliseconds: 200),
|
||||
curve: Curves.ease);
|
||||
});
|
||||
|
||||
234
flutter/lib/desktop/widgets/update_progress.dart
Normal file
234
flutter/lib/desktop/widgets/update_progress.dart
Normal file
@@ -0,0 +1,234 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_hbb/common.dart';
|
||||
import 'package:flutter_hbb/models/platform_model.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
|
||||
void handleUpdate(String releasePageUrl) {
|
||||
String downloadUrl = releasePageUrl.replaceAll('tag', 'download');
|
||||
String version = downloadUrl.substring(downloadUrl.lastIndexOf('/') + 1);
|
||||
final String downloadFile =
|
||||
bind.mainGetCommonSync(key: 'download-file-$version');
|
||||
if (downloadFile.startsWith('error:')) {
|
||||
final error = downloadFile.replaceFirst('error:', '');
|
||||
msgBox(gFFI.sessionId, 'custom-nocancel-nook-hasclose', 'Error', error,
|
||||
releasePageUrl, gFFI.dialogManager);
|
||||
return;
|
||||
}
|
||||
downloadUrl = '$downloadUrl/$downloadFile';
|
||||
|
||||
SimpleWrapper downloadId = SimpleWrapper('');
|
||||
SimpleWrapper<VoidCallback> onCanceled = SimpleWrapper(() {});
|
||||
gFFI.dialogManager.dismissAll();
|
||||
gFFI.dialogManager.show((setState, close, context) {
|
||||
return CustomAlertDialog(
|
||||
title: Text(translate('Downloading {$appName}')),
|
||||
content:
|
||||
UpdateProgress(releasePageUrl, downloadUrl, downloadId, onCanceled)
|
||||
.marginSymmetric(horizontal: 8)
|
||||
.paddingOnly(top: 12),
|
||||
actions: [
|
||||
dialogButton(translate('Cancel'), onPressed: () async {
|
||||
onCanceled.value();
|
||||
await bind.mainSetCommon(
|
||||
key: 'cancel-downloader', value: downloadId.value);
|
||||
// Wait for the downloader to be removed.
|
||||
for (int i = 0; i < 10; i++) {
|
||||
await Future.delayed(const Duration(milliseconds: 300));
|
||||
final isCanceled = 'error:Downloader not found' ==
|
||||
await bind.mainGetCommon(
|
||||
key: 'download-data-${downloadId.value}');
|
||||
if (isCanceled) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
close();
|
||||
}, isOutline: true),
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
||||
class UpdateProgress extends StatefulWidget {
|
||||
final String releasePageUrl;
|
||||
final String downloadUrl;
|
||||
final SimpleWrapper downloadId;
|
||||
final SimpleWrapper onCanceled;
|
||||
UpdateProgress(
|
||||
this.releasePageUrl, this.downloadUrl, this.downloadId, this.onCanceled,
|
||||
{Key? key})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
State<UpdateProgress> createState() => UpdateProgressState();
|
||||
}
|
||||
|
||||
class UpdateProgressState extends State<UpdateProgress> {
|
||||
Timer? _timer;
|
||||
int? _totalSize;
|
||||
int _downloadedSize = 0;
|
||||
int _getDataFailedCount = 0;
|
||||
final String _eventKeyDownloadNewVersion = 'download-new-version';
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
widget.onCanceled.value = () {
|
||||
cancelQueryTimer();
|
||||
};
|
||||
platformFFI.registerEventHandler(_eventKeyDownloadNewVersion,
|
||||
_eventKeyDownloadNewVersion, handleDownloadNewVersion,
|
||||
replace: true);
|
||||
bind.mainSetCommon(key: 'download-new-version', value: widget.downloadUrl);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
cancelQueryTimer();
|
||||
platformFFI.unregisterEventHandler(
|
||||
_eventKeyDownloadNewVersion, _eventKeyDownloadNewVersion);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void cancelQueryTimer() {
|
||||
_timer?.cancel();
|
||||
_timer = null;
|
||||
}
|
||||
|
||||
Future<void> handleDownloadNewVersion(Map<String, dynamic> evt) async {
|
||||
if (evt.containsKey('id')) {
|
||||
widget.downloadId.value = evt['id'] as String;
|
||||
_timer = Timer.periodic(const Duration(milliseconds: 300), (timer) {
|
||||
_updateDownloadData();
|
||||
});
|
||||
} else {
|
||||
if (evt.containsKey('error')) {
|
||||
_onError(evt['error'] as String);
|
||||
} else {
|
||||
// unreachable
|
||||
_onError('$evt');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _onError(String error) {
|
||||
cancelQueryTimer();
|
||||
|
||||
debugPrint('Download new version error: $error');
|
||||
final msgBoxType = 'custom-nocancel-nook-hasclose';
|
||||
final msgBoxTitle = 'Error';
|
||||
final msgBoxText = 'download-new-version-failed-tip';
|
||||
final dialogManager = gFFI.dialogManager;
|
||||
|
||||
close() {
|
||||
dialogManager.dismissAll();
|
||||
}
|
||||
|
||||
jumplink() {
|
||||
launchUrl(Uri.parse(widget.releasePageUrl));
|
||||
dialogManager.dismissAll();
|
||||
}
|
||||
|
||||
retry() {
|
||||
dialogManager.dismissAll();
|
||||
handleUpdate(widget.releasePageUrl);
|
||||
}
|
||||
|
||||
final List<Widget> buttons = [
|
||||
dialogButton('Download', onPressed: jumplink),
|
||||
dialogButton('Retry', onPressed: retry),
|
||||
dialogButton('Close', onPressed: close),
|
||||
];
|
||||
dialogManager.dismissAll();
|
||||
dialogManager.show(
|
||||
(setState, close, context) => CustomAlertDialog(
|
||||
title: null,
|
||||
content: SelectionArea(
|
||||
child: msgboxContent(msgBoxType, msgBoxTitle, msgBoxText)),
|
||||
actions: buttons,
|
||||
),
|
||||
tag: '$msgBoxType-$msgBoxTitle-$msgBoxTitle',
|
||||
);
|
||||
}
|
||||
|
||||
void _updateDownloadData() {
|
||||
String err = '';
|
||||
String downloadData =
|
||||
bind.mainGetCommonSync(key: 'download-data-${widget.downloadId.value}');
|
||||
if (downloadData.startsWith('error:')) {
|
||||
err = downloadData.substring('error:'.length);
|
||||
} else {
|
||||
try {
|
||||
jsonDecode(downloadData).forEach((key, value) {
|
||||
if (key == 'total_size') {
|
||||
if (value != null && value is int) {
|
||||
_totalSize = value;
|
||||
}
|
||||
} else if (key == 'downloaded_size') {
|
||||
_downloadedSize = value as int;
|
||||
} else if (key == 'error') {
|
||||
if (value != null) {
|
||||
err = value.toString();
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
_getDataFailedCount += 1;
|
||||
debugPrint(
|
||||
'Failed to get download data ${widget.downloadUrl}, error $e');
|
||||
if (_getDataFailedCount > 3) {
|
||||
err = e.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (err != '') {
|
||||
_onError(err);
|
||||
} else {
|
||||
if (_totalSize != null && _downloadedSize >= _totalSize!) {
|
||||
cancelQueryTimer();
|
||||
bind.mainSetCommon(
|
||||
key: 'remove-downloader', value: widget.downloadId.value);
|
||||
if (_totalSize == 0) {
|
||||
_onError('The download file size is 0.');
|
||||
} else {
|
||||
setState(() {});
|
||||
msgBox(
|
||||
gFFI.sessionId,
|
||||
'custom-nocancel',
|
||||
'{$appName} Update',
|
||||
'{$appName}-to-update-tip',
|
||||
'',
|
||||
gFFI.dialogManager,
|
||||
onSubmit: () {
|
||||
debugPrint('Downloaded, update to new version now');
|
||||
bind.mainSetCommon(key: 'update-me', value: widget.downloadUrl);
|
||||
},
|
||||
submitTimeout: 5,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
setState(() {});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return onDownloading(context);
|
||||
}
|
||||
|
||||
Widget onDownloading(BuildContext context) {
|
||||
final value = _totalSize == null
|
||||
? 0.0
|
||||
: (_totalSize == 0 ? 1.0 : _downloadedSize / _totalSize!);
|
||||
return LinearProgressIndicator(
|
||||
value: value,
|
||||
minHeight: 20,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
backgroundColor: Colors.grey[300],
|
||||
valueColor: const AlwaysStoppedAnimation<Color>(Colors.blue),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -695,9 +695,9 @@ class _RemotePageState extends State<RemotePage> with WidgetsBindingObserver {
|
||||
);
|
||||
if (index != null) {
|
||||
if (index < mobileActionMenus.length) {
|
||||
mobileActionMenus[index].onPressed.call();
|
||||
mobileActionMenus[index].onPressed?.call();
|
||||
} else if (index < mobileActionMenus.length + more.length) {
|
||||
menus[index - mobileActionMenus.length].onPressed.call();
|
||||
menus[index - mobileActionMenus.length].onPressed?.call();
|
||||
}
|
||||
}
|
||||
}();
|
||||
@@ -770,7 +770,7 @@ class _RemotePageState extends State<RemotePage> with WidgetsBindingObserver {
|
||||
elevation: 8,
|
||||
);
|
||||
if (index != null && index < menus.length) {
|
||||
menus[index].onPressed.call();
|
||||
menus[index].onPressed?.call();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -1267,7 +1267,7 @@ void showOptions(
|
||||
title: resolution.child,
|
||||
onTap: () {
|
||||
close();
|
||||
resolution.onPressed();
|
||||
resolution.onPressed?.call();
|
||||
},
|
||||
));
|
||||
}
|
||||
@@ -1279,7 +1279,7 @@ void showOptions(
|
||||
title: virtualDisplayMenu.child,
|
||||
onTap: () {
|
||||
close();
|
||||
virtualDisplayMenu.onPressed();
|
||||
virtualDisplayMenu.onPressed?.call();
|
||||
},
|
||||
));
|
||||
}
|
||||
|
||||
@@ -80,6 +80,7 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
||||
var _enableDirectIPAccess = false;
|
||||
var _enableRecordSession = false;
|
||||
var _enableHardwareCodec = false;
|
||||
var _allowWebSocket = false;
|
||||
var _autoRecordIncomingSession = false;
|
||||
var _autoRecordOutgoingSession = false;
|
||||
var _allowAutoDisconnect = false;
|
||||
@@ -91,6 +92,7 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
||||
var _hideServer = false;
|
||||
var _hideProxy = false;
|
||||
var _hideNetwork = false;
|
||||
var _hideWebSocket = false;
|
||||
var _enableTrustedDevices = false;
|
||||
|
||||
_SettingsState() {
|
||||
@@ -105,6 +107,7 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
||||
bind.mainGetOptionSync(key: kOptionEnableRecordSession));
|
||||
_enableHardwareCodec = option2bool(kOptionEnableHwcodec,
|
||||
bind.mainGetOptionSync(key: kOptionEnableHwcodec));
|
||||
_allowWebSocket = mainGetBoolOptionSync(kOptionAllowWebSocket);
|
||||
_autoRecordIncomingSession = option2bool(kOptionAllowAutoRecordIncoming,
|
||||
bind.mainGetOptionSync(key: kOptionAllowAutoRecordIncoming));
|
||||
_autoRecordOutgoingSession = option2bool(kOptionAllowAutoRecordOutgoing,
|
||||
@@ -120,6 +123,8 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
||||
_hideProxy = bind.mainGetBuildinOption(key: kOptionHideProxySetting) == 'Y';
|
||||
_hideNetwork =
|
||||
bind.mainGetBuildinOption(key: kOptionHideNetworkSetting) == 'Y';
|
||||
_hideWebSocket =
|
||||
true; //bind.mainGetBuildinOption(key: kOptionHideWebSocketSetting) == 'Y';
|
||||
_enableTrustedDevices = mainGetBoolOptionSync(kOptionEnableTrustedDevices);
|
||||
}
|
||||
|
||||
@@ -243,7 +248,7 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
||||
Widget build(BuildContext context) {
|
||||
Provider.of<FfiModel>(context);
|
||||
final outgoingOnly = bind.isOutgoingOnly();
|
||||
final incommingOnly = bind.isIncomingOnly();
|
||||
final incomingOnly = bind.isIncomingOnly();
|
||||
final customClientSection = CustomSettingsSection(
|
||||
child: Column(
|
||||
children: [
|
||||
@@ -667,6 +672,21 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
||||
onPressed: (context) {
|
||||
changeSocks5Proxy();
|
||||
}),
|
||||
if (!disabledSettings && !_hideNetwork && !_hideWebSocket)
|
||||
SettingsTile.switchTile(
|
||||
title: Text(translate('Use WebSocket')),
|
||||
initialValue: _allowWebSocket,
|
||||
onToggle: isOptionFixed(kOptionAllowWebSocket)
|
||||
? null
|
||||
: (v) async {
|
||||
await mainSetBoolOption(kOptionAllowWebSocket, v);
|
||||
final newValue =
|
||||
await mainGetBoolOption(kOptionAllowWebSocket);
|
||||
setState(() {
|
||||
_allowWebSocket = newValue;
|
||||
});
|
||||
},
|
||||
),
|
||||
SettingsTile(
|
||||
title: Text(translate('Language')),
|
||||
leading: Icon(Icons.translate),
|
||||
@@ -728,7 +748,7 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
||||
});
|
||||
},
|
||||
),
|
||||
if (!incommingOnly)
|
||||
if (!incomingOnly)
|
||||
SettingsTile.switchTile(
|
||||
title:
|
||||
Text(translate('Automatically record outgoing sessions')),
|
||||
|
||||
@@ -478,9 +478,9 @@ class _ViewCameraPageState extends State<ViewCameraPage>
|
||||
);
|
||||
if (index != null) {
|
||||
if (index < mobileActionMenus.length) {
|
||||
mobileActionMenus[index].onPressed.call();
|
||||
mobileActionMenus[index].onPressed?.call();
|
||||
} else if (index < mobileActionMenus.length + more.length) {
|
||||
menus[index - mobileActionMenus.length].onPressed.call();
|
||||
menus[index - mobileActionMenus.length].onPressed?.call();
|
||||
}
|
||||
}
|
||||
}();
|
||||
@@ -553,7 +553,7 @@ class _ViewCameraPageState extends State<ViewCameraPage>
|
||||
elevation: 8,
|
||||
);
|
||||
if (index != null && index < menus.length) {
|
||||
menus[index].onPressed.call();
|
||||
menus[index].onPressed?.call();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -775,7 +775,10 @@ abstract class BaseAb {
|
||||
|
||||
final pullError = "".obs;
|
||||
final pushError = "".obs;
|
||||
final abLoading = false.obs;
|
||||
final abLoading = false
|
||||
.obs; // Indicates whether the UI should show a loading state for the address book.
|
||||
var abPulling =
|
||||
false; // Tracks whether a pull operation is currently in progress to prevent concurrent pulls. Unlike abLoading, this is not tied to UI updates.
|
||||
bool initialized = false;
|
||||
|
||||
String name();
|
||||
@@ -790,17 +793,22 @@ abstract class BaseAb {
|
||||
}
|
||||
|
||||
Future<void> pullAb({quiet = false}) async {
|
||||
debugPrint("pull ab \"${name()}\"");
|
||||
if (abLoading.value) return;
|
||||
if (abPulling) return;
|
||||
abPulling = true;
|
||||
if (!quiet) {
|
||||
abLoading.value = true;
|
||||
pullError.value = "";
|
||||
}
|
||||
initialized = false;
|
||||
debugPrint("pull ab \"${name()}\"");
|
||||
try {
|
||||
initialized = await pullAbImpl(quiet: quiet);
|
||||
} catch (_) {}
|
||||
abLoading.value = false;
|
||||
} catch (e) {
|
||||
debugPrint("Error occurred while pulling address book: $e");
|
||||
} finally {
|
||||
abLoading.value = false;
|
||||
abPulling = false;
|
||||
}
|
||||
}
|
||||
|
||||
Future<bool> pullAbImpl({quiet = false});
|
||||
|
||||
@@ -345,8 +345,11 @@ class InputModel {
|
||||
var _fling = false;
|
||||
Timer? _flingTimer;
|
||||
final _flingBaseDelay = 30;
|
||||
// trackpad, peer linux
|
||||
final _trackpadSpeed = 0.06;
|
||||
final _trackpadAdjustPeerLinux = 0.06;
|
||||
// This is an experience value.
|
||||
final _trackpadAdjustMacToWin = 2.50;
|
||||
int _trackpadSpeed = kDefaultTrackpadSpeed;
|
||||
double _trackpadSpeedInner = kDefaultTrackpadSpeed / 100.0;
|
||||
var _trackpadScrollUnsent = Offset.zero;
|
||||
|
||||
var _lastScale = 1.0;
|
||||
@@ -370,6 +373,7 @@ class InputModel {
|
||||
bool get isViewOnly => parent.target!.ffiModel.viewOnly;
|
||||
double get devicePixelRatio => parent.target!.canvasModel.devicePixelRatio;
|
||||
bool get isViewCamera => parent.target!.connType == ConnType.viewCamera;
|
||||
int get trackpadSpeed => _trackpadSpeed;
|
||||
|
||||
InputModel(this.parent) {
|
||||
sessionId = parent.target!.sessionId;
|
||||
@@ -385,6 +389,28 @@ class InputModel {
|
||||
}
|
||||
}
|
||||
|
||||
/// Updates the trackpad speed based on the session value.
|
||||
///
|
||||
/// The expected format of the retrieved value is a string that can be parsed into a double.
|
||||
/// If parsing fails or the value is out of bounds (less than `kMinTrackpadSpeed` or greater
|
||||
/// than `kMaxTrackpadSpeed`), the trackpad speed is reset to the default
|
||||
/// value (`kDefaultTrackpadSpeed`).
|
||||
///
|
||||
/// Bounds:
|
||||
/// - Minimum: `kMinTrackpadSpeed`
|
||||
/// - Maximum: `kMaxTrackpadSpeed`
|
||||
/// - Default: `kDefaultTrackpadSpeed`
|
||||
Future<void> updateTrackpadSpeed() async {
|
||||
_trackpadSpeed =
|
||||
(await bind.sessionGetTrackpadSpeed(sessionId: sessionId) ??
|
||||
kDefaultTrackpadSpeed);
|
||||
if (_trackpadSpeed < kMinTrackpadSpeed ||
|
||||
_trackpadSpeed > kMaxTrackpadSpeed) {
|
||||
_trackpadSpeed = kDefaultTrackpadSpeed;
|
||||
}
|
||||
_trackpadSpeedInner = _trackpadSpeed / 100.0;
|
||||
}
|
||||
|
||||
void handleKeyDownEventModifiers(KeyEvent e) {
|
||||
KeyUpEvent upEvent(e) => KeyUpEvent(
|
||||
physicalKey: e.physicalKey,
|
||||
@@ -888,13 +914,16 @@ class InputModel {
|
||||
}
|
||||
}
|
||||
|
||||
final delta = e.panDelta;
|
||||
var delta = e.panDelta * _trackpadSpeedInner;
|
||||
if (isMacOS && peerPlatform == kPeerPlatformWindows) {
|
||||
delta *= _trackpadAdjustMacToWin;
|
||||
}
|
||||
_trackpadLastDelta = delta;
|
||||
|
||||
var x = delta.dx.toInt();
|
||||
var y = delta.dy.toInt();
|
||||
if (peerPlatform == kPeerPlatformLinux) {
|
||||
_trackpadScrollUnsent += (delta * _trackpadSpeed);
|
||||
_trackpadScrollUnsent += (delta * _trackpadAdjustPeerLinux);
|
||||
x = _trackpadScrollUnsent.dx.truncate();
|
||||
y = _trackpadScrollUnsent.dy.truncate();
|
||||
_trackpadScrollUnsent -= Offset(x.toDouble(), y.toDouble());
|
||||
@@ -942,8 +971,8 @@ class InputModel {
|
||||
var dx = x.toInt();
|
||||
var dy = y.toInt();
|
||||
if (parent.target?.ffiModel.pi.platform == kPeerPlatformLinux) {
|
||||
dx = (x * _trackpadSpeed).toInt();
|
||||
dy = (y * _trackpadSpeed).toInt();
|
||||
dx = (x * _trackpadAdjustPeerLinux).toInt();
|
||||
dy = (y * _trackpadAdjustPeerLinux).toInt();
|
||||
}
|
||||
|
||||
var delay = _flingBaseDelay;
|
||||
@@ -989,7 +1018,10 @@ class InputModel {
|
||||
_stopFling = false;
|
||||
|
||||
// 2.0 is an experience value
|
||||
double minFlingValue = 2.0;
|
||||
double minFlingValue = 2.0 * _trackpadSpeedInner;
|
||||
if (isMacOS && peerPlatform == kPeerPlatformWindows) {
|
||||
minFlingValue *= _trackpadAdjustMacToWin;
|
||||
}
|
||||
if (_trackpadLastDelta.dx.abs() > minFlingValue ||
|
||||
_trackpadLastDelta.dy.abs() > minFlingValue) {
|
||||
_fling = true;
|
||||
|
||||
@@ -34,6 +34,7 @@ import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
import 'package:window_manager/window_manager.dart';
|
||||
import 'package:file_picker/file_picker.dart';
|
||||
|
||||
import '../common.dart';
|
||||
import '../utils/image.dart' as img;
|
||||
@@ -119,6 +120,8 @@ class FfiModel with ChangeNotifier {
|
||||
RxBool waitForFirstImage = true.obs;
|
||||
bool isRefreshing = false;
|
||||
|
||||
Timer? timerScreenshot;
|
||||
|
||||
Rect? get rect => _rect;
|
||||
bool get isOriginalResolutionSet =>
|
||||
_pi.tryGetDisplayIfNotAllDisplay()?.isOriginalResolutionSet ?? false;
|
||||
@@ -216,6 +219,7 @@ class FfiModel with ChangeNotifier {
|
||||
_timer = null;
|
||||
clearPermissions();
|
||||
waitForImageTimer?.cancel();
|
||||
timerScreenshot?.cancel();
|
||||
}
|
||||
|
||||
setConnectionType(String peerId, bool secure, bool direct) {
|
||||
@@ -414,12 +418,82 @@ class FfiModel with ChangeNotifier {
|
||||
}
|
||||
} else if (name == "printer_request") {
|
||||
_handlePrinterRequest(evt, sessionId, peerId);
|
||||
} else if (name == 'screenshot') {
|
||||
_handleScreenshot(evt, sessionId, peerId);
|
||||
} else {
|
||||
debugPrint('Event is not handled in the fixed branch: $name');
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
_handleScreenshot(
|
||||
Map<String, dynamic> evt, SessionID sessionId, String peerId) {
|
||||
timerScreenshot?.cancel();
|
||||
timerScreenshot = null;
|
||||
final msg = evt['msg'] ?? '';
|
||||
final msgBoxType = 'custom-nook-nocancel-hasclose';
|
||||
final msgBoxTitle = 'Take screenshot';
|
||||
final dialogManager = parent.target!.dialogManager;
|
||||
if (msg.isNotEmpty) {
|
||||
msgBox(sessionId, msgBoxType, msgBoxTitle, msg, '', dialogManager);
|
||||
} else {
|
||||
final msgBoxText = 'screenshot-action-tip';
|
||||
|
||||
close() {
|
||||
dialogManager.dismissAll();
|
||||
}
|
||||
|
||||
saveAs() {
|
||||
close();
|
||||
Future.delayed(Duration.zero, () async {
|
||||
final ts = DateTime.now().millisecondsSinceEpoch ~/ 1000;
|
||||
String? outputFile = await FilePicker.platform.saveFile(
|
||||
dialogTitle: '${translate('Save as')}...',
|
||||
fileName: 'screenshot_$ts.png',
|
||||
allowedExtensions: ['png'],
|
||||
type: FileType.custom,
|
||||
);
|
||||
if (outputFile == null) {
|
||||
bind.sessionHandleScreenshot(sessionId: sessionId, action: '2');
|
||||
} else {
|
||||
final res = await bind.sessionHandleScreenshot(
|
||||
sessionId: sessionId, action: '0:$outputFile');
|
||||
if (res.isNotEmpty) {
|
||||
msgBox(sessionId, 'custom-nook-nocancel-hasclose-error',
|
||||
'Take screenshot', res, '', dialogManager);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
copyToClipboard() {
|
||||
bind.sessionHandleScreenshot(sessionId: sessionId, action: '1');
|
||||
close();
|
||||
}
|
||||
|
||||
cancel() {
|
||||
bind.sessionHandleScreenshot(sessionId: sessionId, action: '2');
|
||||
close();
|
||||
}
|
||||
|
||||
final List<Widget> buttons = [
|
||||
dialogButton('${translate('Save as')}...', onPressed: saveAs),
|
||||
dialogButton('Copy to clipboard', onPressed: copyToClipboard),
|
||||
dialogButton('Cancel', onPressed: cancel),
|
||||
];
|
||||
dialogManager.dismissAll();
|
||||
dialogManager.show(
|
||||
(setState, close, context) => CustomAlertDialog(
|
||||
title: null,
|
||||
content: SelectionArea(
|
||||
child: msgboxContent(msgBoxType, msgBoxTitle, msgBoxText)),
|
||||
actions: buttons,
|
||||
),
|
||||
tag: '$msgBoxType-$msgBoxTitle-$msgBoxTitle',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
_handlePrinterRequest(
|
||||
Map<String, dynamic> evt, SessionID sessionId, String peerId) {
|
||||
final id = evt['id'];
|
||||
@@ -451,7 +525,7 @@ class FfiModel with ChangeNotifier {
|
||||
if (saveSettings.value || dontShowAgain.value) {
|
||||
bind.mainSetLocalOption(key: kKeyPrinterSelected, value: printerName);
|
||||
bind.mainSetLocalOption(
|
||||
key: kKeyPrinterIncommingJobAction,
|
||||
key: kKeyPrinterIncomingJobAction,
|
||||
value: defaultOrSelectedGroupValue.value);
|
||||
}
|
||||
if (dontShowAgain.value) {
|
||||
@@ -463,7 +537,7 @@ class FfiModel with ChangeNotifier {
|
||||
onCancel() {
|
||||
if (dontShowAgain.value) {
|
||||
bind.mainSetLocalOption(
|
||||
key: kKeyPrinterIncommingJobAction,
|
||||
key: kKeyPrinterIncomingJobAction,
|
||||
value: kValuePrinterIncomingJobDismiss);
|
||||
}
|
||||
close();
|
||||
@@ -2917,6 +2991,10 @@ class FFI {
|
||||
textureModel.updateCurrentDisplay(display ?? 0);
|
||||
}
|
||||
|
||||
if (isDesktop) {
|
||||
inputModel.updateTrackpadSpeed();
|
||||
}
|
||||
|
||||
// CAUTION: `sessionStart()` and `sessionStartWithDisplays()` are an async functions.
|
||||
// Though the stream is returned immediately, the stream may not be ready.
|
||||
// Any operations that depend on the stream should be carefully handled.
|
||||
|
||||
@@ -13,7 +13,7 @@ class PrinterOptions {
|
||||
required this.printerName});
|
||||
|
||||
static PrinterOptions load() {
|
||||
var action = bind.mainGetLocalOption(key: kKeyPrinterIncommingJobAction);
|
||||
var action = bind.mainGetLocalOption(key: kKeyPrinterIncomingJobAction);
|
||||
if (![
|
||||
kValuePrinterIncomingJobDismiss,
|
||||
kValuePrinterIncomingJobDefault,
|
||||
@@ -28,7 +28,7 @@ class PrinterOptions {
|
||||
if (action == kValuePrinterIncomingJobSelected) {
|
||||
action = kValuePrinterIncomingJobDefault;
|
||||
bind.mainSetLocalOption(
|
||||
key: kKeyPrinterIncommingJobAction,
|
||||
key: kKeyPrinterIncomingJobAction,
|
||||
value: kValuePrinterIncomingJobDefault);
|
||||
if (printerNames.isEmpty) {
|
||||
selectedPrinterName = '';
|
||||
|
||||
@@ -116,6 +116,10 @@ class UserModel {
|
||||
userName.value = user.name;
|
||||
isAdmin.value = user.isAdmin;
|
||||
bind.mainSetLocalOption(key: 'user_info', value: jsonEncode(user));
|
||||
if (isWeb) {
|
||||
// ugly here, tmp solution
|
||||
bind.mainSetLocalOption(key: 'verifier', value: user.verifier ?? '');
|
||||
}
|
||||
}
|
||||
|
||||
// update ab and group status
|
||||
@@ -184,7 +188,9 @@ class UserModel {
|
||||
rethrow;
|
||||
}
|
||||
|
||||
if (loginResponse.user != null) {
|
||||
final isLogInDone = loginResponse.type == HttpType.kAuthResTypeToken &&
|
||||
loginResponse.access_token != null;
|
||||
if (isLogInDone && loginResponse.user != null) {
|
||||
_parseAndUpdateUser(loginResponse.user!);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,10 +8,12 @@ import 'dart:html';
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_hbb/common/widgets/login.dart';
|
||||
import 'package:flutter_hbb/models/state_model.dart';
|
||||
|
||||
import 'package:flutter_hbb/web/bridge.dart';
|
||||
import 'package:flutter_hbb/common.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
final List<StreamSubscription<MouseEvent>> mouseListeners = [];
|
||||
final List<StreamSubscription<KeyboardEvent>> keyListeners = [];
|
||||
@@ -49,14 +51,15 @@ class PlatformFFI {
|
||||
}
|
||||
|
||||
bool registerEventHandler(
|
||||
String eventName, String handlerName, HandleEvent handler) {
|
||||
String eventName, String handlerName, HandleEvent handler,
|
||||
{bool replace = false}) {
|
||||
debugPrint('registerEventHandler $eventName $handlerName');
|
||||
var handlers = _eventHandlers[eventName];
|
||||
if (handlers == null) {
|
||||
_eventHandlers[eventName] = {handlerName: handler};
|
||||
return true;
|
||||
} else {
|
||||
if (handlers.containsKey(handlerName)) {
|
||||
if (!replace && handlers.containsKey(handlerName)) {
|
||||
return false;
|
||||
} else {
|
||||
handlers[handlerName] = handler;
|
||||
@@ -112,6 +115,17 @@ class PlatformFFI {
|
||||
context["onInitFinished"] = () {
|
||||
completer.complete();
|
||||
};
|
||||
context['dialog'] = (type, title, text) {
|
||||
final uuid = Uuid();
|
||||
msgBox(SessionID(uuid.v4()), type, title, text, '', gFFI.dialogManager);
|
||||
};
|
||||
context['loginDialog'] = () {
|
||||
loginDialog();
|
||||
};
|
||||
context['closeConnection'] = () {
|
||||
gFFI.dialogManager.dismissAll();
|
||||
closeConnection();
|
||||
};
|
||||
context.callMethod('init');
|
||||
version = getByName('version');
|
||||
window.onContextMenu.listen((event) {
|
||||
|
||||
@@ -267,6 +267,16 @@ class RustdeskImpl {
|
||||
]));
|
||||
}
|
||||
|
||||
Future<int?> sessionGetTrackpadSpeed(
|
||||
{required UuidValue sessionId, dynamic hint}) {
|
||||
throw UnimplementedError("sessionGetTrackpadSpeed");
|
||||
}
|
||||
|
||||
Future<void> sessionSetTrackpadSpeed(
|
||||
{required UuidValue sessionId, required int value, dynamic hint}) {
|
||||
throw UnimplementedError("sessionSetTrackpadSpeed");
|
||||
}
|
||||
|
||||
Future<String?> sessionGetScrollStyle(
|
||||
{required UuidValue sessionId, dynamic hint}) {
|
||||
return Future(() =>
|
||||
@@ -1852,5 +1862,49 @@ class RustdeskImpl {
|
||||
throw UnimplementedError("sessionGetConnToken");
|
||||
}
|
||||
|
||||
String mainGetPrinterNames({dynamic hint}) {
|
||||
return '';
|
||||
}
|
||||
|
||||
Future<void> sessionPrinterResponse(
|
||||
{required UuidValue sessionId,
|
||||
required int id,
|
||||
required String path,
|
||||
required String printerName,
|
||||
dynamic hint}) {
|
||||
throw UnimplementedError("sessionPrinterResponse");
|
||||
}
|
||||
|
||||
Future<String> mainGetCommon({required String key, dynamic hint}) {
|
||||
throw UnimplementedError("mainGetCommon");
|
||||
}
|
||||
|
||||
String mainGetCommonSync({required String key, dynamic hint}) {
|
||||
throw UnimplementedError("mainGetCommonSync");
|
||||
}
|
||||
|
||||
Future<void> mainSetCommon(
|
||||
{required String key, required String value, dynamic hint}) {
|
||||
throw UnimplementedError("mainSetCommon");
|
||||
}
|
||||
|
||||
Future<String> sessionHandleScreenshot(
|
||||
{required UuidValue sessionId, required String action, dynamic hint}) {
|
||||
throw UnimplementedError("sessionHandleScreenshot");
|
||||
}
|
||||
|
||||
String? sessionGetCommonSync(
|
||||
{required UuidValue sessionId,
|
||||
required String key,
|
||||
required String param,
|
||||
dynamic hint}) {
|
||||
throw UnimplementedError("sessionGetCommonSync");
|
||||
}
|
||||
|
||||
Future<void> sessionTakeScreenshot(
|
||||
{required UuidValue sessionId, required int display, dynamic hint}) {
|
||||
throw UnimplementedError("sessionTakeScreenshot");
|
||||
}
|
||||
|
||||
void dispose() {}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
|
||||
# Read more about iOS versioning at
|
||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||
# 1.1.9-1 works for android, but for ios it becomes 1.1.91, need to set it to 1.1.9-a.1 for iOS, will get 1.1.9.1, but iOS store not allow 4 numbers
|
||||
version: 1.3.9+57
|
||||
version: 1.4.0+58
|
||||
|
||||
environment:
|
||||
sdk: '^3.1.0'
|
||||
|
||||
@@ -142,7 +142,8 @@ impl Enigo {
|
||||
}
|
||||
|
||||
fn post(&self, event: CGEvent) {
|
||||
if !self.ignore_flags {
|
||||
// event.set_flags(CGEventFlags::CGEventFlagNull); will cause `F11` not working. no idea why.
|
||||
if !self.ignore_flags && self.flags != CGEventFlags::CGEventFlagNull {
|
||||
event.set_flags(self.flags);
|
||||
}
|
||||
event.set_integer_value_field(EventField::EVENT_SOURCE_USER_DATA, ENIGO_INPUT_EXTRA_VALUE);
|
||||
|
||||
Submodule libs/hbb_common updated: 81b932b7bf...6e556f7e17
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "rustdesk-portable-packer"
|
||||
version = "1.3.9"
|
||||
version = "1.4.0"
|
||||
edition = "2021"
|
||||
description = "RustDesk Remote Desktop"
|
||||
|
||||
|
||||
@@ -197,3 +197,40 @@ pub fn convert_to_yuv(
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "ios"))]
|
||||
pub fn convert(captured: &PixelBuffer, pixfmt: crate::Pixfmt, dst: &mut Vec<u8>) -> ResultType<()> {
|
||||
if captured.pixfmt() == pixfmt {
|
||||
dst.extend_from_slice(captured.data());
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let src = captured.data();
|
||||
let src_stride = captured.stride();
|
||||
let src_pixfmt = captured.pixfmt();
|
||||
let src_width = captured.width();
|
||||
let src_height = captured.height();
|
||||
|
||||
let unsupported = format!(
|
||||
"unsupported pixfmt conversion: {src_pixfmt:?} -> {:?}",
|
||||
pixfmt
|
||||
);
|
||||
|
||||
match (src_pixfmt, pixfmt) {
|
||||
(crate::Pixfmt::BGRA, crate::Pixfmt::RGBA) | (crate::Pixfmt::RGBA, crate::Pixfmt::BGRA) => {
|
||||
dst.resize(src.len(), 0);
|
||||
call_yuv!(ABGRToARGB(
|
||||
src.as_ptr(),
|
||||
src_stride[0] as _,
|
||||
dst.as_mut_ptr(),
|
||||
src_stride[0] as _,
|
||||
src_width as _,
|
||||
src_height as _,
|
||||
));
|
||||
}
|
||||
_ => {
|
||||
bail!(unsupported);
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -63,6 +63,7 @@ pub enum ImageFormat {
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Clone)]
|
||||
pub struct ImageRgb {
|
||||
pub raw: Vec<u8>,
|
||||
pub w: usize,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
pkgname=rustdesk
|
||||
pkgver=1.3.9
|
||||
pkgver=1.4.0
|
||||
pkgrel=0
|
||||
epoch=
|
||||
pkgdesc=""
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
<!-- Launch ClientLauncher if installing or already installed and not uninstalling -->
|
||||
<!-- https://learn.microsoft.com/en-us/windows/win32/msi/uilevel -->
|
||||
<Custom Action="LaunchApp" After="InstallFinalize" Condition="(NOT UILevel=2) AND (NOT (Installed AND REMOVE AND NOT UPGRADINGPRODUCTCODE)) "/>
|
||||
<Custom Action="LaunchAppTray" After="InstallFinalize" Condition="(NOT UILevel=2) AND (NOT (Installed AND REMOVE AND NOT UPGRADINGPRODUCTCODE)) AND (NOT STOP_SERVICE="'Y'") AND (NOT CC_CONNECTION_TYPE="outgoing")"/>
|
||||
<Custom Action="LaunchAppTray" After="InstallFinalize" Condition="(LAUNCH_TRAY_APP="Y" OR LAUNCH_TRAY_APP="1") AND (NOT (Installed AND REMOVE AND NOT UPGRADINGPRODUCTCODE)) AND (NOT STOP_SERVICE="'Y'") AND (NOT CC_CONNECTION_TYPE="outgoing")"/>
|
||||
|
||||
<!-- https://learn.microsoft.com/en-us/windows/win32/msi/operating-system-property-values -->
|
||||
<!-- We have to use `VersionNT` to instead of `IsWindows10OrGreater()` in the custom action.
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
<!--STOP_SERVICE is set to 'Y'. Because the cofig value may be empty or 'Y'-->
|
||||
<Property Id="STOP_SERVICE" Value="'Y'" />
|
||||
|
||||
<Property Id="LAUNCH_TRAY_APP" Value="Y" />
|
||||
|
||||
<!--
|
||||
Support entries shown when clicking "Click here for support information"
|
||||
in Control Panel's Add/Remove Programs https://learn.microsoft.com/en-us/windows/win32/msi/property-reference
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Name: rustdesk
|
||||
Version: 1.3.9
|
||||
Version: 1.4.0
|
||||
Release: 0
|
||||
Summary: RPM package
|
||||
License: GPL-3.0
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Name: rustdesk
|
||||
Version: 1.3.9
|
||||
Version: 1.4.0
|
||||
Release: 0
|
||||
Summary: RPM package
|
||||
License: GPL-3.0
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Name: rustdesk
|
||||
Version: 1.3.9
|
||||
Version: 1.4.0
|
||||
Release: 0
|
||||
Summary: RPM package
|
||||
License: GPL-3.0
|
||||
|
||||
10
res/vcpkg/mfx-dispatch/0003-upgrade-cmake-3.14.patch
Normal file
10
res/vcpkg/mfx-dispatch/0003-upgrade-cmake-3.14.patch
Normal file
@@ -0,0 +1,10 @@
|
||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index a8a3288..7d01d97 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -1,4 +1,4 @@
|
||||
-cmake_minimum_required(VERSION 2.6)
|
||||
+cmake_minimum_required(VERSION 3.14)
|
||||
|
||||
project( libmfx )
|
||||
|
||||
39
res/vcpkg/mfx-dispatch/fix-pkgconf.patch
Normal file
39
res/vcpkg/mfx-dispatch/fix-pkgconf.patch
Normal file
@@ -0,0 +1,39 @@
|
||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index 9446bc4..a8a3288 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -3,16 +3,7 @@ cmake_minimum_required(VERSION 2.6)
|
||||
project( libmfx )
|
||||
|
||||
# FIXME Adds support for using system/other install of intel media sdk
|
||||
-find_path ( INTELMEDIASDK_PATH mfx/mfxvideo.h
|
||||
- HINTS "${CMAKE_SOURCE_DIR}"
|
||||
-)
|
||||
-
|
||||
-if (INTELMEDIASDK_PATH_NOTFOUND)
|
||||
- message( FATAL_ERROR "Intel MEDIA SDK include not found" )
|
||||
-else (INTELMEDIASDK_PATH_NOTFOUND)
|
||||
- message(STATUS "Intel Media SDK is here: ${INTELMEDIASDK_PATH}")
|
||||
-endif (INTELMEDIASDK_PATH_NOTFOUND)
|
||||
-
|
||||
+set(INTELMEDIASDK_PATH "${CMAKE_CURRENT_LIST_DIR}")
|
||||
|
||||
set(SOURCES
|
||||
src/main.cpp
|
||||
diff --git a/libmfx.pc.cmake b/libmfx.pc.cmake
|
||||
index fabb541..5d248fe 100644
|
||||
--- a/libmfx.pc.cmake
|
||||
+++ b/libmfx.pc.cmake
|
||||
@@ -6,9 +6,9 @@ Requires.private:
|
||||
Name: libmfx
|
||||
Description: Intel Media SDK Dispatched static library
|
||||
-Version: 2013
|
||||
+Version: 1.35
|
||||
Requires:
|
||||
Requires.private:
|
||||
Conflicts:
|
||||
-Libs: -L${libdir} -lsupc++ ${libdir}/libmfx.lib
|
||||
+Libs: -L${libdir} -llibmfx
|
||||
Libs.private:
|
||||
-Cflags: -I${includedir} -I@INTELMEDIASDK_PATH@
|
||||
+Cflags: -I${includedir}
|
||||
66
res/vcpkg/mfx-dispatch/fix-unresolved-symbol.patch
Normal file
66
res/vcpkg/mfx-dispatch/fix-unresolved-symbol.patch
Normal file
@@ -0,0 +1,66 @@
|
||||
Subject: [PATCH] fix for vcpkg
|
||||
fix missing mfx_driver_store_loader related symbols
|
||||
---
|
||||
Index: CMakeLists.txt
|
||||
IDEA additional info:
|
||||
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
|
||||
<+>UTF-8
|
||||
===================================================================
|
||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
--- a/CMakeLists.txt (revision 7e4d221c36c630c1250b23a5dfa15657bc04c10c)
|
||||
+++ b/CMakeLists.txt (revision 5ebef171699530ca01594a5cef10a68811f4d105)
|
||||
@@ -40,6 +39,7 @@
|
||||
src/mfx_load_plugin.cpp
|
||||
src/mfx_plugin_hive.cpp
|
||||
src/mfx_win_reg_key.cpp
|
||||
+ src/mfx_driver_store_loader.cpp
|
||||
)
|
||||
endif (CMAKE_SYSTEM_NAME MATCHES "Windows")
|
||||
|
||||
@@ -56,6 +56,12 @@
|
||||
configure_file (${CMAKE_SOURCE_DIR}/libmfx.pc.cmake ${CMAKE_BINARY_DIR}/libmfx.pc @ONLY)
|
||||
|
||||
add_library( mfx STATIC ${SOURCES} )
|
||||
+
|
||||
+if (CMAKE_SYSTEM_NAME MATCHES "Windows")
|
||||
+ set_target_properties(mfx
|
||||
+ PROPERTIES PREFIX lib)
|
||||
+endif (CMAKE_SYSTEM_NAME MATCHES "Windows")
|
||||
+
|
||||
install (DIRECTORY ${CMAKE_SOURCE_DIR}/mfx DESTINATION ${CMAKE_INSTALL_PREFIX}/include FILES_MATCHING PATTERN "*.h")
|
||||
install (FILES ${CMAKE_BINARY_DIR}/libmfx.pc DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/pkgconfig)
|
||||
install (TARGETS mfx ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
|
||||
Index: libmfx.pc.cmake
|
||||
IDEA additional info:
|
||||
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
|
||||
<+>UTF-8
|
||||
===================================================================
|
||||
diff --git a/libmfx.pc.cmake b/libmfx.pc.cmake
|
||||
--- a/libmfx.pc.cmake (revision 7e4d221c36c630c1250b23a5dfa15657bc04c10c)
|
||||
+++ b/libmfx.pc.cmake (revision 388559e9e8234eb0989e1598a9beea4035a04132)
|
||||
@@ -9,6 +9,6 @@
|
||||
Requires:
|
||||
Requires.private:
|
||||
Conflicts:
|
||||
-Libs: -L${libdir} -lsupc++ ${libdir}/libmfx.a
|
||||
+Libs: -L${libdir} -lsupc++ ${libdir}/libmfx.lib
|
||||
Libs.private:
|
||||
Cflags: -I${includedir} -I@INTELMEDIASDK_PATH@
|
||||
Index: src/mfx_driver_store_loader.cpp
|
||||
IDEA additional info:
|
||||
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
|
||||
<+>UTF-8
|
||||
===================================================================
|
||||
diff --git a/src/mfx_driver_store_loader.cpp b/src/mfx_driver_store_loader.cpp
|
||||
--- a/src/mfx_driver_store_loader.cpp (revision 388559e9e8234eb0989e1598a9beea4035a04132)
|
||||
+++ b/src/mfx_driver_store_loader.cpp (revision 5ebef171699530ca01594a5cef10a68811f4d105)
|
||||
@@ -24,6 +24,9 @@
|
||||
#include "mfx_dispatcher_log.h"
|
||||
#include "mfx_load_dll.h"
|
||||
|
||||
+#pragma comment(lib, "Ole32.lib")
|
||||
+#pragma comment(lib, "Advapi32.lib")
|
||||
+
|
||||
namespace MFX
|
||||
{
|
||||
|
||||
40
res/vcpkg/mfx-dispatch/portfile.cmake
Normal file
40
res/vcpkg/mfx-dispatch/portfile.cmake
Normal file
@@ -0,0 +1,40 @@
|
||||
vcpkg_download_distfile(
|
||||
MISSING_CSTDINT_IMPORT_PATCH
|
||||
URLS https://github.com/lu-zero/mfx_dispatch/commit/d6241243f85a0d947bdfe813006686a930edef24.patch?full_index=1
|
||||
FILENAME fix-missing-cstdint-import-d6241243f85a0d947bdfe813006686a930edef24.patch
|
||||
SHA512 5d2ffc4ec2ba0e5859d01d2e072f75436ebc3e62e0f6580b5bb8b9f82fe588e7558a46a1fdfa0297a782c0eeb8f50322258d0dd9e41d927cc9be496727b61e44
|
||||
)
|
||||
|
||||
vcpkg_from_github(
|
||||
OUT_SOURCE_PATH SOURCE_PATH
|
||||
REPO lu-zero/mfx_dispatch
|
||||
REF "${VERSION}"
|
||||
SHA512 12517338342d3e653043a57e290eb9cffd190aede0c3a3948956f1c7f12f0ea859361cf3e534ab066b96b1c211f68409c67ef21fd6d76b68cc31daef541941b0
|
||||
HEAD_REF master
|
||||
PATCHES
|
||||
fix-unresolved-symbol.patch
|
||||
fix-pkgconf.patch
|
||||
0003-upgrade-cmake-3.14.patch
|
||||
${MISSING_CSTDINT_IMPORT_PATCH}
|
||||
)
|
||||
|
||||
if(VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_IS_MINGW)
|
||||
vcpkg_cmake_configure(
|
||||
SOURCE_PATH "${SOURCE_PATH}"
|
||||
)
|
||||
vcpkg_cmake_install()
|
||||
vcpkg_copy_pdbs()
|
||||
else()
|
||||
if(VCPKG_TARGET_IS_MINGW)
|
||||
vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
|
||||
endif()
|
||||
vcpkg_configure_make(
|
||||
SOURCE_PATH "${SOURCE_PATH}"
|
||||
AUTOCONFIG
|
||||
)
|
||||
vcpkg_install_make()
|
||||
endif()
|
||||
vcpkg_fixup_pkgconfig()
|
||||
|
||||
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")
|
||||
vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE")
|
||||
16
res/vcpkg/mfx-dispatch/vcpkg.json
Normal file
16
res/vcpkg/mfx-dispatch/vcpkg.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "mfx-dispatch",
|
||||
"version": "1.35.1",
|
||||
"port-version": 5,
|
||||
"description": "Open source Intel media sdk dispatcher",
|
||||
"homepage": "https://github.com/lu-zero/mfx_dispatch",
|
||||
"license": "BSD-3-Clause",
|
||||
"supports": "((x86 | x64) & (android | linux)) | (windows & !uwp)",
|
||||
"dependencies": [
|
||||
{
|
||||
"name": "vcpkg-cmake",
|
||||
"host": true,
|
||||
"platform": "windows & !mingw"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -46,7 +46,7 @@ use hbb_common::{
|
||||
anyhow::{anyhow, Context},
|
||||
bail,
|
||||
config::{
|
||||
self, Config, LocalConfig, PeerConfig, PeerInfoSerde, Resolution, CONNECT_TIMEOUT,
|
||||
self, use_ws, Config, LocalConfig, PeerConfig, PeerInfoSerde, Resolution, CONNECT_TIMEOUT,
|
||||
READ_TIMEOUT, RELAY_PORT, RENDEZVOUS_PORT, RENDEZVOUS_SERVERS,
|
||||
},
|
||||
fs::JobType,
|
||||
@@ -58,7 +58,6 @@ use hbb_common::{
|
||||
sha2::{Digest, Sha256},
|
||||
socket_client::{connect_tcp, connect_tcp_local, ipv4_to_ipv6},
|
||||
sodiumoxide::{base64, crypto::sign},
|
||||
tcp::FramedStream,
|
||||
timeout,
|
||||
tokio::{
|
||||
self,
|
||||
@@ -86,6 +85,7 @@ pub use super::lang::*;
|
||||
pub mod file_trait;
|
||||
pub mod helper;
|
||||
pub mod io_loop;
|
||||
pub mod screenshot;
|
||||
|
||||
pub const MILLI1: Duration = Duration::from_millis(1);
|
||||
pub const SEC30: Duration = Duration::from_secs(30);
|
||||
@@ -216,7 +216,8 @@ impl Client {
|
||||
if hbb_common::is_ip_str(peer) {
|
||||
return Ok((
|
||||
(
|
||||
connect_tcp(check_port(peer, RELAY_PORT + 1), CONNECT_TIMEOUT).await?,
|
||||
connect_tcp_local(check_port(peer, RELAY_PORT + 1), None, CONNECT_TIMEOUT)
|
||||
.await?,
|
||||
true,
|
||||
None,
|
||||
),
|
||||
@@ -226,7 +227,11 @@ impl Client {
|
||||
// Allow connect to {domain}:{port}
|
||||
if hbb_common::is_domain_port_str(peer) {
|
||||
return Ok((
|
||||
(connect_tcp(peer, CONNECT_TIMEOUT).await?, true, None),
|
||||
(
|
||||
connect_tcp_local(peer, None, CONNECT_TIMEOUT).await?,
|
||||
true,
|
||||
None,
|
||||
),
|
||||
(0, "".to_owned()),
|
||||
));
|
||||
}
|
||||
@@ -291,7 +296,7 @@ impl Client {
|
||||
log::info!("#{} punch attempt with {}, id: {}", i, my_addr, peer);
|
||||
let mut msg_out = RendezvousMessage::new();
|
||||
use hbb_common::protobuf::Enum;
|
||||
let nat_type = if interface.is_force_relay() {
|
||||
let nat_type = if interface.is_force_relay() || use_ws() || Config::is_proxy() {
|
||||
NatType::SYMMETRIC
|
||||
} else {
|
||||
NatType::from_i32(my_nat_type).unwrap_or(NatType::UNKNOWN_NAT)
|
||||
@@ -2100,6 +2105,12 @@ impl LoginConfigHandler {
|
||||
res
|
||||
}
|
||||
|
||||
pub fn save_trackpad_speed(&mut self, speed: i32) {
|
||||
let mut config = self.load_config();
|
||||
config.trackpad_speed = speed;
|
||||
self.save_config(config);
|
||||
}
|
||||
|
||||
/// Create a [`Message`] for saving custom fps.
|
||||
///
|
||||
/// # Arguments
|
||||
@@ -2318,8 +2329,24 @@ impl LoginConfigHandler {
|
||||
if display_name.is_empty() {
|
||||
display_name = crate::username();
|
||||
}
|
||||
let display_name = display_name
|
||||
.split_whitespace()
|
||||
.map(|word| {
|
||||
word.chars()
|
||||
.enumerate()
|
||||
.map(|(i, c)| {
|
||||
if i == 0 {
|
||||
c.to_uppercase().to_string()
|
||||
} else {
|
||||
c.to_string()
|
||||
}
|
||||
})
|
||||
.collect::<String>()
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
.join(" ");
|
||||
#[cfg(not(target_os = "android"))]
|
||||
let my_platform = whoami::platform().to_string();
|
||||
let my_platform = hbb_common::whoami::platform().to_string();
|
||||
#[cfg(target_os = "android")]
|
||||
let my_platform = "Android".into();
|
||||
let hwid = if self.get_option("trust-this-device") == "Y" {
|
||||
@@ -3321,6 +3348,7 @@ pub enum Data {
|
||||
CloseVoiceCall,
|
||||
ResetDecoder(Option<usize>),
|
||||
RenameFile((i32, String, String, bool)),
|
||||
TakeScreenshot((i32, String)),
|
||||
}
|
||||
|
||||
/// Keycode for key events.
|
||||
@@ -3557,8 +3585,7 @@ pub mod peer_online {
|
||||
rendezvous_proto::*,
|
||||
sleep,
|
||||
socket_client::connect_tcp,
|
||||
tcp::FramedStream,
|
||||
ResultType,
|
||||
ResultType, Stream,
|
||||
};
|
||||
|
||||
pub async fn query_online_states<F: FnOnce(Vec<String>, Vec<String>)>(ids: Vec<String>, f: F) {
|
||||
@@ -3581,7 +3608,7 @@ pub mod peer_online {
|
||||
}
|
||||
}
|
||||
|
||||
async fn create_online_stream() -> ResultType<FramedStream> {
|
||||
async fn create_online_stream() -> ResultType<Stream> {
|
||||
let (rendezvous_server, _servers, _contained) =
|
||||
crate::get_rendezvous_server(READ_TIMEOUT).await;
|
||||
let tmp: Vec<&str> = rendezvous_server.split(":").collect();
|
||||
|
||||
@@ -351,7 +351,7 @@ impl<T: InvokeUiSession> Remote<T> {
|
||||
#[cfg(any(target_os = "windows", feature = "unix-file-copy-paste"))]
|
||||
async fn handle_local_clipboard_msg(
|
||||
&self,
|
||||
peer: &mut crate::client::FramedStream,
|
||||
peer: &mut Stream,
|
||||
msg: Option<clipboard::ClipboardFile>,
|
||||
) {
|
||||
match msg {
|
||||
@@ -962,6 +962,15 @@ impl<T: InvokeUiSession> Remote<T> {
|
||||
}
|
||||
}
|
||||
},
|
||||
Data::TakeScreenshot((display, sid)) => {
|
||||
let mut msg = Message::new();
|
||||
msg.set_screenshot_request(ScreenshotRequest {
|
||||
display,
|
||||
sid,
|
||||
..Default::default()
|
||||
});
|
||||
allow_err!(peer.send(&msg).await);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
true
|
||||
@@ -1909,6 +1918,11 @@ impl<T: InvokeUiSession> Remote<T> {
|
||||
self.handler.set_displays(&pi.displays);
|
||||
self.handler.set_platform_additions(&pi.platform_additions);
|
||||
}
|
||||
Some(message::Union::ScreenshotResponse(response)) => {
|
||||
crate::client::screenshot::set_screenshot(response.data);
|
||||
self.handler
|
||||
.handle_screenshot_resp(response.sid, response.msg);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
99
src/client/screenshot.rs
Normal file
99
src/client/screenshot.rs
Normal file
@@ -0,0 +1,99 @@
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
use crate::clipboard::{update_clipboard, ClipboardSide};
|
||||
use hbb_common::{message_proto::*, ResultType};
|
||||
use std::sync::Mutex;
|
||||
|
||||
lazy_static::lazy_static! {
|
||||
static ref SCREENSHOT: Mutex<Screenshot> = Default::default();
|
||||
}
|
||||
|
||||
pub enum ScreenshotAction {
|
||||
SaveAs(String),
|
||||
CopyToClipboard,
|
||||
Discard,
|
||||
}
|
||||
|
||||
impl Default for ScreenshotAction {
|
||||
fn default() -> Self {
|
||||
Self::Discard
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&str> for ScreenshotAction {
|
||||
fn from(value: &str) -> Self {
|
||||
match value.chars().next() {
|
||||
Some('0') => {
|
||||
if let Some((pos, _)) = value.char_indices().nth(2) {
|
||||
let substring = &value[pos..];
|
||||
Self::SaveAs(substring.to_string())
|
||||
} else {
|
||||
Self::default()
|
||||
}
|
||||
}
|
||||
Some('1') => Self::CopyToClipboard,
|
||||
Some('2') => Self::default(),
|
||||
_ => Self::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Into<String> for ScreenshotAction {
|
||||
fn into(self) -> String {
|
||||
match self {
|
||||
Self::SaveAs(p) => format!("0:{p}"),
|
||||
Self::CopyToClipboard => "1".to_owned(),
|
||||
Self::Discard => "2".to_owned(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct Screenshot {
|
||||
data: Option<bytes::Bytes>,
|
||||
}
|
||||
|
||||
impl Screenshot {
|
||||
fn set_screenshot(&mut self, data: bytes::Bytes) {
|
||||
self.data.replace(data);
|
||||
}
|
||||
|
||||
fn handle_screenshot(&mut self, action: String) -> String {
|
||||
let Some(data) = self.data.take() else {
|
||||
return "No cached screenshot".to_owned();
|
||||
};
|
||||
match Self::handle_screenshot_(data, action) {
|
||||
Ok(()) => "".to_owned(),
|
||||
Err(e) => e.to_string(),
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_screenshot_(data: bytes::Bytes, action: String) -> ResultType<()> {
|
||||
match ScreenshotAction::from(&action as &str) {
|
||||
ScreenshotAction::SaveAs(p) => {
|
||||
std::fs::write(p, data)?;
|
||||
}
|
||||
ScreenshotAction::CopyToClipboard => {
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
{
|
||||
let clips = vec![Clipboard {
|
||||
compress: false,
|
||||
content: data,
|
||||
format: ClipboardFormat::ImagePng.into(),
|
||||
..Default::default()
|
||||
}];
|
||||
update_clipboard(clips, ClipboardSide::Client);
|
||||
}
|
||||
}
|
||||
ScreenshotAction::Discard => {}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
pub fn set_screenshot(data: bytes::Bytes) {
|
||||
SCREENSHOT.lock().unwrap().set_screenshot(data);
|
||||
}
|
||||
|
||||
pub fn handle_screenshot(action: String) -> String {
|
||||
SCREENSHOT.lock().unwrap().handle_screenshot(action)
|
||||
}
|
||||
@@ -463,7 +463,7 @@ pub fn is_support_multi_clipboard(peer_version: &str, peer_platform: &str) -> bo
|
||||
if get_version_number(peer_version) < get_version_number("1.3.0") {
|
||||
return false;
|
||||
}
|
||||
if ["", &whoami::Platform::Ios.to_string()].contains(&peer_platform) {
|
||||
if ["", &hbb_common::whoami::Platform::Ios.to_string()].contains(&peer_platform) {
|
||||
return false;
|
||||
}
|
||||
if "Android" == peer_platform && get_version_number(peer_version) < get_version_number("1.3.3")
|
||||
|
||||
144
src/common.rs
144
src/common.rs
@@ -7,12 +7,14 @@ use std::{
|
||||
|
||||
use serde_json::{json, Map, Value};
|
||||
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
use hbb_common::whoami;
|
||||
use hbb_common::{
|
||||
allow_err,
|
||||
anyhow::{anyhow, Context},
|
||||
bail, base64,
|
||||
bytes::Bytes,
|
||||
config::{self, Config, CONNECT_TIMEOUT, READ_TIMEOUT, RENDEZVOUS_PORT},
|
||||
config::{self, use_ws, Config, CONNECT_TIMEOUT, READ_TIMEOUT, RENDEZVOUS_PORT},
|
||||
futures::future::join_all,
|
||||
futures_util::future::poll_fn,
|
||||
get_version_number, log,
|
||||
@@ -27,7 +29,7 @@ use hbb_common::{
|
||||
self,
|
||||
time::{Duration, Instant, Interval},
|
||||
},
|
||||
ResultType,
|
||||
ResultType, Stream,
|
||||
};
|
||||
|
||||
use crate::{
|
||||
@@ -147,6 +149,16 @@ pub fn is_support_file_paste_if_macos(ver: &str) -> bool {
|
||||
hbb_common::get_version_number(ver) >= hbb_common::get_version_number("1.3.9")
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn is_support_screenshot(ver: &str) -> bool {
|
||||
is_support_multi_ui_session_num(hbb_common::get_version_number(ver))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn is_support_screenshot_num(ver: i64) -> bool {
|
||||
ver >= hbb_common::get_version_number("1.4.0")
|
||||
}
|
||||
|
||||
// is server process, with "--server" args
|
||||
#[inline]
|
||||
pub fn is_server() -> bool {
|
||||
@@ -492,41 +504,73 @@ audio_rechannel!(audio_rechannel_8_5, 8, 5);
|
||||
audio_rechannel!(audio_rechannel_8_6, 8, 6);
|
||||
audio_rechannel!(audio_rechannel_8_7, 8, 7);
|
||||
|
||||
pub struct CheckTestNatType {
|
||||
is_direct: bool,
|
||||
}
|
||||
|
||||
impl CheckTestNatType {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
is_direct: Config::get_socks().is_none() && !config::use_ws(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for CheckTestNatType {
|
||||
fn drop(&mut self) {
|
||||
let is_direct = Config::get_socks().is_none() && !config::use_ws();
|
||||
if self.is_direct != is_direct {
|
||||
test_nat_type();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn test_nat_type() {
|
||||
let mut i = 0;
|
||||
std::thread::spawn(move || loop {
|
||||
match test_nat_type_() {
|
||||
Ok(true) => break,
|
||||
Err(err) => {
|
||||
log::error!("test nat: {}", err);
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
std::thread::spawn(move || {
|
||||
static IS_RUNNING: AtomicBool = AtomicBool::new(false);
|
||||
if IS_RUNNING.load(Ordering::SeqCst) {
|
||||
return;
|
||||
}
|
||||
IS_RUNNING.store(true, Ordering::SeqCst);
|
||||
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
crate::ipc::get_socks_ws();
|
||||
let is_direct = Config::get_socks().is_none() && !config::use_ws();
|
||||
if !is_direct {
|
||||
Config::set_nat_type(NatType::SYMMETRIC as _);
|
||||
IS_RUNNING.store(false, Ordering::SeqCst);
|
||||
return;
|
||||
}
|
||||
|
||||
let mut i = 0;
|
||||
loop {
|
||||
match test_nat_type_() {
|
||||
Ok(true) => break,
|
||||
Err(err) => {
|
||||
log::error!("test nat: {}", err);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
_ => {}
|
||||
if Config::get_nat_type() != 0 {
|
||||
break;
|
||||
}
|
||||
i = i * 2 + 1;
|
||||
if i > 300 {
|
||||
i = 300;
|
||||
}
|
||||
std::thread::sleep(std::time::Duration::from_secs(i));
|
||||
}
|
||||
if Config::get_nat_type() != 0 {
|
||||
break;
|
||||
}
|
||||
i = i * 2 + 1;
|
||||
if i > 300 {
|
||||
i = 300;
|
||||
}
|
||||
std::thread::sleep(std::time::Duration::from_secs(i));
|
||||
|
||||
IS_RUNNING.store(false, Ordering::SeqCst);
|
||||
});
|
||||
}
|
||||
|
||||
#[tokio::main(flavor = "current_thread")]
|
||||
async fn test_nat_type_() -> ResultType<bool> {
|
||||
log::info!("Testing nat ...");
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
let is_direct = crate::ipc::get_socks_async(1_000).await.is_none(); // sync socks BTW
|
||||
#[cfg(any(target_os = "android", target_os = "ios"))]
|
||||
let is_direct = Config::get_socks().is_none(); // sync socks BTW
|
||||
if !is_direct {
|
||||
Config::set_nat_type(NatType::SYMMETRIC as _);
|
||||
return Ok(true);
|
||||
}
|
||||
let start = std::time::Instant::now();
|
||||
let (rendezvous_server, _, _) = get_rendezvous_server(1_000).await;
|
||||
let server1 = rendezvous_server;
|
||||
let server1 = Config::get_rendezvous_server();
|
||||
let server2 = crate::increase_port(&server1, -1);
|
||||
let mut msg_out = RendezvousMessage::new();
|
||||
let serial = Config::get_serial();
|
||||
@@ -832,15 +876,15 @@ pub fn is_modifier(evt: &KeyEvent) -> bool {
|
||||
pub fn check_software_update() {
|
||||
if is_custom_client() {
|
||||
return;
|
||||
}
|
||||
}
|
||||
let opt = config::LocalConfig::get_option(config::keys::OPTION_ENABLE_CHECK_UPDATE);
|
||||
if config::option2bool(config::keys::OPTION_ENABLE_CHECK_UPDATE, &opt) {
|
||||
std::thread::spawn(move || allow_err!(check_software_update_()));
|
||||
std::thread::spawn(move || allow_err!(do_check_software_update()));
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::main(flavor = "current_thread")]
|
||||
async fn check_software_update_() -> hbb_common::ResultType<()> {
|
||||
pub async fn do_check_software_update() -> hbb_common::ResultType<()> {
|
||||
let (request, url) =
|
||||
hbb_common::version_check_request(hbb_common::VER_TYPE_RUSTDESK_CLIENT.to_string());
|
||||
let latest_release_response = create_http_client_async()
|
||||
@@ -864,6 +908,8 @@ async fn check_software_update_() -> hbb_common::ResultType<()> {
|
||||
}
|
||||
}
|
||||
*SOFTWARE_UPDATE_URL.lock().unwrap() = response_url;
|
||||
} else {
|
||||
*SOFTWARE_UPDATE_URL.lock().unwrap() = "".to_string();
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
@@ -1196,7 +1242,7 @@ pub fn pk_to_fingerprint(pk: Vec<u8>) -> String {
|
||||
|
||||
#[inline]
|
||||
pub async fn get_next_nonkeyexchange_msg(
|
||||
conn: &mut FramedStream,
|
||||
conn: &mut Stream,
|
||||
timeout: Option<u64>,
|
||||
) -> Option<RendezvousMessage> {
|
||||
let timeout = timeout.unwrap_or(READ_TIMEOUT);
|
||||
@@ -1218,7 +1264,34 @@ pub async fn get_next_nonkeyexchange_msg(
|
||||
None
|
||||
}
|
||||
|
||||
#[cfg(all(target_os = "windows", not(target_pointer_width = "64")))]
|
||||
pub fn check_process(arg: &str, same_session_id: bool) -> bool {
|
||||
let mut path = std::env::current_exe().unwrap_or_default();
|
||||
if let Ok(linked) = path.read_link() {
|
||||
path = linked;
|
||||
}
|
||||
let Some(filename) = path.file_name() else {
|
||||
return false;
|
||||
};
|
||||
let filename = filename.to_string_lossy().to_string();
|
||||
match crate::platform::windows::get_pids_with_first_arg_check_session(
|
||||
&filename,
|
||||
arg,
|
||||
same_session_id,
|
||||
) {
|
||||
Ok(pids) => {
|
||||
let self_pid = hbb_common::sysinfo::Pid::from_u32(std::process::id());
|
||||
pids.into_iter().filter(|pid| *pid != self_pid).count() > 0
|
||||
}
|
||||
Err(e) => {
|
||||
log::error!("Failed to check process with arg: \"{}\", {}", arg, e);
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused_mut)]
|
||||
#[cfg(not(all(target_os = "windows", not(target_pointer_width = "64"))))]
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
pub fn check_process(arg: &str, mut same_uid: bool) -> bool {
|
||||
#[cfg(target_os = "macos")]
|
||||
@@ -1265,7 +1338,14 @@ pub fn check_process(arg: &str, mut same_uid: bool) -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
pub async fn secure_tcp(conn: &mut FramedStream, key: &str) -> ResultType<()> {
|
||||
pub async fn secure_tcp(conn: &mut Stream, key: &str) -> ResultType<()> {
|
||||
// Skip additional encryption when using WebSocket connections (wss://)
|
||||
// as WebSocket Secure (wss://) already provides transport layer encryption.
|
||||
// This doesn't affect the end-to-end encryption between clients,
|
||||
// it only avoids redundant encryption between client and server.
|
||||
if use_ws() {
|
||||
return Ok(());
|
||||
}
|
||||
let rs_pk = get_rs_pk(key);
|
||||
let Some(rs_pk) = rs_pk else {
|
||||
bail!("Handshake failed: invalid public key from rendezvous server");
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#[cfg(windows)]
|
||||
#[cfg(any(target_os = "windows", target_os = "macos"))]
|
||||
use crate::client::translate;
|
||||
#[cfg(not(debug_assertions))]
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
@@ -77,7 +77,14 @@ pub fn core_main() -> Option<Vec<String>> {
|
||||
}
|
||||
#[cfg(any(target_os = "linux", target_os = "windows"))]
|
||||
if args.is_empty() {
|
||||
if crate::check_process("--server", false) && !crate::check_process("--tray", true) {
|
||||
#[cfg(target_os = "linux")]
|
||||
let is_server_running = crate::check_process("--server", false);
|
||||
// We can use `crate::check_process("--server", false)` on Windows.
|
||||
// Because `--server` process is the System user's process. We can't get the arguments in `check_process()`.
|
||||
// We can assume that self service running means the server is also running on Windows.
|
||||
#[cfg(target_os = "windows")]
|
||||
let is_server_running = crate::platform::is_self_service_running();
|
||||
if is_server_running && !crate::check_process("--tray", true) {
|
||||
#[cfg(target_os = "linux")]
|
||||
hbb_common::allow_err!(crate::platform::check_autostart_config());
|
||||
hbb_common::allow_err!(crate::run_me(vec!["--tray"]));
|
||||
@@ -182,6 +189,26 @@ pub fn core_main() -> Option<Vec<String>> {
|
||||
log::error!("Failed to uninstall: {}", err);
|
||||
}
|
||||
return None;
|
||||
} else if args[0] == "--update" {
|
||||
if config::is_disable_installation() {
|
||||
return None;
|
||||
}
|
||||
let res = platform::update_me(false);
|
||||
let text = match res {
|
||||
Ok(_) => translate("Update successfully!".to_string()),
|
||||
Err(err) => {
|
||||
log::error!("Failed with error: {err}");
|
||||
translate("Update failed!".to_string())
|
||||
}
|
||||
};
|
||||
Toast::new(Toast::POWERSHELL_APP_ID)
|
||||
.title(&config::APP_NAME.read().unwrap())
|
||||
.text1(&text)
|
||||
.sound(Some(Sound::Default))
|
||||
.duration(Duration::Short)
|
||||
.show()
|
||||
.ok();
|
||||
return None;
|
||||
} else if args[0] == "--after-install" {
|
||||
if let Err(err) = platform::run_after_install() {
|
||||
log::error!("Failed to after-install: {}", err);
|
||||
@@ -243,6 +270,21 @@ pub fn core_main() -> Option<Vec<String>> {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
#[cfg(target_os = "macos")]
|
||||
{
|
||||
use crate::platform;
|
||||
if args[0] == "--update" {
|
||||
let _text = match platform::update_me() {
|
||||
Ok(_) => {
|
||||
log::info!("{}", translate("Update successfully!".to_string()));
|
||||
}
|
||||
Err(err) => {
|
||||
log::error!("Update failed with error: {err}");
|
||||
}
|
||||
};
|
||||
return None;
|
||||
}
|
||||
}
|
||||
if args[0] == "--remove" {
|
||||
if args.len() == 2 {
|
||||
// sleep a while so that process of removed exe exit
|
||||
@@ -277,11 +319,7 @@ pub fn core_main() -> Option<Vec<String>> {
|
||||
.arg(&format!("{} --tray", crate::get_app_name().to_lowercase()))
|
||||
.status()
|
||||
.ok();
|
||||
hbb_common::allow_err!(crate::platform::run_as_user(
|
||||
vec!["--tray"],
|
||||
None,
|
||||
None::<(&str, &str)>,
|
||||
));
|
||||
hbb_common::allow_err!(crate::run_me(vec!["--tray"]));
|
||||
}
|
||||
#[cfg(windows)]
|
||||
crate::privacy_mode::restore_reg_connectivity(true);
|
||||
@@ -589,7 +627,8 @@ fn core_main_invoke_new_connection(mut args: std::env::Args) -> Option<Vec<Strin
|
||||
let mut param_array = vec![];
|
||||
while let Some(arg) = args.next() {
|
||||
match arg.as_str() {
|
||||
"--connect" | "--play" | "--file-transfer" | "--view-camera" | "--port-forward" | "--rdp" => {
|
||||
"--connect" | "--play" | "--file-transfer" | "--view-camera" | "--port-forward"
|
||||
| "--rdp" => {
|
||||
authority = Some((&arg.to_string()[2..]).to_owned());
|
||||
id = args.next();
|
||||
}
|
||||
|
||||
@@ -543,6 +543,25 @@ impl FlutterHandler {
|
||||
pub fn push_event<V>(&self, name: &str, event: &[(&str, V)], excludes: &[&SessionID])
|
||||
where
|
||||
V: Sized + Serialize + Clone,
|
||||
{
|
||||
self.push_event_(name, event, &[], excludes);
|
||||
}
|
||||
|
||||
pub fn push_event_to<V>(&self, name: &str, event: &[(&str, V)], include: &[&SessionID])
|
||||
where
|
||||
V: Sized + Serialize + Clone,
|
||||
{
|
||||
self.push_event_(name, event, include, &[]);
|
||||
}
|
||||
|
||||
pub fn push_event_<V>(
|
||||
&self,
|
||||
name: &str,
|
||||
event: &[(&str, V)],
|
||||
includes: &[&SessionID],
|
||||
excludes: &[&SessionID],
|
||||
) where
|
||||
V: Sized + Serialize + Clone,
|
||||
{
|
||||
let mut h: HashMap<&str, serde_json::Value> =
|
||||
event.iter().map(|(k, v)| (*k, json!(*v))).collect();
|
||||
@@ -550,11 +569,20 @@ impl FlutterHandler {
|
||||
h.insert("name", json!(name));
|
||||
let out = serde_json::ser::to_string(&h).unwrap_or("".to_owned());
|
||||
for (sid, session) in self.session_handlers.read().unwrap().iter() {
|
||||
if excludes.contains(&sid) {
|
||||
continue;
|
||||
let mut push = false;
|
||||
if includes.is_empty() {
|
||||
if !excludes.contains(&sid) {
|
||||
push = true;
|
||||
}
|
||||
} else {
|
||||
if includes.contains(&sid) {
|
||||
push = true;
|
||||
}
|
||||
}
|
||||
if let Some(stream) = &session.event_stream {
|
||||
stream.add(EventToUI::Event(out.clone()));
|
||||
if push {
|
||||
if let Some(stream) = &session.event_stream {
|
||||
stream.add(EventToUI::Event(out.clone()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1067,6 +1095,16 @@ impl InvokeUiSession for FlutterHandler {
|
||||
&[],
|
||||
);
|
||||
}
|
||||
|
||||
fn handle_screenshot_resp(&self, sid: String, msg: String) {
|
||||
match SessionID::from_str(&sid) {
|
||||
Ok(sid) => self.push_event_to("screenshot", &[("msg", json!(msg))], &[&sid]),
|
||||
Err(e) => {
|
||||
// Unreachable!
|
||||
log::error!("Failed to parse sid \"{}\", {}", sid, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl FlutterHandler {
|
||||
@@ -1996,7 +2034,10 @@ pub mod sessions {
|
||||
None => {}
|
||||
}
|
||||
}
|
||||
SESSIONS.write().unwrap().remove(&remove_peer_key?)
|
||||
let s = SESSIONS.write().unwrap().remove(&remove_peer_key?);
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
update_session_count_to_server();
|
||||
s
|
||||
}
|
||||
|
||||
fn check_remove_unused_displays(
|
||||
@@ -2098,6 +2139,14 @@ pub mod sessions {
|
||||
.write()
|
||||
.unwrap()
|
||||
.insert(session_id, Default::default());
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
update_session_count_to_server();
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
fn update_session_count_to_server() {
|
||||
crate::ipc::update_controlling_session_count(SESSIONS.read().unwrap().len()).ok();
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
||||
@@ -21,11 +21,12 @@ use hbb_common::{
|
||||
};
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
path::PathBuf,
|
||||
sync::{
|
||||
atomic::{AtomicI32, Ordering},
|
||||
Arc,
|
||||
},
|
||||
time::SystemTime,
|
||||
time::{Duration, SystemTime},
|
||||
};
|
||||
|
||||
pub type SessionID = uuid::Uuid;
|
||||
@@ -250,6 +251,16 @@ pub fn session_refresh(session_id: SessionID, display: usize) {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn session_take_screenshot(session_id: SessionID, display: usize) {
|
||||
if let Some(s) = sessions::get_session_by_session_id(&session_id) {
|
||||
s.take_screenshot(display as _, session_id.to_string());
|
||||
}
|
||||
}
|
||||
|
||||
pub fn session_handle_screenshot(session_id: SessionID, action: String) -> String {
|
||||
crate::client::screenshot::handle_screenshot(action)
|
||||
}
|
||||
|
||||
pub fn session_is_multi_ui_session(session_id: SessionID) -> SyncReturn<bool> {
|
||||
if let Some(session) = sessions::get_session_by_session_id(&session_id) {
|
||||
SyncReturn(session.is_multi_ui_session())
|
||||
@@ -481,6 +492,20 @@ pub fn session_set_custom_fps(session_id: SessionID, fps: i32) {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn session_get_trackpad_speed(session_id: SessionID) -> Option<i32> {
|
||||
if let Some(session) = sessions::get_session_by_session_id(&session_id) {
|
||||
Some(session.get_trackpad_speed())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub fn session_set_trackpad_speed(session_id: SessionID, value: i32) {
|
||||
if let Some(session) = sessions::get_session_by_session_id(&session_id) {
|
||||
session.save_trackpad_speed(value);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn session_lock_screen(session_id: SessionID) {
|
||||
if let Some(session) = sessions::get_session_by_session_id(&session_id) {
|
||||
session.lock_screen();
|
||||
@@ -880,7 +905,10 @@ pub fn main_set_option(key: String, value: String) {
|
||||
);
|
||||
}
|
||||
|
||||
if key.eq("custom-rendezvous-server") {
|
||||
if key.eq("custom-rendezvous-server")
|
||||
|| key.eq(config::keys::OPTION_ALLOW_WEBSOCKET)
|
||||
|| key.eq("api-server")
|
||||
{
|
||||
set_option(key, value.clone());
|
||||
#[cfg(target_os = "android")]
|
||||
crate::rendezvous_mediator::RendezvousMediator::restart();
|
||||
@@ -2418,7 +2446,42 @@ pub fn main_get_common(key: String) -> String {
|
||||
} else if key == "transfer-job-id" {
|
||||
return hbb_common::fs::get_next_job_id().to_string();
|
||||
} else {
|
||||
"".to_owned()
|
||||
if key.starts_with("download-data-") {
|
||||
let id = key.replace("download-data-", "");
|
||||
match crate::hbbs_http::downloader::get_download_data(&id) {
|
||||
Ok(data) => serde_json::to_string(&data).unwrap_or_default(),
|
||||
Err(e) => {
|
||||
format!("error:{}", e)
|
||||
}
|
||||
}
|
||||
} else if key.starts_with("download-file-") {
|
||||
let _version = key.replace("download-file-", "");
|
||||
#[cfg(target_os = "windows")]
|
||||
return match crate::platform::windows::is_msi_installed() {
|
||||
Ok(true) => format!("rustdesk-{_version}-x86_64.msi"),
|
||||
Ok(false) => format!("rustdesk-{_version}-x86_64.exe"),
|
||||
Err(e) => {
|
||||
log::error!("Failed to check if is msi: {}", e);
|
||||
format!("error:update-failed-check-msi-tip")
|
||||
}
|
||||
};
|
||||
#[cfg(target_os = "macos")]
|
||||
{
|
||||
return if cfg!(target_arch = "x86_64") {
|
||||
format!("rustdesk-{_version}-x86_64.dmg")
|
||||
} else if cfg!(target_arch = "aarch64") {
|
||||
format!("rustdesk-{_version}-aarch64.dmg")
|
||||
} else {
|
||||
"error:unsupported".to_owned()
|
||||
};
|
||||
}
|
||||
#[cfg(not(any(target_os = "windows", target_os = "macos")))]
|
||||
{
|
||||
"error:unsupported".to_owned()
|
||||
}
|
||||
} else {
|
||||
"".to_owned()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2438,6 +2501,16 @@ pub fn main_set_common(_key: String, _value: String) {
|
||||
(false, err)
|
||||
}
|
||||
};
|
||||
if success {
|
||||
// Use `ipc` to notify the server process to update the install option in the registry.
|
||||
// Because `install_update_printer()` may prompt for permissions, there is no need to prompt again here.
|
||||
if let Err(e) = crate::ipc::set_install_option(
|
||||
crate::platform::REG_NAME_INSTALL_PRINTER.to_string(),
|
||||
"1".to_string(),
|
||||
) {
|
||||
log::error!("Failed to set install printer option: {}", e);
|
||||
}
|
||||
}
|
||||
let data = HashMap::from([
|
||||
("name", serde_json::json!("install-printer-res")),
|
||||
("success", serde_json::json!(success)),
|
||||
@@ -2449,6 +2522,96 @@ pub fn main_set_common(_key: String, _value: String) {
|
||||
);
|
||||
});
|
||||
}
|
||||
#[cfg(any(target_os = "windows", target_os = "macos"))]
|
||||
{
|
||||
use crate::updater::get_download_file_from_url;
|
||||
if _key == "download-new-version" {
|
||||
let download_url = _value.clone();
|
||||
let event_key = "download-new-version".to_owned();
|
||||
let data = if let Some(download_file) = get_download_file_from_url(&download_url) {
|
||||
std::fs::remove_file(&download_file).ok();
|
||||
match crate::hbbs_http::downloader::download_file(
|
||||
download_url,
|
||||
Some(PathBuf::from(download_file)),
|
||||
Some(Duration::from_secs(3)),
|
||||
) {
|
||||
Ok(id) => HashMap::from([("name", event_key), ("id", id)]),
|
||||
Err(e) => HashMap::from([("name", event_key), ("error", e.to_string())]),
|
||||
}
|
||||
} else {
|
||||
HashMap::from([
|
||||
("name", event_key),
|
||||
("error", "Invalid download url".to_string()),
|
||||
])
|
||||
};
|
||||
let _res = flutter::push_global_event(
|
||||
flutter::APP_TYPE_MAIN,
|
||||
serde_json::ser::to_string(&data).unwrap_or("".to_owned()),
|
||||
);
|
||||
} else if _key == "update-me" {
|
||||
if let Some(new_version_file) = get_download_file_from_url(&_value) {
|
||||
log::debug!(
|
||||
"New version file is downloaed, update begin, {:?}",
|
||||
new_version_file.to_str()
|
||||
);
|
||||
if let Some(f) = new_version_file.to_str() {
|
||||
// 1.4.0 does not support "--update"
|
||||
// But we can assume that the new version supports it.
|
||||
#[cfg(target_os = "windows")]
|
||||
if f.ends_with(".exe") {
|
||||
if let Err(e) =
|
||||
crate::platform::run_exe_in_cur_session(f, vec!["--update"], false)
|
||||
{
|
||||
log::error!("Failed to run the update exe: {}", e);
|
||||
}
|
||||
} else if f.ends_with(".msi") {
|
||||
if let Err(e) = crate::platform::update_me_msi(f, false) {
|
||||
log::error!("Failed to run the update msi: {}", e);
|
||||
}
|
||||
} else {
|
||||
// unreachable!()
|
||||
}
|
||||
#[cfg(target_os = "macos")]
|
||||
match crate::platform::update_to(f) {
|
||||
Ok(_) => {
|
||||
log::info!("Update successfully!");
|
||||
}
|
||||
Err(e) => {
|
||||
log::error!("Failed to update to new version, {}", e);
|
||||
}
|
||||
}
|
||||
fs::remove_file(f).ok();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if _key == "remove-downloader" {
|
||||
crate::hbbs_http::downloader::remove(&_value);
|
||||
} else if _key == "cancel-downloader" {
|
||||
crate::hbbs_http::downloader::cancel(&_value);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn session_get_common_sync(
|
||||
session_id: SessionID,
|
||||
key: String,
|
||||
param: String,
|
||||
) -> SyncReturn<Option<String>> {
|
||||
SyncReturn(session_get_common(session_id, key, param))
|
||||
}
|
||||
|
||||
pub fn session_get_common(session_id: SessionID, key: String, param: String) -> Option<String> {
|
||||
if let Some(s) = sessions::get_session_by_session_id(&session_id) {
|
||||
let v = if key == "is_screenshot_supported" {
|
||||
s.is_screenshot_supported().to_string()
|
||||
} else {
|
||||
"".to_owned()
|
||||
};
|
||||
Some(v)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(target_os = "android")]
|
||||
|
||||
@@ -7,6 +7,7 @@ pub mod account;
|
||||
mod http_client;
|
||||
pub mod record_upload;
|
||||
pub mod sync;
|
||||
pub mod downloader;
|
||||
pub use http_client::create_http_client;
|
||||
pub use http_client::create_http_client_async;
|
||||
|
||||
|
||||
274
src/hbbs_http/downloader.rs
Normal file
274
src/hbbs_http/downloader.rs
Normal file
@@ -0,0 +1,274 @@
|
||||
use super::create_http_client_async;
|
||||
use hbb_common::{
|
||||
bail,
|
||||
lazy_static::lazy_static,
|
||||
log,
|
||||
tokio::{
|
||||
self,
|
||||
fs::File,
|
||||
io::AsyncWriteExt,
|
||||
sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender},
|
||||
},
|
||||
ResultType,
|
||||
};
|
||||
use serde_derive::Serialize;
|
||||
use std::{collections::HashMap, path::PathBuf, sync::Mutex, time::Duration};
|
||||
|
||||
lazy_static! {
|
||||
static ref DOWNLOADERS: Mutex<HashMap<String, Downloader>> = Default::default();
|
||||
}
|
||||
|
||||
/// This struct is used to return the download data to the caller.
|
||||
/// The caller should check if the file is downloaded successfully and remove the job from the map.
|
||||
/// If the file is not downloaded successfully, the `data` field will be empty.
|
||||
/// If the file is downloaded successfully, the `data` field will contain the downloaded data if `path` is None.
|
||||
#[derive(Serialize, Debug)]
|
||||
pub struct DownloadData {
|
||||
#[serde(skip_serializing_if = "Vec::is_empty")]
|
||||
pub data: Vec<u8>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub path: Option<PathBuf>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub total_size: Option<u64>,
|
||||
pub downloaded_size: u64,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub error: Option<String>,
|
||||
}
|
||||
|
||||
struct Downloader {
|
||||
data: Vec<u8>,
|
||||
path: Option<PathBuf>,
|
||||
// Some file may be empty, so we use Option<u64> to indicate if the size is known
|
||||
total_size: Option<u64>,
|
||||
downloaded_size: u64,
|
||||
error: Option<String>,
|
||||
finished: bool,
|
||||
tx_cancel: UnboundedSender<()>,
|
||||
}
|
||||
|
||||
// The caller should check if the file is downloaded successfully and remove the job from the map.
|
||||
pub fn download_file(
|
||||
url: String,
|
||||
path: Option<PathBuf>,
|
||||
auto_del_dur: Option<Duration>,
|
||||
) -> ResultType<String> {
|
||||
let id = url.clone();
|
||||
if DOWNLOADERS.lock().unwrap().contains_key(&id) {
|
||||
return Ok(id);
|
||||
}
|
||||
|
||||
if let Some(path) = path.as_ref() {
|
||||
if path.exists() {
|
||||
bail!("File {} already exists", path.display());
|
||||
}
|
||||
if let Some(parent) = path.parent() {
|
||||
std::fs::create_dir_all(parent)?;
|
||||
}
|
||||
}
|
||||
let (tx, rx) = unbounded_channel();
|
||||
let downloader = Downloader {
|
||||
data: Vec::new(),
|
||||
path: path.clone(),
|
||||
total_size: None,
|
||||
downloaded_size: 0,
|
||||
error: None,
|
||||
tx_cancel: tx,
|
||||
finished: false,
|
||||
};
|
||||
let mut downloaders = DOWNLOADERS.lock().unwrap();
|
||||
downloaders.insert(id.clone(), downloader);
|
||||
|
||||
let id2 = id.clone();
|
||||
std::thread::spawn(
|
||||
move || match do_download(&id2, url, path, auto_del_dur, rx) {
|
||||
Ok(is_all_downloaded) => {
|
||||
let mut downloaded_size = 0;
|
||||
let mut total_size = 0;
|
||||
DOWNLOADERS.lock().unwrap().get_mut(&id2).map(|downloader| {
|
||||
downloaded_size = downloader.downloaded_size;
|
||||
total_size = downloader.total_size.unwrap_or(0);
|
||||
});
|
||||
log::info!(
|
||||
"Download {} end, {}/{}, {:.2} %",
|
||||
&id2,
|
||||
downloaded_size,
|
||||
total_size,
|
||||
if total_size == 0 {
|
||||
0.0
|
||||
} else {
|
||||
downloaded_size as f64 / total_size as f64 * 100.0
|
||||
}
|
||||
);
|
||||
|
||||
let is_canceled = !is_all_downloaded;
|
||||
if is_canceled {
|
||||
if let Some(downloader) = DOWNLOADERS.lock().unwrap().remove(&id2) {
|
||||
if let Some(p) = downloader.path {
|
||||
if p.exists() {
|
||||
std::fs::remove_file(p).ok();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
let err = e.to_string();
|
||||
log::error!("Download {}, failed: {}", &id2, &err);
|
||||
DOWNLOADERS.lock().unwrap().get_mut(&id2).map(|downloader| {
|
||||
downloader.error = Some(err);
|
||||
});
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
Ok(id)
|
||||
}
|
||||
|
||||
#[tokio::main(flavor = "current_thread")]
|
||||
async fn do_download(
|
||||
id: &str,
|
||||
url: String,
|
||||
path: Option<PathBuf>,
|
||||
auto_del_dur: Option<Duration>,
|
||||
mut rx_cancel: UnboundedReceiver<()>,
|
||||
) -> ResultType<bool> {
|
||||
let client = create_http_client_async();
|
||||
|
||||
let mut is_all_downloaded = false;
|
||||
tokio::select! {
|
||||
_ = rx_cancel.recv() => {
|
||||
return Ok(is_all_downloaded);
|
||||
}
|
||||
head_resp = client.head(&url).send() => {
|
||||
match head_resp {
|
||||
Ok(resp) => {
|
||||
if resp.status().is_success() {
|
||||
let total_size = resp
|
||||
.headers()
|
||||
.get(reqwest::header::CONTENT_LENGTH)
|
||||
.and_then(|ct_len| ct_len.to_str().ok())
|
||||
.and_then(|ct_len| ct_len.parse::<u64>().ok());
|
||||
let Some(total_size) = total_size else {
|
||||
bail!("Failed to get content length");
|
||||
};
|
||||
DOWNLOADERS.lock().unwrap().get_mut(id).map(|downloader| {
|
||||
downloader.total_size = Some(total_size);
|
||||
});
|
||||
} else {
|
||||
bail!("Failed to get content length: {}", resp.status());
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
return Err(e.into());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let mut response;
|
||||
tokio::select! {
|
||||
_ = rx_cancel.recv() => {
|
||||
return Ok(is_all_downloaded);
|
||||
}
|
||||
resp = client.get(url).send() => {
|
||||
response = resp?;
|
||||
}
|
||||
}
|
||||
|
||||
let mut dest: Option<File> = None;
|
||||
if let Some(p) = path {
|
||||
dest = Some(File::create(p).await?);
|
||||
}
|
||||
|
||||
loop {
|
||||
tokio::select! {
|
||||
_ = rx_cancel.recv() => {
|
||||
break;
|
||||
}
|
||||
chunk = response.chunk() => {
|
||||
match chunk {
|
||||
Ok(Some(chunk)) => {
|
||||
match dest {
|
||||
Some(ref mut f) => {
|
||||
f.write_all(&chunk).await?;
|
||||
f.flush().await?;
|
||||
DOWNLOADERS.lock().unwrap().get_mut(id).map(|downloader| {
|
||||
downloader.downloaded_size += chunk.len() as u64;
|
||||
});
|
||||
}
|
||||
None => {
|
||||
DOWNLOADERS.lock().unwrap().get_mut(id).map(|downloader| {
|
||||
downloader.data.extend_from_slice(&chunk);
|
||||
downloader.downloaded_size += chunk.len() as u64;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(None) => {
|
||||
is_all_downloaded = true;
|
||||
break;
|
||||
},
|
||||
Err(e) => {
|
||||
log::error!("Download {} failed: {}", id, e);
|
||||
return Err(e.into());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(mut f) = dest.take() {
|
||||
f.flush().await?;
|
||||
}
|
||||
|
||||
if let Some(ref mut downloader) = DOWNLOADERS.lock().unwrap().get_mut(id) {
|
||||
downloader.finished = true;
|
||||
}
|
||||
if is_all_downloaded {
|
||||
let id_del = id.to_string();
|
||||
if let Some(dur) = auto_del_dur {
|
||||
tokio::spawn(async move {
|
||||
tokio::time::sleep(dur).await;
|
||||
DOWNLOADERS.lock().unwrap().remove(&id_del);
|
||||
});
|
||||
}
|
||||
}
|
||||
Ok(is_all_downloaded)
|
||||
}
|
||||
|
||||
pub fn get_download_data(id: &str) -> ResultType<DownloadData> {
|
||||
let downloaders = DOWNLOADERS.lock().unwrap();
|
||||
if let Some(downloader) = downloaders.get(id) {
|
||||
let downloaded_size = downloader.downloaded_size;
|
||||
let total_size = downloader.total_size.clone();
|
||||
let error = downloader.error.clone();
|
||||
let data = if total_size.unwrap_or(0) == downloaded_size && downloader.path.is_none() {
|
||||
downloader.data.clone()
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
let path = downloader.path.clone();
|
||||
let download_data = DownloadData {
|
||||
data,
|
||||
path,
|
||||
total_size,
|
||||
downloaded_size,
|
||||
error,
|
||||
};
|
||||
Ok(download_data)
|
||||
} else {
|
||||
bail!("Downloader not found")
|
||||
}
|
||||
}
|
||||
|
||||
pub fn cancel(id: &str) {
|
||||
if let Some(downloader) = DOWNLOADERS.lock().unwrap().get(id) {
|
||||
// downloader.is_canceled.store(true, Ordering::SeqCst);
|
||||
// The receiver may not be able to receive the cancel signal, so we also set the atomic bool to true
|
||||
let _ = downloader.tx_cancel.send(());
|
||||
}
|
||||
}
|
||||
|
||||
pub fn remove(id: &str) {
|
||||
let _ = DOWNLOADERS.lock().unwrap().remove(id);
|
||||
}
|
||||
@@ -6,15 +6,17 @@ use reqwest::Client as AsyncClient;
|
||||
|
||||
macro_rules! configure_http_client {
|
||||
($builder:expr, $Client: ty) => {{
|
||||
let mut builder = $builder;
|
||||
// https://github.com/rustdesk/rustdesk/issues/11569
|
||||
// https://docs.rs/reqwest/latest/reqwest/struct.ClientBuilder.html#method.no_proxy
|
||||
let mut builder = $builder.no_proxy();
|
||||
let client = if let Some(conf) = Config::get_socks() {
|
||||
let proxy_result = Proxy::from_conf(&conf, None);
|
||||
|
||||
match proxy_result {
|
||||
Ok(proxy) => {
|
||||
let proxy_setup = match &proxy.intercept {
|
||||
ProxyScheme::Http { host, .. } =>{ reqwest::Proxy::http(format!("http://{}", host))},
|
||||
ProxyScheme::Https { host, .. } => {reqwest::Proxy::https(format!("https://{}", host))},
|
||||
ProxyScheme::Http { host, .. } =>{ reqwest::Proxy::all(format!("http://{}", host))},
|
||||
ProxyScheme::Https { host, .. } => {reqwest::Proxy::all(format!("https://{}", host))},
|
||||
ProxyScheme::Socks5 { addr, .. } => { reqwest::Proxy::all(&format!("socks5://{}", addr)) }
|
||||
};
|
||||
|
||||
|
||||
@@ -115,13 +115,16 @@ async fn start_hbbs_sync_async() {
|
||||
let old_hash = config::Status::get("sysinfo_hash");
|
||||
let ver = config::Status::get("sysinfo_ver"); // sysinfo_ver is the version of sysinfo on server's side
|
||||
if hash == old_hash {
|
||||
// When the api doesn't exist, Ok("") will be returned in test.
|
||||
let samever = match crate::post_request(url.replace("heartbeat", "sysinfo_ver"), "".to_owned(), "").await {
|
||||
Ok(x) => {
|
||||
sysinfo_ver = x.clone();
|
||||
*PRO.lock().unwrap() = true;
|
||||
x == ver
|
||||
}
|
||||
_ => {
|
||||
true // if failed to get sysinfo_ver, we assume it's the same version
|
||||
false // to make sure Pro can be assigned in below post for old
|
||||
// hbbs pro not supporting sysinfo_ver, use false for ensuring
|
||||
}
|
||||
};
|
||||
if samever {
|
||||
|
||||
163
src/ipc.rs
163
src/ipc.rs
@@ -1,4 +1,5 @@
|
||||
use crate::{
|
||||
common::CheckTestNatType,
|
||||
privacy_mode::PrivacyModeState,
|
||||
ui_interface::{get_local_option, set_local_option},
|
||||
};
|
||||
@@ -22,7 +23,7 @@ pub use clipboard::ClipboardFile;
|
||||
use hbb_common::{
|
||||
allow_err, bail, bytes,
|
||||
bytes_codec::BytesCodec,
|
||||
config::{self, Config, Config2},
|
||||
config::{self, keys::OPTION_ALLOW_WEBSOCKET, Config, Config2},
|
||||
futures::StreamExt as _,
|
||||
futures_util::sink::SinkExt,
|
||||
log, password_security as password, timeout,
|
||||
@@ -274,6 +275,15 @@ pub enum Data {
|
||||
ClearTrustedDevices,
|
||||
#[cfg(all(target_os = "windows", feature = "flutter"))]
|
||||
PrinterData(Vec<u8>),
|
||||
InstallOption(Option<(String, String)>),
|
||||
#[cfg(all(
|
||||
feature = "flutter",
|
||||
not(any(target_os = "android", target_os = "ios"))
|
||||
))]
|
||||
ControllingSessionCount(usize),
|
||||
#[cfg(target_os = "windows")]
|
||||
PortForwardSessionCount(Option<usize>),
|
||||
SocksWs(Option<Box<(Option<config::Socks5Server>, String)>>),
|
||||
}
|
||||
|
||||
#[tokio::main(flavor = "current_thread")]
|
||||
@@ -340,29 +350,40 @@ pub async fn new_listener(postfix: &str) -> ResultType<Incoming> {
|
||||
}
|
||||
}
|
||||
|
||||
pub struct CheckIfRestart(String, Vec<String>, String, String);
|
||||
pub struct CheckIfRestart {
|
||||
stop_service: String,
|
||||
rendezvous_servers: Vec<String>,
|
||||
audio_input: String,
|
||||
voice_call_input: String,
|
||||
ws: String,
|
||||
api_server: String,
|
||||
}
|
||||
|
||||
impl CheckIfRestart {
|
||||
pub fn new() -> CheckIfRestart {
|
||||
CheckIfRestart(
|
||||
Config::get_option("stop-service"),
|
||||
Config::get_rendezvous_servers(),
|
||||
Config::get_option("audio-input"),
|
||||
Config::get_option("voice-call-input"),
|
||||
)
|
||||
CheckIfRestart {
|
||||
stop_service: Config::get_option("stop-service"),
|
||||
rendezvous_servers: Config::get_rendezvous_servers(),
|
||||
audio_input: Config::get_option("audio-input"),
|
||||
voice_call_input: Config::get_option("voice-call-input"),
|
||||
ws: Config::get_option(OPTION_ALLOW_WEBSOCKET),
|
||||
api_server: Config::get_option("api-server"),
|
||||
}
|
||||
}
|
||||
}
|
||||
impl Drop for CheckIfRestart {
|
||||
fn drop(&mut self) {
|
||||
if self.0 != Config::get_option("stop-service")
|
||||
|| self.1 != Config::get_rendezvous_servers()
|
||||
if self.stop_service != Config::get_option("stop-service")
|
||||
|| self.rendezvous_servers != Config::get_rendezvous_servers()
|
||||
|| self.ws != Config::get_option(OPTION_ALLOW_WEBSOCKET)
|
||||
|| self.api_server != Config::get_option("api-server")
|
||||
{
|
||||
RendezvousMediator::restart();
|
||||
}
|
||||
if self.2 != Config::get_option("audio-input") {
|
||||
if self.audio_input != Config::get_option("audio-input") {
|
||||
crate::audio_service::restart();
|
||||
}
|
||||
if self.3 != Config::get_option("voice-call-input") {
|
||||
if self.voice_call_input != Config::get_option("voice-call-input") {
|
||||
crate::audio_service::set_voice_call_input_device(
|
||||
Some(Config::get_option("voice-call-input")),
|
||||
true,
|
||||
@@ -447,16 +468,29 @@ async fn handle(data: Data, stream: &mut Connection) {
|
||||
allow_err!(stream.send(&Data::Socks(Config::get_socks())).await);
|
||||
}
|
||||
Some(data) => {
|
||||
let _nat = CheckTestNatType::new();
|
||||
if data.proxy.is_empty() {
|
||||
Config::set_socks(None);
|
||||
} else {
|
||||
Config::set_socks(Some(data));
|
||||
}
|
||||
crate::common::test_nat_type();
|
||||
RendezvousMediator::restart();
|
||||
log::info!("socks updated");
|
||||
}
|
||||
},
|
||||
Data::SocksWs(s) => match s {
|
||||
None => {
|
||||
allow_err!(
|
||||
stream
|
||||
.send(&Data::SocksWs(Some(Box::new((
|
||||
Config::get_socks(),
|
||||
Config::get_option(OPTION_ALLOW_WEBSOCKET)
|
||||
)))))
|
||||
.await
|
||||
);
|
||||
}
|
||||
_ => {}
|
||||
},
|
||||
#[cfg(feature = "flutter")]
|
||||
Data::VideoConnCount(None) => {
|
||||
let n = crate::server::AUTHED_CONNS
|
||||
@@ -493,7 +527,8 @@ async fn handle(data: Data, stream: &mut Connection) {
|
||||
None
|
||||
};
|
||||
} else if name == "hide_cm" {
|
||||
value = if crate::hbbs_http::sync::is_pro() {
|
||||
value = if crate::hbbs_http::sync::is_pro() || crate::common::is_custom_client()
|
||||
{
|
||||
Some(hbb_common::password_security::hide_cm().to_string())
|
||||
} else {
|
||||
None
|
||||
@@ -536,6 +571,7 @@ async fn handle(data: Data, stream: &mut Connection) {
|
||||
}
|
||||
Some(value) => {
|
||||
let _chk = CheckIfRestart::new();
|
||||
let _nat = CheckTestNatType::new();
|
||||
if let Some(v) = value.get("privacy-mode-impl-key") {
|
||||
crate::privacy_mode::switch(v);
|
||||
}
|
||||
@@ -598,6 +634,13 @@ async fn handle(data: Data, stream: &mut Connection) {
|
||||
.await
|
||||
);
|
||||
}
|
||||
#[cfg(all(
|
||||
feature = "flutter",
|
||||
not(any(target_os = "android", target_os = "ios"))
|
||||
))]
|
||||
Data::ControllingSessionCount(count) => {
|
||||
crate::updater::update_controlling_session_count(count);
|
||||
}
|
||||
#[cfg(feature = "hwcodec")]
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
Data::CheckHwcodec => {
|
||||
@@ -662,6 +705,42 @@ async fn handle(data: Data, stream: &mut Connection) {
|
||||
Data::ClearTrustedDevices => {
|
||||
Config::clear_trusted_devices();
|
||||
}
|
||||
Data::InstallOption(opt) => match opt {
|
||||
Some((_k, _v)) => {
|
||||
#[cfg(target_os = "windows")]
|
||||
if let Err(e) = crate::platform::windows::update_install_option(&_k, &_v) {
|
||||
log::error!(
|
||||
"Failed to update install option \"{}\" to \"{}\", error: {}",
|
||||
&_k,
|
||||
&_v,
|
||||
e
|
||||
);
|
||||
}
|
||||
}
|
||||
None => {
|
||||
// `None` is usually used to get values.
|
||||
// This branch is left blank for unification and further use.
|
||||
}
|
||||
},
|
||||
#[cfg(target_os = "windows")]
|
||||
Data::PortForwardSessionCount(c) => match c {
|
||||
None => {
|
||||
let count = crate::server::AUTHED_CONNS
|
||||
.lock()
|
||||
.unwrap()
|
||||
.iter()
|
||||
.filter(|c| c.conn_type == crate::server::AuthConnType::PortForward)
|
||||
.count();
|
||||
allow_err!(
|
||||
stream
|
||||
.send(&Data::PortForwardSessionCount(Some(count)))
|
||||
.await
|
||||
);
|
||||
}
|
||||
_ => {
|
||||
// Port forward session count is only a get value.
|
||||
}
|
||||
},
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
@@ -1062,6 +1141,7 @@ pub fn set_option(key: &str, value: &str) {
|
||||
|
||||
#[tokio::main(flavor = "current_thread")]
|
||||
pub async fn set_options(value: HashMap<String, String>) -> ResultType<()> {
|
||||
let _nat = CheckTestNatType::new();
|
||||
if let Ok(mut c) = connect(1000, "").await {
|
||||
c.send(&Data::Options(Some(value.clone()))).await?;
|
||||
// do not put below before connect, because we need to check should_exit
|
||||
@@ -1119,6 +1199,7 @@ pub async fn get_socks() -> Option<config::Socks5Server> {
|
||||
|
||||
#[tokio::main(flavor = "current_thread")]
|
||||
pub async fn set_socks(value: config::Socks5Server) -> ResultType<()> {
|
||||
let _nat = CheckTestNatType::new();
|
||||
Config::set_socks(if value.proxy.is_empty() {
|
||||
None
|
||||
} else {
|
||||
@@ -1131,6 +1212,29 @@ pub async fn set_socks(value: config::Socks5Server) -> ResultType<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn get_socks_ws_(ms_timeout: u64) -> ResultType<(Option<config::Socks5Server>, String)> {
|
||||
let mut c = connect(ms_timeout, "").await?;
|
||||
c.send(&Data::SocksWs(None)).await?;
|
||||
if let Some(Data::SocksWs(Some(value))) = c.next_timeout(ms_timeout).await? {
|
||||
Config::set_socks(value.0.clone());
|
||||
Config::set_option(OPTION_ALLOW_WEBSOCKET.to_string(), value.1.clone());
|
||||
Ok(*value)
|
||||
} else {
|
||||
Ok((
|
||||
Config::get_socks(),
|
||||
Config::get_option(OPTION_ALLOW_WEBSOCKET),
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::main(flavor = "current_thread")]
|
||||
pub async fn get_socks_ws() -> (Option<config::Socks5Server>, String) {
|
||||
get_socks_ws_(1_000).await.unwrap_or((
|
||||
Config::get_socks(),
|
||||
Config::get_option(OPTION_ALLOW_WEBSOCKET),
|
||||
))
|
||||
}
|
||||
|
||||
pub fn get_proxy_status() -> bool {
|
||||
Config::get_socks().is_some()
|
||||
}
|
||||
@@ -1171,6 +1275,16 @@ pub async fn notify_server_to_check_hwcodec() -> ResultType<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
pub async fn get_port_forward_session_count(ms_timeout: u64) -> ResultType<usize> {
|
||||
let mut c = connect(ms_timeout, "").await?;
|
||||
c.send(&Data::PortForwardSessionCount(None)).await?;
|
||||
if let Some(Data::PortForwardSessionCount(Some(count))) = c.next_timeout(ms_timeout).await? {
|
||||
return Ok(count);
|
||||
}
|
||||
bail!("Failed to get port forward session count");
|
||||
}
|
||||
|
||||
#[cfg(feature = "hwcodec")]
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
#[tokio::main(flavor = "current_thread")]
|
||||
@@ -1262,6 +1376,17 @@ pub async fn clear_wayland_screencast_restore_token(key: String) -> ResultType<b
|
||||
return Ok(false);
|
||||
}
|
||||
|
||||
#[cfg(all(
|
||||
feature = "flutter",
|
||||
not(any(target_os = "android", target_os = "ios"))
|
||||
))]
|
||||
#[tokio::main(flavor = "current_thread")]
|
||||
pub async fn update_controlling_session_count(count: usize) -> ResultType<()> {
|
||||
let mut c = connect(1000, "").await?;
|
||||
c.send(&Data::ControllingSessionCount(count)).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn handle_wayland_screencast_restore_token(
|
||||
key: String,
|
||||
value: String,
|
||||
@@ -1277,6 +1402,16 @@ async fn handle_wayland_screencast_restore_token(
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
#[tokio::main(flavor = "current_thread")]
|
||||
pub async fn set_install_option(k: String, v: String) -> ResultType<()> {
|
||||
if let Ok(mut c) = connect(1000, "").await {
|
||||
c.send(&&Data::InstallOption(Some((k, v)))).await?;
|
||||
// do not put below before connect, because we need to check should_exit
|
||||
c.next_timeout(1000).await.ok();
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use hbb_common::config::Config;
|
||||
use hbb_common::{
|
||||
allow_err,
|
||||
anyhow::bail,
|
||||
config::Config,
|
||||
config::{self, RENDEZVOUS_PORT},
|
||||
log,
|
||||
protobuf::Message as _,
|
||||
@@ -10,7 +10,7 @@ use hbb_common::{
|
||||
self,
|
||||
sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender},
|
||||
},
|
||||
ResultType,
|
||||
whoami, ResultType,
|
||||
};
|
||||
|
||||
use std::{
|
||||
|
||||
@@ -45,6 +45,7 @@ mod tw;
|
||||
mod uk;
|
||||
mod vn;
|
||||
mod ta;
|
||||
mod ge;
|
||||
|
||||
pub const LANGS: &[(&str, &str)] = &[
|
||||
("en", "English"),
|
||||
@@ -91,6 +92,7 @@ pub const LANGS: &[(&str, &str)] = &[
|
||||
("hr", "Hrvatski"),
|
||||
("sc", "Sardu"),
|
||||
("ta", "தமிழ்"),
|
||||
("ge", "ქართული"),
|
||||
];
|
||||
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
@@ -167,6 +169,7 @@ pub fn translate_locale(name: String, locale: &str) -> String {
|
||||
"hr" => hr::T.deref(),
|
||||
"sc" => sc::T.deref(),
|
||||
"ta" => ta::T.deref(),
|
||||
"ge" => ge::T.deref(),
|
||||
_ => en::T.deref(),
|
||||
};
|
||||
let (name, placeholder_value) = extract_placeholder(&name);
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", "الطابعة {} جاهزة"),
|
||||
("Install {} Printer", "تثبيت طابعة {}"),
|
||||
("Outgoing Print Jobs", "وظائف الطباعة الصادرة"),
|
||||
("Incomming Print Jobs", "وظائف الطباعة الواردة"),
|
||||
("Incoming Print Jobs", "وظائف الطباعة الواردة"),
|
||||
("Incoming Print Job", "وظيفة طباعة واردة"),
|
||||
("use-the-default-printer-tip", "استخدم الطابعة الافتراضية"),
|
||||
("use-the-selected-printer-tip", "استخدم الطابعة المحددة"),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", "الطباعة عن بُعد غير مسموح بها على هذا الجهاز"),
|
||||
("save-settings-tip", "حفظ الإعدادات"),
|
||||
("dont-show-again-tip", "لا تظهر هذا مرة أخرى"),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
287
src/lang/bg.rs
287
src/lang/bg.rs
@@ -1,7 +1,7 @@
|
||||
lazy_static::lazy_static! {
|
||||
pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
[
|
||||
("Status", "Положение"),
|
||||
("Status", "Състояне"),
|
||||
("Your Desktop", "Вашата работна среда"),
|
||||
("desk_tip", "Вашата работна среда не може да бъде достъпена с този потребителски код и парола."),
|
||||
("Password", "Парола"),
|
||||
@@ -20,53 +20,53 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Address book", "Адресник"),
|
||||
("Confirmation", "Потвърждение"),
|
||||
("TCP tunneling", "TCP тунел"),
|
||||
("Remove", "Премахване"),
|
||||
("Refresh random password", "Опресняване на произволна парола"),
|
||||
("Remove", "Премахни"),
|
||||
("Refresh random password", "Нова случйна парола"),
|
||||
("Set your own password", "Задайте собствена парола"),
|
||||
("Enable keyboard/mouse", "Позволяване на клавиатура/мишка"),
|
||||
("Enable clipboard", "Позволяване достъп до клипборда"),
|
||||
("Enable file transfer", "Позволяване прехвърляне на файлове"),
|
||||
("Enable file transfer", "Позволяване на прехвърляне на файлове"),
|
||||
("Enable TCP tunneling", "Позволяване на TCP тунели"),
|
||||
("IP Whitelisting", "Определяне на позволени IP по списък"),
|
||||
("IP Whitelisting", "Позволени IP"),
|
||||
("ID/Relay Server", "ID/Препредаващ сървър"),
|
||||
("Import server config", "Внасяне сървър настройки за "),
|
||||
("Export Server Config", "Изнасяне настройки на сървър"),
|
||||
("Import server configuration successfully", "Успешно внасяне на сървърни настройки"),
|
||||
("Export server configuration successfully", "Успешно изнасяне на сървърни настройки"),
|
||||
("Invalid server configuration", "Недопустими сървърни настройки"),
|
||||
("Import server config", "Възстановяване на сървърните настройки"),
|
||||
("Export Server Config", "Съхраняване на сървърни настройки"),
|
||||
("Import server configuration successfully", "Успешно възстановяване на сървърни настройки"),
|
||||
("Export server configuration successfully", "Успешно съхраняване на сървърни настройки"),
|
||||
("Invalid server configuration", "Невалидни сървърни настройки"),
|
||||
("Clipboard is empty", "Клипбордът е празен"),
|
||||
("Stop service", "Спираане на услуга"),
|
||||
("Change ID", "Промяна определител (ID)"),
|
||||
("Your new ID", "Вашият нов определител (ID)"),
|
||||
("Stop service", "Спиране на услуга"),
|
||||
("Change ID", "Промяна идентификатор (ID)"),
|
||||
("Your new ID", "Вашият нов идентификатор (ID)"),
|
||||
("length %min% to %max%", "дължина %min% до %max%"),
|
||||
("starts with a letter", "започва с буква"),
|
||||
("allowed characters", "разрешени знаци"),
|
||||
("id_change_tip", "Само a-z, A-Z, 0-9, - (dash) и _ (долна черта) са сред позволени. Първа буква следва да е a-z, A-Z. С дължина мержу 6 и 16."),
|
||||
("id_change_tip", "Само a-z, A-Z, 0-9, - (тире) и _ (долна черта) са сред позволени. Първата буква следва да е a-z, A-Z. С дължина мержу 6 и 16."),
|
||||
("Website", "Уебсайт"),
|
||||
("About", "Относно"),
|
||||
("About", "За програмата"),
|
||||
("Slogan_tip", "Направено от сърце в този хаотичен свят!"),
|
||||
("Privacy Statement", "Декларация за поверителност"),
|
||||
("Mute", "Без звук"),
|
||||
("Build Date", "Дата на изграждане"),
|
||||
("Build Date", "Дата на създаване"),
|
||||
("Version", "Версия"),
|
||||
("Home", "Начало"),
|
||||
("Audio Input", "Аудио вход"),
|
||||
("Enhancements", "Подобрения"),
|
||||
("Hardware Codec", "Хардуерен кодек"),
|
||||
("Adaptive bitrate", "Приспособяваще се скорост на предаване наданни"),
|
||||
("Adaptive bitrate", "Адаптивна скорост на предаване"),
|
||||
("ID Server", "ID сървър"),
|
||||
("Relay Server", "Препращащ сървър"),
|
||||
("API Server", "API сървър"),
|
||||
("invalid_http", "трябва да започва с http:// или https://"),
|
||||
("Invalid IP", "Недопустим IP"),
|
||||
("Invalid format", "Недопустим формат"),
|
||||
("Invalid IP", "Невалиден IP"),
|
||||
("Invalid format", "Невалиден формат"),
|
||||
("server_not_support", "Все още не се поддържа от сървъра"),
|
||||
("Not available", "Не е наличен"),
|
||||
("Too frequent", "Твърде често"),
|
||||
("Cancel", "Отказ"),
|
||||
("Skip", "Пропускане"),
|
||||
("Close", "Затваряне"),
|
||||
("Retry", "Преповтори"),
|
||||
("Cancel", "Откажи"),
|
||||
("Skip", "Пропусни"),
|
||||
("Close", "Затвори"),
|
||||
("Retry", "Повтори"),
|
||||
("OK", "Добре"),
|
||||
("Password Required", "Изисква се парола"),
|
||||
("Please enter your password", "Моля въведете парола"),
|
||||
@@ -77,10 +77,10 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Error", "Грешка"),
|
||||
("Reset by the peer", "Нулирано от партньора"),
|
||||
("Connecting...", "Свързване..."),
|
||||
("Connection in progress. Please wait.", "Връзката се извършва. Моля Изчакайте."),
|
||||
("Connection in progress. Please wait.", "Свързването се осъществява. Моля Изчакайте."),
|
||||
("Please try 1 minute later", "Моля, опитайте 1 минута по-късно"),
|
||||
("Login Error", "Грешка при вписване"),
|
||||
("Successful", "Успешен опит"),
|
||||
("Successful", "Успешно"),
|
||||
("Connected, waiting for image...", "Свързано, чака се изображение..."),
|
||||
("Name", "Име"),
|
||||
("Type", "Тип"),
|
||||
@@ -88,7 +88,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Size", "Размер"),
|
||||
("Show Hidden Files", "Показване на скрити файлове"),
|
||||
("Receive", "Получаване"),
|
||||
("Send", "Пращане"),
|
||||
("Send", "Изпращане"),
|
||||
("Refresh File", "Опресняване на файла"),
|
||||
("Local", "Локално"),
|
||||
("Remote", "Отдалечено"),
|
||||
@@ -105,7 +105,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Are you sure you want to delete this file?", "Сигурни ли сте, че искате да изтриете този файл?"),
|
||||
("Are you sure you want to delete this empty directory?", "Сигурни ли сте, че искате да изтриете тази празна папка?"),
|
||||
("Are you sure you want to delete the file of this directory?", "Сигурни ли сте, че искате да изтриете файла от тази папка?"),
|
||||
("Do this for all conflicts", "Разреши така всички конфликти"),
|
||||
("Do this for all conflicts", "Същото за всички конфликти"),
|
||||
("This is irreversible!", "Това е необратимо!"),
|
||||
("Deleting", "Изтриване"),
|
||||
("files", "файлове"),
|
||||
@@ -114,35 +114,35 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Speed", "Скорост"),
|
||||
("Custom Image Quality", "Качество на изображението по свой избор"),
|
||||
("Privacy mode", "Режим на поверителност"),
|
||||
("Block user input", "Забрана за потребителски вход"),
|
||||
("Unblock user input", "Разрешаване на потребителски въвеждане"),
|
||||
("Block user input", "Забрана за потребителско въвеждане"),
|
||||
("Unblock user input", "Разрешаване на потребителско въвеждане"),
|
||||
("Adjust Window", "Нагласи прозореца"),
|
||||
("Original", "Оригинално"),
|
||||
("Shrink", "Свиване"),
|
||||
("Stretch", "Разтегнат"),
|
||||
("Stretch", "Разтягане"),
|
||||
("Scrollbar", "Плъзгач"),
|
||||
("ScrollAuto", "Автоматичено приплъзване"),
|
||||
("ScrollAuto", "Автоматично скролиране"),
|
||||
("Good image quality", "Добро качество на изображението"),
|
||||
("Balanced", "Уравновесен"),
|
||||
("Optimize reaction time", "С оглед времето на реакция"),
|
||||
("Custom", "По собствено желание"),
|
||||
("Optimize reaction time", "Оптимизирай времето за реакция"),
|
||||
("Custom", "По избор"),
|
||||
("Show remote cursor", "Показвай отдалечения курсор"),
|
||||
("Show quality monitor", "Показвай прозорец за качество"),
|
||||
("Disable clipboard", "Забрана за достъп до клипборд"),
|
||||
("Disable clipboard", "Забрана на клипборда"),
|
||||
("Lock after session end", "Заключване след край на ползване"),
|
||||
("Insert Ctrl + Alt + Del", "Поставяне Ctrl + Alt + Del"),
|
||||
("Insert Lock", "Заявка за заключване"),
|
||||
("Insert Ctrl + Alt + Del", "Въведи Ctrl + Alt + Del"),
|
||||
("Insert Lock", "Въведи заключване"),
|
||||
("Refresh", "Обновяване"),
|
||||
("ID does not exist", "Несъществуващ определител (ID)"),
|
||||
("ID does not exist", "Несъществуващ идентификатор (ID)"),
|
||||
("Failed to connect to rendezvous server", "Неуспешно свързване към сървъра за среща (rendezvous)"),
|
||||
("Please try later", "Моля опитайте по-късно"),
|
||||
("Remote desktop is offline", "Отдалечената работна среда не е налична"),
|
||||
("Key mismatch", "Ключово несъответствие"),
|
||||
("Timeout", "Изтичане на времето"),
|
||||
("Failed to connect to relay server", "Провал при свързване към препредаващ сървър"),
|
||||
("Failed to connect via rendezvous server", "Провал при свързване към сървър за срещи (rendezvous)"),
|
||||
("Failed to connect via relay server", "Провал при свързване чрез препредаващ сървър"),
|
||||
("Failed to make direct connection to remote desktop", "Провал при установяване на пряка връзка с отдалечена работна среда"),
|
||||
("Key mismatch", "Несъответствие на ключове"),
|
||||
("Timeout", "Таймаут"),
|
||||
("Failed to connect to relay server", "Неуспешно свързване към препредаващ сървър"),
|
||||
("Failed to connect via rendezvous server", "Неуспешно свързване към сървър за срещи (rendezvous)"),
|
||||
("Failed to connect via relay server", "Неуспешно свързване чрез препредаващ сървър"),
|
||||
("Failed to make direct connection to remote desktop", "Неуспешно установяване на пряка връзка с отдалечена работна среда"),
|
||||
("Set Password", "Задаване на парола"),
|
||||
("OS Password", "Парола на Операционната система"),
|
||||
("install_tip", "Поради UAC, RustDesk в някои случай не може да работи правилно за отдалечена достъп. За да заобиколите UAC, моля, натиснете копчето по-долу, за да поставите RustDesk като системна услуга."),
|
||||
@@ -152,16 +152,16 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Configure", "Настройване"),
|
||||
("config_acc", "За да управлявате вашия работна среда отдалечено, трябва да предоставите на RustDesk права от раздел \"Достъпност\"."),
|
||||
("config_screen", "За да управлявате вашия работна среда отдалечено, трябва да предоставите на RustDesk права от раздел \"Запис на екрана\"."),
|
||||
("Installing ...", "Поставяне..."),
|
||||
("Install", "Постави"),
|
||||
("Installation", "Поставяне"),
|
||||
("Installation Path", "Път към място за поставяне"),
|
||||
("Create start menu shortcuts", "Бърз достъп от меню 'Старт'."),
|
||||
("Create desktop icon", "Създайте икона на работния плот"),
|
||||
("agreement_tip", "Започвайки поставянето, вие приемате лицензионното споразумение."),
|
||||
("Accept and Install", "Приемете и поставяте"),
|
||||
("Installing ...", "Инсталиране..."),
|
||||
("Install", "Инсталирай"),
|
||||
("Installation", "Инсталация"),
|
||||
("Installation Path", "Път за инсталация"),
|
||||
("Create start menu shortcuts", "Създай връзка от меню 'Старт'."),
|
||||
("Create desktop icon", "Създай иконка на работния плот"),
|
||||
("agreement_tip", "Започвайки инсталацията, вие приемате лицензионното споразумение."),
|
||||
("Accept and Install", "Приемам и инсталирам"),
|
||||
("End-user license agreement", "Споразумение с потребителя"),
|
||||
("Generating ...", "Пораждане..."),
|
||||
("Generating ...", "Създаване..."),
|
||||
("Your installation is lower version.", "Вашата инсталация е по-ниска версия."),
|
||||
("not_close_tcp_tip", "Не затваряйте този прозорец, докато използвате тунела"),
|
||||
("Listening ...", "Слушане..."),
|
||||
@@ -177,9 +177,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("The confirmation is not identical.", "Потвърждението не съвпада"),
|
||||
("Permissions", "Разрешения"),
|
||||
("Accept", "Приеми"),
|
||||
("Dismiss", "Отхвърляне"),
|
||||
("Disconnect", "Прекъсване"),
|
||||
("Enable file copy and paste", "Разрешаване прехвърляне на файлове"),
|
||||
("Dismiss", "Отхвърли"),
|
||||
("Disconnect", "Прекъсни"),
|
||||
("Enable file copy and paste", "Разрешаване копирането и поставяне на файлове"),
|
||||
("Connected", "Свързан"),
|
||||
("Direct and encrypted connection", "Пряка защитена връзка"),
|
||||
("Relayed and encrypted connection", "Препредадена защитена връзка"),
|
||||
@@ -193,55 +193,55 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Enable direct IP access", "Разрешаване пряк IP достъп"),
|
||||
("Rename", "Преименуване"),
|
||||
("Space", "Пространство"),
|
||||
("Create desktop shortcut", "Създайте пряк път на работния плот"),
|
||||
("Create desktop shortcut", "Създайте връзка на работния плот"),
|
||||
("Change Path", "Промяна на пътя"),
|
||||
("Create Folder", "Създай папка"),
|
||||
("Please enter the folder name", "Моля, въведете име на папката"),
|
||||
("Fix it", "Оправи го"),
|
||||
("Warning", "Внимание"),
|
||||
("Login screen using Wayland is not supported", "Екран за влизане чрез Wayland не се поддържа"),
|
||||
("Login screen using Wayland is not supported", "Екранът за влизане чрез Wayland не се поддържа"),
|
||||
("Reboot required", "Нужно е презареждане на ОС"),
|
||||
("Unsupported display server", "Неподдържан екранен сървър"),
|
||||
("x11 expected", "Очаква се x11"),
|
||||
("Port", "Порт"),
|
||||
("Settings", "Настройки"),
|
||||
("Username", "Потребителско име"),
|
||||
("Invalid port", "Недопустим порт"),
|
||||
("Invalid port", "Невалиден порт"),
|
||||
("Closed manually by the peer", "Затворено ръчно от другата страна"),
|
||||
("Enable remote configuration modification", "Разрешаване на отдалечена промяна на конфигурацията"),
|
||||
("Run without install", "Стартирайте без инсталиране"),
|
||||
("Connect via relay", "Свързване чрез препращане"),
|
||||
("Always connect via relay", "Винаги чрез препращане"),
|
||||
("whitelist_tip", "Само IP адресите от белия списък имат достъп до мен"),
|
||||
("Login", "Влизане"),
|
||||
("Login", "Вписване"),
|
||||
("Verify", "Потвърди"),
|
||||
("Remember me", "Запомни ме"),
|
||||
("Trust this device", "Доверяване на това устройство"),
|
||||
("Verification code", "Код за потвърждение"),
|
||||
("verification_tip", "На посочения имейл е изпратен код за потвърждение. Моля въведете го, за да продължите с влизането."),
|
||||
("verification_tip", "На посочения имейл е изпратен код за потвърждение. Моля въведете го, за да продължите с вписването."),
|
||||
("Logout", "Отписване (Изход)"),
|
||||
("Tags", "Белези"),
|
||||
("Tags", "Етикети"),
|
||||
("Search ID", "Търси ID"),
|
||||
("whitelist_sep", "Разделени със запетая, точка и запетая, празни символи или нов ред"),
|
||||
("Add ID", "Добави ID"),
|
||||
("Add Tag", "Добави етикет"),
|
||||
("Unselect all tags", "Премахнете избора на всички белези (tags)"),
|
||||
("Unselect all tags", "Премахнете избора на всички етикети (tags)"),
|
||||
("Network error", "Мрежова грешка"),
|
||||
("Username missed", "Липсващо потребителско име"),
|
||||
("Password missed", "Липсваща парола"),
|
||||
("Username missed", "Липсва потребителско име"),
|
||||
("Password missed", "Липсва парола"),
|
||||
("Wrong credentials", "Грешни пълномощия"),
|
||||
("The verification code is incorrect or has expired", "Кодът за проверка е неправилен или с изтекла давност."),
|
||||
("Edit Tag", "Промени белег"),
|
||||
("The verification code is incorrect or has expired", "Кодът за потвърждение е неправилен или с изтекла давност."),
|
||||
("Edit Tag", "Редактирай етикет"),
|
||||
("Forget Password", "Забравена парола"),
|
||||
("Favorites", "Любими"),
|
||||
("Add to Favorites", "Добави към любими"),
|
||||
("Remove from Favorites", "Премахване от любими"),
|
||||
("Empty", "Празно"),
|
||||
("Invalid folder name", "Непозволено име на папка"),
|
||||
("Socks5 Proxy", "Socks5 посредник"),
|
||||
("Socks5/Http(s) Proxy", "Socks5/Http(s) посредник"),
|
||||
("Invalid folder name", "Невалидно име на папка"),
|
||||
("Socks5 Proxy", "Socks5 Прокси"),
|
||||
("Socks5/Http(s) Proxy", "Socks5/Http(s) прокси"),
|
||||
("Discovered", "Открит"),
|
||||
("install_daemon_tip", "За зареждане при стартиране на ОС следва да поставите RustDesk като системна услуга."),
|
||||
("install_daemon_tip", "За зареждане при стартиране на ОС трябва да инсталирате RustDesk като системна услуга."),
|
||||
("Remote ID", "Отдалечено ID"),
|
||||
("Paste", "Постави"),
|
||||
("Paste here?", "Постави тук?"),
|
||||
@@ -268,27 +268,27 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Note", "Бележка"),
|
||||
("Connection", "Връзка"),
|
||||
("Share Screen", "Сподели екран"),
|
||||
("Chat", "Говор"),
|
||||
("Chat", "Чат"),
|
||||
("Total", "Общо"),
|
||||
("items", "неща"),
|
||||
("Selected", "Избрано"),
|
||||
("Screen Capture", "Снемане на екрана"),
|
||||
("Input Control", "Управление на вход"),
|
||||
("Screen Capture", "Заснемане на екрана"),
|
||||
("Input Control", "Управление на въвеждане"),
|
||||
("Audio Capture", "Аудиозапис"),
|
||||
("File Connection", "Файлова връзка"),
|
||||
("Screen Connection", "Екранна връзка"),
|
||||
("Do you accept?", "Приемате ли?"),
|
||||
("Open System Setting", "Отворете системните настройки"),
|
||||
("How to get Android input permission?", "Как да получим право за въвеждане под Андрид?"),
|
||||
("How to get Android input permission?", "Как да получим право за въвеждане при Андроид?"),
|
||||
("android_input_permission_tip1", "За да може отдалечено устройство да управлява вашето Android устройство чрез мишка или допир, трябва да разрешите на RustDesk да използва услугата \"Достъпност\"."),
|
||||
("android_input_permission_tip2", "Моля, отидете на следващата страница с системни настройки, намерете и въведете [Installed Services], включете услугата [RustDesk Input]."),
|
||||
("android_input_permission_tip2", "Моля, отидете на следващата страница със системни настройки, намерете и въведете [Installed Services], включете услугата [RustDesk Input]."),
|
||||
("android_new_connection_tip", "Получена е нова заявка за отдалечено управление на вашето текущо устройство."),
|
||||
("android_service_will_start_tip", "Включването на \"Снемане на екрана\" автоматично ще стартира услугата, позволявайки на други устройства да поискат връзка с вашето устройство."),
|
||||
("android_service_will_start_tip", "Включването на \"Заснемане на екрана\" автоматично ще стартира услугата, позволявайки на други устройства да поискат връзка с вашето устройство."),
|
||||
("android_stop_service_tip", "Затварянето на услугата автоматично ще затвори всички установени връзки."),
|
||||
("android_version_audio_tip", "Текущата версия на Android не поддържа аудиозапис. Моля, актуализирайте устройството с Android 10 или по-нов."),
|
||||
("android_start_service_tip", "Докоснете [Start service] или позволете [Screen Capture], за да започне услугата по споделяне на екрана."),
|
||||
("android_permission_may_not_change_tip", "Разрешенията за установени връзки може да не се променят незабавно, а ще изискват да се свържете отново."),
|
||||
("Account", "Сметка"),
|
||||
("Account", "Профил"),
|
||||
("Overwrite", "Презаписване"),
|
||||
("This file exists, skip or overwrite this file?", "Този файл съществува вече. Пропускане или презаписване?"),
|
||||
("Quit", "Изход"),
|
||||
@@ -298,12 +298,12 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Someone turns on privacy mode, exit", "Някой включва режим на поверителност, изход"),
|
||||
("Unsupported", "Неподдържан"),
|
||||
("Peer denied", "Отказ от другата страна"),
|
||||
("Please install plugins", "Моля поставете приставки"),
|
||||
("Please install plugins", "Моля поставете плъгини"),
|
||||
("Peer exit", "Изход от другата страна"),
|
||||
("Failed to turn off", "Провал при опит за изключване"),
|
||||
("Failed to turn off", "Неуспешен опит за изключване"),
|
||||
("Turned off", "Изкключен"),
|
||||
("Language", "Език"),
|
||||
("Keep RustDesk background service", "Запази работеща фонова услуга с RustDesk"),
|
||||
("Keep RustDesk background service", "Запази RustDesk фоновата услуга"),
|
||||
("Ignore Battery Optimizations", "Игнорирай оптимизациите на батерията"),
|
||||
("android_open_battery_optimizations_tip", "Ако искате да деактивирате тази функция, моля, отидете на следващата страница с настройки на приложението RustDesk, намерете и въведете [Battery], премахнете отметката от [Unrestricted]"),
|
||||
("Start on boot", "Стартирайте при зареждане"),
|
||||
@@ -311,7 +311,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Connection not allowed", "Връзката непозволена"),
|
||||
("Legacy mode", "По остарял начин"),
|
||||
("Map mode", "По начин със съответствие (map)"),
|
||||
("Translate mode", "По нчаин с превод"),
|
||||
("Translate mode", "По начин с превод"),
|
||||
("Use permanent password", "Използване на постоянна парола"),
|
||||
("Use both passwords", "Използване и на двете пароли"),
|
||||
("Set permanent password", "Задаване постоянна парола"),
|
||||
@@ -346,9 +346,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Dark", "Тъмна"),
|
||||
("Light", "Светла"),
|
||||
("Follow System", "Следвай система"),
|
||||
("Enable hardware codec", "Позволяване хардуерен кодек"),
|
||||
("Enable hardware codec", "Позволяване на хардуерен кодек"),
|
||||
("Unlock Security Settings", "Отключи настройките за сигурност"),
|
||||
("Enable audio", "Разрешете аудиото"),
|
||||
("Enable audio", "Позволи звук"),
|
||||
("Unlock Network Settings", "Отключи мрежовите настройки"),
|
||||
("Server", "Сървър"),
|
||||
("Direct IP Access", "Пряк IP достъп"),
|
||||
@@ -364,11 +364,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Recording", "Записване"),
|
||||
("Directory", "Директория"),
|
||||
("Automatically record incoming sessions", "Автоматичен запис на входящи сесии"),
|
||||
("Automatically record outgoing sessions", ""),
|
||||
("Change", "Промяна"),
|
||||
("Start session recording", "Започванена запис"),
|
||||
("Stop session recording", "Край на запис"),
|
||||
("Enable recording session", "Позволяване запис"),
|
||||
("Automatically record outgoing sessions", "Автоматичен запис на изходящи сесии"),
|
||||
("Change", "Промени"),
|
||||
("Start session recording", "Старт на запис на сесията"),
|
||||
("Stop session recording", "Стоип на запис на сесията"),
|
||||
("Enable recording session", "Позволяване на записване на сесията"),
|
||||
("Enable LAN discovery", "Позволяване откриване във вътрешна мрежа"),
|
||||
("Deny LAN discovery", "Забрана за откриване във вътрешна мрежа"),
|
||||
("Write a message", "Напишете съобщение"),
|
||||
@@ -392,14 +392,14 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Elevate", "Повишаване"),
|
||||
("Zoom cursor", "Уголемяване курсор"),
|
||||
("Accept sessions via password", "Приемане сесии чрез парола"),
|
||||
("Accept sessions via click", "Приемане сесии чрез цъкване"),
|
||||
("Accept sessions via click", "Приемане сесии чрез клик"),
|
||||
("Accept sessions via both", "Приемане сесии и по двата начина"),
|
||||
("Please wait for the remote side to accept your session request...", "Моля, изчакайте докато другата страна приеме заявката за отдалечен достъп..."),
|
||||
("Please wait for the remote side to accept your session request...", "Моля, изчакайте докато другата страна приеме вашата заявката за сесия..."),
|
||||
("One-time Password", "Еднократна парола"),
|
||||
("Use one-time password", "Ползване на еднократна парола"),
|
||||
("One-time password length", "Дължина на еднократна парола"),
|
||||
("Request access to your device", "Искане за достъп до ваше устройство"),
|
||||
("Hide connection management window", "Скриване на прозореца за управление на свързване"),
|
||||
("Hide connection management window", "Скриване на прозореца за управление на връзка"),
|
||||
("hide_cm_tip", "Разрешаване скриване само ако се приемат сесии чрез постоянна парола"),
|
||||
("wayland_experiment_tip", "Поддръжката на Wayland е в експериментален стадий, моля, използвайте X11, ако се нуждаете от безконтролен достъп.."),
|
||||
("Right click to select tabs", "Десен бутон за избор на раздел"),
|
||||
@@ -408,22 +408,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Group", "Група"),
|
||||
("Search", "Търсене"),
|
||||
("Closed manually by web console", "Затворен ръчно от уеб конзола"),
|
||||
("Local keyboard type", "Тип на тукашната клавиатура"),
|
||||
("Select local keyboard type", "Избор на тип на тукашната клавиатура"),
|
||||
("Local keyboard type", "Тип на локалната клавиатура"),
|
||||
("Select local keyboard type", "Избор на тип на локалната клавиатура"),
|
||||
("software_render_tip", "Ако използвате графична карта Nvidia под Linux и отдалеченият прозорец се затваря веднага след свързване, превключването към драйвера Nouveau с отворен код и изборът да използвате софтуерно изобразяване може да помогне. Изисква се рестартиране на софтуера."),
|
||||
("Always use software rendering", "Винаги ползвай софтуерно изграждане на картината"),
|
||||
("config_input", "За да управлявате отдалечена среда с клавиатура, трябва да предоставите на RustDesk право за \"Input Monitoring\"."),
|
||||
("config_microphone", "За да говорите отдалечено, трябва да предоставите на RustDesk право за \"Запис на звук\"."),
|
||||
("request_elevation_tip", "Можете също така да поискате разширени права, ако има някой от отдалечената страна."),
|
||||
("Wait", "Изчакване"),
|
||||
("Elevation Error", "Грешка при добвиане на разширени права"),
|
||||
("Elevation Error", "Грешка при повишаване на права"),
|
||||
("Ask the remote user for authentication", "Попитайте отдалечения потребител за удостоверяване"),
|
||||
("Choose this if the remote account is administrator", "Изберете това, ако отдалеченият потребител е администратор."),
|
||||
("Transmit the username and password of administrator", "Предаване на потребителското име и паролата на администратора"),
|
||||
("still_click_uac_tip", "Все още изисква отдалеченият потребител да щракне върху OK в прозореца на UAC при стартиран RustDesk."),
|
||||
("Request Elevation", "Поискайте разширени права"),
|
||||
("Transmit the username and password of administrator", "Предаване на потребителското име и паролата на администратор"),
|
||||
("still_click_uac_tip", "Все още изисква отдалеченият потребител да натисне върху OK в прозореца на UAC при стартиран RustDesk."),
|
||||
("Request Elevation", "Поискайте повишени права"),
|
||||
("wait_accept_uac_tip", "Моля, изчакайте отдалеченият потребител да приеме диалоговия прозорец на UAC."),
|
||||
("Elevate successfully", "Успешно получаване на разширени права"),
|
||||
("Elevate successfully", "Успешно получаване на повишени права"),
|
||||
("uppercase", "големи букви"),
|
||||
("lowercase", "малки букви"),
|
||||
("digit", "цифра"),
|
||||
@@ -433,7 +433,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Medium", "Средна"),
|
||||
("Strong", "Силна"),
|
||||
("Switch Sides", "Размяна на страните"),
|
||||
("Please confirm if you want to share your desktop?", "Моля, потвърдете дали искате да споделите работното си пространство"),
|
||||
("Please confirm if you want to share your desktop?", "Моля, потвърдете ако искате да споделите работното си пространство"),
|
||||
("Display", "Екран"),
|
||||
("Default View Style", "Стил на изглед по подразбиране"),
|
||||
("Default Scroll Style", "Стил на превъртане по подразбиране"),
|
||||
@@ -444,44 +444,44 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Auto", "Автоматично"),
|
||||
("Other Default Options", "Други опции по подразбиране"),
|
||||
("Voice call", "Гласови обаждания"),
|
||||
("Text chat", "Текстов разговор"),
|
||||
("Stop voice call", "Прекратяване гласово обаждане"),
|
||||
("relay_hint_tip", "Може да не е възможно да се свържете директно; можете да опитате да се свържете чрез реле. Освен това, ако искате да използвате реле при първия си опит, добавете наставка \"/r\" към идентификатора или да изберете опцията \"Винаги свързване чрез реле\" в картата на последните сесии, ако съществува."),
|
||||
("Text chat", "Текстов чат"),
|
||||
("Stop voice call", "Прекратяване на гласово обаждане"),
|
||||
("relay_hint_tip", "Може да не е възможно да се свържете директно; можете да опитате да се свържете чрез препращаш сървър. Освен това, ако искате да използвате препращаш сървър при първия си опит, добавете наставка \"/r\" към идентификатора или да изберете опцията \"Винаги свързване чрез препращаш сървър\" в картата на последните сесии, ако съществува."),
|
||||
("Reconnect", "Повторно свързане"),
|
||||
("Codec", "Кодек"),
|
||||
("Resolution", "Разделителна способност"),
|
||||
("No transfers in progress", "Няма текущи прехвърляния"),
|
||||
("Set one-time password length", "Задаване дължаина на еднократна парола"),
|
||||
("Set one-time password length", "Задаване дължина на еднократна парола"),
|
||||
("RDP Settings", "RDP настройки"),
|
||||
("Sort by", "Подредба по"),
|
||||
("New Connection", "Ново свързване"),
|
||||
("Restore", "Възстановяване"),
|
||||
("Minimize", "Смаляване"),
|
||||
("Maximize", "Уголемяване"),
|
||||
("Sort by", "Сортирай по"),
|
||||
("New Connection", "Нова Връзка"),
|
||||
("Restore", "Възстанови"),
|
||||
("Minimize", "Минимизирай"),
|
||||
("Maximize", "На цял екран"),
|
||||
("Your Device", "Вашето устройство"),
|
||||
("empty_recent_tip", "Ами сега, няма скорошни сесии!\nВреме е да планирате нова."),
|
||||
("empty_favorite_tip", "Все още нямате любими връстници?\nНека намерим някой, с когото да се свържете, и да го добавим към вашите любими!"),
|
||||
("empty_lan_tip", "О, не, изглежда, че все още не сме открили връстници."),
|
||||
("empty_address_book_tip", "Изглежда, че в момента няма изброени връстници във вашата адресна книга."),
|
||||
("empty_favorite_tip", "Все още нямате любими връзки?\nНека намерим някой, с когото да се свържете, и да го добавим към вашите любими!"),
|
||||
("empty_lan_tip", "О, не, изглежда, че все още не сме открили връзки."),
|
||||
("empty_address_book_tip", "Изглежда, че в момента няма изброени връзки във вашата адресна книга."),
|
||||
("eg: admin", "напр. admin"),
|
||||
("Empty Username", "Празно потребителско име"),
|
||||
("Empty Password", "Празна парола"),
|
||||
("Me", "Мен"),
|
||||
("Me", "Аз"),
|
||||
("identical_file_tip", "Файлът съвпада с този от другата страна."),
|
||||
("show_monitors_tip", "Показване на мониторите в лентата с инструменти"),
|
||||
("View Mode", "Режим на преглед"),
|
||||
("View Mode", "Режим на изглед"),
|
||||
("login_linux_tip", "Трябва да влезете в отдалечен Linux акаунт, за да активирате X сесия на работния плот"),
|
||||
("verify_rustdesk_password_tip", "Проверете RustDesk паролата"),
|
||||
("remember_account_tip", "Запомнете този акаунт"),
|
||||
("os_account_desk_tip", "Този акаунт се използва за влизане в отдалечената операционна система и позволява на десктоп сесията без глава"),
|
||||
("OS Account", "Операционната система акаунт"),
|
||||
("os_account_desk_tip", "Този акаунт се използва за влизане в отдалечената операционна система и позволява на десктоп сесия без моинитор"),
|
||||
("OS Account", "Профил в операционната система"),
|
||||
("another_user_login_title_tip", "Друг потребител вече е влязъл"),
|
||||
("another_user_login_text_tip", "Прекъснете връзката"),
|
||||
("xorg_not_found_title_tip", "Xorg не е намерен"),
|
||||
("xorg_not_found_text_tip", "Моля, инсталирайте Xorg"),
|
||||
("no_desktop_title_tip", "Няма наличен работен плот"),
|
||||
("no_desktop_text_tip", "Моля, инсталирайте работен плот GNOME"),
|
||||
("No need to elevate", ""),
|
||||
("No need to elevate", "Няма нужда за повишаване на права"),
|
||||
("System Sound", "Системен звук"),
|
||||
("Default", "По подразбиране"),
|
||||
("New RDP", "Нов RDP"),
|
||||
@@ -490,7 +490,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("no fingerprints", "Няма пръстови отпечатъци"),
|
||||
("Select a peer", "Избери отдалечена страна"),
|
||||
("Select peers", "Избери отдалечени страни"),
|
||||
("Plugins", "Приставки"),
|
||||
("Plugins", "Плъгини"),
|
||||
("Uninstall", "Премахни"),
|
||||
("Update", "Обновяване"),
|
||||
("Enable", "Позволяване"),
|
||||
@@ -513,17 +513,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Stop", "Спиране"),
|
||||
("exceed_max_devices", "Достигнахте максималния брой управлявани устройства."),
|
||||
("Sync with recent sessions", "Синхронизиране с последните сесии"),
|
||||
("Sort tags", "Подреди белези"),
|
||||
("Open connection in new tab", "Разкриване на връзка в нов раздел"),
|
||||
("Move tab to new window", "Отделяне на раздела в нов прозорец"),
|
||||
("Sort tags", "Подреди етикети"),
|
||||
("Open connection in new tab", "Отваряне на връзката в нов раздел"),
|
||||
("Move tab to new window", "Превместване на раздела в нов прозорец"),
|
||||
("Can not be empty", "Не може да е празно"),
|
||||
("Already exists", "Вече съществува"),
|
||||
("Change Password", "Промяна на парола"),
|
||||
("Refresh Password", "Обновяване парола"),
|
||||
("ID", "Определител (ID)"),
|
||||
("Grid View", "Мрежов изглед"),
|
||||
("ID", "Идентификатор (ID)"),
|
||||
("Grid View", "Табличен изглед"),
|
||||
("List View", "Списъчен изглед"),
|
||||
("Select", "Избиране"),
|
||||
("Select", "Избор"),
|
||||
("Toggle Tags", "Превключване на етикети"),
|
||||
("pull_ab_failed_tip", "Неуспешно опресняване на адресната книга"),
|
||||
("push_ab_failed_tip", "Неуспешно синхронизиране на адресната книга със сървъра"),
|
||||
@@ -531,20 +531,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Change Color", "Промяна на цвета"),
|
||||
("Primary Color", "Основен цвят"),
|
||||
("HSV Color", "HSV цвят"),
|
||||
("Installation Successful!", "Успешно поставяне!"),
|
||||
("Installation failed!", "Провал при поставяне"),
|
||||
("Installation Successful!", "Успешно инсталиране!"),
|
||||
("Installation failed!", "Неуспешно инсталиране"),
|
||||
("Reverse mouse wheel", "Обърнато колелото на мишката"),
|
||||
("{} sessions", "{} сесии"),
|
||||
("scam_title", "Възможно е да сте ИЗМАМЕНИ!"),
|
||||
("scam_text1", "Ако разговаряте по телефона с някой, когото НЕ ПОЗНАВАТЕ и НЯМАТЕ ДОВЕРИЕ, който ви е помолил да използвате RustDesk и да стартирате услугата, не продължавайте и затворете незабавно."),
|
||||
("scam_text2", "Те вероятно са измамник, който се опитва да открадне вашите пари или друга лична информация."),
|
||||
("Don't show again", "Не показвай отново"),
|
||||
("I Agree", "Съгласен"),
|
||||
("I Agree", "Съгласен съм"),
|
||||
("Decline", "Отказвам"),
|
||||
("Timeout in minutes", "Време за отговор в минути"),
|
||||
("auto_disconnect_option_tip", "Автоматично затваряне на входящите сесии при неактивност на потребителя"),
|
||||
("Connection failed due to inactivity", "Автоматично прекъсване на връзката поради неактивност"),
|
||||
("Check for software update on startup", ""),
|
||||
("Check for software update on startup", "Проверявай за обновления при стартиране"),
|
||||
("upgrade_rustdesk_server_pro_to_{}_tip", "Моля обновете RustDesk Server Pro на версия {} или по-нова!"),
|
||||
("pull_group_failed_tip", "Неуспешно опресняване на групата"),
|
||||
("Filter by intersection", "Отсяване по пресичане"),
|
||||
@@ -554,14 +554,14 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("No displays", "Няма екрани"),
|
||||
("Open in new window", "Отваряне в нов прозорец"),
|
||||
("Show displays as individual windows", "Показване на екраните в отделни прозорци"),
|
||||
("Use all my displays for the remote session", "Използване на всички тукашни екрани за отдалечена работа"),
|
||||
("Use all my displays for the remote session", "Използвай всички мои екрани за отдалечена връзка"),
|
||||
("selinux_tip", "SELinux е активиран на вашето устройство, което може да попречи на RustDesk да работи правилно като контролирана страна."),
|
||||
("Change view", "Промяна изглед"),
|
||||
("Big tiles", "Големи заглавия"),
|
||||
("Small tiles", "Малки заглавия"),
|
||||
("List", "Списък"),
|
||||
("Virtual display", "Виртуален екран"),
|
||||
("Plug out all", "Изтръгване на всички"),
|
||||
("Plug out all", "Разкачане на всички"),
|
||||
("True color (4:4:4)", ""),
|
||||
("Enable blocking user input", "Разрешаване на блокиране на потребителско въвеждане"),
|
||||
("id_input_tip", "Можете да въведете ID, директен IP адрес или домейн с порт (<domain>:<port>).\nАко искате да получите достъп до устройство на друг сървър, моля, добавете адреса на сървъра (<id>@<server_address >?key=<key_value>), например\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nАко искате да получите достъп до устройство на обществен сървър, моля, въведете \"<id>@public\" , ключът не е необходим за публичен сървър"),
|
||||
@@ -591,7 +591,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("My address book", "Моята адресна книга"),
|
||||
("Personal", "Личен"),
|
||||
("Owner", "Собственик"),
|
||||
("Set shared password", "Определяне споделена парола"),
|
||||
("Set shared password", "Задай споделена парола"),
|
||||
("Exist in", "Съществува в"),
|
||||
("Read-only", "Само четене"),
|
||||
("Read/Write", "Писане/четене"),
|
||||
@@ -612,25 +612,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("confirm_clear_Wayland_screen_selection_tip", ""),
|
||||
("android_new_voice_call_tip", ""),
|
||||
("texture_render_tip", ""),
|
||||
("Use texture rendering", "Използвай текстово изграждане"),
|
||||
("Use texture rendering", "Използвай рендер на текстури"),
|
||||
("Floating window", "Плаващ прозорец"),
|
||||
("floating_window_tip", ""),
|
||||
("Keep screen on", "Запази екранът включен"),
|
||||
("Never", "Никога"),
|
||||
("During controlled", "Докато е обект на управление"),
|
||||
("During service is on", "Докато услугата е включена"),
|
||||
("Capture screen using DirectX", "Снемай екрана ползвайки DirectX"),
|
||||
("Capture screen using DirectX", "Заснемай екрана ползвайки DirectX"),
|
||||
("Back", "Назад"),
|
||||
("Apps", "Приложения"),
|
||||
("Volume up", "Усилване звук"),
|
||||
("Volume down", "Намаляне звук"),
|
||||
("Volume down", "Намаляване звук"),
|
||||
("Power", "Мощност"),
|
||||
("Telegram bot", "Телеграм бот"),
|
||||
("enable-bot-tip", ""),
|
||||
("enable-bot-desc", ""),
|
||||
("cancel-2fa-confirm-tip", ""),
|
||||
("cancel-bot-confirm-tip", ""),
|
||||
("About RustDesk", "Относно RustDesk"),
|
||||
("About RustDesk", "За RustDesk"),
|
||||
("Send clipboard keystrokes", ""),
|
||||
("network_error_tip", ""),
|
||||
("Unlock with PIN", "Отключване с PIN"),
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -653,7 +653,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Upload folder", "上传文件夹"),
|
||||
("Upload files", "上传文件"),
|
||||
("Clipboard is synchronized", "剪贴板已同步"),
|
||||
("Update client clipboard", "更新客户端的粘贴板"),
|
||||
("Update client clipboard", "更新客户端的剪贴板"),
|
||||
("Untagged", "无标签"),
|
||||
("new-version-of-{}-tip", "{} 版本更新"),
|
||||
("Accessible devices", "可访问的设备"),
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", "{} 打印机已安装,您可以使用打印功能了。"),
|
||||
("Install {} Printer", "安装 {} 打印机"),
|
||||
("Outgoing Print Jobs", "传出的打印任务"),
|
||||
("Incomming Print Jobs", "传入的打印任务"),
|
||||
("Incoming Print Jobs", "传入的打印任务"),
|
||||
("Incoming Print Job", "传入的打印任务"),
|
||||
("use-the-default-printer-tip", "使用默认的打印机执行"),
|
||||
("use-the-selected-printer-tip", "使用选择的打印机执行"),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", "被控端的权限设置拒绝了远程打印。"),
|
||||
("save-settings-tip", "保存设置"),
|
||||
("dont-show-again-tip", "不再显示此信息"),
|
||||
("Take screenshot", "截屏"),
|
||||
("Taking screenshot", "正在截屏"),
|
||||
("screenshot-merged-screen-not-supported-tip", "当前不支持多个屏幕的合并截屏,请切换到单个屏幕重试。"),
|
||||
("screenshot-action-tip", "请选择如何继续截屏。"),
|
||||
("Save as", "另存为"),
|
||||
("Copy to clipboard", "复制到剪贴板"),
|
||||
("Enable remote printer", "启用远程打印机"),
|
||||
("Downloading {}", "正在下载 {}"),
|
||||
("{} Update", "{} 更新"),
|
||||
("{}-to-update-tip", "即将关闭 {} ,并安装新版本。"),
|
||||
("download-new-version-failed-tip", "下载失败,您可以重试或者点击\"下载\"按钮,从发布网址下载,并手动升级。"),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", "安装方式检测失败。请点击\"下载\"按钮,从发布网址下载,并手动升级。"),
|
||||
("websocket_tip", "使用 WebSocket 时,仅支持中继连接。"),
|
||||
("Use WebSocket", "使用 WebSocket"),
|
||||
("Trackpad speed", "触控板速度"),
|
||||
("Default trackpad speed", "默认触控板速度"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", "Der Drucker {} ist installiert und einsatzbereit."),
|
||||
("Install {} Printer", "Drucker {} installieren"),
|
||||
("Outgoing Print Jobs", "Ausgehende Druckaufträge"),
|
||||
("Incomming Print Jobs", "Eingehende Druckaufträge"),
|
||||
("Incoming Print Jobs", "Eingehende Druckaufträge"),
|
||||
("Incoming Print Job", "Eingehender Druckauftrag"),
|
||||
("use-the-default-printer-tip", "Standarddrucker verwenden"),
|
||||
("use-the-selected-printer-tip", "Ausgewählten Drucker verwenden"),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", "Die Berechtigungseinstellungen der kontrollierten Seite verweigern den entfernten Druck."),
|
||||
("save-settings-tip", "Einstellungen speichern"),
|
||||
("dont-show-again-tip", "Nicht mehr anzeigen"),
|
||||
("Take screenshot", "Screenshot aufnehmen"),
|
||||
("Taking screenshot", "Screenshot aufnehmen …"),
|
||||
("screenshot-merged-screen-not-supported-tip", "Das Zusammenführen von Screenshots von mehreren Bildschirmen wird derzeit nicht unterstützt. Bitte wechseln Sie zu einem einzelnen Bildschirm und versuchen Sie es erneut."),
|
||||
("screenshot-action-tip", "Bitte wählen Sie aus, wie Sie mit dem Screenshot fortfahren möchten."),
|
||||
("Save as", "Speichern unter"),
|
||||
("Copy to clipboard", "In Zwischenablage kopieren"),
|
||||
("Enable remote printer", "Entfernten Drucker aktivieren"),
|
||||
("Downloading {}", "{} herunterladen"),
|
||||
("{} Update", "{} aktualisieren"),
|
||||
("{}-to-update-tip", "{} wird jetzt geschlossen und die neue Version installiert."),
|
||||
("download-new-version-failed-tip", "Download fehlgeschlagen. Sie können es erneut versuchen oder auf die Schaltfläche \"Herunterladen\" klicken, um von der Versionsseite herunterzuladen und manuell zu aktualisieren."),
|
||||
("Auto update", "Automatisch aktualisieren"),
|
||||
("update-failed-check-msi-tip", "Prüfung der Installationsmethode fehlgeschlagen. Bitte klicken Sie auf die Schaltfläche \"Herunterladen\", um von der Versionsseite herunterzuladen und manuell zu aktualisieren."),
|
||||
("websocket_tip", "Bei der Verwendung von WebSocket werden nur Relay-Verbindungen unterstützt."),
|
||||
("Use WebSocket", "WebSocket verwenden"),
|
||||
("Trackpad speed", "Geschwindigkeit des Trackpads"),
|
||||
("Default trackpad speed", "Standardgeschwindigkeit des Trackpads"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -253,5 +253,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", "The permission settings of the controlled side deny Remote Printing."),
|
||||
("save-settings-tip", "Save settings"),
|
||||
("dont-show-again-tip", "Don't show this again"),
|
||||
("screenshot-merged-screen-not-supported-tip", "Merging screenshots of multiple displays is currently not supported. Please switch to a single display and try again."),
|
||||
("screenshot-action-tip", "Please select how to continue with the screenshot."),
|
||||
("{}-to-update-tip", "{} will close now and install the new version."),
|
||||
("download-new-version-failed-tip", "Download failed. You can try again or click the \"Download\" button to download from the release page and upgrade manually."),
|
||||
("update-failed-check-msi-tip", "Installation method check failed. Please click the \"Download\" button to download from the release page and upgrade manually."),
|
||||
("websocket_tip", "When using WebSocket, only relay connections are supported."),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -662,24 +662,41 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("view_camera_unsupported_tip", "El dispositivo remoto no soporta la visualización de la cámara."),
|
||||
("Enable camera", "Habilitar cámara"),
|
||||
("No cameras", "No hay cámaras"),
|
||||
("d3d_render_tip", ""),
|
||||
("Use D3D rendering", ""),
|
||||
("Printer", ""),
|
||||
("printer-os-requirement-tip", ""),
|
||||
("printer-requires-installed-{}-client-tip", ""),
|
||||
("printer-{}-not-installed-tip", ""),
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
("auto-print-tip", ""),
|
||||
("print-incoming-job-confirm-tip", ""),
|
||||
("remote-printing-disallowed-tile-tip", ""),
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("d3d_render_tip", "Al activar el renderizado D3D, la pantalla de control remoto puede verse negra en algunos equipos."),
|
||||
("Use D3D rendering", "Usar renderizado D3D"),
|
||||
("Printer", "Impresora"),
|
||||
("printer-os-requirement-tip", "La función de salida de impresora necesita Windows 10 o superior."),
|
||||
("printer-requires-installed-{}-client-tip", "Para usar la impresión remota, {} necesita estar instalado en tu dispositivo."),
|
||||
("printer-{}-not-installed-tip", "La impresora {} no está instalada."),
|
||||
("printer-{}-ready-tip", "La impresora {} está instalada y lista para usar."),
|
||||
("Install {} Printer", "Instalar la impresora {}"),
|
||||
("Outgoing Print Jobs", "Tareas salientes de impresión"),
|
||||
("Incoming Print Jobs", "Tareas entrantes de impresión"),
|
||||
("Incoming Print Job", "Trabajo entrante de impresión"),
|
||||
("use-the-default-printer-tip", "Usar la impresora predeterminada"),
|
||||
("use-the-selected-printer-tip", "Usar la impresora seleccionada"),
|
||||
("auto-print-tip", "Imprimir automáticamente usando la impresora seleccionada."),
|
||||
("print-incoming-job-confirm-tip", "Has recibido una tarea de impresión remota. ¿Deseas ejecutarla en tu lado?"),
|
||||
("remote-printing-disallowed-tile-tip", "Impresión remota inhabilitada"),
|
||||
("remote-printing-disallowed-text-tip", "Los ajustes de permisos del lado controlado no permiten la impresión remota."),
|
||||
("save-settings-tip", "Guardar ajustes"),
|
||||
("dont-show-again-tip", "No volver a mostrar"),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -364,7 +364,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Recording", "در حال ضبط"),
|
||||
("Directory", "مسیر"),
|
||||
("Automatically record incoming sessions", "ضبط خودکار جلسات ورودی"),
|
||||
("Automatically record outgoing sessions", ""),
|
||||
("Automatically record outgoing sessions", "ضبط خودکار جلسات خروجی"),
|
||||
("Change", "تغییر"),
|
||||
("Start session recording", "شروع ضبط جلسه"),
|
||||
("Stop session recording", "توقف ضبط جلسه"),
|
||||
@@ -617,8 +617,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("floating_window_tip", "کمک می کند RustDesk این به حفظ سرویس پس زمینه"),
|
||||
("Keep screen on", "صفحه نمایش را روشن نگه دارید"),
|
||||
("Never", "هرگز"),
|
||||
("During controlled", ""),
|
||||
("During service is on", ""),
|
||||
("During controlled", "در حین کنترل"),
|
||||
("During service is on", "در حین سرویس روشن است"),
|
||||
("Capture screen using DirectX", "DirectX تصویربرداری از صفحه نمایش با استفاده از"),
|
||||
("Back", "برگشت"),
|
||||
("Apps", "برنامه ها"),
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", "چاپگر {} آماده است"),
|
||||
("Install {} Printer", "نصب چاپگر {}"),
|
||||
("Outgoing Print Jobs", "وظایف چاپ خروجی"),
|
||||
("Incomming Print Jobs", "وظایف چاپ ورودی"),
|
||||
("Incoming Print Jobs", "وظایف چاپ ورودی"),
|
||||
("Incoming Print Job", "وظیفه چاپ ورودی"),
|
||||
("use-the-default-printer-tip", "از چاپگر پیشفرض استفاده کنید"),
|
||||
("use-the-selected-printer-tip", "از چاپگر انتخابشده استفاده کنید"),
|
||||
@@ -681,5 +681,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", "شما مجوز لازم برای چاپ از راه دور را ندارید"),
|
||||
("save-settings-tip", "تنظیمات را ذخیره کنید"),
|
||||
("dont-show-again-tip", "دیگر نمایش داده نشود"),
|
||||
("Take screenshot", "عکس گرفتن"),
|
||||
("Taking screenshot", "در حال گرفتن عکس"),
|
||||
("screenshot-merged-screen-not-supported-tip", "ادغام تصاویر از نمایشگرهای متعدد در حال حاضر پشتیبانی نمی شود. لطفاً به یک صفحه نمایش واحد تغییر دهید و دوباره امتحان کنید."),
|
||||
("screenshot-action-tip", "لطفاً نحوه ادامه با تصویر را انتخاب کنید."),
|
||||
("Save as", "ذخیره به عنوان"),
|
||||
("Copy to clipboard", "در کلیپ بورد کپی کنید"),
|
||||
("Enable remote printer", "چاپگر از راه دور را فعال کنید"),
|
||||
("Downloading {}", "بارگیری {}"),
|
||||
("{} Update", "{} به روز رسانی"),
|
||||
("{}-to-update-tip", "{} اکنون بسته خواهد شد و نسخه جدید را نصب می کند."),
|
||||
("download-new-version-failed-tip", "بارگیری ناموفق بود. می توانید دوباره امتحان کنید یا روی دکمه 'بارگیری' کلیک کنید تا از صفحه انتشار بارگیری کنید و به صورت دستی ارتقا دهید."),
|
||||
("Auto update", "بروزرسانی خودکار"),
|
||||
("update-failed-check-msi-tip", "بررسی روش نصب انجام نشد. لطفاً برای بارگیری از صفحه انتشار ، روی دکمه 'بارگیری' کلیک کنید و به صورت دستی ارتقا دهید."),
|
||||
("websocket_tip", "فقط اتصالات رله پشتیبانی می شوند ، WebSocket هنگام استفاده از ."),
|
||||
("Use WebSocket", "استفاده کنید WebSocket از"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", "L’imprimante {} est installée et opérationnelle."),
|
||||
("Install {} Printer", "Installer l’imprimante {}"),
|
||||
("Outgoing Print Jobs", "Impressions sortantes"),
|
||||
("Incomming Print Jobs", "Impressions entrantes"),
|
||||
("Incoming Print Jobs", "Impressions entrantes"),
|
||||
("Incoming Print Job", "Impression entrante"),
|
||||
("use-the-default-printer-tip", "Utiliser l’imprimante par défaut"),
|
||||
("use-the-selected-printer-tip", "Utiliser l’imprimante sélectionnée"),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", "Les paramètres de l’appareil contrôlé n’autorisent pas l’impression à distance."),
|
||||
("save-settings-tip", "Enregistrer les paramètres"),
|
||||
("dont-show-again-tip", "Ne plus afficher"),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
702
src/lang/ge.rs
Normal file
702
src/lang/ge.rs
Normal file
@@ -0,0 +1,702 @@
|
||||
lazy_static::lazy_static! {
|
||||
pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
[
|
||||
("Status", "სტატუსი"),
|
||||
("Your Desktop", "თქვენი სამუშაო მაგიდა"),
|
||||
("desk_tip", "თქვენი სამუშაო მაგიდა ხელმისაწვდომია ამ ID-ით და პაროლით."),
|
||||
("Password", "პაროლი"),
|
||||
("Ready", "მზადაა"),
|
||||
("Established", "დამყარებულია"),
|
||||
("connecting_status", "RustDesk ქსელთან დაკავშირება..."),
|
||||
("Enable service", "სერვისის ჩართვა"),
|
||||
("Start service", "სერვისის გაშვება"),
|
||||
("Service is running", "სერვისი გაშვებულია"),
|
||||
("Service is not running", "სერვისი არ არის გაშვებული"),
|
||||
("not_ready_status", "არ არის დაკავშირებული. შეამოწმეთ კავშირი."),
|
||||
("Control Remote Desktop", "ახალი კავშირი"),
|
||||
("Transfer file", "ფაილების გადაცემა"),
|
||||
("Connect", "დაკავშირება"),
|
||||
("Recent sessions", "ბოლო სესიები"),
|
||||
("Address book", "მისამართების წიგნი"),
|
||||
("Confirmation", "დადასტურება"),
|
||||
("TCP tunneling", "TCP ტუნელირება"),
|
||||
("Remove", "წაშლა"),
|
||||
("Refresh random password", "შემთხვევითი პაროლის განახლება"),
|
||||
("Set your own password", "საკუთარი პაროლის დაყენება"),
|
||||
("Enable keyboard/mouse", "კლავიატურის/თაგუნას გამოყენება"),
|
||||
("Enable clipboard", "გაცვლის ბუფერის გამოყენება"),
|
||||
("Enable file transfer", "ფაილების გადაცემის გამოყენება"),
|
||||
("Enable TCP tunneling", "TCP ტუნელირების გამოყენება"),
|
||||
("IP Whitelisting", "დაშვებული IP მისამართების სია"),
|
||||
("ID/Relay Server", "ID/რეტრანსლატორი"),
|
||||
("Import server config", "სერვერის კონფიგურაციის იმპორტი"),
|
||||
("Export Server Config", "სერვერის კონფიგურაციის ექსპორტი"),
|
||||
("Import server configuration successfully", "სერვერის კონფიგურაცია წარმატებით იმპორტირებულია"),
|
||||
("Export server configuration successfully", "სერვერის კონფიგურაცია წარმატებით ექსპორტირებულია"),
|
||||
("Invalid server configuration", "არასწორი სერვერის კონფიგურაცია"),
|
||||
("Clipboard is empty", "გაცვლის ბუფერი ცარიელია"),
|
||||
("Stop service", "სერვისის გაჩერება"),
|
||||
("Change ID", "ID-ის შეცვლა"),
|
||||
("Your new ID", "თქვენი ახალი ID"),
|
||||
("length %min% to %max%", "სიგრძე %min%...%max%"),
|
||||
("starts with a letter", "იწყება ასოთი"),
|
||||
("allowed characters", "დაშვებული სიმბოლოები"),
|
||||
("id_change_tip", "დაშვებულია მხოლოდ a-z, A-Z, 0-9, - (დეფისი) და _ (ქვედა ტირე) სიმბოლოები. პირველი უნდა იყოს a-z, A-Z ასო. სიგრძე 6-დან 16-მდე."),
|
||||
("Website", "ვებგვერდი"),
|
||||
("About", "პროგრამის შესახებ"),
|
||||
("Slogan_tip", "შექმნილია გულით ამ შეშლილ სამყაროში!"),
|
||||
("Privacy Statement", "კონფიდენციალურობის განაცხადი"),
|
||||
("Mute", "ხმის გათიშვა"),
|
||||
("Build Date", "აგების თარიღი"),
|
||||
("Version", "ვერსია"),
|
||||
("Home", "მთავარი"),
|
||||
("Audio Input", "აუდიო შესავალი"),
|
||||
("Enhancements", "გაუმჯობესებები"),
|
||||
("Hardware Codec", "აპარატული კოდეკი"),
|
||||
("Adaptive bitrate", "ადაპტური ბიტრეიტი"),
|
||||
("ID Server", "ID სერვერი"),
|
||||
("Relay Server", "რეტრანსლატორი"),
|
||||
("API Server", "API სერვერი"),
|
||||
("invalid_http", "მისამართი უნდა იწყებოდეს http:// ან https://-ით"),
|
||||
("Invalid IP", "არასწორი IP მისამართი"),
|
||||
("Invalid format", "არასწორი ფორმატი"),
|
||||
("server_not_support", "ჯერ სერვერით არ არის მხარდაჭერილი"),
|
||||
("Not available", "მიუწვდომელია"),
|
||||
("Too frequent", "ძალიან ხშირად"),
|
||||
("Cancel", "გაუქმება"),
|
||||
("Skip", "გამოტოვება"),
|
||||
("Close", "დახურვა"),
|
||||
("Retry", "ხელახლა ცდა"),
|
||||
("OK", "დიახ"),
|
||||
("Password Required", "საჭიროა პაროლი"),
|
||||
("Please enter your password", "შეიყვანეთ თქვენი პაროლი"),
|
||||
("Remember password", "პაროლის დამახსოვრება"),
|
||||
("Wrong Password", "არასწორი პაროლი"),
|
||||
("Do you want to enter again?", "გსურთ ხელახლა შესვლა?"),
|
||||
("Connection Error", "დაკავშირების შეცდომა"),
|
||||
("Error", "შეცდომა"),
|
||||
("Reset by the peer", "გადატვირთულია დაშორებული კვანძის მიერ"),
|
||||
("Connecting...", "დაკავშირება..."),
|
||||
("Connection in progress. Please wait.", "მიმდინარეობს დაკავშირება. გთხოვთ, მოიცადოთ."),
|
||||
("Please try 1 minute later", "სცადეთ ერთი წუთის შემდეგ"),
|
||||
("Login Error", "შესვლის შეცდომა"),
|
||||
("Successful", "წარმატებული"),
|
||||
("Connected, waiting for image...", "დაკავშირებულია, გამოსახულების მოლოდინში..."),
|
||||
("Name", "სახელი"),
|
||||
("Type", "ტიპი"),
|
||||
("Modified", "შეცვლილი"),
|
||||
("Size", "ზომა"),
|
||||
("Show Hidden Files", "დამალული ფაილების ჩვენება"),
|
||||
("Receive", "მიღება"),
|
||||
("Send", "გაგზავნა"),
|
||||
("Refresh File", "ფაილის განახლება"),
|
||||
("Local", "ლოკალური"),
|
||||
("Remote", "დაშორებული"),
|
||||
("Remote Computer", "დაშორებული კომპიუტერი"),
|
||||
("Local Computer", "ლოკალური კომპიუტერი"),
|
||||
("Confirm Delete", "წაშლის დადასტურება"),
|
||||
("Delete", "წაშლა"),
|
||||
("Properties", "თვისებები"),
|
||||
("Multi Select", "მრავლობითი არჩევანი"),
|
||||
("Select All", "ყველას არჩევა"),
|
||||
("Unselect All", "ყველას მოხსნა"),
|
||||
("Empty Directory", "ცარიელი საქაღალდე"),
|
||||
("Not an empty directory", "საქაღალდე არ არის ცარიელი"),
|
||||
("Are you sure you want to delete this file?", "ნამდვილად გსურთ ამ ფაილის წაშლა?"),
|
||||
("Are you sure you want to delete this empty directory?", "ნამდვილად გსურთ ამ ცარიელი საქაღალდის წაშლა?"),
|
||||
("Are you sure you want to delete the file of this directory?", "ნამდვილად გსურთ ამ საქაღალდიდან ფაილის წაშლა?"),
|
||||
("Do this for all conflicts", "გააკეთეთ ეს ყველა კონფლიქტისთვის"),
|
||||
("This is irreversible!", "ეს შეუქცევადია!"),
|
||||
("Deleting", "წაშლა"),
|
||||
("files", "ფაილები"),
|
||||
("Waiting", "მოლოდინი"),
|
||||
("Finished", "დასრულებულია"),
|
||||
("Speed", "სიჩქარე"),
|
||||
("Custom Image Quality", "მომხმარებლის მიერ განსაზღვრული გამოსახულების ხარისხი"),
|
||||
("Privacy mode", "კონფიდენციალურობის რეჟიმი"),
|
||||
("Block user input", "დაშორებულ მოწყობილობაზე შეყვანის დაბლოკვა"),
|
||||
("Unblock user input", "დაშორებულ მოწყობილობაზე შეყვანის განბლოკვა"),
|
||||
("Adjust Window", "ფანჯრის მორგება"),
|
||||
("Original", "ორიგინალი"),
|
||||
("Shrink", "შემცირება"),
|
||||
("Stretch", "გაჭიმვა"),
|
||||
("Scrollbar", "გადაადგილების ზოლი"),
|
||||
("ScrollAuto", "ავტოგადაადგილება"),
|
||||
("Good image quality", "საუკეთესო გამოსახულების ხარისხი"),
|
||||
("Balanced", "ბალანსი ხარისხსა და რეაგირებას შორის"),
|
||||
("Optimize reaction time", "საუკეთესო რეაგირების დრო"),
|
||||
("Custom", "მომხმარებლის მიერ განსაზღვრული"),
|
||||
("Show remote cursor", "დაშორებული კურსორის ჩვენება"),
|
||||
("Show quality monitor", "ხარისხის მონიტორის ჩვენება"),
|
||||
("Disable clipboard", "გაცვლის ბუფერის გამორთვა"),
|
||||
("Lock after session end", "სესიის დასრულების შემდეგ ანგარიშის დაბლოკვა"),
|
||||
("Insert Ctrl + Alt + Del", "Ctrl + Alt + Del ჩასმა"),
|
||||
("Insert Lock", "ანგარიშის დაბლოკვა"),
|
||||
("Refresh", "განახლება"),
|
||||
("ID does not exist", "ID არ არსებობს"),
|
||||
("Failed to connect to rendezvous server", "შუამავალ სერვერთან დაკავშირება შეუძლებელია"),
|
||||
("Please try later", "სცადეთ მოგვიანებით"),
|
||||
("Remote desktop is offline", "დაშორებული მოწყობილობა არ არის ონლაინ"),
|
||||
("Key mismatch", "გასაღების შეუსაბამობა"),
|
||||
("Timeout", "დროის ამოწურვა"),
|
||||
("Failed to connect to relay server", "რეტრანსლატორთან დაკავშირება შეუძლებელია"),
|
||||
("Failed to connect via rendezvous server", "შუამავალი სერვერის მეშვეობით დაკავშირება შეუძლებელია"),
|
||||
("Failed to connect via relay server", "რეტრანსლატორის მეშვეობით დაკავშირება შეუძლებელია"),
|
||||
("Failed to make direct connection to remote desktop", "დაშორებულ მოწყობილობასთან პირდაპირი კავშირის დამყარება შეუძლებელია"),
|
||||
("Set Password", "პაროლის დაყენება"),
|
||||
("OS Password", "ოპერაციული სისტემის პაროლი"),
|
||||
("install_tip", "ზოგიერთ შემთხვევაში UAC-ის გამო RustDesk შეიძლება არასწორად მუშაობდეს დაშორებულ კვანძზე. UAC-თან დაკავშირებული პრობლემების თავიდან ასაცილებლად დააჭირეთ ქვემოთ მოცემულ ღილაკს სისტემაში RustDesk-ის დასაყენებლად."),
|
||||
("Click to upgrade", "დააჭირეთ განახლებისთვის"),
|
||||
("Click to download", "დააჭირეთ ჩამოსატვირთად"),
|
||||
("Click to update", "დააჭირეთ განახლებისთვის"),
|
||||
("Configure", "კონფიგურაცია"),
|
||||
("config_acc", "თქვენი სამუშაო მაგიდის დისტანციური მართვისთვის უნდა მიანიჭოთ RustDesk-ს \"წვდომის\" უფლებები"),
|
||||
("config_screen", "სამუშაო მაგიდაზე დისტანციური წვდომისთვის უნდა მიანიჭოთ RustDesk-ს \"ეკრანის ანაბეჭდის\" უფლებები"),
|
||||
("Installing ...", "ინსტალაცია..."),
|
||||
("Install", "დაინსტალირება"),
|
||||
("Installation", "ინსტალაცია"),
|
||||
("Installation Path", "ინსტალაციის გზა"),
|
||||
("Create start menu shortcuts", "მენიუში მალსახმობების შექმნა"),
|
||||
("Create desktop icon", "სამუშაო მაგიდაზე ხატულის შექმნა"),
|
||||
("agreement_tip", "ინსტალაციის დაწყებით თქვენ ეთანხმებით სალიცენზიო შეთანხმების პირობებს."),
|
||||
("Accept and Install", "დათანხმება და ინსტალაცია"),
|
||||
("End-user license agreement", "საბოლოო მომხმარებლის სალიცენზიო შეთანხმება"),
|
||||
("Generating ...", "გენერაცია..."),
|
||||
("Your installation is lower version.", "თქვენი ინსტალაცია უფრო ადრეული ვერსიაა."),
|
||||
("not_close_tcp_tip", "ტუნელის გამოყენებისას არ დახუროთ ეს ფანჯარა."),
|
||||
("Listening ...", "მოსმენა..."),
|
||||
("Remote Host", "დაშორებული კვანძი"),
|
||||
("Remote Port", "დაშორებული პორტი"),
|
||||
("Action", "მოქმედება"),
|
||||
("Add", "დამატება"),
|
||||
("Local Port", "ლოკალური პორტი"),
|
||||
("Local Address", "ლოკალური მისამართი"),
|
||||
("Change Local Port", "ლოკალური პორტის შეცვლა"),
|
||||
("setup_server_tip", "უფრო სწრაფი დაკავშირებისთვის დააყენეთ საკუთარი სერვერი."),
|
||||
("Too short, at least 6 characters.", "ძალიან მოკლეა, მინიმუმ 6 სიმბოლო."),
|
||||
("The confirmation is not identical.", "დადასტურება არ ემთხვევა"),
|
||||
("Permissions", "უფლებები"),
|
||||
("Accept", "მიღება"),
|
||||
("Dismiss", "უარყოფა"),
|
||||
("Disconnect", "გათიშვა"),
|
||||
("Enable file copy and paste", "ფაილების კოპირების და ჩასმის დაშვება"),
|
||||
("Connected", "დაკავშირებულია"),
|
||||
("Direct and encrypted connection", "პირდაპირი და დაშიფრული კავშირი"),
|
||||
("Relayed and encrypted connection", "რეტრანსლირებული და დაშიფრული კავშირი"),
|
||||
("Direct and unencrypted connection", "პირდაპირი და დაუშიფრავი კავშირი"),
|
||||
("Relayed and unencrypted connection", "რეტრანსლირებული და დაუშიფრავი კავშირი"),
|
||||
("Enter Remote ID", "შეიყვანეთ დაშორებული ID"),
|
||||
("Enter your password", "შეიყვანეთ თქვენი პაროლი"),
|
||||
("Logging in...", "შესვლა..."),
|
||||
("Enable RDP session sharing", "RDP სესიის გაზიარების გამოყენება"),
|
||||
("Auto Login", "ავტომატური შესვლა ანგარიშში"),
|
||||
("Enable direct IP access", "პირდაპირი IP წვდომის გამოყენება"),
|
||||
("Rename", "გადარქმევა"),
|
||||
("Space", "სივრცე"),
|
||||
("Create desktop shortcut", "სამუშაო მაგიდაზე მალსახმობის შექმნა"),
|
||||
("Change Path", "გზის შეცვლა"),
|
||||
("Create Folder", "საქაღალდის შექმნა"),
|
||||
("Please enter the folder name", "შეიყვანეთ საქაღალდის სახელი"),
|
||||
("Fix it", "გამოსწორება"),
|
||||
("Warning", "გაფრთხილება"),
|
||||
("Login screen using Wayland is not supported", "Wayland-ის გამოყენებით შესვლის ეკრანი არ არის მხარდაჭერილი"),
|
||||
("Reboot required", "საჭიროა გადატვირთვა"),
|
||||
("Unsupported display server", "არამხარდაჭერილი ჩვენების სერვერი"),
|
||||
("x11 expected", "მოსალოდნელია X11"),
|
||||
("Port", "პორტი"),
|
||||
("Settings", "პარამეტრები"),
|
||||
("Username", "მომხმარებლის სახელი"),
|
||||
("Invalid port", "არასწორი პორტი"),
|
||||
("Closed manually by the peer", "დახურულია დაშორებული კვანძის მიერ ხელით"),
|
||||
("Enable remote configuration modification", "დაშორებული კონფიგურაციის ცვლილების დაშვება"),
|
||||
("Run without install", "გაშვება ინსტალაციის გარეშე"),
|
||||
("Connect via relay", "რეტრანსლატორის მეშვეობით დაკავშირება"),
|
||||
("Always connect via relay", "ყოველთვის დაკავშირება რეტრანსლატორის მეშვეობით"),
|
||||
("whitelist_tip", "მხოლოდ თეთრ სიაში არსებულ IP მისამართებს შეუძლიათ ჩემს მოწყობილობაზე წვდომა."),
|
||||
("Login", "შესვლა"),
|
||||
("Verify", "შემოწმება"),
|
||||
("Remember me", "დამიმახსოვრე"),
|
||||
("Trust this device", "სანდო მოწყობილობა"),
|
||||
("Verification code", "შემოწმების კოდი"),
|
||||
("verification_tip", "აღმოჩენილია ახალი მოწყობილობა, რეგისტრირებულ ელფოსტაზე გაგზავნილია შემოწმების კოდი. შეიყვანეთ ის სისტემაში შესვლის გასაგრძელებლად."),
|
||||
("Logout", "გამოსვლა"),
|
||||
("Tags", "ჭდეები"),
|
||||
("Search ID", "ID-ით ძიება"),
|
||||
("whitelist_sep", "გამოყოფა მძიმით, წერტილ-მძიმით, ჰარით ან ახალი ხაზით."),
|
||||
("Add ID", "ID-ის დამატება"),
|
||||
("Add Tag", "საკვანძო სიტყვის დამატება"),
|
||||
("Unselect all tags", "ყველა ჭდის მოხსნა"),
|
||||
("Network error", "ქსელის შეცდომა"),
|
||||
("Username missed", "მომხმარებლის სახელი აკლია"),
|
||||
("Password missed", "პაროლი დაგავიწყდათ"),
|
||||
("Wrong credentials", "არასწორი მონაცემები"),
|
||||
("The verification code is incorrect or has expired", "შემოწმების კოდი არასწორია ან ვადაგასულია"),
|
||||
("Edit Tag", "ჭდის შეცვლა"),
|
||||
("Forget Password", "პაროლის დავიწყება"),
|
||||
("Favorites", "რჩეულები"),
|
||||
("Add to Favorites", "რჩეულებში დამატება"),
|
||||
("Remove from Favorites", "რჩეულებიდან წაშლა"),
|
||||
("Empty", "ცარიელი"),
|
||||
("Invalid folder name", "არასწორი საქაღალდის სახელი"),
|
||||
("Socks5 Proxy", "SOCKS5-პროქსი"),
|
||||
("Socks5/Http(s) Proxy", ""),
|
||||
("Discovered", "ნაპოვნია"),
|
||||
("install_daemon_tip", "ჩატვირთვისას გასაშვებად საჭიროა სისტემური სერვისის დაყენება"),
|
||||
("Remote ID", "დაშორებული ID"),
|
||||
("Paste", "ჩასმა"),
|
||||
("Paste here?", "ჩასმა აქ?"),
|
||||
("Are you sure to close the connection?", "ნამდვილად გსურთ კავშირის დასრულება?"),
|
||||
("Download new version", "ახალი ვერსიის ჩამოტვირთვა"),
|
||||
("Touch mode", "სენსორული რეჟიმი"),
|
||||
("Mouse mode", "თაგუნას/ტაჩპადის რეჟიმი"),
|
||||
("One-Finger Tap", "ერთი თითით შეხება"),
|
||||
("Left Mouse", "თაგუნას მარცხენა ღილაკი"),
|
||||
("One-Long Tap", "ერთი თითით ხანგრძლივი შეხება"),
|
||||
("Two-Finger Tap", "ორი თითით შეხება"),
|
||||
("Right Mouse", "თაგუნას მარჯვენა ღილაკი"),
|
||||
("One-Finger Move", "ერთი თითით გადაადგილება"),
|
||||
("Double Tap & Move", "ორმაგი შეხება და გადაადგილება"),
|
||||
("Mouse Drag", "თაგუნათი გადათრევა"),
|
||||
("Three-Finger vertically", "სამი თითით ვერტიკალურად"),
|
||||
("Mouse Wheel", "თაგუნას ბორბალი"),
|
||||
("Two-Finger Move", "ორი თითით გადაადგილება"),
|
||||
("Canvas Move", "ტილოს გადაადგილება"),
|
||||
("Pinch to Zoom", "მასშტაბირება თითებით"),
|
||||
("Canvas Zoom", "ტილოს მასშტაბი"),
|
||||
("Reset canvas", "ტილოს მასშტაბის გადატვირთვა"),
|
||||
("No permission of file transfer", "ფაილების გადაცემის უფლება არ არის"),
|
||||
("Note", "შენიშვნა"),
|
||||
("Connection", "კავშირი"),
|
||||
("Share Screen", "ეკრანის დემონსტრაცია"),
|
||||
("Chat", "ჩატი"),
|
||||
("Total", "სულ"),
|
||||
("items", "ელემენტები"),
|
||||
("Selected", "არჩეულია"),
|
||||
("Screen Capture", "ეკრანის ჩაწერა"),
|
||||
("Input Control", "შეყვანის კონტროლი"),
|
||||
("Audio Capture", "აუდიოს ჩაწერა"),
|
||||
("File Connection", "ფაილების გადაცემის დაკავშირება"),
|
||||
("Screen Connection", "ეკრანის ნახვის/მართვის დაკავშირება"),
|
||||
("Do you accept?", "თანახმა ხართ?"),
|
||||
("Open System Setting", "სისტემის პარამეტრების გახსნა"),
|
||||
("How to get Android input permission?", "როგორ მივიღოთ Android-ის შეყვანის უფლება?"),
|
||||
("android_input_permission_tip1", "იმისთვის, რომ დაშორებულმა მოწყობილობამ შეძლოს თქვენი Android-მოწყობილობის მართვა თაგუნათი ან შეხებით, საჭიროა RustDesk-ისთვის \"სპეციალური შესაძლებლობების\" სერვისის გამოყენების უფლების მინიჭება."),
|
||||
("android_input_permission_tip2", "გადადით სისტემის პარამეტრების შესაბამის გვერდზე, იპოვეთ და შედით \"დაინსტალირებულ სერვისებში\", ჩართეთ \"RustDesk Input\" სერვისი."),
|
||||
("android_new_connection_tip", "მიღებულია ახალი მოთხოვნა თქვენი მიმდინარე მოწყობილობის მართვაზე."),
|
||||
("android_service_will_start_tip", "ეკრანის ჩაწერის ჩართვა ავტომატურად გაუშვებს სერვისს, რაც სხვა მოწყობილობებს საშუალებას აძლევს მოითხოვონ ამ მოწყობილობასთან დაკავშირება."),
|
||||
("android_stop_service_tip", "სერვისის დახურვა ავტომატურად დახურავს ყველა დამყარებულ კავშირს."),
|
||||
("android_version_audio_tip", "Android-ის მიმდინარე ვერსია არ უჭერს მხარს ხმის ჩაწერას, განაახლეთ Android 10-მდე ან უფრო ახალ ვერსიამდე."),
|
||||
("android_start_service_tip", "დააჭირეთ [სერვისის გაშვება] ან დაუშვით [ეკრანის ჩაწერა] ეკრანის დემონსტრაციის სერვისის გასაშვებად."),
|
||||
("android_permission_may_not_change_tip", "დამყარებული კავშირების უფლებები ვერ შეიცვლება, საჭიროა ხელახალი დაკავშირება."),
|
||||
("Account", "ანგარიში"),
|
||||
("Overwrite", "გადაწერა"),
|
||||
("This file exists, skip or overwrite this file?", "ფაილი უკვე არსებობს, გამოტოვოთ თუ გადავწეროთ?"),
|
||||
("Quit", "გასვლა"),
|
||||
("Help", "დახმარება"),
|
||||
("Failed", "ვერ შესრულდა"),
|
||||
("Succeeded", "შესრულდა"),
|
||||
("Someone turns on privacy mode, exit", "ვიღაცამ ჩართო კონფიდენციალურობის რეჟიმი, გასვლა"),
|
||||
("Unsupported", "არ არის მხარდაჭერილი"),
|
||||
("Peer denied", "უარყოფილია დაშორებული კვანძის მიერ"),
|
||||
("Please install plugins", "დააინსტალირეთ პლაგინები"),
|
||||
("Peer exit", "გათიშულია მომხმარებლის მიერ"),
|
||||
("Failed to turn off", "გამორთვა შეუძლებელია"),
|
||||
("Turned off", "გამორთული"),
|
||||
("Language", "ენა"),
|
||||
("Keep RustDesk background service", "RustDesk-ის ფონური სერვისის შენარჩუნება"),
|
||||
("Ignore Battery Optimizations", "ბატარეის ოპტიმიზაციის იგნორირება"),
|
||||
("android_open_battery_optimizations_tip", "გადადით პარამეტრების შემდეგ გვერდზე"),
|
||||
("Start on boot", "ჩართვისას გაშვება"),
|
||||
("Start the screen sharing service on boot, requires special permissions", "ეკრანის გაზიარების სერვისის გაშვება ჩართვისას (საჭიროებს სპეციალურ უფლებებს)"),
|
||||
("Connection not allowed", "კავშირი არ არის დაშვებული"),
|
||||
("Legacy mode", "ძველი რეჟიმი"),
|
||||
("Map mode", "რუკის რეჟიმი"),
|
||||
("Translate mode", "თარგმნის რეჟიმი"),
|
||||
("Use permanent password", "მუდმივი პაროლის გამოყენება"),
|
||||
("Use both passwords", "ორივე პაროლის გამოყენება"),
|
||||
("Set permanent password", "მუდმივი პაროლის დაყენება"),
|
||||
("Enable remote restart", "დისტანციური გადატვირთვის დაშვება"),
|
||||
("Restart remote device", "დისტანციური მოწყობილობის გადატვირთვა"),
|
||||
("Are you sure you want to restart", "დარწმუნებული ხართ, რომ გსურთ გადატვირთვა?"),
|
||||
("Restarting remote device", "დისტანციური მოწყობილობის გადატვირთვა"),
|
||||
("remote_restarting_tip", "დისტანციური მოწყობილობა იტვირთება. დახურეთ ეს შეტყობინება და გარკვეული დროის შემდეგ ხელახლა დაუკავშირდით მუდმივი პაროლის გამოყენებით."),
|
||||
("Copied", "დაკოპირებულია"),
|
||||
("Exit Fullscreen", "სრული ეკრანიდან გასვლა"),
|
||||
("Fullscreen", "სრული ეკრანი"),
|
||||
("Mobile Actions", "მობილური ქმედებები"),
|
||||
("Select Monitor", "აირჩიეთ მონიტორი"),
|
||||
("Control Actions", "მართვის ქმედებები"),
|
||||
("Display Settings", "ეკრანის პარამეტრები"),
|
||||
("Ratio", "თანაფარდობა"),
|
||||
("Image Quality", "გამოსახულების ხარისხი"),
|
||||
("Scroll Style", "გადაადგილების სტილი"),
|
||||
("Show Toolbar", "ხელსაწყოთა პანელის ჩვენება"),
|
||||
("Hide Toolbar", "ხელსაწყოთა პანელის დამალვა"),
|
||||
("Direct Connection", "პირდაპირი კავშირი"),
|
||||
("Relay Connection", "რეტრანსლირებული კავშირი"),
|
||||
("Secure Connection", "უსაფრთხო კავშირი"),
|
||||
("Insecure Connection", "არაუსაფრთხო კავშირი"),
|
||||
("Scale original", "ორიგინალური მასშტაბი"),
|
||||
("Scale adaptive", "ადაპტირებადი მასშტაბი"),
|
||||
("General", "ზოგადი"),
|
||||
("Security", "უსაფრთხოება"),
|
||||
("Theme", "თემა"),
|
||||
("Dark Theme", "მუქი თემა"),
|
||||
("Light Theme", "ნათელი თემა"),
|
||||
("Dark", "მუქი"),
|
||||
("Light", "ნათელი"),
|
||||
("Follow System", "სისტემური"),
|
||||
("Enable hardware codec", "აპარატურული კოდეკის გამოყენება"),
|
||||
("Unlock Security Settings", "უსაფრთხოების პარამეტრების განბლოკვა"),
|
||||
("Enable audio", "აუდიოს ჩართვა"),
|
||||
("Unlock Network Settings", "ქსელის პარამეტრების განბლოკვა"),
|
||||
("Server", "სერვერი"),
|
||||
("Direct IP Access", "პირდაპირი IP წვდომა"),
|
||||
("Proxy", "პროქსი"),
|
||||
("Apply", "გამოყენება"),
|
||||
("Disconnect all devices?", "გავთიშოთ ყველა მოწყობილობა?"),
|
||||
("Clear", "გასუფთავება"),
|
||||
("Audio Input Device", "აუდიოს შეყვანის მოწყობილობა"),
|
||||
("Use IP Whitelisting", "IP თეთრი სიის გამოყენება"),
|
||||
("Network", "ქსელი"),
|
||||
("Pin Toolbar", "ხელსაწყოთა პანელის მიმაგრება"),
|
||||
("Unpin Toolbar", "ხელსაწყოთა პანელის მოხსნა"),
|
||||
("Recording", "ჩაწერა"),
|
||||
("Directory", "საქაღალდე"),
|
||||
("Automatically record incoming sessions", "შემომავალი სესიების ავტომატური ჩაწერა"),
|
||||
("Automatically record outgoing sessions", "გამავალი სესიების ავტომატური ჩაწერა"),
|
||||
("Change", "შეცვლა"),
|
||||
("Start session recording", "სესიის ჩაწერის დაწყება"),
|
||||
("Stop session recording", "სესიის ჩაწერის შეწყვეტა"),
|
||||
("Enable recording session", "სესიის ჩაწერის ჩართვა"),
|
||||
("Enable LAN discovery", "LAN აღმოჩენის ჩართვა"),
|
||||
("Deny LAN discovery", "LAN აღმოჩენის უარყოფა"),
|
||||
("Write a message", "შეტყობინების დაწერა"),
|
||||
("Prompt", "მინიშნება"),
|
||||
("Please wait for confirmation of UAC...", "გთხოვთ, დაელოდოთ UAC-ის დადასტურებას..."),
|
||||
("elevated_foreground_window_tip", "მიმდინარე დისტანციური სამუშაო მაგიდის ფანჯარა მოითხოვს მაღალ პრივილეგიებს სამუშაოდ, ამიტომ დროებით შეუძლებელია მაუსისა და კლავიატურის გამოყენება. შეგიძლიათ სთხოვოთ დისტანციურ მომხმარებელს ჩაკეცოს მიმდინარე ფანჯარა ან დააჭიროთ უფლებების აწევის ღილაკს კავშირის მართვის ფანჯარაში. ამ პრობლემის თავიდან ასაცილებლად რეკომენდებულია პროგრამული უზრუნველყოფის ინსტალაცია დისტანციურ მოწყობილობაზე."),
|
||||
("Disconnected", "გათიშულია"),
|
||||
("Other", "სხვა"),
|
||||
("Confirm before closing multiple tabs", "რამდენიმე ჩანართის დახურვის დადასტურება"),
|
||||
("Keyboard Settings", "კლავიატურის პარამეტრები"),
|
||||
("Full Access", "სრული წვდომა"),
|
||||
("Screen Share", "ეკრანის გაზიარება"),
|
||||
("Wayland requires Ubuntu 21.04 or higher version.", "Wayland საჭიროებს Ubuntu 21.04 ან უფრო ახალ ვერსიას."),
|
||||
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland-ს სჭირდება Linux-ის დისტრიბუტივის უფრო ახალი ვერსია. გამოიყენეთ X11 სამუშაო მაგიდა ან შეცვალეთ ოპერაციული სისტემა."),
|
||||
("JumpLink", "ნახვა"),
|
||||
("Please Select the screen to be shared(Operate on the peer side).", "აირჩიეთ ეკრანი გასაზიარებლად (იმუშავეთ პარტნიორის მხარეს)."),
|
||||
("Show RustDesk", "RustDesk-ის ჩვენება"),
|
||||
("This PC", "ეს კომპიუტერი"),
|
||||
("or", "ან"),
|
||||
("Continue with", "გაგრძელება"),
|
||||
("Elevate", "უფლებების აწევა"),
|
||||
("Zoom cursor", "კურსორის მასშტაბირება"),
|
||||
("Accept sessions via password", "სესიების მიღება პაროლით"),
|
||||
("Accept sessions via click", "სესიების მიღება ღილაკზე დაჭერით"),
|
||||
("Accept sessions via both", "სესიების მიღება პაროლით და ღილაკზე დაჭერით"),
|
||||
("Please wait for the remote side to accept your session request...", "გთხოვთ, დაელოდოთ, სანამ დისტანციური მხარე მიიღებს თქვენს სესიის მოთხოვნას..."),
|
||||
("One-time Password", "ერთჯერადი პაროლი"),
|
||||
("Use one-time password", "ერთჯერადი პაროლის გამოყენება"),
|
||||
("One-time password length", "ერთჯერადი პაროლის სიგრძე"),
|
||||
("Request access to your device", "თქვენს მოწყობილობაზე წვდომის მოთხოვნა"),
|
||||
("Hide connection management window", "კავშირის მართვის ფანჯრის დამალვა"),
|
||||
("hide_cm_tip", "დამალვის დაშვება, თუ სესიები მიიღება პაროლით ან გამოიყენება მუდმივი პაროლი"),
|
||||
("wayland_experiment_tip", "Wayland-ის მხარდაჭერა ექსპერიმენტულ ეტაპზეა, გამოიყენეთ X11, თუ გჭირდებათ ავტომატური წვდომა."),
|
||||
("Right click to select tabs", "ჩანართების არჩევა მარჯვენა ღილაკით"),
|
||||
("Skipped", "გამოტოვებულია"),
|
||||
("Add to address book", "მისამართების წიგნში დამატება"),
|
||||
("Group", "ჯგუფი"),
|
||||
("Search", "ძიება"),
|
||||
("Closed manually by web console", "ხელით დაიხურა ვებ-კონსოლის საშუალებით"),
|
||||
("Local keyboard type", "ლოკალური კლავიატურის ტიპი"),
|
||||
("Select local keyboard type", "აირჩიეთ ლოკალური კლავიატურის ტიპი"),
|
||||
("software_render_tip", "თუ გაქვთ Nvidia ვიდეობარათი და დისტანციური ფანჯარა იხურება დაკავშირებისთანავე, შეიძლება დაგეხმაროთ Nouveau დრაივერის დაყენება და პროგრამული ვიზუალიზაციის არჩევა. საჭირო იქნება გადატვირთვა."),
|
||||
("Always use software rendering", "ყოველთვის გამოიყენეთ პროგრამული ვიზუალიზაცია"),
|
||||
("config_input", "დისტანციური სამუშაო მაგიდის კლავიატურით სამართავად, საჭიროა RustDesk-ისთვის \"შეყვანის მონიტორინგის\" უფლების მინიჭება."),
|
||||
("config_microphone", "დისტანციურ მხარესთან სასაუბროდ, საჭიროა RustDesk-ისთვის \"აუდიოს ჩაწერის\" უფლების მინიჭება."),
|
||||
("request_elevation_tip", "ასევე შეგიძლიათ მოითხოვოთ უფლებების აწევა, თუ ვინმე არის დისტანციურ მხარეს."),
|
||||
("Wait", "დაელოდეთ"),
|
||||
("Elevation Error", "უფლებების აწევის შეცდომა"),
|
||||
("Ask the remote user for authentication", "მოითხოვეთ ავთენტიფიკაცია დისტანციური მომხმარებლისგან"),
|
||||
("Choose this if the remote account is administrator", "აირჩიეთ ეს, თუ დისტანციური ანგარიში ადმინისტრატორია"),
|
||||
("Transmit the username and password of administrator", "ადმინისტრატორის სახელის და პაროლის გადაცემა"),
|
||||
("still_click_uac_tip", "კვლავ საჭიროა, რომ დისტანციურმა მომხმარებელმა დააჭიროს \"OK\"-ს UAC ფანჯარაში RustDesk-ის გაშვებისას."),
|
||||
("Request Elevation", "უფლებების აწევის მოთხოვნა"),
|
||||
("wait_accept_uac_tip", "დაელოდეთ, სანამ დისტანციური მომხმარებელი დაადასტურებს UAC მოთხოვნას."),
|
||||
("Elevate successfully", "უფლებები წარმატებით აიწია"),
|
||||
("uppercase", "დიდი ასოები"),
|
||||
("lowercase", "პატარა ასოები"),
|
||||
("digit", "ციფრები"),
|
||||
("special character", "სპეციალური სიმბოლოები"),
|
||||
("length>=8", "8+ სიმბოლო"),
|
||||
("Weak", "სუსტი"),
|
||||
("Medium", "საშუალო"),
|
||||
("Strong", "ძლიერი"),
|
||||
("Switch Sides", "მხარეების გადართვა"),
|
||||
("Please confirm if you want to share your desktop?", "ადასტურებთ, რომ გსურთ სამუშაო მაგიდის გაზიარება?"),
|
||||
("Display", "ეკრანი"),
|
||||
("Default View Style", "ნაგულისხმევი ჩვენების სტილი"),
|
||||
("Default Scroll Style", "ნაგულისხმევი გადაადგილების სტილი"),
|
||||
("Default Image Quality", "ნაგულისხმევი გამოსახულების ხარისხი"),
|
||||
("Default Codec", "ნაგულისხმევი კოდეკი"),
|
||||
("Bitrate", "ბიტრეიტი"),
|
||||
("FPS", "კადრების სიხშირე"),
|
||||
("Auto", "ავტო"),
|
||||
("Other Default Options", "სხვა ნაგულისხმევი პარამეტრები"),
|
||||
("Voice call", "ხმოვანი ზარი"),
|
||||
("Text chat", "ტექსტური ჩატი"),
|
||||
("Stop voice call", "ხმოვანი ზარის დასრულება"),
|
||||
("relay_hint_tip", "პირდაპირი კავშირი შეიძლება შეუძლებელი იყოს. ამ შემთხვევაში შეგიძლიათ სცადოთ რეტრანსლატორის გავლით დაკავშირება.\nასევე, თუ გსურთ პირდაპირ რეტრანსლატორის გამოყენება, შეგიძლიათ დაამატოთ ID-ს სუფიქსი \"/r\" ან ჩართოთ \"ყოველთვის დაუკავშირდით რეტრანსლატორის გავლით\" დისტანციური კვანძის პარამეტრებში."),
|
||||
("Reconnect", "ხელახლა დაკავშირება"),
|
||||
("Codec", "კოდეკი"),
|
||||
("Resolution", "გარჩევადობა"),
|
||||
("No transfers in progress", "გადაცემა არ მიმდინარეობს"),
|
||||
("Set one-time password length", "ერთჯერადი პაროლის სიგრძის დაყენება"),
|
||||
("RDP Settings", "RDP პარამეტრები"),
|
||||
("Sort by", "სორტირება"),
|
||||
("New Connection", "ახალი კავშირი"),
|
||||
("Restore", "აღდგენა"),
|
||||
("Minimize", "ჩაკეცვა"),
|
||||
("Maximize", "გაშლა"),
|
||||
("Your Device", "თქვენი მოწყობილობა"),
|
||||
("empty_recent_tip", "არ არის ბოლო სესიები!\nდროა დაგეგმოთ ახალი."),
|
||||
("empty_favorite_tip", "ჯერ არ გაქვთ რჩეული დისტანციური კვანძები?\nმოდით, ვნახოთ, ვის შეიძლება დავამატოთ რჩეულებში!"),
|
||||
("empty_lan_tip", "დისტანციური კვანძები ვერ მოიძებნა."),
|
||||
("empty_address_book_tip", "მისამართების წიგნში არ არის დისტანციური კვანძები."),
|
||||
("eg: admin", "მაგ: admin"),
|
||||
("Empty Username", "ცარიელი მომხმარებლის სახელი"),
|
||||
("Empty Password", "ცარიელი პაროლი"),
|
||||
("Me", "მე"),
|
||||
("identical_file_tip", "ფაილი იდენტურია დისტანციურ კვანძზე არსებული ფაილის"),
|
||||
("show_monitors_tip", "მონიტორების ჩვენება ხელსაწყოთა პანელზე"),
|
||||
("View Mode", "ნახვის რეჟიმი"),
|
||||
("login_linux_tip", "X სამუშაო მაგიდის სესიის ჩასართავად, საჭიროა დისტანციურ Linux ანგარიშში შესვლა."),
|
||||
("verify_rustdesk_password_tip", "დაადასტურეთ RustDesk-ის პაროლი"),
|
||||
("remember_account_tip", "დაიმახსოვრეთ ეს ანგარიში"),
|
||||
("os_account_desk_tip", "ეს ანგარიში გამოიყენება დისტანციურ ოპერაციულ სისტემაში შესასვლელად და headless რეჟიმში სამუშაო მაგიდის სესიის ჩასართავად."),
|
||||
("OS Account", "ოპერაციული სისტემის ანგარიში"),
|
||||
("another_user_login_title_tip", "სხვა მომხმარებელი უკვე შესულია სისტემაში"),
|
||||
("another_user_login_text_tip", "გათიშვა"),
|
||||
("xorg_not_found_title_tip", "Xorg ვერ მოიძებნა"),
|
||||
("xorg_not_found_text_tip", "დააინსტალირეთ Xorg"),
|
||||
("no_desktop_title_tip", "სამუშაო მაგიდა არ არის ხელმისაწვდომი"),
|
||||
("no_desktop_text_tip", "დააინსტალირეთ GNOME Desktop"),
|
||||
("No need to elevate", "უფლებების აწევა არ არის საჭირო"),
|
||||
("System Sound", "სისტემური ხმა"),
|
||||
("Default", "ნაგულისხმევი"),
|
||||
("New RDP", "ახალი RDP"),
|
||||
("Fingerprint", "ანაბეჭდი"),
|
||||
("Copy Fingerprint", "ანაბეჭდის კოპირება"),
|
||||
("no fingerprints", "ანაბეჭდები არ არის"),
|
||||
("Select a peer", "აირჩიეთ დისტანციური კვანძი"),
|
||||
("Select peers", "აირჩიეთ დისტანციური კვანძები"),
|
||||
("Plugins", "დანამატები"),
|
||||
("Uninstall", "წაშლა"),
|
||||
("Update", "განახლება"),
|
||||
("Enable", "ჩართვა"),
|
||||
("Disable", "გამორთვა"),
|
||||
("Options", "პარამეტრები"),
|
||||
("resolution_original_tip", "საწყისი გარჩევადობა"),
|
||||
("resolution_fit_local_tip", "ლოკალური გარჩევადობის შესაბამისი"),
|
||||
("resolution_custom_tip", "მორგებული გარჩევადობა"),
|
||||
("Collapse toolbar", "ხელსაწყოთა პანელის ჩაკეცვა"),
|
||||
("Accept and Elevate", "მიღება და უფლებების აწევა"),
|
||||
("accept_and_elevate_btn_tooltip", "კავშირის დაშვება და UAC უფლებების აწევა."),
|
||||
("clipboard_wait_response_timeout_tip", "გაცვლის ბუფერის კოპირების ლოდინის დრო ამოიწურა"),
|
||||
("Incoming connection", "შემომავალი კავშირი"),
|
||||
("Outgoing connection", "გამავალი კავშირი"),
|
||||
("Exit", "გასვლა"),
|
||||
("Open", "გახსნა"),
|
||||
("logout_tip", "ნამდვილად გსურთ გასვლა?"),
|
||||
("Service", "სერვისი"),
|
||||
("Start", "გაშვება"),
|
||||
("Stop", "შეჩერება"),
|
||||
("exceed_max_devices", "მიღწეულია სამართავი მოწყობილობების მაქსიმალური რაოდენობა."),
|
||||
("Sync with recent sessions", "ბოლო სესიების სინქრონიზაცია"),
|
||||
("Sort tags", "ტეგების სორტირება"),
|
||||
("Open connection in new tab", "კავშირის გახსნა ახალ ჩანართში"),
|
||||
("Move tab to new window", "ჩანართის გადატანა ახალ ფანჯარაში"),
|
||||
("Can not be empty", "არ შეიძლება იყოს ცარიელი"),
|
||||
("Already exists", "უკვე არსებობს"),
|
||||
("Change Password", "პაროლის შეცვლა"),
|
||||
("Refresh Password", "პაროლის განახლება"),
|
||||
("ID", "ID"),
|
||||
("Grid View", "ბადე"),
|
||||
("List View", "სია"),
|
||||
("Select", "არჩევა"),
|
||||
("Toggle Tags", "ტეგების გადართვა"),
|
||||
("pull_ab_failed_tip", "მისამართების წიგნის განახლება შეუძლებელია"),
|
||||
("push_ab_failed_tip", "მისამართების წიგნის სერვერთან სინქრონიზაცია შეუძლებელია"),
|
||||
("synced_peer_readded_tip", "ბოლო სესიებში არსებული მოწყობილობები დასინქრონიზდება მისამართების წიგნში."),
|
||||
("Change Color", "ფერის შეცვლა"),
|
||||
("Primary Color", "ძირითადი ფერი"),
|
||||
("HSV Color", "HSV ფერი"),
|
||||
("Installation Successful!", "ინსტალაცია წარმატებით დასრულდა!"),
|
||||
("Installation failed!", "ინსტალაცია ვერ განხორციელდა!"),
|
||||
("Reverse mouse wheel", "მაუსის ბორბლის რევერსირება"),
|
||||
("{} sessions", "{} სესია"),
|
||||
("scam_title", "თქვენ შეიძლება გაცურონ!"),
|
||||
("scam_text1", "თუ ტელეფონით ესაუბრებით ვინმეს, ვისაც არ იცნობთ და არ ენდობით, და ის გთხოვთ გამოიყენოთ RustDesk და გაუშვათ მისი სერვისი, არ გააგრძელოთ და დაუყოვნებლივ შეწყვიტეთ საუბარი."),
|
||||
("scam_text2", "სავარაუდოდ, ეს არის თაღლითი, რომელიც ცდილობს მოიპაროს თქვენი ფული ან სხვა პირადი ინფორმაცია."),
|
||||
("Don't show again", "აღარ აჩვენოთ"),
|
||||
("I Agree", "ვეთანხმები"),
|
||||
("Decline", "უარყოფა"),
|
||||
("Timeout in minutes", "ლოდინის დრო (წუთები)"),
|
||||
("auto_disconnect_option_tip", "ავტომატურად დახუროს შემომავალი სესიები მომხმარებლის არააქტიურობისას"),
|
||||
("Connection failed due to inactivity", "კავშირი ვერ განხორციელდა არააქტიურობის გამო"),
|
||||
("Check for software update on startup", "პროგრამის განახლების შემოწმება გაშვებისას"),
|
||||
("upgrade_rustdesk_server_pro_to_{}_tip", "განაახლეთ RustDesk Server Pro ვერსიამდე {} ან უფრო ახალი!"),
|
||||
("pull_group_failed_tip", "ჯგუფის განახლება შეუძლებელია"),
|
||||
("Filter by intersection", "ფილტრაცია გადაკვეთით"),
|
||||
("Remove wallpaper during incoming sessions", "სამუშაო მაგიდის ფონის დამალვა შემომავალი სესიის დროს"),
|
||||
("Test", "ტესტი"),
|
||||
("display_is_plugged_out_msg", "ეკრანი გამორთულია, გადართეთ პირველ ეკრანზე."),
|
||||
("No displays", "ეკრანები არ არის"),
|
||||
("Open in new window", "ახალ ფანჯარაში გახსნა"),
|
||||
("Show displays as individual windows", "ეკრანების ცალკეულ ფანჯრებში ჩვენება"),
|
||||
("Use all my displays for the remote session", "ყველა ჩემი ეკრანის გამოყენება დისტანციური სესიისთვის"),
|
||||
("selinux_tip", "თქვენს მოწყობილობაზე ჩართულია SELinux, რამაც შეიძლება ხელი შეუშალოს RustDesk-ის სწორ მუშაობას მართულ მხარეზე."),
|
||||
("Change view", "ხედი"),
|
||||
("Big tiles", "დიდი ხატულები"),
|
||||
("Small tiles", "პატარა ხატულები"),
|
||||
("List", "სია"),
|
||||
("Virtual display", "ვირტუალური ეკრანი"),
|
||||
("Plug out all", "ყველას გამორთვა"),
|
||||
("True color (4:4:4)", "True color (4:4:4)"),
|
||||
("Enable blocking user input", "მომხმარებლის შეყვანის დაბლოკვის დაშვება"),
|
||||
("id_input_tip", "შეგიძლიათ შეიყვანოთ იდენტიფიკატორი, პირდაპირი IP მისამართი ან დომენი პორტით (<დომენი>:<პორტი>).\nთუ გჭირდებათ წვდომა მოწყობილობაზე სხვა სერვერზე, დაამატეთ სერვერის მისამართი (<id>@<სერვერის_მისამართი>?key=<გასაღების_მნიშვნელობა>), მაგალითად:\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nთუ გჭირდებათ წვდომა მოწყობილობაზე საჯარო სერვერზე, შეიყვანეთ \"<id>@public\", გასაღები საჯარო სერვერისთვის არ არის საჭირო."),
|
||||
("privacy_mode_impl_mag_tip", "რეჟიმი 1"),
|
||||
("privacy_mode_impl_virtual_display_tip", "რეჟიმი 2"),
|
||||
("Enter privacy mode", "კონფიდენციალურობის რეჟიმის ჩართვა"),
|
||||
("Exit privacy mode", "კონფიდენციალურობის რეჟიმის გამორთვა"),
|
||||
("idd_not_support_under_win10_2004_tip", "არაპირდაპირი ჩვენების დრაივერი არ არის მხარდაჭერილი. საჭიროა Windows 10 ვერსია 2004 ან უფრო ახალი."),
|
||||
("input_source_1_tip", "შეყვანის წყარო 1"),
|
||||
("input_source_2_tip", "შეყვანის წყარო 2"),
|
||||
("Swap control-command key", "Ctrl და Command ღილაკების მნიშვნელობების გაცვლა"),
|
||||
("swap-left-right-mouse", "მაუსის მარცხენა და მარჯვენა ღილაკების მნიშვნელობების გაცვლა"),
|
||||
("2FA code", "ორფაქტორიანი ავთენტიფიკაციის კოდი"),
|
||||
("More", "მეტი"),
|
||||
("enable-2fa-title", "ორფაქტორიანი ავთენტიფიკაციის გამოყენება"),
|
||||
("enable-2fa-desc", "მოაწყვეთ ავთენტიფიკაციის აპლიკაცია. გამოიყენეთ, მაგალითად, Authy, Microsoft ან Google Authenticator ტელეფონზე ან კომპიუტერზე.\n\nდაასკანერეთ QR კოდი ავთენტიფიკაციის აპლიკაციით და შეიყვანეთ კოდი, რომელიც გამოჩნდება ამ აპლიკაციაში, ორფაქტორიანი ავთენტიფიკაციის ჩასართავად."),
|
||||
("wrong-2fa-code", "კოდის დადასტურება შეუძლებელია. შეამოწმეთ კოდი და ადგილობრივი დროის პარამეტრები."),
|
||||
("enter-2fa-title", "ორფაქტორიანი ავთენტიფიკაცია"),
|
||||
("Email verification code must be 6 characters.", "ელ-ფოსტის დადასტურების კოდი უნდა შედგებოდეს 6 სიმბოლოსგან."),
|
||||
("2FA code must be 6 digits.", "ორფაქტორიანი ავთენტიფიკაციის კოდი უნდა შედგებოდეს 6 ციფრისგან."),
|
||||
("Multiple Windows sessions found", "აღმოჩენილია Windows-ის რამდენიმე სესია"),
|
||||
("Please select the session you want to connect to", "აირჩიეთ სესია, რომელთანაც გსურთ დაკავშირება"),
|
||||
("powered_by_me", "RustDesk-ზე დაფუძნებული"),
|
||||
("outgoing_only_desk_tip", "ეს სპეციალიზებული ვერსიაა.\nშეგიძლიათ დაუკავშირდეთ სხვა მოწყობილობებს, მაგრამ სხვა მოწყობილობებს არ შეუძლიათ დაუკავშირდნენ თქვენსას."),
|
||||
("preset_password_warning", "ეს სპეციალიზებული ვერსიაა წინასწარ დაყენებული პაროლით. ნებისმიერს, ვინც იცის ეს პაროლი, შეუძლია მიიღოს სრული კონტროლი თქვენს მოწყობილობაზე. თუ ეს თქვენთვის მოულოდნელია, დაუყოვნებლივ წაშალეთ ეს პროგრამული უზრუნველყოფა."),
|
||||
("Security Alert", "უსაფრთხოების გაფრთხილება"),
|
||||
("My address book", "ჩემი მისამართების წიგნი"),
|
||||
("Personal", "პირადი"),
|
||||
("Owner", "მფლობელი"),
|
||||
("Set shared password", "საზიარო პაროლის დაყენება"),
|
||||
("Exist in", "არსებობს"),
|
||||
("Read-only", "მხოლოდ წაკითხვა"),
|
||||
("Read/Write", "წაკითხვა და ჩაწერა"),
|
||||
("Full Control", "სრული კონტროლი"),
|
||||
("share_warning_tip", "ზემოთ მოცემული ველები საზიაროა და ხილულია სხვებისთვის."),
|
||||
("Everyone", "ყველა"),
|
||||
("ab_web_console_tip", "მეტი ვებ-კონსოლში"),
|
||||
("allow-only-conn-window-open-tip", "დაშვება მხოლოდ მაშინ, როცა RustDesk-ის ფანჯარა გახსნილია"),
|
||||
("no_need_privacy_mode_no_physical_displays_tip", "ფიზიკური ეკრანები არ არის, არ არის საჭირო კონფიდენციალურობის რეჟიმის გამოყენება."),
|
||||
("Follow remote cursor", "დისტანციური კურსორის მიყოლა"),
|
||||
("Follow remote window focus", "დისტანციური ფანჯრის ფოკუსის მიყოლა"),
|
||||
("default_proxy_tip", "ნაგულისხმევი პროტოკოლი და პორტი: Socks5 და 1080"),
|
||||
("no_audio_input_device_tip", "აუდიო შეყვანის მოწყობილობა ვერ მოიძებნა."),
|
||||
("Incoming", "შემომავალი"),
|
||||
("Outgoing", "გამავალი"),
|
||||
("Clear Wayland screen selection", "Wayland ეკრანის არჩევანის გაუქმება"),
|
||||
("clear_Wayland_screen_selection_tip", "გაუქმების შემდეგ შეგიძლიათ ხელახლა აირჩიოთ ეკრანი გასაზიარებლად."),
|
||||
("confirm_clear_Wayland_screen_selection_tip", "გავაუქმოთ Wayland ეკრანის არჩევანი?"),
|
||||
("android_new_voice_call_tip", "მიღებულია ახალი ხმოვანი ზარის მოთხოვნა. თუ მიიღებთ, ხმა გადაირთვება ხმოვან კავშირზე."),
|
||||
("texture_render_tip", "გამოიყენეთ ტექსტურების ვიზუალიზაცია გამოსახულებების უფრო გლუვად გასაკეთებლად."),
|
||||
("Use texture rendering", "ტექსტურების ვიზუალიზაცია"),
|
||||
("Floating window", "მოტივტივე ფანჯარა"),
|
||||
("floating_window_tip", "ეხმარება RustDesk-ის ფონური სერვისის შენარჩუნებას"),
|
||||
("Keep screen on", "ეკრანის ჩართულად შენარჩუნება"),
|
||||
("Never", "არასდროს"),
|
||||
("During controlled", "მართვისას"),
|
||||
("During service is on", "სერვისის მუშაობისას"),
|
||||
("Capture screen using DirectX", "ეკრანის გადაღება DirectX-ის გამოყენებით"),
|
||||
("Back", "უკან"),
|
||||
("Apps", "აპლიკაციები"),
|
||||
("Volume up", "ხმის გაზრდა"),
|
||||
("Volume down", "ხმის შემცირება"),
|
||||
("Power", "კვება"),
|
||||
("Telegram bot", "Telegram ბოტი"),
|
||||
("enable-bot-tip", "თუ ჩართულია, შეგიძლიათ მიიღოთ ორფაქტორიანი ავთენტიფიკაციის კოდი ბოტისგან. მას ასევე შეუძლია შეასრულოს დაკავშირების შეტყობინების ფუნქცია."),
|
||||
("enable-bot-desc", "1) გახსენით ჩატი @BotFather-თან.\n2) გაგზავნეთ ბრძანება \"/newbot\". ამ ნაბიჯის შესრულების შემდეგ მიიღებთ ტოკენს.\n3) დაიწყეთ ჩატი თქვენს ახლად შექმნილ ბოტთან. გაგზავნეთ შეტყობინება, რომელიც იწყება დახრილი ხაზით (\"/\"), მაგალითად, \"/hello\", მის გასააქტიურებლად.\n"),
|
||||
("cancel-2fa-confirm-tip", "გამოვრთოთ ორფაქტორიანი ავთენტიფიკაცია?"),
|
||||
("cancel-bot-confirm-tip", "გამოვრთოთ Telegram ბოტი?"),
|
||||
("About RustDesk", "RustDesk-ის შესახებ"),
|
||||
("Send clipboard keystrokes", "გაცვლის ბუფერიდან კლავიშების დაჭერის გაგზავნა"),
|
||||
("network_error_tip", "შეამოწმეთ ქსელთან კავშირი, შემდეგ დააჭირეთ \"განმეორება\"."),
|
||||
("Unlock with PIN", "PIN-კოდით განბლოკვა"),
|
||||
("Requires at least {} characters", "საჭიროა მინიმუმ {} სიმბოლო"),
|
||||
("Wrong PIN", "არასწორი PIN-კოდი"),
|
||||
("Set PIN", "PIN-კოდის დაყენება"),
|
||||
("Enable trusted devices", "სანდო მოწყობილობების ჩართვა"),
|
||||
("Manage trusted devices", "სანდო მოწყობილობების მართვა"),
|
||||
("Platform", "პლატფორმა"),
|
||||
("Days remaining", "დარჩენილი დღეები"),
|
||||
("enable-trusted-devices-tip", "სანდო მოწყობილობებს შეუძლიათ გამოტოვონ 2FA ავთენტიფიკაციის შემოწმება"),
|
||||
("Parent directory", "მშობელი საქაღალდე"),
|
||||
("Resume", "გაგრძელება"),
|
||||
("Invalid file name", "არასწორი ფაილის სახელი"),
|
||||
("one-way-file-transfer-tip", "მართულ მხარეზე ჩართულია ცალმხრივი ფაილების გადაცემა."),
|
||||
("Authentication Required", "საჭიროა ავთენტიფიკაცია"),
|
||||
("Authenticate", "ავთენტიფიკაცია"),
|
||||
("web_id_input_tip", "შეგიძლიათ შეიყვანოთ ID იმავე სერვერზე, პირდაპირი IP წვდომა ვებ-კლიენტში არ არის მხარდაჭერილი.\nთუ გსურთ წვდომა მოწყობილობაზე სხვა სერვერზე, დაამატეთ სერვერის მისამართი (<id>@<სერვერის_მისამართი>?key=<გასაღები>), მაგალითად,\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nთუ გსურთ წვდომა მოწყობილობაზე საჯარო სერვერზე, შეიყვანეთ \"<id>@public\", საჯარო სერვერისთვის გასაღები არ არის საჭირო."),
|
||||
("Download", "ჩამოტვირთვა"),
|
||||
("Upload folder", "საქაღალდის ატვირთვა"),
|
||||
("Upload files", "ფაილების ატვირთვა"),
|
||||
("Clipboard is synchronized", "გაცვლის ბუფერი სინქრონიზებულია"),
|
||||
("Update client clipboard", "კლიენტის გაცვლის ბუფერის განახლება"),
|
||||
("Untagged", "უტეგო"),
|
||||
("new-version-of-{}-tip", "ხელმისაწვდომია ახალი ვერსია {}"),
|
||||
("Accessible devices", "ხელმისაწვდომი მოწყობილობები"),
|
||||
("View camera", "კამერის ნახვა"),
|
||||
("upgrade_remote_rustdesk_client_to_{}_tip", "განაახლეთ RustDesk კლიენტი ვერსიამდე {} ან უფრო ახალი დისტანციურ მხარეზე!"),
|
||||
("view_camera_unsupported_tip", "დისტანციური მოწყობილობა არ უჭერს მხარს კამერის ნახვას."),
|
||||
("Enable camera", "კამერის ჩართვა"),
|
||||
("No cameras", "კამერა არ არის"),
|
||||
("d3d_render_tip", "D3D ვიზუალიზაციის ჩართვისას ზოგიერთ მოწყობილობაზე დისტანციური ეკრანი შეიძლება იყოს შავი."),
|
||||
("Use D3D rendering", "D3D ვიზუალიზაციის გამოყენება"),
|
||||
("Printer", "პრინტერი"),
|
||||
("printer-os-requirement-tip", "პრინტერთან გამავალი კავშირის ფუნქციისთვის საჭიროა Windows 10 ან უფრო ახალი ვერსია."),
|
||||
("printer-requires-installed-{}-client-tip", "დისტანციური ბეჭდვის გამოსაყენებლად, {} უნდა იყოს დაინსტალირებული ამ მოწყობილობაზე."),
|
||||
("printer-{}-not-installed-tip", "პრინტერი {} არ არის დაინსტალირებული."),
|
||||
("printer-{}-ready-tip", "პრინტერი {} დაინსტალირებულია და მზად არის გამოსაყენებლად."),
|
||||
("Install {} Printer", "დააინსტალირეთ პრინტერი {}"),
|
||||
("Outgoing Print Jobs", "გამავალი ბეჭდვის დავალება"),
|
||||
("Incoming Print Jobs", "შემომავალი ბეჭდვის დავალება"),
|
||||
("Incoming Print Job", "შემომავალი ბეჭდვის დავალება"),
|
||||
("use-the-default-printer-tip", "ნაგულისხმევი პრინტერის გამოყენება"),
|
||||
("use-the-selected-printer-tip", "არჩეული პრინტერის გამოყენება"),
|
||||
("auto-print-tip", "ავტომატურად დაბეჭდეთ არჩეულ პრინტერზე."),
|
||||
("print-incoming-job-confirm-tip", "დისტანციური მოწყობილობიდან მიღებულია ბეჭდვის დავალება. გავუშვათ ლოკალურად?"),
|
||||
("remote-printing-disallowed-tile-tip", "დისტანციური ბეჭდვა აკრძალულია"),
|
||||
("remote-printing-disallowed-text-tip", "მართულ მხარეზე უფლებების პარამეტრები კრძალავს დისტანციურ ბეჭდვას."),
|
||||
("save-settings-tip", "პარამეტრების შენახვა"),
|
||||
("dont-show-again-tip", "აღარ აჩვენოთ"),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
487
src/lang/he.rs
487
src/lang/he.rs
@@ -2,161 +2,161 @@ lazy_static::lazy_static! {
|
||||
pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
[
|
||||
("Status", "מצב"),
|
||||
("Your Desktop", ""),
|
||||
("Your Desktop", "שולחן העבודה שלך"),
|
||||
("desk_tip", "ניתן לגשת לשולחן העבודה שלך עם מזהה וסיסמה זו."),
|
||||
("Password", "סיסמא"),
|
||||
("Ready", "מוכן"),
|
||||
("Established", ""),
|
||||
("Established", "הוקם"),
|
||||
("connecting_status", "מתחבר לרשת RustDesk..."),
|
||||
("Enable service", ""),
|
||||
("Enable service", "הפעל שירות"),
|
||||
("Start service", "התחל שירות"),
|
||||
("Service is running", "השירות פעיל"),
|
||||
("Service is not running", ""),
|
||||
("Service is not running", "השירות איננו רץ"),
|
||||
("not_ready_status", "לא מוכן. בדוק את החיבור שלך"),
|
||||
("Control Remote Desktop", ""),
|
||||
("Transfer file", ""),
|
||||
("Connect", ""),
|
||||
("Recent sessions", ""),
|
||||
("Address book", ""),
|
||||
("Confirmation", ""),
|
||||
("TCP tunneling", ""),
|
||||
("Control Remote Desktop", "שלוט בשולחן עבודה מרוחק"),
|
||||
("Transfer file", "העבר קובץ"),
|
||||
("Connect", "התחבר"),
|
||||
("Recent sessions", "הפעלות אחרונות"),
|
||||
("Address book", "ספר כתובות"),
|
||||
("Confirmation", "אישור"),
|
||||
("TCP tunneling", "מנהור TCP"),
|
||||
("Remove", "הסר"),
|
||||
("Refresh random password", ""),
|
||||
("Set your own password", ""),
|
||||
("Enable keyboard/mouse", ""),
|
||||
("Enable clipboard", ""),
|
||||
("Enable file transfer", ""),
|
||||
("Enable TCP tunneling", ""),
|
||||
("IP Whitelisting", ""),
|
||||
("ID/Relay Server", "שרת מזהה/ריליי"),
|
||||
("Import server config", ""),
|
||||
("Export Server Config", ""),
|
||||
("Import server configuration successfully", ""),
|
||||
("Export server configuration successfully", ""),
|
||||
("Invalid server configuration", ""),
|
||||
("Clipboard is empty", ""),
|
||||
("Refresh random password", "רענן סיסמה אקראית"),
|
||||
("Set your own password", "הגדר סיסמה משלך"),
|
||||
("Enable keyboard/mouse", "אפשר מקלדת/עכבר"),
|
||||
("Enable clipboard", "אפשר לוח גזירים"),
|
||||
("Enable file transfer", "אפשר העברת קבצים"),
|
||||
("Enable TCP tunneling", "הפעל מנהור TCP"),
|
||||
("IP Whitelisting", "רשימת IP מורשים"),
|
||||
("ID/Relay Server", "שרת זיהוי וממסר"),
|
||||
("Import server config", "ייבוא קונפיגורצית שרת"),
|
||||
("Export Server Config", "ייצוא קונפיגורצית שרת"),
|
||||
("Import server configuration successfully", "ייבוא קונפיגורצית הושלם בהצלחה"),
|
||||
("Export server configuration successfully", "ייצוא קונפיגורצית שרת הושלם בהצלחה"),
|
||||
("Invalid server configuration", "קונפיגורצית שרת לא תקינה"),
|
||||
("Clipboard is empty", "הקליפבורד ריק"),
|
||||
("Stop service", "עצור שירות"),
|
||||
("Change ID", ""),
|
||||
("Your new ID", ""),
|
||||
("length %min% to %max%", ""),
|
||||
("starts with a letter", ""),
|
||||
("allowed characters", ""),
|
||||
("Change ID", "שנה מזהה"),
|
||||
("Your new ID", "המזהה החדש שלך"),
|
||||
("length %min% to %max%", "אורך בין %min% ל %max%"),
|
||||
("starts with a letter", "מתחיל באות"),
|
||||
("allowed characters", "תווים מותרים"),
|
||||
("id_change_tip", "מותרים רק תווים a-z, A-Z, 0-9, - (dash) ו_ (קו תחתון). האות הראשונה חייבת להיות a-z, A-Z. אורך בין 6 ל-16."),
|
||||
("Website", "דף הבית"),
|
||||
("About", "אודות"),
|
||||
("Slogan_tip", "נוצר בלב בעולם הזה הכאוטי!"),
|
||||
("Privacy Statement", ""),
|
||||
("Slogan_tip", "נוצר בלב בעולם הכאוטי הזה!"),
|
||||
("Privacy Statement", "הצהרת פרטיות"),
|
||||
("Mute", "השתק"),
|
||||
("Build Date", "תאריך בנייה"),
|
||||
("Version", ""),
|
||||
("Version", "גרסה"),
|
||||
("Home", "בית"),
|
||||
("Audio Input", "קלט שמע"),
|
||||
("Enhancements", ""),
|
||||
("Hardware Codec", "קודק חומרה"),
|
||||
("Adaptive bitrate", ""),
|
||||
("ID Server", "שרת מזהה"),
|
||||
("Relay Server", "שרת ריליי"),
|
||||
("Enhancements", "שיפורים"),
|
||||
("Hardware Codec", "Codec חומרה"),
|
||||
("Adaptive bitrate", "קצב סיביות משתנה"),
|
||||
("ID Server", "מזהה שרת"),
|
||||
("Relay Server", "שרת ממסר (Relay)"),
|
||||
("API Server", "שרת API"),
|
||||
("invalid_http", "חייב להתחיל עם http:// או https://"),
|
||||
("Invalid IP", ""),
|
||||
("Invalid format", ""),
|
||||
("Invalid IP", "IP לא תקין"),
|
||||
("Invalid format", "פורמט לא תקין"),
|
||||
("server_not_support", "עדיין לא נתמך על ידי השרת"),
|
||||
("Not available", ""),
|
||||
("Too frequent", ""),
|
||||
("Not available", "לא זמין"),
|
||||
("Too frequent", "תדיר מידיי"),
|
||||
("Cancel", "ביטול"),
|
||||
("Skip", "דלג"),
|
||||
("Close", "סגור"),
|
||||
("Retry", "נזה שוב"),
|
||||
("Retry", "נסה שוב"),
|
||||
("OK", "אישור"),
|
||||
("Password Required", "נדרשת סיסמה"),
|
||||
("Please enter your password", ""),
|
||||
("Remember password", ""),
|
||||
("Please enter your password", "אנא הכנס סיסמה"),
|
||||
("Remember password", "זכור סיסמה"),
|
||||
("Wrong Password", "סיסמה שגויה"),
|
||||
("Do you want to enter again?", ""),
|
||||
("Connection Error", "שגיאת חיבור"),
|
||||
("Error", "שגיאה"),
|
||||
("Reset by the peer", ""),
|
||||
("Connecting...", ""),
|
||||
("Connection in progress. Please wait.", ""),
|
||||
("Please try 1 minute later", ""),
|
||||
("Reset by the peer", "איפוס על-ידי הצד השני"),
|
||||
("Connecting...", "מתחבר..."),
|
||||
("Connection in progress. Please wait.", "מתחבר. אנא המתן."),
|
||||
("Please try 1 minute later", "אנא נסה שוב בעוד דקה"),
|
||||
("Login Error", "שגיאת התחברות"),
|
||||
("Successful", ""),
|
||||
("Connected, waiting for image...", ""),
|
||||
("Successful", "הצלחה"),
|
||||
("Connected, waiting for image...", "מחובר, מחכה לתמונה..."),
|
||||
("Name", "שם"),
|
||||
("Type", "סוג"),
|
||||
("Modified", ""),
|
||||
("Modified", "שונה"),
|
||||
("Size", "גודל"),
|
||||
("Show Hidden Files", "הצג קבצים נסתרים"),
|
||||
("Receive", ""),
|
||||
("Receive", "קיבל"),
|
||||
("Send", "שלח"),
|
||||
("Refresh File", "רענן קובץ"),
|
||||
("Local", "מקומי"),
|
||||
("Remote", ""),
|
||||
("Remote", "מרוחק"),
|
||||
("Remote Computer", "מחשב מרוחק"),
|
||||
("Local Computer", "מחשב מקומי"),
|
||||
("Confirm Delete", "אשר מחיקה"),
|
||||
("Delete", "מחק"),
|
||||
("Properties", ""),
|
||||
("Properties", "תכונות"),
|
||||
("Multi Select", "בחירה מרובה"),
|
||||
("Select All", "בחר הכל"),
|
||||
("Unselect All", "בטל בחירת הכל"),
|
||||
("Empty Directory", "תיקייה ריקה"),
|
||||
("Not an empty directory", ""),
|
||||
("Are you sure you want to delete this file?", ""),
|
||||
("Are you sure you want to delete this empty directory?", ""),
|
||||
("Are you sure you want to delete the file of this directory?", ""),
|
||||
("Not an empty directory", "תיקייה אינה ריקה"),
|
||||
("Are you sure you want to delete this file?", "האם אתה בטוח שברצונך למחוק קובץ זה?"),
|
||||
("Are you sure you want to delete this empty directory?", "האם אתה בטוח שברצונך למחוק תיקייה זו?"),
|
||||
("Are you sure you want to delete the file of this directory?", "האם אתה בטוח שברצונך למחוק את הקובץ בתקייה זו?"),
|
||||
("Do this for all conflicts", ""),
|
||||
("This is irreversible!", ""),
|
||||
("Deleting", ""),
|
||||
("This is irreversible!", "בלתי הפיך"),
|
||||
("Deleting", "מוחק"),
|
||||
("files", "קבצים"),
|
||||
("Waiting", ""),
|
||||
("Waiting", "מחכה"),
|
||||
("Finished", "הסתיים"),
|
||||
("Speed", "מהירות"),
|
||||
("Custom Image Quality", "איכות תמונה מותאמת אישית"),
|
||||
("Privacy mode", ""),
|
||||
("Block user input", ""),
|
||||
("Unblock user input", ""),
|
||||
("Privacy mode", "מצב פרטיות"),
|
||||
("Block user input", "חסום קלט משתמש"),
|
||||
("Unblock user input", "אפשר קלט משתמש"),
|
||||
("Adjust Window", "התאם חלון"),
|
||||
("Original", ""),
|
||||
("Shrink", ""),
|
||||
("Stretch", ""),
|
||||
("Original", "מקורי"),
|
||||
("Shrink", "הקטן"),
|
||||
("Stretch", "מתח"),
|
||||
("Scrollbar", ""),
|
||||
("ScrollAuto", ""),
|
||||
("Good image quality", ""),
|
||||
("Balanced", ""),
|
||||
("Good image quality", "איכות תמונה טובה"),
|
||||
("Balanced", "מאוזן"),
|
||||
("Optimize reaction time", ""),
|
||||
("Custom", "מותאם אישית"),
|
||||
("Show remote cursor", ""),
|
||||
("Show remote cursor", "הראה מצביע מרוחק"),
|
||||
("Show quality monitor", ""),
|
||||
("Disable clipboard", ""),
|
||||
("Disable clipboard", "בטל את הקליפבורד"),
|
||||
("Lock after session end", ""),
|
||||
("Insert Ctrl + Alt + Del", ""),
|
||||
("Insert Ctrl + Alt + Del", "לחץ Ctrl + Alt + Delete"),
|
||||
("Insert Lock", "הוסף נעילה"),
|
||||
("Refresh", "רענן"),
|
||||
("ID does not exist", ""),
|
||||
("ID does not exist", "מזהה אינו קיים"),
|
||||
("Failed to connect to rendezvous server", ""),
|
||||
("Please try later", ""),
|
||||
("Please try later", "אנא נסה שוב מאוחר יותר"),
|
||||
("Remote desktop is offline", ""),
|
||||
("Key mismatch", ""),
|
||||
("Key mismatch", "מפתח אינו תואם"),
|
||||
("Timeout", ""),
|
||||
("Failed to connect to relay server", ""),
|
||||
("Failed to connect to relay server", "ההתחברות לשרת הממסר נכשלה"),
|
||||
("Failed to connect via rendezvous server", ""),
|
||||
("Failed to connect via relay server", ""),
|
||||
("Failed to make direct connection to remote desktop", ""),
|
||||
("Failed to connect via relay server", "ההתחברות דרך שרת הממסר נכשלה"),
|
||||
("Failed to make direct connection to remote desktop", "ההתחברות למחשב המרוחק נכשלה"),
|
||||
("Set Password", "הגדר סיסמה"),
|
||||
("OS Password", "סיסמת מערכת הפעלה"),
|
||||
("install_tip", "בגלל UAC, RustDesk לא יכול לפעול כראוי כצד מרוחק בחלק מהמקרים. כדי להימנע מ-UAC, אנא לחץ על הכפתור למטה כדי להתקין את RustDesk במערכת."),
|
||||
("Click to upgrade", ""),
|
||||
("Click to download", ""),
|
||||
("Click to update", ""),
|
||||
("Configure", ""),
|
||||
("Click to upgrade", "לחץ כדי לשדרג"),
|
||||
("Click to download", "לחץ כדי להוריד"),
|
||||
("Click to update", "לחץ כדי לעדכן"),
|
||||
("Configure", "הגדר"),
|
||||
("config_acc", "כדי לשלוט מרחוק בשולחן העבודה שלך, עליך להעניק ל-RustDesk הרשאות \"נגישות\"."),
|
||||
("config_screen", "כדי לגשת מרחוק לשולחן העבודה שלך, עליך להעניק ל-RustDesk הרשאות \"הקלטת מסך\"."),
|
||||
("Installing ...", ""),
|
||||
("Installing ...", "מתקין ..."),
|
||||
("Install", "התקן"),
|
||||
("Installation", ""),
|
||||
("Installation", "התקנה"),
|
||||
("Installation Path", "נתיב התקנה"),
|
||||
("Create start menu shortcuts", ""),
|
||||
("Create start menu shortcuts", "צור קיצור-דרך לתפריט ההתחלה"),
|
||||
("Create desktop icon", ""),
|
||||
("agreement_tip", "על ידי התחלת ההתקנה, אתה מקבל את הסכם הרישיון."),
|
||||
("Accept and Install", "קבל והתקן"),
|
||||
@@ -164,43 +164,43 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Generating ...", "יוצר ..."),
|
||||
("Your installation is lower version.", ""),
|
||||
("not_close_tcp_tip", "אל תסגור חלון זה בזמן שאתה משתמש במנהרה"),
|
||||
("Listening ...", ""),
|
||||
("Listening ...", "מאזין ..."),
|
||||
("Remote Host", "מארח מרוחק"),
|
||||
("Remote Port", "פורט מרוחק"),
|
||||
("Action", ""),
|
||||
("Action", "פעולה"),
|
||||
("Add", "הוסף"),
|
||||
("Local Port", "פורט מקומי"),
|
||||
("Local Address", "כתובת מקומית"),
|
||||
("Change Local Port", "שנה פורט מקומי"),
|
||||
("setup_server_tip", "לחיבור מהיר יותר, אנא הגדר שרת משלך"),
|
||||
("Too short, at least 6 characters.", ""),
|
||||
("The confirmation is not identical.", ""),
|
||||
("Permissions", ""),
|
||||
("Accept", ""),
|
||||
("Too short, at least 6 characters.", "קצר מידיי, לפחות 6 תווים."),
|
||||
("The confirmation is not identical.", "האימות אינו זהה."),
|
||||
("Permissions", "הרשאות"),
|
||||
("Accept", "קבל"),
|
||||
("Dismiss", ""),
|
||||
("Disconnect", ""),
|
||||
("Enable file copy and paste", ""),
|
||||
("Connected", ""),
|
||||
("Direct and encrypted connection", ""),
|
||||
("Disconnect", "נתק"),
|
||||
("Enable file copy and paste", "אפשר העתקה והדבקה עבור קבצים"),
|
||||
("Connected", "מחובר"),
|
||||
("Direct and encrypted connection", "חיבור ישיר ומוצפן"),
|
||||
("Relayed and encrypted connection", ""),
|
||||
("Direct and unencrypted connection", ""),
|
||||
("Direct and unencrypted connection", "חיבור ישיר ולא מוצפן"),
|
||||
("Relayed and unencrypted connection", ""),
|
||||
("Enter Remote ID", "הזן מזהה מרוחק"),
|
||||
("Enter your password", ""),
|
||||
("Enter your password", "הכנס סיסמה"),
|
||||
("Logging in...", ""),
|
||||
("Enable RDP session sharing", ""),
|
||||
("Auto Login", "התחברות אוטומטית (תקפה רק אם הגדרת \"נעל לאחר סיום הסשן\")"),
|
||||
("Enable direct IP access", ""),
|
||||
("Rename", "שנה שם"),
|
||||
("Space", ""),
|
||||
("Space", "רווח"),
|
||||
("Create desktop shortcut", ""),
|
||||
("Change Path", "שנה נתיב"),
|
||||
("Create Folder", "צור תיקייה"),
|
||||
("Please enter the folder name", ""),
|
||||
("Fix it", ""),
|
||||
("Warning", ""),
|
||||
("Please enter the folder name", "אנא הכנס שם תיקייה"),
|
||||
("Fix it", "תקן את זה"),
|
||||
("Warning", "אזהרה"),
|
||||
("Login screen using Wayland is not supported", ""),
|
||||
("Reboot required", ""),
|
||||
("Reboot required", "נדרש אתחול מחדש"),
|
||||
("Unsupported display server", ""),
|
||||
("x11 expected", ""),
|
||||
("Port", "יציאה"),
|
||||
@@ -209,46 +209,46 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Invalid port", ""),
|
||||
("Closed manually by the peer", ""),
|
||||
("Enable remote configuration modification", ""),
|
||||
("Run without install", ""),
|
||||
("Connect via relay", ""),
|
||||
("Always connect via relay", ""),
|
||||
("Run without install", "הרץ ללא התקנה"),
|
||||
("Connect via relay", "התחבר דרך ממסר"),
|
||||
("Always connect via relay", "תמיד תתחבר דרך ממסר"),
|
||||
("whitelist_tip", "רק IP ברשימה הלבנה יכול לגשת אלי"),
|
||||
("Login", ""),
|
||||
("Verify", ""),
|
||||
("Remember me", ""),
|
||||
("Trust this device", ""),
|
||||
("Login", "התחברות"),
|
||||
("Verify", "אמת"),
|
||||
("Remember me", "זכור אותי"),
|
||||
("Trust this device", "סמוך על מכשיר זה"),
|
||||
("Verification code", ""),
|
||||
("verification_tip", "קוד אימות נשלח לכתובת הדוא\"ל הרשומה, הזן את קוד האימות כדי להמשיך בהתחברות."),
|
||||
("Logout", ""),
|
||||
("Logout", "התנתק"),
|
||||
("Tags", "תגים"),
|
||||
("Search ID", "חפש מזהה"),
|
||||
("whitelist_sep", "מופרד על ידי פסיק, נקודה פסיק, רווחים או שורה חדשה"),
|
||||
("Add ID", "הוסף מזהה"),
|
||||
("Add Tag", "הוסף תג"),
|
||||
("Unselect all tags", ""),
|
||||
("Network error", ""),
|
||||
("Username missed", ""),
|
||||
("Password missed", ""),
|
||||
("Network error", "שגיאת רשת"),
|
||||
("Username missed", "חסר שם משתמש"),
|
||||
("Password missed", "חסרה סיסמה"),
|
||||
("Wrong credentials", "שם משתמש או סיסמה שגויים"),
|
||||
("The verification code is incorrect or has expired", ""),
|
||||
("Edit Tag", "ערוך תג"),
|
||||
("Forget Password", "שכחת סיסמה"),
|
||||
("Favorites", ""),
|
||||
("Favorites", "מועדפים"),
|
||||
("Add to Favorites", "הוסף למועדפים"),
|
||||
("Remove from Favorites", "הסר מהמועדפים"),
|
||||
("Empty", "ריק"),
|
||||
("Invalid folder name", ""),
|
||||
("Invalid folder name", "שם תיקייה אינו תקין"),
|
||||
("Socks5 Proxy", "פרוקסי Socks5"),
|
||||
("Socks5/Http(s) Proxy", "פרוקסי Socks5/Http(s)"),
|
||||
("Discovered", ""),
|
||||
("install_daemon_tip", "לצורך הפעלה בעת הפעלת המחשב, עליך להתקין שירות מערכת."),
|
||||
("Remote ID", ""),
|
||||
("Remote ID", "מזהה מרוחק"),
|
||||
("Paste", "הדבק"),
|
||||
("Paste here?", ""),
|
||||
("Paste here?", "להסביר כאן?"),
|
||||
("Are you sure to close the connection?", "האם אתה בטוח שברצונך לסגור את החיבור?"),
|
||||
("Download new version", ""),
|
||||
("Touch mode", ""),
|
||||
("Mouse mode", ""),
|
||||
("Download new version", "הורד גרסה חדשה"),
|
||||
("Touch mode", "מצב מגע"),
|
||||
("Mouse mode", "מצב עכבר"),
|
||||
("One-Finger Tap", "הקשה באצבע אחת"),
|
||||
("Left Mouse", "עכבר שמאלי"),
|
||||
("One-Long Tap", "הקשה ארוכה באצבע אחת"),
|
||||
@@ -266,18 +266,18 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Reset canvas", ""),
|
||||
("No permission of file transfer", ""),
|
||||
("Note", "הערה"),
|
||||
("Connection", ""),
|
||||
("Connection", "התחברות"),
|
||||
("Share Screen", "שיתוף מסך"),
|
||||
("Chat", "צ'אט"),
|
||||
("Total", "הכל"),
|
||||
("items", ""),
|
||||
("Selected", ""),
|
||||
("items", "פריטים"),
|
||||
("Selected", "נבחר"),
|
||||
("Screen Capture", "לכידת מסך"),
|
||||
("Input Control", "בקרת קלט"),
|
||||
("Audio Capture", "לכידת שמע"),
|
||||
("File Connection", "חיבור קובץ"),
|
||||
("Screen Connection", "חיבור מסך"),
|
||||
("Do you accept?", ""),
|
||||
("Do you accept?", "האם אתה מקבל?"),
|
||||
("Open System Setting", "פתח הגדרת מערכת"),
|
||||
("How to get Android input permission?", ""),
|
||||
("android_input_permission_tip1", "כדי שמכשיר מרוחק יוכל לשלוט במכשיר האנדרואיד שלך באמצעות עכבר או מגע, עליך לאפשר ל-RustDesk להשתמש בשירות \"נגישות\"."),
|
||||
@@ -288,7 +288,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("android_version_audio_tip", "גרסת האנדרואיד הנוכחית אינה תומכת בלכידת שמע, אנא שדרג לאנדרואיד 10 או גבוה יותר."),
|
||||
("android_start_service_tip", "הקש על [התחל שירות] או אפשר הרשאת [לכידת מסך] כדי להתחיל את שירות שיתוף המסך."),
|
||||
("android_permission_may_not_change_tip", "הרשאות עבור חיבורים שנוצרו עשויות לא להשתנות מייד עד להתחברות מחדש."),
|
||||
("Account", ""),
|
||||
("Account", "חשבון"),
|
||||
("Overwrite", ""),
|
||||
("This file exists, skip or overwrite this file?", ""),
|
||||
("Quit", "צא"),
|
||||
@@ -296,38 +296,38 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Failed", "נכשל"),
|
||||
("Succeeded", "הצליח"),
|
||||
("Someone turns on privacy mode, exit", ""),
|
||||
("Unsupported", ""),
|
||||
("Unsupported", "לא נתמח"),
|
||||
("Peer denied", ""),
|
||||
("Please install plugins", ""),
|
||||
("Peer exit", ""),
|
||||
("Failed to turn off", ""),
|
||||
("Turned off", ""),
|
||||
("Language", ""),
|
||||
("Failed to turn off", "הכיבוי נכשל"),
|
||||
("Turned off", "מכובה"),
|
||||
("Language", "שפה"),
|
||||
("Keep RustDesk background service", ""),
|
||||
("Ignore Battery Optimizations", "התעלם מאופטימיזציות סוללה"),
|
||||
("android_open_battery_optimizations_tip", "אם ברצונך לבטל תכונה זו, אנא עבור לדף ההגדרות של יישום RustDesk הבא, מצא והכנס ל[סוללה], הסר את הסימון מ-[לא מוגבל]"),
|
||||
("Start on boot", ""),
|
||||
("Start on boot", "התחל בהפעלה"),
|
||||
("Start the screen sharing service on boot, requires special permissions", ""),
|
||||
("Connection not allowed", ""),
|
||||
("Connection not allowed", "חיבור לא מורשה"),
|
||||
("Legacy mode", ""),
|
||||
("Map mode", ""),
|
||||
("Translate mode", ""),
|
||||
("Use permanent password", ""),
|
||||
("Use both passwords", ""),
|
||||
("Set permanent password", ""),
|
||||
("Enable remote restart", ""),
|
||||
("Restart remote device", ""),
|
||||
("Are you sure you want to restart", ""),
|
||||
("Restarting remote device", ""),
|
||||
("Translate mode", "מצב תרגום"),
|
||||
("Use permanent password", "השתמש בסיסמה קבועה"),
|
||||
("Use both passwords", "השתמש בשתי הסיסמאות"),
|
||||
("Set permanent password", "הגדר סיסמה קבועה"),
|
||||
("Enable remote restart", "אפשר אתחול מרחוק"),
|
||||
("Restart remote device", "אתחל את ההתקן המרוחק"),
|
||||
("Are you sure you want to restart", "האם אתה בטוח שברצונך לאתחל"),
|
||||
("Restarting remote device", "מאתחל את ההתקן המרוחק"),
|
||||
("remote_restarting_tip", "המכשיר המרוחק מתחיל מחדש, אנא סגור את תיבת ההודעה הזו והתחבר מחדש עם סיסמה קבועה לאחר זמן מה"),
|
||||
("Copied", ""),
|
||||
("Copied", "הועתק"),
|
||||
("Exit Fullscreen", "יציאה ממסך מלא"),
|
||||
("Fullscreen", "מסך מלא"),
|
||||
("Mobile Actions", "פעולות ניידות"),
|
||||
("Select Monitor", "בחר מסך"),
|
||||
("Control Actions", "פעולות בקרה"),
|
||||
("Display Settings", "הגדרות תצוגה"),
|
||||
("Ratio", ""),
|
||||
("Ratio", "יחס"),
|
||||
("Image Quality", "איכות תמונה"),
|
||||
("Scroll Style", "סגנון גלילה"),
|
||||
("Show Toolbar", "הצג סרגל כלים"),
|
||||
@@ -345,37 +345,37 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Light Theme", "ערכת נושא בהירה"),
|
||||
("Dark", "כהה"),
|
||||
("Light", "בהיר"),
|
||||
("Follow System", "עקוב אחר המערכת"),
|
||||
("Follow System", "זהה למערכת"),
|
||||
("Enable hardware codec", ""),
|
||||
("Unlock Security Settings", "פתח הגדרות אבטחה"),
|
||||
("Enable audio", ""),
|
||||
("Enable audio", "הפעל שמע"),
|
||||
("Unlock Network Settings", "פתח הגדרות רשת"),
|
||||
("Server", "שרת"),
|
||||
("Direct IP Access", "גישה ישירה ל-IP"),
|
||||
("Proxy", "פרוקסי"),
|
||||
("Apply", "החל"),
|
||||
("Disconnect all devices?", ""),
|
||||
("Disconnect all devices?", "נתק את כל המכשירים?"),
|
||||
("Clear", "נקה"),
|
||||
("Audio Input Device", "מכשיר קלט שמע"),
|
||||
("Use IP Whitelisting", "השתמש ברשימת לבנה של IP"),
|
||||
("Network", ""),
|
||||
("Network", "רשת"),
|
||||
("Pin Toolbar", "נעץ סרגל כלים"),
|
||||
("Unpin Toolbar", "הסר נעיצת סרגל כלים"),
|
||||
("Recording", ""),
|
||||
("Directory", ""),
|
||||
("Automatically record incoming sessions", ""),
|
||||
("Automatically record outgoing sessions", ""),
|
||||
("Recording", "הקלטה"),
|
||||
("Directory", "תיקיה"),
|
||||
("Automatically record incoming sessions", "הקלט אוטומטית הפעלות נכנסות"),
|
||||
("Automatically record outgoing sessions", "הקלט אוטומטית הפעלות יוצאות"),
|
||||
("Change", "שנה"),
|
||||
("Start session recording", ""),
|
||||
("Stop session recording", ""),
|
||||
("Enable recording session", ""),
|
||||
("Enable LAN discovery", ""),
|
||||
("Deny LAN discovery", ""),
|
||||
("Write a message", ""),
|
||||
("Prompt", ""),
|
||||
("Start session recording", "התחל הקלטת הפעלה"),
|
||||
("Stop session recording", "הפסק הקלטת הפעלה"),
|
||||
("Enable recording session", "אפשר הקלטת הפעלה"),
|
||||
("Enable LAN discovery", "אפשר זיהוי ברשת מקומית"),
|
||||
("Deny LAN discovery", "חסום זיהוי ברשת מקומית"),
|
||||
("Write a message", "כתוב הודעה"),
|
||||
("Prompt", "הנחיה"),
|
||||
("Please wait for confirmation of UAC...", ""),
|
||||
("elevated_foreground_window_tip", "החלון הנוכחי של שולחן העבודה המרוחק דורש הרשאה גבוהה יותר לפעולה, לכן אי אפשר להשתמש בעכבר ובמקלדת באופן זמני. תוכל לבקש מהמשתמש המרוחק למזער את החלון הנוכחי, או ללחוץ על כפתור ההגבהה בחלון ניהול החיבור. כדי להימנע מבעיה זו, מומלץ להתקין את התוכנה במכשיר המרוחק."),
|
||||
("Disconnected", ""),
|
||||
("Disconnected", "מנותק"),
|
||||
("Other", "אחר"),
|
||||
("Confirm before closing multiple tabs", ""),
|
||||
("Keyboard Settings", "הגדרות מקלדת"),
|
||||
@@ -388,7 +388,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show RustDesk", ""),
|
||||
("This PC", "מחשב זה"),
|
||||
("or", "או"),
|
||||
("Continue with", ""),
|
||||
("Continue with", "המשך עם"),
|
||||
("Elevate", ""),
|
||||
("Zoom cursor", ""),
|
||||
("Accept sessions via password", ""),
|
||||
@@ -396,20 +396,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept sessions via both", ""),
|
||||
("Please wait for the remote side to accept your session request...", ""),
|
||||
("One-time Password", "סיסמה חד-פעמית"),
|
||||
("Use one-time password", ""),
|
||||
("One-time password length", ""),
|
||||
("Use one-time password", "השתמש בסיסמה חד-פעמית"),
|
||||
("One-time password length", "אורך סיסמה חד-פעמית"),
|
||||
("Request access to your device", ""),
|
||||
("Hide connection management window", ""),
|
||||
("hide_cm_tip", "אפשר הסתרה רק אם מקבלים סשנים דרך סיסמה ומשתמשים בסיסמה קבועה"),
|
||||
("wayland_experiment_tip", "תמיכה ב-Wayland נמצאת בשלב ניסיוני, אנא השתמש ב-X11 אם אתה זקוק לגישה לא מלווה."),
|
||||
("Right click to select tabs", ""),
|
||||
("Skipped", "דולג"),
|
||||
("Add to address book", ""),
|
||||
("Add to address book", "הוסף לספר הכתובות"),
|
||||
("Group", "קבוצה"),
|
||||
("Search", "חפש"),
|
||||
("Closed manually by web console", ""),
|
||||
("Local keyboard type", ""),
|
||||
("Select local keyboard type", ""),
|
||||
("Select local keyboard type", "בחר סוג מקלדת מקומי"),
|
||||
("software_render_tip", "אם אתה משתמש בכרטיס גרפיקה של Nvidia תחת Linux וחלון המרחוק נסגר מיד לאחר החיבור, החלפה למנהל ההתקן הפתוח Nouveau ובחירה בשימוש בעיבוד תוכנה עשויה לעזור. נדרשת הפעלה מחדש של התוכנה."),
|
||||
("Always use software rendering", ""),
|
||||
("config_input", "כדי לשלוט בשולחן העבודה המרוחק באמצעות מקלדת, עליך להעניק ל-RustDesk הרשאות \"מעקב אחרי קלט\"."),
|
||||
@@ -426,12 +426,12 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Elevate successfully", ""),
|
||||
("uppercase", ""),
|
||||
("lowercase", ""),
|
||||
("digit", ""),
|
||||
("special character", ""),
|
||||
("length>=8", ""),
|
||||
("Weak", ""),
|
||||
("Medium", ""),
|
||||
("Strong", ""),
|
||||
("digit", "ספרה"),
|
||||
("special character", "תו מיוחד"),
|
||||
("length>=8", "לפחות באורך 8"),
|
||||
("Weak", "חלש"),
|
||||
("Medium", "בינוני"),
|
||||
("Strong", "חזק"),
|
||||
("Switch Sides", "החלף צדדים"),
|
||||
("Please confirm if you want to share your desktop?", ""),
|
||||
("Display", "תצוגה"),
|
||||
@@ -439,23 +439,23 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Default Scroll Style", "סגנון גלילה ברירת מחדל"),
|
||||
("Default Image Quality", "איכות תמונה ברירת מחדל"),
|
||||
("Default Codec", "קודק ברירת מחדל"),
|
||||
("Bitrate", ""),
|
||||
("Bitrate", "קצב סיביות"),
|
||||
("FPS", "FPS"),
|
||||
("Auto", "אוטומטי"),
|
||||
("Other Default Options", "אפשרויות ברירת מחדל אחרות"),
|
||||
("Voice call", "שיחה קולית"),
|
||||
("Text chat", ""),
|
||||
("Stop voice call", ""),
|
||||
("Stop voice call", "הפסק שיחה קולית"),
|
||||
("relay_hint_tip", "ייתכן שלא ניתן להתחבר ישירות; ניתן לנסות להתחבר דרך ריליי. בנוסף, אם ברצונך להשתמש בריליי בניסיון הראשון שלך, תוכל להוסיף את הסיומת \"/r\" למזהה או לבחור באפשרות \"התחבר תמיד דרך ריליי\" בכרטיס של הסשנים האחרונים אם קיים."),
|
||||
("Reconnect", ""),
|
||||
("Reconnect", "התחברות מחדש"),
|
||||
("Codec", "קודק"),
|
||||
("Resolution", ""),
|
||||
("No transfers in progress", ""),
|
||||
("Set one-time password length", ""),
|
||||
("Resolution", "רזולוציה"),
|
||||
("No transfers in progress", "אין העברות בתהליך"),
|
||||
("Set one-time password length", "הגדר אורך סיסמה חד-פעמית"),
|
||||
("RDP Settings", "הגדרות RDP"),
|
||||
("Sort by", "מיין לפי"),
|
||||
("New Connection", "חיבור חדש"),
|
||||
("Restore", ""),
|
||||
("Restore", "שיחזור"),
|
||||
("Minimize", "הקטן"),
|
||||
("Maximize", "הגדל"),
|
||||
("Your Device", "המכשיר שלך"),
|
||||
@@ -463,10 +463,10 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("empty_favorite_tip", "עדיין אין עמיתים מועדפים?\nבוא נמצא מישהו להתחבר אליו ונוסיף אותו למועדפים!"),
|
||||
("empty_lan_tip", "אוי לא, נראה שעדיין לא גילינו עמיתים."),
|
||||
("empty_address_book_tip", "אוי ואבוי, נראה שכרגע אין עמיתים בספר הכתובות שלך."),
|
||||
("eg: admin", ""),
|
||||
("eg: admin", "לדוגמא: admin"),
|
||||
("Empty Username", "שם משתמש ריק"),
|
||||
("Empty Password", "סיסמה ריקה"),
|
||||
("Me", ""),
|
||||
("Me", "אני"),
|
||||
("identical_file_tip", "קובץ זה זהה לקובץ של העמית."),
|
||||
("show_monitors_tip", "הצג מסכים בסרגל כלים"),
|
||||
("View Mode", "מצב תצוגה"),
|
||||
@@ -485,7 +485,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("System Sound", "צליל מערכת"),
|
||||
("Default", "ברירת מחדל"),
|
||||
("New RDP", "RDP חדש"),
|
||||
("Fingerprint", ""),
|
||||
("Fingerprint", "טביעת אצבע"),
|
||||
("Copy Fingerprint", "העתק טביעת אצבע"),
|
||||
("no fingerprints", "אין טביעות אצבע"),
|
||||
("Select a peer", ""),
|
||||
@@ -503,17 +503,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept and Elevate", "קבל והגבה"),
|
||||
("accept_and_elevate_btn_tooltip", "קבל את החיבור והגבה הרשאות UAC."),
|
||||
("clipboard_wait_response_timeout_tip", "המתנה לתגובת העתקה הסתיימה בזמן."),
|
||||
("Incoming connection", ""),
|
||||
("Outgoing connection", ""),
|
||||
("Incoming connection", "חיבור נכנס"),
|
||||
("Outgoing connection", "חיבור יוצא"),
|
||||
("Exit", "צא"),
|
||||
("Open", "פתח"),
|
||||
("logout_tip", "האם אתה בטוח שברצונך להתנתק?"),
|
||||
("Service", ""),
|
||||
("Service", "שירות"),
|
||||
("Start", "התחל"),
|
||||
("Stop", "עצור"),
|
||||
("exceed_max_devices", "הגעת למספר המקסימלי של מכשירים שניתן לנהל."),
|
||||
("Sync with recent sessions", ""),
|
||||
("Sort tags", ""),
|
||||
("Sort tags", "מיין תגים"),
|
||||
("Open connection in new tab", ""),
|
||||
("Move tab to new window", ""),
|
||||
("Can not be empty", ""),
|
||||
@@ -532,13 +532,13 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Primary Color", "צבע עיקרי"),
|
||||
("HSV Color", "צבע HSV"),
|
||||
("Installation Successful!", "ההתקנה הצליחה!"),
|
||||
("Installation failed!", ""),
|
||||
("Installation failed!", "התקנה נכשלה!"),
|
||||
("Reverse mouse wheel", ""),
|
||||
("{} sessions", ""),
|
||||
("scam_title", "ייתכן שאתה נפלת להונאה!"),
|
||||
("scam_text1", "אם אתה בשיחת טלפון עם מישהו שאינך מכיר ואינך סומך עליו שביקש ממך להשתמש ב-RustDesk ולהתחיל את השירות, אל תמשיך ונתק מיד."),
|
||||
("scam_text2", "סביר להניח שמדובר בהונאה שמנסה לגנוב ממך כסף או מידע פרטי אחר."),
|
||||
("Don't show again", ""),
|
||||
("Don't show again", "אל תראה שוב"),
|
||||
("I Agree", "אני מסכים"),
|
||||
("Decline", "דחה"),
|
||||
("Timeout in minutes", ""),
|
||||
@@ -551,24 +551,24 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Remove wallpaper during incoming sessions", ""),
|
||||
("Test", "בדיקה"),
|
||||
("display_is_plugged_out_msg", "המסך הופסק, החלף למסך הראשון."),
|
||||
("No displays", ""),
|
||||
("No displays", "אין מסכים"),
|
||||
("Open in new window", ""),
|
||||
("Show displays as individual windows", ""),
|
||||
("Use all my displays for the remote session", ""),
|
||||
("selinux_tip", "SELinux מופעל במכשיר שלך, מה שעלול למנוע מ-RustDesk לפעול כראוי כצד הנשלט."),
|
||||
("Change view", ""),
|
||||
("Big tiles", ""),
|
||||
("Small tiles", ""),
|
||||
("Change view", "שנה תצוגה"),
|
||||
("Big tiles", "כותרות גדולות"),
|
||||
("Small tiles", "כותרות קטנות"),
|
||||
("List", "רשימה"),
|
||||
("Virtual display", ""),
|
||||
("Plug out all", ""),
|
||||
("Virtual display", "מסכים ווירטואלים"),
|
||||
("Plug out all", "נתק הכל"),
|
||||
("True color (4:4:4)", ""),
|
||||
("Enable blocking user input", ""),
|
||||
("id_input_tip", "ניתן להזין מזהה, IP ישיר, או דומיין עם פורט (<domain>:<port>).\nאם ברצונך לגשת למכשיר בשרת אחר, אנא הוסף את כתובת השרת (<id>@<server_address>?key=<key_value>), לדוגמה,\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nאם ברצונך לגשת למכשיר בשרת ציבורי, אנא הזן \"<id>@public\", המפתח אינו נדרש לשרת ציבורי"),
|
||||
("privacy_mode_impl_mag_tip", "מצב 1"),
|
||||
("privacy_mode_impl_virtual_display_tip", "מצב 2"),
|
||||
("Enter privacy mode", ""),
|
||||
("Exit privacy mode", ""),
|
||||
("Enter privacy mode", "הכנס למצב פרטיות"),
|
||||
("Exit privacy mode", "צא ממצב פרטיות"),
|
||||
("idd_not_support_under_win10_2004_tip", "נהג התצוגה העקיף אינו נתמך. נדרשת גרסת Windows 10, גרסה 2004 או חדשה יותר."),
|
||||
("input_source_1_tip", "מקור קלט 1"),
|
||||
("input_source_2_tip", "מקור קלט 2"),
|
||||
@@ -580,50 +580,50 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enable-2fa-desc", "אנא הגדר כעת את האפליקציה שלך לאימות. תוכל להשתמש באפליקציית אימות כגון Authy, Microsoft או Google Authenticator בטלפון או במחשב שלך.\n\nסרוק את קוד ה-QR עם האפליקציה שלך והזן את הקוד שהאפליקציה מציגה כדי להפעיל את אימות הדו-שלבי."),
|
||||
("wrong-2fa-code", "לא ניתן לאמת את הקוד. בדוק שהקוד והגדרות הזמן המקומיות נכונות"),
|
||||
("enter-2fa-title", "אימות דו-שלבי"),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Email verification code must be 6 characters.", "קוד אימות במייל חייב להיות באורך של 6 תווים."),
|
||||
("2FA code must be 6 digits.", "קוד אימות דו-שלבי חייב להיות באורך של 6 מספרים."),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("outgoing_only_desk_tip", "זוהי מהדורה מותאמת אישית.\nניתן להתחבר למכשירים אחרים, אך מכשירים אחרים לא יכולים להתחבר אליך."),
|
||||
("preset_password_warning", ""),
|
||||
("Security Alert", ""),
|
||||
("My address book", ""),
|
||||
("Personal", ""),
|
||||
("Owner", ""),
|
||||
("Set shared password", ""),
|
||||
("Exist in", ""),
|
||||
("Read-only", ""),
|
||||
("Read/Write", ""),
|
||||
("Full Control", ""),
|
||||
("Security Alert", "התראת אבטחה"),
|
||||
("My address book", "ספר הכתובות שלי"),
|
||||
("Personal", "אישי"),
|
||||
("Owner", "בעלים"),
|
||||
("Set shared password", "הגדר סיסמה שיתופית"),
|
||||
("Exist in", "קיים ב"),
|
||||
("Read-only", "קריאה בלבד"),
|
||||
("Read/Write", "קריאה/כתיבה"),
|
||||
("Full Control", "שליטה מלאה"),
|
||||
("share_warning_tip", ""),
|
||||
("Everyone", ""),
|
||||
("Everyone", "כולם"),
|
||||
("ab_web_console_tip", ""),
|
||||
("allow-only-conn-window-open-tip", ""),
|
||||
("no_need_privacy_mode_no_physical_displays_tip", ""),
|
||||
("Follow remote cursor", ""),
|
||||
("Follow remote window focus", ""),
|
||||
("Follow remote cursor", "עקוב אחר מצביע מרוחק"),
|
||||
("Follow remote window focus", "עקוב אחר פוקוס בחלון מרוחק"),
|
||||
("default_proxy_tip", ""),
|
||||
("no_audio_input_device_tip", ""),
|
||||
("Incoming", ""),
|
||||
("Outgoing", ""),
|
||||
("Incoming", "נכנס"),
|
||||
("Outgoing", "יוצא"),
|
||||
("Clear Wayland screen selection", ""),
|
||||
("clear_Wayland_screen_selection_tip", ""),
|
||||
("confirm_clear_Wayland_screen_selection_tip", ""),
|
||||
("android_new_voice_call_tip", ""),
|
||||
("texture_render_tip", ""),
|
||||
("Use texture rendering", ""),
|
||||
("Floating window", ""),
|
||||
("Floating window", "חלון צף"),
|
||||
("floating_window_tip", ""),
|
||||
("Keep screen on", ""),
|
||||
("Never", ""),
|
||||
("During controlled", ""),
|
||||
("During service is on", ""),
|
||||
("Keep screen on", "השאר מסך דולק"),
|
||||
("Never", "אף פעם"),
|
||||
("During controlled", "בזמן שליטה"),
|
||||
("During service is on", "בזמן שהשירות מופעל"),
|
||||
("Capture screen using DirectX", ""),
|
||||
("Back", "חזור"),
|
||||
("Apps", "אפליקציות"),
|
||||
("Volume up", ""),
|
||||
("Volume down", ""),
|
||||
("Volume up", "הגבר"),
|
||||
("Volume down", "הנמך"),
|
||||
("Power", ""),
|
||||
("Telegram bot", ""),
|
||||
("enable-bot-tip", ""),
|
||||
@@ -633,46 +633,46 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("About RustDesk", "אודות RustDesk"),
|
||||
("Send clipboard keystrokes", ""),
|
||||
("network_error_tip", ""),
|
||||
("Unlock with PIN", ""),
|
||||
("Unlock with PIN", "שחרר עם PIN"),
|
||||
("Requires at least {} characters", ""),
|
||||
("Wrong PIN", ""),
|
||||
("Wrong PIN", "PIN שגוי"),
|
||||
("Set PIN", "הגדר PIN"),
|
||||
("Enable trusted devices", ""),
|
||||
("Manage trusted devices", ""),
|
||||
("Platform", "פלטורמה"),
|
||||
("Days remaining", ""),
|
||||
("Days remaining", "ימים שנשארו"),
|
||||
("enable-trusted-devices-tip", ""),
|
||||
("Parent directory", ""),
|
||||
("Resume", ""),
|
||||
("Invalid file name", ""),
|
||||
("Parent directory", "תיקיית אב"),
|
||||
("Resume", "המשך"),
|
||||
("Invalid file name", "שם קובץ אינו תקין"),
|
||||
("one-way-file-transfer-tip", ""),
|
||||
("Authentication Required", ""),
|
||||
("Authenticate", ""),
|
||||
("Authentication Required", "הזדהות נדרשת"),
|
||||
("Authenticate", "הזדהה"),
|
||||
("web_id_input_tip", ""),
|
||||
("Download", "הורדה"),
|
||||
("Upload folder", ""),
|
||||
("Upload files", ""),
|
||||
("Upload folder", "העלה תקייה"),
|
||||
("Upload files", "העלה קבצים"),
|
||||
("Clipboard is synchronized", ""),
|
||||
("Update client clipboard", ""),
|
||||
("Untagged", ""),
|
||||
("Untagged", "לא מתוייג"),
|
||||
("new-version-of-{}-tip", ""),
|
||||
("Accessible devices", ""),
|
||||
("View camera", ""),
|
||||
("Accessible devices", "מכשירים נגישים"),
|
||||
("View camera", "צפה במצלמה"),
|
||||
("upgrade_remote_rustdesk_client_to_{}_tip", "אנא שדרג את לקוח RustDesk לגרסה {} או חדשה יותר בצד המרוחק!"),
|
||||
("view_camera_unsupported_tip", ""),
|
||||
("Enable camera", ""),
|
||||
("No cameras", ""),
|
||||
("Enable camera", "הפעל מצלמה"),
|
||||
("No cameras", "אין מצלמות"),
|
||||
("d3d_render_tip", ""),
|
||||
("Use D3D rendering", ""),
|
||||
("Printer", ""),
|
||||
("Printer", "מדפסת"),
|
||||
("printer-os-requirement-tip", ""),
|
||||
("printer-requires-installed-{}-client-tip", ""),
|
||||
("printer-{}-not-installed-tip", ""),
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("Outgoing Print Jobs", "עבודות הדפסה יוצאות"),
|
||||
("Incoming Print Jobs", "עבודות הדפסה נכנסות"),
|
||||
("Incoming Print Job", "עבודת הדפסה נכנסת"),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
("auto-print-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ lazy_static::lazy_static! {
|
||||
pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
[
|
||||
("Status", "Állapot"),
|
||||
("Your Desktop", "Saját asztal"),
|
||||
("Your Desktop", "Saját számítógép"),
|
||||
("desk_tip", "A számítógép ezzel a jelszóval és azonosítóval érhető el távolról."),
|
||||
("Password", "Jelszó"),
|
||||
("Ready", "Kész"),
|
||||
@@ -19,14 +19,14 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Recent sessions", "Legutóbbi munkamenetek"),
|
||||
("Address book", "Címjegyzék"),
|
||||
("Confirmation", "Megerősítés"),
|
||||
("TCP tunneling", "TCP alagútépítés"),
|
||||
("TCP tunneling", "TCP-alagút"),
|
||||
("Remove", "Eltávolítás"),
|
||||
("Refresh random password", "Új véletlenszerű jelszó"),
|
||||
("Set your own password", "Saját jelszó beállítása"),
|
||||
("Enable keyboard/mouse", "Billentyűzet/egér engedélyezése"),
|
||||
("Enable clipboard", "Megosztott vágólap engedélyezése"),
|
||||
("Enable file transfer", "Fájlátvitel engedélyezése"),
|
||||
("Enable TCP tunneling", "TCP alagútépítés engedélyezése"),
|
||||
("Enable TCP tunneling", "TCP-alagút engedélyezése"),
|
||||
("IP Whitelisting", "IP engedélyezési lista"),
|
||||
("ID/Relay Server", "ID/Továbbító-kiszolgáló"),
|
||||
("Import server config", "Kiszolgáló-konfiguráció importálása"),
|
||||
@@ -58,7 +58,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Server", "Továbbító-kiszolgáló"),
|
||||
("API Server", "API kiszolgáló"),
|
||||
("invalid_http", "A címnek mindenképpen http(s)://-el kell kezdődnie."),
|
||||
("Invalid IP", "A megadott IP-cím helytelen."),
|
||||
("Invalid IP", "A megadott IP-cím érvénytelen"),
|
||||
("Invalid format", "Érvénytelen formátum"),
|
||||
("server_not_support", "A kiszolgáló nem támogatja"),
|
||||
("Not available", "Nem érhető el"),
|
||||
@@ -77,7 +77,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Error", "Hiba"),
|
||||
("Reset by the peer", "A kapcsolatot a másik fél lezárta."),
|
||||
("Connecting...", "Kapcsolódás…"),
|
||||
("Connection in progress. Please wait.", "A kapcsolódás folyamatban van. Kérem várjon…"),
|
||||
("Connection in progress. Please wait.", "A kapcsolódás folyamatban van. Kis türelmet…"),
|
||||
("Please try 1 minute later", "Próbálja meg 1 perc múlva"),
|
||||
("Login Error", "Bejelentkezési hiba"),
|
||||
("Successful", "Sikeres"),
|
||||
@@ -104,7 +104,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Not an empty directory", "Nem egy üres könyvtár"),
|
||||
("Are you sure you want to delete this file?", "Biztosan törli ezt a fájlt?"),
|
||||
("Are you sure you want to delete this empty directory?", "Biztosan törli ezt az üres könyvtárat?"),
|
||||
("Are you sure you want to delete the file of this directory?", "Biztosan törölni szeretné a könyvtár tartalmát?"),
|
||||
("Are you sure you want to delete the file of this directory?", "Biztosan törli a könyvtár tartalmát?"),
|
||||
("Do this for all conflicts", "Tegye ezt minden ütközéskor"),
|
||||
("This is irreversible!", "Ez a művelet nem vonható vissza!"),
|
||||
("Deleting", "Törlés folyamatban"),
|
||||
@@ -145,7 +145,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Failed to make direct connection to remote desktop", "Nem sikerült közvetlen kapcsolatot létesíteni a távoli számítógéppel"),
|
||||
("Set Password", "Jelszó beállítása"),
|
||||
("OS Password", "Operációs rendszer jelszavának beállítása"),
|
||||
("install_tip", "Előfordul, hogy bizonyos esetekben hiba léphet fel a Portable verzió használata során. A megfelelő működés érdekében, kérem, telepítse a RustDesk alkalmazást a számítógépére."),
|
||||
("install_tip", "Előfordul, hogy bizonyos esetekben hiba léphet fel a Portable verzió használatakor. A megfelelő működés érdekében, telepítse a RustDesk alkalmazást a számítógépére."),
|
||||
("Click to upgrade", "Kattintson ide a frissítés telepítéséhez"),
|
||||
("Click to download", "Kattintson ide a letöltéshez"),
|
||||
("Click to update", "Kattintson ide a frissítés letöltéséhez"),
|
||||
@@ -163,7 +163,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("End-user license agreement", "Végfelhasználói licensz szerződés"),
|
||||
("Generating ...", "Létrehozás…"),
|
||||
("Your installation is lower version.", "A telepített verzió alacsonyabb."),
|
||||
("not_close_tcp_tip", "Ne zárja be ezt az ablakot amíg TCP-tunnelinget használ"),
|
||||
("not_close_tcp_tip", "Ne zárja be ezt az ablakot, amíg TCP-alagutat használ"),
|
||||
("Listening ...", "Figyelés…"),
|
||||
("Remote Host", "Távoli kiszolgáló"),
|
||||
("Remote Port", "Távoli port"),
|
||||
@@ -548,7 +548,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("upgrade_rustdesk_server_pro_to_{}_tip", "Frissítse a RustDesk Server Prot a(z) {} vagy újabb verzióra!"),
|
||||
("pull_group_failed_tip", "A csoport frissítése nem sikerült"),
|
||||
("Filter by intersection", "Szűrés metszéspontok szerint"),
|
||||
("Remove wallpaper during incoming sessions", "Távolítsa el a háttérképet a bejövő munkamenetek során"),
|
||||
("Remove wallpaper during incoming sessions", "Távolítsa el a háttérképet a bejövő munkamenetek közben"),
|
||||
("Test", "Teszt"),
|
||||
("display_is_plugged_out_msg", "A képernyő nincs csatlakoztatva, váltson az első képernyőre."),
|
||||
("No displays", "Nincsenek kijelzők"),
|
||||
@@ -658,28 +658,45 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("new-version-of-{}-tip", "A(z) {} új verziója"),
|
||||
("Accessible devices", "Hozzáférhető eszközök"),
|
||||
("View camera", "Kamera megtekintése"),
|
||||
("upgrade_remote_rustdesk_client_to_{}_tip", "Kérjük, frissítse a RustDesk kliens {} vagy újabb verziójára a távoli oldalon!"),
|
||||
("view_camera_unsupported_tip", ""),
|
||||
("Enable camera", ""),
|
||||
("No cameras", ""),
|
||||
("d3d_render_tip", ""),
|
||||
("Use D3D rendering", ""),
|
||||
("Printer", ""),
|
||||
("printer-os-requirement-tip", ""),
|
||||
("printer-requires-installed-{}-client-tip", ""),
|
||||
("printer-{}-not-installed-tip", ""),
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
("auto-print-tip", ""),
|
||||
("print-incoming-job-confirm-tip", ""),
|
||||
("remote-printing-disallowed-tile-tip", ""),
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("upgrade_remote_rustdesk_client_to_{}_tip", "Frissítse a RustDesk klienst {} vagy újabb verziójára a távoli oldalon!"),
|
||||
("view_camera_unsupported_tip", "A kameranézet nem támogatott"),
|
||||
("Enable camera", "Kamera engedélyezése"),
|
||||
("No cameras", "Nincs kamera"),
|
||||
("d3d_render_tip", "D3D renderelés"),
|
||||
("Use D3D rendering", "D3D renderelés használata"),
|
||||
("Printer", "Nyomtató"),
|
||||
("printer-os-requirement-tip", "Nyomtató operációs rendszerének minimális rendszerkövetelménye"),
|
||||
("printer-requires-installed-{}-client-tip", "A nyomtatóhoz szükséges a(z) {} kliens telepítése"),
|
||||
("printer-{}-not-installed-tip", "A(z) {} nyomtató nincs telepítve"),
|
||||
("printer-{}-ready-tip", "A(z) {} nyomtató készen áll"),
|
||||
("Install {} Printer", "A(z) {} nyomtató nyomtató telepítése"),
|
||||
("Outgoing Print Jobs", "Kimenő nyomtatási feladatok"),
|
||||
("Incoming Print Jobs", "Bejövő nyomtatási feladatok"),
|
||||
("Incoming Print Job", "Bejövő nyomtatási feladat"),
|
||||
("use-the-default-printer-tip", "Alapértelmezett nyomtató használata"),
|
||||
("use-the-selected-printer-tip", "Kiválasztott nyomtató használata"),
|
||||
("auto-print-tip", "Automatikus nyomtatás"),
|
||||
("print-incoming-job-confirm-tip", "Bejövő nyomtatási feladat megerősítése"),
|
||||
("remote-printing-disallowed-tile-tip", "A távoli nyomtatás nincs engedélyezve"),
|
||||
("remote-printing-disallowed-text-tip", "A távoli nyomtatás nincs engedélyezve"),
|
||||
("save-settings-tip", "Beállítások mentése"),
|
||||
("dont-show-again-tip", "Ne jelenítse meg újra"),
|
||||
("Take screenshot", "Képernyőkép készítése"),
|
||||
("Taking screenshot", "Képernyőkép készítése…"),
|
||||
("screenshot-merged-screen-not-supported-tip", "Egyesített képernyőről nem támogatott a képernyőkép készítése"),
|
||||
("screenshot-action-tip", "Képernyőkép-művelet"),
|
||||
("Save as", "Mentés másként"),
|
||||
("Copy to clipboard", "Másolás a vágólapra"),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", "La stampante {} è installata e pronta all'uso."),
|
||||
("Install {} Printer", "Installa la stampante {}"),
|
||||
("Outgoing Print Jobs", "Lavori di stampa in uscita"),
|
||||
("Incomming Print Jobs", "Lavori di stampa in entrata"),
|
||||
("Incoming Print Jobs", "Lavori di stampa in entrata"),
|
||||
("Incoming Print Job", "Lavoro di stampa in entrata"),
|
||||
("use-the-default-printer-tip", "Usa la stampante predefinita"),
|
||||
("use-the-selected-printer-tip", "Usa la stampante selezionata"),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", "Le impostazioni di autorizzazione del lato controllato negano la stampa remota."),
|
||||
("save-settings-tip", "Salva impostazioni"),
|
||||
("dont-show-again-tip", "Non visualizzare più questo messaggio"),
|
||||
("Take screenshot", "Cattura schermata"),
|
||||
("Taking screenshot", "Cattura schermata"),
|
||||
("screenshot-merged-screen-not-supported-tip", "L'unione della cattura di schermate di più display non è attualmente supportata.\nPassa ad un singolo display e riprova."),
|
||||
("screenshot-action-tip", "Seleziona come continuare con la schermata."),
|
||||
("Save as", "Salva come"),
|
||||
("Copy to clipboard", "Copia negli appunti"),
|
||||
("Enable remote printer", "Abilita stampante remota"),
|
||||
("Downloading {}", "Download {}"),
|
||||
("{} Update", "Aggiorna {}"),
|
||||
("{}-to-update-tip", "{} si chiuderà e installerà la nuova versione"),
|
||||
("download-new-version-failed-tip", "Download non riuscito.\nÈ possibile riprovare o selezionare 'Download' per scaricare e aggiornarlo manualmente."),
|
||||
("Auto update", "Aggiornamento automatico"),
|
||||
("update-failed-check-msi-tip", "Controllo metodo installazione non riuscito.\nSeleziona 'Download' per scaricare il programma e aggiornarlo manualmente."),
|
||||
("websocket_tip", "Quando usi WebSocket, sono supportate solo le connessioni relay."),
|
||||
("Use WebSocket", "Usa WebSocket"),
|
||||
("Trackpad speed", "Velocità trackpad"),
|
||||
("Default trackpad speed", "Velocità predefinita trackpad"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -3,19 +3,19 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
[
|
||||
("Status", "상태"),
|
||||
("Your Desktop", "내 데스크탑"),
|
||||
("desk_tip", "아래의 ID와 비밀번호로 연결할수 있습니다"),
|
||||
("desk_tip", "이 ID와 비밀번호로 데스크톱에 액세스할 수 있습니다."),
|
||||
("Password", "비밀번호"),
|
||||
("Ready", "준비"),
|
||||
("Established", "연결됨"),
|
||||
("connecting_status", "RustDesk 네트워크로 연결중입니다..."),
|
||||
("connecting_status", "RustDesk 네트워크에 연결 중..."),
|
||||
("Enable service", "서비스 활성화"),
|
||||
("Start service", "서비스 시작"),
|
||||
("Service is running", "서비스가 실행되었습니다"),
|
||||
("Service is not running", "서비스가 실행되지 않았습니다"),
|
||||
("not_ready_status", "준비되지 않았습니다. 연결을 확인해주세요."),
|
||||
("not_ready_status", "준비되지 않았습니다. 연결을 확인해 주세요"),
|
||||
("Control Remote Desktop", "원격 데스크탑 제어"),
|
||||
("Transfer file", "파일 전송"),
|
||||
("Connect", "연결하기"),
|
||||
("Connect", "연결"),
|
||||
("Recent sessions", "최근 세션"),
|
||||
("Address book", "세션 주소록"),
|
||||
("Confirmation", "확인"),
|
||||
@@ -31,17 +31,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("ID/Relay Server", "ID/릴레이 서버"),
|
||||
("Import server config", "서버 설정 가져오기"),
|
||||
("Export Server Config", "서버 설정 내보내기"),
|
||||
("Import server configuration successfully", "서버 설정 가져오기 성공"),
|
||||
("Export server configuration successfully", "서버 설정 내보내기 성공"),
|
||||
("Invalid server configuration", "잘못된 서버 설정"),
|
||||
("Import server configuration successfully", "서버 구성 가져오기 성공"),
|
||||
("Export server configuration successfully", "서버 구성 내보내기 성공"),
|
||||
("Invalid server configuration", "잘못된 서버 구성"),
|
||||
("Clipboard is empty", "클립보드가 비어있습니다"),
|
||||
("Stop service", "서비스 중지"),
|
||||
("Change ID", "ID 변경"),
|
||||
("Your new ID", "당신의 새로운 ID"),
|
||||
("Your new ID", "새 ID"),
|
||||
("length %min% to %max%", "길이 %min% ~ %max%"),
|
||||
("starts with a letter", "문자로 시작해야 합니다"),
|
||||
("allowed characters", "허용되는 문자"),
|
||||
("id_change_tip", "a-z, A-Z, 0-9, - (dash), _(언더바)만 입력 가능합니다. 첫 문자는 a-z 혹은 A-Z로 시작해야 합니다. 길이는 6~16글자가 요구됩니다."),
|
||||
("id_change_tip", "a-z, A-Z, 0-9, -(대시) 및 _(밑줄) 문자만 허용됩니다. 첫 글자는 a-z, A-Z여야 합니다. 길이는 6~16자 사이여야 합니다."),
|
||||
("Website", "웹사이트"),
|
||||
("About", "정보"),
|
||||
("Slogan_tip", "이 혼란스러운 세상에서 마음을 담아 만들었습니다!"),
|
||||
@@ -57,10 +57,10 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("ID Server", "ID 서버"),
|
||||
("Relay Server", "릴레이 서버"),
|
||||
("API Server", "API 서버"),
|
||||
("invalid_http", "http:// 또는 https:// 로 시작해야합니다"),
|
||||
("invalid_http", "ttp:// 또는 https://로 시작해야 합니다"),
|
||||
("Invalid IP", "유효하지 않은 IP"),
|
||||
("Invalid format", "유효하지 않은 형식"),
|
||||
("server_not_support", "아직 서버에서 지원되지 않습니다"),
|
||||
("server_not_support", "서버에서 아직 지원되지 않음"),
|
||||
("Not available", "불가능"),
|
||||
("Too frequent", "수정이 너무 자주 발생합니다. 나중에 재시도해 주세요."),
|
||||
("Cancel", "취소"),
|
||||
@@ -70,7 +70,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("OK", "확인"),
|
||||
("Password Required", "비밀번호 입력"),
|
||||
("Please enter your password", "비밀번호를 입력해주세요"),
|
||||
("Remember password", "비밀번호 기억하기"),
|
||||
("Remember password", "비밀번호 기억"),
|
||||
("Wrong Password", "비밀번호가 다릅니다"),
|
||||
("Do you want to enter again?", "다시 연결하시겠습니까?"),
|
||||
("Connection Error", "연결 오류"),
|
||||
@@ -145,14 +145,14 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Failed to make direct connection to remote desktop", "원격 데스크탑으로의 직접 연결 생성에 실패하였습니다"),
|
||||
("Set Password", "비밀번호 설정"),
|
||||
("OS Password", "OS 비밀번호"),
|
||||
("install_tip", "UAC로 인해, RustDesk가 원격지일 때 일부 기능이 동작하지 않을 수 있습니다. UAC 문제를 방지하려면, 아래 버튼을 클릭하여 RustDesk를 시스템에 설치해주세요."),
|
||||
("install_tip", "UAC로 인해 원격 연결 시 일부 기능이 제한될 수 있습니다. 이를 방지하려면 RustDesk를 설치하세요."),
|
||||
("Click to upgrade", "업그레이드"),
|
||||
("Click to download", "다운로드"),
|
||||
("Click to update", "업데이트"),
|
||||
("Configure", "구성"),
|
||||
("config_acc", "내 데스크탑을 원격제어하기 전에, RustDesk에게 \"Accessibility (접근성)\" 권한을 부여해야 합니다."),
|
||||
("config_screen", "내 데스크탑을 원격제어하기 전에, RustDesk에게 \"Screen Recording (화면 녹화)\" 권한을 부여해야 합니다."),
|
||||
("Installing ...", "설치중 ..."),
|
||||
("Installing ...", "설치 중..."),
|
||||
("Install", "설치하기"),
|
||||
("Installation", "설치"),
|
||||
("Installation Path", "설치 경로"),
|
||||
@@ -217,8 +217,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Verify", "확인"),
|
||||
("Remember me", "기억하기"),
|
||||
("Trust this device", "이 장치 신뢰"),
|
||||
("Verification code", "확인 코드"),
|
||||
("verification_tip", "등록된 이메일 주소로 인증번호가 발송되었습니다. 인증번호를 입력하시면 계속 로그인하실 수 있습니다"),
|
||||
("Verification code", "인증 번호"),
|
||||
("verification_tip", "등록된 이메일 주소로 인증번호가 발송되었습니다. 인증 번호를 입력하면 계속 로그인하실 수 있습니다"),
|
||||
("Logout", "로그아웃"),
|
||||
("Tags", "태그"),
|
||||
("Search ID", "ID 검색"),
|
||||
@@ -502,7 +502,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Collapse toolbar", "툴바 접기"),
|
||||
("Accept and Elevate", "권한 상승 승인"),
|
||||
("accept_and_elevate_btn_tooltip", "UAC 권한 상승 및 연결 승인"),
|
||||
("clipboard_wait_response_timeout_tip", "복사 응답 시간이 초과되었습니다."),
|
||||
("clipboard_wait_response_timeout_tip", "클립보드 응답 시간이 초과되었습니다."),
|
||||
("Incoming connection", "연결이 요청되었습니다"),
|
||||
("Outgoing connection", "나가는 연결"),
|
||||
("Exit", "나가기"),
|
||||
@@ -656,30 +656,47 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Update client clipboard", "클라이언트 클립보드 업데이트"),
|
||||
("Untagged", "태그 없음"),
|
||||
("new-version-of-{}-tip", "{} 의 새로운 버전이 출시되었습니다."),
|
||||
("Accessible devices", ""),
|
||||
("Accessible devices", "연결 가능 장치"),
|
||||
("View camera", "카메라 보기"),
|
||||
("upgrade_remote_rustdesk_client_to_{}_tip", "원격 측의 RustDesk 클라이언트를 {} 버전 이상으로 업그레이드하십시오!"),
|
||||
("view_camera_unsupported_tip", ""),
|
||||
("Enable camera", ""),
|
||||
("No cameras", ""),
|
||||
("d3d_render_tip", ""),
|
||||
("Use D3D rendering", ""),
|
||||
("Printer", ""),
|
||||
("printer-os-requirement-tip", ""),
|
||||
("printer-requires-installed-{}-client-tip", ""),
|
||||
("printer-{}-not-installed-tip", ""),
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
("auto-print-tip", ""),
|
||||
("print-incoming-job-confirm-tip", ""),
|
||||
("remote-printing-disallowed-tile-tip", ""),
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("view_camera_unsupported_tip", "원격 장치에서 카메라 보기를 지원하지 않습니다."),
|
||||
("Enable camera", "카메라 보기 허용"),
|
||||
("No cameras", "카메라 없음"),
|
||||
("d3d_render_tip", "D3D 렌더링을 활성화하면 일부 기기에서 원격 화면이 표시되지 않을 수 있습니다."),
|
||||
("Use D3D rendering", "D3D 렌더링 활성화"),
|
||||
("Printer", "프린터"),
|
||||
("printer-os-requirement-tip", "프린터 출력 기능은 Windows 10 이상부터 지원됩니다."),
|
||||
("printer-requires-installed-{}-client-tip", "원격 인쇄 기능을 사용하려면 이 장치에 {}를 설치해야 합니다."),
|
||||
("printer-{}-not-installed-tip", "{} 프린터가 설치되지 않았습니다."),
|
||||
("printer-{}-ready-tip", "{} 프린터가 설치되었습니다. 인쇄 기능을 사용할 수 있습니다."),
|
||||
("Install {} Printer", "{} 프린터 설치"),
|
||||
("Outgoing Print Jobs", "보낸 인쇄 요청"),
|
||||
("Incoming Print Jobs", "받은 인쇄 요청"),
|
||||
("Incoming Print Job", "받은 인쇄 요청"),
|
||||
("use-the-default-printer-tip", "기본 프린터 사용"),
|
||||
("use-the-selected-printer-tip", "선택한 프린터 사용"),
|
||||
("auto-print-tip", "선택한 프린터로 자동 실행"),
|
||||
("print-incoming-job-confirm-tip", "원격 인쇄 작업을 수신했습니다. 이 작업을 실행하시겠습니까?"),
|
||||
("remote-printing-disallowed-tile-tip", "원격 인쇄가 허용되지 않음"),
|
||||
("remote-printing-disallowed-text-tip", "제어 측의 권한 설정에서 원격 인쇄를 거부합니다."),
|
||||
("save-settings-tip", "설정 저장"),
|
||||
("dont-show-again-tip", "다시 표시하지 않음"),
|
||||
("Take screenshot", "스크린샷 캡처"),
|
||||
("Taking screenshot", "스크린샷 캡처 중"),
|
||||
("screenshot-merged-screen-not-supported-tip", "현재 다중 디스플레이의 스크린샷 병합은 지원되지 않습니다. 단일 디스플레이로 전환한 후 다시 시도하세요."),
|
||||
("screenshot-action-tip", "스크린샷을 계속하려면 방법을 선택하세요."),
|
||||
("Save as", "다른 이름으로 저장"),
|
||||
("Copy to clipboard", "클립보드에 복사"),
|
||||
("Enable remote printer", "원격 프린터 활성화"),
|
||||
("Downloading {}", "{} 다운로드 중"),
|
||||
("{} Update", "{} 업데이트"),
|
||||
("{}-to-update-tip", "{}가 지금 닫히고 새 버전을 설치합니다."),
|
||||
("download-new-version-failed-tip", "다운로드에 실패했습니다. 다시 시도하거나 \"다운로드\" 버튼을 클릭하여 릴리스 페이지에서 다운로드하고 수동으로 업그레이드할 수 있습니다."),
|
||||
("Auto update", "자동 업데이트"),
|
||||
("update-failed-check-msi-tip", "설치 방법 확인에 실패했습니다. \"다운로드\" 버튼을 클릭하여 릴리스 페이지에서 다운로드하고 수동으로 업그레이드하세요."),
|
||||
("websocket_tip", "WebSocket을 사용할 때는 릴레이 연결만 지원됩니다."),
|
||||
("Use WebSocket", "웹소켓 사용"),
|
||||
("Trackpad speed", "트랙패드 속도"),
|
||||
("Default trackpad speed", "기본 트랙패드 속도"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", "Printeris {} ir instalēts un gatavs lietošanai."),
|
||||
("Install {} Printer", "Instalēt {} printeri"),
|
||||
("Outgoing Print Jobs", "Izejošie drukas darbi"),
|
||||
("Incomming Print Jobs", "Ienākošie drukas darbi"),
|
||||
("Incoming Print Jobs", "Ienākošie drukas darbi"),
|
||||
("Incoming Print Job", "Ienākošais drukas darbs"),
|
||||
("use-the-default-printer-tip", "Izmantot noklusējuma printeri"),
|
||||
("use-the-selected-printer-tip", "Izmantot atlasīto printeri"),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", "Kontrolētās puses atļauju iestatījumi liedz attālo drukāšanu."),
|
||||
("save-settings-tip", "Saglabāt iestatījumus"),
|
||||
("dont-show-again-tip", "Nerādīt šo vēlreiz"),
|
||||
("Take screenshot", "Uzņemt ekrānuzņēmumu"),
|
||||
("Taking screenshot", "Ekrānuzņēmuma uzņemšana"),
|
||||
("screenshot-merged-screen-not-supported-tip", "Vairāku displeju ekrānuzņēmumu apvienošana pašlaik netiek atbalstīta. Lūdzu, pārslēdzieties uz vienu displeju un mēģiniet vēlreiz."),
|
||||
("screenshot-action-tip", "Lūdzu, atlasiet, kā turpināt darbu ar ekrānuzņēmumu."),
|
||||
("Save as", "Saglabāt kā"),
|
||||
("Copy to clipboard", "Kopēt starpliktuvē"),
|
||||
("Enable remote printer", "Iespējot attālo printeri"),
|
||||
("Downloading {}", "Notiek {} lejupielāde"),
|
||||
("{} Update", "{} atjauninājums"),
|
||||
("{}-to-update-tip", "{} tagad tiks aizvērts un tiks instalēta jaunā versija."),
|
||||
("download-new-version-failed-tip", "Lejupielāde neizdevās. Varat mēģināt vēlreiz vai noklikšķināt uz pogas \"Lejupielādēt\", lai lejupielādētu no laidiena lapas un manuāli jauninātu."),
|
||||
("Auto update", "Automātiskā atjaunināšana"),
|
||||
("update-failed-check-msi-tip", "Instalēšanas metodes pārbaude neizdevās. Lūdzu, noklikšķiniet uz pogas \"Lejupielādēt\", lai lejupielādētu no laidiena lapas un manuāli jauninātu."),
|
||||
("websocket_tip", "Izmantojot WebSocket, tiek atbalstīti tikai releja savienojumi."),
|
||||
("Use WebSocket", "Lietot WebSocket"),
|
||||
("Trackpad speed", "Skārienpaliktņa ātrums"),
|
||||
("Default trackpad speed", "Noklusējuma skārienpaliktņa ātrums"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -664,22 +664,39 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("No cameras", "Geen camera's"),
|
||||
("d3d_render_tip", "Wanneer D3D-rendering is ingeschakeld kan het externe scherm op sommige apparaten, zwart zijn."),
|
||||
("Use D3D rendering", "Gebruik D3D-rendering"),
|
||||
("Printer", ""),
|
||||
("printer-os-requirement-tip", ""),
|
||||
("printer-requires-installed-{}-client-tip", ""),
|
||||
("printer-{}-not-installed-tip", ""),
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
("auto-print-tip", ""),
|
||||
("print-incoming-job-confirm-tip", ""),
|
||||
("remote-printing-disallowed-tile-tip", ""),
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Printer", "Printer"),
|
||||
("printer-os-requirement-tip", "Windows 10 of hoger is vereist om de uitgaande functie met de printer te laten werken."),
|
||||
("printer-requires-installed-{}-client-tip", "Om afdrukken op afstand te gebruiken, moet {} geïnstalleerd zijn op dit apparaat."),
|
||||
("printer-{}-not-installed-tip", "De printer {} is niet geïnstalleerd."),
|
||||
("printer-{}-ready-tip", "De printer {} is geïnstalleerd en klaar voor gebruik."),
|
||||
("Install {} Printer", "Installeer {} Printer"),
|
||||
("Outgoing Print Jobs", "Uitgaande Afdruktaken"),
|
||||
("Incoming Print Jobs", "Inkomende Afdruktaken"),
|
||||
("Incoming Print Job", "Inkomende Afdruktaak"),
|
||||
("use-the-default-printer-tip", "Gebruik de standaard printer"),
|
||||
("use-the-selected-printer-tip", "Gebruik de geselecteerde printer"),
|
||||
("auto-print-tip", "Automatisch afdrukken op de geselecteerde printer."),
|
||||
("print-incoming-job-confirm-tip", "Er werd een afdruktaak ontvangen van een extern apparaat. Moet ik deze lokaal afdrukken?"),
|
||||
("remote-printing-disallowed-tile-tip", "Afdruk op afstand is verboden"),
|
||||
("remote-printing-disallowed-text-tip", "Machtigingsinstellingen aan beheerde zijde verhinderen afdrukken op afstand."),
|
||||
("save-settings-tip", "Instellingen opslaan"),
|
||||
("dont-show-again-tip", "Dit bericht wordt niet meer weergegeven"),
|
||||
("Take screenshot", "Maak een schermafbeelding"),
|
||||
("Taking screenshot", "Schermafbeelding maken"),
|
||||
("screenshot-merged-screen-not-supported-tip", "Schermafbeeldingen van meerdere schermen samenvoegen wordt momenteel niet ondersteund. Schakel over naar een enkel scherm en herhaal de actie."),
|
||||
("screenshot-action-tip", "Kies wat je met de gemaakte schermafbeelding wilt doen."),
|
||||
("Save as", "Opslaan als"),
|
||||
("Copy to clipboard", "Kopiëren naar het klembord"),
|
||||
("Enable remote printer", "Printer op afstand inschakelen"),
|
||||
("Downloading {}", "Downloaden {}"),
|
||||
("{} Update", "{} Updaten"),
|
||||
("{}-to-update-tip", "{} zal sluiten en de nieuwe versie installeren."),
|
||||
("download-new-version-failed-tip", "Fout bij het downloaden. Je kunt het opnieuw proberen of op de knop Downloaden klikken om de applicatie van de officiële website te downloaden en handmatig bij te werken."),
|
||||
("Auto update", "Automatisch updaten"),
|
||||
("update-failed-check-msi-tip", "Kan de installatiemethode niet bepalen. Klik op “Downloaden” om de applicatie van de officiële website te downloaden en handmatig bij te werken."),
|
||||
("websocket_tip", "Het WebSocketprotocol ondersteunt alleen verbindingen met de repeater."),
|
||||
("Use WebSocket", "Gebruik het WebSocketprotocol"),
|
||||
("Trackpad speed", "Snelheid Trackpad"),
|
||||
("Default trackpad speed", "Standaardsnelheid Trackpad"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -659,27 +659,44 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accessible devices", "Dostępne urządzenia"),
|
||||
("View camera", "Podgląd kamery"),
|
||||
("upgrade_remote_rustdesk_client_to_{}_tip", "Proszę zaktualizować zdalny klient RustDesk do wersji {} lub nowszej!"),
|
||||
("view_camera_unsupported_tip", ""),
|
||||
("Enable camera", ""),
|
||||
("No cameras", ""),
|
||||
("d3d_render_tip", ""),
|
||||
("Use D3D rendering", ""),
|
||||
("Printer", ""),
|
||||
("printer-os-requirement-tip", ""),
|
||||
("printer-requires-installed-{}-client-tip", ""),
|
||||
("printer-{}-not-installed-tip", ""),
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
("auto-print-tip", ""),
|
||||
("print-incoming-job-confirm-tip", ""),
|
||||
("remote-printing-disallowed-tile-tip", ""),
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("view_camera_unsupported_tip", "Zdalne urządzenie nie obsługuje podglądu kamery."),
|
||||
("Enable camera", "Włącz kamerę"),
|
||||
("No cameras", "Brak kamer"),
|
||||
("d3d_render_tip", "Kiedy włączenie renderowania D3D jest włączone, ekran zdalnej kontroli może być czarny w niektórych przypadkach"),
|
||||
("Use D3D rendering", "Użyj renderowania D3D"),
|
||||
("Printer", "Drukarka"),
|
||||
("printer-os-requirement-tip", "Funkcja drukowania zdalnego wymaga Windows 10 lub nowszego"),
|
||||
("printer-requires-installed-{}-client-tip", "Aby włączyć funkcję zdalnego drukowania, {} musi być zainstalowany na tym urządzeniu."),
|
||||
("printer-{}-not-installed-tip", "Drukarka {} nie jest zainstalowana."),
|
||||
("printer-{}-ready-tip", "Drukarka {} jest zainstalowana i gotowa do użycia."),
|
||||
("Install {} Printer", "Zainstaluj drukarkę {}"),
|
||||
("Outgoing Print Jobs", "Wychodzące zadania drukowania"),
|
||||
("Incoming Print Jobs", "Przychodzące zadania drukowania"),
|
||||
("Incoming Print Job", "Przychodzące zadanie drukowania"),
|
||||
("use-the-default-printer-tip", "Użyj domyślnej drukarki"),
|
||||
("use-the-selected-printer-tip", "Użyj wybranej drukarki"),
|
||||
("auto-print-tip", "Drukuj automatycznie używając wybranej drukarki"),
|
||||
("print-incoming-job-confirm-tip", "Otrzymałeś zadanie zdalnego drukowania. Chcesz wykonać je po swojej stronie?"),
|
||||
("remote-printing-disallowed-tile-tip", "Zdalne drukowanie niedozwolone"),
|
||||
("remote-printing-disallowed-text-tip", "Ustawienia uprawnień po zdalnej stronie uniemożliwiają zdalne drukowanie."),
|
||||
("save-settings-tip", "Zapisz ustawienia"),
|
||||
("dont-show-again-tip", "Nie pokazuj więcej"),
|
||||
("Take screenshot", "Zrób zrzut ekranu"),
|
||||
("Taking screenshot", "Tworzenie zrzutu ekranu"),
|
||||
("screenshot-merged-screen-not-supported-tip", "Łączenie zrzutów ekranu z wielu wyświetlaczy nie jest obecnie obsługiwane. Przełącz się na pojedynczy wyświetlacz i spróbuj ponownie."),
|
||||
("screenshot-action-tip", "Wybierz sposób kontynuacji zrzutu ekranu."),
|
||||
("Save as", "Zapisz jako"),
|
||||
("Copy to clipboard", "Kopiuj do schowka"),
|
||||
("Enable remote printer", "Włącz zdalne drukowanie"),
|
||||
("Downloading {}", "Pobieranie {}"),
|
||||
("{} Update", "Aktualizacji {}"),
|
||||
("{}-to-update-tip", "{} zostanie teraz zamknięty i zostanie zainstalowana nowa wersja."),
|
||||
("download-new-version-failed-tip", "Pobieranie nie powiodło się. Możesz spróbować ponownie lub kliknąć przycisk \"Pobierz\", aby pobrać ze strony programu i uaktualnić ręcznie."),
|
||||
("Auto update", "Automatyczna aktualizacja"),
|
||||
("update-failed-check-msi-tip", "Sprawdzenie metody instalacji nie powiodło się. Kliknij przycisk \"Pobierz\", aby pobrać ze strony wydania i uaktualnić ręcznie."),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -671,7 +671,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("printer-{}-ready-tip", ""),
|
||||
("Install {} Printer", ""),
|
||||
("Outgoing Print Jobs", ""),
|
||||
("Incomming Print Jobs", ""),
|
||||
("Incoming Print Jobs", ""),
|
||||
("Incoming Print Job", ""),
|
||||
("use-the-default-printer-tip", ""),
|
||||
("use-the-selected-printer-tip", ""),
|
||||
@@ -681,5 +681,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remote-printing-disallowed-text-tip", ""),
|
||||
("save-settings-tip", ""),
|
||||
("dont-show-again-tip", ""),
|
||||
("Take screenshot", ""),
|
||||
("Taking screenshot", ""),
|
||||
("screenshot-merged-screen-not-supported-tip", ""),
|
||||
("screenshot-action-tip", ""),
|
||||
("Save as", ""),
|
||||
("Copy to clipboard", ""),
|
||||
("Enable remote printer", ""),
|
||||
("Downloading {}", ""),
|
||||
("{} Update", ""),
|
||||
("{}-to-update-tip", ""),
|
||||
("download-new-version-failed-tip", ""),
|
||||
("Auto update", ""),
|
||||
("update-failed-check-msi-tip", ""),
|
||||
("websocket_tip", ""),
|
||||
("Use WebSocket", ""),
|
||||
("Trackpad speed", ""),
|
||||
("Default trackpad speed", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user