mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-04-17 21:51:29 +03:00
Compare commits
5 Commits
980bc11e68
...
copilot/fi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de11e95598 | ||
|
|
b3957febe1 | ||
|
|
eacfdaed61 | ||
|
|
8c8e6deb18 | ||
|
|
22000245bc |
2
build.py
2
build.py
@@ -299,7 +299,7 @@ Version: %s
|
|||||||
Architecture: %s
|
Architecture: %s
|
||||||
Maintainer: rustdesk <info@rustdesk.com>
|
Maintainer: rustdesk <info@rustdesk.com>
|
||||||
Homepage: https://rustdesk.com
|
Homepage: https://rustdesk.com
|
||||||
Depends: libgtk-3-0, libxcb-randr0, libxdo3 | libxdo4, libxfixes3, libxcb-shape0, libxcb-xfixes0, libasound2, libsystemd0, curl, libva2, libva-drm2, libva-x11-2, libgstreamer-plugins-base1.0-0, libpam0g, gstreamer1.0-pipewire%s
|
Depends: libgtk-3-0, libxcb-randr0, libxdo3, libxfixes3, libxcb-shape0, libxcb-xfixes0, libasound2, libsystemd0, curl, libva2, libva-drm2, libva-x11-2, libgstreamer-plugins-base1.0-0, libpam0g, gstreamer1.0-pipewire%s
|
||||||
Recommends: libayatana-appindicator3-1
|
Recommends: libayatana-appindicator3-1
|
||||||
Description: A remote control software.
|
Description: A remote control software.
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,6 @@
|
|||||||
],
|
],
|
||||||
"finish-args": [
|
"finish-args": [
|
||||||
"--share=ipc",
|
"--share=ipc",
|
||||||
"--socket=wayland",
|
|
||||||
"--socket=x11",
|
"--socket=x11",
|
||||||
"--share=network",
|
"--share=network",
|
||||||
"--filesystem=home",
|
"--filesystem=home",
|
||||||
|
|||||||
@@ -1124,23 +1124,18 @@ class CustomAlertDialog extends StatelessWidget {
|
|||||||
|
|
||||||
Widget createDialogContent(String text) {
|
Widget createDialogContent(String text) {
|
||||||
final RegExp linkRegExp = RegExp(r'(https?://[^\s]+)');
|
final RegExp linkRegExp = RegExp(r'(https?://[^\s]+)');
|
||||||
bool hasLink = linkRegExp.hasMatch(text);
|
|
||||||
|
|
||||||
// Early return: no link, use default theme color
|
|
||||||
if (!hasLink) {
|
|
||||||
return SelectableText(text, style: const TextStyle(fontSize: 15));
|
|
||||||
}
|
|
||||||
|
|
||||||
final List<TextSpan> spans = [];
|
final List<TextSpan> spans = [];
|
||||||
int start = 0;
|
int start = 0;
|
||||||
|
bool hasLink = false;
|
||||||
|
|
||||||
linkRegExp.allMatches(text).forEach((match) {
|
linkRegExp.allMatches(text).forEach((match) {
|
||||||
|
hasLink = true;
|
||||||
if (match.start > start) {
|
if (match.start > start) {
|
||||||
spans.add(TextSpan(text: text.substring(start, match.start)));
|
spans.add(TextSpan(text: text.substring(start, match.start)));
|
||||||
}
|
}
|
||||||
spans.add(TextSpan(
|
spans.add(TextSpan(
|
||||||
text: match.group(0) ?? '',
|
text: match.group(0) ?? '',
|
||||||
style: const TextStyle(
|
style: TextStyle(
|
||||||
color: Colors.blue,
|
color: Colors.blue,
|
||||||
decoration: TextDecoration.underline,
|
decoration: TextDecoration.underline,
|
||||||
),
|
),
|
||||||
@@ -1158,9 +1153,13 @@ Widget createDialogContent(String text) {
|
|||||||
spans.add(TextSpan(text: text.substring(start)));
|
spans.add(TextSpan(text: text.substring(start)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!hasLink) {
|
||||||
|
return SelectableText(text, style: const TextStyle(fontSize: 15));
|
||||||
|
}
|
||||||
|
|
||||||
return SelectableText.rich(
|
return SelectableText.rich(
|
||||||
TextSpan(
|
TextSpan(
|
||||||
style: const TextStyle(fontSize: 15),
|
style: TextStyle(color: Colors.black, fontSize: 15),
|
||||||
children: spans,
|
children: spans,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ class ButtonOP extends StatelessWidget {
|
|||||||
child: FittedBox(
|
child: FittedBox(
|
||||||
fit: BoxFit.scaleDown,
|
fit: BoxFit.scaleDown,
|
||||||
child: Center(
|
child: Center(
|
||||||
child: Text(translate("Continue with {$opLabel}"))),
|
child: Text('${translate("Continue with")} $opLabel')),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -2538,49 +2538,6 @@ class WaylandCard extends StatefulWidget {
|
|||||||
|
|
||||||
class _WaylandCardState extends State<WaylandCard> {
|
class _WaylandCardState extends State<WaylandCard> {
|
||||||
final restoreTokenKey = 'wayland-restore-token';
|
final restoreTokenKey = 'wayland-restore-token';
|
||||||
static const _kClearShortcutsInhibitorEventKey =
|
|
||||||
'clear-gnome-shortcuts-inhibitor-permission-res';
|
|
||||||
final _clearShortcutsInhibitorFailedMsg = ''.obs;
|
|
||||||
// Don't show the shortcuts permission reset button for now.
|
|
||||||
// Users can change it manually:
|
|
||||||
// "Settings" -> "Apps" -> "RustDesk" -> "Permissions" -> "Inhibit Shortcuts".
|
|
||||||
// For resetting(clearing) the permission from the portal permission store, you can
|
|
||||||
// use (replace <desktop-id> with the RustDesk desktop file ID):
|
|
||||||
// busctl --user call org.freedesktop.impl.portal.PermissionStore \
|
|
||||||
// /org/freedesktop/impl/portal/PermissionStore org.freedesktop.impl.portal.PermissionStore \
|
|
||||||
// DeletePermission sss "gnome" "shortcuts-inhibitor" "<desktop-id>"
|
|
||||||
// On a native install this is typically "rustdesk.desktop"; on Flatpak it is usually
|
|
||||||
// the exported desktop ID derived from the Flatpak app-id (e.g. "com.rustdesk.RustDesk.desktop").
|
|
||||||
//
|
|
||||||
// We may add it back in the future if needed.
|
|
||||||
final showResetInhibitorPermission = false;
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
if (showResetInhibitorPermission) {
|
|
||||||
platformFFI.registerEventHandler(
|
|
||||||
_kClearShortcutsInhibitorEventKey, _kClearShortcutsInhibitorEventKey,
|
|
||||||
(evt) async {
|
|
||||||
if (!mounted) return;
|
|
||||||
if (evt['success'] == true) {
|
|
||||||
setState(() {});
|
|
||||||
} else {
|
|
||||||
_clearShortcutsInhibitorFailedMsg.value =
|
|
||||||
evt['msg'] as String? ?? 'Unknown error';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
if (showResetInhibitorPermission) {
|
|
||||||
platformFFI.unregisterEventHandler(
|
|
||||||
_kClearShortcutsInhibitorEventKey, _kClearShortcutsInhibitorEventKey);
|
|
||||||
}
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@@ -2588,16 +2545,9 @@ class _WaylandCardState extends State<WaylandCard> {
|
|||||||
future: bind.mainHandleWaylandScreencastRestoreToken(
|
future: bind.mainHandleWaylandScreencastRestoreToken(
|
||||||
key: restoreTokenKey, value: "get"),
|
key: restoreTokenKey, value: "get"),
|
||||||
hasData: (restoreToken) {
|
hasData: (restoreToken) {
|
||||||
final hasShortcutsPermission = showResetInhibitorPermission &&
|
|
||||||
bind.mainGetCommonSync(
|
|
||||||
key: "has-gnome-shortcuts-inhibitor-permission") ==
|
|
||||||
"true";
|
|
||||||
|
|
||||||
final children = [
|
final children = [
|
||||||
if (restoreToken.isNotEmpty)
|
if (restoreToken.isNotEmpty)
|
||||||
_buildClearScreenSelection(context, restoreToken),
|
_buildClearScreenSelection(context, restoreToken),
|
||||||
if (hasShortcutsPermission)
|
|
||||||
_buildClearShortcutsInhibitorPermission(context),
|
|
||||||
];
|
];
|
||||||
return Offstage(
|
return Offstage(
|
||||||
offstage: children.isEmpty,
|
offstage: children.isEmpty,
|
||||||
@@ -2642,50 +2592,6 @@ class _WaylandCardState extends State<WaylandCard> {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildClearShortcutsInhibitorPermission(BuildContext context) {
|
|
||||||
onConfirm() {
|
|
||||||
_clearShortcutsInhibitorFailedMsg.value = '';
|
|
||||||
bind.mainSetCommon(
|
|
||||||
key: "clear-gnome-shortcuts-inhibitor-permission", value: "");
|
|
||||||
gFFI.dialogManager.dismissAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
showConfirmMsgBox() => msgBoxCommon(
|
|
||||||
gFFI.dialogManager,
|
|
||||||
'Confirmation',
|
|
||||||
Text(
|
|
||||||
translate('confirm-clear-shortcuts-inhibitor-permission-tip'),
|
|
||||||
),
|
|
||||||
[
|
|
||||||
dialogButton('OK', onPressed: onConfirm),
|
|
||||||
dialogButton('Cancel',
|
|
||||||
onPressed: () => gFFI.dialogManager.dismissAll())
|
|
||||||
]);
|
|
||||||
|
|
||||||
return Column(children: [
|
|
||||||
Obx(
|
|
||||||
() => _clearShortcutsInhibitorFailedMsg.value.isEmpty
|
|
||||||
? Offstage()
|
|
||||||
: Align(
|
|
||||||
alignment: Alignment.topLeft,
|
|
||||||
child: Text(_clearShortcutsInhibitorFailedMsg.value,
|
|
||||||
style: DefaultTextStyle.of(context)
|
|
||||||
.style
|
|
||||||
.copyWith(color: Colors.red))
|
|
||||||
.marginOnly(bottom: 10.0)),
|
|
||||||
),
|
|
||||||
_Button(
|
|
||||||
'Reset keyboard shortcuts permission',
|
|
||||||
showConfirmMsgBox,
|
|
||||||
tip: 'clear-shortcuts-inhibitor-permission-tip',
|
|
||||||
style: ButtonStyle(
|
|
||||||
backgroundColor: MaterialStateProperty.all<Color>(
|
|
||||||
Theme.of(context).colorScheme.error.withOpacity(0.75)),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ignore: non_constant_identifier_names
|
// ignore: non_constant_identifier_names
|
||||||
|
|||||||
@@ -68,7 +68,6 @@ class _RemotePageState extends State<RemotePage> with WidgetsBindingObserver {
|
|||||||
double _viewInsetsBottom = 0;
|
double _viewInsetsBottom = 0;
|
||||||
final _uniqueKey = UniqueKey();
|
final _uniqueKey = UniqueKey();
|
||||||
Timer? _timerDidChangeMetrics;
|
Timer? _timerDidChangeMetrics;
|
||||||
Timer? _iosKeyboardWorkaroundTimer;
|
|
||||||
|
|
||||||
final _blockableOverlayState = BlockableOverlayState();
|
final _blockableOverlayState = BlockableOverlayState();
|
||||||
|
|
||||||
@@ -141,7 +140,6 @@ class _RemotePageState extends State<RemotePage> with WidgetsBindingObserver {
|
|||||||
await gFFI.close();
|
await gFFI.close();
|
||||||
_timer?.cancel();
|
_timer?.cancel();
|
||||||
_timerDidChangeMetrics?.cancel();
|
_timerDidChangeMetrics?.cancel();
|
||||||
_iosKeyboardWorkaroundTimer?.cancel();
|
|
||||||
gFFI.dialogManager.dismissAll();
|
gFFI.dialogManager.dismissAll();
|
||||||
await SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
|
await SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
|
||||||
overlays: SystemUiOverlay.values);
|
overlays: SystemUiOverlay.values);
|
||||||
@@ -208,24 +206,7 @@ class _RemotePageState extends State<RemotePage> with WidgetsBindingObserver {
|
|||||||
gFFI.ffiModel.pi.version.isNotEmpty) {
|
gFFI.ffiModel.pi.version.isNotEmpty) {
|
||||||
gFFI.invokeMethod("enable_soft_keyboard", false);
|
gFFI.invokeMethod("enable_soft_keyboard", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Workaround for iOS: physical keyboard input fails after virtual keyboard is hidden
|
|
||||||
// https://github.com/flutter/flutter/issues/39900
|
|
||||||
// https://github.com/rustdesk/rustdesk/discussions/11843#discussioncomment-13499698 - Virtual keyboard issue
|
|
||||||
if (isIOS) {
|
|
||||||
_iosKeyboardWorkaroundTimer?.cancel();
|
|
||||||
_iosKeyboardWorkaroundTimer = Timer(Duration(milliseconds: 100), () {
|
|
||||||
if (!mounted) return;
|
|
||||||
_physicalFocusNode.unfocus();
|
|
||||||
_iosKeyboardWorkaroundTimer = Timer(Duration(milliseconds: 50), () {
|
|
||||||
if (!mounted) return;
|
|
||||||
_physicalFocusNode.requestFocus();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
_iosKeyboardWorkaroundTimer?.cancel();
|
|
||||||
_iosKeyboardWorkaroundTimer = null;
|
|
||||||
_timer?.cancel();
|
_timer?.cancel();
|
||||||
_timer = Timer(kMobileDelaySoftKeyboardFocus, () {
|
_timer = Timer(kMobileDelaySoftKeyboardFocus, () {
|
||||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
|
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
import 'package:flutter/gestures.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_hbb/common.dart';
|
import 'package:flutter_hbb/common.dart';
|
||||||
@@ -42,9 +41,6 @@ class _TerminalPageState extends State<TerminalPage>
|
|||||||
final GlobalKey _keyboardKey = GlobalKey();
|
final GlobalKey _keyboardKey = GlobalKey();
|
||||||
double _keyboardHeight = 0;
|
double _keyboardHeight = 0;
|
||||||
late bool _showTerminalExtraKeys;
|
late bool _showTerminalExtraKeys;
|
||||||
// For iOS edge swipe gesture
|
|
||||||
double _swipeStartX = 0;
|
|
||||||
double _swipeCurrentX = 0;
|
|
||||||
|
|
||||||
// For web only.
|
// For web only.
|
||||||
// 'monospace' does not work on web, use Google Fonts, `??` is only for null safety.
|
// 'monospace' does not work on web, use Google Fonts, `??` is only for null safety.
|
||||||
@@ -151,7 +147,7 @@ class _TerminalPageState extends State<TerminalPage>
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget buildBody() {
|
Widget buildBody() {
|
||||||
final scaffold = Scaffold(
|
return Scaffold(
|
||||||
resizeToAvoidBottomInset: false, // Disable automatic layout adjustment; manually control UI updates to prevent flickering when the keyboard shows/hides
|
resizeToAvoidBottomInset: false, // Disable automatic layout adjustment; manually control UI updates to prevent flickering when the keyboard shows/hides
|
||||||
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
|
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
|
||||||
body: Stack(
|
body: Stack(
|
||||||
@@ -196,108 +192,9 @@ class _TerminalPageState extends State<TerminalPage>
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (_showTerminalExtraKeys) _buildFloatingKeyboard(),
|
if (_showTerminalExtraKeys) _buildFloatingKeyboard(),
|
||||||
// iOS-style circular close button in top-right corner
|
|
||||||
if (isIOS) _buildCloseButton(),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Add iOS edge swipe gesture to exit (similar to Android back button)
|
|
||||||
if (isIOS) {
|
|
||||||
return LayoutBuilder(
|
|
||||||
builder: (context, constraints) {
|
|
||||||
final screenWidth = constraints.maxWidth;
|
|
||||||
// Base thresholds on screen width but clamp to reasonable logical pixel ranges
|
|
||||||
// Edge detection region: ~10% of width, clamped between 20 and 80 logical pixels
|
|
||||||
final edgeThreshold = (screenWidth * 0.1).clamp(20.0, 80.0);
|
|
||||||
// Required horizontal movement: ~25% of width, clamped between 80 and 300 logical pixels
|
|
||||||
final swipeThreshold = (screenWidth * 0.25).clamp(80.0, 300.0);
|
|
||||||
|
|
||||||
return RawGestureDetector(
|
|
||||||
behavior: HitTestBehavior.translucent,
|
|
||||||
gestures: <Type, GestureRecognizerFactory>{
|
|
||||||
HorizontalDragGestureRecognizer: GestureRecognizerFactoryWithHandlers<HorizontalDragGestureRecognizer>(
|
|
||||||
() => HorizontalDragGestureRecognizer(
|
|
||||||
debugOwner: this,
|
|
||||||
// Only respond to touch input, exclude mouse/trackpad
|
|
||||||
supportedDevices: kTouchBasedDeviceKinds,
|
|
||||||
),
|
|
||||||
(HorizontalDragGestureRecognizer instance) {
|
|
||||||
instance
|
|
||||||
// Capture initial touch-down position (before touch slop)
|
|
||||||
..onDown = (details) {
|
|
||||||
_swipeStartX = details.localPosition.dx;
|
|
||||||
_swipeCurrentX = details.localPosition.dx;
|
|
||||||
}
|
|
||||||
..onUpdate = (details) {
|
|
||||||
_swipeCurrentX = details.localPosition.dx;
|
|
||||||
}
|
|
||||||
..onEnd = (details) {
|
|
||||||
// Check if swipe started from left edge and moved right
|
|
||||||
if (_swipeStartX < edgeThreshold && (_swipeCurrentX - _swipeStartX) > swipeThreshold) {
|
|
||||||
clientClose(sessionId, _ffi);
|
|
||||||
}
|
|
||||||
_swipeStartX = 0;
|
|
||||||
_swipeCurrentX = 0;
|
|
||||||
}
|
|
||||||
..onCancel = () {
|
|
||||||
_swipeStartX = 0;
|
|
||||||
_swipeCurrentX = 0;
|
|
||||||
};
|
|
||||||
},
|
|
||||||
),
|
|
||||||
},
|
|
||||||
child: scaffold,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return scaffold;
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildCloseButton() {
|
|
||||||
return Positioned(
|
|
||||||
top: 0,
|
|
||||||
right: 0,
|
|
||||||
child: SafeArea(
|
|
||||||
minimum: const EdgeInsets.only(
|
|
||||||
top: 16, // iOS standard margin
|
|
||||||
right: 16, // iOS standard margin
|
|
||||||
),
|
|
||||||
child: Semantics(
|
|
||||||
button: true,
|
|
||||||
label: translate('Close'),
|
|
||||||
child: Container(
|
|
||||||
width: 44, // iOS standard tap target size
|
|
||||||
height: 44,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Colors.black.withOpacity(0.5), // Half transparency
|
|
||||||
shape: BoxShape.circle,
|
|
||||||
),
|
|
||||||
child: Material(
|
|
||||||
color: Colors.transparent,
|
|
||||||
shape: const CircleBorder(),
|
|
||||||
clipBehavior: Clip.antiAlias,
|
|
||||||
child: InkWell(
|
|
||||||
customBorder: const CircleBorder(),
|
|
||||||
onTap: () {
|
|
||||||
clientClose(sessionId, _ffi);
|
|
||||||
},
|
|
||||||
child: Tooltip(
|
|
||||||
message: translate('Close'),
|
|
||||||
child: const Icon(
|
|
||||||
Icons.chevron_left, // iOS-style back arrow
|
|
||||||
color: Colors.white,
|
|
||||||
size: 28,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildFloatingKeyboard() {
|
Widget _buildFloatingKeyboard() {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Project-level configuration.
|
# Project-level configuration.
|
||||||
cmake_minimum_required(VERSION 3.10)
|
cmake_minimum_required(VERSION 3.10)
|
||||||
project(runner LANGUAGES C CXX)
|
project(runner LANGUAGES CXX)
|
||||||
|
|
||||||
# The name of the executable created for the application. Change this to change
|
# The name of the executable created for the application. Change this to change
|
||||||
# the on-disk name of your application.
|
# the on-disk name of your application.
|
||||||
@@ -54,55 +54,6 @@ add_subdirectory(${FLUTTER_MANAGED_DIR})
|
|||||||
find_package(PkgConfig REQUIRED)
|
find_package(PkgConfig REQUIRED)
|
||||||
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
|
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
|
||||||
|
|
||||||
# Wayland protocol for keyboard shortcuts inhibit
|
|
||||||
pkg_check_modules(WAYLAND_CLIENT IMPORTED_TARGET wayland-client)
|
|
||||||
pkg_check_modules(WAYLAND_PROTOCOLS_PKG QUIET wayland-protocols)
|
|
||||||
pkg_check_modules(WAYLAND_SCANNER_PKG QUIET wayland-scanner)
|
|
||||||
|
|
||||||
if(WAYLAND_PROTOCOLS_PKG_FOUND)
|
|
||||||
pkg_get_variable(WAYLAND_PROTOCOLS_DIR wayland-protocols pkgdatadir)
|
|
||||||
endif()
|
|
||||||
if(WAYLAND_SCANNER_PKG_FOUND)
|
|
||||||
pkg_get_variable(WAYLAND_SCANNER wayland-scanner wayland_scanner)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WAYLAND_CLIENT_FOUND AND WAYLAND_PROTOCOLS_DIR AND WAYLAND_SCANNER)
|
|
||||||
set(KEYBOARD_SHORTCUTS_INHIBIT_PROTOCOL
|
|
||||||
"${WAYLAND_PROTOCOLS_DIR}/unstable/keyboard-shortcuts-inhibit/keyboard-shortcuts-inhibit-unstable-v1.xml")
|
|
||||||
|
|
||||||
if(EXISTS ${KEYBOARD_SHORTCUTS_INHIBIT_PROTOCOL})
|
|
||||||
set(WAYLAND_GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/wayland-protocols")
|
|
||||||
file(MAKE_DIRECTORY ${WAYLAND_GENERATED_DIR})
|
|
||||||
|
|
||||||
# Generate client header
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT "${WAYLAND_GENERATED_DIR}/keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h"
|
|
||||||
COMMAND ${WAYLAND_SCANNER} client-header
|
|
||||||
${KEYBOARD_SHORTCUTS_INHIBIT_PROTOCOL}
|
|
||||||
"${WAYLAND_GENERATED_DIR}/keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h"
|
|
||||||
DEPENDS ${KEYBOARD_SHORTCUTS_INHIBIT_PROTOCOL}
|
|
||||||
VERBATIM
|
|
||||||
)
|
|
||||||
|
|
||||||
# Generate protocol code
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT "${WAYLAND_GENERATED_DIR}/keyboard-shortcuts-inhibit-unstable-v1-protocol.c"
|
|
||||||
COMMAND ${WAYLAND_SCANNER} private-code
|
|
||||||
${KEYBOARD_SHORTCUTS_INHIBIT_PROTOCOL}
|
|
||||||
"${WAYLAND_GENERATED_DIR}/keyboard-shortcuts-inhibit-unstable-v1-protocol.c"
|
|
||||||
DEPENDS ${KEYBOARD_SHORTCUTS_INHIBIT_PROTOCOL}
|
|
||||||
VERBATIM
|
|
||||||
)
|
|
||||||
|
|
||||||
set(WAYLAND_PROTOCOL_SOURCES
|
|
||||||
"${WAYLAND_GENERATED_DIR}/keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h"
|
|
||||||
"${WAYLAND_GENERATED_DIR}/keyboard-shortcuts-inhibit-unstable-v1-protocol.c"
|
|
||||||
)
|
|
||||||
|
|
||||||
set(HAS_KEYBOARD_SHORTCUTS_INHIBIT TRUE)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}")
|
add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}")
|
||||||
|
|
||||||
# Define the application target. To change its name, change BINARY_NAME above,
|
# Define the application target. To change its name, change BINARY_NAME above,
|
||||||
@@ -112,11 +63,9 @@ add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}")
|
|||||||
add_executable(${BINARY_NAME}
|
add_executable(${BINARY_NAME}
|
||||||
"main.cc"
|
"main.cc"
|
||||||
"my_application.cc"
|
"my_application.cc"
|
||||||
"wayland_shortcuts_inhibit.cc"
|
|
||||||
"bump_mouse.cc"
|
"bump_mouse.cc"
|
||||||
"bump_mouse_x11.cc"
|
"bump_mouse_x11.cc"
|
||||||
"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
|
"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
|
||||||
${WAYLAND_PROTOCOL_SOURCES}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Apply the standard set of build settings. This can be removed for applications
|
# Apply the standard set of build settings. This can be removed for applications
|
||||||
@@ -129,13 +78,6 @@ target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)
|
|||||||
target_link_libraries(${BINARY_NAME} PRIVATE ${CMAKE_DL_LIBS})
|
target_link_libraries(${BINARY_NAME} PRIVATE ${CMAKE_DL_LIBS})
|
||||||
# target_link_libraries(${BINARY_NAME} PRIVATE librustdesk)
|
# target_link_libraries(${BINARY_NAME} PRIVATE librustdesk)
|
||||||
|
|
||||||
# Wayland support for keyboard shortcuts inhibit
|
|
||||||
if(HAS_KEYBOARD_SHORTCUTS_INHIBIT)
|
|
||||||
target_compile_definitions(${BINARY_NAME} PRIVATE HAS_KEYBOARD_SHORTCUTS_INHIBIT)
|
|
||||||
target_include_directories(${BINARY_NAME} PRIVATE ${WAYLAND_GENERATED_DIR})
|
|
||||||
target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::WAYLAND_CLIENT)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Run the Flutter tool portions of the build. This must not be removed.
|
# Run the Flutter tool portions of the build. This must not be removed.
|
||||||
add_dependencies(${BINARY_NAME} flutter_assemble)
|
add_dependencies(${BINARY_NAME} flutter_assemble)
|
||||||
|
|
||||||
|
|||||||
@@ -6,11 +6,6 @@
|
|||||||
#ifdef GDK_WINDOWING_X11
|
#ifdef GDK_WINDOWING_X11
|
||||||
#include <gdk/gdkx.h>
|
#include <gdk/gdkx.h>
|
||||||
#endif
|
#endif
|
||||||
#if defined(GDK_WINDOWING_WAYLAND) && defined(HAS_KEYBOARD_SHORTCUTS_INHIBIT)
|
|
||||||
#include "wayland_shortcuts_inhibit.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <desktop_multi_window/desktop_multi_window_plugin.h>
|
|
||||||
|
|
||||||
#include "flutter/generated_plugin_registrant.h"
|
#include "flutter/generated_plugin_registrant.h"
|
||||||
|
|
||||||
@@ -96,13 +91,6 @@ static void my_application_activate(GApplication* application) {
|
|||||||
gtk_widget_show(GTK_WIDGET(window));
|
gtk_widget_show(GTK_WIDGET(window));
|
||||||
gtk_widget_show(GTK_WIDGET(view));
|
gtk_widget_show(GTK_WIDGET(view));
|
||||||
|
|
||||||
#if defined(GDK_WINDOWING_WAYLAND) && defined(HAS_KEYBOARD_SHORTCUTS_INHIBIT)
|
|
||||||
// Register callback for sub-windows created by desktop_multi_window plugin
|
|
||||||
// Only sub-windows (remote windows) need keyboard shortcuts inhibition
|
|
||||||
desktop_multi_window_plugin_set_window_created_callback(
|
|
||||||
(WindowCreatedCallback)wayland_shortcuts_inhibit_init_for_subwindow);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fl_register_plugins(FL_PLUGIN_REGISTRY(view));
|
fl_register_plugins(FL_PLUGIN_REGISTRY(view));
|
||||||
|
|
||||||
g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
|
g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
|
||||||
|
|||||||
@@ -1,244 +0,0 @@
|
|||||||
// Wayland keyboard shortcuts inhibit implementation
|
|
||||||
// Uses the zwp_keyboard_shortcuts_inhibit_manager_v1 protocol to request
|
|
||||||
// the compositor to disable system shortcuts for specific windows.
|
|
||||||
|
|
||||||
#include "wayland_shortcuts_inhibit.h"
|
|
||||||
|
|
||||||
#if defined(GDK_WINDOWING_WAYLAND) && defined(HAS_KEYBOARD_SHORTCUTS_INHIBIT)
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
#include <gdk/gdkwayland.h>
|
|
||||||
#include <wayland-client.h>
|
|
||||||
#include "keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h"
|
|
||||||
|
|
||||||
// Data structure to hold inhibitor state for each window
|
|
||||||
typedef struct {
|
|
||||||
struct zwp_keyboard_shortcuts_inhibit_manager_v1* manager;
|
|
||||||
struct zwp_keyboard_shortcuts_inhibitor_v1* inhibitor;
|
|
||||||
} ShortcutsInhibitData;
|
|
||||||
|
|
||||||
// Cleanup function for ShortcutsInhibitData
|
|
||||||
static void shortcuts_inhibit_data_free(gpointer data) {
|
|
||||||
ShortcutsInhibitData* inhibit_data = static_cast<ShortcutsInhibitData*>(data);
|
|
||||||
if (inhibit_data->inhibitor != NULL) {
|
|
||||||
zwp_keyboard_shortcuts_inhibitor_v1_destroy(inhibit_data->inhibitor);
|
|
||||||
}
|
|
||||||
if (inhibit_data->manager != NULL) {
|
|
||||||
zwp_keyboard_shortcuts_inhibit_manager_v1_destroy(inhibit_data->manager);
|
|
||||||
}
|
|
||||||
g_free(inhibit_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wayland registry handler to find the shortcuts inhibit manager
|
|
||||||
static void registry_handle_global(void* data, struct wl_registry* registry,
|
|
||||||
uint32_t name, const char* interface,
|
|
||||||
uint32_t /*version*/) {
|
|
||||||
ShortcutsInhibitData* inhibit_data = static_cast<ShortcutsInhibitData*>(data);
|
|
||||||
if (strcmp(interface,
|
|
||||||
zwp_keyboard_shortcuts_inhibit_manager_v1_interface.name) == 0) {
|
|
||||||
inhibit_data->manager =
|
|
||||||
static_cast<zwp_keyboard_shortcuts_inhibit_manager_v1*>(wl_registry_bind(
|
|
||||||
registry, name, &zwp_keyboard_shortcuts_inhibit_manager_v1_interface,
|
|
||||||
1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void registry_handle_global_remove(void* /*data*/, struct wl_registry* /*registry*/,
|
|
||||||
uint32_t /*name*/) {
|
|
||||||
// Not needed for this use case
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct wl_registry_listener registry_listener = {
|
|
||||||
registry_handle_global,
|
|
||||||
registry_handle_global_remove,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Inhibitor event handlers
|
|
||||||
static void inhibitor_active(void* /*data*/,
|
|
||||||
struct zwp_keyboard_shortcuts_inhibitor_v1* /*inhibitor*/) {
|
|
||||||
// Inhibitor is now active, shortcuts are being captured
|
|
||||||
}
|
|
||||||
|
|
||||||
static void inhibitor_inactive(void* /*data*/,
|
|
||||||
struct zwp_keyboard_shortcuts_inhibitor_v1* /*inhibitor*/) {
|
|
||||||
// Inhibitor is now inactive, shortcuts restored to compositor
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct zwp_keyboard_shortcuts_inhibitor_v1_listener inhibitor_listener = {
|
|
||||||
inhibitor_active,
|
|
||||||
inhibitor_inactive,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Forward declaration
|
|
||||||
static void uninhibit_keyboard_shortcuts(GtkWindow* window);
|
|
||||||
|
|
||||||
// Inhibit keyboard shortcuts on Wayland for a specific window
|
|
||||||
static void inhibit_keyboard_shortcuts(GtkWindow* window) {
|
|
||||||
GdkDisplay* display = gtk_widget_get_display(GTK_WIDGET(window));
|
|
||||||
if (!GDK_IS_WAYLAND_DISPLAY(display)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if already inhibited for this window
|
|
||||||
if (g_object_get_data(G_OBJECT(window), "shortcuts-inhibit-data") != NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ShortcutsInhibitData* inhibit_data = g_new0(ShortcutsInhibitData, 1);
|
|
||||||
|
|
||||||
struct wl_display* wl_display = gdk_wayland_display_get_wl_display(display);
|
|
||||||
if (wl_display == NULL) {
|
|
||||||
shortcuts_inhibit_data_free(inhibit_data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct wl_registry* registry = wl_display_get_registry(wl_display);
|
|
||||||
if (registry == NULL) {
|
|
||||||
shortcuts_inhibit_data_free(inhibit_data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
wl_registry_add_listener(registry, ®istry_listener, inhibit_data);
|
|
||||||
wl_display_roundtrip(wl_display);
|
|
||||||
|
|
||||||
if (inhibit_data->manager == NULL) {
|
|
||||||
wl_registry_destroy(registry);
|
|
||||||
shortcuts_inhibit_data_free(inhibit_data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkWindow* gdk_window = gtk_widget_get_window(GTK_WIDGET(window));
|
|
||||||
if (gdk_window == NULL) {
|
|
||||||
wl_registry_destroy(registry);
|
|
||||||
shortcuts_inhibit_data_free(inhibit_data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct wl_surface* surface = gdk_wayland_window_get_wl_surface(gdk_window);
|
|
||||||
if (surface == NULL) {
|
|
||||||
wl_registry_destroy(registry);
|
|
||||||
shortcuts_inhibit_data_free(inhibit_data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkSeat* gdk_seat = gdk_display_get_default_seat(display);
|
|
||||||
if (gdk_seat == NULL) {
|
|
||||||
wl_registry_destroy(registry);
|
|
||||||
shortcuts_inhibit_data_free(inhibit_data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct wl_seat* seat = gdk_wayland_seat_get_wl_seat(gdk_seat);
|
|
||||||
if (seat == NULL) {
|
|
||||||
wl_registry_destroy(registry);
|
|
||||||
shortcuts_inhibit_data_free(inhibit_data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
inhibit_data->inhibitor =
|
|
||||||
zwp_keyboard_shortcuts_inhibit_manager_v1_inhibit_shortcuts(
|
|
||||||
inhibit_data->manager, surface, seat);
|
|
||||||
|
|
||||||
if (inhibit_data->inhibitor == NULL) {
|
|
||||||
wl_registry_destroy(registry);
|
|
||||||
shortcuts_inhibit_data_free(inhibit_data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add listener to monitor active/inactive state
|
|
||||||
zwp_keyboard_shortcuts_inhibitor_v1_add_listener(
|
|
||||||
inhibit_data->inhibitor, &inhibitor_listener, window);
|
|
||||||
|
|
||||||
wl_display_roundtrip(wl_display);
|
|
||||||
wl_registry_destroy(registry);
|
|
||||||
|
|
||||||
// Associate the inhibit data with the window for cleanup on destroy
|
|
||||||
g_object_set_data_full(G_OBJECT(window), "shortcuts-inhibit-data",
|
|
||||||
inhibit_data, shortcuts_inhibit_data_free);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove keyboard shortcuts inhibitor from a window
|
|
||||||
static void uninhibit_keyboard_shortcuts(GtkWindow* window) {
|
|
||||||
ShortcutsInhibitData* inhibit_data = static_cast<ShortcutsInhibitData*>(
|
|
||||||
g_object_get_data(G_OBJECT(window), "shortcuts-inhibit-data"));
|
|
||||||
|
|
||||||
if (inhibit_data == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This will trigger shortcuts_inhibit_data_free via g_object_set_data
|
|
||||||
g_object_set_data(G_OBJECT(window), "shortcuts-inhibit-data", NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Focus event handlers for dynamic inhibitor management
|
|
||||||
static gboolean on_window_focus_in(GtkWidget* widget, GdkEventFocus* /*event*/, gpointer /*user_data*/) {
|
|
||||||
if (GTK_IS_WINDOW(widget)) {
|
|
||||||
inhibit_keyboard_shortcuts(GTK_WINDOW(widget));
|
|
||||||
}
|
|
||||||
return FALSE; // Continue event propagation
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean on_window_focus_out(GtkWidget* widget, GdkEventFocus* /*event*/, gpointer /*user_data*/) {
|
|
||||||
if (GTK_IS_WINDOW(widget)) {
|
|
||||||
uninhibit_keyboard_shortcuts(GTK_WINDOW(widget));
|
|
||||||
}
|
|
||||||
return FALSE; // Continue event propagation
|
|
||||||
}
|
|
||||||
|
|
||||||
// Key for marking window as having focus handlers connected
|
|
||||||
static const char* const kFocusHandlersConnectedKey = "shortcuts-inhibit-focus-handlers-connected";
|
|
||||||
// Key for marking window as having a pending realize handler
|
|
||||||
static const char* const kRealizeHandlerConnectedKey = "shortcuts-inhibit-realize-handler-connected";
|
|
||||||
|
|
||||||
// Callback when window is realized (mapped to screen)
|
|
||||||
// Sets up focus-based inhibitor management
|
|
||||||
static void on_window_realize(GtkWidget* widget, gpointer /*user_data*/) {
|
|
||||||
if (GTK_IS_WINDOW(widget)) {
|
|
||||||
// Check if focus handlers are already connected to avoid duplicates
|
|
||||||
if (g_object_get_data(G_OBJECT(widget), kFocusHandlersConnectedKey) != NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Connect focus events for dynamic inhibitor management
|
|
||||||
g_signal_connect(widget, "focus-in-event",
|
|
||||||
G_CALLBACK(on_window_focus_in), NULL);
|
|
||||||
g_signal_connect(widget, "focus-out-event",
|
|
||||||
G_CALLBACK(on_window_focus_out), NULL);
|
|
||||||
|
|
||||||
// Mark as connected to prevent duplicate connections
|
|
||||||
g_object_set_data(G_OBJECT(widget), kFocusHandlersConnectedKey, GINT_TO_POINTER(1));
|
|
||||||
|
|
||||||
// If window already has focus, create inhibitor now
|
|
||||||
if (gtk_window_has_toplevel_focus(GTK_WINDOW(widget))) {
|
|
||||||
inhibit_keyboard_shortcuts(GTK_WINDOW(widget));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Public API: Initialize shortcuts inhibit for a sub-window
|
|
||||||
void wayland_shortcuts_inhibit_init_for_subwindow(void* view) {
|
|
||||||
GtkWidget* widget = GTK_WIDGET(view);
|
|
||||||
GtkWidget* toplevel = gtk_widget_get_toplevel(widget);
|
|
||||||
|
|
||||||
if (toplevel != NULL && GTK_IS_WINDOW(toplevel)) {
|
|
||||||
// Check if already initialized to avoid duplicate realize handlers
|
|
||||||
if (g_object_get_data(G_OBJECT(toplevel), kFocusHandlersConnectedKey) != NULL ||
|
|
||||||
g_object_get_data(G_OBJECT(toplevel), kRealizeHandlerConnectedKey) != NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gtk_widget_get_realized(toplevel)) {
|
|
||||||
// Window is already realized, set up focus handlers now
|
|
||||||
on_window_realize(toplevel, NULL);
|
|
||||||
} else {
|
|
||||||
// Mark realize handler as connected to prevent duplicate connections
|
|
||||||
// if called again before window is realized
|
|
||||||
g_object_set_data(G_OBJECT(toplevel), kRealizeHandlerConnectedKey, GINT_TO_POINTER(1));
|
|
||||||
// Wait for window to be realized
|
|
||||||
g_signal_connect(toplevel, "realize",
|
|
||||||
G_CALLBACK(on_window_realize), NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // defined(GDK_WINDOWING_WAYLAND) && defined(HAS_KEYBOARD_SHORTCUTS_INHIBIT)
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
// Wayland keyboard shortcuts inhibit support
|
|
||||||
// This module provides functionality to inhibit system keyboard shortcuts
|
|
||||||
// on Wayland compositors, allowing remote desktop windows to capture all
|
|
||||||
// key events including Super, Alt+Tab, etc.
|
|
||||||
|
|
||||||
#ifndef WAYLAND_SHORTCUTS_INHIBIT_H_
|
|
||||||
#define WAYLAND_SHORTCUTS_INHIBIT_H_
|
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
|
||||||
|
|
||||||
#if defined(GDK_WINDOWING_WAYLAND) && defined(HAS_KEYBOARD_SHORTCUTS_INHIBIT)
|
|
||||||
|
|
||||||
// Initialize shortcuts inhibit for a sub-window created by desktop_multi_window plugin.
|
|
||||||
// This sets up focus-based inhibitor management: inhibitor is created when
|
|
||||||
// the window gains focus and destroyed when it loses focus.
|
|
||||||
//
|
|
||||||
// @param view The FlView of the sub-window
|
|
||||||
void wayland_shortcuts_inhibit_init_for_subwindow(void* view);
|
|
||||||
|
|
||||||
#endif // defined(GDK_WINDOWING_WAYLAND) && defined(HAS_KEYBOARD_SHORTCUTS_INHIBIT)
|
|
||||||
|
|
||||||
#endif // WAYLAND_SHORTCUTS_INHIBIT_H_
|
|
||||||
@@ -10,7 +10,7 @@ TODO: Move this lib to a separate project.
|
|||||||
|
|
||||||
## How it works
|
## How it works
|
||||||
|
|
||||||
Terminologies:
|
Terminalogies:
|
||||||
|
|
||||||
- cliprdr: this module
|
- cliprdr: this module
|
||||||
- local: the endpoint which initiates a file copy events
|
- local: the endpoint which initiates a file copy events
|
||||||
@@ -50,7 +50,7 @@ sequenceDiagram
|
|||||||
r ->> l: Format List Response (notified)
|
r ->> l: Format List Response (notified)
|
||||||
r ->> l: Format Data Request (requests file list)
|
r ->> l: Format Data Request (requests file list)
|
||||||
activate l
|
activate l
|
||||||
note left of l: Retrieve file list from system clipboard
|
note left of l: Retrive file list from system clipboard
|
||||||
l ->> r: Format Data Response (containing file list)
|
l ->> r: Format Data Response (containing file list)
|
||||||
deactivate l
|
deactivate l
|
||||||
note over r: Update system clipboard with received file list
|
note over r: Update system clipboard with received file list
|
||||||
@@ -84,10 +84,10 @@ and copy files to remote.
|
|||||||
The protocol was originally designed as an extension of the Windows RDP,
|
The protocol was originally designed as an extension of the Windows RDP,
|
||||||
so the specific message packages fits windows well.
|
so the specific message packages fits windows well.
|
||||||
|
|
||||||
When starting cliprdr, a thread is spawned to create an invisible window
|
When starting cliprdr, a thread is spawn to create a invisible window
|
||||||
and to subscribe to OLE clipboard events.
|
and to subscribe to OLE clipboard events.
|
||||||
The window's callback (see `cliprdr_proc` in `src/windows/wf_cliprdr.c`) was
|
The window's callback (see `cliprdr_proc` in `src/windows/wf_cliprdr.c`) was
|
||||||
set to handle a variety of events.
|
set to handle a variaty of events.
|
||||||
|
|
||||||
Detailed implementation is shown in pictures above.
|
Detailed implementation is shown in pictures above.
|
||||||
|
|
||||||
@@ -108,18 +108,18 @@ after filtering out those pointing to our FUSE directory or duplicated,
|
|||||||
send format list directly to remote.
|
send format list directly to remote.
|
||||||
|
|
||||||
The cliprdr server also uses clipboard client for setting clipboard,
|
The cliprdr server also uses clipboard client for setting clipboard,
|
||||||
or retrieve paths from system.
|
or retrive paths from system.
|
||||||
|
|
||||||
#### Local File List
|
#### Local File List
|
||||||
|
|
||||||
The local file list is a temporary list of file metadata.
|
The local file list is a temperary list of file metadata.
|
||||||
When receiving file contents PDU from peer, the server picks
|
When receiving file contents PDU from peer, the server picks
|
||||||
out the file requested and open it for reading if necessary.
|
out the file requested and open it for reading if necessary.
|
||||||
|
|
||||||
Also when receiving Format Data Request PDU from remote asking for file list,
|
Also when receiving Format Data Request PDU from remote asking for file list,
|
||||||
the local file list should be rebuilt from file list retrieved from Clipboard Client.
|
the local file list should be rebuilt from file list retrieved from Clipboard Client.
|
||||||
|
|
||||||
Some caching and preloading could be done on it since applications are likely to read
|
Some caching and preloading could done on it since applications are likely to read
|
||||||
on the list sequentially.
|
on the list sequentially.
|
||||||
|
|
||||||
#### FUSE server
|
#### FUSE server
|
||||||
|
|||||||
Submodule libs/hbb_common updated: da339dca64...900077a2c2
@@ -55,6 +55,10 @@ pub struct HwRamEncoder {
|
|||||||
pub pixfmt: AVPixelFormat,
|
pub pixfmt: AVPixelFormat,
|
||||||
bitrate: u32, //kbs
|
bitrate: u32, //kbs
|
||||||
config: HwRamEncoderConfig,
|
config: HwRamEncoderConfig,
|
||||||
|
// Frame statistics for quality monitoring
|
||||||
|
frame_count: u64,
|
||||||
|
total_frame_size: u64,
|
||||||
|
last_quality_log: std::time::Instant,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EncoderApi for HwRamEncoder {
|
impl EncoderApi for HwRamEncoder {
|
||||||
@@ -94,13 +98,35 @@ impl EncoderApi for HwRamEncoder {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
match Encoder::new(ctx.clone()) {
|
match Encoder::new(ctx.clone()) {
|
||||||
Ok(encoder) => Ok(HwRamEncoder {
|
Ok(encoder) => {
|
||||||
encoder,
|
// Log detailed encoder information for diagnostics
|
||||||
format,
|
log::info!(
|
||||||
pixfmt: ctx.pixfmt,
|
"Hardware encoder created successfully: name='{}', format={:?}, resolution={}x{}, bitrate={} kbps, fps={}, gop={}, rate_control={:?}",
|
||||||
bitrate,
|
config.name,
|
||||||
config,
|
format,
|
||||||
}),
|
config.width,
|
||||||
|
config.height,
|
||||||
|
bitrate,
|
||||||
|
DEFAULT_FPS,
|
||||||
|
gop,
|
||||||
|
rc
|
||||||
|
);
|
||||||
|
// Log GPU signature for hardware-specific issue tracking
|
||||||
|
let gpu_sig = hwcodec::common::get_gpu_signature();
|
||||||
|
if !gpu_sig.is_empty() {
|
||||||
|
log::info!("GPU signature: {}", gpu_sig);
|
||||||
|
}
|
||||||
|
Ok(HwRamEncoder {
|
||||||
|
encoder,
|
||||||
|
format,
|
||||||
|
pixfmt: ctx.pixfmt,
|
||||||
|
bitrate,
|
||||||
|
config,
|
||||||
|
frame_count: 0,
|
||||||
|
total_frame_size: 0,
|
||||||
|
last_quality_log: std::time::Instant::now(),
|
||||||
|
})
|
||||||
|
}
|
||||||
Err(_) => Err(anyhow!(format!("Failed to create encoder"))),
|
Err(_) => Err(anyhow!(format!("Failed to create encoder"))),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -171,6 +197,7 @@ impl EncoderApi for HwRamEncoder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn set_quality(&mut self, ratio: f32) -> ResultType<()> {
|
fn set_quality(&mut self, ratio: f32) -> ResultType<()> {
|
||||||
|
let old_bitrate = self.bitrate;
|
||||||
let mut bitrate = Self::bitrate(
|
let mut bitrate = Self::bitrate(
|
||||||
&self.config.name,
|
&self.config.name,
|
||||||
self.config.width,
|
self.config.width,
|
||||||
@@ -181,6 +208,22 @@ impl EncoderApi for HwRamEncoder {
|
|||||||
bitrate = Self::check_bitrate_range(&self.config, bitrate);
|
bitrate = Self::check_bitrate_range(&self.config, bitrate);
|
||||||
self.encoder.set_bitrate(bitrate as _).ok();
|
self.encoder.set_bitrate(bitrate as _).ok();
|
||||||
self.bitrate = bitrate;
|
self.bitrate = bitrate;
|
||||||
|
|
||||||
|
// Log quality changes for hardware-specific diagnostics
|
||||||
|
if old_bitrate != bitrate {
|
||||||
|
log::info!(
|
||||||
|
"Hardware encoder quality changed: encoder='{}', ratio={:.2}, bitrate {} -> {} kbps",
|
||||||
|
self.config.name,
|
||||||
|
ratio,
|
||||||
|
old_bitrate,
|
||||||
|
bitrate
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset statistics on quality change
|
||||||
|
self.frame_count = 0;
|
||||||
|
self.total_frame_size = 0;
|
||||||
|
self.last_quality_log = std::time::Instant::now();
|
||||||
}
|
}
|
||||||
self.config.quality = ratio;
|
self.config.quality = ratio;
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -234,6 +277,43 @@ impl HwRamEncoder {
|
|||||||
Ok(v) => {
|
Ok(v) => {
|
||||||
let mut data = Vec::<EncodeFrame>::new();
|
let mut data = Vec::<EncodeFrame>::new();
|
||||||
data.append(v);
|
data.append(v);
|
||||||
|
|
||||||
|
// Monitor encoding quality by tracking frame sizes
|
||||||
|
if !data.is_empty() {
|
||||||
|
self.frame_count += data.len() as u64;
|
||||||
|
let frame_sizes: u64 = data.iter().map(|f| f.data.len() as u64).sum();
|
||||||
|
self.total_frame_size += frame_sizes;
|
||||||
|
|
||||||
|
// Log quality statistics every 300 frames (10 seconds at 30fps)
|
||||||
|
if self.frame_count % 300 == 0 && self.last_quality_log.elapsed().as_secs() >= 10 {
|
||||||
|
let avg_frame_size = self.total_frame_size / self.frame_count;
|
||||||
|
let expected_frame_size = (self.bitrate as u64 * 1000) / (8 * DEFAULT_FPS as u64);
|
||||||
|
|
||||||
|
// Log if actual frame size is significantly different from expected
|
||||||
|
let ratio = avg_frame_size as f64 / expected_frame_size as f64;
|
||||||
|
if ratio < 0.3 || ratio > 3.0 {
|
||||||
|
log::warn!(
|
||||||
|
"Hardware encoder quality issue detected: encoder='{}', avg_frame_size={} bytes, expected={} bytes, ratio={:.2}, bitrate={} kbps",
|
||||||
|
self.config.name,
|
||||||
|
avg_frame_size,
|
||||||
|
expected_frame_size,
|
||||||
|
ratio,
|
||||||
|
self.bitrate
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
log::debug!(
|
||||||
|
"Hardware encoder stats: encoder='{}', frames={}, avg_size={} bytes, expected={} bytes, ratio={:.2}",
|
||||||
|
self.config.name,
|
||||||
|
self.frame_count,
|
||||||
|
avg_frame_size,
|
||||||
|
expected_frame_size,
|
||||||
|
ratio
|
||||||
|
);
|
||||||
|
}
|
||||||
|
self.last_quality_log = std::time::Instant::now();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Ok(data)
|
Ok(data)
|
||||||
}
|
}
|
||||||
Err(_) => Ok(Vec::<EncodeFrame>::new()),
|
Err(_) => Ok(Vec::<EncodeFrame>::new()),
|
||||||
@@ -252,6 +332,18 @@ impl HwRamEncoder {
|
|||||||
Self::calc_bitrate(width, height, ratio, name.contains("h264"))
|
Self::calc_bitrate(width, height, ratio, name.contains("h264"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Calculate bitrate for hardware encoders based on resolution and quality ratio.
|
||||||
|
///
|
||||||
|
/// NOTE: Hardware encoder quality can vary significantly across different GPUs/drivers.
|
||||||
|
/// Some hardware may require higher bitrates than others to achieve acceptable quality.
|
||||||
|
/// The multipliers below provide a baseline, but specific hardware (especially older
|
||||||
|
/// GPUs or certain driver versions) may still produce poor quality output even with
|
||||||
|
/// these settings. Monitor logs for "Hardware encoder quality issue detected" warnings.
|
||||||
|
///
|
||||||
|
/// If quality issues persist on specific hardware:
|
||||||
|
/// - Check GPU driver version and update if needed
|
||||||
|
/// - Consider forcing VP8/VP9 software codec as fallback
|
||||||
|
/// - File bug report with GPU model and driver version
|
||||||
pub fn calc_bitrate(width: usize, height: usize, ratio: f32, h264: bool) -> u32 {
|
pub fn calc_bitrate(width: usize, height: usize, ratio: f32, h264: bool) -> u32 {
|
||||||
let base = base_bitrate(width as _, height as _) as f32 * ratio;
|
let base = base_bitrate(width as _, height as _) as f32 * ratio;
|
||||||
let threshold = 2000.0;
|
let threshold = 2000.0;
|
||||||
@@ -264,17 +356,21 @@ impl HwRamEncoder {
|
|||||||
5.0
|
5.0
|
||||||
}
|
}
|
||||||
} else if h264 {
|
} else if h264 {
|
||||||
|
// Increased base multiplier from 2.0 to 2.5 to improve image quality
|
||||||
|
// while maintaining H264's compression efficiency
|
||||||
|
if base > threshold {
|
||||||
|
1.0 + 1.5 / (1.0 + (base - threshold) * decay_rate)
|
||||||
|
} else {
|
||||||
|
2.5
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// H265: Increased base multiplier from 1.5 to 2.0 to fix poor image quality
|
||||||
|
// H265 should be more efficient than H264, but needs sufficient bitrate
|
||||||
if base > threshold {
|
if base > threshold {
|
||||||
1.0 + 1.0 / (1.0 + (base - threshold) * decay_rate)
|
1.0 + 1.0 / (1.0 + (base - threshold) * decay_rate)
|
||||||
} else {
|
} else {
|
||||||
2.0
|
2.0
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if base > threshold {
|
|
||||||
1.0 + 0.5 / (1.0 + (base - threshold) * decay_rate)
|
|
||||||
} else {
|
|
||||||
1.5
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
(base * factor) as u32
|
(base * factor) as u32
|
||||||
}
|
}
|
||||||
@@ -761,3 +857,53 @@ pub fn start_check_process() {
|
|||||||
std::thread::spawn(f);
|
std::thread::spawn(f);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_h264_h265_bitrate_calculation() {
|
||||||
|
// Test with 1920x1080 resolution (base_bitrate() returns 2073 kbps for 1080p)
|
||||||
|
let width = 1920;
|
||||||
|
let height = 1080;
|
||||||
|
|
||||||
|
// Test with BR_BALANCED (0.67) - default quality setting
|
||||||
|
let balanced_ratio = 0.67;
|
||||||
|
let h264_balanced = HwRamEncoder::calc_bitrate(width, height, balanced_ratio, true);
|
||||||
|
let h265_balanced = HwRamEncoder::calc_bitrate(width, height, balanced_ratio, false);
|
||||||
|
|
||||||
|
// H265 should get ~2777 kbps with new multiplier (was ~2084 with old 1.5x)
|
||||||
|
assert!(h265_balanced >= 2700 && h265_balanced <= 2850,
|
||||||
|
"H265 balanced bitrate should be ~2777 kbps, got {} kbps", h265_balanced);
|
||||||
|
|
||||||
|
// H264 should get ~3472 kbps with new multiplier (was ~2778 with old 2.0x)
|
||||||
|
assert!(h264_balanced >= 3400 && h264_balanced <= 3550,
|
||||||
|
"H264 balanced bitrate should be ~3472 kbps, got {} kbps", h264_balanced);
|
||||||
|
|
||||||
|
// H264 should have higher bitrate than H265 at same quality
|
||||||
|
assert!(h264_balanced > h265_balanced,
|
||||||
|
"H264 should have higher bitrate than H265");
|
||||||
|
|
||||||
|
// Test with BR_BEST (1.5) - best quality setting
|
||||||
|
let best_ratio = 1.5;
|
||||||
|
let h265_best = HwRamEncoder::calc_bitrate(width, height, best_ratio, false);
|
||||||
|
|
||||||
|
// At best quality, should use significantly more bitrate (>50% more)
|
||||||
|
assert!((h265_best as f64) > (h265_balanced as f64 * 1.5),
|
||||||
|
"Best quality should use >50% more bitrate than balanced");
|
||||||
|
|
||||||
|
// Test with BR_SPEED (0.5) - low quality setting
|
||||||
|
let speed_ratio = 0.5;
|
||||||
|
let h265_speed = HwRamEncoder::calc_bitrate(width, height, speed_ratio, false);
|
||||||
|
|
||||||
|
// At speed quality, should use less bitrate
|
||||||
|
assert!(h265_speed < h265_balanced,
|
||||||
|
"Speed quality should use less bitrate than balanced");
|
||||||
|
|
||||||
|
// Verify bitrate scales proportionally with resolution
|
||||||
|
let hd_bitrate = HwRamEncoder::calc_bitrate(1280, 720, balanced_ratio, false);
|
||||||
|
assert!(hd_bitrate < h265_balanced,
|
||||||
|
"720p should use less bitrate than 1080p");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1072,6 +1072,10 @@ fn get_api_server_(api: String, custom: String) -> String {
|
|||||||
if !api.is_empty() {
|
if !api.is_empty() {
|
||||||
return api.to_owned();
|
return api.to_owned();
|
||||||
}
|
}
|
||||||
|
let api = option_env!("API_SERVER").unwrap_or_default();
|
||||||
|
if !api.is_empty() {
|
||||||
|
return api.into();
|
||||||
|
}
|
||||||
let s0 = get_custom_rendezvous_server(custom);
|
let s0 = get_custom_rendezvous_server(custom);
|
||||||
if !s0.is_empty() {
|
if !s0.is_empty() {
|
||||||
let s = crate::increase_port(&s0, -2);
|
let s = crate::increase_port(&s0, -2);
|
||||||
@@ -1733,7 +1737,8 @@ pub fn create_symmetric_key_msg(their_pk_b: [u8; 32]) -> (Bytes, Bytes, secretbo
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn using_public_server() -> bool {
|
pub fn using_public_server() -> bool {
|
||||||
crate::get_custom_rendezvous_server(get_option("custom-rendezvous-server")).is_empty()
|
option_env!("RENDEZVOUS_SERVER").unwrap_or("").is_empty()
|
||||||
|
&& crate::get_custom_rendezvous_server(get_option("custom-rendezvous-server")).is_empty()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ThrottledInterval {
|
pub struct ThrottledInterval {
|
||||||
|
|||||||
@@ -2759,11 +2759,6 @@ pub fn main_get_common(key: String) -> String {
|
|||||||
None => "",
|
None => "",
|
||||||
}
|
}
|
||||||
.to_string();
|
.to_string();
|
||||||
} else if key == "has-gnome-shortcuts-inhibitor-permission" {
|
|
||||||
#[cfg(target_os = "linux")]
|
|
||||||
return crate::platform::linux::has_gnome_shortcuts_inhibitor_permission().to_string();
|
|
||||||
#[cfg(not(target_os = "linux"))]
|
|
||||||
return false.to_string();
|
|
||||||
} else {
|
} else {
|
||||||
if key.starts_with("download-data-") {
|
if key.starts_with("download-data-") {
|
||||||
let id = key.replace("download-data-", "");
|
let id = key.replace("download-data-", "");
|
||||||
@@ -2925,29 +2920,6 @@ pub fn main_set_common(_key: String, _value: String) {
|
|||||||
} else if _key == "cancel-downloader" {
|
} else if _key == "cancel-downloader" {
|
||||||
crate::hbbs_http::downloader::cancel(&_value);
|
crate::hbbs_http::downloader::cancel(&_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
|
||||||
if _key == "clear-gnome-shortcuts-inhibitor-permission" {
|
|
||||||
std::thread::spawn(move || {
|
|
||||||
let (success, msg) =
|
|
||||||
match crate::platform::linux::clear_gnome_shortcuts_inhibitor_permission() {
|
|
||||||
Ok(_) => (true, "".to_owned()),
|
|
||||||
Err(e) => (false, e.to_string()),
|
|
||||||
};
|
|
||||||
let data = HashMap::from([
|
|
||||||
(
|
|
||||||
"name",
|
|
||||||
serde_json::json!("clear-gnome-shortcuts-inhibitor-permission-res"),
|
|
||||||
),
|
|
||||||
("success", serde_json::json!(success)),
|
|
||||||
("msg", serde_json::json!(msg)),
|
|
||||||
]);
|
|
||||||
let _res = flutter::push_global_event(
|
|
||||||
flutter::APP_TYPE_MAIN,
|
|
||||||
serde_json::ser::to_string(&data).unwrap_or("".to_owned()),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn session_get_common_sync(
|
pub fn session_get_common_sync(
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "عرض RustDesk"),
|
("Show RustDesk", "عرض RustDesk"),
|
||||||
("This PC", "هذا الحاسب"),
|
("This PC", "هذا الحاسب"),
|
||||||
("or", "او"),
|
("or", "او"),
|
||||||
|
("Continue with", "متابعة مع"),
|
||||||
("Elevate", "ارتقاء"),
|
("Elevate", "ارتقاء"),
|
||||||
("Zoom cursor", "تكبير المؤشر"),
|
("Zoom cursor", "تكبير المؤشر"),
|
||||||
("Accept sessions via password", "قبول الجلسات عبر كلمة المرور"),
|
("Accept sessions via password", "قبول الجلسات عبر كلمة المرور"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "متابعة مع {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Паказаць RustDesk"),
|
("Show RustDesk", "Паказаць RustDesk"),
|
||||||
("This PC", "Гэты кампутар"),
|
("This PC", "Гэты кампутар"),
|
||||||
("or", "або"),
|
("or", "або"),
|
||||||
|
("Continue with", "Працягнуць з"),
|
||||||
("Elevate", "Павысіць"),
|
("Elevate", "Павысіць"),
|
||||||
("Zoom cursor", "Павялічэнне курсора"),
|
("Zoom cursor", "Павялічэнне курсора"),
|
||||||
("Accept sessions via password", "Прымаць сеансы па паролю"),
|
("Accept sessions via password", "Прымаць сеансы па паролю"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Працягнуць з {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Покажи RustDesk"),
|
("Show RustDesk", "Покажи RustDesk"),
|
||||||
("This PC", "Този компютър"),
|
("This PC", "Този компютър"),
|
||||||
("or", "или"),
|
("or", "или"),
|
||||||
|
("Continue with", "Продължи с"),
|
||||||
("Elevate", "Повишаване"),
|
("Elevate", "Повишаване"),
|
||||||
("Zoom cursor", "Уголемяване курсор"),
|
("Zoom cursor", "Уголемяване курсор"),
|
||||||
("Accept sessions via password", "Приемане сесии чрез парола"),
|
("Accept sessions via password", "Приемане сесии чрез парола"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Продължи с {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Mostra el RustDesk"),
|
("Show RustDesk", "Mostra el RustDesk"),
|
||||||
("This PC", "Aquest equip"),
|
("This PC", "Aquest equip"),
|
||||||
("or", "o"),
|
("or", "o"),
|
||||||
|
("Continue with", "Continua amb"),
|
||||||
("Elevate", "Permisos ampliats"),
|
("Elevate", "Permisos ampliats"),
|
||||||
("Zoom cursor", "Escala del ratolí"),
|
("Zoom cursor", "Escala del ratolí"),
|
||||||
("Accept sessions via password", "Accepta les sessions mitjançant una contrasenya"),
|
("Accept sessions via password", "Accepta les sessions mitjançant una contrasenya"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Continua amb {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "显示 RustDesk"),
|
("Show RustDesk", "显示 RustDesk"),
|
||||||
("This PC", "此电脑"),
|
("This PC", "此电脑"),
|
||||||
("or", "或"),
|
("or", "或"),
|
||||||
|
("Continue with", "使用"),
|
||||||
("Elevate", "提权"),
|
("Elevate", "提权"),
|
||||||
("Zoom cursor", "缩放光标"),
|
("Zoom cursor", "缩放光标"),
|
||||||
("Accept sessions via password", "只允许密码访问"),
|
("Accept sessions via password", "只允许密码访问"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", "更新日志"),
|
("Changelog", "更新日志"),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "使用 {} 登录"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Zobrazit RustDesk"),
|
("Show RustDesk", "Zobrazit RustDesk"),
|
||||||
("This PC", "Tento počítač"),
|
("This PC", "Tento počítač"),
|
||||||
("or", "nebo"),
|
("or", "nebo"),
|
||||||
|
("Continue with", "Pokračovat s"),
|
||||||
("Elevate", "Zvýšit"),
|
("Elevate", "Zvýšit"),
|
||||||
("Zoom cursor", "Kurzor přiblížení"),
|
("Zoom cursor", "Kurzor přiblížení"),
|
||||||
("Accept sessions via password", "Přijímat relace pomocí hesla"),
|
("Accept sessions via password", "Přijímat relace pomocí hesla"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Pokračovat s {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Vis RustDesk"),
|
("Show RustDesk", "Vis RustDesk"),
|
||||||
("This PC", "Denne PC"),
|
("This PC", "Denne PC"),
|
||||||
("or", "eller"),
|
("or", "eller"),
|
||||||
|
("Continue with", "Fortsæt med"),
|
||||||
("Elevate", "Elevér"),
|
("Elevate", "Elevér"),
|
||||||
("Zoom cursor", "Zoom markør"),
|
("Zoom cursor", "Zoom markør"),
|
||||||
("Accept sessions via password", "Acceptér sessioner via adgangskode"),
|
("Accept sessions via password", "Acceptér sessioner via adgangskode"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Fortsæt med {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "RustDesk anzeigen"),
|
("Show RustDesk", "RustDesk anzeigen"),
|
||||||
("This PC", "Dieser PC"),
|
("This PC", "Dieser PC"),
|
||||||
("or", "oder"),
|
("or", "oder"),
|
||||||
|
("Continue with", "Fortfahren mit"),
|
||||||
("Elevate", "Zugriff gewähren"),
|
("Elevate", "Zugriff gewähren"),
|
||||||
("Zoom cursor", "Cursor vergrößern"),
|
("Zoom cursor", "Cursor vergrößern"),
|
||||||
("Accept sessions via password", "Sitzung mit Passwort bestätigen"),
|
("Accept sessions via password", "Sitzung mit Passwort bestätigen"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", "Änderungsprotokoll"),
|
("Changelog", "Änderungsprotokoll"),
|
||||||
("keep-awake-during-outgoing-sessions-label", "Bildschirm während ausgehender Sitzungen aktiv halten"),
|
("keep-awake-during-outgoing-sessions-label", "Bildschirm während ausgehender Sitzungen aktiv halten"),
|
||||||
("keep-awake-during-incoming-sessions-label", "Bildschirm während eingehender Sitzungen aktiv halten"),
|
("keep-awake-during-incoming-sessions-label", "Bildschirm während eingehender Sitzungen aktiv halten"),
|
||||||
("Continue with {}", "Fortfahren mit {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Εμφάνιση RustDesk"),
|
("Show RustDesk", "Εμφάνιση RustDesk"),
|
||||||
("This PC", "Αυτός ο υπολογιστής"),
|
("This PC", "Αυτός ο υπολογιστής"),
|
||||||
("or", "ή"),
|
("or", "ή"),
|
||||||
|
("Continue with", "Συνέχεια με"),
|
||||||
("Elevate", "Ανύψωση"),
|
("Elevate", "Ανύψωση"),
|
||||||
("Zoom cursor", "Kέρσορας μεγέθυνσης"),
|
("Zoom cursor", "Kέρσορας μεγέθυνσης"),
|
||||||
("Accept sessions via password", "Αποδοχή συνεδριών με κωδικό πρόσβασης"),
|
("Accept sessions via password", "Αποδοχή συνεδριών με κωδικό πρόσβασης"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Συνέχεια με {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -220,7 +220,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("default_proxy_tip", "Default protocol and port are Socks5 and 1080"),
|
("default_proxy_tip", "Default protocol and port are Socks5 and 1080"),
|
||||||
("no_audio_input_device_tip", "No audio input device found."),
|
("no_audio_input_device_tip", "No audio input device found."),
|
||||||
("clear_Wayland_screen_selection_tip", "After clearing the screen selection, you can reselect the screen to share."),
|
("clear_Wayland_screen_selection_tip", "After clearing the screen selection, you can reselect the screen to share."),
|
||||||
("confirm_clear_Wayland_screen_selection_tip", "Are you sure you want to clear the Wayland screen selection?"),
|
("confirm_clear_Wayland_screen_selection_tip", "Are you sure to clear the Wayland screen selection?"),
|
||||||
("android_new_voice_call_tip", "A new voice call request was received. If you accept, the audio will switch to voice communication."),
|
("android_new_voice_call_tip", "A new voice call request was received. If you accept, the audio will switch to voice communication."),
|
||||||
("texture_render_tip", "Use texture rendering to make the pictures smoother. You could try disabling this option if you encounter rendering issues."),
|
("texture_render_tip", "Use texture rendering to make the pictures smoother. You could try disabling this option if you encounter rendering issues."),
|
||||||
("floating_window_tip", "It helps to keep RustDesk background service"),
|
("floating_window_tip", "It helps to keep RustDesk background service"),
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", ""),
|
("Show RustDesk", ""),
|
||||||
("This PC", ""),
|
("This PC", ""),
|
||||||
("or", ""),
|
("or", ""),
|
||||||
|
("Continue with", ""),
|
||||||
("Elevate", ""),
|
("Elevate", ""),
|
||||||
("Zoom cursor", ""),
|
("Zoom cursor", ""),
|
||||||
("Accept sessions via password", ""),
|
("Accept sessions via password", ""),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", ""),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Mostrar RustDesk"),
|
("Show RustDesk", "Mostrar RustDesk"),
|
||||||
("This PC", "Este PC"),
|
("This PC", "Este PC"),
|
||||||
("or", "o"),
|
("or", "o"),
|
||||||
|
("Continue with", "Continuar con"),
|
||||||
("Elevate", "Elevar privilegios"),
|
("Elevate", "Elevar privilegios"),
|
||||||
("Zoom cursor", "Ampliar cursor"),
|
("Zoom cursor", "Ampliar cursor"),
|
||||||
("Accept sessions via password", "Aceptar sesiones a través de contraseña"),
|
("Accept sessions via password", "Aceptar sesiones a través de contraseña"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Continuar con {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Kuva RustDesk"),
|
("Show RustDesk", "Kuva RustDesk"),
|
||||||
("This PC", "See arvuti"),
|
("This PC", "See arvuti"),
|
||||||
("or", "või"),
|
("or", "või"),
|
||||||
|
("Continue with", "Jätka koos"),
|
||||||
("Elevate", "Tõsta"),
|
("Elevate", "Tõsta"),
|
||||||
("Zoom cursor", "Suumi kursorit"),
|
("Zoom cursor", "Suumi kursorit"),
|
||||||
("Accept sessions via password", "Aktsepteeri seansid parooli kaudu"),
|
("Accept sessions via password", "Aktsepteeri seansid parooli kaudu"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Jätka koos {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Erakutsi RustDesk"),
|
("Show RustDesk", "Erakutsi RustDesk"),
|
||||||
("This PC", "PC hau"),
|
("This PC", "PC hau"),
|
||||||
("or", "edo"),
|
("or", "edo"),
|
||||||
|
("Continue with", "Jarraitu honekin"),
|
||||||
("Elevate", "Igo maila"),
|
("Elevate", "Igo maila"),
|
||||||
("Zoom cursor", "Handitu kurtsorea"),
|
("Zoom cursor", "Handitu kurtsorea"),
|
||||||
("Accept sessions via password", "Onartu saioak pasahitzaren bidez"),
|
("Accept sessions via password", "Onartu saioak pasahitzaren bidez"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "{} honekin jarraitu"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "RustDesk نمایش"),
|
("Show RustDesk", "RustDesk نمایش"),
|
||||||
("This PC", "This PC"),
|
("This PC", "This PC"),
|
||||||
("or", "یا"),
|
("or", "یا"),
|
||||||
|
("Continue with", "ادامه با"),
|
||||||
("Elevate", "ارتقاء"),
|
("Elevate", "ارتقاء"),
|
||||||
("Zoom cursor", " بزرگنمایی نشانگر ماوس"),
|
("Zoom cursor", " بزرگنمایی نشانگر ماوس"),
|
||||||
("Accept sessions via password", "قبول درخواست با رمز عبور"),
|
("Accept sessions via password", "قبول درخواست با رمز عبور"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "ادامه با {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Näytä RustDesk"),
|
("Show RustDesk", "Näytä RustDesk"),
|
||||||
("This PC", "Tämä tietokone"),
|
("This PC", "Tämä tietokone"),
|
||||||
("or", "tai"),
|
("or", "tai"),
|
||||||
|
("Continue with", "Jatka käyttäen"),
|
||||||
("Elevate", "Korota oikeudet"),
|
("Elevate", "Korota oikeudet"),
|
||||||
("Zoom cursor", "Suurennusosoitin"),
|
("Zoom cursor", "Suurennusosoitin"),
|
||||||
("Accept sessions via password", "Hyväksy istunnot salasanalla"),
|
("Accept sessions via password", "Hyväksy istunnot salasanalla"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Jatka käyttäen {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Afficher RustDesk"),
|
("Show RustDesk", "Afficher RustDesk"),
|
||||||
("This PC", "Ce PC"),
|
("This PC", "Ce PC"),
|
||||||
("or", "ou"),
|
("or", "ou"),
|
||||||
|
("Continue with", "Continuer avec"),
|
||||||
("Elevate", "Élever les privilèges"),
|
("Elevate", "Élever les privilèges"),
|
||||||
("Zoom cursor", "Augmenter la taille du curseur"),
|
("Zoom cursor", "Augmenter la taille du curseur"),
|
||||||
("Accept sessions via password", "Accepter les sessions via mot de passe"),
|
("Accept sessions via password", "Accepter les sessions via mot de passe"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", "Journal des modifications"),
|
("Changelog", "Journal des modifications"),
|
||||||
("keep-awake-during-outgoing-sessions-label", "Maintenir l’écran allumé lors des sessions sortantes"),
|
("keep-awake-during-outgoing-sessions-label", "Maintenir l’écran allumé lors des sessions sortantes"),
|
||||||
("keep-awake-during-incoming-sessions-label", "Maintenir l’écran allumé lors des sessions entrantes"),
|
("keep-awake-during-incoming-sessions-label", "Maintenir l’écran allumé lors des sessions entrantes"),
|
||||||
("Continue with {}", "Continuer avec {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "RustDesk-ის ჩვენება"),
|
("Show RustDesk", "RustDesk-ის ჩვენება"),
|
||||||
("This PC", "ეს კომპიუტერი"),
|
("This PC", "ეს კომპიუტერი"),
|
||||||
("or", "ან"),
|
("or", "ან"),
|
||||||
|
("Continue with", "გაგრძელება"),
|
||||||
("Elevate", "უფლებების აწევა"),
|
("Elevate", "უფლებების აწევა"),
|
||||||
("Zoom cursor", "კურსორის მასშტაბირება"),
|
("Zoom cursor", "კურსორის მასშტაბირება"),
|
||||||
("Accept sessions via password", "სესიების მიღება პაროლით"),
|
("Accept sessions via password", "სესიების მიღება პაროლით"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "{}-ით გაგრძელება"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "הצג את RustDesk"),
|
("Show RustDesk", "הצג את RustDesk"),
|
||||||
("This PC", "מחשב זה"),
|
("This PC", "מחשב זה"),
|
||||||
("or", "או"),
|
("or", "או"),
|
||||||
|
("Continue with", "המשך עם"),
|
||||||
("Elevate", "הפעל הרשאות מורחבות"),
|
("Elevate", "הפעל הרשאות מורחבות"),
|
||||||
("Zoom cursor", "הגדל סמן"),
|
("Zoom cursor", "הגדל סמן"),
|
||||||
("Accept sessions via password", "קבל הפעלות באמצעות סיסמה"),
|
("Accept sessions via password", "קבל הפעלות באמצעות סיסמה"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "המשך עם {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Prikaži RustDesk"),
|
("Show RustDesk", "Prikaži RustDesk"),
|
||||||
("This PC", "Ovo računalo"),
|
("This PC", "Ovo računalo"),
|
||||||
("or", "ili"),
|
("or", "ili"),
|
||||||
|
("Continue with", "Nastavi sa"),
|
||||||
("Elevate", "Izdigni"),
|
("Elevate", "Izdigni"),
|
||||||
("Zoom cursor", "Zumiraj kursor"),
|
("Zoom cursor", "Zumiraj kursor"),
|
||||||
("Accept sessions via password", "Prihvati sesije preko lozinke"),
|
("Accept sessions via password", "Prihvati sesije preko lozinke"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Nastavi sa {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "A RustDesk megjelenítése"),
|
("Show RustDesk", "A RustDesk megjelenítése"),
|
||||||
("This PC", "Ez a számítógép"),
|
("This PC", "Ez a számítógép"),
|
||||||
("or", "vagy"),
|
("or", "vagy"),
|
||||||
|
("Continue with", "Folytatás a következővel"),
|
||||||
("Elevate", "Hozzáférés engedélyezése"),
|
("Elevate", "Hozzáférés engedélyezése"),
|
||||||
("Zoom cursor", "Kurzor nagyítása"),
|
("Zoom cursor", "Kurzor nagyítása"),
|
||||||
("Accept sessions via password", "Munkamenetek elfogadása jelszóval"),
|
("Accept sessions via password", "Munkamenetek elfogadása jelszóval"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", "Változáslista"),
|
("Changelog", "Változáslista"),
|
||||||
("keep-awake-during-outgoing-sessions-label", "Képernyő aktív állapotban tartása a kimenő munkamenetek során"),
|
("keep-awake-during-outgoing-sessions-label", "Képernyő aktív állapotban tartása a kimenő munkamenetek során"),
|
||||||
("keep-awake-during-incoming-sessions-label", "Képernyő aktív állapotban tartása a bejövő munkamenetek során"),
|
("keep-awake-during-incoming-sessions-label", "Képernyő aktív állapotban tartása a bejövő munkamenetek során"),
|
||||||
("Continue with {}", "Folytatás a következővel: {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Tampilkan RustDesk"),
|
("Show RustDesk", "Tampilkan RustDesk"),
|
||||||
("This PC", "PC ini"),
|
("This PC", "PC ini"),
|
||||||
("or", "atau"),
|
("or", "atau"),
|
||||||
|
("Continue with", "Lanjutkan dengan"),
|
||||||
("Elevate", "Elevasi"),
|
("Elevate", "Elevasi"),
|
||||||
("Zoom cursor", "Perbersar Kursor"),
|
("Zoom cursor", "Perbersar Kursor"),
|
||||||
("Accept sessions via password", "Izinkan sesi dengan kata sandi"),
|
("Accept sessions via password", "Izinkan sesi dengan kata sandi"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Lanjutkan dengan {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Visualizza RustDesk"),
|
("Show RustDesk", "Visualizza RustDesk"),
|
||||||
("This PC", "Questo PC"),
|
("This PC", "Questo PC"),
|
||||||
("or", "O"),
|
("or", "O"),
|
||||||
|
("Continue with", "Continua con"),
|
||||||
("Elevate", "Eleva"),
|
("Elevate", "Eleva"),
|
||||||
("Zoom cursor", "Cursore zoom"),
|
("Zoom cursor", "Cursore zoom"),
|
||||||
("Accept sessions via password", "Accetta sessioni via password"),
|
("Accept sessions via password", "Accetta sessioni via password"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", "Novità programma"),
|
("Changelog", "Novità programma"),
|
||||||
("keep-awake-during-outgoing-sessions-label", "Mantieni lo schermo attivo durante le sessioni in uscita"),
|
("keep-awake-during-outgoing-sessions-label", "Mantieni lo schermo attivo durante le sessioni in uscita"),
|
||||||
("keep-awake-during-incoming-sessions-label", "Mantieni lo schermo attivo durante le sessioni in ingresso"),
|
("keep-awake-during-incoming-sessions-label", "Mantieni lo schermo attivo durante le sessioni in ingresso"),
|
||||||
("Continue with {}", "Continua con {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "RustDesk を表示"),
|
("Show RustDesk", "RustDesk を表示"),
|
||||||
("This PC", "この PC"),
|
("This PC", "この PC"),
|
||||||
("or", "または"),
|
("or", "または"),
|
||||||
|
("Continue with", "で続行"),
|
||||||
("Elevate", "昇格"),
|
("Elevate", "昇格"),
|
||||||
("Zoom cursor", "カーソルを拡大する"),
|
("Zoom cursor", "カーソルを拡大する"),
|
||||||
("Accept sessions via password", "パスワードでセッションを承認"),
|
("Accept sessions via password", "パスワードでセッションを承認"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "{} で続行"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "RustDesk 표시"),
|
("Show RustDesk", "RustDesk 표시"),
|
||||||
("This PC", "이 PC"),
|
("This PC", "이 PC"),
|
||||||
("or", "또는"),
|
("or", "또는"),
|
||||||
|
("Continue with", "계속"),
|
||||||
("Elevate", "권한 상승"),
|
("Elevate", "권한 상승"),
|
||||||
("Zoom cursor", "커서 확대/축소"),
|
("Zoom cursor", "커서 확대/축소"),
|
||||||
("Accept sessions via password", "비밀번호를 통해 세션 수락"),
|
("Accept sessions via password", "비밀번호를 통해 세션 수락"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", "변경 기록"),
|
("Changelog", "변경 기록"),
|
||||||
("keep-awake-during-outgoing-sessions-label", "발신 세션 중 화면 켜짐 유지"),
|
("keep-awake-during-outgoing-sessions-label", "발신 세션 중 화면 켜짐 유지"),
|
||||||
("keep-awake-during-incoming-sessions-label", "수신 세션 중 화면 켜짐 유지"),
|
("keep-awake-during-incoming-sessions-label", "수신 세션 중 화면 켜짐 유지"),
|
||||||
("Continue with {}", "{}(으)로 계속"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", ""),
|
("Show RustDesk", ""),
|
||||||
("This PC", ""),
|
("This PC", ""),
|
||||||
("or", ""),
|
("or", ""),
|
||||||
|
("Continue with", ""),
|
||||||
("Elevate", ""),
|
("Elevate", ""),
|
||||||
("Zoom cursor", ""),
|
("Zoom cursor", ""),
|
||||||
("Accept sessions via password", ""),
|
("Accept sessions via password", ""),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", ""),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Rodyti RustDesk"),
|
("Show RustDesk", "Rodyti RustDesk"),
|
||||||
("This PC", "Šis kompiuteris"),
|
("This PC", "Šis kompiuteris"),
|
||||||
("or", "arba"),
|
("or", "arba"),
|
||||||
|
("Continue with", "Tęsti su"),
|
||||||
("Elevate", "Pakelti"),
|
("Elevate", "Pakelti"),
|
||||||
("Zoom cursor", "Mastelio keitimo žymeklis"),
|
("Zoom cursor", "Mastelio keitimo žymeklis"),
|
||||||
("Accept sessions via password", "Priimti seansus naudojant slaptažodį"),
|
("Accept sessions via password", "Priimti seansus naudojant slaptažodį"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Tęsti su {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Rādīt RustDesk"),
|
("Show RustDesk", "Rādīt RustDesk"),
|
||||||
("This PC", "Šis dators"),
|
("This PC", "Šis dators"),
|
||||||
("or", "vai"),
|
("or", "vai"),
|
||||||
|
("Continue with", "Turpināt ar"),
|
||||||
("Elevate", "Pacelt"),
|
("Elevate", "Pacelt"),
|
||||||
("Zoom cursor", "Tālummaiņas kursors"),
|
("Zoom cursor", "Tālummaiņas kursors"),
|
||||||
("Accept sessions via password", "Pieņemt sesijas, izmantojot paroli"),
|
("Accept sessions via password", "Pieņemt sesijas, izmantojot paroli"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Turpināt ar {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Vis RustDesk"),
|
("Show RustDesk", "Vis RustDesk"),
|
||||||
("This PC", "Denne PC"),
|
("This PC", "Denne PC"),
|
||||||
("or", "eller"),
|
("or", "eller"),
|
||||||
|
("Continue with", "Fortsett med"),
|
||||||
("Elevate", "Elever"),
|
("Elevate", "Elever"),
|
||||||
("Zoom cursor", "Zoom markør"),
|
("Zoom cursor", "Zoom markør"),
|
||||||
("Accept sessions via password", "Aksepter sesjoner via passord"),
|
("Accept sessions via password", "Aksepter sesjoner via passord"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Fortsett med {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Toon RustDesk"),
|
("Show RustDesk", "Toon RustDesk"),
|
||||||
("This PC", "Deze PC"),
|
("This PC", "Deze PC"),
|
||||||
("or", "of"),
|
("or", "of"),
|
||||||
|
("Continue with", "Ga verder met"),
|
||||||
("Elevate", "Verhoog"),
|
("Elevate", "Verhoog"),
|
||||||
("Zoom cursor", "Zoom cursor"),
|
("Zoom cursor", "Zoom cursor"),
|
||||||
("Accept sessions via password", "Sessies accepteren via wachtwoord"),
|
("Accept sessions via password", "Sessies accepteren via wachtwoord"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", "Wijzigingenlogboek"),
|
("Changelog", "Wijzigingenlogboek"),
|
||||||
("keep-awake-during-outgoing-sessions-label", "Houd het scherm open tijdens de uitgaande sessies."),
|
("keep-awake-during-outgoing-sessions-label", "Houd het scherm open tijdens de uitgaande sessies."),
|
||||||
("keep-awake-during-incoming-sessions-label", "Houd het scherm open tijdens de inkomende sessies."),
|
("keep-awake-during-incoming-sessions-label", "Houd het scherm open tijdens de inkomende sessies."),
|
||||||
("Continue with {}", "Ga verder met {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Pokaż RustDesk"),
|
("Show RustDesk", "Pokaż RustDesk"),
|
||||||
("This PC", "Ten komputer"),
|
("This PC", "Ten komputer"),
|
||||||
("or", "lub"),
|
("or", "lub"),
|
||||||
|
("Continue with", "Kontynuuj z"),
|
||||||
("Elevate", "Uzyskaj uprawnienia"),
|
("Elevate", "Uzyskaj uprawnienia"),
|
||||||
("Zoom cursor", "Powiększenie kursora"),
|
("Zoom cursor", "Powiększenie kursora"),
|
||||||
("Accept sessions via password", "Uwierzytelnij sesję używając hasła"),
|
("Accept sessions via password", "Uwierzytelnij sesję używając hasła"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", "Dziennik zmian"),
|
("Changelog", "Dziennik zmian"),
|
||||||
("keep-awake-during-outgoing-sessions-label", "Utrzymuj urządzenie w stanie aktywnym podczas sesji wychodzących"),
|
("keep-awake-during-outgoing-sessions-label", "Utrzymuj urządzenie w stanie aktywnym podczas sesji wychodzących"),
|
||||||
("keep-awake-during-incoming-sessions-label", "Utrzymuj urządzenie w stanie aktywnym podczas sesji przychodzących"),
|
("keep-awake-during-incoming-sessions-label", "Utrzymuj urządzenie w stanie aktywnym podczas sesji przychodzących"),
|
||||||
("Continue with {}", "Kontynuuj z {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", ""),
|
("Show RustDesk", ""),
|
||||||
("This PC", ""),
|
("This PC", ""),
|
||||||
("or", ""),
|
("or", ""),
|
||||||
|
("Continue with", ""),
|
||||||
("Elevate", ""),
|
("Elevate", ""),
|
||||||
("Zoom cursor", ""),
|
("Zoom cursor", ""),
|
||||||
("Accept sessions via password", ""),
|
("Accept sessions via password", ""),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", ""),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Exibir RustDesk"),
|
("Show RustDesk", "Exibir RustDesk"),
|
||||||
("This PC", "Este Computador"),
|
("This PC", "Este Computador"),
|
||||||
("or", "ou"),
|
("or", "ou"),
|
||||||
|
("Continue with", "Continuar com"),
|
||||||
("Elevate", "Elevar"),
|
("Elevate", "Elevar"),
|
||||||
("Zoom cursor", "Aumentar cursor"),
|
("Zoom cursor", "Aumentar cursor"),
|
||||||
("Accept sessions via password", "Aceitar sessões via senha"),
|
("Accept sessions via password", "Aceitar sessões via senha"),
|
||||||
@@ -673,21 +674,21 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("dont-show-again-tip", "Não mostrar novamente"),
|
("dont-show-again-tip", "Não mostrar novamente"),
|
||||||
("Take screenshot", "Capturar de tela"),
|
("Take screenshot", "Capturar de tela"),
|
||||||
("Taking screenshot", "Capturando tela"),
|
("Taking screenshot", "Capturando tela"),
|
||||||
("screenshot-merged-screen-not-supported-tip", "Mesclar a captura de tela de múltiplos monitores não é suportada no momento. Por favor, alterne para um único monitor e tente novamente."),
|
("screenshot-merged-screen-not-supported-tip", ""),
|
||||||
("screenshot-action-tip", "Por favor, selecione como seguir com a captura de tela."),
|
("screenshot-action-tip", ""),
|
||||||
("Save as", "Salvar como"),
|
("Save as", "Salvar como"),
|
||||||
("Copy to clipboard", "Copiar para área de transferência"),
|
("Copy to clipboard", "Copiar para área de transferência"),
|
||||||
("Enable remote printer", "Habilitar impressora remota"),
|
("Enable remote printer", "Habilitar impressora remota"),
|
||||||
("Downloading {}", "Baixando {}"),
|
("Downloading {}", ""),
|
||||||
("{} Update", "Atualização do {}"),
|
("{} Update", ""),
|
||||||
("{}-to-update-tip", "{} será fechado agora para instalar a nova versão."),
|
("{}-to-update-tip", ""),
|
||||||
("download-new-version-failed-tip", "Falha no download. Você pode tentar novamente ou clicar no botão \"Download\" para baixar da página releases e atualizar manualmente."),
|
("download-new-version-failed-tip", "Falha no download. Você pode tentar novamente ou clicar no botão \"Download\" para baixar da página releases e atualizar manualmente."),
|
||||||
("Auto update", "Atualização automática"),
|
("Auto update", "Atualização automática"),
|
||||||
("update-failed-check-msi-tip", "Falha na verificação do método de instalação. Clique no botão \"Download\" para baixar da página releases e atualizar manualmente."),
|
("update-failed-check-msi-tip", "Falha na verificação do método de instalação. Clique no botão \"Download\" para baixar da página releases e atualizar manualmente."),
|
||||||
("websocket_tip", "Usando WebSocket, apenas conexões via relay são suportadas."),
|
("websocket_tip", "Usando WebSocket, apenas conexões via relay são suportadas."),
|
||||||
("Use WebSocket", "Usar WebSocket"),
|
("Use WebSocket", "Usar WebSocket"),
|
||||||
("Trackpad speed", "Velocidade do trackpad"),
|
("Trackpad speed", "Velocidade do trackpad"),
|
||||||
("Default trackpad speed", "Velocidade padrão do trackpad"),
|
("Default trackpad speed", ""),
|
||||||
("Numeric one-time password", "Senha numérica de uso único"),
|
("Numeric one-time password", "Senha numérica de uso único"),
|
||||||
("Enable IPv6 P2P connection", "Habilitar conexão IPv6 P2P"),
|
("Enable IPv6 P2P connection", "Habilitar conexão IPv6 P2P"),
|
||||||
("Enable UDP hole punching", "Habilitar UDP hole punching"),
|
("Enable UDP hole punching", "Habilitar UDP hole punching"),
|
||||||
@@ -717,11 +718,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Virtual mouse size", "Tamanho do mouse virtual"),
|
("Virtual mouse size", "Tamanho do mouse virtual"),
|
||||||
("Small", "Pequeno"),
|
("Small", "Pequeno"),
|
||||||
("Large", "Grande"),
|
("Large", "Grande"),
|
||||||
("Show virtual joystick", "Mostrar joystick virtual"),
|
("Show virtual joystick", ""),
|
||||||
("Edit note", "Editar nota"),
|
("Edit note", "Editar nota"),
|
||||||
("Alias", "Apelido"),
|
("Alias", "Apelido"),
|
||||||
("ScrollEdge", "Rolagem nas bordas"),
|
("ScrollEdge", "Rolagem nas bordas"),
|
||||||
("Allow insecure TLS fallback", "Permitir fallback TLS inseguro"),
|
("Allow insecure TLS fallback", ""),
|
||||||
("allow-insecure-tls-fallback-tip", "Por padrão, o RustDesk verifica o certificado do servidor para protocolos que usam TLS.\nCom esta opção habilitada, o RustDesk ignorará a verificação e prosseguirá em caso de falha."),
|
("allow-insecure-tls-fallback-tip", "Por padrão, o RustDesk verifica o certificado do servidor para protocolos que usam TLS.\nCom esta opção habilitada, o RustDesk ignorará a verificação e prosseguirá em caso de falha."),
|
||||||
("Disable UDP", "Desabilitar UDP"),
|
("Disable UDP", "Desabilitar UDP"),
|
||||||
("disable-udp-tip", "Controla se deve usar somente TCP.\nCom esta opção habilitada, o RustDesk não usará mais UDP 21116, TCP 21116 será usado no lugar."),
|
("disable-udp-tip", "Controla se deve usar somente TCP.\nCom esta opção habilitada, o RustDesk não usará mais UDP 21116, TCP 21116 será usado no lugar."),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", "Registro de alterações"),
|
("Changelog", "Registro de alterações"),
|
||||||
("keep-awake-during-outgoing-sessions-label", "Manter tela ativa durante sessões de saída"),
|
("keep-awake-during-outgoing-sessions-label", "Manter tela ativa durante sessões de saída"),
|
||||||
("keep-awake-during-incoming-sessions-label", "Manter tela ativa durante sessões de entrada"),
|
("keep-awake-during-incoming-sessions-label", "Manter tela ativa durante sessões de entrada"),
|
||||||
("Continue with {}", "Continuar com {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Afișează RustDesk"),
|
("Show RustDesk", "Afișează RustDesk"),
|
||||||
("This PC", "Acest PC"),
|
("This PC", "Acest PC"),
|
||||||
("or", "sau"),
|
("or", "sau"),
|
||||||
|
("Continue with", "Continuă cu"),
|
||||||
("Elevate", "Sporește privilegii"),
|
("Elevate", "Sporește privilegii"),
|
||||||
("Zoom cursor", "Cursor lupă"),
|
("Zoom cursor", "Cursor lupă"),
|
||||||
("Accept sessions via password", "Acceptă începerea sesiunii folosind parola"),
|
("Accept sessions via password", "Acceptă începerea sesiunii folosind parola"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Continuă cu {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Показать RustDesk"),
|
("Show RustDesk", "Показать RustDesk"),
|
||||||
("This PC", "Этот компьютер"),
|
("This PC", "Этот компьютер"),
|
||||||
("or", "или"),
|
("or", "или"),
|
||||||
|
("Continue with", "Продолжить с"),
|
||||||
("Elevate", "Повысить"),
|
("Elevate", "Повысить"),
|
||||||
("Zoom cursor", "Масштабировать курсор"),
|
("Zoom cursor", "Масштабировать курсор"),
|
||||||
("Accept sessions via password", "Принимать сеансы по паролю"),
|
("Accept sessions via password", "Принимать сеансы по паролю"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", "Журнал изменений"),
|
("Changelog", "Журнал изменений"),
|
||||||
("keep-awake-during-outgoing-sessions-label", "Не отключать экран во время исходящих сеансов"),
|
("keep-awake-during-outgoing-sessions-label", "Не отключать экран во время исходящих сеансов"),
|
||||||
("keep-awake-during-incoming-sessions-label", "Не отключать экран во время входящих сеансов"),
|
("keep-awake-during-incoming-sessions-label", "Не отключать экран во время входящих сеансов"),
|
||||||
("Continue with {}", "Продолжить с {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Mustra RustDesk"),
|
("Show RustDesk", "Mustra RustDesk"),
|
||||||
("This PC", "Custu PC"),
|
("This PC", "Custu PC"),
|
||||||
("or", "O"),
|
("or", "O"),
|
||||||
|
("Continue with", "Sighi cun"),
|
||||||
("Elevate", "Cresche"),
|
("Elevate", "Cresche"),
|
||||||
("Zoom cursor", "Cursore de ismanniamentu"),
|
("Zoom cursor", "Cursore de ismanniamentu"),
|
||||||
("Accept sessions via password", "Atzeta sessiones cun sa crae"),
|
("Accept sessions via password", "Atzeta sessiones cun sa crae"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Sighi cun {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Zobraziť RustDesk"),
|
("Show RustDesk", "Zobraziť RustDesk"),
|
||||||
("This PC", "Tento počítač"),
|
("This PC", "Tento počítač"),
|
||||||
("or", "alebo"),
|
("or", "alebo"),
|
||||||
|
("Continue with", "Pokračovať s"),
|
||||||
("Elevate", "Zvýšiť"),
|
("Elevate", "Zvýšiť"),
|
||||||
("Zoom cursor", "Kurzor priblíženia"),
|
("Zoom cursor", "Kurzor priblíženia"),
|
||||||
("Accept sessions via password", "Prijímanie relácií pomocou hesla"),
|
("Accept sessions via password", "Prijímanie relácií pomocou hesla"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Pokračovať s {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Prikaži RustDesk"),
|
("Show RustDesk", "Prikaži RustDesk"),
|
||||||
("This PC", "Ta računalnik"),
|
("This PC", "Ta računalnik"),
|
||||||
("or", "ali"),
|
("or", "ali"),
|
||||||
|
("Continue with", "Nadaljuj z"),
|
||||||
("Elevate", "Povzdig pravic"),
|
("Elevate", "Povzdig pravic"),
|
||||||
("Zoom cursor", "Prilagodi velikost miškinega kazalca"),
|
("Zoom cursor", "Prilagodi velikost miškinega kazalca"),
|
||||||
("Accept sessions via password", "Sprejmi seje z geslom"),
|
("Accept sessions via password", "Sprejmi seje z geslom"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Nadaljuj z {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Shfaq RustDesk"),
|
("Show RustDesk", "Shfaq RustDesk"),
|
||||||
("This PC", "Ky PC"),
|
("This PC", "Ky PC"),
|
||||||
("or", "ose"),
|
("or", "ose"),
|
||||||
|
("Continue with", "Vazhdo me"),
|
||||||
("Elevate", "Ngritja"),
|
("Elevate", "Ngritja"),
|
||||||
("Zoom cursor", "Zmadho kursorin"),
|
("Zoom cursor", "Zmadho kursorin"),
|
||||||
("Accept sessions via password", "Prano sesionin nëpërmjet fjalëkalimit"),
|
("Accept sessions via password", "Prano sesionin nëpërmjet fjalëkalimit"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Vazhdo me {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Prikazi RustDesk"),
|
("Show RustDesk", "Prikazi RustDesk"),
|
||||||
("This PC", "Ovaj PC"),
|
("This PC", "Ovaj PC"),
|
||||||
("or", "ili"),
|
("or", "ili"),
|
||||||
|
("Continue with", "Nastavi sa"),
|
||||||
("Elevate", "Izdigni"),
|
("Elevate", "Izdigni"),
|
||||||
("Zoom cursor", "Zumiraj kursor"),
|
("Zoom cursor", "Zumiraj kursor"),
|
||||||
("Accept sessions via password", "Prihvati sesije preko lozinke"),
|
("Accept sessions via password", "Prihvati sesije preko lozinke"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Nastavi sa {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Visa RustDesk"),
|
("Show RustDesk", "Visa RustDesk"),
|
||||||
("This PC", "Denna dator"),
|
("This PC", "Denna dator"),
|
||||||
("or", "eller"),
|
("or", "eller"),
|
||||||
|
("Continue with", "Fortsätt med"),
|
||||||
("Elevate", "Höj upp"),
|
("Elevate", "Höj upp"),
|
||||||
("Zoom cursor", "Zoom"),
|
("Zoom cursor", "Zoom"),
|
||||||
("Accept sessions via password", "Acceptera sessioner via lösenord"),
|
("Accept sessions via password", "Acceptera sessioner via lösenord"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Fortsätt med {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "RustDesk ஐ காட்டு"),
|
("Show RustDesk", "RustDesk ஐ காட்டு"),
|
||||||
("This PC", "இந்த PC"),
|
("This PC", "இந்த PC"),
|
||||||
("or", "அல்லது"),
|
("or", "அல்லது"),
|
||||||
|
("Continue with", "உடன் தொடர்"),
|
||||||
("Elevate", "உயர்த்து"),
|
("Elevate", "உயர்த்து"),
|
||||||
("Zoom cursor", "கர்சரை பெரிதாக்கு"),
|
("Zoom cursor", "கர்சரை பெரிதாக்கு"),
|
||||||
("Accept sessions via password", "கடவுச்சொல் வழியாக அமர்வுகளை ஏற்று"),
|
("Accept sessions via password", "கடவுச்சொல் வழியாக அமர்வுகளை ஏற்று"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "{} உடன் தொடர்"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", ""),
|
("Show RustDesk", ""),
|
||||||
("This PC", ""),
|
("This PC", ""),
|
||||||
("or", ""),
|
("or", ""),
|
||||||
|
("Continue with", ""),
|
||||||
("Elevate", ""),
|
("Elevate", ""),
|
||||||
("Zoom cursor", ""),
|
("Zoom cursor", ""),
|
||||||
("Accept sessions via password", ""),
|
("Accept sessions via password", ""),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", ""),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "แสดง RustDesk"),
|
("Show RustDesk", "แสดง RustDesk"),
|
||||||
("This PC", "พีซีเครื่องนี้"),
|
("This PC", "พีซีเครื่องนี้"),
|
||||||
("or", "หรือ"),
|
("or", "หรือ"),
|
||||||
|
("Continue with", "ทำต่อด้วย"),
|
||||||
("Elevate", "ยกระดับ"),
|
("Elevate", "ยกระดับ"),
|
||||||
("Zoom cursor", "ขยายเคอร์เซอร์"),
|
("Zoom cursor", "ขยายเคอร์เซอร์"),
|
||||||
("Accept sessions via password", "ยอมรับการเชื่อมต่อด้วยรหัสผ่าน"),
|
("Accept sessions via password", "ยอมรับการเชื่อมต่อด้วยรหัสผ่าน"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "ทำต่อด้วย {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
132
src/lang/tr.rs
132
src/lang/tr.rs
@@ -3,8 +3,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
[
|
[
|
||||||
("Status", "Durum"),
|
("Status", "Durum"),
|
||||||
("Your Desktop", "Sizin Masaüstünüz"),
|
("Your Desktop", "Sizin Masaüstünüz"),
|
||||||
("desk_tip", "Masaüstünüze bu ID ve parola ile erişilebilir"),
|
("desk_tip", "Masaüstünüze bu ID ve şifre ile erişilebilir"),
|
||||||
("Password", "Parola"),
|
("Password", "Şifre"),
|
||||||
("Ready", "Hazır"),
|
("Ready", "Hazır"),
|
||||||
("Established", "Bağlantı sağlandı"),
|
("Established", "Bağlantı sağlandı"),
|
||||||
("connecting_status", "Bağlanılıyor "),
|
("connecting_status", "Bağlanılıyor "),
|
||||||
@@ -13,16 +13,16 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Service is running", "Servis çalışıyor"),
|
("Service is running", "Servis çalışıyor"),
|
||||||
("Service is not running", "Servis çalışmıyor"),
|
("Service is not running", "Servis çalışmıyor"),
|
||||||
("not_ready_status", "Hazır değil. Bağlantınızı kontrol edin"),
|
("not_ready_status", "Hazır değil. Bağlantınızı kontrol edin"),
|
||||||
("Control Remote Desktop", "Uzak Masaüstünü Denetle"),
|
("Control Remote Desktop", "Bağlanılacak Uzak Bağlantı ID"),
|
||||||
("Transfer file", "Dosya transferi"),
|
("Transfer file", "Dosya transferi"),
|
||||||
("Connect", "Bağlan"),
|
("Connect", "Bağlan"),
|
||||||
("Recent sessions", "Son oturumlar"),
|
("Recent sessions", "Son Bağlanılanlar"),
|
||||||
("Address book", "Adres Defteri"),
|
("Address book", "Adres Defteri"),
|
||||||
("Confirmation", "Onayla"),
|
("Confirmation", "Onayla"),
|
||||||
("TCP tunneling", "TCP tünelleri"),
|
("TCP tunneling", "TCP Tünelleri"),
|
||||||
("Remove", "Kaldır"),
|
("Remove", "Kaldır"),
|
||||||
("Refresh random password", "Yeni rastgele parola oluştur"),
|
("Refresh random password", "Yeni rastgele şifre oluştur"),
|
||||||
("Set your own password", "Kendi parolanı oluştur"),
|
("Set your own password", "Kendi şifreni oluştur"),
|
||||||
("Enable keyboard/mouse", "Klavye ve Fareye izin ver"),
|
("Enable keyboard/mouse", "Klavye ve Fareye izin ver"),
|
||||||
("Enable clipboard", "Kopyalanan geçici veriye izin ver"),
|
("Enable clipboard", "Kopyalanan geçici veriye izin ver"),
|
||||||
("Enable file transfer", "Dosya Transferine izin ver"),
|
("Enable file transfer", "Dosya Transferine izin ver"),
|
||||||
@@ -47,9 +47,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Slogan_tip", "Bu kaotik dünyada gönülden yapıldı!"),
|
("Slogan_tip", "Bu kaotik dünyada gönülden yapıldı!"),
|
||||||
("Privacy Statement", "Gizlilik Beyanı"),
|
("Privacy Statement", "Gizlilik Beyanı"),
|
||||||
("Mute", "Sustur"),
|
("Mute", "Sustur"),
|
||||||
("Build Date", "Derleme Tarihi"),
|
("Build Date", "Yapım Tarihi"),
|
||||||
("Version", "Sürüm"),
|
("Version", "Sürüm"),
|
||||||
("Home", "Ana Sayfa"),
|
("Home", "Anasayfa"),
|
||||||
("Audio Input", "Ses Girişi"),
|
("Audio Input", "Ses Girişi"),
|
||||||
("Enhancements", "Geliştirmeler"),
|
("Enhancements", "Geliştirmeler"),
|
||||||
("Hardware Codec", "Donanımsal Codec"),
|
("Hardware Codec", "Donanımsal Codec"),
|
||||||
@@ -64,18 +64,18 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Not available", "Erişilebilir değil"),
|
("Not available", "Erişilebilir değil"),
|
||||||
("Too frequent", "Çok sık"),
|
("Too frequent", "Çok sık"),
|
||||||
("Cancel", "İptal"),
|
("Cancel", "İptal"),
|
||||||
("Skip", "Atla"),
|
("Skip", "Geç"),
|
||||||
("Close", "Kapat"),
|
("Close", "Kapat"),
|
||||||
("Retry", "Tekrar Dene"),
|
("Retry", "Tekrar Dene"),
|
||||||
("OK", "Tamam"),
|
("OK", "Tamam"),
|
||||||
("Password Required", "Parola Gerekli"),
|
("Password Required", "Şifre Gerekli"),
|
||||||
("Please enter your password", "Lütfen parolanızı giriniz"),
|
("Please enter your password", "Lütfen şifrenizi giriniz"),
|
||||||
("Remember password", "Parolayı hatırla"),
|
("Remember password", "Şifreyi hatırla"),
|
||||||
("Wrong Password", "Hatalı parola"),
|
("Wrong Password", "Hatalı şifre"),
|
||||||
("Do you want to enter again?", "Tekrar giriş yapmak ister misiniz?"),
|
("Do you want to enter again?", "Tekrar giriş yapmak ister misiniz?"),
|
||||||
("Connection Error", "Bağlantı Hatası"),
|
("Connection Error", "Bağlantı Hatası"),
|
||||||
("Error", "Hata"),
|
("Error", "Hata"),
|
||||||
("Reset by the peer", "Eş tarafından sıfırlandı"),
|
("Reset by the peer", "Eş tarafında sıfırla"),
|
||||||
("Connecting...", "Bağlanılıyor..."),
|
("Connecting...", "Bağlanılıyor..."),
|
||||||
("Connection in progress. Please wait.", "Bağlantı sağlanıyor. Lütfen bekleyiniz."),
|
("Connection in progress. Please wait.", "Bağlantı sağlanıyor. Lütfen bekleyiniz."),
|
||||||
("Please try 1 minute later", "Lütfen 1 dakika sonra tekrar deneyiniz"),
|
("Please try 1 minute later", "Lütfen 1 dakika sonra tekrar deneyiniz"),
|
||||||
@@ -141,10 +141,10 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Timeout", "Zaman aşımı"),
|
("Timeout", "Zaman aşımı"),
|
||||||
("Failed to connect to relay server", "Relay sunucusuna bağlanılamadı"),
|
("Failed to connect to relay server", "Relay sunucusuna bağlanılamadı"),
|
||||||
("Failed to connect via rendezvous server", "ID oluşturma sunucusuna bağlanılamadı"),
|
("Failed to connect via rendezvous server", "ID oluşturma sunucusuna bağlanılamadı"),
|
||||||
("Failed to connect via relay server", "Aktarma sunucusuna bağlanılamadı"),
|
("Failed to connect via relay server", "Relay oluşturma sunucusuna bağlanılamadı"),
|
||||||
("Failed to make direct connection to remote desktop", "Uzak masaüstüne doğrudan bağlantı kurulamadı"),
|
("Failed to make direct connection to remote desktop", "Uzak masaüstüne doğrudan bağlantı kurulamadı"),
|
||||||
("Set Password", "Parola ayarla"),
|
("Set Password", "Şifre ayarla"),
|
||||||
("OS Password", "İşletim Sistemi Parolası"),
|
("OS Password", "İşletim Sistemi Şifresi"),
|
||||||
("install_tip", "Kullanıcı Hesabı Denetimi nedeniyle, RustDesk bir uzak masaüstü olarak düzgün çalışmayabilir. Bu sorunu önlemek için, RustDesk'i sistem seviyesinde kurmak için aşağıdaki butona tıklayın."),
|
("install_tip", "Kullanıcı Hesabı Denetimi nedeniyle, RustDesk bir uzak masaüstü olarak düzgün çalışmayabilir. Bu sorunu önlemek için, RustDesk'i sistem seviyesinde kurmak için aşağıdaki butona tıklayın."),
|
||||||
("Click to upgrade", "Yükseltmek için tıklayınız"),
|
("Click to upgrade", "Yükseltmek için tıklayınız"),
|
||||||
("Configure", "Ayarla"),
|
("Configure", "Ayarla"),
|
||||||
@@ -184,7 +184,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Direct and unencrypted connection", "Doğrudan ve şifrelenmemiş bağlantı"),
|
("Direct and unencrypted connection", "Doğrudan ve şifrelenmemiş bağlantı"),
|
||||||
("Relayed and unencrypted connection", "Aktarmalı ve şifrelenmemiş bağlantı"),
|
("Relayed and unencrypted connection", "Aktarmalı ve şifrelenmemiş bağlantı"),
|
||||||
("Enter Remote ID", "Uzak ID'yi Girin"),
|
("Enter Remote ID", "Uzak ID'yi Girin"),
|
||||||
("Enter your password", "Parolanızı girin"),
|
("Enter your password", "Şifrenizi girin"),
|
||||||
("Logging in...", "Giriş yapılıyor..."),
|
("Logging in...", "Giriş yapılıyor..."),
|
||||||
("Enable RDP session sharing", "RDP oturum paylaşımını etkinleştir"),
|
("Enable RDP session sharing", "RDP oturum paylaşımını etkinleştir"),
|
||||||
("Auto Login", "Otomatik giriş"),
|
("Auto Login", "Otomatik giriş"),
|
||||||
@@ -208,8 +208,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Closed manually by the peer", "Eş tarafından manuel olarak kapatıldı"),
|
("Closed manually by the peer", "Eş tarafından manuel olarak kapatıldı"),
|
||||||
("Enable remote configuration modification", "Uzaktan yapılandırma değişikliğini etkinleştir"),
|
("Enable remote configuration modification", "Uzaktan yapılandırma değişikliğini etkinleştir"),
|
||||||
("Run without install", "Yüklemeden çalıştır"),
|
("Run without install", "Yüklemeden çalıştır"),
|
||||||
("Connect via relay", "Aktarmalı üzerinden bağlan"),
|
("Connect via relay", ""),
|
||||||
("Always connect via relay", "Her zaman aktarmalı üzerinden bağlan"),
|
("Always connect via relay", "Always connect via relay"),
|
||||||
("whitelist_tip", "Bu masaüstüne yalnızca yetkili IP adresleri bağlanabilir"),
|
("whitelist_tip", "Bu masaüstüne yalnızca yetkili IP adresleri bağlanabilir"),
|
||||||
("Login", "Giriş yap"),
|
("Login", "Giriş yap"),
|
||||||
("Verify", "Doğrula"),
|
("Verify", "Doğrula"),
|
||||||
@@ -226,11 +226,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Unselect all tags", "Tüm etiketlerin seçimini kaldır"),
|
("Unselect all tags", "Tüm etiketlerin seçimini kaldır"),
|
||||||
("Network error", "Bağlantı hatası"),
|
("Network error", "Bağlantı hatası"),
|
||||||
("Username missed", "Kullanıcı adı boş"),
|
("Username missed", "Kullanıcı adı boş"),
|
||||||
("Password missed", "Parola boş"),
|
("Password missed", "Şifre boş"),
|
||||||
("Wrong credentials", "Yanlış kimlik bilgileri"),
|
("Wrong credentials", "Yanlış kimlik bilgileri"),
|
||||||
("The verification code is incorrect or has expired", "Doğrulama kodu hatalı veya süresi dolmuş"),
|
("The verification code is incorrect or has expired", "Doğrulama kodu hatalı veya süresi dolmuş"),
|
||||||
("Edit Tag", "Etiketi düzenle"),
|
("Edit Tag", "Etiketi düzenle"),
|
||||||
("Forget Password", "Parolayı Unut"),
|
("Forget Password", "Şifreyi Unut"),
|
||||||
("Favorites", "Favoriler"),
|
("Favorites", "Favoriler"),
|
||||||
("Add to Favorites", "Favorilere ekle"),
|
("Add to Favorites", "Favorilere ekle"),
|
||||||
("Remove from Favorites", "Favorilerden çıkar"),
|
("Remove from Favorites", "Favorilerden çıkar"),
|
||||||
@@ -268,9 +268,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Share screen", "Ekranı Paylaş"),
|
("Share screen", "Ekranı Paylaş"),
|
||||||
("Chat", "Mesajlaş"),
|
("Chat", "Mesajlaş"),
|
||||||
("Total", "Toplam"),
|
("Total", "Toplam"),
|
||||||
("items", "ögeler"),
|
("items", "öğeler"),
|
||||||
("Selected", "Seçildi"),
|
("Selected", "Seçildi"),
|
||||||
("Screen Capture", "Ekran Görüntüsü"),
|
("Screen Capture", "Ekran görüntüsü"),
|
||||||
("Input Control", "Giriş Kontrolü"),
|
("Input Control", "Giriş Kontrolü"),
|
||||||
("Audio Capture", "Ses Yakalama"),
|
("Audio Capture", "Ses Yakalama"),
|
||||||
("Do you accept?", "Kabul ediyor musun?"),
|
("Do you accept?", "Kabul ediyor musun?"),
|
||||||
@@ -285,7 +285,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("android_start_service_tip", "Ekran paylaşım hizmetini başlatmak için [Hizmeti başlat] ögesine dokunun veya [Ekran Görüntüsü] iznini etkinleştirin."),
|
("android_start_service_tip", "Ekran paylaşım hizmetini başlatmak için [Hizmeti başlat] ögesine dokunun veya [Ekran Görüntüsü] iznini etkinleştirin."),
|
||||||
("android_permission_may_not_change_tip", "Kurulan bağlantılara ait izinler, yeniden bağlantı kurulana kadar anında değiştirilemez."),
|
("android_permission_may_not_change_tip", "Kurulan bağlantılara ait izinler, yeniden bağlantı kurulana kadar anında değiştirilemez."),
|
||||||
("Account", "Hesap"),
|
("Account", "Hesap"),
|
||||||
("Overwrite", "Üzerine yaz"),
|
("Overwrite", "üzerine yaz"),
|
||||||
("This file exists, skip or overwrite this file?", "Bu dosya var, bu dosya atlansın veya üzerine yazılsın mı?"),
|
("This file exists, skip or overwrite this file?", "Bu dosya var, bu dosya atlansın veya üzerine yazılsın mı?"),
|
||||||
("Quit", "Çıkış"),
|
("Quit", "Çıkış"),
|
||||||
("Help", "Yardım"),
|
("Help", "Yardım"),
|
||||||
@@ -295,8 +295,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Unsupported", "desteklenmiyor"),
|
("Unsupported", "desteklenmiyor"),
|
||||||
("Peer denied", "eş reddedildi"),
|
("Peer denied", "eş reddedildi"),
|
||||||
("Please install plugins", "Lütfen eklentileri yükleyin"),
|
("Please install plugins", "Lütfen eklentileri yükleyin"),
|
||||||
("Peer exit", "Eş çıkışı"),
|
("Peer exit", "eş çıkışı"),
|
||||||
("Failed to turn off", "Kapatılamadı"),
|
("Failed to turn off", "kapatılamadı"),
|
||||||
("Turned off", "Kapatıldı"),
|
("Turned off", "Kapatıldı"),
|
||||||
("Language", "Dil"),
|
("Language", "Dil"),
|
||||||
("Keep RustDesk background service", "RustDesk arka plan hizmetini sürdürün"),
|
("Keep RustDesk background service", "RustDesk arka plan hizmetini sürdürün"),
|
||||||
@@ -308,32 +308,32 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", "Eski mod"),
|
("Legacy mode", "Eski mod"),
|
||||||
("Map mode", "Haritalama modu"),
|
("Map mode", "Haritalama modu"),
|
||||||
("Translate mode", "Çeviri modu"),
|
("Translate mode", "Çeviri modu"),
|
||||||
("Use permanent password", "Kalıcı parola kullan"),
|
("Use permanent password", "Kalıcı şifre kullan"),
|
||||||
("Use both passwords", "İki parolayı da kullan"),
|
("Use both passwords", "İki şifreyi de kullan"),
|
||||||
("Set permanent password", "Kalıcı parola oluştur"),
|
("Set permanent password", "Kalıcı şifre oluştur"),
|
||||||
("Enable remote restart", "Uzaktan yeniden başlatmayı aktif et"),
|
("Enable remote restart", "Uzaktan yeniden başlatmayı aktif et"),
|
||||||
("Restart remote device", "Uzaktaki cihazı yeniden başlat"),
|
("Restart remote device", "Uzaktaki cihazı yeniden başlat"),
|
||||||
("Are you sure you want to restart", "Yeniden başlatmak istediğine emin misin?"),
|
("Are you sure you want to restart", "Yeniden başlatmak istediğinize emin misin?"),
|
||||||
("Restarting remote device", "Uzaktan yeniden başlatılıyor"),
|
("Restarting remote device", "Uzaktan yeniden başlatılıyor"),
|
||||||
("remote_restarting_tip", "Uzak cihaz yeniden başlatılıyor, lütfen bu mesaj kutusunu kapatın ve bir süre sonra kalıcı parola ile yeniden bağlanın"),
|
("remote_restarting_tip", "Uzak cihaz yeniden başlatılıyor, lütfen bu mesaj kutusunu kapatın ve bir süre sonra kalıcı şifre ile yeniden bağlanın"),
|
||||||
("Copied", "Kopyalandı"),
|
("Copied", "Kopyalandı"),
|
||||||
("Exit Fullscreen", "Tam Ekrandan Çık"),
|
("Exit Fullscreen", "Tam ekrandan çık"),
|
||||||
("Fullscreen", "Tam Ekran"),
|
("Fullscreen", "Tam ekran"),
|
||||||
("Mobile Actions", "Mobil İşlemler"),
|
("Mobile Actions", "Mobil İşlemler"),
|
||||||
("Select Monitor", "Monitörü Seç"),
|
("Select Monitor", "Monitörü Seç"),
|
||||||
("Control Actions", "Kontrol Eylemleri"),
|
("Control Actions", "Kontrol Eylemleri"),
|
||||||
("Display Settings", "Görüntü Ayarları"),
|
("Display Settings", "Görüntü ayarları"),
|
||||||
("Ratio", "Oran"),
|
("Ratio", "Oran"),
|
||||||
("Image Quality", "Görüntü Kalitesi"),
|
("Image Quality", "Görüntü kalitesi"),
|
||||||
("Scroll Style", "Kaydırma Stili"),
|
("Scroll Style", "Kaydırma Stili"),
|
||||||
("Show Toolbar", "Araç Çubuğunu Göster"),
|
("Show Toolbar", "Araç Çubuğunu Göster"),
|
||||||
("Hide Toolbar", "Araç Çubuğunu Gizle"),
|
("Hide Toolbar", "Araç Çubuğunu Gizle"),
|
||||||
("Direct Connection", "Doğrudan Bağlantı"),
|
("Direct Connection", "Doğrudan Bağlantı"),
|
||||||
("Relay Connection", "Aktarmalı Bağlantı"),
|
("Relay Connection", "Röle Bağlantısı"),
|
||||||
("Secure Connection", "Güvenli Bağlantı"),
|
("Secure Connection", "Güvenli Bağlantı"),
|
||||||
("Insecure Connection", "Güvenli Olmayan Bağlantı"),
|
("Insecure Connection", "Güvenli Olmayan Bağlantı"),
|
||||||
("Scale original", "Orijinal ölçekte"),
|
("Scale original", "Orijinali ölçeklendir"),
|
||||||
("Scale adaptive", "Uyarlanabilir ölçekte"),
|
("Scale adaptive", "Ölçek uyarlanabilir"),
|
||||||
("General", "Genel"),
|
("General", "Genel"),
|
||||||
("Security", "Güvenlik"),
|
("Security", "Güvenlik"),
|
||||||
("Theme", "Tema"),
|
("Theme", "Tema"),
|
||||||
@@ -347,18 +347,18 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable audio", "Sesi Aktif Et"),
|
("Enable audio", "Sesi Aktif Et"),
|
||||||
("Unlock Network Settings", "Ağ Ayarlarını Aç"),
|
("Unlock Network Settings", "Ağ Ayarlarını Aç"),
|
||||||
("Server", "Sunucu"),
|
("Server", "Sunucu"),
|
||||||
("Direct IP Access", "Doğrudan IP Erişimi"),
|
("Direct IP Access", "Direk IP Erişimi"),
|
||||||
("Proxy", "Vekil"),
|
("Proxy", "Vekil"),
|
||||||
("Apply", "Uygula"),
|
("Apply", "Uygula"),
|
||||||
("Disconnect all devices?", "Tüm cihazların bağlantısı kesilsin mi?"),
|
("Disconnect all devices?", "Tüm cihazların bağlantısını kes?"),
|
||||||
("Clear", "Temizle"),
|
("Clear", "Temizle"),
|
||||||
("Audio Input Device", "Ses Giriş Aygıtı"),
|
("Audio Input Device", "Ses Giriş Aygıtı"),
|
||||||
("Use IP Whitelisting", "IP Beyaz Listeyi Kullan"),
|
("Use IP Whitelisting", "IP Beyaz Listeyi Kullan"),
|
||||||
("Network", "Ağ"),
|
("Network", "Ağ"),
|
||||||
("Pin Toolbar", "Araç Çubuğunu Sabitle"),
|
("Pin Toolbar", "Araç Çubuğunu Sabitle"),
|
||||||
("Unpin Toolbar", "Araç Çubuğunu Sabitlemeyi Kaldır"),
|
("Unpin Toolbar", "Araç Çubuğunu Sabitlemeyi Kaldır"),
|
||||||
("Recording", "Kaydediliyor"),
|
("Recording", "Kayıt Ediliyor"),
|
||||||
("Directory", "Dizin"),
|
("Directory", "Klasör"),
|
||||||
("Automatically record incoming sessions", "Gelen oturumları otomatik olarak kaydet"),
|
("Automatically record incoming sessions", "Gelen oturumları otomatik olarak kaydet"),
|
||||||
("Automatically record outgoing sessions", "Giden oturumları otomatik olarak kaydet"),
|
("Automatically record outgoing sessions", "Giden oturumları otomatik olarak kaydet"),
|
||||||
("Change", "Değiştir"),
|
("Change", "Değiştir"),
|
||||||
@@ -384,15 +384,16 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "RustDesk'i Göster"),
|
("Show RustDesk", "RustDesk'i Göster"),
|
||||||
("This PC", "Bu PC"),
|
("This PC", "Bu PC"),
|
||||||
("or", "veya"),
|
("or", "veya"),
|
||||||
|
("Continue with", "bununla devam et"),
|
||||||
("Elevate", "Yükseltme"),
|
("Elevate", "Yükseltme"),
|
||||||
("Zoom cursor", "Yakınlaştırma imleci"),
|
("Zoom cursor", "Yakınlaştırma imleci"),
|
||||||
("Accept sessions via password", "Oturumları parola ile kabul etme"),
|
("Accept sessions via password", "Oturumları parola ile kabul etme"),
|
||||||
("Accept sessions via click", "Tıklama yoluyla oturumları kabul edin"),
|
("Accept sessions via click", "Tıklama yoluyla oturumları kabul edin"),
|
||||||
("Accept sessions via both", "Her ikisi aracılığıyla oturumları kabul edin"),
|
("Accept sessions via both", "Her ikisi aracılığıyla oturumları kabul edin"),
|
||||||
("Please wait for the remote side to accept your session request...", "Lütfen uzak tarafın oturum isteğinizi kabul etmesini bekleyin..."),
|
("Please wait for the remote side to accept your session request...", "Lütfen uzak tarafın oturum isteğinizi kabul etmesini bekleyin..."),
|
||||||
("One-time Password", "Tek Kullanımlık Parola"),
|
("One-time Password", "Tek Kullanımlık Şifre"),
|
||||||
("Use one-time password", "Tek seferlik parola kullanın"),
|
("Use one-time password", "Tek seferlik parola kullanın"),
|
||||||
("One-time password length", "Tek seferlik parola uzunluğu"),
|
("One-time password length", "Tek seferlik şifre uzunluğu"),
|
||||||
("Request access to your device", "Cihazınıza erişim talep edin"),
|
("Request access to your device", "Cihazınıza erişim talep edin"),
|
||||||
("Hide connection management window", "Bağlantı yönetimi penceresini gizle"),
|
("Hide connection management window", "Bağlantı yönetimi penceresini gizle"),
|
||||||
("hide_cm_tip", "Oturumları yalnızca parola ile kabul edebilir ve kalıcı parola kullanıyorsanız gizlemeye izin verin"),
|
("hide_cm_tip", "Oturumları yalnızca parola ile kabul edebilir ve kalıcı parola kullanıyorsanız gizlemeye izin verin"),
|
||||||
@@ -441,7 +442,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Voice call", "Sesli görüşme"),
|
("Voice call", "Sesli görüşme"),
|
||||||
("Text chat", "Metin sohbeti"),
|
("Text chat", "Metin sohbeti"),
|
||||||
("Stop voice call", "Sesli görüşmeyi durdur"),
|
("Stop voice call", "Sesli görüşmeyi durdur"),
|
||||||
("relay_hint_tip", "Doğrudan bağlanmak mümkün olmayabilir; aktarmalı bağlanmayı deneyebilirsiniz. Ayrıca, ilk denemenizde aktarma sunucusu kullanmak istiyorsanız ID'nin sonuna \"/r\" ekleyebilir veya son oturum kartındaki \"Her Zaman Aktarmalı Üzerinden Bağlan\" seçeneğini seçebilirsiniz."),
|
("relay_hint_tip", "Doğrudan bağlanmak mümkün olmayabilir; röle aracılığıyla bağlanmayı deneyebilirsiniz. Ayrıca, ilk denemenizde bir röle kullanmak istiyorsanız, ID'nin sonuna \"/r\" ekleyebilir veya son oturum kartındaki \"Her Zaman Röle Üzerinden Bağlan\" seçeneğini seçebilirsiniz."),
|
||||||
("Reconnect", "Yeniden Bağlan"),
|
("Reconnect", "Yeniden Bağlan"),
|
||||||
("Codec", "Kodlayıcı"),
|
("Codec", "Kodlayıcı"),
|
||||||
("Resolution", "Çözünürlük"),
|
("Resolution", "Çözünürlük"),
|
||||||
@@ -476,7 +477,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("no_desktop_title_tip", "Masaüstü mevcut değil"),
|
("no_desktop_title_tip", "Masaüstü mevcut değil"),
|
||||||
("no_desktop_text_tip", "Lütfen GNOME masaüstünü yükleyin"),
|
("no_desktop_text_tip", "Lütfen GNOME masaüstünü yükleyin"),
|
||||||
("No need to elevate", "Yükseltmeye gerek yok"),
|
("No need to elevate", "Yükseltmeye gerek yok"),
|
||||||
("System Sound", "Sistem Sesi"),
|
("System Sound", "Sistem Ses"),
|
||||||
("Default", "Varsayılan"),
|
("Default", "Varsayılan"),
|
||||||
("New RDP", "Yeni RDP"),
|
("New RDP", "Yeni RDP"),
|
||||||
("Fingerprint", "Parmak İzi"),
|
("Fingerprint", "Parmak İzi"),
|
||||||
@@ -494,7 +495,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("resolution_fit_local_tip", "Yerel çözünürlüğe sığdır"),
|
("resolution_fit_local_tip", "Yerel çözünürlüğe sığdır"),
|
||||||
("resolution_custom_tip", "Özel çözünürlük"),
|
("resolution_custom_tip", "Özel çözünürlük"),
|
||||||
("Collapse toolbar", "Araç çubuğunu daralt"),
|
("Collapse toolbar", "Araç çubuğunu daralt"),
|
||||||
("Accept and Elevate", "Kabul Et ve Yükselt"),
|
("Accept and Elevate", "Kabul et ve yükselt"),
|
||||||
("accept_and_elevate_btn_tooltip", "Bağlantıyı kabul et ve UAC izinlerini yükselt."),
|
("accept_and_elevate_btn_tooltip", "Bağlantıyı kabul et ve UAC izinlerini yükselt."),
|
||||||
("clipboard_wait_response_timeout_tip", "Kopyalama yanıtı için zaman aşımına uğradı."),
|
("clipboard_wait_response_timeout_tip", "Kopyalama yanıtı için zaman aşımına uğradı."),
|
||||||
("Incoming connection", "Gelen bağlantı"),
|
("Incoming connection", "Gelen bağlantı"),
|
||||||
@@ -533,7 +534,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("scam_text1", "Eğer tanımadığınız ve güvenmediğiniz birisiyle telefonda konuşuyorsanız ve sizden RustDesk'i kullanmanızı ve hizmeti başlatmanızı istiyorsa devam etmeyin ve hemen telefonu kapatın."),
|
("scam_text1", "Eğer tanımadığınız ve güvenmediğiniz birisiyle telefonda konuşuyorsanız ve sizden RustDesk'i kullanmanızı ve hizmeti başlatmanızı istiyorsa devam etmeyin ve hemen telefonu kapatın."),
|
||||||
("scam_text2", "Muhtemelen paranızı veya diğer özel bilgilerinizi çalmaya çalışan dolandırıcılardır."),
|
("scam_text2", "Muhtemelen paranızı veya diğer özel bilgilerinizi çalmaya çalışan dolandırıcılardır."),
|
||||||
("Don't show again", "Bir daha gösterme"),
|
("Don't show again", "Bir daha gösterme"),
|
||||||
("I Agree", "Kabul Ediyorum"),
|
("I Agree", "Kabul ediyorum"),
|
||||||
("Decline", "Reddet"),
|
("Decline", "Reddet"),
|
||||||
("Timeout in minutes", "Zaman aşımı (dakika)"),
|
("Timeout in minutes", "Zaman aşımı (dakika)"),
|
||||||
("auto_disconnect_option_tip", "Kullanıcı etkin olmadığında gelen oturumları otomatik olarak kapat"),
|
("auto_disconnect_option_tip", "Kullanıcı etkin olmadığında gelen oturumları otomatik olarak kapat"),
|
||||||
@@ -558,7 +559,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Plug out all", "Tümünü çıkar"),
|
("Plug out all", "Tümünü çıkar"),
|
||||||
("True color (4:4:4)", "Gerçek renk (4:4:4)"),
|
("True color (4:4:4)", "Gerçek renk (4:4:4)"),
|
||||||
("Enable blocking user input", "Kullanıcı girişini engellemeyi etkinleştir"),
|
("Enable blocking user input", "Kullanıcı girişini engellemeyi etkinleştir"),
|
||||||
("id_input_tip", "Bir ID, doğrudan IP veya portlu bir etki alanı (<domain>:<port>) girebilirsiniz.\nBaşka bir sunucudaki bir cihaza erişmek istiyorsanız lütfen sunucu adresini (<id>@<server_address>?key=<key_value>) ekleyin, örneğin,\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nGenel bir sunucudaki bir cihaza erişmek istiyorsanız lütfen \"<id>@public\" girin, genel sunucu için anahtara gerek yoktur.\n\nİlk bağlantıda bir aktarma bağlantısının kullanılmasını zorlamak istiyorsanız ID'nin sonuna \"/r\" ekleyin, örneğin, \"9123456234/r\"."),
|
("id_input_tip", "Bir ID, doğrudan IP veya portlu bir etki alanı (<domain>:<port>) girebilirsiniz.\nBaşka bir sunucudaki bir cihaza erişmek istiyorsanız lütfen sunucu adresini (<id>@<server_address>?key=<key_value>) ekleyin, örneğin,\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nGenel bir sunucudaki bir cihaza erişmek istiyorsanız lütfen \"<id>@public\" girin, genel sunucu için anahtara gerek yoktur.\n\nİlk bağlantıda bir röle bağlantısının kullanılmasını zorlamak istiyorsanız ID'nin sonuna \"/r\" ekleyin, örneğin, \"9123456234/r\"."),
|
||||||
("privacy_mode_impl_mag_tip", "Mod 1"),
|
("privacy_mode_impl_mag_tip", "Mod 1"),
|
||||||
("privacy_mode_impl_virtual_display_tip", "Mod 2"),
|
("privacy_mode_impl_virtual_display_tip", "Mod 2"),
|
||||||
("Enter privacy mode", "Gizlilik moduna gir"),
|
("Enter privacy mode", "Gizlilik moduna gir"),
|
||||||
@@ -580,12 +581,12 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", "Lütfen bağlanmak istediğiniz oturumu seçin"),
|
("Please select the session you want to connect to", "Lütfen bağlanmak istediğiniz oturumu seçin"),
|
||||||
("powered_by_me", "RustDesk tarafından desteklenmektedir"),
|
("powered_by_me", "RustDesk tarafından desteklenmektedir"),
|
||||||
("outgoing_only_desk_tip", "Bu özelleştirilmiş bir sürümdür.\nDiğer cihazlara bağlanabilirsiniz, ancak diğer cihazlar cihazınıza bağlanamaz."),
|
("outgoing_only_desk_tip", "Bu özelleştirilmiş bir sürümdür.\nDiğer cihazlara bağlanabilirsiniz, ancak diğer cihazlar cihazınıza bağlanamaz."),
|
||||||
("preset_password_warning", "Bu özelleştirilmiş sürüm, önceden ayarlanmış bir parola ile birlikte gelir. Bu parolayı bilen herkes cihazınızın tam kontrolünü ele geçirebilir. Bunu beklemiyorsanız yazılımı hemen kaldırın."),
|
("preset_password_warning", "Bu özelleştirilmiş sürüm, önceden ayarlanmış bir şifre ile birlikte gelir. Bu parolayı bilen herkes cihazınızın tam kontrolünü ele geçirebilir. Bunu beklemiyorsanız yazılımı hemen kaldırın."),
|
||||||
("Security Alert", "Güvenlik Uyarısı"),
|
("Security Alert", "Güvenlik Uyarısı"),
|
||||||
("My address book", "Adres defterim"),
|
("My address book", "Adres defterim"),
|
||||||
("Personal", "Kişisel"),
|
("Personal", "Kişisel"),
|
||||||
("Owner", "Sahip"),
|
("Owner", "Sahip"),
|
||||||
("Set shared password", "Paylaşılan parolayı ayarla"),
|
("Set shared password", "Paylaşılan şifreyi ayarla"),
|
||||||
("Exist in", "İçinde varolan"),
|
("Exist in", "İçinde varolan"),
|
||||||
("Read-only", "Salt okunur"),
|
("Read-only", "Salt okunur"),
|
||||||
("Read/Write", "Okuma/Yazma"),
|
("Read/Write", "Okuma/Yazma"),
|
||||||
@@ -598,7 +599,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Follow remote cursor", "Uzak imleci takip et"),
|
("Follow remote cursor", "Uzak imleci takip et"),
|
||||||
("Follow remote window focus", "Uzak pencere odağını takip et"),
|
("Follow remote window focus", "Uzak pencere odağını takip et"),
|
||||||
("default_proxy_tip", "Varsayılan protokol ve port Socks5 ve 1080'dir."),
|
("default_proxy_tip", "Varsayılan protokol ve port Socks5 ve 1080'dir."),
|
||||||
("no_audio_input_device_tip", "Ses girişi aygıtı bulunamadı."),
|
("no_audio_input_device_tip", "Varsayılan protokol ve port, Socks5 ve 1080'dir"),
|
||||||
("Incoming", "Gelen"),
|
("Incoming", "Gelen"),
|
||||||
("Outgoing", "Giden"),
|
("Outgoing", "Giden"),
|
||||||
("Clear Wayland screen selection", "Wayland ekran seçimini temizle"),
|
("Clear Wayland screen selection", "Wayland ekran seçimini temizle"),
|
||||||
@@ -611,7 +612,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("floating_window_tip", "RustDesk arka plan hizmetini açık tutmaya yardımcı olur"),
|
("floating_window_tip", "RustDesk arka plan hizmetini açık tutmaya yardımcı olur"),
|
||||||
("Keep screen on", "Ekranı açık tut"),
|
("Keep screen on", "Ekranı açık tut"),
|
||||||
("Never", "Asla"),
|
("Never", "Asla"),
|
||||||
("During controlled", "Kontrol sırasında"),
|
("During controlled", "Kontrol sırasınd"),
|
||||||
("During service is on", "Servis açıkken"),
|
("During service is on", "Servis açıkken"),
|
||||||
("Capture screen using DirectX", "DirectX kullanarak ekran görüntüsü al"),
|
("Capture screen using DirectX", "DirectX kullanarak ekran görüntüsü al"),
|
||||||
("Back", "Geri"),
|
("Back", "Geri"),
|
||||||
@@ -619,7 +620,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Volume up", "Sesi yükselt"),
|
("Volume up", "Sesi yükselt"),
|
||||||
("Volume down", "Sesi azalt"),
|
("Volume down", "Sesi azalt"),
|
||||||
("Power", "Güç"),
|
("Power", "Güç"),
|
||||||
("Telegram bot", "Telegram botu"),
|
("Telegram bot", "Telegram bot"),
|
||||||
("enable-bot-tip", "Bu özelliği etkinleştirirseniz botunuzdan 2FA kodunu alabilirsiniz. Aynı zamanda bağlantı bildirimi işlevi de görebilir."),
|
("enable-bot-tip", "Bu özelliği etkinleştirirseniz botunuzdan 2FA kodunu alabilirsiniz. Aynı zamanda bağlantı bildirimi işlevi de görebilir."),
|
||||||
("enable-bot-desc", "1. @BotFather ile bir sohbet açın.\n2. \"/newbot\" komutunu gönderin. Bu adımı tamamladıktan sonra bir jeton alacaksınız.\n3. Yeni oluşturduğunuz botla bir sohbet başlatın. Etkinleştirmek için eğik çizgiyle (\"/\") başlayan \"/merhaba\" gibi bir mesaj gönderin.\n"),
|
("enable-bot-desc", "1. @BotFather ile bir sohbet açın.\n2. \"/newbot\" komutunu gönderin. Bu adımı tamamladıktan sonra bir jeton alacaksınız.\n3. Yeni oluşturduğunuz botla bir sohbet başlatın. Etkinleştirmek için eğik çizgiyle (\"/\") başlayan \"/merhaba\" gibi bir mesaj gönderin.\n"),
|
||||||
("cancel-2fa-confirm-tip", "2FA'yı iptal etmek istediğinizden emin misiniz?"),
|
("cancel-2fa-confirm-tip", "2FA'yı iptal etmek istediğinizden emin misiniz?"),
|
||||||
@@ -641,7 +642,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Invalid file name", "Geçersiz dosya adı"),
|
("Invalid file name", "Geçersiz dosya adı"),
|
||||||
("one-way-file-transfer-tip", "Kontrol edilen tarafta tek yönlü dosya transferi aktiftir."),
|
("one-way-file-transfer-tip", "Kontrol edilen tarafta tek yönlü dosya transferi aktiftir."),
|
||||||
("Authentication Required", "Kimlik Doğrulama Gerekli"),
|
("Authentication Required", "Kimlik Doğrulama Gerekli"),
|
||||||
("Authenticate", "Kimlik Doğrula"),
|
("Authenticate", "Kimlik doğrulaması"),
|
||||||
("web_id_input_tip", "Aynı sunucuda bir kimlik girebilirsiniz, web istemcisinde doğrudan IP erişimi desteklenmez.\nBaşka bir sunucudaki bir cihaza erişmek istiyorsanız lütfen sunucu adresini (<id>@<server_address>?key=<key_value>) ekleyin, örneğin,\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nGenel bir sunucudaki bir cihaza erişmek istiyorsanız, lütfen \"<id>@public\" girin, genel sunucu için anahtara gerek yoktur."),
|
("web_id_input_tip", "Aynı sunucuda bir kimlik girebilirsiniz, web istemcisinde doğrudan IP erişimi desteklenmez.\nBaşka bir sunucudaki bir cihaza erişmek istiyorsanız lütfen sunucu adresini (<id>@<server_address>?key=<key_value>) ekleyin, örneğin,\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nGenel bir sunucudaki bir cihaza erişmek istiyorsanız, lütfen \"<id>@public\" girin, genel sunucu için anahtara gerek yoktur."),
|
||||||
("Download", "İndir"),
|
("Download", "İndir"),
|
||||||
("Upload folder", "Klasör yükle"),
|
("Upload folder", "Klasör yükle"),
|
||||||
@@ -660,9 +661,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("printer-{}-not-installed-tip", "{} Yazıcısı yüklü değil."),
|
("printer-{}-not-installed-tip", "{} Yazıcısı yüklü değil."),
|
||||||
("printer-{}-ready-tip", "{} Yazıcısı kuruldu ve kullanıma hazır."),
|
("printer-{}-ready-tip", "{} Yazıcısı kuruldu ve kullanıma hazır."),
|
||||||
("Install {} Printer", "{} Yazıcısını Yükle"),
|
("Install {} Printer", "{} Yazıcısını Yükle"),
|
||||||
("Outgoing Print Jobs", "Giden Yazdırma İşleri"),
|
("Outgoing Print Jobs", "Giden Baskı İşleri"),
|
||||||
("Incoming Print Jobs", "Gelen Yazdırma İşleri"),
|
("Incoming Print Jobs", "Gelen Baskı İşleri"),
|
||||||
("Incoming Print Job", "Gelen Yazdırma İşi"),
|
("Incoming Print Job", "Gelen Baskı İşi"),
|
||||||
("use-the-default-printer-tip", "Varsayılan yazıcıyı kullan"),
|
("use-the-default-printer-tip", "Varsayılan yazıcıyı kullan"),
|
||||||
("use-the-selected-printer-tip", "Seçili yazıcıyı kullan"),
|
("use-the-selected-printer-tip", "Seçili yazıcıyı kullan"),
|
||||||
("auto-print-tip", "Seçili yazıcıyı kullanarak otomatik olarak yazdır."),
|
("auto-print-tip", "Seçili yazıcıyı kullanarak otomatik olarak yazdır."),
|
||||||
@@ -684,11 +685,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("download-new-version-failed-tip", "İndirme başarısız oldu. Tekrar deneyebilir veya 'İndir' düğmesine tıklayarak sürüm sayfasından manuel olarak indirip güncelleyebilirsiniz."),
|
("download-new-version-failed-tip", "İndirme başarısız oldu. Tekrar deneyebilir veya 'İndir' düğmesine tıklayarak sürüm sayfasından manuel olarak indirip güncelleyebilirsiniz."),
|
||||||
("Auto update", "Otomatik güncelleme"),
|
("Auto update", "Otomatik güncelleme"),
|
||||||
("update-failed-check-msi-tip", "Kurulum yöntemi denetimi başarısız oldu. Sürüm sayfasından indirmek ve manuel olarak yükseltmek için lütfen \"İndir\" düğmesine tıklayın."),
|
("update-failed-check-msi-tip", "Kurulum yöntemi denetimi başarısız oldu. Sürüm sayfasından indirmek ve manuel olarak yükseltmek için lütfen \"İndir\" düğmesine tıklayın."),
|
||||||
("websocket_tip", "WebSocket kullanıldığında yalnızca aktarma bağlantıları desteklenir."),
|
("websocket_tip", "WebSocket kullanıldığında yalnızca röle bağlantıları desteklenir."),
|
||||||
("Use WebSocket", "WebSocket'ı kullan"),
|
("Use WebSocket", "WebSocket'ı kullan"),
|
||||||
("Trackpad speed", "İzleme paneli hızı"),
|
("Trackpad speed", "İzleme paneli hızı"),
|
||||||
("Default trackpad speed", "Varsayılan izleme paneli hızı"),
|
("Default trackpad speed", "Varsayılan izleme paneli hızı"),
|
||||||
("Numeric one-time password", "Sayısal tek seferlik parola"),
|
("Numeric one-time password", "Sayısal tek seferlik şifre"),
|
||||||
("Enable IPv6 P2P connection", "IPv6 P2P bağlantısını etkinleştir"),
|
("Enable IPv6 P2P connection", "IPv6 P2P bağlantısını etkinleştir"),
|
||||||
("Enable UDP hole punching", "UDP delik açmayı etkinleştir"),
|
("Enable UDP hole punching", "UDP delik açmayı etkinleştir"),
|
||||||
("View camera", "Kamerayı görüntüle"),
|
("View camera", "Kamerayı görüntüle"),
|
||||||
@@ -700,16 +701,16 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("New tab", "Yeni sekme"),
|
("New tab", "Yeni sekme"),
|
||||||
("Keep terminal sessions on disconnect", "Bağlantı kesildiğinde terminal oturumlarını açık tut"),
|
("Keep terminal sessions on disconnect", "Bağlantı kesildiğinde terminal oturumlarını açık tut"),
|
||||||
("Terminal (Run as administrator)", "Terminal (Yönetici olarak çalıştır)"),
|
("Terminal (Run as administrator)", "Terminal (Yönetici olarak çalıştır)"),
|
||||||
("terminal-admin-login-tip", "Lütfen kontrol edilen tarafın yönetici kullanıcı adı ve parolasını giriniz."),
|
("terminal-admin-login-tip", "Lütfen kontrol edilen tarafın yönetici kullanıcı adı ve şifresini giriniz."),
|
||||||
("Failed to get user token.", "Kullanıcı belirteci alınamadı."),
|
("Failed to get user token.", "Kullanıcı belirteci alınamadı."),
|
||||||
("Incorrect username or password.", "Hatalı kullanıcı adı veya parola."),
|
("Incorrect username or password.", "Hatalı kullanıcı adı veya şifre."),
|
||||||
("The user is not an administrator.", "Kullanıcı bir yönetici değil."),
|
("The user is not an administrator.", "Kullanıcı bir yönetici değil."),
|
||||||
("Failed to check if the user is an administrator.", "Kullanıcının yönetici olup olmadığı kontrol edilemedi."),
|
("Failed to check if the user is an administrator.", "Kullanıcının yönetici olup olmadığı kontrol edilemedi."),
|
||||||
("Supported only in the installed version.", "Sadece yüklü sürümde desteklenir."),
|
("Supported only in the installed version.", "Sadece yüklü sürümde desteklenir."),
|
||||||
("elevation_username_tip", "Kullanıcı adı veya etki alanı\\kullanıcı adı girin"),
|
("elevation_username_tip", "Kullanıcı adı veya etki alanı\\kullanıcı adı girin"),
|
||||||
("Preparing for installation ...", "Kuruluma hazırlanıyor..."),
|
("Preparing for installation ...", "Kuruluma hazırlanıyor..."),
|
||||||
("Show my cursor", "İmlecimi göster"),
|
("Show my cursor", "İmlecimi göster"),
|
||||||
("Scale custom", "Özel ölçekte"),
|
("Scale custom", "Özel boyutlandır"),
|
||||||
("Custom scale slider", "Özel ölçek kaydırıcısı"),
|
("Custom scale slider", "Özel ölçek kaydırıcısı"),
|
||||||
("Decrease", "Azalt"),
|
("Decrease", "Azalt"),
|
||||||
("Increase", "Arttır"),
|
("Increase", "Arttır"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", "Değişiklik Günlüğü"),
|
("Changelog", "Değişiklik Günlüğü"),
|
||||||
("keep-awake-during-outgoing-sessions-label", "Giden oturumlar süresince ekranı açık tutun"),
|
("keep-awake-during-outgoing-sessions-label", "Giden oturumlar süresince ekranı açık tutun"),
|
||||||
("keep-awake-during-incoming-sessions-label", "Gelen oturumlar süresince ekranı açık tutun"),
|
("keep-awake-during-incoming-sessions-label", "Gelen oturumlar süresince ekranı açık tutun"),
|
||||||
("Continue with {}", "{} ile devam et"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "顯示 RustDesk"),
|
("Show RustDesk", "顯示 RustDesk"),
|
||||||
("This PC", "此電腦"),
|
("This PC", "此電腦"),
|
||||||
("or", "或"),
|
("or", "或"),
|
||||||
|
("Continue with", "繼續"),
|
||||||
("Elevate", "提升權限"),
|
("Elevate", "提升權限"),
|
||||||
("Zoom cursor", "縮放游標"),
|
("Zoom cursor", "縮放游標"),
|
||||||
("Accept sessions via password", "只允許透過輸入密碼進行連線"),
|
("Accept sessions via password", "只允許透過輸入密碼進行連線"),
|
||||||
@@ -728,16 +729,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", "注意:RustDesk 開源伺服器 (OSS server) 不包含此功能。"),
|
("server-oss-not-support-tip", "注意:RustDesk 開源伺服器 (OSS server) 不包含此功能。"),
|
||||||
("input note here", "輸入備註"),
|
("input note here", "輸入備註"),
|
||||||
("note-at-conn-end-tip", "在連接結束時請求備註"),
|
("note-at-conn-end-tip", "在連接結束時請求備註"),
|
||||||
("Show terminal extra keys", "顯示終端機額外按鍵"),
|
("Show terminal extra keys", ""),
|
||||||
("Relative mouse mode", "相對滑鼠模式"),
|
("Relative mouse mode", ""),
|
||||||
("rel-mouse-not-supported-peer-tip", "被控端不支援相對滑鼠模式"),
|
("rel-mouse-not-supported-peer-tip", ""),
|
||||||
("rel-mouse-not-ready-tip", "相對滑鼠模式尚未就緒,請稍候再試"),
|
("rel-mouse-not-ready-tip", ""),
|
||||||
("rel-mouse-lock-failed-tip", "無法鎖定游標,相對滑鼠模式已停用"),
|
("rel-mouse-lock-failed-tip", ""),
|
||||||
("rel-mouse-exit-{}-tip", "按下 {} 退出"),
|
("rel-mouse-exit-{}-tip", ""),
|
||||||
("rel-mouse-permission-lost-tip", "鍵盤權限被撤銷,相對滑鼠模式已被停用"),
|
("rel-mouse-permission-lost-tip", ""),
|
||||||
("Changelog", "更新日誌"),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", "在連出工作階段期間保持螢幕喚醒"),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", "在連入工作階段期間保持螢幕喚醒"),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "使用 {} 登入"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Показати RustDesk"),
|
("Show RustDesk", "Показати RustDesk"),
|
||||||
("This PC", "Цей ПК"),
|
("This PC", "Цей ПК"),
|
||||||
("or", "чи"),
|
("or", "чи"),
|
||||||
|
("Continue with", "Продовжити з"),
|
||||||
("Elevate", "Розширення прав"),
|
("Elevate", "Розширення прав"),
|
||||||
("Zoom cursor", "Збільшити вказівник"),
|
("Zoom cursor", "Збільшити вказівник"),
|
||||||
("Accept sessions via password", "Підтверджувати сеанси паролем"),
|
("Accept sessions via password", "Підтверджувати сеанси паролем"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", ""),
|
("Changelog", ""),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Продовжити з {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show RustDesk", "Hiện RustDesk"),
|
("Show RustDesk", "Hiện RustDesk"),
|
||||||
("This PC", "Máy tính này"),
|
("This PC", "Máy tính này"),
|
||||||
("or", "hoặc"),
|
("or", "hoặc"),
|
||||||
|
("Continue with", "Tiếp tục với"),
|
||||||
("Elevate", "Nâng quyền"),
|
("Elevate", "Nâng quyền"),
|
||||||
("Zoom cursor", "Phóng to con trỏ"),
|
("Zoom cursor", "Phóng to con trỏ"),
|
||||||
("Accept sessions via password", "Chấp nhận phiên qua mật khẩu"),
|
("Accept sessions via password", "Chấp nhận phiên qua mật khẩu"),
|
||||||
@@ -738,6 +739,5 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Changelog", "Nhật ký thay đổi"),
|
("Changelog", "Nhật ký thay đổi"),
|
||||||
("keep-awake-during-outgoing-sessions-label", ""),
|
("keep-awake-during-outgoing-sessions-label", ""),
|
||||||
("keep-awake-during-incoming-sessions-label", ""),
|
("keep-awake-during-incoming-sessions-label", ""),
|
||||||
("Continue with {}", "Tiếp tục với {}"),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2088,122 +2088,3 @@ pub fn is_selinux_enforcing() -> bool {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the app ID for shortcuts inhibitor permission.
|
|
||||||
/// Returns different ID based on whether running in Flatpak or native.
|
|
||||||
/// The ID must match the installed .desktop filename, as GNOME Shell's
|
|
||||||
/// inhibitShortcutsDialog uses `Shell.WindowTracker.get_window_app(window).get_id()`.
|
|
||||||
fn get_shortcuts_inhibitor_app_id() -> String {
|
|
||||||
if is_flatpak() {
|
|
||||||
// In Flatpak, FLATPAK_ID is set automatically by the runtime to the app ID
|
|
||||||
// (e.g., "com.rustdesk.RustDesk"). This is the most reliable source.
|
|
||||||
// Fall back to constructing from app name if not available.
|
|
||||||
match std::env::var("FLATPAK_ID") {
|
|
||||||
Ok(id) if !id.is_empty() => format!("{}.desktop", id),
|
|
||||||
_ => {
|
|
||||||
let app_name = crate::get_app_name();
|
|
||||||
format!("com.{}.{}.desktop", app_name.to_lowercase(), app_name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
format!("{}.desktop", crate::get_app_name().to_lowercase())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const PERMISSION_STORE_DEST: &str = "org.freedesktop.impl.portal.PermissionStore";
|
|
||||||
const PERMISSION_STORE_PATH: &str = "/org/freedesktop/impl/portal/PermissionStore";
|
|
||||||
const PERMISSION_STORE_IFACE: &str = "org.freedesktop.impl.portal.PermissionStore";
|
|
||||||
|
|
||||||
/// Clear GNOME shortcuts inhibitor permission via D-Bus.
|
|
||||||
/// This allows the permission dialog to be shown again.
|
|
||||||
pub fn clear_gnome_shortcuts_inhibitor_permission() -> ResultType<()> {
|
|
||||||
let app_id = get_shortcuts_inhibitor_app_id();
|
|
||||||
log::info!(
|
|
||||||
"Clearing shortcuts inhibitor permission for app_id: {}, is_flatpak: {}",
|
|
||||||
app_id,
|
|
||||||
is_flatpak()
|
|
||||||
);
|
|
||||||
|
|
||||||
let conn = dbus::blocking::Connection::new_session()?;
|
|
||||||
let proxy = conn.with_proxy(
|
|
||||||
PERMISSION_STORE_DEST,
|
|
||||||
PERMISSION_STORE_PATH,
|
|
||||||
std::time::Duration::from_secs(3),
|
|
||||||
);
|
|
||||||
|
|
||||||
// DeletePermission(s table, s id, s app) -> ()
|
|
||||||
let result: Result<(), dbus::Error> = proxy.method_call(
|
|
||||||
PERMISSION_STORE_IFACE,
|
|
||||||
"DeletePermission",
|
|
||||||
("gnome", "shortcuts-inhibitor", app_id.as_str()),
|
|
||||||
);
|
|
||||||
|
|
||||||
match result {
|
|
||||||
Ok(()) => {
|
|
||||||
log::info!("Successfully cleared GNOME shortcuts inhibitor permission");
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
let err_name = e.name().unwrap_or("");
|
|
||||||
// If the permission doesn't exist, that's also fine
|
|
||||||
if err_name == "org.freedesktop.portal.Error.NotFound"
|
|
||||||
|| err_name == "org.freedesktop.DBus.Error.UnknownObject"
|
|
||||||
|| err_name == "org.freedesktop.DBus.Error.ServiceUnknown"
|
|
||||||
{
|
|
||||||
log::info!("GNOME shortcuts inhibitor permission was not set ({})", err_name);
|
|
||||||
Ok(())
|
|
||||||
} else {
|
|
||||||
bail!("Failed to clear permission: {}", e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Check if GNOME shortcuts inhibitor permission exists.
|
|
||||||
pub fn has_gnome_shortcuts_inhibitor_permission() -> bool {
|
|
||||||
let app_id = get_shortcuts_inhibitor_app_id();
|
|
||||||
|
|
||||||
let conn = match dbus::blocking::Connection::new_session() {
|
|
||||||
Ok(c) => c,
|
|
||||||
Err(e) => {
|
|
||||||
log::debug!("Failed to connect to session bus: {}", e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let proxy = conn.with_proxy(
|
|
||||||
PERMISSION_STORE_DEST,
|
|
||||||
PERMISSION_STORE_PATH,
|
|
||||||
std::time::Duration::from_secs(3),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Lookup(s table, s id) -> (a{sas} permissions, v data)
|
|
||||||
// We only need the permissions dict; check if app_id is a key.
|
|
||||||
let result: Result<
|
|
||||||
(
|
|
||||||
std::collections::HashMap<String, Vec<String>>,
|
|
||||||
dbus::arg::Variant<Box<dyn dbus::arg::RefArg>>,
|
|
||||||
),
|
|
||||||
dbus::Error,
|
|
||||||
> = proxy.method_call(
|
|
||||||
PERMISSION_STORE_IFACE,
|
|
||||||
"Lookup",
|
|
||||||
("gnome", "shortcuts-inhibitor"),
|
|
||||||
);
|
|
||||||
|
|
||||||
match result {
|
|
||||||
Ok((permissions, _)) => {
|
|
||||||
let found = permissions.contains_key(&app_id);
|
|
||||||
log::debug!(
|
|
||||||
"Shortcuts inhibitor permission lookup: app_id={}, found={}, keys={:?}",
|
|
||||||
app_id,
|
|
||||||
found,
|
|
||||||
permissions.keys().collect::<Vec<_>>()
|
|
||||||
);
|
|
||||||
found
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
log::debug!("Failed to query shortcuts inhibitor permission: {}", e);
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user