mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-07-14 19:41:45 +08:00
Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8aeafd5401 | |||
| e264283bf2 | |||
| 1053b53b57 | |||
| 233eb49e4d | |||
| c974514710 | |||
| 52ff648411 | |||
| 55ae167394 | |||
| ba5a535891 | |||
| 3ab9d4e46d | |||
| bb8ffef7f0 | |||
| 1c2188f80b | |||
| ff1ca85827 | |||
| f695413ee7 | |||
| b0555639a2 | |||
| cd4ed15214 | |||
| 96ab03aa65 | |||
| a30af8a321 | |||
| ed9a423570 | |||
| 5cc7355dd2 | |||
| a9eca51ab0 |
@@ -44,7 +44,7 @@ env:
|
||||
# 2. Update the `VCPKG_COMMIT_ID` in `ci.yml` and `playground.yml`.
|
||||
VCPKG_COMMIT_ID: "120deac3062162151622ca4860575a33844ba10b"
|
||||
ARMV7_VCPKG_COMMIT_ID: "6f29f12e82a8293156836ad81cc9bf5af41fe836" # 2025.01.13, got "/opt/artifacts/vcpkg/vcpkg: No such file or directory" with latest version
|
||||
VERSION: "1.4.9"
|
||||
VERSION: "1.4.8"
|
||||
NDK_VERSION: "r28c"
|
||||
#signing keys env variable checks
|
||||
ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
|
||||
|
||||
@@ -17,7 +17,7 @@ env:
|
||||
TAG_NAME: "nightly"
|
||||
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
|
||||
VCPKG_COMMIT_ID: "120deac3062162151622ca4860575a33844ba10b"
|
||||
VERSION: "1.4.9"
|
||||
VERSION: "1.4.8"
|
||||
NDK_VERSION: "r26d"
|
||||
#signing keys env variable checks
|
||||
ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
|
||||
|
||||
@@ -84,9 +84,3 @@ Then translate that source into the file's target language (infer the language f
|
||||
* Preserve placeholders (`{}`) and escape sequences (`\n`, `\"`) exactly as in the source.
|
||||
* Do not translate brand or technical tokens: `RustDesk`, `Socks5`, `TLS`, `UAC`, `Wayland`, `X11`, `TCP`, `UDP`, `2FA`, `RDP`, `D3D`, etc.
|
||||
* Copy URL values (e.g. `doc_*` keys) verbatim from `en.rs`.
|
||||
|
||||
### Adding new keys (feature work)
|
||||
|
||||
* New English-text keys use sentence case, not Title Case: `Use ID whitelisting`, **not** `Use ID Whitelisting`. Acronyms (ID, IP, 2FA…) stay uppercase. Legacy Title-Case keys (e.g. `Use IP Whitelisting`) stay as-is — do not rename them.
|
||||
* Since the key itself is the English display text, a sentence-case key usually needs **no** `en.rs` entry; add one only when the display text must differ from the key (e.g. `*_tip` keys).
|
||||
* Append each new key to `template.rs` (with `""`) and to every `src/lang/*.rs` file (translated, or `""` if unsure), at the end of the list.
|
||||
|
||||
Generated
+26
-3
@@ -6588,7 +6588,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "556af5f5c953a2ee13f45753e581a38f9778e6551bc3ccc56d90b14628fe59d8"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10",
|
||||
"rpassword",
|
||||
"rpassword 2.1.0",
|
||||
"tempfile",
|
||||
"termios 0.3.3",
|
||||
"winapi 0.3.9",
|
||||
@@ -7152,6 +7152,17 @@ dependencies = [
|
||||
"winapi 0.2.8",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rpassword"
|
||||
version = "7.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"rtoolbox",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rtcp"
|
||||
version = "0.14.0"
|
||||
@@ -7163,6 +7174,16 @@ dependencies = [
|
||||
"webrtc-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rtoolbox"
|
||||
version = "0.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rtp"
|
||||
version = "0.14.0"
|
||||
@@ -7249,7 +7270,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustdesk"
|
||||
version = "1.4.9"
|
||||
version = "1.4.8"
|
||||
dependencies = [
|
||||
"android-wakelock",
|
||||
"android_logger",
|
||||
@@ -7262,6 +7283,7 @@ dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"chrono",
|
||||
"cidr-utils",
|
||||
"clap 4.5.53",
|
||||
"clipboard",
|
||||
"clipboard-master",
|
||||
"cocoa 0.24.1",
|
||||
@@ -7319,6 +7341,7 @@ dependencies = [
|
||||
"repng",
|
||||
"reqwest",
|
||||
"ringbuf",
|
||||
"rpassword 7.3.1",
|
||||
"rubato",
|
||||
"runas",
|
||||
"rust-pulsectl",
|
||||
@@ -7362,7 +7385,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustdesk-portable-packer"
|
||||
version = "1.4.9"
|
||||
version = "1.4.8"
|
||||
dependencies = [
|
||||
"brotli",
|
||||
"dirs 5.0.1",
|
||||
|
||||
+4
-1
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "rustdesk"
|
||||
version = "1.4.9"
|
||||
version = "1.4.8"
|
||||
authors = ["rustdesk <info@rustdesk.com>"]
|
||||
edition = "2021"
|
||||
build= "build.rs"
|
||||
@@ -22,6 +22,7 @@ path = "src/service.rs"
|
||||
|
||||
[features]
|
||||
inline = []
|
||||
cli = []
|
||||
use_samplerate = ["samplerate"]
|
||||
use_rubato = ["rubato"]
|
||||
use_dasp = ["dasp"]
|
||||
@@ -61,6 +62,8 @@ dasp = { version = "0.11", features = ["signal", "interpolate-linear", "interpol
|
||||
rubato = { version = "0.12", optional = true }
|
||||
samplerate = { version = "0.2", optional = true }
|
||||
uuid = { version = "1.3", features = ["v4"] }
|
||||
clap = "4.2"
|
||||
rpassword = "7.2"
|
||||
num_cpus = "1.15"
|
||||
bytes = { version = "1.4", features = ["serde"] }
|
||||
default-net = "0.14"
|
||||
|
||||
@@ -18,7 +18,7 @@ AppDir:
|
||||
id: rustdesk
|
||||
name: rustdesk
|
||||
icon: rustdesk
|
||||
version: 1.4.9
|
||||
version: 1.4.8
|
||||
exec: usr/share/rustdesk/rustdesk
|
||||
exec_args: $@
|
||||
apt:
|
||||
|
||||
@@ -18,7 +18,7 @@ AppDir:
|
||||
id: rustdesk
|
||||
name: rustdesk
|
||||
icon: rustdesk
|
||||
version: 1.4.9
|
||||
version: 1.4.8
|
||||
exec: usr/share/rustdesk/rustdesk
|
||||
exec_args: $@
|
||||
apt:
|
||||
|
||||
@@ -6,82 +6,83 @@ ANDROID_ABI=$1
|
||||
|
||||
# Build RustDesk dependencies for Android using vcpkg.json
|
||||
# Required:
|
||||
# 1. set VCPKG_ROOT / ANDROID_NDK_HOME path environment variables
|
||||
# 1. set VCPKG_ROOT / ANDROID_NDK path environment variables
|
||||
# 2. vcpkg initialized
|
||||
# 3. ndk, version: r25c or newer
|
||||
|
||||
if [ -z "${ANDROID_NDK_HOME}" ]; then
|
||||
echo "ERROR: Please set ANDROID_NDK_HOME environment variable" 1>&2
|
||||
exit 1
|
||||
if [ -z "$ANDROID_NDK_HOME" ]; then
|
||||
echo "Failed! Please set ANDROID_NDK_HOME"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "${VCPKG_ROOT}" ]; then
|
||||
echo "ERROR: Please set VCPKG_ROOT environment variable" 1>&2
|
||||
exit 1
|
||||
if [ -z "$VCPKG_ROOT" ]; then
|
||||
echo "Failed! Please set VCPKG_ROOT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
case "${ANDROID_ABI}" in
|
||||
arm64-v8a)
|
||||
VCPKG_TARGET=arm64-android
|
||||
;;
|
||||
armeabi-v7a)
|
||||
VCPKG_TARGET=arm-neon-android
|
||||
;;
|
||||
x86_64)
|
||||
VCPKG_TARGET=x64-android
|
||||
;;
|
||||
x86)
|
||||
VCPKG_TARGET=x86-android
|
||||
;;
|
||||
*)
|
||||
echo "Usage: build_android_deps.sh <arm64-v8a|armeabi-v7a|x86_64|x86>" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
API_LEVEL="21"
|
||||
|
||||
# Get directory of this script
|
||||
|
||||
SCRIPTDIR="$(readlink -f "$0")"
|
||||
SCRIPTDIR="$(dirname "${SCRIPTDIR}")"
|
||||
SCRIPTDIR="$(dirname "$SCRIPTDIR")"
|
||||
|
||||
# Check if vcpkg.json is one level up - in root directory of RD
|
||||
|
||||
if [ ! -f "${SCRIPTDIR}/../vcpkg.json" ]; then
|
||||
echo "ERROR: Can not find vcpkg.json in RustDesk top-level directory" 1>&2
|
||||
exit 1
|
||||
if [ ! -f "$SCRIPTDIR/../vcpkg.json" ]; then
|
||||
echo "Failed! Please check where vcpkg.json is!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "INFO: Building and install vcpkg dependencies for Android ${ANDROID_ABI} ..."
|
||||
# NDK llvm toolchain
|
||||
|
||||
pushd "${SCRIPTDIR}/.."
|
||||
HOST_TAG="linux-x86_64" # current platform, set as `ls $ANDROID_NDK/toolchains/llvm/prebuilt/`
|
||||
TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/$HOST_TAG
|
||||
|
||||
"${VCPKG_ROOT}/vcpkg" install \
|
||||
--triplet "${VCPKG_TARGET}" \
|
||||
--x-install-root="${VCPKG_ROOT}/installed"
|
||||
function build {
|
||||
ANDROID_ABI=$1
|
||||
|
||||
popd
|
||||
case "$ANDROID_ABI" in
|
||||
arm64-v8a)
|
||||
ABI=aarch64-linux-android$API_LEVEL
|
||||
VCPKG_TARGET=arm64-android
|
||||
;;
|
||||
armeabi-v7a)
|
||||
ABI=armv7a-linux-androideabi$API_LEVEL
|
||||
VCPKG_TARGET=arm-neon-android
|
||||
;;
|
||||
x86_64)
|
||||
ABI=x86_64-linux-android$API_LEVEL
|
||||
VCPKG_TARGET=x64-android
|
||||
;;
|
||||
x86)
|
||||
ABI=i686-linux-android$API_LEVEL
|
||||
VCPKG_TARGET=x86-android
|
||||
;;
|
||||
*)
|
||||
echo "ERROR: ANDROID_ABI must be one of: arm64-v8a, armeabi-v7a, x86_64, x86" >&2
|
||||
return 1
|
||||
esac
|
||||
|
||||
echo "INFO: Completed building vcpkg dependencies for Android ${ANDROID_ABI}"
|
||||
echo "*** [$ANDROID_ABI][Start] Build and install vcpkg dependencies"
|
||||
pushd "$SCRIPTDIR/.."
|
||||
$VCPKG_ROOT/vcpkg install --triplet $VCPKG_TARGET --x-install-root="$VCPKG_ROOT/installed"
|
||||
popd
|
||||
head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-$VCPKG_TARGET-rel-out.log" || true
|
||||
echo "*** [$ANDROID_ABI][Finished] Build and install vcpkg dependencies"
|
||||
|
||||
if [ "${ANDROID_ABI}" = 'armeabi-v7a' ]; then
|
||||
# Symlink arm-neon-android to arm-android because cargo-ndk does not
|
||||
# understand NEON suffix.
|
||||
if [ -d "$VCPKG_ROOT/installed/arm-neon-android" ]; then
|
||||
echo "*** [Start] Move arm-neon-android to arm-android"
|
||||
|
||||
if [ -d "${VCPKG_ROOT}/installed/arm-neon-android" ]; then
|
||||
echo 'INFO: Symlinking arm-neon-android to arm-android'
|
||||
mv "$VCPKG_ROOT/installed/arm-neon-android" "$VCPKG_ROOT/installed/arm-android"
|
||||
|
||||
ln -sf \
|
||||
"${VCPKG_ROOT}/installed/arm-neon-android" \
|
||||
"${VCPKG_ROOT}/installed/arm-android"
|
||||
|
||||
echo 'INFO: Symlinked arm-neon-android to arm-android'
|
||||
else
|
||||
cat 0<<.a
|
||||
ERROR: 'vcpkg install' seem to complete successfully but
|
||||
directory '${VCPKG_ROOT}/installed/arm-neon-android' is missing!
|
||||
|
||||
.a
|
||||
|
||||
exit 1
|
||||
fi
|
||||
echo "*** [Finished] Move arm-neon-android to arm-android"
|
||||
fi
|
||||
}
|
||||
|
||||
if [ ! -z "$ANDROID_ABI" ]; then
|
||||
build "$ANDROID_ABI"
|
||||
else
|
||||
echo "Usage: build-android-deps.sh <ANDROID-ABI>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
+1
-53
@@ -1185,48 +1185,6 @@ void msgBox(SessionID sessionId, String type, String title, String text,
|
||||
VoidCallback? onSubmit,
|
||||
int? submitTimeout}) {
|
||||
dialogManager.dismissAll();
|
||||
if (type.contains('insecure-connection')) {
|
||||
Future<void> closeSession() async {
|
||||
await bind.sessionSetCommon(
|
||||
sessionId: sessionId,
|
||||
key: 'continue-insecure-connection',
|
||||
value: 'N',
|
||||
);
|
||||
dialogManager.dismissAll();
|
||||
closeConnection();
|
||||
}
|
||||
|
||||
void continueSession() {
|
||||
unawaited(
|
||||
bind.sessionSetCommon(
|
||||
sessionId: sessionId,
|
||||
key: 'continue-insecure-connection',
|
||||
value: 'Y',
|
||||
),
|
||||
);
|
||||
dialogManager.dismissAll();
|
||||
}
|
||||
|
||||
dialogManager.show(
|
||||
(setState, close, context) => CustomAlertDialog(
|
||||
title: null,
|
||||
content: SelectionArea(child: msgboxContent(type, title, text)),
|
||||
actions: [
|
||||
dialogButton(
|
||||
'Continue',
|
||||
onPressed: continueSession,
|
||||
isOutline: true,
|
||||
),
|
||||
dialogButton('Disconnect', onPressed: closeSession),
|
||||
],
|
||||
onSubmit: closeSession,
|
||||
onCancel: closeSession,
|
||||
),
|
||||
tag: '$sessionId-$type-$title-$text-$link',
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
List<Widget> buttons = [];
|
||||
bool hasOk = false;
|
||||
submit() {
|
||||
@@ -3392,12 +3350,7 @@ Future<List<Rect>> getScreenRectList() async {
|
||||
}
|
||||
|
||||
openMonitorInTheSameTab(int i, FFI ffi, PeerInfo pi,
|
||||
{bool updateCursorPos = true, bool recordSelection = true}) {
|
||||
if (recordSelection) {
|
||||
ffi.ffiModel.lastUserDisplay = i;
|
||||
ffi.ffiModel.cancelPendingRestoreTimer();
|
||||
ffi.ffiModel.pendingMonitorRestore = null;
|
||||
}
|
||||
{bool updateCursorPos = true}) {
|
||||
final displays = i == kAllDisplayValue
|
||||
? List.generate(pi.displays.length, (index) => index)
|
||||
: [i];
|
||||
@@ -4004,11 +3957,6 @@ bool whitelistNotEmpty() {
|
||||
return v != '' && v != ',';
|
||||
}
|
||||
|
||||
bool idWhitelistNotEmpty() {
|
||||
final v = bind.mainGetOptionSync(key: kOptionIdWhitelist);
|
||||
return v != '' && v != ',';
|
||||
}
|
||||
|
||||
// `setMovable()` is only supported on macOS.
|
||||
//
|
||||
// On macOS, the window can be dragged by the tab bar by default.
|
||||
|
||||
@@ -205,10 +205,6 @@ void changeWhiteList({Function()? callback}) async {
|
||||
const SizedBox(
|
||||
height: 8.0,
|
||||
),
|
||||
Text(translate("whitelist_cidr_tip")),
|
||||
const SizedBox(
|
||||
height: 8.0,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
@@ -286,108 +282,6 @@ void changeWhiteList({Function()? callback}) async {
|
||||
});
|
||||
}
|
||||
|
||||
void changeIdWhiteList({Function()? callback}) async {
|
||||
final curIdWhiteList = await bind.mainGetOption(key: kOptionIdWhitelist);
|
||||
var newIdWhiteListField = curIdWhiteList == defaultOptionWhitelist
|
||||
? ''
|
||||
: curIdWhiteList.split(',').join('\n');
|
||||
var controller = TextEditingController(text: newIdWhiteListField);
|
||||
var msg = "";
|
||||
var isInProgress = false;
|
||||
final isOptFixed = isOptionFixed(kOptionIdWhitelist);
|
||||
gFFI.dialogManager.show((setState, close, context) {
|
||||
return CustomAlertDialog(
|
||||
title: Text(translate("ID whitelisting")),
|
||||
content: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(translate("whitelist_sep")),
|
||||
const SizedBox(
|
||||
height: 8.0,
|
||||
),
|
||||
Text(translate("id_whitelist_wildcard_tip")),
|
||||
const SizedBox(
|
||||
height: 8.0,
|
||||
),
|
||||
Text(translate("id_whitelist_caveat_tip")),
|
||||
const SizedBox(
|
||||
height: 8.0,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: TextField(
|
||||
maxLines: null,
|
||||
decoration: InputDecoration(
|
||||
errorText: msg.isEmpty ? null : translate(msg),
|
||||
),
|
||||
controller: controller,
|
||||
enabled: !isOptFixed,
|
||||
autofocus: true)
|
||||
.workaroundFreezeLinuxMint(),
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(
|
||||
height: 4.0,
|
||||
),
|
||||
// NOT use Offstage to wrap LinearProgressIndicator
|
||||
if (isInProgress) const LinearProgressIndicator(),
|
||||
],
|
||||
),
|
||||
actions: [
|
||||
dialogButton("Cancel", onPressed: close, isOutline: true),
|
||||
if (!isOptFixed)
|
||||
dialogButton("Clear", onPressed: () async {
|
||||
await bind.mainSetOption(
|
||||
key: kOptionIdWhitelist, value: defaultOptionWhitelist);
|
||||
callback?.call();
|
||||
close();
|
||||
}, isOutline: true),
|
||||
if (!isOptFixed)
|
||||
dialogButton(
|
||||
"OK",
|
||||
onPressed: () async {
|
||||
setState(() {
|
||||
msg = "";
|
||||
isInProgress = true;
|
||||
});
|
||||
newIdWhiteListField = controller.text.trim();
|
||||
var newIdWhiteList = "";
|
||||
if (newIdWhiteListField.isEmpty) {
|
||||
// pass
|
||||
} else {
|
||||
final ids =
|
||||
newIdWhiteListField.trim().split(RegExp(r"[\s,;\n]+"));
|
||||
// test id, wildcards '*' and '?' are allowed;
|
||||
// '@' '.' ':' occur in cross-server IDs like "123456789@server:port"
|
||||
final idMatch = RegExp(r"^[a-zA-Z0-9\_\-\*\?\@\.\:]+$");
|
||||
for (final id in ids) {
|
||||
if (!idMatch.hasMatch(id)) {
|
||||
msg = "${translate("Invalid ID")} $id";
|
||||
setState(() {
|
||||
isInProgress = false;
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
newIdWhiteList = ids.join(',');
|
||||
}
|
||||
if (newIdWhiteList.trim().isEmpty) {
|
||||
newIdWhiteList = defaultOptionWhitelist;
|
||||
}
|
||||
await bind.mainSetOption(
|
||||
key: kOptionIdWhitelist, value: newIdWhiteList);
|
||||
callback?.call();
|
||||
close();
|
||||
},
|
||||
),
|
||||
],
|
||||
onCancel: close,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
Future<String> changeDirectAccessPort(
|
||||
String currentIP, String currentPort) async {
|
||||
final controller = TextEditingController(text: currentPort);
|
||||
|
||||
@@ -606,7 +606,7 @@ List<TTextMenu> toolbarControls(BuildContext context, String id, FFI ffi) {
|
||||
// to-do:
|
||||
// 1. Web desktop
|
||||
// 2. Mobile, copy the image to the clipboard
|
||||
if ((isDefaultConn || ffi.connType == ConnType.viewCamera) && isDesktop) {
|
||||
if (isDesktop) {
|
||||
final isScreenshotSupported = bind.sessionGetCommonSync(
|
||||
sessionId: sessionId, key: 'is_screenshot_supported', param: '');
|
||||
if ('true' == isScreenshotSupported) {
|
||||
|
||||
@@ -95,7 +95,6 @@ const String kOptionForceAlwaysRelay = "force-always-relay";
|
||||
const String kOptionViewOnly = "view_only";
|
||||
const String kOptionEnableLanDiscovery = "enable-lan-discovery";
|
||||
const String kOptionWhitelist = "whitelist";
|
||||
const String kOptionIdWhitelist = "id-whitelist";
|
||||
const String kOptionEnableAbr = "enable-abr";
|
||||
const String kOptionEnableRecordSession = "enable-record-session";
|
||||
const String kOptionDirectServer = "direct-server";
|
||||
|
||||
@@ -1297,7 +1297,6 @@ class _SafetyState extends State<_Safety> with AutomaticKeepAliveClientMixin {
|
||||
reverse: true, enabled: enabled),
|
||||
...directIp(context),
|
||||
whitelist(),
|
||||
idWhitelist(),
|
||||
...autoDisconnect(context),
|
||||
_OptionCheckBox(context, 'keep-awake-during-incoming-sessions-label',
|
||||
kOptionKeepAwakeDuringIncomingSessions,
|
||||
@@ -1455,52 +1454,6 @@ class _SafetyState extends State<_Safety> with AutomaticKeepAliveClientMixin {
|
||||
return tmpWrapper();
|
||||
}
|
||||
|
||||
Widget idWhitelist() {
|
||||
bool enabled = !locked;
|
||||
RxBool hasIdWhitelist = idWhitelistNotEmpty().obs;
|
||||
update() async {
|
||||
hasIdWhitelist.value = idWhitelistNotEmpty();
|
||||
}
|
||||
|
||||
onChanged(bool? checked) async {
|
||||
changeIdWhiteList(callback: update);
|
||||
}
|
||||
|
||||
final isOptFixed = isOptionFixed(kOptionIdWhitelist);
|
||||
return GestureDetector(
|
||||
child: Tooltip(
|
||||
message: translate('id_whitelist_tip'),
|
||||
child: Obx(() => Row(
|
||||
children: [
|
||||
Checkbox(
|
||||
value: hasIdWhitelist.value,
|
||||
onChanged: enabled && !isOptFixed ? onChanged : null)
|
||||
.marginOnly(right: 5),
|
||||
Offstage(
|
||||
offstage: !hasIdWhitelist.value,
|
||||
child: MouseRegion(
|
||||
child: const Icon(Icons.warning_amber_rounded,
|
||||
color: Color.fromARGB(255, 255, 204, 0))
|
||||
.marginOnly(right: 5),
|
||||
cursor: SystemMouseCursors.click,
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Text(
|
||||
translate('Use ID whitelisting'),
|
||||
style: TextStyle(color: disabledTextColor(context, enabled)),
|
||||
))
|
||||
],
|
||||
)),
|
||||
),
|
||||
onTap: enabled
|
||||
? () {
|
||||
onChanged(!hasIdWhitelist.value);
|
||||
}
|
||||
: null,
|
||||
).marginOnly(left: _kCheckBoxLeftMargin);
|
||||
}
|
||||
|
||||
Widget hide_cm(bool enabled) {
|
||||
return ChangeNotifierProvider.value(
|
||||
value: gFFI.serverModel,
|
||||
@@ -2461,20 +2414,17 @@ class _AboutState extends State<_About> {
|
||||
final version = await bind.mainGetVersion();
|
||||
final buildDate = await bind.mainGetBuildDate();
|
||||
final fingerprint = await bind.mainGetFingerprint();
|
||||
final myId = await bind.mainGetMyId();
|
||||
return {
|
||||
'license': license,
|
||||
'version': version,
|
||||
'buildDate': buildDate,
|
||||
'fingerprint': fingerprint,
|
||||
'myId': myId
|
||||
'fingerprint': fingerprint
|
||||
};
|
||||
}(), hasData: (data) {
|
||||
final license = data['license'].toString();
|
||||
final version = data['version'].toString();
|
||||
final buildDate = data['buildDate'].toString();
|
||||
final fingerprint = data['fingerprint'].toString();
|
||||
final myId = data['myId'].toString();
|
||||
const linkStyle = TextStyle(decoration: TextDecoration.underline);
|
||||
final scrollController = ScrollController();
|
||||
return SingleChildScrollView(
|
||||
@@ -2496,9 +2446,6 @@ class _AboutState extends State<_About> {
|
||||
SelectionArea(
|
||||
child: Text('${translate('Fingerprint')}: $fingerprint')
|
||||
.marginSymmetric(vertical: 4.0)),
|
||||
SelectionArea(
|
||||
child: Text('${translate('ID')}: $myId')
|
||||
.marginSymmetric(vertical: 4.0)),
|
||||
InkWell(
|
||||
onTap: () {
|
||||
launchUrlString('https://rustdesk.com/privacy.html');
|
||||
|
||||
@@ -495,14 +495,14 @@ class _CmHeaderState extends State<_CmHeader>
|
||||
if (client.type_() == ClientType.file)
|
||||
FittedBox(
|
||||
child: Text(
|
||||
translate("Transfer file"),
|
||||
translate("File Transfer"),
|
||||
style: TextStyle(color: Colors.white70, fontSize: 12),
|
||||
),
|
||||
),
|
||||
if (client.type_() == ClientType.camera)
|
||||
FittedBox(
|
||||
child: Text(
|
||||
translate("View camera"),
|
||||
translate("View Camera"),
|
||||
style: TextStyle(color: Colors.white70, fontSize: 12),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -78,7 +78,6 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
||||
var _enableAbr = false;
|
||||
var _denyLANDiscovery = false;
|
||||
var _onlyWhiteList = false;
|
||||
var _onlyIdWhiteList = false;
|
||||
var _enableDirectIPAccess = false;
|
||||
var _enableRecordSession = false;
|
||||
var _enableHardwareCodec = false;
|
||||
@@ -90,7 +89,6 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
||||
var _directAccessPort = "";
|
||||
var _fingerprint = "";
|
||||
var _buildDate = "";
|
||||
var _myId = "";
|
||||
var _autoDisconnectTimeout = "";
|
||||
var _hideServer = false;
|
||||
var _hideProxy = false;
|
||||
@@ -111,7 +109,6 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
||||
_denyLANDiscovery = !option2bool(kOptionEnableLanDiscovery,
|
||||
bind.mainGetOptionSync(key: kOptionEnableLanDiscovery));
|
||||
_onlyWhiteList = whitelistNotEmpty();
|
||||
_onlyIdWhiteList = idWhitelistNotEmpty();
|
||||
_enableDirectIPAccess = option2bool(
|
||||
kOptionDirectServer, bind.mainGetOptionSync(key: kOptionDirectServer));
|
||||
_enableRecordSession = option2bool(kOptionEnableRecordSession,
|
||||
@@ -220,12 +217,6 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
||||
_buildDate = buildDate;
|
||||
}
|
||||
|
||||
final myId = await bind.mainGetMyId();
|
||||
if (_myId != myId) {
|
||||
update = true;
|
||||
_myId = myId;
|
||||
}
|
||||
|
||||
final isUsingPublicServer = await bind.mainIsUsingPublicServer();
|
||||
if (_isUsingPublicServer != isUsingPublicServer) {
|
||||
update = true;
|
||||
@@ -409,29 +400,6 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
||||
changeWhiteList(callback: update);
|
||||
},
|
||||
),
|
||||
SettingsTile.switchTile(
|
||||
title: Row(children: [
|
||||
Expanded(child: Text(translate('Use ID whitelisting'))),
|
||||
Offstage(
|
||||
offstage: !_onlyIdWhiteList,
|
||||
child: const Icon(Icons.warning_amber_rounded,
|
||||
color: Color.fromARGB(255, 255, 204, 0)))
|
||||
.marginOnly(left: 5)
|
||||
]),
|
||||
initialValue: _onlyIdWhiteList,
|
||||
onToggle: (_) async {
|
||||
update() async {
|
||||
final onlyIdWhiteList = idWhitelistNotEmpty();
|
||||
if (onlyIdWhiteList != _onlyIdWhiteList) {
|
||||
setState(() {
|
||||
_onlyIdWhiteList = onlyIdWhiteList;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
changeIdWhiteList(callback: update);
|
||||
},
|
||||
),
|
||||
SettingsTile.switchTile(
|
||||
title: Text(translate('Adaptive bitrate')),
|
||||
initialValue: _enableAbr,
|
||||
@@ -1014,14 +982,6 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
||||
child: Text(_fingerprint),
|
||||
),
|
||||
leading: Icon(Icons.fingerprint)),
|
||||
SettingsTile(
|
||||
onPressed: (context) => onCopyFingerprint(_myId),
|
||||
title: Text(translate("ID")),
|
||||
value: Padding(
|
||||
padding: EdgeInsets.symmetric(vertical: 8),
|
||||
child: Text(_myId),
|
||||
),
|
||||
leading: Icon(Icons.perm_identity)),
|
||||
SettingsTile(
|
||||
title: Text(translate("Privacy Statement")),
|
||||
onPressed: (context) =>
|
||||
|
||||
@@ -112,9 +112,6 @@ class CachedPeerData {
|
||||
class FfiModel with ChangeNotifier {
|
||||
CachedPeerData cachedPeerData = CachedPeerData();
|
||||
PeerInfo _pi = PeerInfo();
|
||||
int? lastUserDisplay;
|
||||
int? pendingMonitorRestore;
|
||||
Timer? _pendingRestoreTimer;
|
||||
Rect? _rect;
|
||||
|
||||
var _inputBlocked = false;
|
||||
@@ -251,8 +248,6 @@ class FfiModel with ChangeNotifier {
|
||||
|
||||
clear() {
|
||||
_pi = PeerInfo();
|
||||
lastUserDisplay = null;
|
||||
_cancelPendingMonitorRestore();
|
||||
_secure = null;
|
||||
_direct = null;
|
||||
_inputBlocked = false;
|
||||
@@ -937,7 +932,6 @@ class FfiModel with ChangeNotifier {
|
||||
// frame briefly, then shows the Connecting overlay.
|
||||
if (_restartReconnectDelayTimer == null) {
|
||||
parent.target?.inputModel.setRelativeMouseMode(false);
|
||||
_cancelPendingMonitorRestore();
|
||||
bind.sessionReconnect(sessionId: sessionId, forceRelay: false);
|
||||
clearPermissions();
|
||||
// Retry once more after the silent window so restart reconnect attempts
|
||||
@@ -1090,22 +1084,10 @@ class FfiModel with ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
void _cancelPendingMonitorRestore() {
|
||||
_pendingRestoreTimer?.cancel();
|
||||
_pendingRestoreTimer = null;
|
||||
pendingMonitorRestore = null;
|
||||
}
|
||||
|
||||
void cancelPendingRestoreTimer() {
|
||||
_pendingRestoreTimer?.cancel();
|
||||
_pendingRestoreTimer = null;
|
||||
}
|
||||
|
||||
void reconnect(OverlayDialogManager dialogManager, SessionID sessionId,
|
||||
bool forceRelay) {
|
||||
// Disable relative mouse mode before reconnecting to ensure cursor is released.
|
||||
parent.target?.inputModel.setRelativeMouseMode(false);
|
||||
_cancelPendingMonitorRestore();
|
||||
bind.sessionReconnect(sessionId: sessionId, forceRelay: forceRelay);
|
||||
clearPermissions();
|
||||
dialogManager.dismissAll();
|
||||
@@ -1419,25 +1401,6 @@ class FfiModel with ChangeNotifier {
|
||||
// now replaced to _updateCurDisplay
|
||||
updateCurDisplay(sessionId);
|
||||
}
|
||||
// After reconnecting, restore the last selected monitor once the canvas is ready.
|
||||
// Switching earlier can offset the view if the monitor sizes differ.
|
||||
final last = lastUserDisplay;
|
||||
pendingMonitorRestore = (!isCache &&
|
||||
last != null &&
|
||||
last != currentDisplay &&
|
||||
bind.sessionGetUseAllMyDisplaysForTheRemoteSession(
|
||||
sessionId: sessionId) !=
|
||||
'Y' &&
|
||||
((last == kAllDisplayValue && _pi.displays.isNotEmpty) ||
|
||||
(last >= 0 && last < _pi.displays.length)))
|
||||
? last
|
||||
: null;
|
||||
// Fallback if the first image event never reaches this tab (multi-UI).
|
||||
_pendingRestoreTimer?.cancel();
|
||||
if (pendingMonitorRestore != null) {
|
||||
_pendingRestoreTimer = Timer(const Duration(milliseconds: 1500),
|
||||
() => parent.target?._applyPendingMonitorRestore());
|
||||
}
|
||||
if (displays.isNotEmpty) {
|
||||
_reconnects = 1;
|
||||
_offlineReconnectStartTime = null;
|
||||
@@ -3948,35 +3911,17 @@ class FFI {
|
||||
}
|
||||
if (ffiModel.waitForFirstImage.value == true) {
|
||||
ffiModel.waitForFirstImage.value = false;
|
||||
ffiModel.cancelPendingRestoreTimer();
|
||||
ffiModel.resetRestartReconnectState();
|
||||
dialogManager.dismissAll();
|
||||
try {
|
||||
await canvasModel.updateViewStyle();
|
||||
await canvasModel.updateScrollStyle();
|
||||
await canvasModel.initializeEdgeScrollEdgeThickness();
|
||||
for (final cb in imageModel.callbacksOnFirstImage) {
|
||||
cb(id);
|
||||
}
|
||||
} finally {
|
||||
_applyPendingMonitorRestore();
|
||||
await canvasModel.updateViewStyle();
|
||||
await canvasModel.updateScrollStyle();
|
||||
await canvasModel.initializeEdgeScrollEdgeThickness();
|
||||
for (final cb in imageModel.callbacksOnFirstImage) {
|
||||
cb(id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _applyPendingMonitorRestore() {
|
||||
final restore = ffiModel.pendingMonitorRestore;
|
||||
ffiModel._cancelPendingMonitorRestore();
|
||||
if (restore == null || closed) return;
|
||||
// The display list may have changed since the restore was queued.
|
||||
final displays = ffiModel.pi.displays;
|
||||
if ((restore == kAllDisplayValue && displays.isNotEmpty) ||
|
||||
(restore >= 0 && restore < displays.length)) {
|
||||
openMonitorInTheSameTab(restore, this, ffiModel.pi,
|
||||
recordSelection: false, updateCursorPos: false);
|
||||
}
|
||||
}
|
||||
|
||||
/// Login with [password], choose if the client should [remember] it.
|
||||
void login(String osUsername, String osPassword, SessionID sessionId,
|
||||
String password, bool remember) {
|
||||
|
||||
@@ -1914,15 +1914,6 @@ class RustdeskImpl {
|
||||
throw UnimplementedError("sessionHandleScreenshot");
|
||||
}
|
||||
|
||||
Future<void> sessionSetCommon(
|
||||
{required UuidValue sessionId, required String key, required String value, dynamic hint}) {
|
||||
js.context.callMethod('setByName', [
|
||||
'common',
|
||||
jsonEncode({'name': key, 'value': value})
|
||||
]);
|
||||
return Future.value();
|
||||
}
|
||||
|
||||
String? sessionGetCommonSync(
|
||||
{required UuidValue sessionId,
|
||||
required String key,
|
||||
|
||||
@@ -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.4.9+67
|
||||
version: 1.4.8+66
|
||||
|
||||
environment:
|
||||
sdk: '^3.1.0'
|
||||
|
||||
+1
-1
Submodule libs/hbb_common updated: 4bfd067765...a920d00945
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "rustdesk-portable-packer"
|
||||
version = "1.4.9"
|
||||
version = "1.4.8"
|
||||
edition = "2021"
|
||||
description = "RustDesk Remote Desktop"
|
||||
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
pkgname=rustdesk
|
||||
pkgver=1.4.9
|
||||
pkgver=1.4.8
|
||||
pkgrel=0
|
||||
epoch=
|
||||
pkgdesc=""
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Name: rustdesk
|
||||
Version: 1.4.9
|
||||
Version: 1.4.8
|
||||
Release: 0
|
||||
Summary: RPM package
|
||||
License: GPL-3.0
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Name: rustdesk
|
||||
Version: 1.4.9
|
||||
Version: 1.4.8
|
||||
Release: 0
|
||||
Summary: RPM package
|
||||
License: GPL-3.0
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
Name: rustdesk
|
||||
Version: 1.4.9
|
||||
Version: 1.4.8
|
||||
Release: 0
|
||||
Summary: RPM package
|
||||
License: GPL-3.0
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
set(VCPKG_TARGET_ARCHITECTURE arm)
|
||||
set(VCPKG_CRT_LINKAGE dynamic)
|
||||
set(VCPKG_LIBRARY_LINKAGE static)
|
||||
set(VCPKG_CMAKE_SYSTEM_NAME Android)
|
||||
set(VCPKG_CMAKE_SYSTEM_VERSION 21)
|
||||
set(VCPKG_MAKE_BUILD_TRIPLET "--host=armv7a-linux-androideabi")
|
||||
set(VCPKG_CMAKE_CONFIGURE_OPTIONS -DANDROID_ABI=armeabi-v7a -DANDROID_ARM_NEON=ON)
|
||||
@@ -1,7 +0,0 @@
|
||||
set(VCPKG_TARGET_ARCHITECTURE arm64)
|
||||
set(VCPKG_CRT_LINKAGE dynamic)
|
||||
set(VCPKG_LIBRARY_LINKAGE static)
|
||||
set(VCPKG_CMAKE_SYSTEM_NAME Android)
|
||||
set(VCPKG_CMAKE_SYSTEM_VERSION 21)
|
||||
set(VCPKG_MAKE_BUILD_TRIPLET "--host=aarch64-linux-android")
|
||||
set(VCPKG_CMAKE_CONFIGURE_OPTIONS -DANDROID_ABI=arm64-v8a)
|
||||
@@ -1,7 +0,0 @@
|
||||
set(VCPKG_TARGET_ARCHITECTURE x64)
|
||||
set(VCPKG_CRT_LINKAGE dynamic)
|
||||
set(VCPKG_LIBRARY_LINKAGE static)
|
||||
set(VCPKG_CMAKE_SYSTEM_NAME Android)
|
||||
set(VCPKG_CMAKE_SYSTEM_VERSION 21)
|
||||
set(VCPKG_MAKE_BUILD_TRIPLET "--host=x86_64-linux-android")
|
||||
set(VCPKG_CMAKE_CONFIGURE_OPTIONS -DANDROID_ABI=x86_64)
|
||||
@@ -1,7 +0,0 @@
|
||||
set(VCPKG_TARGET_ARCHITECTURE x86)
|
||||
set(VCPKG_CRT_LINKAGE dynamic)
|
||||
set(VCPKG_LIBRARY_LINKAGE static)
|
||||
set(VCPKG_CMAKE_SYSTEM_NAME Android)
|
||||
set(VCPKG_CMAKE_SYSTEM_VERSION 21)
|
||||
set(VCPKG_MAKE_BUILD_TRIPLET "--host=i686-linux-android")
|
||||
set(VCPKG_CMAKE_CONFIGURE_OPTIONS -DANDROID_ABI=x86)
|
||||
+199
@@ -0,0 +1,199 @@
|
||||
use crate::client::*;
|
||||
use async_trait::async_trait;
|
||||
use hbb_common::{
|
||||
config::PeerConfig,
|
||||
config::READ_TIMEOUT,
|
||||
futures::{SinkExt, StreamExt},
|
||||
log,
|
||||
message_proto::*,
|
||||
protobuf::Message as _,
|
||||
rendezvous_proto::ConnType,
|
||||
tokio::{self, sync::mpsc},
|
||||
Stream,
|
||||
};
|
||||
use std::sync::{Arc, RwLock};
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Session {
|
||||
id: String,
|
||||
lc: Arc<RwLock<LoginConfigHandler>>,
|
||||
sender: mpsc::UnboundedSender<Data>,
|
||||
password: String,
|
||||
}
|
||||
|
||||
impl Session {
|
||||
pub fn new(id: &str, sender: mpsc::UnboundedSender<Data>) -> Self {
|
||||
let mut password = "".to_owned();
|
||||
if PeerConfig::load(id).password.is_empty() {
|
||||
match rpassword::prompt_password("Enter password: ") {
|
||||
Ok(p) => password = p,
|
||||
Err(e) => {
|
||||
log::error!("Failed to read password: {:?}", e);
|
||||
password = "".to_owned();
|
||||
}
|
||||
}
|
||||
}
|
||||
let session = Self {
|
||||
id: id.to_owned(),
|
||||
sender,
|
||||
password,
|
||||
lc: Default::default(),
|
||||
};
|
||||
session.lc.write().unwrap().initialize(
|
||||
id.to_owned(),
|
||||
ConnType::PORT_FORWARD,
|
||||
None,
|
||||
false,
|
||||
None,
|
||||
None,
|
||||
);
|
||||
session
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl Interface for Session {
|
||||
fn get_login_config_handler(&self) -> Arc<RwLock<LoginConfigHandler>> {
|
||||
return self.lc.clone();
|
||||
}
|
||||
|
||||
fn msgbox(&self, msgtype: &str, title: &str, text: &str, link: &str) {
|
||||
match msgtype {
|
||||
"input-password" => {
|
||||
self.sender
|
||||
.send(Data::Login((self.password.clone(), true)))
|
||||
.ok();
|
||||
}
|
||||
"re-input-password" => {
|
||||
log::error!("{}: {}", title, text);
|
||||
match rpassword::prompt_password("Enter password: ") {
|
||||
Ok(password) => {
|
||||
let login_data = Data::Login((password, true));
|
||||
self.sender.send(login_data).ok();
|
||||
}
|
||||
Err(e) => {
|
||||
log::error!("reinput password failed, {:?}", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
msg if msg.contains("error") => {
|
||||
log::error!("{}: {}: {}", msgtype, title, text);
|
||||
}
|
||||
_ => {
|
||||
log::info!("{}: {}: {}", msgtype, title, text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_login_error(&self, err: &str) -> bool {
|
||||
handle_login_error(self.lc.clone(), err, self)
|
||||
}
|
||||
|
||||
fn handle_peer_info(&self, pi: PeerInfo) {
|
||||
self.lc.write().unwrap().handle_peer_info(&pi);
|
||||
}
|
||||
|
||||
async fn handle_hash(&self, pass: &str, hash: Hash, peer: &mut Stream) {
|
||||
log::info!(
|
||||
"password={}",
|
||||
hbb_common::password_security::temporary_password()
|
||||
);
|
||||
handle_hash(self.lc.clone(), &pass, hash, self, peer).await;
|
||||
}
|
||||
|
||||
async fn handle_login_from_ui(
|
||||
&self,
|
||||
os_username: String,
|
||||
os_password: String,
|
||||
password: String,
|
||||
remember: bool,
|
||||
peer: &mut Stream,
|
||||
) {
|
||||
handle_login_from_ui(
|
||||
self.lc.clone(),
|
||||
os_username,
|
||||
os_password,
|
||||
password,
|
||||
remember,
|
||||
peer,
|
||||
)
|
||||
.await;
|
||||
}
|
||||
|
||||
async fn handle_test_delay(&self, t: TestDelay, peer: &mut Stream) {
|
||||
handle_test_delay(t, peer).await;
|
||||
}
|
||||
|
||||
fn send(&self, data: Data) {
|
||||
self.sender.send(data).ok();
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::main(flavor = "current_thread")]
|
||||
pub async fn connect_test(id: &str, key: String, token: String) {
|
||||
let (sender, mut receiver) = mpsc::unbounded_channel::<Data>();
|
||||
let handler = Session::new(&id, sender);
|
||||
match crate::client::Client::start(id, &key, &token, ConnType::PORT_FORWARD, handler).await {
|
||||
Err(err) => {
|
||||
log::error!("Failed to connect {}: {}", &id, err);
|
||||
}
|
||||
Ok((mut stream, direct)) => {
|
||||
log::info!("direct: {}", direct);
|
||||
// rpassword::prompt_password("Input anything to exit").ok();
|
||||
loop {
|
||||
tokio::select! {
|
||||
res = hbb_common::timeout(READ_TIMEOUT, stream.next()) => match res {
|
||||
Err(_) => {
|
||||
log::error!("Timeout");
|
||||
break;
|
||||
}
|
||||
Ok(Some(Ok(bytes))) => {
|
||||
if let Ok(msg_in) = Message::parse_from_bytes(&bytes) {
|
||||
match msg_in.union {
|
||||
Some(message::Union::Hash(hash)) => {
|
||||
log::info!("Got hash");
|
||||
break;
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::main(flavor = "current_thread")]
|
||||
pub async fn start_one_port_forward(
|
||||
id: String,
|
||||
port: i32,
|
||||
remote_host: String,
|
||||
remote_port: i32,
|
||||
key: String,
|
||||
token: String,
|
||||
) {
|
||||
crate::common::test_rendezvous_server();
|
||||
crate::common::test_nat_type();
|
||||
let (sender, mut receiver) = mpsc::unbounded_channel::<Data>();
|
||||
let handler = Session::new(&id, sender);
|
||||
if let Err(err) = crate::port_forward::listen(
|
||||
handler.id.clone(),
|
||||
handler.password.clone(),
|
||||
port,
|
||||
handler.clone(),
|
||||
receiver,
|
||||
&key,
|
||||
&token,
|
||||
handler.lc.clone(),
|
||||
remote_host,
|
||||
remote_port,
|
||||
)
|
||||
.await
|
||||
{
|
||||
log::error!("Failed to listen on {}: {}", port, err);
|
||||
}
|
||||
log::info!("port forward (:{}) exit", port);
|
||||
}
|
||||
@@ -3792,7 +3792,6 @@ pub trait Interface: Send + Clone + 'static + Sized {
|
||||
#[derive(Clone)]
|
||||
pub enum Data {
|
||||
Close,
|
||||
RejectInsecureConnection,
|
||||
Login((String, String, String, bool)),
|
||||
Message(Message),
|
||||
SendFiles((i32, JobType, String, String, i32, bool, bool)),
|
||||
@@ -3816,33 +3815,11 @@ pub enum Data {
|
||||
ElevateWithLogon(String, String),
|
||||
NewVoiceCall,
|
||||
CloseVoiceCall,
|
||||
ContinueInsecureConnection,
|
||||
ResetDecoder(Option<usize>),
|
||||
RenameFile((i32, String, String, bool)),
|
||||
TakeScreenshot((i32, String)),
|
||||
}
|
||||
|
||||
pub async fn confirm_insecure_connection(
|
||||
interface: &impl Interface,
|
||||
receiver: &mut UnboundedReceiver<Data>,
|
||||
) -> bool {
|
||||
interface.msgbox(
|
||||
"insecure-connection-nocancel-hasclose",
|
||||
"Insecure Connection",
|
||||
"conn-e2ee-unavailable-tip",
|
||||
"",
|
||||
);
|
||||
while let Some(data) = receiver.recv().await {
|
||||
match data {
|
||||
Data::ContinueInsecureConnection => return true,
|
||||
Data::RejectInsecureConnection => return false,
|
||||
Data::Close => return false,
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
/// Keycode for key events.
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum Key {
|
||||
|
||||
@@ -6,6 +6,7 @@ pub trait FileManager: Interface {
|
||||
#[cfg(not(any(
|
||||
target_os = "android",
|
||||
target_os = "ios",
|
||||
feature = "cli",
|
||||
feature = "flutter"
|
||||
)))]
|
||||
fn get_home_dir(&self) -> String {
|
||||
@@ -15,6 +16,7 @@ pub trait FileManager: Interface {
|
||||
#[cfg(not(any(
|
||||
target_os = "android",
|
||||
target_os = "ios",
|
||||
feature = "cli",
|
||||
feature = "flutter"
|
||||
)))]
|
||||
fn get_next_job_id(&self) -> i32 {
|
||||
@@ -24,6 +26,7 @@ pub trait FileManager: Interface {
|
||||
#[cfg(not(any(
|
||||
target_os = "android",
|
||||
target_os = "ios",
|
||||
feature = "cli",
|
||||
feature = "flutter"
|
||||
)))]
|
||||
fn update_next_job_id(&self, id: i32) {
|
||||
@@ -33,6 +36,7 @@ pub trait FileManager: Interface {
|
||||
#[cfg(not(any(
|
||||
target_os = "android",
|
||||
target_os = "ios",
|
||||
feature = "cli",
|
||||
feature = "flutter"
|
||||
)))]
|
||||
fn read_dir(&self, path: String, include_hidden: bool) -> sciter::Value {
|
||||
@@ -86,6 +90,7 @@ pub trait FileManager: Interface {
|
||||
#[cfg(not(any(
|
||||
target_os = "android",
|
||||
target_os = "ios",
|
||||
feature = "cli",
|
||||
feature = "flutter"
|
||||
)))]
|
||||
fn confirm_delete_files(&self, id: i32, file_num: i32) {
|
||||
@@ -95,6 +100,7 @@ pub trait FileManager: Interface {
|
||||
#[cfg(not(any(
|
||||
target_os = "android",
|
||||
target_os = "ios",
|
||||
feature = "cli",
|
||||
feature = "flutter"
|
||||
)))]
|
||||
fn set_no_confirm(&self, id: i32) {
|
||||
|
||||
+2
-25
@@ -14,7 +14,6 @@ use crate::{
|
||||
// Empirical no-data window before exposing the restart reconnect state to the UI.
|
||||
// Restart msgbox text is kept as a legacy UI fallback; Flutter handles the type as a control event.
|
||||
const RESTART_REMOTE_DEVICE_NO_DATA_TIMEOUT: Duration = Duration::from_secs(5);
|
||||
const KCP_CLOSE_REASON_FLUSH_DELAY: Duration = Duration::from_millis(30);
|
||||
#[cfg(feature = "unix-file-copy-paste")]
|
||||
use crate::{clipboard::try_empty_clipboard_files, clipboard_file::unix_file_clip};
|
||||
#[cfg(any(
|
||||
@@ -184,20 +183,8 @@ impl<T: InvokeUiSession> Remote<T> {
|
||||
.lock()
|
||||
.unwrap()
|
||||
.set_connected();
|
||||
let is_secured = peer.is_secured();
|
||||
self.handler
|
||||
.set_connection_type(is_secured, direct, stream_type); // flutter -> connection_ready
|
||||
if !is_secured
|
||||
&& !crate::common::is_direct_ip_access(&self.handler.get_id())
|
||||
&& !client::confirm_insecure_connection(&self.handler, &mut self.receiver).await
|
||||
{
|
||||
self.send_close_reason(&mut peer, "").await;
|
||||
if kcp.is_some() {
|
||||
tokio::time::sleep(KCP_CLOSE_REASON_FLUSH_DELAY).await;
|
||||
}
|
||||
self.handle_disconnected(round);
|
||||
return;
|
||||
}
|
||||
.set_connection_type(peer.is_secured(), direct, stream_type); // flutter -> connection_ready
|
||||
self.handler.update_direct(Some(direct));
|
||||
if conn_type == ConnType::DEFAULT_CONN || conn_type == ConnType::VIEW_CAMERA {
|
||||
self.handler
|
||||
@@ -351,17 +338,13 @@ impl<T: InvokeUiSession> Remote<T> {
|
||||
self.send_close_reason(&mut peer, "kcp").await;
|
||||
// KCP does not send messages immediately, so wait to ensure the last message is sent.
|
||||
// 1ms works in my test, but 30ms is more reliable.
|
||||
tokio::time::sleep(KCP_CLOSE_REASON_FLUSH_DELAY).await;
|
||||
tokio::time::sleep(Duration::from_millis(30)).await;
|
||||
}
|
||||
}
|
||||
Err(err) => {
|
||||
self.handler.on_establish_connection_error(err.to_string());
|
||||
}
|
||||
}
|
||||
self.handle_disconnected(round);
|
||||
}
|
||||
|
||||
fn handle_disconnected(&self, round: u32) {
|
||||
// set_disconnected_ok is used to check if new connection round is started.
|
||||
let _set_disconnected_ok = self
|
||||
.handler
|
||||
@@ -1107,9 +1090,6 @@ impl<T: InvokeUiSession> Remote<T> {
|
||||
}
|
||||
|
||||
async fn send_toggle_virtual_display_msg(&self, peer: &mut Stream) {
|
||||
if self.handler.is_view_camera() {
|
||||
return;
|
||||
}
|
||||
if !self.peer_info.is_support_virtual_display() {
|
||||
return;
|
||||
}
|
||||
@@ -1131,9 +1111,6 @@ impl<T: InvokeUiSession> Remote<T> {
|
||||
}
|
||||
|
||||
async fn send_toggle_privacy_mode_msg(&self, peer: &mut Stream) {
|
||||
if self.handler.is_view_camera() {
|
||||
return;
|
||||
}
|
||||
let lc = self.handler.lc.read().unwrap();
|
||||
if lc.version >= hbb_common::get_version_number("1.2.4")
|
||||
&& lc.get_toggle_option("privacy-mode")
|
||||
|
||||
+3
-6
@@ -764,14 +764,15 @@ async fn test_rendezvous_server_() {
|
||||
Config::reset_online();
|
||||
}
|
||||
|
||||
// #[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))]
|
||||
pub fn test_rendezvous_server() {
|
||||
std::thread::spawn(test_rendezvous_server_);
|
||||
}
|
||||
|
||||
pub fn refresh_rendezvous_server() {
|
||||
#[cfg(any(target_os = "android", target_os = "ios"))]
|
||||
#[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))]
|
||||
test_rendezvous_server();
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios", feature = "cli")))]
|
||||
std::thread::spawn(|| {
|
||||
if crate::ipc::test_rendezvous_server().is_err() {
|
||||
test_rendezvous_server();
|
||||
@@ -2619,10 +2620,6 @@ pub fn get_control_permission(
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_direct_ip_access(peer: &str) -> bool {
|
||||
hbb_common::is_ip_str(peer) || hbb_common::is_domain_port_str(peer)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
+2
-5
@@ -1437,7 +1437,7 @@ fn try_send_close_event(event_stream: &Option<StreamSink<EventToUI>>) {
|
||||
pub fn update_text_clipboard_required() {
|
||||
let is_required = sessions::get_sessions()
|
||||
.iter()
|
||||
.any(|s| s.is_default() && s.is_text_clipboard_required());
|
||||
.any(|s| s.is_text_clipboard_required());
|
||||
#[cfg(target_os = "android")]
|
||||
let _ = scrap::android::ffi::call_clipboard_manager_enable_client_clipboard(is_required);
|
||||
Client::set_is_text_clipboard_required(is_required);
|
||||
@@ -1447,16 +1447,13 @@ pub fn update_text_clipboard_required() {
|
||||
pub fn update_file_clipboard_required() {
|
||||
let is_required = sessions::get_sessions()
|
||||
.iter()
|
||||
.any(|s| s.is_default() && s.is_file_clipboard_required());
|
||||
.any(|s| s.is_file_clipboard_required());
|
||||
Client::set_is_file_clipboard_required(is_required);
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "ios"))]
|
||||
pub fn send_clipboard_msg(msg: Message, _is_file: bool) {
|
||||
for s in sessions::get_sessions() {
|
||||
if !s.is_default() {
|
||||
continue;
|
||||
}
|
||||
#[cfg(feature = "unix-file-copy-paste")]
|
||||
if _is_file {
|
||||
if crate::is_support_file_copy_paste_num(s.lc.read().unwrap().version)
|
||||
|
||||
+1
-19
@@ -1026,7 +1026,7 @@ pub fn main_set_option(key: String, value: String) {
|
||||
set_option(key, value.clone());
|
||||
#[cfg(target_os = "android")]
|
||||
crate::rendezvous_mediator::RendezvousMediator::restart();
|
||||
#[cfg(any(target_os = "android", target_os = "ios"))]
|
||||
#[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))]
|
||||
crate::common::test_rendezvous_server();
|
||||
} else {
|
||||
set_option(key, value.clone());
|
||||
@@ -1224,14 +1224,9 @@ pub fn main_set_local_option(key: String, value: String) {
|
||||
let is_texture_render_key = key.eq(config::keys::OPTION_TEXTURE_RENDER);
|
||||
let is_d3d_render_key = key.eq(config::keys::OPTION_ALLOW_D3D_RENDER);
|
||||
set_local_option(key, value.clone());
|
||||
let is_render_target =
|
||||
|session: &crate::flutter::FlutterSession| session.is_default() || session.is_view_camera();
|
||||
if is_texture_render_key {
|
||||
let session_event = [("v", &value)];
|
||||
for session in sessions::get_sessions() {
|
||||
if !is_render_target(&session) {
|
||||
continue;
|
||||
}
|
||||
session.push_event("use_texture_render", &session_event, &[]);
|
||||
session.use_texture_render_changed();
|
||||
session.ui_handler.update_use_texture_render();
|
||||
@@ -1239,9 +1234,6 @@ pub fn main_set_local_option(key: String, value: String) {
|
||||
}
|
||||
if is_d3d_render_key {
|
||||
for session in sessions::get_sessions() {
|
||||
if !is_render_target(&session) {
|
||||
continue;
|
||||
}
|
||||
session.update_supported_decodings();
|
||||
}
|
||||
}
|
||||
@@ -3028,16 +3020,6 @@ pub fn main_set_common(_key: String, _value: String) {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn session_set_common(session_id: SessionID, key: String, value: String) {
|
||||
if let Some(s) = sessions::get_session_by_session_id(&session_id) {
|
||||
if key == "continue-insecure-connection"
|
||||
{
|
||||
s.continue_insecure_connection(value == "Y");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn session_get_common_sync(
|
||||
session_id: SessionID,
|
||||
key: String,
|
||||
|
||||
+2
-2
@@ -9,8 +9,8 @@ mod http_client;
|
||||
pub mod record_upload;
|
||||
pub mod sync;
|
||||
pub use http_client::{
|
||||
create_http_client_async, create_http_client_async_with_url_strict,
|
||||
create_http_client_with_url, create_http_client_with_url_strict, get_url_for_tls,
|
||||
create_http_client_async, create_http_client_async_with_url, create_http_client_with_url,
|
||||
get_url_for_tls,
|
||||
};
|
||||
|
||||
#[derive(Debug)]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use super::create_http_client_async_with_url_strict;
|
||||
use super::create_http_client_async_with_url;
|
||||
use hbb_common::{
|
||||
bail,
|
||||
lazy_static::lazy_static,
|
||||
@@ -167,7 +167,7 @@ async fn do_download(
|
||||
auto_del_dur: Option<Duration>,
|
||||
mut rx_cancel: UnboundedReceiver<()>,
|
||||
) -> ResultType<bool> {
|
||||
let client = create_http_client_async_with_url_strict(&url).await?;
|
||||
let client = create_http_client_async_with_url(&url).await;
|
||||
|
||||
let mut is_all_downloaded = false;
|
||||
tokio::select! {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
use hbb_common::{
|
||||
async_recursion::async_recursion,
|
||||
bail,
|
||||
config::{Config, Socks5Server},
|
||||
log::{self, info},
|
||||
proxy::{Proxy, ProxyScheme},
|
||||
@@ -8,7 +7,6 @@ use hbb_common::{
|
||||
get_cached_tls_accept_invalid_cert, get_cached_tls_type, is_plain, upsert_tls_cache,
|
||||
TlsType,
|
||||
},
|
||||
ResultType,
|
||||
};
|
||||
use reqwest::{blocking::Client as SyncClient, Client as AsyncClient};
|
||||
|
||||
@@ -139,32 +137,6 @@ pub fn create_http_client_with_url(url: &str) -> SyncClient {
|
||||
)
|
||||
}
|
||||
|
||||
pub fn create_http_client_with_url_strict(url: &str) -> ResultType<SyncClient> {
|
||||
let parsed_url = url::Url::parse(url)?;
|
||||
if parsed_url.scheme() != "https" {
|
||||
bail!("Strict HTTP client requires HTTPS: {}", url);
|
||||
}
|
||||
let proxy_conf = Config::get_socks();
|
||||
let tls_url = get_url_for_tls(url, &proxy_conf);
|
||||
let cached_tls_type = get_cached_tls_type(tls_url);
|
||||
let cached_danger_accept_invalid_cert = get_cached_tls_accept_invalid_cert(tls_url);
|
||||
let can_reuse_cached_probe =
|
||||
cached_tls_type.is_some() && cached_danger_accept_invalid_cert == Some(false);
|
||||
let tls_type = if can_reuse_cached_probe {
|
||||
cached_tls_type.unwrap_or(TlsType::Rustls)
|
||||
} else {
|
||||
TlsType::Rustls
|
||||
};
|
||||
Ok(create_http_client_with_url_(
|
||||
url,
|
||||
tls_url,
|
||||
tls_type,
|
||||
can_reuse_cached_probe,
|
||||
Some(false),
|
||||
Some(false),
|
||||
))
|
||||
}
|
||||
|
||||
fn create_http_client_with_url_(
|
||||
url: &str,
|
||||
tls_url: &str,
|
||||
@@ -275,33 +247,6 @@ pub async fn create_http_client_async_with_url(url: &str) -> AsyncClient {
|
||||
.await
|
||||
}
|
||||
|
||||
pub async fn create_http_client_async_with_url_strict(url: &str) -> ResultType<AsyncClient> {
|
||||
let parsed_url = url::Url::parse(url)?;
|
||||
if parsed_url.scheme() != "https" {
|
||||
bail!("Strict HTTP client requires HTTPS: {}", url);
|
||||
}
|
||||
let proxy_conf = Config::get_socks();
|
||||
let tls_url = get_url_for_tls(url, &proxy_conf);
|
||||
let cached_tls_type = get_cached_tls_type(tls_url);
|
||||
let cached_danger_accept_invalid_cert = get_cached_tls_accept_invalid_cert(tls_url);
|
||||
let can_reuse_cached_probe =
|
||||
cached_tls_type.is_some() && cached_danger_accept_invalid_cert == Some(false);
|
||||
let tls_type = if can_reuse_cached_probe {
|
||||
cached_tls_type.unwrap_or(TlsType::Rustls)
|
||||
} else {
|
||||
TlsType::Rustls
|
||||
};
|
||||
Ok(create_http_client_async_with_url_(
|
||||
url,
|
||||
tls_url,
|
||||
tls_type,
|
||||
can_reuse_cached_probe,
|
||||
Some(false),
|
||||
Some(false),
|
||||
)
|
||||
.await)
|
||||
}
|
||||
|
||||
#[async_recursion]
|
||||
async fn create_http_client_async_with_url_(
|
||||
url: &str,
|
||||
|
||||
+4
-4
@@ -2,7 +2,7 @@
|
||||
use crate::flutter;
|
||||
#[cfg(target_os = "windows")]
|
||||
use crate::platform::windows::{get_char_from_vk, get_unicode_from_vk};
|
||||
#[cfg(not(feature = "flutter"))]
|
||||
#[cfg(not(any(feature = "flutter", feature = "cli")))]
|
||||
use crate::ui::CUR_SESSION;
|
||||
use crate::ui_session_interface::{InvokeUiSession, Session};
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
@@ -469,7 +469,7 @@ static mut IS_LEFT_OPTION_DOWN: bool = false;
|
||||
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
fn get_keyboard_mode() -> String {
|
||||
#[cfg(not(feature = "flutter"))]
|
||||
#[cfg(not(any(feature = "flutter", feature = "cli")))]
|
||||
if let Some(session) = CUR_SESSION.lock().unwrap().as_ref() {
|
||||
return session.get_keyboard_mode();
|
||||
}
|
||||
@@ -991,7 +991,7 @@ pub fn event_to_key_events(
|
||||
}
|
||||
|
||||
pub fn send_key_event(key_event: &KeyEvent) {
|
||||
#[cfg(not(feature = "flutter"))]
|
||||
#[cfg(not(any(feature = "flutter", feature = "cli")))]
|
||||
if let Some(session) = CUR_SESSION.lock().unwrap().as_ref() {
|
||||
session.send_key_event(key_event);
|
||||
}
|
||||
@@ -1003,7 +1003,7 @@ pub fn send_key_event(key_event: &KeyEvent) {
|
||||
}
|
||||
|
||||
pub fn get_peer_platform() -> String {
|
||||
#[cfg(not(feature = "flutter"))]
|
||||
#[cfg(not(any(feature = "flutter", feature = "cli")))]
|
||||
if let Some(session) = CUR_SESSION.lock().unwrap().as_ref() {
|
||||
return session.peer_platform();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "اتصال الوسيط"),
|
||||
("Secure Connection", "اتصال آمن"),
|
||||
("Insecure Connection", "اتصال غير آمن"),
|
||||
("Continue", ""),
|
||||
("Scale original", "المقياس الأصلي"),
|
||||
("Scale adaptive", "مقياس التكيف"),
|
||||
("General", "عام"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "الإظهار على شريط الأدوات المُصغّر"),
|
||||
("All monitors", "جميع الشاشات"),
|
||||
("#{} monitor", "الشاشة رقم {}"),
|
||||
("conn-e2ee-unavailable-tip", "تعذر التحقق من التشفير من طرف إلى طرف.\nقد يكون الجهاز البعيد ما يزال قيد الإعداد. حاول مرة أخرى لاحقًا.\nإذا استمر حدوث ذلك، فقد يكون الخادم غير موثوق به.\nهل تريد المتابعة على أي حال؟"),
|
||||
("ID whitelisting", "القائمة البيضاء للمعرفات"),
|
||||
("Use ID whitelisting", "استخدام القائمة البيضاء للمعرفات"),
|
||||
("id_whitelist_tip", "فقط المعرفات في القائمة البيضاء تستطيع الوصول لي"),
|
||||
("id_whitelist_wildcard_tip", "أحرف البدل مدعومة: '*' يطابق أي عدد من الأحرف، '?' يطابق حرفاً واحداً بالضبط"),
|
||||
("Invalid ID", "معرف غير صحيح"),
|
||||
("Your ID is blocked by the peer", "تم حظر معرفك من قبل الطرف الآخر"),
|
||||
("Your ip is blocked by the peer", "تم حظر عنوان IP الخاص بك من قبل الطرف الآخر"),
|
||||
("id_whitelist_caveat_tip", "يتم الإبلاغ عن المعرف من قبل العميل المتصل. القائمة البيضاء تقلل من التعرض ولا تغني عن كلمة المرور أو 2FA"),
|
||||
("whitelist_cidr_tip", "يتم دعم صيغة CIDR، مثال: 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Рэтрансляванае падключэнне"),
|
||||
("Secure Connection", "Бяспечнае падключэнне"),
|
||||
("Insecure Connection", "Нябяспечнае падключэнне"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Арыгінальны маштаб"),
|
||||
("Scale adaptive", "Адаптыўны маштаб"),
|
||||
("General", "Агульныя"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Паказваць на згорнутай панэлі інструментаў"),
|
||||
("All monitors", "Усе манітори"),
|
||||
("#{} monitor", "Манітор {}"),
|
||||
("conn-e2ee-unavailable-tip", "Не ўдалося праверыць скразное шыфраванне.\nАддаленая прылада, магчыма, яшчэ наладжваецца. Паспрабуйце пазней.\nКалі гэта будзе паўтарацца, сервер можа быць ненадзейным.\nУсё роўна працягнуць?"),
|
||||
("ID whitelisting", "Спіс дазволеных ID"),
|
||||
("Use ID whitelisting", "Выкарыстоўваць белы спіс ID"),
|
||||
("id_whitelist_tip", "Атрымліваць доступ да маёй прылады могуць толькі ID з белага спісу."),
|
||||
("id_whitelist_wildcard_tip", "Падтрымліваюцца падстаноўныя знакі: '*' адпавядае любой колькасці сімвалаў, '?' — роўна аднаму сімвалу"),
|
||||
("Invalid ID", "Няправільны ID"),
|
||||
("Your ID is blocked by the peer", "Ваш ID заблакаваны аддаленай прыладай"),
|
||||
("Your ip is blocked by the peer", "Ваш IP-адрас заблакаваны аддаленай прыладай"),
|
||||
("id_whitelist_caveat_tip", "ID паведамляецца кліентам, які падключаецца. Белы спіс памяншае паверхню атакі і не замяняе пароль або 2FA"),
|
||||
("whitelist_cidr_tip", "Падтрымліваецца натацыя CIDR, напрыклад: 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Релейна връзка"),
|
||||
("Secure Connection", "Сигурна връзка"),
|
||||
("Insecure Connection", "Несигурна връзка"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Оригинален мащаб"),
|
||||
("Scale adaptive", "Приспособимо мащабиране"),
|
||||
("General", "Основен"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Показване в минимизираната лента с инструменти"),
|
||||
("All monitors", "Всички монитори"),
|
||||
("#{} monitor", "Монитор {}"),
|
||||
("conn-e2ee-unavailable-tip", "Шифроването от край до край не може да бъде проверено.\nОтдалеченото устройство може все още да се настройва. Опитайте отново по-късно.\nАко това продължи, сървърът може да не е надежден.\nДа се продължи ли въпреки това?"),
|
||||
("ID whitelisting", "Позволени ID"),
|
||||
("Use ID whitelisting", "Използване бял списък с ID"),
|
||||
("id_whitelist_tip", "Само ID от белия списък имат достъп до мен"),
|
||||
("id_whitelist_wildcard_tip", "Поддържат се заместващи символи: '*' съответства на произволен брой знаци, '?' — на точно един знак"),
|
||||
("Invalid ID", "Невалидно ID"),
|
||||
("Your ID is blocked by the peer", "Вашето ID е блокирано от отсрещната страна"),
|
||||
("Your ip is blocked by the peer", "Вашият IP адрес е блокиран от отсрещната страна"),
|
||||
("id_whitelist_caveat_tip", "ID се съобщава от свързващия се клиент. Белият списък намалява изложеността и не замества паролата или 2FA"),
|
||||
("whitelist_cidr_tip", "Поддържа се CIDR нотация, например: 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Connexió amb repetidor"),
|
||||
("Secure Connection", "Connexió segura"),
|
||||
("Insecure Connection", "Connexió no segura"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Escala original"),
|
||||
("Scale adaptive", "Escala adaptativa"),
|
||||
("General", "General"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Mostra a la barra d’eines minimitzada"),
|
||||
("All monitors", "Tots els monitors"),
|
||||
("#{} monitor", "Monitor {}"),
|
||||
("conn-e2ee-unavailable-tip", "No s'ha pogut verificar el xifratge d'extrem a extrem.\nEl dispositiu remot encara es pot estar configurant. Torneu-ho a provar més tard.\nSi això continua passant, el servidor pot no ser de confiança.\nVoleu continuar igualment?"),
|
||||
("ID whitelisting", "ID admesos"),
|
||||
("Use ID whitelisting", "Utilitza un llistat d'ID admesos"),
|
||||
("id_whitelist_tip", "Només els ID admesos es podran connectar"),
|
||||
("id_whitelist_wildcard_tip", "S'admeten comodins: '*' coincideix amb qualsevol nombre de caràcters, '?' amb un sol caràcter"),
|
||||
("Invalid ID", "ID no vàlid"),
|
||||
("Your ID is blocked by the peer", "El vostre ID està bloquejat per l'altre extrem"),
|
||||
("Your ip is blocked by the peer", "La vostra IP està bloquejada per l'altre extrem"),
|
||||
("id_whitelist_caveat_tip", "L'ID és informat pel client que es connecta. Aquesta llista blanca redueix l'exposició i no substitueix la contrasenya ni la 2FA"),
|
||||
("whitelist_cidr_tip", "S'admet la notació CIDR, per exemple 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "中继连接"),
|
||||
("Secure Connection", "安全连接"),
|
||||
("Insecure Connection", "非安全连接"),
|
||||
("Continue", ""),
|
||||
("Scale original", "原始尺寸"),
|
||||
("Scale adaptive", "适应窗口"),
|
||||
("General", "常规"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "在最小化工具栏上显示"),
|
||||
("All monitors", "所有显示器"),
|
||||
("#{} monitor", "{}号显示器"),
|
||||
("conn-e2ee-unavailable-tip", "无法验证端到端加密。\n远程设备可能仍在准备中,请稍后重试。\n如果此问题持续出现,服务器可能不受信任。\n仍要继续吗?"),
|
||||
("ID whitelisting", "ID 白名单"),
|
||||
("Use ID whitelisting", "只允许白名单上的 ID 访问"),
|
||||
("id_whitelist_tip", "只有白名单里的 ID 才能访问本机"),
|
||||
("id_whitelist_wildcard_tip", "支持通配符:'*' 匹配任意数量的字符,'?' 匹配单个字符"),
|
||||
("Invalid ID", "无效 ID"),
|
||||
("Your ID is blocked by the peer", "你的 ID 已被对方阻止"),
|
||||
("Your ip is blocked by the peer", "你的 IP 已被对方阻止"),
|
||||
("id_whitelist_caveat_tip", "ID 由对端客户端上报,白名单用于减少暴露面,不能替代密码或 2FA"),
|
||||
("whitelist_cidr_tip", "支持 CIDR 写法,例如 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Připojení předávací server"),
|
||||
("Secure Connection", "Zabezpečené připojení"),
|
||||
("Insecure Connection", "Nezabezpečené připojení"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Originální měřítko"),
|
||||
("Scale adaptive", "Adaptivní měřítko"),
|
||||
("General", "Obecné"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Zobrazit na minimalizovaném panelu nástrojů"),
|
||||
("All monitors", "Všechny monitory"),
|
||||
("#{} monitor", "Monitor č. {}"),
|
||||
("conn-e2ee-unavailable-tip", "Nepodařilo se ověřit koncové šifrování.\nVzdálené zařízení se možná stále nastavuje. Zkuste to znovu později.\nPokud se to bude opakovat, server nemusí být důvěryhodný.\nPřesto pokračovat?"),
|
||||
("ID whitelisting", "Povolování pouze z daných ID"),
|
||||
("Use ID whitelisting", "Použít bílou listinu ID"),
|
||||
("id_whitelist_tip", "Přístup je umožněn pouze z ID, nacházejících se na seznamu povolených"),
|
||||
("id_whitelist_wildcard_tip", "Jsou podporovány zástupné znaky: '*' odpovídá libovolnému počtu znaků, '?' právě jednomu znaku"),
|
||||
("Invalid ID", "Neplatné ID"),
|
||||
("Your ID is blocked by the peer", "Vaše ID je protistranou blokováno"),
|
||||
("Your ip is blocked by the peer", "Vaše IP adresa je protistranou blokována"),
|
||||
("id_whitelist_caveat_tip", "ID je hlášeno připojujícím se klientem. Tento seznam snižuje vystavení a nenahrazuje heslo ani 2FA"),
|
||||
("whitelist_cidr_tip", "Je podporován zápis CIDR, například 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Viderestillingsforbindelse"),
|
||||
("Secure Connection", "Sikker forbindelse"),
|
||||
("Insecure Connection", "Usikker forbindelse"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Original skalering"),
|
||||
("Scale adaptive", "Adaptiv skalering"),
|
||||
("General", "Generelt"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Vis på den minimerede værktøjslinje"),
|
||||
("All monitors", "Alle skærme"),
|
||||
("#{} monitor", "Skærm {}"),
|
||||
("conn-e2ee-unavailable-tip", "End-to-end-kryptering kunne ikke bekræftes.\nDen eksterne enhed er muligvis stadig ved at blive konfigureret. Prøv igen senere.\nHvis dette fortsætter, er serveren muligvis ikke pålidelig.\nFortsæt alligevel?"),
|
||||
("ID whitelisting", "ID whitelisting"),
|
||||
("Use ID whitelisting", "Brug ID whitelisting"),
|
||||
("id_whitelist_tip", "Kun ID'er på whitelisten kan få adgang til mig"),
|
||||
("id_whitelist_wildcard_tip", "Jokertegn understøttes: '*' matcher et vilkårligt antal tegn, '?' matcher præcist ét tegn"),
|
||||
("Invalid ID", "Ugyldigt ID"),
|
||||
("Your ID is blocked by the peer", "Dit ID er blokeret af modparten"),
|
||||
("Your ip is blocked by the peer", "Din IP-adresse er blokeret af modparten"),
|
||||
("id_whitelist_caveat_tip", "ID'et rapporteres af den klient, der opretter forbindelse. Whitelisten reducerer eksponeringen og erstatter ikke adgangskode eller 2FA"),
|
||||
("whitelist_cidr_tip", "CIDR-notation understøttes, f.eks. 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Relay-Verbindung"),
|
||||
("Secure Connection", "Sichere Verbindung"),
|
||||
("Insecure Connection", "Unsichere Verbindung"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Keine Skalierung"),
|
||||
("Scale adaptive", "Anpassbare Skalierung"),
|
||||
("General", "Allgemein"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "In der minimierten Symbolleiste anzeigen"),
|
||||
("All monitors", "Alle Bildschirme"),
|
||||
("#{} monitor", "Bildschirm {}"),
|
||||
("conn-e2ee-unavailable-tip", "Ende-zu-Ende-Verschlüsselung konnte nicht verifiziert werden.\nDas entfernte Gerät wird möglicherweise noch eingerichtet. Versuchen Sie es später erneut.\nWenn dies weiterhin auftritt, ist der Server möglicherweise nicht vertrauenswürdig.\nTrotzdem fortfahren?"),
|
||||
("ID whitelisting", "ID-Whitelist"),
|
||||
("Use ID whitelisting", "ID-Whitelist verwenden"),
|
||||
("id_whitelist_tip", "Nur IDs auf der Whitelist können zugreifen."),
|
||||
("id_whitelist_wildcard_tip", "Platzhalter werden unterstützt: '*' steht für beliebig viele Zeichen, '?' für genau ein Zeichen"),
|
||||
("Invalid ID", "Ungültige ID"),
|
||||
("Your ID is blocked by the peer", "Ihre ID wird von der Gegenstelle blockiert"),
|
||||
("Your ip is blocked by the peer", "Ihre IP-Adresse wird von der Gegenstelle blockiert"),
|
||||
("id_whitelist_caveat_tip", "Die ID wird vom verbindenden Client gemeldet. Die Whitelist verringert die Angriffsfläche und ersetzt weder Passwort noch 2FA"),
|
||||
("whitelist_cidr_tip", "Die CIDR-Notation wird unterstützt, z. B. 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Αναμεταδιδόμενη σύνδεση"),
|
||||
("Secure Connection", "Ασφαλής σύνδεση"),
|
||||
("Insecure Connection", "Μη ασφαλής σύνδεση"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Κλιμάκωση πρωτότυπου"),
|
||||
("Scale adaptive", "Προσαρμοσμένη κλίμακα"),
|
||||
("General", "Γενικά"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Εμφάνιση στην ελαχιστοποιημένη γραμμή εργαλείων"),
|
||||
("All monitors", "Όλες οι οθόνες"),
|
||||
("#{} monitor", "Οθόνη {}"),
|
||||
("conn-e2ee-unavailable-tip", "Δεν ήταν δυνατή η επαλήθευση της κρυπτογράφησης από άκρο σε άκρο.\nΗ απομακρυσμένη συσκευή μπορεί να ρυθμίζεται ακόμα. Δοκιμάστε ξανά αργότερα.\nΑν αυτό συνεχιστεί, ο διακομιστής μπορεί να μην είναι αξιόπιστος.\nΣυνέχεια παρ' όλα αυτά;"),
|
||||
("ID whitelisting", "Λίστα επιτρεπόμενων ID"),
|
||||
("Use ID whitelisting", "Χρήση λίστας επιτρεπόμενων ID"),
|
||||
("id_whitelist_tip", "Μόνο τα ID της λίστας επιτρεπόμενων έχουν πρόσβαση σε εμένα"),
|
||||
("id_whitelist_wildcard_tip", "Υποστηρίζονται χαρακτήρες μπαλαντέρ: το '*' αντιστοιχεί σε οποιονδήποτε αριθμό χαρακτήρων, το '?' σε έναν ακριβώς χαρακτήρα"),
|
||||
("Invalid ID", "Μη έγκυρο ID"),
|
||||
("Your ID is blocked by the peer", "Το ID σας έχει αποκλειστεί από τον απομακρυσμένο υπολογιστή"),
|
||||
("Your ip is blocked by the peer", "Η διεύθυνση IP σας έχει αποκλειστεί από τον απομακρυσμένο υπολογιστή"),
|
||||
("id_whitelist_caveat_tip", "Το ID αναφέρεται από τον πελάτη που συνδέεται. Η λίστα επιτρεπόμενων μειώνει την έκθεση και δεν αντικαθιστά τον κωδικό πρόσβασης ή το 2FA"),
|
||||
("whitelist_cidr_tip", "Υποστηρίζεται η σημειογραφία CIDR, π.χ. 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -279,11 +279,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("wayland-soft-keyboard-input-label", "Soft keyboard input"),
|
||||
("wayland-keyboard-input-reset-choice-tip", "Reset keyboard input choice"),
|
||||
("remember-wayland-keyboard-choice-tip", "Don't ask again for this remote computer"),
|
||||
("conn-e2ee-unavailable-tip", "Could not verify end-to-end encryption.\nThe remote device may still be setting up. Try again later.\nIf this keeps happening, the server may be untrusted.\nContinue anyway?"),
|
||||
("id_whitelist_tip", "Only whitelisted IDs can access me"),
|
||||
("id_whitelist_wildcard_tip", "Wildcards are supported: '*' matches any number of characters, '?' matches exactly one character"),
|
||||
("id_whitelist_caveat_tip", "The ID is reported by the connecting client. This whitelist reduces exposure and does not replace the password or 2FA."),
|
||||
("whitelist_cidr_tip", "CIDR notation is supported, e.g. 192.168.1.0/24"),
|
||||
("Your ip is blocked by the peer", "Your IP is blocked by the peer")
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Relajsa Konekto"),
|
||||
("Secure Connection", "Sekura Konekto"),
|
||||
("Insecure Connection", "Nesekura Konekto"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Skalo originalo"),
|
||||
("Scale adaptive", "Skalo adapta"),
|
||||
("General", "Ĝenerala"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Montri en la minimumigita ilobreto"),
|
||||
("All monitors", "Ĉiuj monitoroj"),
|
||||
("#{} monitor", "Monitoro {}"),
|
||||
("conn-e2ee-unavailable-tip", "Ne eblis kontroli la fin-al-finan ĉifradon.\nLa fora aparato eble ankoraŭ estas agordata. Provu denove poste.\nSe tio daŭre okazas, la servilo eble estas nefidinda.\nĈu daŭrigi tamen?"),
|
||||
("ID whitelisting", "Listo de ID akceptataj"),
|
||||
("Use ID whitelisting", "Uzi liston de ID akceptataj"),
|
||||
("id_whitelist_tip", "Nur la ID en la blanka listo povas kontroli mian komputilon"),
|
||||
("id_whitelist_wildcard_tip", "Ĵokeroj estas subtenataj: '*' kongruas kun iu ajn nombro da signoj, '?' kun ekzakte unu signo"),
|
||||
("Invalid ID", "ID nevalida"),
|
||||
("Your ID is blocked by the peer", "Via ID estas blokita de la alia flanko"),
|
||||
("Your ip is blocked by the peer", "Via IP estas blokita de la alia flanko"),
|
||||
("id_whitelist_caveat_tip", "La ID estas raportata de la konektiĝanta kliento. La blanka listo malpliigas la eksponiĝon kaj ne anstataŭas la pasvorton aŭ 2FA"),
|
||||
("whitelist_cidr_tip", "La notacio CIDR estas subtenata, ekzemple 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Conexión Relay"),
|
||||
("Secure Connection", "Conexión segura"),
|
||||
("Insecure Connection", "Conexión insegura"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Escala original"),
|
||||
("Scale adaptive", "Escala adaptativa"),
|
||||
("General", "General"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Mostrar en la barra de herramientas minimizada"),
|
||||
("All monitors", "Todos los monitores"),
|
||||
("#{} monitor", "Monitor {}"),
|
||||
("conn-e2ee-unavailable-tip", "No se pudo verificar el cifrado de extremo a extremo.\nEs posible que el dispositivo remoto aún se esté configurando. Inténtelo de nuevo más tarde.\nSi esto sigue ocurriendo, es posible que el servidor no sea de confianza.\n¿Continuar de todos modos?"),
|
||||
("ID whitelisting", "IDs admitidos"),
|
||||
("Use ID whitelisting", "Usar lista de IDs admitidos"),
|
||||
("id_whitelist_tip", "Solo los IDs autorizados pueden conectarse a este escritorio"),
|
||||
("id_whitelist_wildcard_tip", "Se admiten comodines: '*' coincide con cualquier número de caracteres, '?' con exactamente un carácter"),
|
||||
("Invalid ID", "ID incorrecto"),
|
||||
("Your ID is blocked by the peer", "Tu ID está bloqueado por el dispositivo remoto"),
|
||||
("Your ip is blocked by the peer", "Tu IP está bloqueada por el dispositivo remoto"),
|
||||
("id_whitelist_caveat_tip", "El ID lo comunica el cliente que se conecta. Esta lista blanca reduce la exposición y no sustituye a la contraseña ni al 2FA"),
|
||||
("whitelist_cidr_tip", "Se admite la notación CIDR, por ejemplo 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Releeühendus"),
|
||||
("Secure Connection", "Turvaline ühendus"),
|
||||
("Insecure Connection", "Ebaturvaline ühendus"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Originaalskaala"),
|
||||
("Scale adaptive", "Kohanduv skaala"),
|
||||
("General", "Üldine"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Näita minimeeritud tööriistaribal"),
|
||||
("All monitors", "Kõik kuvarid"),
|
||||
("#{} monitor", "Kuvar {}"),
|
||||
("conn-e2ee-unavailable-tip", "Otspunktkrüptimist ei saanud kontrollida.\nKaugseade võib olla veel seadistamisel. Proovige hiljem uuesti.\nKui see jätkub, ei pruugi server olla usaldusväärne.\nKas jätkata siiski?"),
|
||||
("ID whitelisting", "ID lubamisloend"),
|
||||
("Use ID whitelisting", "Kasuta ID-lubamisloendit"),
|
||||
("id_whitelist_tip", "Ainult lubamisloendis ID saab mulle ligi"),
|
||||
("id_whitelist_wildcard_tip", "Metamärgid on toetatud: '*' vastab suvalisele arvule märkidele, '?' täpselt ühele märgile"),
|
||||
("Invalid ID", "Sobimatu ID"),
|
||||
("Your ID is blocked by the peer", "Teine pool on sinu ID blokeerinud"),
|
||||
("Your ip is blocked by the peer", "Teine pool on sinu IP-aadressi blokeerinud"),
|
||||
("id_whitelist_caveat_tip", "ID edastab ühenduv klient. Lubamisloend vähendab eksponeeritust ega asenda parooli või 2FA-d"),
|
||||
("whitelist_cidr_tip", "Toetatud on CIDR-tähistus, näiteks 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Konexio igorria"),
|
||||
("Secure Connection", "Konexio segurua"),
|
||||
("Insecure Connection", "Konexio ez-segurua"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Jatorrizko eskala"),
|
||||
("Scale adaptive", "Eskala moldagarria"),
|
||||
("General", "Orokorra"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Erakutsi minimizatutako tresna-barran"),
|
||||
("All monitors", "Monitore guztiak"),
|
||||
("#{} monitor", "{}. monitorea"),
|
||||
("conn-e2ee-unavailable-tip", "Ezin izan da muturretik muturrerako enkriptatzea egiaztatu.\nUrruneko gailua oraindik konfiguratzen ari daiteke. Saiatu berriro geroago.\nHonek jarraitzen badu, zerbitzaria fidagaitza izan daiteke.\nHala ere jarraitu?"),
|
||||
("ID whitelisting", "Onartutako IDak"),
|
||||
("Use ID whitelisting", "Erabili ID onartuen zerrenda"),
|
||||
("id_whitelist_tip", "Baimendutako IDak soilik konektatu daitezke mahaigain honetara"),
|
||||
("id_whitelist_wildcard_tip", "Komodinak onartzen dira: '*' edozein karaktere kopururekin bat dator, '?' karaktere bakar batekin"),
|
||||
("Invalid ID", "ID baliogabea"),
|
||||
("Your ID is blocked by the peer", "Beste aldeak zure IDa blokeatu du"),
|
||||
("Your ip is blocked by the peer", "Beste aldeak zure IP helbidea blokeatu du"),
|
||||
("id_whitelist_caveat_tip", "IDa konektatzen den bezeroak jakinarazten du. Zerrenda honek esposizioa murrizten du eta ez du pasahitza edo 2FA ordezkatzen"),
|
||||
("whitelist_cidr_tip", "CIDR notazioa onartzen da, adibidez 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Relay ارتباط"),
|
||||
("Secure Connection", "ارتباط امن"),
|
||||
("Insecure Connection", "ارتباط غیر امن"),
|
||||
("Continue", ""),
|
||||
("Scale original", "مقیاس اصلی"),
|
||||
("Scale adaptive", "مقیاس تطبیقی"),
|
||||
("General", "عمومی"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "نمایش در نوار ابزار کوچکشده"),
|
||||
("All monitors", "همه نمایشگرها"),
|
||||
("#{} monitor", "نمایشگر {}"),
|
||||
("conn-e2ee-unavailable-tip", "رمزنگاری سرتاسری قابل تأیید نیست.\nدستگاه راه دور ممکن است هنوز در حال آمادهسازی باشد. بعداً دوباره تلاش کنید.\nاگر این مشکل ادامه داشت، سرور ممکن است نامطمئن باشد.\nبا این حال ادامه میدهید؟"),
|
||||
("ID whitelisting", "لیست شناسه های مجاز"),
|
||||
("Use ID whitelisting", "استفاده از لیست شناسه های مجاز"),
|
||||
("id_whitelist_tip", "فقط شناسه های مجاز می توانند به این دسکتاپ متصل شوند"),
|
||||
("id_whitelist_wildcard_tip", "نویسه های عام پشتیبانی می شوند: '*' با هر تعداد نویسه و '?' دقیقا با یک نویسه مطابقت دارد"),
|
||||
("Invalid ID", "شناسه نامعتبر است"),
|
||||
("Your ID is blocked by the peer", "شناسه شما توسط طرف مقابل مسدود شده است"),
|
||||
("Your ip is blocked by the peer", "نشانی IP شما توسط طرف مقابل مسدود شده است"),
|
||||
("id_whitelist_caveat_tip", "شناسه توسط کلاینت متصل شونده گزارش می شود. لیست مجاز سطح در معرض بودن را کاهش می دهد و جایگزین رمز عبور یا 2FA نیست"),
|
||||
("whitelist_cidr_tip", "نماد CIDR پشتیبانی می شود، برای مثال 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Välitetty yhteys"),
|
||||
("Secure Connection", "Suojattu yhteys"),
|
||||
("Insecure Connection", "Suojaamaton yhteys"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Skaalaa alkuperäinen"),
|
||||
("Scale adaptive", "Mukautuva skaalaus"),
|
||||
("General", "Yleiset"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Näytä pienennetyssä työkalurivissä"),
|
||||
("All monitors", "Kaikki näytöt"),
|
||||
("#{} monitor", "Näyttö {}"),
|
||||
("conn-e2ee-unavailable-tip", "Päästä päähän -salausta ei voitu vahvistaa.\nEtälaite voi olla vielä määritettävänä. Yritä myöhemmin uudelleen.\nJos tämä jatkuu, palvelin ei ehkä ole luotettava.\nJatketaanko silti?"),
|
||||
("ID whitelisting", "ID sallintalista"),
|
||||
("Use ID whitelisting", "Käytä ID sallintalistaa"),
|
||||
("id_whitelist_tip", "Vain sallitut ID:t voivat muodostaa yhteyden"),
|
||||
("id_whitelist_wildcard_tip", "Jokerimerkit ovat tuettuja: '*' vastaa mitä tahansa määrää merkkejä, '?' täsmälleen yhtä merkkiä"),
|
||||
("Invalid ID", "Virheellinen ID"),
|
||||
("Your ID is blocked by the peer", "Vastapuoli on estänyt ID:si"),
|
||||
("Your ip is blocked by the peer", "Vastapuoli on estänyt IP-osoitteesi"),
|
||||
("id_whitelist_caveat_tip", "ID on yhdistävän asiakkaan ilmoittama. Sallintalista pienentää altistusta eikä korvaa salasanaa tai 2FA:ta"),
|
||||
("whitelist_cidr_tip", "CIDR-merkintä on tuettu, esimerkiksi 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Connexion via relais"),
|
||||
("Secure Connection", "Connexion sécurisée"),
|
||||
("Insecure Connection", "Connexion non sécurisée"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Échelle originale"),
|
||||
("Scale adaptive", "Échelle adaptative"),
|
||||
("General", "Général"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Afficher dans la barre d’outils réduite"),
|
||||
("All monitors", "Tous les moniteurs"),
|
||||
("#{} monitor", "Moniteur {}"),
|
||||
("conn-e2ee-unavailable-tip", "Impossible de vérifier le chiffrement de bout en bout.\nL'appareil distant est peut-être encore en cours de configuration. Réessayez plus tard.\nSi le problème persiste, le serveur n'est peut-être pas fiable.\nContinuer quand même ?"),
|
||||
("ID whitelisting", "Liste blanche d’ID"),
|
||||
("Use ID whitelisting", "Utiliser une liste blanche d’ID"),
|
||||
("id_whitelist_tip", "Seuls les ID inclus dans la liste blanche pourront accéder à mon appareil"),
|
||||
("id_whitelist_wildcard_tip", "Les caractères génériques sont pris en charge : '*' correspond à un nombre quelconque de caractères, '?' à un seul caractère"),
|
||||
("Invalid ID", "ID non valide"),
|
||||
("Your ID is blocked by the peer", "Votre ID est bloqué par l’appareil distant"),
|
||||
("Your ip is blocked by the peer", "Votre adresse IP est bloquée par l’appareil distant"),
|
||||
("id_whitelist_caveat_tip", "L’ID est déclaré par le client qui se connecte. Cette liste blanche réduit l’exposition et ne remplace ni le mot de passe ni la 2FA"),
|
||||
("whitelist_cidr_tip", "La notation CIDR est prise en charge, par exemple 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "რეტრანსლირებული კავშირი"),
|
||||
("Secure Connection", "უსაფრთხო კავშირი"),
|
||||
("Insecure Connection", "არაუსაფრთხო კავშირი"),
|
||||
("Continue", ""),
|
||||
("Scale original", "ორიგინალური მასშტაბი"),
|
||||
("Scale adaptive", "ადაპტირებადი მასშტაბი"),
|
||||
("General", "ზოგადი"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "ჩვენება ჩაკეცილ ხელსაწყოთა ზოლზე"),
|
||||
("All monitors", "ყველა მონიტორი"),
|
||||
("#{} monitor", "მონიტორი {}"),
|
||||
("conn-e2ee-unavailable-tip", "ბოლომდე დაშიფვრის გადამოწმება ვერ მოხერხდა.\nდისტანციური მოწყობილობა შესაძლოა ჯერ კიდევ მზადდება. სცადეთ მოგვიანებით.\nთუ ეს კვლავ გაგრძელდება, სერვერი შესაძლოა არასანდო იყოს.\nმაინც გააგრძელებთ?"),
|
||||
("ID whitelisting", "დაშვებული ID-ების სია"),
|
||||
("Use ID whitelisting", "ID თეთრი სიის გამოყენება"),
|
||||
("id_whitelist_tip", "მხოლოდ თეთრ სიაში არსებულ ID-ებს შეუძლიათ ჩემს მოწყობილობაზე წვდომა."),
|
||||
("id_whitelist_wildcard_tip", "მხარდაჭერილია ვაილდქარდები: '*' ემთხვევა ნებისმიერი რაოდენობის სიმბოლოს, '?' — ზუსტად ერთ სიმბოლოს"),
|
||||
("Invalid ID", "არასწორი ID"),
|
||||
("Your ID is blocked by the peer", "თქვენი ID დაბლოკილია მეორე მხარის მიერ"),
|
||||
("Your ip is blocked by the peer", "თქვენი IP მისამართი დაბლოკილია მეორე მხარის მიერ"),
|
||||
("id_whitelist_caveat_tip", "ID-ს აცხადებს დამაკავშირებელი კლიენტი. თეთრი სია ამცირებს ექსპოზიციას და ვერ ჩაანაცვლებს პაროლს ან 2FA-ს"),
|
||||
("whitelist_cidr_tip", "მხარდაჭერილია CIDR ჩანაწერი, მაგალითად 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "રિલે કનેક્શન"),
|
||||
("Secure Connection", "સુરક્ષિત કનેક્શન"),
|
||||
("Insecure Connection", "અસુરક્ષિત કનેક્શન"),
|
||||
("Continue", ""),
|
||||
("Scale original", "મૂળ સ્કેલ"),
|
||||
("Scale adaptive", "એડેપ્ટિવ સ્કેલ"),
|
||||
("General", "સામાન્ય"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "ન્યૂનતમ કરેલા ટૂલબાર પર બતાવો"),
|
||||
("All monitors", "બધા મોનિટર"),
|
||||
("#{} monitor", "મોનિટર {}"),
|
||||
("conn-e2ee-unavailable-tip", "એન્ડ-ટુ-એન્ડ એન્ક્રિપ્શન ચકાસી શકાયું નથી.\nરિમોટ ઉપકરણ હજી સેટ થઈ રહ્યું હોઈ શકે છે. પછીથી ફરી પ્રયાસ કરો.\nજો આ ચાલુ રહે, તો સર્વર અવિશ્વસનીય હોઈ શકે છે.\nશું તેમ છતાં ચાલુ રાખવું?"),
|
||||
("ID whitelisting", "ID વ્હાઇટલિસ્ટિંગ"),
|
||||
("Use ID whitelisting", "ID વ્હાઇટલિસ્ટિંગનો ઉપયોગ કરો"),
|
||||
("id_whitelist_tip", "માત્ર વ્હાઇટલિસ્ટ કરેલ ID જ મને એક્સેસ કરી શકે છે"),
|
||||
("id_whitelist_wildcard_tip", "વાઇલ્ડકાર્ડ સપોર્ટેડ છે: '*' કોઈપણ સંખ્યાના અક્ષરો સાથે મેળ ખાય છે, '?' બરાબર એક અક્ષર સાથે"),
|
||||
("Invalid ID", "અમાન્ય ID"),
|
||||
("Your ID is blocked by the peer", "તમારું ID સામેના પક્ષ દ્વારા બ્લોક કરવામાં આવ્યું છે"),
|
||||
("Your ip is blocked by the peer", "તમારું IP સામેના પક્ષ દ્વારા બ્લોક કરવામાં આવ્યું છે"),
|
||||
("id_whitelist_caveat_tip", "ID કનેક્ટ થતા ક્લાયન્ટ દ્વારા જણાવવામાં આવે છે. વ્હાઇટલિસ્ટ એક્સપોઝર ઘટાડે છે અને પાસવર્ડ કે 2FA નો વિકલ્પ નથી"),
|
||||
("whitelist_cidr_tip", "CIDR નોટેશન સપોર્ટેડ છે, ઉदાહરણ તરીકે 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "חיבור באמצעות ממסר"),
|
||||
("Secure Connection", "חיבור מאובטח"),
|
||||
("Insecure Connection", "חיבור לא מאובטח"),
|
||||
("Continue", ""),
|
||||
("Scale original", "קנה מידה מקורי"),
|
||||
("Scale adaptive", "קנה מידה מותאם"),
|
||||
("General", "כללי"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "הצגה בסרגל הכלים הממוזער"),
|
||||
("All monitors", "כל המסכים"),
|
||||
("#{} monitor", "מסך {}"),
|
||||
("conn-e2ee-unavailable-tip", "לא ניתן לאמת הצפנה מקצה לקצה.\nייתכן שהמכשיר המרוחק עדיין בתהליך הגדרה. נסה שוב מאוחר יותר.\nאם זה ממשיך לקרות, ייתכן שהשרת אינו מהימן.\nלהמשיך בכל זאת?"),
|
||||
("ID whitelisting", "רשימת מזהים מורשים"),
|
||||
("Use ID whitelisting", "השתמש ברשימה לבנה של מזהים"),
|
||||
("id_whitelist_tip", "רק מזהים מהרשימה הלבנה יכולים לגשת אלי"),
|
||||
("id_whitelist_wildcard_tip", "נתמכים תווים כלליים: '*' תואם כל מספר של תווים, '?' תואם תו אחד בדיוק"),
|
||||
("Invalid ID", "מזהה לא תקין"),
|
||||
("Your ID is blocked by the peer", "המזהה שלך נחסם על ידי הצד המרוחק"),
|
||||
("Your ip is blocked by the peer", "כתובת ה-IP שלך נחסמה על ידי הצד המרוחק"),
|
||||
("id_whitelist_caveat_tip", "המזהה מדווח על ידי הלקוח המתחבר. הרשימה הלבנה מצמצמת חשיפה ואינה מחליפה סיסמה או 2FA"),
|
||||
("whitelist_cidr_tip", "יש תמיכה בסימון CIDR, לדוגמה 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "रिले कनेक्शन"),
|
||||
("Secure Connection", "सुरक्षित कनेक्शन"),
|
||||
("Insecure Connection", "असुरक्षित कनेक्शन"),
|
||||
("Continue", ""),
|
||||
("Scale original", "मूल पैमाना"),
|
||||
("Scale adaptive", "अनुकूली पैमाना"),
|
||||
("General", "सामान्य"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "न्यूनतम किए गए टूलबार पर दिखाएं"),
|
||||
("All monitors", "सभी मॉनिटर"),
|
||||
("#{} monitor", "मॉनिटर {}"),
|
||||
("conn-e2ee-unavailable-tip", "एंड-टू-एंड एन्क्रिप्शन सत्यापित नहीं किया जा सका।\nदूरस्थ डिवाइस अभी भी सेट अप हो रहा हो सकता है। बाद में फिर प्रयास करें।\nयदि यह समस्या बनी रहती है, तो सर्वर अविश्वसनीय हो सकता है।\nफिर भी जारी रखें?"),
|
||||
("ID whitelisting", "ID श्वेतसूची (Whitelisting)"),
|
||||
("Use ID whitelisting", "ID श्वेतसूची का उपयोग करें"),
|
||||
("id_whitelist_tip", "केवल श्वेतसूचीबद्ध ID ही मुझ तक पहुंच सकते हैं"),
|
||||
("id_whitelist_wildcard_tip", "वाइल्डकार्ड समर्थित हैं: '*' किसी भी संख्या के अक्षरों से मेल खाता है, '?' ठीक एक अक्षर से"),
|
||||
("Invalid ID", "अमान्य ID"),
|
||||
("Your ID is blocked by the peer", "आपकी ID दूसरे पक्ष द्वारा अवरुद्ध कर दी गई है"),
|
||||
("Your ip is blocked by the peer", "आपका IP दूसरे पक्ष द्वारा अवरुद्ध कर दिया गया है"),
|
||||
("id_whitelist_caveat_tip", "ID कनेक्ट करने वाले क्लाइंट द्वारा बताई जाती है। श्वेतसूची जोखिम कम करती है और पासवर्ड या 2FA का विकल्प नहीं है"),
|
||||
("whitelist_cidr_tip", "CIDR नोटेशन समर्थित है, उदाहरण के लिए 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Posredna veza"),
|
||||
("Secure Connection", "Sigurna veza"),
|
||||
("Insecure Connection", "Nesigurna veza"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Skaliraj izvornik"),
|
||||
("Scale adaptive", "Prilagođeno skaliranje"),
|
||||
("General", "Općenito"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Prikaži na minimiziranoj alatnoj traci"),
|
||||
("All monitors", "Svi monitori"),
|
||||
("#{} monitor", "Monitor {}"),
|
||||
("conn-e2ee-unavailable-tip", "End-to-end enkripcija nije mogla biti potvrđena.\nUdaljeni uređaj se možda još postavlja. Pokušajte ponovno kasnije.\nAko se to nastavi događati, poslužitelj možda nije pouzdan.\nIpak nastaviti?"),
|
||||
("ID whitelisting", "ID pouzdana lista"),
|
||||
("Use ID whitelisting", "Koristi popis pouzdanih ID-ova"),
|
||||
("id_whitelist_tip", "Mogu mi pristupiti samo dozvoljeni ID-ovi"),
|
||||
("id_whitelist_wildcard_tip", "Podržani su zamjenski znakovi: '*' odgovara bilo kojem broju znakova, '?' točno jednom znaku"),
|
||||
("Invalid ID", "Nevažeći ID"),
|
||||
("Your ID is blocked by the peer", "Vaš ID je blokiralo udaljeno računalo"),
|
||||
("Your ip is blocked by the peer", "Vašu IP adresu je blokiralo udaljeno računalo"),
|
||||
("id_whitelist_caveat_tip", "ID prijavljuje klijent koji se povezuje. Ova lista smanjuje izloženost i ne zamjenjuje lozinku ni 2FA"),
|
||||
("whitelist_cidr_tip", "Podržan je CIDR zapis, primjerice 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Kapcsolódás továbbító-kiszolgálón keresztül"),
|
||||
("Secure Connection", "Biztonságos kapcsolat"),
|
||||
("Insecure Connection", "Nem biztonságos kapcsolat"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Eredeti méretarány"),
|
||||
("Scale adaptive", "Adaptív méretarány"),
|
||||
("General", "Általános"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Megjelenítés a kis méretű eszköztáron"),
|
||||
("All monitors", "Minden monitor"),
|
||||
("#{} monitor", "{}. monitor"),
|
||||
("conn-e2ee-unavailable-tip", "A végpontok közötti titkosítás nem volt ellenőrizhető.\nA távoli eszköz talán még beállítás alatt áll. Próbálja újra később.\nHa ez továbbra is előfordul, a szerver lehet, hogy nem megbízható.\nFolytatja így is?"),
|
||||
("ID whitelisting", "Azonosító engedélyezési lista"),
|
||||
("Use ID whitelisting", "Azonosító engedélyezési lista használata"),
|
||||
("id_whitelist_tip", "Csak az engedélyezési listán szereplő azonosítók kapcsolódhatnak"),
|
||||
("id_whitelist_wildcard_tip", "Helyettesítő karakterek használhatók: a '*' tetszőleges számú karakternek, a '?' pontosan egy karakternek felel meg"),
|
||||
("Invalid ID", "Érvénytelen azonosító"),
|
||||
("Your ID is blocked by the peer", "Az azonosítóját a távoli fél letiltotta"),
|
||||
("Your ip is blocked by the peer", "Az IP-címét a távoli fél letiltotta"),
|
||||
("id_whitelist_caveat_tip", "Az azonosítót a csatlakozó kliens jelenti. Az engedélyezési lista csökkenti a kitettséget, és nem helyettesíti a jelszót vagy a 2FA-t"),
|
||||
("whitelist_cidr_tip", "A CIDR jelölés támogatott, például 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Koneksi Relay"),
|
||||
("Secure Connection", "Koneksi aman"),
|
||||
("Insecure Connection", "Koneksi Tidak Aman"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Skala asli"),
|
||||
("Scale adaptive", "Skala adaptif"),
|
||||
("General", "Umum"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Tampilkan di bilah alat yang diperkecil"),
|
||||
("All monitors", "Semua monitor"),
|
||||
("#{} monitor", "Monitor {}"),
|
||||
("conn-e2ee-unavailable-tip", "Tidak dapat memverifikasi enkripsi ujung ke ujung.\nPerangkat jarak jauh mungkin masih disiapkan. Coba lagi nanti.\nJika ini terus terjadi, server mungkin tidak tepercaya.\nTetap lanjutkan?"),
|
||||
("ID whitelisting", "Daftar ID yang diizinkan"),
|
||||
("Use ID whitelisting", "Gunakan daftar ID yang diizinkan"),
|
||||
("id_whitelist_tip", "Hanya ID yang diizinkan dapat mengakses"),
|
||||
("id_whitelist_wildcard_tip", "Wildcard didukung: '*' cocok dengan berapa pun jumlah karakter, '?' dengan tepat satu karakter"),
|
||||
("Invalid ID", "ID tidak valid"),
|
||||
("Your ID is blocked by the peer", "ID Anda diblokir oleh perangkat remote"),
|
||||
("Your ip is blocked by the peer", "IP Anda diblokir oleh perangkat remote"),
|
||||
("id_whitelist_caveat_tip", "ID dilaporkan oleh klien yang terhubung. Daftar ini mengurangi paparan dan bukan pengganti kata sandi atau 2FA"),
|
||||
("whitelist_cidr_tip", "Notasi CIDR didukung, misalnya 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Connessione relay"),
|
||||
("Secure Connection", "Connessione sicura"),
|
||||
("Insecure Connection", "Connessione non sicura"),
|
||||
("Continue", "Continua"),
|
||||
("Scale original", "Scala originale"),
|
||||
("Scale adaptive", "Scala adattiva"),
|
||||
("General", "Generale"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Visualizza nella barra strumenti ridotta a icona"),
|
||||
("All monitors", "Tutti gli schermi"),
|
||||
("#{} monitor", "Schermo {}"),
|
||||
("conn-e2ee-unavailable-tip", "Impossibile verificare la crittografia end-to-end.\nIl dispositivo remoto potrebbe essere ancora in configurazione. Riprova più tardi.\nSe il problema persiste, il server potrebbe non essere attendibile.\nVuoi continuare?"),
|
||||
("ID whitelisting", "ID autorizzati"),
|
||||
("Use ID whitelisting", "Usa elenco ID autorizzati"),
|
||||
("id_whitelist_tip", "Possono connettersi a questo desktop solo gli ID autorizzati"),
|
||||
("id_whitelist_wildcard_tip", "Sono supportati i caratteri jolly: '*' corrisponde a un numero qualsiasi di caratteri, '?' a un solo carattere"),
|
||||
("Invalid ID", "ID non valido"),
|
||||
("Your ID is blocked by the peer", "Il tuo ID è bloccato dal dispositivo remoto"),
|
||||
("Your ip is blocked by the peer", "Il tuo IP è bloccato dal dispositivo remoto"),
|
||||
("id_whitelist_caveat_tip", "L'ID è dichiarato dal client che si connette. Questo elenco riduce l'esposizione e non sostituisce la password o la 2FA"),
|
||||
("whitelist_cidr_tip", "È supportata la notazione CIDR, ad esempio 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "中継接続"),
|
||||
("Secure Connection", "安全な接続"),
|
||||
("Insecure Connection", "安全でない接続"),
|
||||
("Continue", ""),
|
||||
("Scale original", "オリジナルのサイズ"),
|
||||
("Scale adaptive", "ウィンドウに合わせる"),
|
||||
("General", "一般"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "最小化したツールバーに表示"),
|
||||
("All monitors", "すべてのディスプレイ"),
|
||||
("#{} monitor", "ディスプレイ {}"),
|
||||
("conn-e2ee-unavailable-tip", "エンドツーエンド暗号化を確認できませんでした。\nリモートデバイスはまだ準備中の可能性があります。後でもう一度お試しください。\nこの問題が続く場合、サーバーが信頼できない可能性があります。\nそれでも続行しますか?"),
|
||||
("ID whitelisting", "ID ホワイトリスト"),
|
||||
("Use ID whitelisting", "ID ホワイトリストを使用する"),
|
||||
("id_whitelist_tip", "ホワイトリストに登録された ID からのみ接続を許可します"),
|
||||
("id_whitelist_wildcard_tip", "ワイルドカードが使用できます。'*' は任意の数の文字、'?' はちょうど1文字に一致します"),
|
||||
("Invalid ID", "無効な ID"),
|
||||
("Your ID is blocked by the peer", "あなたの ID は接続先によってブロックされています"),
|
||||
("Your ip is blocked by the peer", "あなたの IP アドレスは接続先によってブロックされています"),
|
||||
("id_whitelist_caveat_tip", "ID は接続するクライアントから申告されます。ホワイトリストは露出を減らすもので、パスワードや 2FA の代わりにはなりません"),
|
||||
("whitelist_cidr_tip", "CIDR 表記に対応しています。例: 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
+1
-11
@@ -44,7 +44,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("id_change_tip", "a-z, A-Z, 0-9, -(대시) 및 _(밑줄) 문자만 허용됩니다. 첫 글자는 a-z, A-Z여야 합니다. 길이는 6에서 16 사이여야 합니다."),
|
||||
("Website", "웹사이트"),
|
||||
("About", "정보"),
|
||||
("Slogan_tip", "이 혼란스러운 세상에서 마음을 담아 만들었습니다! - 한국어 번역: 비너스걸"),
|
||||
("Slogan_tip", "이 혼란스러운 세상에서 마음을 담아 만들었습니다!"),
|
||||
("Privacy Statement", "개인정보 보호정책"),
|
||||
("Mute", "음소거"),
|
||||
("Build Date", "빌드 날짜"),
|
||||
@@ -763,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "최소화된 도구 모음에 표시"),
|
||||
("All monitors", "모든 모니터"),
|
||||
("#{} monitor", "#{} 모니터"),
|
||||
("conn-e2ee-unavailable-tip", "종단 간 암호화를 확인할 수 없습니다.\n원격 장치가 여전히 설정 중일 수 있습니다. 나중에 다시 시도해 보세요.\n이런 일이 계속 발생하면 서버가 신뢰할 수 없을 수도 있습니다.\n어쨌든 계속하시겠습니까?"),
|
||||
("ID whitelisting", "ID 화이트리스트"),
|
||||
("Use ID whitelisting", "ID 화이트리스트 사용"),
|
||||
("id_whitelist_tip", "화이트리스트에 있는 ID만 나에게 액세스할 수 있음"),
|
||||
("id_whitelist_wildcard_tip", "와일드카드를 지원합니다: '*'는 임의 개수의 문자와, '?'는 정확히 한 문자와 일치합니다"),
|
||||
("Invalid ID", "유효하지 않은 ID입니다"),
|
||||
("Your ID is blocked by the peer", "귀하의 ID가 상대방에 의해 차단되었습니다"),
|
||||
("Your ip is blocked by the peer", "귀하의 IP가 상대방에 의해 차단되었습니다"),
|
||||
("id_whitelist_caveat_tip", "ID는 연결하는 클라이언트가 보고합니다. 화이트리스트는 노출을 줄이는 것으로 비밀번호나 2FA를 대체하지 않습니다"),
|
||||
("whitelist_cidr_tip", "CIDR 표기를 지원합니다. 예: 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Релай Қосылым"),
|
||||
("Secure Connection", "Қауіпсіз Қосылым"),
|
||||
("Insecure Connection", "Қатерлі Қосылым"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Scale original"),
|
||||
("Scale adaptive", "Scale adaptive"),
|
||||
("General", "Жалпы"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Кішірейтілген құралдар тақтасында көрсету"),
|
||||
("All monitors", "Барлық мониторлар"),
|
||||
("#{} monitor", "Монитор {}"),
|
||||
("conn-e2ee-unavailable-tip", "Ұштан-ұшқа шифрлауды тексеру мүмкін болмады.\nҚашықтағы құрылғы әлі бапталып жатқан болуы мүмкін. Кейінірек қайталап көріңіз.\nЕгер бұл қайталана берсе, сервер сенімсіз болуы мүмкін.\nСонда да жалғастыру керек пе?"),
|
||||
("ID whitelisting", "ID Ақ-тізімі"),
|
||||
("Use ID whitelisting", "ID ақ-тізімін қолдану"),
|
||||
("id_whitelist_tip", "Маған тек ақ-тізімделген ID қол жеткізе алады"),
|
||||
("id_whitelist_wildcard_tip", "Қойылмалы таңбаларға қолдау көрсетіледі: '*' кез келген таңба санына, '?' дәл бір таңбаға сәйкес келеді"),
|
||||
("Invalid ID", "Бұрыс ID"),
|
||||
("Your ID is blocked by the peer", "Сіздің ID қарсы тараппен бұғатталған"),
|
||||
("Your ip is blocked by the peer", "Сіздің IP-мекенжайыңыз қарсы тараппен бұғатталған"),
|
||||
("id_whitelist_caveat_tip", "ID қосылатын клиентпен хабарланады. Ақ-тізім әсер ету аумағын азайтады және құпия сөзді немесе 2FA-ны алмастырмайды"),
|
||||
("whitelist_cidr_tip", "CIDR жазбасына қолдау көрсетіледі, мысалы 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Tarpinė jungtis"),
|
||||
("Secure Connection", "Saugus ryšys"),
|
||||
("Insecure Connection", "Nesaugus ryšys"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Pakeisti originalų mastelį"),
|
||||
("Scale adaptive", "Pritaikomas mastelis"),
|
||||
("General", "Bendra"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Rodyti sumažintoje įrankių juostoje"),
|
||||
("All monitors", "Visi monitoriai"),
|
||||
("#{} monitor", "Monitorius {}"),
|
||||
("conn-e2ee-unavailable-tip", "Nepavyko patikrinti galinio šifravimo.\nNuotolinis įrenginys galbūt vis dar nustatomas. Bandykite dar kartą vėliau.\nJei tai kartojasi, serveris gali būti nepatikimas.\nVis tiek tęsti?"),
|
||||
("ID whitelisting", "ID baltasis sąrašas"),
|
||||
("Use ID whitelisting", "Naudoti patikimą ID sąrašą"),
|
||||
("id_whitelist_tip", "Mane gali pasiekti tik baltajame sąraše esantys ID"),
|
||||
("id_whitelist_wildcard_tip", "Palaikomi pakaitos simboliai: '*' atitinka bet kokį simbolių skaičių, '?' – lygiai vieną simbolį"),
|
||||
("Invalid ID", "Netinkamas ID"),
|
||||
("Your ID is blocked by the peer", "Jūsų ID užblokavo nuotolinis įrenginys"),
|
||||
("Your ip is blocked by the peer", "Jūsų IP adresą užblokavo nuotolinis įrenginys"),
|
||||
("id_whitelist_caveat_tip", "ID praneša prisijungiantis klientas. Šis sąrašas sumažina atakos paviršių ir nepakeičia slaptažodžio ar 2FA"),
|
||||
("whitelist_cidr_tip", "Palaikomas CIDR žymėjimas, pavyzdžiui 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Releja savienojums"),
|
||||
("Secure Connection", "Drošs savienojums"),
|
||||
("Insecure Connection", "Nedrošs savienojums"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Mērogs oriģināls"),
|
||||
("Scale adaptive", "Mērogs adaptīvs"),
|
||||
("General", "Vispārīgi"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Rādīt minimizētajā rīkjoslā"),
|
||||
("All monitors", "Visi monitori"),
|
||||
("#{} monitor", "Monitors {}"),
|
||||
("conn-e2ee-unavailable-tip", "Neizdevās pārbaudīt pilnīgu šifrēšanu.\nAttālā ierīce, iespējams, vēl tiek iestatīta. Mēģiniet vēlreiz vēlāk.\nJa tas turpinās, serveris var nebūt uzticams.\nVai tomēr turpināt?"),
|
||||
("ID whitelisting", "ID baltais saraksts"),
|
||||
("Use ID whitelisting", "Izmantot balto ID sarakstu"),
|
||||
("id_whitelist_tip", "Man var piekļūt tikai baltajā sarakstā iekļautie ID"),
|
||||
("id_whitelist_wildcard_tip", "Tiek atbalstītas aizstājzīmes: '*' atbilst jebkuram rakstzīmju skaitam, '?' — tieši vienai rakstzīmei"),
|
||||
("Invalid ID", "Nederīgs ID"),
|
||||
("Your ID is blocked by the peer", "Jūsu ID ir bloķējusi otra puse"),
|
||||
("Your ip is blocked by the peer", "Jūsu IP adresi ir bloķējusi otra puse"),
|
||||
("id_whitelist_caveat_tip", "ID paziņo klients, kas veido savienojumu. Baltais saraksts samazina pakļautību un neaizstāj paroli vai 2FA"),
|
||||
("whitelist_cidr_tip", "Tiek atbalstīts CIDR pieraksts, piemēram 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "റിലേ കണക്ഷൻ"),
|
||||
("Secure Connection", "സുരക്ഷിതമായ കണക്ഷൻ"),
|
||||
("Insecure Connection", "സുരക്ഷിതമല്ലാത്ത കണക്ഷൻ"),
|
||||
("Continue", ""),
|
||||
("Scale original", "ഒറിജിനൽ വലിപ്പം"),
|
||||
("Scale adaptive", "അഡാപ്റ്റീവ് വലിപ്പം"),
|
||||
("General", "പൊതുവായവ"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "ചെറുതാക്കിയ ടൂൾബാറിൽ കാണിക്കുക"),
|
||||
("All monitors", "എല്ലാ മോണിറ്ററുകളും"),
|
||||
("#{} monitor", "മോണിറ്റർ {}"),
|
||||
("conn-e2ee-unavailable-tip", "എൻഡ്-ടു-എൻഡ് എൻക്രിപ്ഷൻ പരിശോധിക്കാൻ കഴിഞ്ഞില്ല.\nദൂരസ്ഥ ഉപകരണം ഇനിയും സജ്ജീകരണത്തിലായിരിക്കാം. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.\nഇത് തുടർന്നാൽ സർവർ വിശ്വസനീയമല്ലായിരിക്കാം.\nഎങ്കിലും തുടരണമോ?"),
|
||||
("ID whitelisting", "ID വൈറ്റ്ലിസ്റ്റിംഗ്"),
|
||||
("Use ID whitelisting", "ID വൈറ്റ്ലിസ്റ്റിംഗ് ഉപയോഗിക്കുക"),
|
||||
("id_whitelist_tip", "വൈറ്റ്ലിസ്റ്റ് ചെയ്ത ID-കൾക്ക് മാത്രമേ എന്നെ ആക്സസ് ചെയ്യാൻ കഴിയൂ"),
|
||||
("id_whitelist_wildcard_tip", "വൈൽഡ്കാർഡുകൾ പിന്തുണയ്ക്കുന്നു: '*' എത്ര അക്ഷരങ്ങളുമായും, '?' കൃത്യം ഒരു അക്ഷരവുമായും പൊരുത്തപ്പെടുന്നു"),
|
||||
("Invalid ID", "അസാധുവായ ID"),
|
||||
("Your ID is blocked by the peer", "നിങ്ങളുടെ ID മറുവശം ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു"),
|
||||
("Your ip is blocked by the peer", "നിങ്ങളുടെ IP വിലാസം മറുവശം ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു"),
|
||||
("id_whitelist_caveat_tip", "കണക്റ്റ് ചെയ്യുന്ന ക്ലയന്റാണ് ID റിപ്പോർട്ട് ചെയ്യുന്നത്. വൈറ്റ്ലിസ്റ്റ് എക്സ്പോഷർ കുറയ്ക്കുന്നു; പാസ്വേഡിനോ 2FA-യ്ക്കോ പകരമല്ല"),
|
||||
("whitelist_cidr_tip", "CIDR നൊട്ടേഷൻ പിന്തുണയ്ക്കുന്നു, ഉദാഹരണത്തിന് 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Viderekoblet tilkobling"),
|
||||
("Secure Connection", "Sikker tilkobling"),
|
||||
("Insecure Connection", "Usikker tilkobling"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Original skalering"),
|
||||
("Scale adaptive", "Adaptiv skalering"),
|
||||
("General", "Generelt"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Vis på den minimerte verktøylinjen"),
|
||||
("All monitors", "Alle skjermer"),
|
||||
("#{} monitor", "Skjerm {}"),
|
||||
("conn-e2ee-unavailable-tip", "Ende-til-ende-kryptering kunne ikke verifiseres.\nDen eksterne enheten kan fortsatt være under oppsett. Prøv igjen senere.\nHvis dette fortsetter, kan serveren være upålitelig.\nFortsette likevel?"),
|
||||
("ID whitelisting", "ID-hvitelisting"),
|
||||
("Use ID whitelisting", "Bruk ID-hvitelisting"),
|
||||
("id_whitelist_tip", "Kun ID-er på hvitelisten kan få adgang til meg"),
|
||||
("id_whitelist_wildcard_tip", "Jokertegn støttes: '*' samsvarer med et hvilket som helst antall tegn, '?' med nøyaktig ett tegn"),
|
||||
("Invalid ID", "Ugyldig ID"),
|
||||
("Your ID is blocked by the peer", "ID-en din er blokkert av motparten"),
|
||||
("Your ip is blocked by the peer", "IP-adressen din er blokkert av motparten"),
|
||||
("id_whitelist_caveat_tip", "ID-en rapporteres av klienten som kobler til. Hvitelisten reduserer eksponeringen og erstatter ikke passord eller 2FA"),
|
||||
("whitelist_cidr_tip", "CIDR-notasjon støttes, for eksempel 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Relaisverbinding"),
|
||||
("Secure Connection", "Beveiligde Verbinding"),
|
||||
("Insecure Connection", "Onveilige Verbinding"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Oorspronkelijk formaat"),
|
||||
("Scale adaptive", "Automatisch schalen"),
|
||||
("General", "Algemeen"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Weergeven op de geminimaliseerde werkbalk"),
|
||||
("All monitors", "Alle monitoren"),
|
||||
("#{} monitor", "Monitor {}"),
|
||||
("conn-e2ee-unavailable-tip", "End-to-endversleuteling kon niet worden geverifieerd.\nHet externe apparaat wordt mogelijk nog ingesteld. Probeer het later opnieuw.\nAls dit blijft gebeuren, is de server mogelijk niet vertrouwd.\nToch doorgaan?"),
|
||||
("ID whitelisting", "ID Witte Lijst"),
|
||||
("Use ID whitelisting", "Gebruik een witte lijst van ID's"),
|
||||
("id_whitelist_tip", "Alleen ID's op de witte lijst krijgen toegang tot mijn toestel"),
|
||||
("id_whitelist_wildcard_tip", "Jokertekens worden ondersteund: '*' komt overeen met een willekeurig aantal tekens, '?' met precies één teken"),
|
||||
("Invalid ID", "Ongeldig ID"),
|
||||
("Your ID is blocked by the peer", "Je ID is geblokkeerd door de andere partij"),
|
||||
("Your ip is blocked by the peer", "Je IP-adres is geblokkeerd door de andere partij"),
|
||||
("id_whitelist_caveat_tip", "Het ID wordt gemeld door de verbindende client. De witte lijst vermindert blootstelling en vervangt het wachtwoord of 2FA niet"),
|
||||
("whitelist_cidr_tip", "CIDR-notatie wordt ondersteund, bijvoorbeeld 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Połączenie przez bramkę"),
|
||||
("Secure Connection", "Połączenie szyfrowane"),
|
||||
("Insecure Connection", "Połączenie nieszyfrowane"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Skalowanie oryginalne"),
|
||||
("Scale adaptive", "Dopasuj do wyświetlacza"),
|
||||
("General", "Ogólne"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Pokaż na zminimalizowanym pasku narzędzi"),
|
||||
("All monitors", "Wszystkie ekrany"),
|
||||
("#{} monitor", "Ekran {}"),
|
||||
("conn-e2ee-unavailable-tip", "Nie można zweryfikować szyfrowania end-to-end.\nUrządzenie zdalne może nadal się konfigurować. Spróbuj ponownie później.\nJeśli problem będzie się powtarzał, serwer może być niezaufany.\nKontynuować mimo to?"),
|
||||
("ID whitelisting", "Biała lista ID"),
|
||||
("Use ID whitelisting", "Użyj białej listy ID"),
|
||||
("id_whitelist_tip", "Zezwalaj na łączenie z tym komputerem tylko z ID znajdujących się na białej liście"),
|
||||
("id_whitelist_wildcard_tip", "Obsługiwane są symbole wieloznaczne: '*' odpowiada dowolnej liczbie znaków, '?' dokładnie jednemu znakowi"),
|
||||
("Invalid ID", "Nieprawidłowe ID"),
|
||||
("Your ID is blocked by the peer", "Twoje ID zostało zablokowane przez drugą stronę"),
|
||||
("Your ip is blocked by the peer", "Twój adres IP został zablokowany przez drugą stronę"),
|
||||
("id_whitelist_caveat_tip", "ID jest zgłaszane przez łączącego się klienta. Biała lista zmniejsza ekspozycję i nie zastępuje hasła ani 2FA"),
|
||||
("whitelist_cidr_tip", "Obsługiwana jest notacja CIDR, na przykład 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Conexão de relé"),
|
||||
("Secure Connection", "Conexão segura"),
|
||||
("Insecure Connection", "Conexão insegura"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Escala original"),
|
||||
("Scale adaptive", "Escala adaptável"),
|
||||
("General", "Geral"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Mostrar na barra de ferramentas minimizada"),
|
||||
("All monitors", "Todos os monitores"),
|
||||
("#{} monitor", "Monitor {}"),
|
||||
("conn-e2ee-unavailable-tip", "Não foi possível verificar a encriptação de ponta a ponta.\nO dispositivo remoto ainda pode estar a ser configurado. Tente novamente mais tarde.\nSe isto continuar a acontecer, o servidor pode não ser fidedigno.\nContinuar mesmo assim?"),
|
||||
("ID whitelisting", "Whitelist de ID"),
|
||||
("Use ID whitelisting", "Usar whitelist de ID"),
|
||||
("id_whitelist_tip", "Somente IDs na whitelist podem me acessar"),
|
||||
("id_whitelist_wildcard_tip", "São suportados carateres universais: '*' corresponde a qualquer número de carateres, '?' a exatamente um caráter"),
|
||||
("Invalid ID", "ID inválido"),
|
||||
("Your ID is blocked by the peer", "O seu ID está bloqueado pelo dispositivo remoto"),
|
||||
("Your ip is blocked by the peer", "O seu IP está bloqueado pelo dispositivo remoto"),
|
||||
("id_whitelist_caveat_tip", "O ID é comunicado pelo cliente que se liga. A whitelist reduz a exposição e não substitui a palavra-passe nem o 2FA"),
|
||||
("whitelist_cidr_tip", "A notação CIDR é suportada, por exemplo 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
+4
-15
@@ -112,7 +112,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Waiting", "Aguardando"),
|
||||
("Finished", "Concluído"),
|
||||
("Speed", "Velocidade"),
|
||||
("Custom Image Quality", "Qualidade de imagem personalizada"),
|
||||
("Custom Image Quality", "Qualidade Visual Personalizada"),
|
||||
("Privacy mode", "Modo privado"),
|
||||
("Block user input", "Bloquear entrada do usuário"),
|
||||
("Unblock user input", "Desbloquear entrada do usuário"),
|
||||
@@ -122,15 +122,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Stretch", "Aumentar"),
|
||||
("Scrollbar", "Barra de rolagem"),
|
||||
("ScrollAuto", "Rolagem automática"),
|
||||
("Good image quality", "Melhor qualidade"),
|
||||
("Good image quality", "Boa qualidade de imagem"),
|
||||
("Balanced", "Balanceada"),
|
||||
("Optimize reaction time", "Otimizar tempo de resposta"),
|
||||
("Custom", "Personalizada"),
|
||||
("Custom", "Personalizado"),
|
||||
("Show remote cursor", "Mostrar cursor remoto"),
|
||||
("Show quality monitor", "Exibir monitor de qualidade"),
|
||||
("Disable clipboard", "Desabilitar área de transferência"),
|
||||
("Lock after session end", "Bloquear após o fim da sessão"),
|
||||
("Insert Ctrl + Alt + Del", "Enviar Ctrl+Alt+Del"),
|
||||
("Insert Ctrl + Alt + Del", "Enviar Ctrl + Alt + Del"),
|
||||
("Insert Lock", "Bloquear computador"),
|
||||
("Refresh", "Atualizar"),
|
||||
("ID does not exist", "ID não existe"),
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Conexão via Relay"),
|
||||
("Secure Connection", "Conexão Segura"),
|
||||
("Insecure Connection", "Conexão Insegura"),
|
||||
("Continue", "Continuar"),
|
||||
("Scale original", "Escala original"),
|
||||
("Scale adaptive", "Escala adaptada"),
|
||||
("General", "Geral"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Mostrar na barra de ferramentas minimizada"),
|
||||
("All monitors", "Todas as telas"),
|
||||
("#{} monitor", "Tela {}"),
|
||||
("conn-e2ee-unavailable-tip", "Não foi possível verificar a criptografia de ponta a ponta.\nO dispositivo remoto ainda pode estar sendo configurado. Tente novamente mais tarde.\nSe isso continuar acontecendo, o servidor pode não ser confiável.\nContinuar mesmo assim?"),
|
||||
("ID whitelisting", "Lista de IDs permitidos"),
|
||||
("Use ID whitelisting", "Utilizar lista de IDs permitidos"),
|
||||
("id_whitelist_tip", "Somente IDs confiáveis podem me acessar"),
|
||||
("id_whitelist_wildcard_tip", "Curingas são suportados: '*' corresponde a qualquer número de caracteres, '?' a exatamente um caractere"),
|
||||
("Invalid ID", "ID inválido"),
|
||||
("Your ID is blocked by the peer", "Seu ID foi bloqueado pelo dispositivo remoto"),
|
||||
("Your ip is blocked by the peer", "Seu IP foi bloqueado pelo dispositivo remoto"),
|
||||
("id_whitelist_caveat_tip", "O ID é informado pelo cliente que se conecta. A lista reduz a exposição e não substitui a senha ou o 2FA"),
|
||||
("whitelist_cidr_tip", "A notação CIDR é suportada, por exemplo 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Conexiune prin retransmisie"),
|
||||
("Secure Connection", "Conexiune securizată"),
|
||||
("Insecure Connection", "Conexiune nesecurizată"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Dimensiune originală"),
|
||||
("Scale adaptive", "Scalare automată"),
|
||||
("General", "General"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Afișează în bara de instrumente minimizată"),
|
||||
("All monitors", "Toate monitoarele"),
|
||||
("#{} monitor", "Monitor {}"),
|
||||
("conn-e2ee-unavailable-tip", "Criptarea end-to-end nu a putut fi verificată.\nDispozitivul la distanță poate fi încă în curs de configurare. Încercați din nou mai târziu.\nDacă acest lucru continuă, serverul poate să nu fie de încredere.\nContinuați oricum?"),
|
||||
("ID whitelisting", "Listă de ID-uri autorizate"),
|
||||
("Use ID whitelisting", "Folosește lista de ID-uri autorizate"),
|
||||
("id_whitelist_tip", "Doar ID-urile autorizate pot accesa acest dispozitiv"),
|
||||
("id_whitelist_wildcard_tip", "Sunt acceptate metacaractere: '*' corespunde oricărui număr de caractere, '?' exact unui caracter"),
|
||||
("Invalid ID", "ID nevalid"),
|
||||
("Your ID is blocked by the peer", "ID-ul tău este blocat de dispozitivul de la distanță"),
|
||||
("Your ip is blocked by the peer", "Adresa ta IP este blocată de dispozitivul de la distanță"),
|
||||
("id_whitelist_caveat_tip", "ID-ul este raportat de clientul care se conectează. Lista albă reduce expunerea și nu înlocuiește parola sau 2FA"),
|
||||
("whitelist_cidr_tip", "Notația CIDR este acceptată, de exemplu 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Ретранслируемое подключение"),
|
||||
("Secure Connection", "Безопасное подключение"),
|
||||
("Insecure Connection", "Небезопасное подключение"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Оригинальный масштаб"),
|
||||
("Scale adaptive", "Адаптивный масштаб"),
|
||||
("General", "Общие"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Показывать на свёрнутой панели инструментов"),
|
||||
("All monitors", "Все мониторы"),
|
||||
("#{} monitor", "Монитор {}"),
|
||||
("conn-e2ee-unavailable-tip", "Не удалось проверить сквозное шифрование.\nУдаленное устройство, возможно, еще настраивается. Повторите попытку позже.\nЕсли это повторяется, сервер может быть ненадежным.\nВсе равно продолжить?"),
|
||||
("ID whitelisting", "Список разрешённых ID"),
|
||||
("Use ID whitelisting", "Использовать белый список ID"),
|
||||
("id_whitelist_tip", "Только ID из белого списка могут получить доступ к моему устройству."),
|
||||
("id_whitelist_wildcard_tip", "Поддерживаются подстановочные знаки: '*' соответствует любому количеству символов, '?' — ровно одному символу"),
|
||||
("Invalid ID", "Неправильный ID"),
|
||||
("Your ID is blocked by the peer", "Ваш ID заблокирован удалённым устройством"),
|
||||
("Your ip is blocked by the peer", "Ваш IP-адрес заблокирован удалённым устройством"),
|
||||
("id_whitelist_caveat_tip", "ID сообщается подключающимся клиентом. Белый список уменьшает поверхность атаки и не заменяет пароль или 2FA"),
|
||||
("whitelist_cidr_tip", "Поддерживается нотация CIDR, например 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Connessione tramudada (relay)"),
|
||||
("Secure Connection", "Connessione segura"),
|
||||
("Insecure Connection", "Connessione non segura"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Iscala originale"),
|
||||
("Scale adaptive", "Iscala adativa"),
|
||||
("General", "Generale"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Mustra in sa barra de aina minimizada"),
|
||||
("All monitors", "Totu sos ischermos"),
|
||||
("#{} monitor", "Ischermu {}"),
|
||||
("conn-e2ee-unavailable-tip", "No est istadu possìbile verificare sa tzifratzione de punta a punta.\nSu dispositivu remotu podet èssere ancora in fase de configuratzione. Torra a proare prus a tardu.\nSi custu sighit a acontèssere, su server podet non èssere fidadu.\nBoles sighire comente siat?"),
|
||||
("ID whitelisting", "ID autorizados"),
|
||||
("Use ID whitelisting", "Imprea elencu ID autorizados"),
|
||||
("id_whitelist_tip", "Si podent connètere a custa iscrivania petzi sos ID autorizados"),
|
||||
("id_whitelist_wildcard_tip", "Sos caràteres jolly sunt suportados: '*' currispondet a cale si siat nùmeru de caràteres, '?' a unu caràtere ebbia"),
|
||||
("Invalid ID", "ID non vàlidu"),
|
||||
("Your ID is blocked by the peer", "S'ID tuo est blocadu dae s'àtera parte"),
|
||||
("Your ip is blocked by the peer", "S'indiritzu IP tuo est blocadu dae s'àtera parte"),
|
||||
("id_whitelist_caveat_tip", "S'ID est decraradu dae su cliente chi si connetet. Custu elencu minimat s'espositzione e non sostituit sa crae o su 2FA"),
|
||||
("whitelist_cidr_tip", "Sa notatzione CIDR est suportada, pro esempru 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Reléové pripojenie"),
|
||||
("Secure Connection", "Zabezpečené pripojenie"),
|
||||
("Insecure Connection", "Nezabezpečené pripojenie"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Pôvodná mierka"),
|
||||
("Scale adaptive", "Prispôsobivá mierka"),
|
||||
("General", "Všeobecné"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Zobraziť na minimalizovanom paneli nástrojov"),
|
||||
("All monitors", "Všetky monitory"),
|
||||
("#{} monitor", "Monitor {}"),
|
||||
("conn-e2ee-unavailable-tip", "Nepodarilo sa overiť koncové šifrovanie.\nVzdialené zariadenie sa možno stále nastavuje. Skúste to znova neskôr.\nAk sa to bude opakovať, server nemusí byť dôveryhodný.\nNapriek tomu pokračovať?"),
|
||||
("ID whitelisting", "Zoznam povolených ID"),
|
||||
("Use ID whitelisting", "Použiť ID whitelisting"),
|
||||
("id_whitelist_tip", "Len vymenované ID majú oprávnenie sa pripojiť k vzdialenej správe"),
|
||||
("id_whitelist_wildcard_tip", "Podporované sú zástupné znaky: '*' zodpovedá ľubovoľnému počtu znakov, '?' presne jednému znaku"),
|
||||
("Invalid ID", "Neplatné ID"),
|
||||
("Your ID is blocked by the peer", "Vaše ID je blokované protistranou"),
|
||||
("Your ip is blocked by the peer", "Vaša IP adresa je blokovaná protistranou"),
|
||||
("id_whitelist_caveat_tip", "ID nahlasuje pripájajúci sa klient. Tento zoznam znižuje vystavenie a nenahrádza heslo ani 2FA"),
|
||||
("whitelist_cidr_tip", "Je podporovaný zápis CIDR, napríklad 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Posredovana povezava"),
|
||||
("Secure Connection", "Zavarovana povezava"),
|
||||
("Insecure Connection", "Nezavarovana povezava"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Originalna velikost"),
|
||||
("Scale adaptive", "Prilagojena velikost"),
|
||||
("General", "Splošno"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Pokaži v pomanjšani orodni vrstici"),
|
||||
("All monitors", "Vsi zasloni"),
|
||||
("#{} monitor", "Zaslon {}"),
|
||||
("conn-e2ee-unavailable-tip", "Šifriranja od konca do konca ni bilo mogoče preveriti.\nOddaljena naprava se morda še nastavlja. Poskusite znova pozneje.\nČe se to še naprej dogaja, strežnik morda ni zaupanja vreden.\nVseeno nadaljevati?"),
|
||||
("ID whitelisting", "Seznam dovoljenih ID-jev"),
|
||||
("Use ID whitelisting", "Omogoči seznam dovoljenih ID-jev"),
|
||||
("id_whitelist_tip", "Dostop je možen samo z dovoljenih ID-jev"),
|
||||
("id_whitelist_wildcard_tip", "Podprti so nadomestni znaki: '*' ustreza poljubnemu številu znakov, '?' natanko enemu znaku"),
|
||||
("Invalid ID", "Neveljaven ID"),
|
||||
("Your ID is blocked by the peer", "Vaš ID je blokirala oddaljena naprava"),
|
||||
("Your ip is blocked by the peer", "Vaš IP je blokirala oddaljena naprava"),
|
||||
("id_whitelist_caveat_tip", "ID sporoči odjemalec, ki se povezuje. Seznam zmanjšuje izpostavljenost in ne nadomešča gesla ali 2FA"),
|
||||
("whitelist_cidr_tip", "Podprt je zapis CIDR, na primer 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Lidhja rele"),
|
||||
("Secure Connection", "Lidhje e sigurt"),
|
||||
("Insecure Connection", "Lidhje e pasigurt"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Shkalla origjinale"),
|
||||
("Scale adaptive", " E përsjhtatshme në shkallë"),
|
||||
("General", "Gjeneral"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Shfaq te shiriti i minimizuar i veglave"),
|
||||
("All monitors", "Të gjithë monitorët"),
|
||||
("#{} monitor", "Monitori {}"),
|
||||
("conn-e2ee-unavailable-tip", "Enkriptimi nga skaji në skaj nuk mund të verifikohej.\nPajisja e largët mund të jetë ende duke u konfiguruar. Provoni përsëri më vonë.\nNëse kjo vazhdon të ndodhë, serveri mund të mos jetë i besueshëm.\nTë vazhdohet gjithsesi?"),
|
||||
("ID whitelisting", "Lista e bardhë e ID-ve"),
|
||||
("Use ID whitelisting", "Përdor listën e bardhë të ID-ve"),
|
||||
("id_whitelist_tip", "Vetëm ID-të e listës së bardhë mund të më aksesojnë."),
|
||||
("id_whitelist_wildcard_tip", "Mbështeten karakteret zëvendësuese: '*' përputhet me çdo numër karakteresh, '?' me saktësisht një karakter"),
|
||||
("Invalid ID", "ID e pavlefshme"),
|
||||
("Your ID is blocked by the peer", "ID-ja juaj është bllokuar nga pala tjetër"),
|
||||
("Your ip is blocked by the peer", "IP-ja juaj është bllokuar nga pala tjetër"),
|
||||
("id_whitelist_caveat_tip", "ID-ja raportohet nga klienti që lidhet. Lista e bardhë zvogëlon ekspozimin dhe nuk zëvendëson fjalëkalimin ose 2FA"),
|
||||
("whitelist_cidr_tip", "Mbështetet shënimi CIDR, për shembull 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Posredna konekcija"),
|
||||
("Secure Connection", "Bezbedna konekcija"),
|
||||
("Insecure Connection", "Nebezbedna konekcija"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Skaliraj original"),
|
||||
("Scale adaptive", "Adaptivno skaliranje"),
|
||||
("General", "Uopšteno"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Прикажи на умањеној траци са алаткама"),
|
||||
("All monitors", "Svi monitori"),
|
||||
("#{} monitor", "Monitor {}"),
|
||||
("conn-e2ee-unavailable-tip", "Није могуће проверити енд-то-енд шифровање.\nУдаљени уређај се можда још подешава. Покушајте поново касније.\nАко се ово настави, сервер можда није поуздан.\nНаставити свеједно?"),
|
||||
("ID whitelisting", "ID pouzdana lista"),
|
||||
("Use ID whitelisting", "Koristi listu pouzdanih ID"),
|
||||
("id_whitelist_tip", "Samo dozvoljeni ID mi mogu pristupiti"),
|
||||
("id_whitelist_wildcard_tip", "Podržani su džoker znakovi: '*' odgovara bilo kom broju znakova, '?' tačno jednom znaku"),
|
||||
("Invalid ID", "Nevažeći ID"),
|
||||
("Your ID is blocked by the peer", "Vaš ID je blokirala druga strana"),
|
||||
("Your ip is blocked by the peer", "Vašu IP adresu je blokirala druga strana"),
|
||||
("id_whitelist_caveat_tip", "ID prijavljuje klijent koji se povezuje. Ova lista smanjuje izloženost i ne zamenjuje lozinku ni 2FA"),
|
||||
("whitelist_cidr_tip", "Podržan je CIDR zapis, na primer 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Relayanslutning"),
|
||||
("Secure Connection", "Säker anslutning"),
|
||||
("Insecure Connection", "Osäker anslutning"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Skala orginal"),
|
||||
("Scale adaptive", "Skala adaptivt"),
|
||||
("General", "Generellt"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Visa i det minimerade verktygsfältet"),
|
||||
("All monitors", "Alla skärmar"),
|
||||
("#{} monitor", "Skärm {}"),
|
||||
("conn-e2ee-unavailable-tip", "End-to-end-kryptering kunde inte verifieras.\nFjärrenheten kan fortfarande konfigureras. Försök igen senare.\nOm detta fortsätter kan servern vara opålitlig.\nFortsätta ändå?"),
|
||||
("ID whitelisting", "ID-vitlistning"),
|
||||
("Use ID whitelisting", "Använd ID-vitlistning"),
|
||||
("id_whitelist_tip", "Bara vitlistade ID:n kan koppla upp till mig"),
|
||||
("id_whitelist_wildcard_tip", "Jokertecken stöds: '*' matchar valfritt antal tecken, '?' matchar exakt ett tecken"),
|
||||
("Invalid ID", "Ogiltigt ID"),
|
||||
("Your ID is blocked by the peer", "Ditt ID är blockerat av motparten"),
|
||||
("Your ip is blocked by the peer", "Din IP-adress är blockerad av motparten"),
|
||||
("id_whitelist_caveat_tip", "ID:t rapporteras av klienten som ansluter. Vitlistan minskar exponeringen och ersätter inte lösenord eller 2FA"),
|
||||
("whitelist_cidr_tip", "CIDR-notation stöds, till exempel 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "ரிலே இணைப்பு"),
|
||||
("Secure Connection", "பாதுகாப்பான இணைப்பு"),
|
||||
("Insecure Connection", "பாதுகாப்பற்ற இணைப்பு"),
|
||||
("Continue", ""),
|
||||
("Scale original", "அசல் அளவு"),
|
||||
("Scale adaptive", "தகவமைப்பு அளவு"),
|
||||
("General", "பொது"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "சிறிதாக்கப்பட்ட கருவிப்பட்டையில் காட்டு"),
|
||||
("All monitors", "அனைத்து மானிட்டர்களும்"),
|
||||
("#{} monitor", "மானிட்டர் {}"),
|
||||
("conn-e2ee-unavailable-tip", "முடிவு-முதல்-முடிவு குறியாக்கத்தை சரிபார்க்க முடியவில்லை.\nதொலை சாதனம் இன்னும் அமைக்கப்பட்டுக் கொண்டிருக்கலாம். பின்னர் மீண்டும் முயற்சிக்கவும்.\nஇது தொடர்ந்து நடந்தால், சேவையகம் நம்பகமற்றதாக இருக்கலாம்.\nஎப்படியும் தொடரவா?"),
|
||||
("ID whitelisting", "ID அனுமதிப்பட்டியல்"),
|
||||
("Use ID whitelisting", "ID அனுமதிப்பட்டியலைப் பயன்படுத்து"),
|
||||
("id_whitelist_tip", "அனுமதிப்பட்டியலில் உள்ள ID-கள் மட்டுமே என்னை அணுக முடியும்"),
|
||||
("id_whitelist_wildcard_tip", "வைல்டு கார்டுகள் ஆதரிக்கப்படுகின்றன: '*' எத்தனை எழுத்துகளுக்கும், '?' சரியாக ஒரு எழுத்துக்கும் பொருந்தும்"),
|
||||
("Invalid ID", "தவறான ID"),
|
||||
("Your ID is blocked by the peer", "உங்கள் ID மறுமுனையால் தடுக்கப்பட்டுள்ளது"),
|
||||
("Your ip is blocked by the peer", "உங்கள் IP முகவரி மறுமுனையால் தடுக்கப்பட்டுள்ளது"),
|
||||
("id_whitelist_caveat_tip", "இணைக்கும் கிளையண்டே ID-ஐ தெரிவிக்கிறது. அனுமதிப்பட்டியல் வெளிப்பாட்டைக் குறைக்கிறது; கடவுச்சொல் அல்லது 2FA-க்கு மாற்றாகாது"),
|
||||
("whitelist_cidr_tip", "CIDR குறியீடு ஆதரிக்கப்படுகிறது, எடுத்துக்காட்டாக 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", ""),
|
||||
("Secure Connection", ""),
|
||||
("Insecure Connection", ""),
|
||||
("Continue", ""),
|
||||
("Scale original", ""),
|
||||
("Scale adaptive", ""),
|
||||
("General", ""),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", ""),
|
||||
("All monitors", ""),
|
||||
("#{} monitor", ""),
|
||||
("conn-e2ee-unavailable-tip", ""),
|
||||
("ID whitelisting", ""),
|
||||
("Use ID whitelisting", ""),
|
||||
("id_whitelist_tip", ""),
|
||||
("id_whitelist_wildcard_tip", ""),
|
||||
("Invalid ID", ""),
|
||||
("Your ID is blocked by the peer", ""),
|
||||
("Your ip is blocked by the peer", ""),
|
||||
("id_whitelist_caveat_tip", ""),
|
||||
("whitelist_cidr_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "การเชื่อมต่อแบบ Relay "),
|
||||
("Secure Connection", "การเชื่อมต่อที่ปลอดภัย"),
|
||||
("Insecure Connection", "การเชื่อมต่อที่ไม่ปลอดภัย"),
|
||||
("Continue", ""),
|
||||
("Scale original", "ขนาดเดิม"),
|
||||
("Scale adaptive", "ขนาดยืดหยุ่น"),
|
||||
("General", "ทั่วไป"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "แสดงบนแถบเครื่องมือที่ย่อเล็กสุด"),
|
||||
("All monitors", "จอภาพทั้งหมด"),
|
||||
("#{} monitor", "จอภาพ {}"),
|
||||
("conn-e2ee-unavailable-tip", "ไม่สามารถยืนยันการเข้ารหัสแบบต้นทางถึงปลายทางได้\nอุปกรณ์ระยะไกลอาจยังอยู่ระหว่างการตั้งค่า โปรดลองอีกครั้งภายหลัง\nหากปัญหานี้ยังเกิดขึ้นต่อไป เซิร์ฟเวอร์อาจไม่น่าเชื่อถือ\nต้องการดำเนินการต่อหรือไม่?"),
|
||||
("ID whitelisting", "ID ไวท์ลิสต์"),
|
||||
("Use ID whitelisting", "ใช้งาน ID ไวท์ลิสต์"),
|
||||
("id_whitelist_tip", "อนุญาตเฉพาะการเชื่อมต่อจาก ID ที่ไวท์ลิสต์"),
|
||||
("id_whitelist_wildcard_tip", "รองรับสัญลักษณ์แทน: '*' แทนอักขระจำนวนเท่าใดก็ได้, '?' แทนอักขระหนึ่งตัวพอดี"),
|
||||
("Invalid ID", "ID ไม่ถูกต้อง"),
|
||||
("Your ID is blocked by the peer", "ID ของคุณถูกบล็อกโดยฝั่งตรงข้าม"),
|
||||
("Your ip is blocked by the peer", "IP ของคุณถูกบล็อกโดยฝั่งตรงข้าม"),
|
||||
("id_whitelist_caveat_tip", "ID ถูกรายงานโดยไคลเอนต์ที่เชื่อมต่อ ไวท์ลิสต์ช่วยลดการเปิดเผยและไม่สามารถใช้แทนรหัสผ่านหรือ 2FA ได้"),
|
||||
("whitelist_cidr_tip", "รองรับรูปแบบ CIDR เช่น 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Aktarmalı Bağlantı"),
|
||||
("Secure Connection", "Güvenli Bağlantı"),
|
||||
("Insecure Connection", "Güvenli Olmayan Bağlantı"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Orijinal ölçekte"),
|
||||
("Scale adaptive", "Uyarlanabilir ölçekte"),
|
||||
("General", "Genel"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Simge durumuna küçültülmüş araç çubuğunda göster"),
|
||||
("All monitors", "Tüm monitörler"),
|
||||
("#{} monitor", "Monitör {}"),
|
||||
("conn-e2ee-unavailable-tip", "Uçtan uca şifreleme doğrulanamadı.\nUzak cihaz hâlâ kuruluyor olabilir. Daha sonra tekrar deneyin.\nBu sorun devam ederse sunucu güvenilir olmayabilir.\nYine de devam edilsin mi?"),
|
||||
("ID whitelisting", "İzinli ID listesi"),
|
||||
("Use ID whitelisting", "İzinli ID listesini kullan"),
|
||||
("id_whitelist_tip", "Bu masaüstüne yalnızca izinli ID'ler bağlanabilir"),
|
||||
("id_whitelist_wildcard_tip", "Joker karakterler desteklenir: '*' herhangi bir sayıda karakterle, '?' tam olarak bir karakterle eşleşir"),
|
||||
("Invalid ID", "Geçersiz ID"),
|
||||
("Your ID is blocked by the peer", "ID'niz karşı taraf tarafından engellendi"),
|
||||
("Your ip is blocked by the peer", "IP adresiniz karşı taraf tarafından engellendi"),
|
||||
("id_whitelist_caveat_tip", "ID, bağlanan istemci tarafından bildirilir. Bu liste maruziyeti azaltır; parolanın veya 2FA'nın yerini tutmaz"),
|
||||
("whitelist_cidr_tip", "CIDR gösterimi desteklenir, örneğin 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "中繼連線"),
|
||||
("Secure Connection", "安全連線"),
|
||||
("Insecure Connection", "非安全連線"),
|
||||
("Continue", ""),
|
||||
("Scale original", "原始尺寸"),
|
||||
("Scale adaptive", "適應視窗"),
|
||||
("General", "一般"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "在最小化工具列上顯示"),
|
||||
("All monitors", "所有顯示器"),
|
||||
("#{} monitor", "{}號顯示器"),
|
||||
("conn-e2ee-unavailable-tip", "無法驗證端對端加密。\n遠端裝置可能仍在準備中,請稍後重試。\n如果此問題持續發生,伺服器可能不受信任。\n仍要繼續嗎?"),
|
||||
("ID whitelisting", "ID 白名單"),
|
||||
("Use ID whitelisting", "只允許白名單上的 ID 進行連線"),
|
||||
("id_whitelist_tip", "只有白名單上的 ID 可以存取"),
|
||||
("id_whitelist_wildcard_tip", "支援萬用字元:'*' 符合任意數量的字元,'?' 符合單一字元"),
|
||||
("Invalid ID", "ID 無效"),
|
||||
("Your ID is blocked by the peer", "你的 ID 已被對方封鎖"),
|
||||
("Your ip is blocked by the peer", "你的 IP 已被對方封鎖"),
|
||||
("id_whitelist_caveat_tip", "ID 由對端用戶端回報,白名單用於減少暴露面,不能取代密碼或 2FA"),
|
||||
("whitelist_cidr_tip", "支援 CIDR 寫法,例如 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Ретрансльоване підключення"),
|
||||
("Secure Connection", "Безпечне підключення"),
|
||||
("Insecure Connection", "Небезпечне підключення"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Оригінальний масштаб"),
|
||||
("Scale adaptive", "Адаптивний масштаб"),
|
||||
("General", "Загальні"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Показувати на згорнутій панелі інструментів"),
|
||||
("All monitors", "Усі монітори"),
|
||||
("#{} monitor", "Монітор {}"),
|
||||
("conn-e2ee-unavailable-tip", "Не вдалося перевірити наскрізне шифрування.\nВіддалений пристрій, можливо, ще налаштовується. Спробуйте пізніше.\nЯкщо це повторюється, сервер може бути ненадійним.\nПродовжити все одно?"),
|
||||
("ID whitelisting", "Список дозволених ID"),
|
||||
("Use ID whitelisting", "Використовувати білий список ID"),
|
||||
("id_whitelist_tip", "Лише ID з білого списку можуть отримати доступ до мене"),
|
||||
("id_whitelist_wildcard_tip", "Підтримуються символи підстановки: '*' відповідає будь-якій кількості символів, '?' — рівно одному символу"),
|
||||
("Invalid ID", "Неправильний ID"),
|
||||
("Your ID is blocked by the peer", "Ваш ID заблоковано віддаленим пристроєм"),
|
||||
("Your ip is blocked by the peer", "Вашу IP-адресу заблоковано віддаленим пристроєм"),
|
||||
("id_whitelist_caveat_tip", "ID повідомляється клієнтом, що підключається. Білий список зменшує поверхню атаки і не замінює пароль або 2FA"),
|
||||
("whitelist_cidr_tip", "Підтримується нотація CIDR, наприклад 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
@@ -332,7 +332,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Kết nối chuyển tiếp"),
|
||||
("Secure Connection", "Kết nối bảo mật"),
|
||||
("Insecure Connection", "Kết nối không bảo mật"),
|
||||
("Continue", ""),
|
||||
("Scale original", "Tỷ lệ gốc"),
|
||||
("Scale adaptive", "Tỷ lệ thích ứng"),
|
||||
("General", "Chung"),
|
||||
@@ -764,15 +763,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Show on the minimized toolbar", "Hiển thị trên thanh công cụ thu nhỏ"),
|
||||
("All monitors", "Tất cả màn hình"),
|
||||
("#{} monitor", "Màn hình {}"),
|
||||
("conn-e2ee-unavailable-tip", "Không thể xác minh mã hóa đầu cuối.\nThiết bị từ xa có thể vẫn đang được thiết lập. Hãy thử lại sau.\nNếu điều này tiếp tục xảy ra, máy chủ có thể không đáng tin cậy.\nVẫn tiếp tục?"),
|
||||
("ID whitelisting", "Danh sách trắng ID"),
|
||||
("Use ID whitelisting", "Sử dụng danh sách trắng ID"),
|
||||
("id_whitelist_tip", "Chỉ ID trong danh sách trắng mới có thể truy cập"),
|
||||
("id_whitelist_wildcard_tip", "Hỗ trợ ký tự đại diện: '*' khớp với số lượng ký tự bất kỳ, '?' khớp với đúng một ký tự"),
|
||||
("Invalid ID", "ID không hợp lệ"),
|
||||
("Your ID is blocked by the peer", "ID của bạn đã bị phía bên kia chặn"),
|
||||
("Your ip is blocked by the peer", "IP của bạn đã bị phía bên kia chặn"),
|
||||
("id_whitelist_caveat_tip", "ID do máy khách kết nối tự khai báo. Danh sách trắng giúp giảm mức độ lộ diện và không thay thế mật khẩu hay 2FA"),
|
||||
("whitelist_cidr_tip", "Hỗ trợ ký hiệu CIDR, ví dụ 192.168.1.0/24"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
||||
+4
-1
@@ -24,6 +24,7 @@ pub mod ipc;
|
||||
#[cfg(not(any(
|
||||
target_os = "android",
|
||||
target_os = "ios",
|
||||
feature = "cli",
|
||||
feature = "flutter"
|
||||
)))]
|
||||
pub mod ui;
|
||||
@@ -37,9 +38,11 @@ pub mod flutter;
|
||||
pub mod flutter_ffi;
|
||||
use common::*;
|
||||
mod auth_2fa;
|
||||
#[cfg(feature = "cli")]
|
||||
pub mod cli;
|
||||
#[cfg(not(target_os = "ios"))]
|
||||
mod clipboard;
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios", feature = "cli")))]
|
||||
pub mod core_main;
|
||||
mod custom_server;
|
||||
mod lang;
|
||||
|
||||
+71
@@ -19,6 +19,7 @@ fn main() {
|
||||
#[cfg(not(any(
|
||||
target_os = "android",
|
||||
target_os = "ios",
|
||||
feature = "cli",
|
||||
feature = "flutter"
|
||||
)))]
|
||||
fn main() {
|
||||
@@ -31,3 +32,73 @@ fn main() {
|
||||
}
|
||||
common::global_clean();
|
||||
}
|
||||
|
||||
#[cfg(feature = "cli")]
|
||||
fn main() {
|
||||
if !common::global_init() {
|
||||
return;
|
||||
}
|
||||
use clap::App;
|
||||
use hbb_common::log;
|
||||
let args = format!(
|
||||
"-p, --port-forward=[PORT-FORWARD-OPTIONS] 'Format: remote-id:local-port:remote-port[:remote-host]'
|
||||
-c, --connect=[REMOTE_ID] 'test only'
|
||||
-k, --key=[KEY] ''
|
||||
-s, --server=[] 'Start server'",
|
||||
);
|
||||
let matches = App::new("rustdesk")
|
||||
.version(crate::VERSION)
|
||||
.author("Purslane Tech Pte. Ltd.<info@rustdesk.com>")
|
||||
.about("RustDesk command line tool")
|
||||
.args_from_usage(&args)
|
||||
.get_matches();
|
||||
use hbb_common::{config::LocalConfig, env_logger::*};
|
||||
init_from_env(Env::default().filter_or(DEFAULT_FILTER_ENV, "info"));
|
||||
if let Some(p) = matches.value_of("port-forward") {
|
||||
let options: Vec<String> = p.split(":").map(|x| x.to_owned()).collect();
|
||||
if options.len() < 3 {
|
||||
log::error!("Wrong port-forward options");
|
||||
return;
|
||||
}
|
||||
let mut port = 0;
|
||||
if let Ok(v) = options[1].parse::<i32>() {
|
||||
port = v;
|
||||
} else {
|
||||
log::error!("Wrong local-port");
|
||||
return;
|
||||
}
|
||||
let mut remote_port = 0;
|
||||
if let Ok(v) = options[2].parse::<i32>() {
|
||||
remote_port = v;
|
||||
} else {
|
||||
log::error!("Wrong remote-port");
|
||||
return;
|
||||
}
|
||||
let mut remote_host = "localhost".to_owned();
|
||||
if options.len() > 3 {
|
||||
remote_host = options[3].clone();
|
||||
}
|
||||
common::test_rendezvous_server();
|
||||
common::test_nat_type();
|
||||
let key = matches.value_of("key").unwrap_or("").to_owned();
|
||||
let token = LocalConfig::get_option("access_token");
|
||||
cli::start_one_port_forward(
|
||||
options[0].clone(),
|
||||
port,
|
||||
remote_host,
|
||||
remote_port,
|
||||
key,
|
||||
token,
|
||||
);
|
||||
} else if let Some(p) = matches.value_of("connect") {
|
||||
common::test_rendezvous_server();
|
||||
common::test_nat_type();
|
||||
let key = matches.value_of("key").unwrap_or("").to_owned();
|
||||
let token = LocalConfig::get_option("access_token");
|
||||
cli::connect_test(p, key, token);
|
||||
} else if let Some(p) = matches.value_of("server") {
|
||||
log::info!("id={}", hbb_common::config::Config::get_id());
|
||||
crate::start_server(true, false);
|
||||
}
|
||||
common::global_clean();
|
||||
}
|
||||
|
||||
+1
-12
@@ -69,8 +69,7 @@ pub async fn listen(
|
||||
let id = id.clone();
|
||||
let password = password.clone();
|
||||
let mut forward = Framed::new(forward, BytesCodec::new());
|
||||
let mut close_port_forward = false;
|
||||
match connect_and_login(&id, &password, &mut ui_receiver, interface.clone(), &mut forward, key, token, is_rdp, &mut close_port_forward).await {
|
||||
match connect_and_login(&id, &password, &mut ui_receiver, interface.clone(), &mut forward, key, token, is_rdp).await {
|
||||
Ok(Some(stream)) => {
|
||||
let interface = interface.clone();
|
||||
tokio::spawn(async move {
|
||||
@@ -80,9 +79,6 @@ pub async fn listen(
|
||||
log::info!("connection from {:?} closed", addr);
|
||||
});
|
||||
}
|
||||
_ if close_port_forward => {
|
||||
break;
|
||||
}
|
||||
Err(err) => {
|
||||
interface.on_establish_connection_error(err.to_string());
|
||||
}
|
||||
@@ -115,7 +111,6 @@ async fn connect_and_login(
|
||||
key: &str,
|
||||
token: &str,
|
||||
is_rdp: bool,
|
||||
close_port_forward: &mut bool,
|
||||
) -> ResultType<Option<Stream>> {
|
||||
let conn_type = if is_rdp {
|
||||
ConnType::RDP
|
||||
@@ -125,12 +120,6 @@ async fn connect_and_login(
|
||||
let ((mut stream, direct, _pk, _kcp, _stream_type), (feedback, rendezvous_server)) =
|
||||
Client::start(id, key, token, conn_type, interface.clone()).await?;
|
||||
interface.update_direct(Some(direct));
|
||||
if !stream.is_secured() && !crate::common::is_direct_ip_access(id) {
|
||||
if !confirm_insecure_connection(&interface, ui_receiver).await {
|
||||
*close_port_forward = true;
|
||||
return Ok(None);
|
||||
}
|
||||
}
|
||||
let mut buffer = Vec::new();
|
||||
let mut received = false;
|
||||
|
||||
|
||||
+23
-977
File diff suppressed because it is too large
Load Diff
@@ -77,7 +77,7 @@ lazy_static::lazy_static! {
|
||||
pub static ref VIDEO_QOS: Arc<Mutex<VideoQoS>> = Default::default();
|
||||
pub static ref IS_UAC_RUNNING: Arc<Mutex<bool>> = Default::default();
|
||||
pub static ref IS_FOREGROUND_WINDOW_ELEVATED: Arc<Mutex<bool>> = Default::default();
|
||||
static ref SCREENSHOTS: Mutex<HashMap<(VideoSource, usize), Screenshot>> = Default::default();
|
||||
static ref SCREENSHOTS: Mutex<HashMap<usize, Screenshot>> = Default::default();
|
||||
}
|
||||
|
||||
struct Screenshot {
|
||||
@@ -192,7 +192,7 @@ impl VideoFrameController {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)]
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
pub enum VideoSource {
|
||||
Monitor,
|
||||
Camera,
|
||||
@@ -725,8 +725,7 @@ fn run(vs: VideoService) -> ResultType<()> {
|
||||
Ok(frame) => {
|
||||
repeat_encode_counter = 0;
|
||||
if frame.valid() {
|
||||
let screenshot_key = (vs.source, display_idx);
|
||||
let screenshot = SCREENSHOTS.lock().unwrap().remove(&screenshot_key);
|
||||
let screenshot = SCREENSHOTS.lock().unwrap().remove(&display_idx);
|
||||
if let Some(mut screenshot) = screenshot {
|
||||
let restore_vram = screenshot.restore_vram;
|
||||
let (msg, w, h, data) = match &frame {
|
||||
@@ -755,10 +754,7 @@ fn run(vs: VideoService) -> ResultType<()> {
|
||||
#[cfg(all(windows, feature = "vram"))]
|
||||
VRamEncoder::set_not_use(sp.name(), true);
|
||||
screenshot.restore_vram = true;
|
||||
SCREENSHOTS
|
||||
.lock()
|
||||
.unwrap()
|
||||
.insert(screenshot_key, screenshot);
|
||||
SCREENSHOTS.lock().unwrap().insert(display_idx, screenshot);
|
||||
_raii.try_vram = false;
|
||||
bail!("SWITCH");
|
||||
}
|
||||
@@ -1352,9 +1348,9 @@ fn check_qos(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn set_take_screenshot(source: VideoSource, display_idx: usize, sid: String, tx: Sender) {
|
||||
pub fn set_take_screenshot(display_idx: usize, sid: String, tx: Sender) {
|
||||
SCREENSHOTS.lock().unwrap().insert(
|
||||
(source, display_idx),
|
||||
display_idx,
|
||||
Screenshot {
|
||||
sid,
|
||||
tx,
|
||||
|
||||
@@ -12,7 +12,7 @@ use hbb_common::{
|
||||
log,
|
||||
};
|
||||
|
||||
#[cfg(not(feature = "flutter"))]
|
||||
#[cfg(not(any(feature = "flutter", feature = "cli")))]
|
||||
use crate::ui_session_interface::Session;
|
||||
use crate::{common::get_app_name, ipc, ui_interface::*};
|
||||
|
||||
@@ -29,7 +29,7 @@ lazy_static::lazy_static! {
|
||||
static ref STUPID_VALUES: Mutex<Vec<Arc<Vec<Value>>>> = Default::default();
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "flutter"))]
|
||||
#[cfg(not(any(feature = "flutter", feature = "cli")))]
|
||||
lazy_static::lazy_static! {
|
||||
pub static ref CUR_SESSION: Arc<Mutex<Option<Session<remote::SciterHandler>>>> = Default::default();
|
||||
}
|
||||
@@ -151,7 +151,7 @@ pub fn start(args: &mut [String]) {
|
||||
frame.register_behavior("native-remote", move || {
|
||||
let handler =
|
||||
remote::SciterSession::new(cmd.clone(), id.clone(), pass.clone(), args.clone());
|
||||
#[cfg(not(feature = "flutter"))]
|
||||
#[cfg(not(any(feature = "flutter", feature = "cli")))]
|
||||
{
|
||||
*CUR_SESSION.lock().unwrap() = Some(handler.inner());
|
||||
}
|
||||
|
||||
+1
-10
@@ -296,15 +296,6 @@ function msgbox(type, title, content, link="", callback=null, height=180, width=
|
||||
else msgbox("connecting", "Connecting...", "Logging in...");
|
||||
}
|
||||
};
|
||||
} else if (type.indexOf("insecure-connection") >= 0) {
|
||||
callback = function (res) {
|
||||
if (!res) {
|
||||
handler.continue_insecure_connection(false);
|
||||
view.close();
|
||||
return;
|
||||
}
|
||||
handler.continue_insecure_connection(true);
|
||||
};
|
||||
} else if (type.indexOf("custom") < 0 && !is_port_forward && !callback) {
|
||||
callback = function() { view.close(); }
|
||||
} else if (type == 'wait-remote-accept-nook') {
|
||||
@@ -488,4 +479,4 @@ class MultipleSessionComponent extends Reactor.Component {
|
||||
</select>
|
||||
</div>;
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
-13
@@ -152,7 +152,6 @@ class MsgboxComponent: Reactor.Component {
|
||||
var hasOk = this.type != "connecting" && this.type != "success" && this.type.indexOf("nook") < 0;
|
||||
var hasLink = this.link != "";
|
||||
var hasClose = this.type.indexOf("hasclose") >= 0;
|
||||
var isInsecureConnection = this.type.indexOf("insecure-connection") >= 0;
|
||||
var show_progress = this.type == "connecting";
|
||||
var me = this;
|
||||
self.timer(0, msgboxTimerFunc);
|
||||
@@ -177,12 +176,11 @@ class MsgboxComponent: Reactor.Component {
|
||||
<div style="text-align: right;">
|
||||
<span style="display:inline-block; max-width: 250px; font-size:12px;" #error />
|
||||
<progress #progress style={"color:" + color + "; display: " + (show_progress ? "inline-block" : "none")} />
|
||||
{isInsecureConnection && hasOk ? <button .button #submit .outline>{translate('Continue')}</button> : ""}
|
||||
{hasCancel || this.hasRetry ? <button .button #cancel .outline>{translate(this.hasRetry ? "OK" : "Cancel")}</button> : ""}
|
||||
{this.hasSkip() ? <button .button #skip .outline>{translate('Skip')}</button> : ""}
|
||||
{!isInsecureConnection && (hasOk || this.hasRetry) ? <button .button #submit>{translate(this.hasRetry ? "Retry" : "OK")}</button> : ""}
|
||||
{hasOk || this.hasRetry ? <button .button #submit>{translate(this.hasRetry ? "Retry" : "OK")}</button> : ""}
|
||||
{hasLink ? <button .button #jumplink .outline>{translate('JumpLink')}</button> : ""}
|
||||
{hasClose ? (isInsecureConnection ? <button .button #cancel>{translate('Disconnect')}</button> : <button .button #cancel .outline>{translate('Close')}</button>) : ""}
|
||||
{hasClose ? <button .button #cancel .outline>{translate('Close')}</button> : ""}
|
||||
{this.getScreenshotButtons()}
|
||||
</div>
|
||||
</div>
|
||||
@@ -195,10 +193,6 @@ class MsgboxComponent: Reactor.Component {
|
||||
}
|
||||
|
||||
function submit() {
|
||||
if (this.type.indexOf("insecure-connection") >= 0) {
|
||||
this.cancel();
|
||||
return;
|
||||
}
|
||||
var submit_btn = this.$(button#submit);
|
||||
if (submit_btn) {
|
||||
if (submit_btn.state.disabled) return;
|
||||
@@ -382,11 +376,7 @@ class MsgboxComponent: Reactor.Component {
|
||||
var el = me.$(.outline-focus);
|
||||
if (el) view.focus = el;
|
||||
else {
|
||||
if (me.type.indexOf("insecure-connection") >= 0) {
|
||||
el = me.$(#cancel);
|
||||
} else {
|
||||
el = me.$(#submit);
|
||||
}
|
||||
el = me.$(#submit);
|
||||
if (el) {
|
||||
view.focus = el;
|
||||
}
|
||||
|
||||
@@ -513,7 +513,6 @@ impl sciter::EventHandler for SciterSession {
|
||||
fn is_rdp();
|
||||
fn login(String, String, String, bool);
|
||||
fn send2fa(String, bool);
|
||||
fn continue_insecure_connection(bool);
|
||||
fn get_enable_trusted_devices();
|
||||
fn new_rdp();
|
||||
fn send_mouse(i32, i32, i32, bool, bool, bool, bool);
|
||||
|
||||
@@ -711,6 +711,7 @@ pub fn is_can_input_monitoring(_prompt: bool) -> bool {
|
||||
|
||||
#[inline]
|
||||
pub fn get_error() -> String {
|
||||
#[cfg(not(any(feature = "cli")))]
|
||||
#[cfg(target_os = "linux")]
|
||||
{
|
||||
let dtype = crate::platform::linux::get_display_server();
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user