mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-02-17 14:07:28 +08:00
feat(terminal): add two-row floating keyboard buttons for common commands (mobile only) (#13876)
* feat(terminal): add two-row floating keyboard buttons for common commands (mobile only) * Fix missing newline at end of pl.rs Add missing newline at the end of the file.
This commit is contained in:
@@ -163,6 +163,7 @@ const String kOptionShowVirtualMouse = "show-virtual-mouse";
|
|||||||
const String kOptionVirtualMouseScale = "virtual-mouse-scale";
|
const String kOptionVirtualMouseScale = "virtual-mouse-scale";
|
||||||
const String kOptionShowVirtualJoystick = "show-virtual-joystick";
|
const String kOptionShowVirtualJoystick = "show-virtual-joystick";
|
||||||
const String kOptionAllowAskForNoteAtEndOfConnection = "allow-ask-for-note";
|
const String kOptionAllowAskForNoteAtEndOfConnection = "allow-ask-for-note";
|
||||||
|
const String kOptionEnableShowTerminalExtraKeys = "enable-show-terminal-extra-keys";
|
||||||
|
|
||||||
// network options
|
// network options
|
||||||
const String kOptionAllowWebSocket = "allow-websocket";
|
const String kOptionAllowWebSocket = "allow-websocket";
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
|||||||
var _ignoreBatteryOpt = false;
|
var _ignoreBatteryOpt = false;
|
||||||
var _enableStartOnBoot = false;
|
var _enableStartOnBoot = false;
|
||||||
var _checkUpdateOnStartup = false;
|
var _checkUpdateOnStartup = false;
|
||||||
|
var _showTerminalExtraKeys = false;
|
||||||
var _floatingWindowDisabled = false;
|
var _floatingWindowDisabled = false;
|
||||||
var _keepScreenOn = KeepScreenOn.duringControlled; // relay on floating window
|
var _keepScreenOn = KeepScreenOn.duringControlled; // relay on floating window
|
||||||
var _enableAbr = false;
|
var _enableAbr = false;
|
||||||
@@ -139,6 +140,8 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
|||||||
_enableIpv6Punch = mainGetLocalBoolOptionSync(kOptionEnableIpv6Punch);
|
_enableIpv6Punch = mainGetLocalBoolOptionSync(kOptionEnableIpv6Punch);
|
||||||
_allowAskForNoteAtEndOfConnection =
|
_allowAskForNoteAtEndOfConnection =
|
||||||
mainGetLocalBoolOptionSync(kOptionAllowAskForNoteAtEndOfConnection);
|
mainGetLocalBoolOptionSync(kOptionAllowAskForNoteAtEndOfConnection);
|
||||||
|
_showTerminalExtraKeys =
|
||||||
|
mainGetLocalBoolOptionSync(kOptionEnableShowTerminalExtraKeys);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -602,6 +605,23 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enhancementsTiles.add(
|
||||||
|
SettingsTile.switchTile(
|
||||||
|
initialValue: _showTerminalExtraKeys,
|
||||||
|
title: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
|
||||||
|
Text(translate('Show terminal extra keys')),
|
||||||
|
]),
|
||||||
|
onToggle: (bool v) async {
|
||||||
|
await mainSetLocalBoolOption(kOptionEnableShowTerminalExtraKeys, v);
|
||||||
|
final newValue =
|
||||||
|
mainGetLocalBoolOptionSync(kOptionEnableShowTerminalExtraKeys);
|
||||||
|
setState(() {
|
||||||
|
_showTerminalExtraKeys = newValue;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
onFloatingWindowChanged(bool toValue) async {
|
onFloatingWindowChanged(bool toValue) async {
|
||||||
if (toValue) {
|
if (toValue) {
|
||||||
if (!await AndroidPermissionManager.check(kSystemAlertWindow)) {
|
if (!await AndroidPermissionManager.check(kSystemAlertWindow)) {
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import 'package:flutter_hbb/models/terminal_model.dart';
|
|||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
import 'package:xterm/xterm.dart';
|
import 'package:xterm/xterm.dart';
|
||||||
import '../../desktop/pages/terminal_connection_manager.dart';
|
import '../../desktop/pages/terminal_connection_manager.dart';
|
||||||
|
import '../../consts.dart';
|
||||||
|
|
||||||
class TerminalPage extends StatefulWidget {
|
class TerminalPage extends StatefulWidget {
|
||||||
const TerminalPage({
|
const TerminalPage({
|
||||||
@@ -37,6 +38,9 @@ class _TerminalPageState extends State<TerminalPage>
|
|||||||
double? _cellHeight;
|
double? _cellHeight;
|
||||||
double _sysKeyboardHeight = 0;
|
double _sysKeyboardHeight = 0;
|
||||||
Timer? _keyboardDebounce;
|
Timer? _keyboardDebounce;
|
||||||
|
final GlobalKey _keyboardKey = GlobalKey();
|
||||||
|
double _keyboardHeight = 0;
|
||||||
|
late bool _showTerminalExtraKeys;
|
||||||
|
|
||||||
// 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.
|
||||||
@@ -75,10 +79,15 @@ class _TerminalPageState extends State<TerminalPage>
|
|||||||
// Register this terminal model with FFI for event routing
|
// Register this terminal model with FFI for event routing
|
||||||
_ffi.registerTerminalModel(widget.terminalId, _terminalModel);
|
_ffi.registerTerminalModel(widget.terminalId, _terminalModel);
|
||||||
|
|
||||||
|
_showTerminalExtraKeys = mainGetLocalBoolOptionSync(kOptionEnableShowTerminalExtraKeys);
|
||||||
// Initialize terminal connection
|
// Initialize terminal connection
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
_ffi.dialogManager
|
_ffi.dialogManager
|
||||||
.showLoading(translate('Connecting...'), onCancel: closeConnection);
|
.showLoading(translate('Connecting...'), onCancel: closeConnection);
|
||||||
|
|
||||||
|
if (_showTerminalExtraKeys) {
|
||||||
|
_updateKeyboardHeight();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
_ffi.ffiModel.updateEventListener(_ffi.sessionId, widget.id);
|
_ffi.ffiModel.updateEventListener(_ffi.sessionId, widget.id);
|
||||||
}
|
}
|
||||||
@@ -107,15 +116,22 @@ class _TerminalPageState extends State<TerminalPage>
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _updateKeyboardHeight() {
|
||||||
|
if (_keyboardKey.currentContext != null) {
|
||||||
|
final renderBox = _keyboardKey.currentContext!.findRenderObject() as RenderBox;
|
||||||
|
_keyboardHeight = renderBox.size.height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
EdgeInsets _calculatePadding(double heightPx) {
|
EdgeInsets _calculatePadding(double heightPx) {
|
||||||
if (_cellHeight == null) {
|
if (_cellHeight == null) {
|
||||||
return const EdgeInsets.symmetric(horizontal: 5.0, vertical: 2.0);
|
return const EdgeInsets.symmetric(horizontal: 5.0, vertical: 2.0);
|
||||||
}
|
}
|
||||||
final realHeight = heightPx - _sysKeyboardHeight;
|
final realHeight = heightPx - _sysKeyboardHeight - _keyboardHeight;
|
||||||
final rows = (realHeight / _cellHeight!).floor();
|
final rows = (realHeight / _cellHeight!).floor();
|
||||||
final extraSpace = realHeight - rows * _cellHeight!;
|
final extraSpace = realHeight - rows * _cellHeight!;
|
||||||
final topBottom = max(0.0, extraSpace / 2.0);
|
final topBottom = max(0.0, extraSpace / 2.0);
|
||||||
return EdgeInsets.only(left: 5.0, right: 5.0, top: topBottom, bottom: topBottom + _sysKeyboardHeight);
|
return EdgeInsets.only(left: 5.0, right: 5.0, top: topBottom, bottom: topBottom + _sysKeyboardHeight + _keyboardHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -134,39 +150,168 @@ class _TerminalPageState extends State<TerminalPage>
|
|||||||
return 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: SafeArea(
|
body: Stack(
|
||||||
top: true,
|
children: [
|
||||||
child: LayoutBuilder(
|
Positioned.fill(
|
||||||
builder: (context, constraints) {
|
child: SafeArea(
|
||||||
final heightPx = constraints.maxHeight;
|
top: true,
|
||||||
return TerminalView(
|
child: LayoutBuilder(
|
||||||
_terminalModel.terminal,
|
builder: (context, constraints) {
|
||||||
controller: _terminalModel.terminalController,
|
final heightPx = constraints.maxHeight;
|
||||||
autofocus: true,
|
return TerminalView(
|
||||||
textStyle: _getTerminalStyle(),
|
_terminalModel.terminal,
|
||||||
backgroundOpacity: 0.7,
|
controller: _terminalModel.terminalController,
|
||||||
padding: _calculatePadding(heightPx),
|
autofocus: true,
|
||||||
onSecondaryTapDown: (details, offset) async {
|
textStyle: _getTerminalStyle(),
|
||||||
final selection = _terminalModel.terminalController.selection;
|
backgroundOpacity: 0.7,
|
||||||
if (selection != null) {
|
padding: _calculatePadding(heightPx),
|
||||||
final text = _terminalModel.terminal.buffer.getText(selection);
|
onSecondaryTapDown: (details, offset) async {
|
||||||
_terminalModel.terminalController.clearSelection();
|
final selection = _terminalModel.terminalController.selection;
|
||||||
await Clipboard.setData(ClipboardData(text: text));
|
if (selection != null) {
|
||||||
} else {
|
final text = _terminalModel.terminal.buffer.getText(selection);
|
||||||
final data = await Clipboard.getData('text/plain');
|
_terminalModel.terminalController.clearSelection();
|
||||||
final text = data?.text;
|
await Clipboard.setData(ClipboardData(text: text));
|
||||||
if (text != null) {
|
} else {
|
||||||
_terminalModel.terminal.paste(text);
|
final data = await Clipboard.getData('text/plain');
|
||||||
}
|
final text = data?.text;
|
||||||
}
|
if (text != null) {
|
||||||
},
|
_terminalModel.terminal.paste(text);
|
||||||
);
|
}
|
||||||
},
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (_showTerminalExtraKeys) _buildFloatingKeyboard(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildFloatingKeyboard() {
|
||||||
|
return AnimatedPositioned(
|
||||||
|
duration: const Duration(milliseconds: 200),
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
bottom: _sysKeyboardHeight,
|
||||||
|
child: Container(
|
||||||
|
key: _keyboardKey,
|
||||||
|
color: Theme.of(context).scaffoldBackgroundColor,
|
||||||
|
padding: EdgeInsets.zero,
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
_buildKeyButton('Esc'),
|
||||||
|
const SizedBox(width: 2),
|
||||||
|
_buildKeyButton('/'),
|
||||||
|
const SizedBox(width: 2),
|
||||||
|
_buildKeyButton('|'),
|
||||||
|
const SizedBox(width: 2),
|
||||||
|
_buildKeyButton('Home'),
|
||||||
|
const SizedBox(width: 2),
|
||||||
|
_buildKeyButton('↑'),
|
||||||
|
const SizedBox(width: 2),
|
||||||
|
_buildKeyButton('End'),
|
||||||
|
const SizedBox(width: 2),
|
||||||
|
_buildKeyButton('PgUp'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
_buildKeyButton('Tab'),
|
||||||
|
const SizedBox(width: 2),
|
||||||
|
_buildKeyButton('Ctrl+C'),
|
||||||
|
const SizedBox(width: 2),
|
||||||
|
_buildKeyButton('~'),
|
||||||
|
const SizedBox(width: 2),
|
||||||
|
_buildKeyButton('←'),
|
||||||
|
const SizedBox(width: 2),
|
||||||
|
_buildKeyButton('↓'),
|
||||||
|
const SizedBox(width: 2),
|
||||||
|
_buildKeyButton('→'),
|
||||||
|
const SizedBox(width: 2),
|
||||||
|
_buildKeyButton('PgDn'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget _buildKeyButton(String label) {
|
||||||
|
return ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
_sendKeyToTerminal(label);
|
||||||
|
},
|
||||||
|
child: Text(label),
|
||||||
|
style: ElevatedButton.styleFrom(
|
||||||
|
minimumSize: const Size(48, 32),
|
||||||
|
padding: EdgeInsets.zero,
|
||||||
|
textStyle: const TextStyle(fontSize: 12),
|
||||||
|
backgroundColor: Theme.of(context).colorScheme.surfaceVariant,
|
||||||
|
foregroundColor: Theme.of(context).colorScheme.onSurfaceVariant,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _sendKeyToTerminal(String key) {
|
||||||
|
String? send;
|
||||||
|
|
||||||
|
switch (key) {
|
||||||
|
case 'Esc':
|
||||||
|
send = '\x1B';
|
||||||
|
break;
|
||||||
|
case 'Tab':
|
||||||
|
send = '\t';
|
||||||
|
break;
|
||||||
|
case 'Ctrl+C':
|
||||||
|
send = '\x03';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '↑':
|
||||||
|
send = '\x1B[A';
|
||||||
|
break;
|
||||||
|
case '↓':
|
||||||
|
send = '\x1B[B';
|
||||||
|
break;
|
||||||
|
case '→':
|
||||||
|
send = '\x1B[C';
|
||||||
|
break;
|
||||||
|
case '←':
|
||||||
|
send = '\x1B[D';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Home':
|
||||||
|
send = '\x1B[H';
|
||||||
|
break;
|
||||||
|
case 'End':
|
||||||
|
send = '\x1B[F';
|
||||||
|
break;
|
||||||
|
case 'PgUp':
|
||||||
|
send = '\x1B[5~';
|
||||||
|
break;
|
||||||
|
case 'PgDn':
|
||||||
|
send = '\x1B[6~';
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
send = key;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (send != null) {
|
||||||
|
_terminalModel.sendVirtualKey(send);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// https://github.com/TerminalStudio/xterm.dart/issues/42#issuecomment-877495472
|
// https://github.com/TerminalStudio/xterm.dart/issues/42#issuecomment-877495472
|
||||||
// https://github.com/TerminalStudio/xterm.dart/issues/198#issuecomment-2526548458
|
// https://github.com/TerminalStudio/xterm.dart/issues/198#issuecomment-2526548458
|
||||||
TerminalStyle _getTerminalStyle() {
|
TerminalStyle _getTerminalStyle() {
|
||||||
|
|||||||
@@ -146,6 +146,10 @@ class TerminalModel with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> sendVirtualKey(String data) async {
|
||||||
|
return _handleInput(data);
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> closeTerminal() async {
|
Future<void> closeTerminal() async {
|
||||||
if (_terminalOpened) {
|
if (_terminalOpened) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", "هذه الميزة غير مدعومة من قبل خادمك"),
|
("server-oss-not-support-tip", "هذه الميزة غير مدعومة من قبل خادمك"),
|
||||||
("input note here", "أدخل الملاحظة هنا"),
|
("input note here", "أدخل الملاحظة هنا"),
|
||||||
("note-at-conn-end-tip", "سيتم عرض هذه الملاحظة عند نهاية الاتصال"),
|
("note-at-conn-end-tip", "سيتم عرض هذه الملاحظة عند نهاية الاتصال"),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ 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", "显示终端扩展键"),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", "HINWEIS: RustDesk Server OSS enthält diese Funktion nicht."),
|
("server-oss-not-support-tip", "HINWEIS: RustDesk Server OSS enthält diese Funktion nicht."),
|
||||||
("input note here", "Hier eine Notiz eingeben"),
|
("input note here", "Hier eine Notiz eingeben"),
|
||||||
("note-at-conn-end-tip", "Am Ende der Verbindung um eine Notiz bitten."),
|
("note-at-conn-end-tip", "Am Ende der Verbindung um eine Notiz bitten."),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", "توجه: سرور RustDesk OSS این ویژگی را ندارد."),
|
("server-oss-not-support-tip", "توجه: سرور RustDesk OSS این ویژگی را ندارد."),
|
||||||
("input note here", "یادداشت را اینجا وارد کنید"),
|
("input note here", "یادداشت را اینجا وارد کنید"),
|
||||||
("note-at-conn-end-tip", "در پایان اتصال، یادداشت بخواهید"),
|
("note-at-conn-end-tip", "در پایان اتصال، یادداشت بخواهید"),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", "Note : Cette fonctionnalité n’est pas disponible sous la version open-source du serveur RustDesk."),
|
("server-oss-not-support-tip", "Note : Cette fonctionnalité n’est pas disponible sous la version open-source du serveur RustDesk."),
|
||||||
("input note here", "saisir la note ici"),
|
("input note here", "saisir la note ici"),
|
||||||
("note-at-conn-end-tip", "Proposer d’écrire une note une fois la connexion terminée"),
|
("note-at-conn-end-tip", "Proposer d’écrire une note une fois la connexion terminée"),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", "MEGJEGYZÉS: Az OSS RustDesk kiszolgáló nem támogatja ezt a funkciót."),
|
("server-oss-not-support-tip", "MEGJEGYZÉS: Az OSS RustDesk kiszolgáló nem támogatja ezt a funkciót."),
|
||||||
("input note here", "Megjegyzés bevitele"),
|
("input note here", "Megjegyzés bevitele"),
|
||||||
("note-at-conn-end-tip", "Megjegyzés a kapcsolat végén"),
|
("note-at-conn-end-tip", "Megjegyzés a kapcsolat végén"),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", "NOTA: il sistema operativo del server RustDesk non include questa funzionalità."),
|
("server-oss-not-support-tip", "NOTA: il sistema operativo del server RustDesk non include questa funzionalità."),
|
||||||
("input note here", "Inserisci nota qui"),
|
("input note here", "Inserisci nota qui"),
|
||||||
("note-at-conn-end-tip", "Visualizza nota alla fine della connessione"),
|
("note-at-conn-end-tip", "Visualizza nota alla fine della connessione"),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", "참고: RustDesk 서버 OSS에는 이 기능이 포함되어 있지 않습니다."),
|
("server-oss-not-support-tip", "참고: RustDesk 서버 OSS에는 이 기능이 포함되어 있지 않습니다."),
|
||||||
("input note here", "여기에 노트 입력"),
|
("input note here", "여기에 노트 입력"),
|
||||||
("note-at-conn-end-tip", "연결이 끝날 때 메모 요청"),
|
("note-at-conn-end-tip", "연결이 끝날 때 메모 요청"),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", "Opmerking: Deze functie is niet beschikbaar in de open-sourceversie van de RustDesk-server."),
|
("server-oss-not-support-tip", "Opmerking: Deze functie is niet beschikbaar in de open-sourceversie van de RustDesk-server."),
|
||||||
("input note here", "voeg hier een opmerking toe"),
|
("input note here", "voeg hier een opmerking toe"),
|
||||||
("note-at-conn-end-tip", "Vraag om een opmerking aan het einde van de verbinding"),
|
("note-at-conn-end-tip", "Vraag om een opmerking aan het einde van de verbinding"),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", "UWAGA: Serwer OSS RustDesk nie obsługuje tej funkcji."),
|
("server-oss-not-support-tip", "UWAGA: Serwer OSS RustDesk nie obsługuje tej funkcji."),
|
||||||
("input note here", "Wstaw tutaj notatkę"),
|
("input note here", "Wstaw tutaj notatkę"),
|
||||||
("note-at-conn-end-tip", "Poproś o notatkę po zakończeniu połączenia."),
|
("note-at-conn-end-tip", "Poproś o notatkę po zakończeniu połączenia."),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", "ПРИМЕЧАНИЕ: в OSS-сервере RustDesk эта функция отсутствует."),
|
("server-oss-not-support-tip", "ПРИМЕЧАНИЕ: в OSS-сервере RustDesk эта функция отсутствует."),
|
||||||
("input note here", "введите заметку"),
|
("input note here", "введите заметку"),
|
||||||
("note-at-conn-end-tip", "Запрашивать заметку в конце соединения"),
|
("note-at-conn-end-tip", "Запрашивать заметку в конце соединения"),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", "NOT: RustDesk sunucu OSS'si bu özelliği içermemektedir."),
|
("server-oss-not-support-tip", "NOT: RustDesk sunucu OSS'si bu özelliği içermemektedir."),
|
||||||
("input note here", "Notu buraya girin"),
|
("input note here", "Notu buraya girin"),
|
||||||
("note-at-conn-end-tip", "Bağlantı bittiğinde not sorulsun"),
|
("note-at-conn-end-tip", "Bağlantı bittiğinde not sorulsun"),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ 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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -729,5 +729,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("server-oss-not-support-tip", ""),
|
("server-oss-not-support-tip", ""),
|
||||||
("input note here", ""),
|
("input note here", ""),
|
||||||
("note-at-conn-end-tip", ""),
|
("note-at-conn-end-tip", ""),
|
||||||
|
("Show terminal extra keys", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user