mirror of
https://github.com/rustdesk/rustdesk.git
synced 2025-06-07 09:52:49 +08:00
parent
ecb70b43df
commit
41da6d552f
@ -2095,19 +2095,28 @@ List<String>? urlLinkToCmdArgs(Uri uri) {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
connectMainDesktop(
|
connectMainDesktop(String id,
|
||||||
String id, {
|
{required bool isFileTransfer,
|
||||||
required bool isFileTransfer,
|
required bool isTcpTunneling,
|
||||||
required bool isTcpTunneling,
|
required bool isRDP,
|
||||||
required bool isRDP,
|
bool? forceRelay,
|
||||||
bool? forceRelay,
|
String? password,
|
||||||
}) async {
|
bool? isSharedPassword}) async {
|
||||||
if (isFileTransfer) {
|
if (isFileTransfer) {
|
||||||
await rustDeskWinManager.newFileTransfer(id, forceRelay: forceRelay);
|
await rustDeskWinManager.newFileTransfer(id,
|
||||||
|
password: password,
|
||||||
|
isSharedPassword: isSharedPassword,
|
||||||
|
forceRelay: forceRelay);
|
||||||
} else if (isTcpTunneling || isRDP) {
|
} else if (isTcpTunneling || isRDP) {
|
||||||
await rustDeskWinManager.newPortForward(id, isRDP, forceRelay: forceRelay);
|
await rustDeskWinManager.newPortForward(id, isRDP,
|
||||||
|
password: password,
|
||||||
|
isSharedPassword: isSharedPassword,
|
||||||
|
forceRelay: forceRelay);
|
||||||
} else {
|
} else {
|
||||||
await rustDeskWinManager.newRemoteDesktop(id, forceRelay: forceRelay);
|
await rustDeskWinManager.newRemoteDesktop(id,
|
||||||
|
password: password,
|
||||||
|
isSharedPassword: isSharedPassword,
|
||||||
|
forceRelay: forceRelay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2115,14 +2124,13 @@ connectMainDesktop(
|
|||||||
/// If [isFileTransfer], starts a session only for file transfer.
|
/// If [isFileTransfer], starts a session only for file transfer.
|
||||||
/// If [isTcpTunneling], starts a session only for tcp tunneling.
|
/// If [isTcpTunneling], starts a session only for tcp tunneling.
|
||||||
/// If [isRDP], starts a session only for rdp.
|
/// If [isRDP], starts a session only for rdp.
|
||||||
connect(
|
connect(BuildContext context, String id,
|
||||||
BuildContext context,
|
{bool isFileTransfer = false,
|
||||||
String id, {
|
bool isTcpTunneling = false,
|
||||||
bool isFileTransfer = false,
|
bool isRDP = false,
|
||||||
bool isTcpTunneling = false,
|
bool forceRelay = false,
|
||||||
bool isRDP = false,
|
String? password,
|
||||||
bool forceRelay = false,
|
bool? isSharedPassword}) async {
|
||||||
}) async {
|
|
||||||
if (id == '') return;
|
if (id == '') return;
|
||||||
if (!isDesktop || desktopType == DesktopType.main) {
|
if (!isDesktop || desktopType == DesktopType.main) {
|
||||||
try {
|
try {
|
||||||
@ -2150,6 +2158,8 @@ connect(
|
|||||||
isFileTransfer: isFileTransfer,
|
isFileTransfer: isFileTransfer,
|
||||||
isTcpTunneling: isTcpTunneling,
|
isTcpTunneling: isTcpTunneling,
|
||||||
isRDP: isRDP,
|
isRDP: isRDP,
|
||||||
|
password: password,
|
||||||
|
isSharedPassword: isSharedPassword,
|
||||||
forceRelay: forceRelay2,
|
forceRelay: forceRelay2,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
@ -2158,6 +2168,8 @@ connect(
|
|||||||
'isFileTransfer': isFileTransfer,
|
'isFileTransfer': isFileTransfer,
|
||||||
'isTcpTunneling': isTcpTunneling,
|
'isTcpTunneling': isTcpTunneling,
|
||||||
'isRDP': isRDP,
|
'isRDP': isRDP,
|
||||||
|
'password': password,
|
||||||
|
'isSharedPassword': isSharedPassword,
|
||||||
'forceRelay': forceRelay,
|
'forceRelay': forceRelay,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -2171,14 +2183,16 @@ connect(
|
|||||||
Navigator.push(
|
Navigator.push(
|
||||||
context,
|
context,
|
||||||
MaterialPageRoute(
|
MaterialPageRoute(
|
||||||
builder: (BuildContext context) => FileManagerPage(id: id),
|
builder: (BuildContext context) => FileManagerPage(
|
||||||
|
id: id, password: password, isSharedPassword: isSharedPassword),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
Navigator.push(
|
Navigator.push(
|
||||||
context,
|
context,
|
||||||
MaterialPageRoute(
|
MaterialPageRoute(
|
||||||
builder: (BuildContext context) => RemotePage(id: id),
|
builder: (BuildContext context) => RemotePage(
|
||||||
|
id: id, password: password, isSharedPassword: isSharedPassword),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_hbb/common.dart';
|
||||||
import 'package:flutter_hbb/consts.dart';
|
import 'package:flutter_hbb/consts.dart';
|
||||||
|
|
||||||
import 'package:flutter_hbb/models/peer_model.dart';
|
import 'package:flutter_hbb/models/peer_model.dart';
|
||||||
@ -188,3 +189,107 @@ class RequestException implements Exception {
|
|||||||
return "RequestException, statusCode: $statusCode, error: $cause";
|
return "RequestException, statusCode: $statusCode, error: $cause";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum ShareRule {
|
||||||
|
read(1),
|
||||||
|
readWrite(2),
|
||||||
|
fullControl(3);
|
||||||
|
|
||||||
|
const ShareRule(this.value);
|
||||||
|
final int value;
|
||||||
|
|
||||||
|
static String desc(int v) {
|
||||||
|
if (v == ShareRule.read.value) {
|
||||||
|
return translate('Read-only');
|
||||||
|
}
|
||||||
|
if (v == ShareRule.readWrite.value) {
|
||||||
|
return translate('Read/Write');
|
||||||
|
}
|
||||||
|
if (v == ShareRule.fullControl.value) {
|
||||||
|
return translate('Full Control');
|
||||||
|
}
|
||||||
|
return v.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
static String shortDesc(int v) {
|
||||||
|
if (v == ShareRule.read.value) {
|
||||||
|
return 'R';
|
||||||
|
}
|
||||||
|
if (v == ShareRule.readWrite.value) {
|
||||||
|
return 'RW';
|
||||||
|
}
|
||||||
|
if (v == ShareRule.fullControl.value) {
|
||||||
|
return 'F';
|
||||||
|
}
|
||||||
|
return v.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
static ShareRule? fromValue(int v) {
|
||||||
|
if (v == ShareRule.read.value) {
|
||||||
|
return ShareRule.read;
|
||||||
|
}
|
||||||
|
if (v == ShareRule.readWrite.value) {
|
||||||
|
return ShareRule.readWrite;
|
||||||
|
}
|
||||||
|
if (v == ShareRule.fullControl.value) {
|
||||||
|
return ShareRule.fullControl;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ShareLevel {
|
||||||
|
user(1),
|
||||||
|
group(2),
|
||||||
|
team(3);
|
||||||
|
|
||||||
|
const ShareLevel(this.value);
|
||||||
|
final int value;
|
||||||
|
|
||||||
|
static String teamName = translate('Everyone');
|
||||||
|
}
|
||||||
|
|
||||||
|
class AbProfile {
|
||||||
|
String guid;
|
||||||
|
String name;
|
||||||
|
String owner;
|
||||||
|
String? note;
|
||||||
|
int rule;
|
||||||
|
|
||||||
|
AbProfile(this.guid, this.name, this.owner, this.note, this.rule);
|
||||||
|
|
||||||
|
AbProfile.fromJson(Map<String, dynamic> json)
|
||||||
|
: guid = json['guid'] ?? '',
|
||||||
|
name = json['name'] ?? '',
|
||||||
|
owner = json['owner'] ?? '',
|
||||||
|
note = json['note'] ?? '',
|
||||||
|
rule = json['rule'] ?? 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
class AbTag {
|
||||||
|
String name;
|
||||||
|
int color;
|
||||||
|
|
||||||
|
AbTag(this.name, this.color);
|
||||||
|
|
||||||
|
AbTag.fromJson(Map<String, dynamic> json)
|
||||||
|
: name = json['name'] ?? '',
|
||||||
|
color = json['color'] ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
|
class AbRulePayload {
|
||||||
|
String guid;
|
||||||
|
int level;
|
||||||
|
String name;
|
||||||
|
int rule;
|
||||||
|
String? group;
|
||||||
|
|
||||||
|
AbRulePayload(this.guid, this.level, this.name, this.rule, {this.group});
|
||||||
|
|
||||||
|
AbRulePayload.fromJson(Map<String, dynamic> json)
|
||||||
|
: guid = json['guid'] ?? '',
|
||||||
|
level = json['level'] ?? 0,
|
||||||
|
name = json['name'] ?? '',
|
||||||
|
rule = json['rule'] ?? 0,
|
||||||
|
group = json['group'];
|
||||||
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -9,9 +9,6 @@ import 'package:flutter_hbb/common/widgets/peer_card.dart';
|
|||||||
Future<List<Peer>> getAllPeers() async {
|
Future<List<Peer>> getAllPeers() async {
|
||||||
Map<String, dynamic> recentPeers = jsonDecode(bind.mainLoadRecentPeersSync());
|
Map<String, dynamic> recentPeers = jsonDecode(bind.mainLoadRecentPeersSync());
|
||||||
Map<String, dynamic> lanPeers = jsonDecode(bind.mainLoadLanPeersSync());
|
Map<String, dynamic> lanPeers = jsonDecode(bind.mainLoadLanPeersSync());
|
||||||
Map<String, dynamic> abPeers = jsonDecode(bind.mainLoadAbSync());
|
|
||||||
Map<String, dynamic> groupPeers = jsonDecode(bind.mainLoadGroupSync());
|
|
||||||
|
|
||||||
Map<String, dynamic> combinedPeers = {};
|
Map<String, dynamic> combinedPeers = {};
|
||||||
|
|
||||||
void mergePeers(Map<String, dynamic> peers) {
|
void mergePeers(Map<String, dynamic> peers) {
|
||||||
@ -42,8 +39,16 @@ Future<List<Peer>> getAllPeers() async {
|
|||||||
|
|
||||||
mergePeers(recentPeers);
|
mergePeers(recentPeers);
|
||||||
mergePeers(lanPeers);
|
mergePeers(lanPeers);
|
||||||
mergePeers(abPeers);
|
for (var p in gFFI.abModel.allPeers()) {
|
||||||
mergePeers(groupPeers);
|
if (!combinedPeers.containsKey(p.id)) {
|
||||||
|
combinedPeers[p.id] = p.toJson();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var p in gFFI.groupModel.peers.map((e) => Peer.copy(e)).toList()) {
|
||||||
|
if (!combinedPeers.containsKey(p.id)) {
|
||||||
|
combinedPeers[p.id] = p.toJson();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
List<Peer> parsedPeers = [];
|
List<Peer> parsedPeers = [];
|
||||||
|
|
||||||
@ -181,7 +186,7 @@ class AutocompletePeerTileState extends State<AutocompletePeerTile> {
|
|||||||
],
|
],
|
||||||
))));
|
))));
|
||||||
final colors = _frontN(widget.peer.tags, 25)
|
final colors = _frontN(widget.peer.tags, 25)
|
||||||
.map((e) => gFFI.abModel.getTagColor(e))
|
.map((e) => gFFI.abModel.getCurrentAbTagColor(e))
|
||||||
.toList();
|
.toList();
|
||||||
return Tooltip(
|
return Tooltip(
|
||||||
message: isMobile
|
message: isMobile
|
||||||
|
@ -2,11 +2,14 @@ import 'dart:async';
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:bot_toast/bot_toast.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/shared_state.dart';
|
import 'package:flutter_hbb/common/shared_state.dart';
|
||||||
import 'package:flutter_hbb/common/widgets/setting_widgets.dart';
|
import 'package:flutter_hbb/common/widgets/setting_widgets.dart';
|
||||||
import 'package:flutter_hbb/consts.dart';
|
import 'package:flutter_hbb/consts.dart';
|
||||||
|
import 'package:flutter_hbb/models/peer_model.dart';
|
||||||
|
import 'package:flutter_hbb/models/peer_tab_model.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:qr_flutter/qr_flutter.dart';
|
import 'package:qr_flutter/qr_flutter.dart';
|
||||||
|
|
||||||
@ -1583,7 +1586,7 @@ customImageQualityDialog(SessionID sessionId, String id, FFI ffi) async {
|
|||||||
msgBoxCommon(ffi.dialogManager, 'Custom Image Quality', content, [btnClose]);
|
msgBoxCommon(ffi.dialogManager, 'Custom Image Quality', content, [btnClose]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void deletePeerConfirmDialog(Function onSubmit, String title) async {
|
void deleteConfirmDialog(Function onSubmit, String title) async {
|
||||||
gFFI.dialogManager.show(
|
gFFI.dialogManager.show(
|
||||||
(setState, close, context) {
|
(setState, close, context) {
|
||||||
submit() async {
|
submit() async {
|
||||||
@ -1631,7 +1634,7 @@ void editAbTagDialog(
|
|||||||
List<dynamic> currentTags, Function(List<dynamic>) onSubmit) {
|
List<dynamic> currentTags, Function(List<dynamic>) onSubmit) {
|
||||||
var isInProgress = false;
|
var isInProgress = false;
|
||||||
|
|
||||||
final tags = List.of(gFFI.abModel.tags);
|
final tags = List.of(gFFI.abModel.currentAbTags);
|
||||||
var selectedTag = currentTags.obs;
|
var selectedTag = currentTags.obs;
|
||||||
|
|
||||||
gFFI.dialogManager.show((setState, close, context) {
|
gFFI.dialogManager.show((setState, close, context) {
|
||||||
@ -1909,3 +1912,178 @@ void showWindowsSessionsDialog(
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void addPeersToAbDialog(
|
||||||
|
List<Peer> peers,
|
||||||
|
) async {
|
||||||
|
Future<bool> addTo(String abname) async {
|
||||||
|
final mapList = peers.map((e) {
|
||||||
|
var json = e.toJson();
|
||||||
|
// remove shared password when add to other address book
|
||||||
|
json.remove('password');
|
||||||
|
if (gFFI.abModel.addressbooks[abname]?.isPersonal() != true) {
|
||||||
|
json.remove('hash');
|
||||||
|
}
|
||||||
|
return json;
|
||||||
|
}).toList();
|
||||||
|
final errMsg = await gFFI.abModel.addPeersTo(mapList, abname);
|
||||||
|
if (errMsg == null) {
|
||||||
|
showToast(translate('Successful'));
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
BotToast.showText(text: errMsg, contentColor: Colors.red);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if only one address book and it is personal, add to it directly
|
||||||
|
if (gFFI.abModel.addressbooks.length == 1 &&
|
||||||
|
gFFI.abModel.current.isPersonal()) {
|
||||||
|
await addTo(gFFI.abModel.currentName.value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
RxBool isInProgress = false.obs;
|
||||||
|
final names = gFFI.abModel.addressBooksCanWrite();
|
||||||
|
RxString currentName = gFFI.abModel.currentName.value.obs;
|
||||||
|
TextEditingController controller = TextEditingController();
|
||||||
|
if (gFFI.peerTabModel.currentTab == PeerTabIndex.ab.index) {
|
||||||
|
names.remove(currentName.value);
|
||||||
|
}
|
||||||
|
if (names.isEmpty) {
|
||||||
|
debugPrint('no address book to add peers to, should not happen');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!names.contains(currentName.value)) {
|
||||||
|
currentName.value = names[0];
|
||||||
|
}
|
||||||
|
gFFI.dialogManager.show((setState, close, context) {
|
||||||
|
submit() async {
|
||||||
|
if (controller.text != gFFI.abModel.translatedName(currentName.value)) {
|
||||||
|
BotToast.showText(
|
||||||
|
text: 'illegal address book name: ${controller.text}',
|
||||||
|
contentColor: Colors.red);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
isInProgress.value = true;
|
||||||
|
if (await addTo(currentName.value)) {
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
isInProgress.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
cancel() {
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
return CustomAlertDialog(
|
||||||
|
title: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Icon(IconFont.addressBook, color: MyTheme.accent),
|
||||||
|
Text(translate('Add to address book')).paddingOnly(left: 10),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
content: Obx(() => Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
DropdownMenu(
|
||||||
|
initialSelection: currentName.value,
|
||||||
|
onSelected: (value) {
|
||||||
|
if (value != null) {
|
||||||
|
currentName.value = value;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dropdownMenuEntries: names
|
||||||
|
.map((e) => DropdownMenuEntry(
|
||||||
|
value: e, label: gFFI.abModel.translatedName(e)))
|
||||||
|
.toList(),
|
||||||
|
inputDecorationTheme: InputDecorationTheme(
|
||||||
|
isDense: true, border: UnderlineInputBorder()),
|
||||||
|
enableFilter: true,
|
||||||
|
controller: controller,
|
||||||
|
),
|
||||||
|
// NOT use Offstage to wrap LinearProgressIndicator
|
||||||
|
isInProgress.value ? const LinearProgressIndicator() : Offstage()
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
actions: [
|
||||||
|
dialogButton(
|
||||||
|
"Cancel",
|
||||||
|
icon: Icon(Icons.close_rounded),
|
||||||
|
onPressed: cancel,
|
||||||
|
isOutline: true,
|
||||||
|
),
|
||||||
|
dialogButton(
|
||||||
|
"OK",
|
||||||
|
icon: Icon(Icons.done_rounded),
|
||||||
|
onPressed: submit,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
onSubmit: submit,
|
||||||
|
onCancel: cancel,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void setSharedAbPasswordDialog(String abName, Peer peer) {
|
||||||
|
TextEditingController controller = TextEditingController(text: peer.password);
|
||||||
|
RxBool isInProgress = false.obs;
|
||||||
|
gFFI.dialogManager.show((setState, close, context) {
|
||||||
|
submit() async {
|
||||||
|
isInProgress.value = true;
|
||||||
|
bool res = await gFFI.abModel
|
||||||
|
.changeSharedPassword(abName, peer.id, controller.text);
|
||||||
|
close();
|
||||||
|
isInProgress.value = false;
|
||||||
|
if (res) {
|
||||||
|
showToast(translate('Successful'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cancel() {
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
return CustomAlertDialog(
|
||||||
|
title: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Icon(Icons.key, color: MyTheme.accent),
|
||||||
|
Text(translate('Set shared password')).paddingOnly(left: 10),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
content: Obx(() => Column(children: [
|
||||||
|
TextField(
|
||||||
|
controller: controller,
|
||||||
|
obscureText: true,
|
||||||
|
autofocus: true,
|
||||||
|
),
|
||||||
|
Row(children: [
|
||||||
|
Icon(Icons.info, color: Colors.amber).marginOnly(right: 4),
|
||||||
|
Text(
|
||||||
|
translate('share_warning_tip'),
|
||||||
|
style: TextStyle(fontSize: 12),
|
||||||
|
)
|
||||||
|
]).marginSymmetric(vertical: 10),
|
||||||
|
// NOT use Offstage to wrap LinearProgressIndicator
|
||||||
|
isInProgress.value ? const LinearProgressIndicator() : Offstage()
|
||||||
|
])),
|
||||||
|
actions: [
|
||||||
|
dialogButton(
|
||||||
|
"Cancel",
|
||||||
|
icon: Icon(Icons.close_rounded),
|
||||||
|
onPressed: cancel,
|
||||||
|
isOutline: true,
|
||||||
|
),
|
||||||
|
dialogButton(
|
||||||
|
"OK",
|
||||||
|
icon: Icon(Icons.done_rounded),
|
||||||
|
onPressed: submit,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
onSubmit: submit,
|
||||||
|
onCancel: cancel,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
@ -83,7 +83,7 @@ class _MyGroupState extends State<MyGroup> {
|
|||||||
alignment: Alignment.topLeft,
|
alignment: Alignment.topLeft,
|
||||||
child: MyGroupPeerView(
|
child: MyGroupPeerView(
|
||||||
menuPadding: widget.menuPadding,
|
menuPadding: widget.menuPadding,
|
||||||
initPeers: gFFI.groupModel.peers)),
|
getInitPeers: () => gFFI.groupModel.peers)),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
@ -115,7 +115,7 @@ class _MyGroupState extends State<MyGroup> {
|
|||||||
alignment: Alignment.topLeft,
|
alignment: Alignment.topLeft,
|
||||||
child: MyGroupPeerView(
|
child: MyGroupPeerView(
|
||||||
menuPadding: widget.menuPadding,
|
menuPadding: widget.menuPadding,
|
||||||
initPeers: gFFI.groupModel.peers)),
|
getInitPeers: () => gFFI.groupModel.peers)),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:bot_toast/bot_toast.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/widgets/dialog.dart';
|
import 'package:flutter_hbb/common/widgets/dialog.dart';
|
||||||
@ -70,12 +71,12 @@ class _PeerCardState extends State<_PeerCard>
|
|||||||
peerTabModel.select(peer);
|
peerTabModel.select(peer);
|
||||||
} else {
|
} else {
|
||||||
if (!isWebDesktop) {
|
if (!isWebDesktop) {
|
||||||
connectInPeerTab(context, peer.id, widget.tab);
|
connectInPeerTab(context, peer, widget.tab);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onDoubleTap: isWebDesktop
|
onDoubleTap: isWebDesktop
|
||||||
? () => connectInPeerTab(context, peer.id, widget.tab)
|
? () => connectInPeerTab(context, peer, widget.tab)
|
||||||
: null,
|
: null,
|
||||||
onLongPress: () {
|
onLongPress: () {
|
||||||
peerTabModel.select(peer);
|
peerTabModel.select(peer);
|
||||||
@ -199,8 +200,9 @@ class _PeerCardState extends State<_PeerCard>
|
|||||||
)
|
)
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
final colors =
|
final colors = _frontN(peer.tags, 25)
|
||||||
_frontN(peer.tags, 25).map((e) => gFFI.abModel.getTagColor(e)).toList();
|
.map((e) => gFFI.abModel.getCurrentAbTagColor(e))
|
||||||
|
.toList();
|
||||||
return Tooltip(
|
return Tooltip(
|
||||||
message: isMobile
|
message: isMobile
|
||||||
? ''
|
? ''
|
||||||
@ -216,6 +218,12 @@ class _PeerCardState extends State<_PeerCard>
|
|||||||
child: child,
|
child: child,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
if (_shouldBuildPasswordIcon(peer))
|
||||||
|
Positioned(
|
||||||
|
top: 2,
|
||||||
|
left: isMobile ? 60 : 50,
|
||||||
|
child: Icon(Icons.key, size: 12),
|
||||||
|
),
|
||||||
if (colors.isNotEmpty)
|
if (colors.isNotEmpty)
|
||||||
Positioned(
|
Positioned(
|
||||||
top: 2,
|
top: 2,
|
||||||
@ -310,14 +318,21 @@ class _PeerCardState extends State<_PeerCard>
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
final colors =
|
final colors = _frontN(peer.tags, 25)
|
||||||
_frontN(peer.tags, 25).map((e) => gFFI.abModel.getTagColor(e)).toList();
|
.map((e) => gFFI.abModel.getCurrentAbTagColor(e))
|
||||||
|
.toList();
|
||||||
return Tooltip(
|
return Tooltip(
|
||||||
message: peer.tags.isNotEmpty
|
message: peer.tags.isNotEmpty
|
||||||
? '${translate('Tags')}: ${peer.tags.join(', ')}'
|
? '${translate('Tags')}: ${peer.tags.join(', ')}'
|
||||||
: '',
|
: '',
|
||||||
child: Stack(children: [
|
child: Stack(children: [
|
||||||
child,
|
child,
|
||||||
|
if (_shouldBuildPasswordIcon(peer))
|
||||||
|
Positioned(
|
||||||
|
top: 4,
|
||||||
|
left: 12,
|
||||||
|
child: Icon(Icons.key, size: 12),
|
||||||
|
),
|
||||||
if (colors.isNotEmpty)
|
if (colors.isNotEmpty)
|
||||||
Positioned(
|
Positioned(
|
||||||
top: 4,
|
top: 4,
|
||||||
@ -401,6 +416,12 @@ class _PeerCardState extends State<_PeerCard>
|
|||||||
onPointerUp: (_) => _showPeerMenu(peer.id),
|
onPointerUp: (_) => _showPeerMenu(peer.id),
|
||||||
child: build_more(context));
|
child: build_more(context));
|
||||||
|
|
||||||
|
bool _shouldBuildPasswordIcon(Peer peer) {
|
||||||
|
if (gFFI.peerTabModel.currentTab != PeerTabIndex.ab.index) return false;
|
||||||
|
if (gFFI.abModel.current.isPersonal()) return false;
|
||||||
|
return peer.password.isNotEmpty;
|
||||||
|
}
|
||||||
|
|
||||||
/// Show the peer menu and handle user's choice.
|
/// Show the peer menu and handle user's choice.
|
||||||
/// User might remove the peer or send a file to the peer.
|
/// User might remove the peer or send a file to the peer.
|
||||||
void _showPeerMenu(String id) async {
|
void _showPeerMenu(String id) async {
|
||||||
@ -431,7 +452,7 @@ abstract class BasePeerCard extends StatelessWidget {
|
|||||||
peer: peer,
|
peer: peer,
|
||||||
tab: tab,
|
tab: tab,
|
||||||
connect: (BuildContext context, String id) =>
|
connect: (BuildContext context, String id) =>
|
||||||
connectInPeerTab(context, id, tab),
|
connectInPeerTab(context, peer, tab),
|
||||||
popupMenuEntryBuilder: _buildPopupMenuEntry,
|
popupMenuEntryBuilder: _buildPopupMenuEntry,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -453,7 +474,6 @@ abstract class BasePeerCard extends StatelessWidget {
|
|||||||
|
|
||||||
MenuEntryBase<String> _connectCommonAction(
|
MenuEntryBase<String> _connectCommonAction(
|
||||||
BuildContext context,
|
BuildContext context,
|
||||||
String id,
|
|
||||||
String title, {
|
String title, {
|
||||||
bool isFileTransfer = false,
|
bool isFileTransfer = false,
|
||||||
bool isTcpTunneling = false,
|
bool isTcpTunneling = false,
|
||||||
@ -467,7 +487,7 @@ abstract class BasePeerCard extends StatelessWidget {
|
|||||||
proc: () {
|
proc: () {
|
||||||
connectInPeerTab(
|
connectInPeerTab(
|
||||||
context,
|
context,
|
||||||
peer.id,
|
peer,
|
||||||
tab,
|
tab,
|
||||||
isFileTransfer: isFileTransfer,
|
isFileTransfer: isFileTransfer,
|
||||||
isTcpTunneling: isTcpTunneling,
|
isTcpTunneling: isTcpTunneling,
|
||||||
@ -480,10 +500,9 @@ abstract class BasePeerCard extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
MenuEntryBase<String> _connectAction(BuildContext context, Peer peer) {
|
MenuEntryBase<String> _connectAction(BuildContext context) {
|
||||||
return _connectCommonAction(
|
return _connectCommonAction(
|
||||||
context,
|
context,
|
||||||
peer.id,
|
|
||||||
(peer.alias.isEmpty
|
(peer.alias.isEmpty
|
||||||
? translate('Connect')
|
? translate('Connect')
|
||||||
: '${translate('Connect')} ${peer.id}'),
|
: '${translate('Connect')} ${peer.id}'),
|
||||||
@ -491,20 +510,18 @@ abstract class BasePeerCard extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
MenuEntryBase<String> _transferFileAction(BuildContext context, String id) {
|
MenuEntryBase<String> _transferFileAction(BuildContext context) {
|
||||||
return _connectCommonAction(
|
return _connectCommonAction(
|
||||||
context,
|
context,
|
||||||
id,
|
|
||||||
translate('Transfer file'),
|
translate('Transfer file'),
|
||||||
isFileTransfer: true,
|
isFileTransfer: true,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
MenuEntryBase<String> _tcpTunnelingAction(BuildContext context, String id) {
|
MenuEntryBase<String> _tcpTunnelingAction(BuildContext context) {
|
||||||
return _connectCommonAction(
|
return _connectCommonAction(
|
||||||
context,
|
context,
|
||||||
id,
|
|
||||||
translate('TCP tunneling'),
|
translate('TCP tunneling'),
|
||||||
isTcpTunneling: true,
|
isTcpTunneling: true,
|
||||||
);
|
);
|
||||||
@ -541,7 +558,7 @@ abstract class BasePeerCard extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
)),
|
)),
|
||||||
proc: () {
|
proc: () {
|
||||||
connectInPeerTab(context, id, tab, isRDP: true);
|
connectInPeerTab(context, peer, tab, isRDP: true);
|
||||||
},
|
},
|
||||||
padding: menuPadding,
|
padding: menuPadding,
|
||||||
dismissOnClicked: true,
|
dismissOnClicked: true,
|
||||||
@ -648,9 +665,8 @@ abstract class BasePeerCard extends StatelessWidget {
|
|||||||
onSubmit: (String newName) async {
|
onSubmit: (String newName) async {
|
||||||
if (newName != oldName) {
|
if (newName != oldName) {
|
||||||
if (tab == PeerTabIndex.ab) {
|
if (tab == PeerTabIndex.ab) {
|
||||||
gFFI.abModel.changeAlias(id: id, alias: newName);
|
await gFFI.abModel.changeAlias(id: id, alias: newName);
|
||||||
await bind.mainSetPeerAlias(id: id, alias: newName);
|
await bind.mainSetPeerAlias(id: id, alias: newName);
|
||||||
gFFI.abModel.pushAb();
|
|
||||||
} else {
|
} else {
|
||||||
await bind.mainSetPeerAlias(id: id, alias: newName);
|
await bind.mainSetPeerAlias(id: id, alias: newName);
|
||||||
showToast(translate('Successful'));
|
showToast(translate('Successful'));
|
||||||
@ -702,11 +718,7 @@ abstract class BasePeerCard extends StatelessWidget {
|
|||||||
await bind.mainLoadLanPeers();
|
await bind.mainLoadLanPeers();
|
||||||
break;
|
break;
|
||||||
case PeerTabIndex.ab:
|
case PeerTabIndex.ab:
|
||||||
gFFI.abModel.deletePeer(id);
|
await gFFI.abModel.deletePeers([id]);
|
||||||
final future = gFFI.abModel.pushAb();
|
|
||||||
if (await bind.mainPeerExists(id: peer.id)) {
|
|
||||||
gFFI.abModel.reSyncToast(future);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case PeerTabIndex.group:
|
case PeerTabIndex.group:
|
||||||
break;
|
break;
|
||||||
@ -716,7 +728,7 @@ abstract class BasePeerCard extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
deletePeerConfirmDialog(onSubmit,
|
deleteConfirmDialog(onSubmit,
|
||||||
'${translate('Delete')} "${peer.alias.isEmpty ? formatID(peer.id) : peer.alias}"?');
|
'${translate('Delete')} "${peer.alias.isEmpty ? formatID(peer.id) : peer.alias}"?');
|
||||||
},
|
},
|
||||||
padding: menuPadding,
|
padding: menuPadding,
|
||||||
@ -732,14 +744,14 @@ abstract class BasePeerCard extends StatelessWidget {
|
|||||||
style: style,
|
style: style,
|
||||||
),
|
),
|
||||||
proc: () async {
|
proc: () async {
|
||||||
bool result = gFFI.abModel.changePassword(id, '');
|
bool succ = await gFFI.abModel.changePersonalHashPassword(id, '');
|
||||||
await bind.mainForgetPassword(id: id);
|
await bind.mainForgetPassword(id: id);
|
||||||
bool toast = false;
|
if (succ) {
|
||||||
if (result) {
|
showToast(translate('Successful'));
|
||||||
toast = tab == PeerTabIndex.ab;
|
} else {
|
||||||
gFFI.abModel.pushAb(toastIfFail: toast, toastIfSucc: toast);
|
BotToast.showText(
|
||||||
|
contentColor: Colors.red, text: translate("Failed"));
|
||||||
}
|
}
|
||||||
if (!toast) showToast(translate('Successful'));
|
|
||||||
},
|
},
|
||||||
padding: menuPadding,
|
padding: menuPadding,
|
||||||
dismissOnClicked: true,
|
dismissOnClicked: true,
|
||||||
@ -824,13 +836,7 @@ abstract class BasePeerCard extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
proc: () {
|
proc: () {
|
||||||
() async {
|
() async {
|
||||||
if (gFFI.abModel.isFull(true)) {
|
addPeersToAbDialog([Peer.copy(peer)]);
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!gFFI.abModel.idContainBy(peer.id)) {
|
|
||||||
gFFI.abModel.addPeer(peer);
|
|
||||||
gFFI.abModel.pushAb();
|
|
||||||
}
|
|
||||||
}();
|
}();
|
||||||
},
|
},
|
||||||
padding: menuPadding,
|
padding: menuPadding,
|
||||||
@ -858,14 +864,14 @@ class RecentPeerCard extends BasePeerCard {
|
|||||||
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
||||||
BuildContext context) async {
|
BuildContext context) async {
|
||||||
final List<MenuEntryBase<String>> menuItems = [
|
final List<MenuEntryBase<String>> menuItems = [
|
||||||
_connectAction(context, peer),
|
_connectAction(context),
|
||||||
_transferFileAction(context, peer.id),
|
_transferFileAction(context),
|
||||||
];
|
];
|
||||||
|
|
||||||
final List favs = (await bind.mainGetFav()).toList();
|
final List favs = (await bind.mainGetFav()).toList();
|
||||||
|
|
||||||
if (isDesktop && peer.platform != kPeerPlatformAndroid) {
|
if (isDesktop && peer.platform != kPeerPlatformAndroid) {
|
||||||
menuItems.add(_tcpTunnelingAction(context, peer.id));
|
menuItems.add(_tcpTunnelingAction(context));
|
||||||
}
|
}
|
||||||
// menuItems.add(await _openNewConnInOptAction(peer.id));
|
// menuItems.add(await _openNewConnInOptAction(peer.id));
|
||||||
menuItems.add(await _forceAlwaysRelayAction(peer.id));
|
menuItems.add(await _forceAlwaysRelayAction(peer.id));
|
||||||
@ -888,9 +894,7 @@ class RecentPeerCard extends BasePeerCard {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (gFFI.userModel.userName.isNotEmpty) {
|
if (gFFI.userModel.userName.isNotEmpty) {
|
||||||
if (!gFFI.abModel.idContainBy(peer.id)) {
|
menuItems.add(_addToAb(peer));
|
||||||
menuItems.add(_addToAb(peer));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
menuItems.add(MenuEntryDivider());
|
menuItems.add(MenuEntryDivider());
|
||||||
@ -915,11 +919,11 @@ class FavoritePeerCard extends BasePeerCard {
|
|||||||
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
||||||
BuildContext context) async {
|
BuildContext context) async {
|
||||||
final List<MenuEntryBase<String>> menuItems = [
|
final List<MenuEntryBase<String>> menuItems = [
|
||||||
_connectAction(context, peer),
|
_connectAction(context),
|
||||||
_transferFileAction(context, peer.id),
|
_transferFileAction(context),
|
||||||
];
|
];
|
||||||
if (isDesktop && peer.platform != kPeerPlatformAndroid) {
|
if (isDesktop && peer.platform != kPeerPlatformAndroid) {
|
||||||
menuItems.add(_tcpTunnelingAction(context, peer.id));
|
menuItems.add(_tcpTunnelingAction(context));
|
||||||
}
|
}
|
||||||
// menuItems.add(await _openNewConnInOptAction(peer.id));
|
// menuItems.add(await _openNewConnInOptAction(peer.id));
|
||||||
menuItems.add(await _forceAlwaysRelayAction(peer.id));
|
menuItems.add(await _forceAlwaysRelayAction(peer.id));
|
||||||
@ -939,9 +943,7 @@ class FavoritePeerCard extends BasePeerCard {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
if (gFFI.userModel.userName.isNotEmpty) {
|
if (gFFI.userModel.userName.isNotEmpty) {
|
||||||
if (!gFFI.abModel.idContainBy(peer.id)) {
|
menuItems.add(_addToAb(peer));
|
||||||
menuItems.add(_addToAb(peer));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
menuItems.add(MenuEntryDivider());
|
menuItems.add(MenuEntryDivider());
|
||||||
@ -966,14 +968,14 @@ class DiscoveredPeerCard extends BasePeerCard {
|
|||||||
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
||||||
BuildContext context) async {
|
BuildContext context) async {
|
||||||
final List<MenuEntryBase<String>> menuItems = [
|
final List<MenuEntryBase<String>> menuItems = [
|
||||||
_connectAction(context, peer),
|
_connectAction(context),
|
||||||
_transferFileAction(context, peer.id),
|
_transferFileAction(context),
|
||||||
];
|
];
|
||||||
|
|
||||||
final List favs = (await bind.mainGetFav()).toList();
|
final List favs = (await bind.mainGetFav()).toList();
|
||||||
|
|
||||||
if (isDesktop && peer.platform != kPeerPlatformAndroid) {
|
if (isDesktop && peer.platform != kPeerPlatformAndroid) {
|
||||||
menuItems.add(_tcpTunnelingAction(context, peer.id));
|
menuItems.add(_tcpTunnelingAction(context));
|
||||||
}
|
}
|
||||||
// menuItems.add(await _openNewConnInOptAction(peer.id));
|
// menuItems.add(await _openNewConnInOptAction(peer.id));
|
||||||
menuItems.add(await _forceAlwaysRelayAction(peer.id));
|
menuItems.add(await _forceAlwaysRelayAction(peer.id));
|
||||||
@ -992,9 +994,7 @@ class DiscoveredPeerCard extends BasePeerCard {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (gFFI.userModel.userName.isNotEmpty) {
|
if (gFFI.userModel.userName.isNotEmpty) {
|
||||||
if (!gFFI.abModel.idContainBy(peer.id)) {
|
menuItems.add(_addToAb(peer));
|
||||||
menuItems.add(_addToAb(peer));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
menuItems.add(MenuEntryDivider());
|
menuItems.add(MenuEntryDivider());
|
||||||
@ -1019,31 +1019,45 @@ class AddressBookPeerCard extends BasePeerCard {
|
|||||||
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
||||||
BuildContext context) async {
|
BuildContext context) async {
|
||||||
final List<MenuEntryBase<String>> menuItems = [
|
final List<MenuEntryBase<String>> menuItems = [
|
||||||
_connectAction(context, peer),
|
_connectAction(context),
|
||||||
_transferFileAction(context, peer.id),
|
_transferFileAction(context),
|
||||||
];
|
];
|
||||||
if (isDesktop && peer.platform != kPeerPlatformAndroid) {
|
if (isDesktop && peer.platform != kPeerPlatformAndroid) {
|
||||||
menuItems.add(_tcpTunnelingAction(context, peer.id));
|
menuItems.add(_tcpTunnelingAction(context));
|
||||||
}
|
}
|
||||||
// menuItems.add(await _openNewConnInOptAction(peer.id));
|
// menuItems.add(await _openNewConnInOptAction(peer.id));
|
||||||
menuItems.add(await _forceAlwaysRelayAction(peer.id));
|
// menuItems.add(await _forceAlwaysRelayAction(peer.id));
|
||||||
if (Platform.isWindows && peer.platform == kPeerPlatformWindows) {
|
if (Platform.isWindows && peer.platform == kPeerPlatformWindows) {
|
||||||
menuItems.add(_rdpAction(context, peer.id));
|
menuItems.add(_rdpAction(context, peer.id));
|
||||||
}
|
}
|
||||||
if (Platform.isWindows) {
|
if (Platform.isWindows) {
|
||||||
menuItems.add(_createShortCutAction(peer.id));
|
menuItems.add(_createShortCutAction(peer.id));
|
||||||
}
|
}
|
||||||
menuItems.add(MenuEntryDivider());
|
if (gFFI.abModel.current.canWrite()) {
|
||||||
menuItems.add(_renameAction(peer.id));
|
menuItems.add(MenuEntryDivider());
|
||||||
if (peer.hash.isNotEmpty) {
|
menuItems.add(_renameAction(peer.id));
|
||||||
menuItems.add(_unrememberPasswordAction(peer.id));
|
if (gFFI.abModel.current.isPersonal() && peer.hash.isNotEmpty) {
|
||||||
|
menuItems.add(_unrememberPasswordAction(peer.id));
|
||||||
|
}
|
||||||
|
if (!gFFI.abModel.current.isPersonal()) {
|
||||||
|
menuItems.add(_changeSharedAbPassword());
|
||||||
|
}
|
||||||
|
if (gFFI.abModel.currentAbTags.isNotEmpty) {
|
||||||
|
menuItems.add(_editTagAction(peer.id));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (gFFI.abModel.tags.isNotEmpty) {
|
final addressbooks = gFFI.abModel.addressBooksCanWrite();
|
||||||
menuItems.add(_editTagAction(peer.id));
|
if (gFFI.peerTabModel.currentTab == PeerTabIndex.ab.index) {
|
||||||
|
addressbooks.remove(gFFI.abModel.currentName.value);
|
||||||
|
}
|
||||||
|
if (addressbooks.isNotEmpty) {
|
||||||
|
menuItems.add(_addToAb(peer));
|
||||||
|
}
|
||||||
|
menuItems.add(_existIn());
|
||||||
|
if (gFFI.abModel.current.canWrite()) {
|
||||||
|
menuItems.add(MenuEntryDivider());
|
||||||
|
menuItems.add(_removeAction(peer.id));
|
||||||
}
|
}
|
||||||
|
|
||||||
menuItems.add(MenuEntryDivider());
|
|
||||||
menuItems.add(_removeAction(peer.id));
|
|
||||||
return menuItems;
|
return menuItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1060,8 +1074,7 @@ class AddressBookPeerCard extends BasePeerCard {
|
|||||||
),
|
),
|
||||||
proc: () {
|
proc: () {
|
||||||
editAbTagDialog(gFFI.abModel.getPeerTags(id), (selectedTag) async {
|
editAbTagDialog(gFFI.abModel.getPeerTags(id), (selectedTag) async {
|
||||||
gFFI.abModel.changeTagForPeer(id, selectedTag);
|
await gFFI.abModel.changeTagForPeers([id], selectedTag);
|
||||||
gFFI.abModel.pushAb();
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
padding: super.menuPadding,
|
padding: super.menuPadding,
|
||||||
@ -1073,6 +1086,52 @@ class AddressBookPeerCard extends BasePeerCard {
|
|||||||
@override
|
@override
|
||||||
Future<String> _getAlias(String id) async =>
|
Future<String> _getAlias(String id) async =>
|
||||||
gFFI.abModel.find(id)?.alias ?? '';
|
gFFI.abModel.find(id)?.alias ?? '';
|
||||||
|
|
||||||
|
MenuEntryBase<String> _changeSharedAbPassword() {
|
||||||
|
return MenuEntryButton<String>(
|
||||||
|
childBuilder: (TextStyle? style) => Text(
|
||||||
|
translate('Set shared password'),
|
||||||
|
style: style,
|
||||||
|
),
|
||||||
|
proc: () {
|
||||||
|
setSharedAbPasswordDialog(gFFI.abModel.currentName.value, peer);
|
||||||
|
},
|
||||||
|
padding: super.menuPadding,
|
||||||
|
dismissOnClicked: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
MenuEntryBase<String> _existIn() {
|
||||||
|
final names = gFFI.abModel.idExistIn(peer.id);
|
||||||
|
final text = names.join(', ');
|
||||||
|
return MenuEntryButton<String>(
|
||||||
|
childBuilder: (TextStyle? style) => Text(
|
||||||
|
translate('Exist in'),
|
||||||
|
style: style,
|
||||||
|
),
|
||||||
|
proc: () {
|
||||||
|
gFFI.dialogManager.show((setState, close, context) {
|
||||||
|
return CustomAlertDialog(
|
||||||
|
title: Text(translate('Exist in')),
|
||||||
|
content: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [Text(text)]),
|
||||||
|
actions: [
|
||||||
|
dialogButton(
|
||||||
|
"OK",
|
||||||
|
icon: Icon(Icons.done_rounded),
|
||||||
|
onPressed: close,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
onSubmit: close,
|
||||||
|
onCancel: close,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
padding: super.menuPadding,
|
||||||
|
dismissOnClicked: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class MyGroupPeerCard extends BasePeerCard {
|
class MyGroupPeerCard extends BasePeerCard {
|
||||||
@ -1087,11 +1146,11 @@ class MyGroupPeerCard extends BasePeerCard {
|
|||||||
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
||||||
BuildContext context) async {
|
BuildContext context) async {
|
||||||
final List<MenuEntryBase<String>> menuItems = [
|
final List<MenuEntryBase<String>> menuItems = [
|
||||||
_connectAction(context, peer),
|
_connectAction(context),
|
||||||
_transferFileAction(context, peer.id),
|
_transferFileAction(context),
|
||||||
];
|
];
|
||||||
if (isDesktop && peer.platform != kPeerPlatformAndroid) {
|
if (isDesktop && peer.platform != kPeerPlatformAndroid) {
|
||||||
menuItems.add(_tcpTunnelingAction(context, peer.id));
|
menuItems.add(_tcpTunnelingAction(context));
|
||||||
}
|
}
|
||||||
// menuItems.add(await _openNewConnInOptAction(peer.id));
|
// menuItems.add(await _openNewConnInOptAction(peer.id));
|
||||||
// menuItems.add(await _forceAlwaysRelayAction(peer.id));
|
// menuItems.add(await _forceAlwaysRelayAction(peer.id));
|
||||||
@ -1107,9 +1166,7 @@ class MyGroupPeerCard extends BasePeerCard {
|
|||||||
// menuItems.add(_unrememberPasswordAction(peer.id));
|
// menuItems.add(_unrememberPasswordAction(peer.id));
|
||||||
// }
|
// }
|
||||||
if (gFFI.userModel.userName.isNotEmpty) {
|
if (gFFI.userModel.userName.isNotEmpty) {
|
||||||
if (!gFFI.abModel.idContainBy(peer.id)) {
|
menuItems.add(_addToAb(peer));
|
||||||
menuItems.add(_addToAb(peer));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return menuItems;
|
return menuItems;
|
||||||
}
|
}
|
||||||
@ -1305,24 +1362,32 @@ class TagPainter extends CustomPainter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void connectInPeerTab(BuildContext context, String id, PeerTabIndex tab,
|
void connectInPeerTab(BuildContext context, Peer peer, PeerTabIndex tab,
|
||||||
{bool isFileTransfer = false,
|
{bool isFileTransfer = false,
|
||||||
bool isTcpTunneling = false,
|
bool isTcpTunneling = false,
|
||||||
bool isRDP = false}) async {
|
bool isRDP = false}) async {
|
||||||
|
var password = '';
|
||||||
|
bool isSharedPassword = false;
|
||||||
if (tab == PeerTabIndex.ab) {
|
if (tab == PeerTabIndex.ab) {
|
||||||
// If recent peer's alias is empty, set it to ab's alias
|
// If recent peer's alias is empty, set it to ab's alias
|
||||||
// Because the platform is not set, it may not take effect, but it is more important not to display if the connection is not successful
|
// Because the platform is not set, it may not take effect, but it is more important not to display if the connection is not successful
|
||||||
Peer? p = gFFI.abModel.find(id);
|
if (peer.alias.isNotEmpty &&
|
||||||
if (p != null &&
|
(await bind.mainGetPeerOption(id: peer.id, key: "alias")).isEmpty) {
|
||||||
p.alias.isNotEmpty &&
|
|
||||||
(await bind.mainGetPeerOption(id: id, key: "alias")).isEmpty) {
|
|
||||||
await bind.mainSetPeerAlias(
|
await bind.mainSetPeerAlias(
|
||||||
id: id,
|
id: peer.id,
|
||||||
alias: p.alias,
|
alias: peer.alias,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (!gFFI.abModel.current.isPersonal()) {
|
||||||
|
if (peer.password.isNotEmpty) {
|
||||||
|
password = peer.password;
|
||||||
|
isSharedPassword = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
connect(context, id,
|
connect(context, peer.id,
|
||||||
|
password: password,
|
||||||
|
isSharedPassword: isSharedPassword,
|
||||||
isFileTransfer: isFileTransfer,
|
isFileTransfer: isFileTransfer,
|
||||||
isTcpTunneling: isTcpTunneling,
|
isTcpTunneling: isTcpTunneling,
|
||||||
isRDP: isRDP);
|
isRDP: isRDP);
|
||||||
|
@ -13,6 +13,7 @@ import 'package:flutter_hbb/desktop/widgets/material_mod_popup_menu.dart'
|
|||||||
as mod_menu;
|
as mod_menu;
|
||||||
import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart';
|
import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart';
|
||||||
import 'package:flutter_hbb/models/ab_model.dart';
|
import 'package:flutter_hbb/models/ab_model.dart';
|
||||||
|
import 'package:flutter_hbb/models/peer_model.dart';
|
||||||
|
|
||||||
import 'package:flutter_hbb/models/peer_tab_model.dart';
|
import 'package:flutter_hbb/models/peer_tab_model.dart';
|
||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
@ -392,21 +393,7 @@ class _PeerTabPageState extends State<PeerTabPage>
|
|||||||
await bind.mainLoadLanPeers();
|
await bind.mainLoadLanPeers();
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
{
|
await gFFI.abModel.deletePeers(peers.map((p) => p.id).toList());
|
||||||
bool hasSynced = false;
|
|
||||||
if (shouldSyncAb()) {
|
|
||||||
for (var p in peers) {
|
|
||||||
if (await bind.mainPeerExists(id: p.id)) {
|
|
||||||
hasSynced = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
gFFI.abModel.deletePeers(peers.map((p) => p.id).toList());
|
|
||||||
final future = gFFI.abModel.pushAb();
|
|
||||||
if (hasSynced) {
|
|
||||||
gFFI.abModel.reSyncToast(future);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -415,7 +402,7 @@ class _PeerTabPageState extends State<PeerTabPage>
|
|||||||
if (model.currentTab != 3) showToast(translate('Successful'));
|
if (model.currentTab != 3) showToast(translate('Successful'));
|
||||||
}
|
}
|
||||||
|
|
||||||
deletePeerConfirmDialog(onSubmit, translate('Delete'));
|
deleteConfirmDialog(onSubmit, translate('Delete'));
|
||||||
},
|
},
|
||||||
child: Tooltip(
|
child: Tooltip(
|
||||||
message: translate('Delete'),
|
message: translate('Delete'),
|
||||||
@ -450,24 +437,18 @@ class _PeerTabPageState extends State<PeerTabPage>
|
|||||||
|
|
||||||
Widget addSelectionToAb() {
|
Widget addSelectionToAb() {
|
||||||
final model = Provider.of<PeerTabModel>(context);
|
final model = Provider.of<PeerTabModel>(context);
|
||||||
|
final addressbooks = gFFI.abModel.addressBooksCanWrite();
|
||||||
|
if (model.currentTab == PeerTabIndex.ab.index) {
|
||||||
|
addressbooks.remove(gFFI.abModel.currentName.value);
|
||||||
|
}
|
||||||
return Offstage(
|
return Offstage(
|
||||||
offstage:
|
offstage: !gFFI.userModel.isLogin || addressbooks.isEmpty,
|
||||||
!gFFI.userModel.isLogin || model.currentTab == PeerTabIndex.ab.index,
|
|
||||||
child: _hoverAction(
|
child: _hoverAction(
|
||||||
context: context,
|
context: context,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
if (gFFI.abModel.isFull(true)) {
|
final peers = model.selectedPeers.map((e) => Peer.copy(e)).toList();
|
||||||
return;
|
addPeersToAbDialog(peers);
|
||||||
}
|
|
||||||
final peers = model.selectedPeers;
|
|
||||||
gFFI.abModel.addPeers(peers);
|
|
||||||
final future = gFFI.abModel.pushAb();
|
|
||||||
model.setMultiSelectionMode(false);
|
model.setMultiSelectionMode(false);
|
||||||
Future.delayed(Duration.zero, () async {
|
|
||||||
await future;
|
|
||||||
await Future.delayed(Duration(seconds: 2)); // toast
|
|
||||||
gFFI.abModel.isFull(true);
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
child: Tooltip(
|
child: Tooltip(
|
||||||
message: translate('Add to address book'),
|
message: translate('Add to address book'),
|
||||||
@ -481,15 +462,14 @@ class _PeerTabPageState extends State<PeerTabPage>
|
|||||||
return Offstage(
|
return Offstage(
|
||||||
offstage: !gFFI.userModel.isLogin ||
|
offstage: !gFFI.userModel.isLogin ||
|
||||||
model.currentTab != PeerTabIndex.ab.index ||
|
model.currentTab != PeerTabIndex.ab.index ||
|
||||||
gFFI.abModel.tags.isEmpty,
|
gFFI.abModel.currentAbTags.isEmpty,
|
||||||
child: _hoverAction(
|
child: _hoverAction(
|
||||||
context: context,
|
context: context,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
editAbTagDialog(List.empty(), (selectedTags) async {
|
editAbTagDialog(List.empty(), (selectedTags) async {
|
||||||
final peers = model.selectedPeers;
|
final peers = model.selectedPeers;
|
||||||
gFFI.abModel.changeTagForPeers(
|
await gFFI.abModel.changeTagForPeers(
|
||||||
peers.map((p) => p.id).toList(), selectedTags);
|
peers.map((p) => p.id).toList(), selectedTags);
|
||||||
gFFI.abModel.pushAb();
|
|
||||||
model.setMultiSelectionMode(false);
|
model.setMultiSelectionMode(false);
|
||||||
showToast(translate('Successful'));
|
showToast(translate('Successful'));
|
||||||
});
|
});
|
||||||
@ -556,7 +536,8 @@ class _PeerTabPageState extends State<PeerTabPage>
|
|||||||
final model = Provider.of<PeerTabModel>(context);
|
final model = Provider.of<PeerTabModel>(context);
|
||||||
return [
|
return [
|
||||||
const PeerSearchBar().marginOnly(right: isMobile ? 0 : 13),
|
const PeerSearchBar().marginOnly(right: isMobile ? 0 : 13),
|
||||||
_createRefresh(index: PeerTabIndex.ab, loading: gFFI.abModel.abLoading),
|
_createRefresh(
|
||||||
|
index: PeerTabIndex.ab, loading: gFFI.abModel.currentAbLoading),
|
||||||
_createRefresh(
|
_createRefresh(
|
||||||
index: PeerTabIndex.group, loading: gFFI.groupModel.groupLoading),
|
index: PeerTabIndex.group, loading: gFFI.groupModel.groupLoading),
|
||||||
Offstage(
|
Offstage(
|
||||||
@ -624,7 +605,8 @@ class _PeerTabPageState extends State<PeerTabPage>
|
|||||||
List<Widget> actions = [
|
List<Widget> actions = [
|
||||||
const PeerSearchBar(),
|
const PeerSearchBar(),
|
||||||
if (model.currentTab == PeerTabIndex.ab.index)
|
if (model.currentTab == PeerTabIndex.ab.index)
|
||||||
_createRefresh(index: PeerTabIndex.ab, loading: gFFI.abModel.abLoading),
|
_createRefresh(
|
||||||
|
index: PeerTabIndex.ab, loading: gFFI.abModel.currentAbLoading),
|
||||||
if (model.currentTab == PeerTabIndex.group.index)
|
if (model.currentTab == PeerTabIndex.group.index)
|
||||||
_createRefresh(
|
_createRefresh(
|
||||||
index: PeerTabIndex.group, loading: gFFI.groupModel.groupLoading),
|
index: PeerTabIndex.group, loading: gFFI.groupModel.groupLoading),
|
||||||
|
@ -196,18 +196,25 @@ class _PeersViewState extends State<_PeersView> with WindowListener {
|
|||||||
// No need to listen the currentTab change event.
|
// No need to listen the currentTab change event.
|
||||||
// Because the currentTab change event will trigger the peers change event,
|
// Because the currentTab change event will trigger the peers change event,
|
||||||
// and the peers change event will trigger _buildPeersView().
|
// and the peers change event will trigger _buildPeersView().
|
||||||
final currentTab = Provider.of<PeerTabModel>(context, listen: false).currentTab;
|
final currentTab =
|
||||||
final hideAbTagsPanel = bind.mainGetLocalOption(key: "hideAbTagsPanel").isNotEmpty;
|
Provider.of<PeerTabModel>(context, listen: false).currentTab;
|
||||||
|
final hideAbTagsPanel =
|
||||||
|
bind.mainGetLocalOption(key: "hideAbTagsPanel").isNotEmpty;
|
||||||
return isDesktop
|
return isDesktop
|
||||||
? Obx(
|
? Obx(
|
||||||
() => SizedBox(
|
() => SizedBox(
|
||||||
width: peerCardUiType.value != PeerUiType.list
|
width: peerCardUiType.value != PeerUiType.list
|
||||||
? 220
|
? 220
|
||||||
: currentTab == PeerTabIndex.group.index || (currentTab == PeerTabIndex.ab.index && !hideAbTagsPanel)
|
: currentTab == PeerTabIndex.group.index ||
|
||||||
? windowWidth - 390 :
|
(currentTab == PeerTabIndex.ab.index &&
|
||||||
windowWidth - 227,
|
!hideAbTagsPanel)
|
||||||
height:
|
? windowWidth - 390
|
||||||
peerCardUiType.value == PeerUiType.grid ? 140 : peerCardUiType.value != PeerUiType.list ? 42 : 45,
|
: windowWidth - 227,
|
||||||
|
height: peerCardUiType.value == PeerUiType.grid
|
||||||
|
? 140
|
||||||
|
: peerCardUiType.value != PeerUiType.list
|
||||||
|
? 42
|
||||||
|
: 45,
|
||||||
child: visibilityChild,
|
child: visibilityChild,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
@ -354,7 +361,7 @@ abstract class BasePeersView extends StatelessWidget {
|
|||||||
final String loadEvent;
|
final String loadEvent;
|
||||||
final PeerFilter? peerFilter;
|
final PeerFilter? peerFilter;
|
||||||
final PeerCardBuilder peerCardBuilder;
|
final PeerCardBuilder peerCardBuilder;
|
||||||
final RxList<Peer>? initPeers;
|
final GetInitPeers? getInitPeers;
|
||||||
|
|
||||||
const BasePeersView({
|
const BasePeersView({
|
||||||
Key? key,
|
Key? key,
|
||||||
@ -362,13 +369,14 @@ abstract class BasePeersView extends StatelessWidget {
|
|||||||
required this.loadEvent,
|
required this.loadEvent,
|
||||||
this.peerFilter,
|
this.peerFilter,
|
||||||
required this.peerCardBuilder,
|
required this.peerCardBuilder,
|
||||||
required this.initPeers,
|
required this.getInitPeers,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return _PeersView(
|
return _PeersView(
|
||||||
peers: Peers(name: name, loadEvent: loadEvent, initPeers: initPeers),
|
peers:
|
||||||
|
Peers(name: name, loadEvent: loadEvent, getInitPeers: getInitPeers),
|
||||||
peerFilter: peerFilter,
|
peerFilter: peerFilter,
|
||||||
peerCardBuilder: peerCardBuilder);
|
peerCardBuilder: peerCardBuilder);
|
||||||
}
|
}
|
||||||
@ -385,7 +393,7 @@ class RecentPeersView extends BasePeersView {
|
|||||||
peer: peer,
|
peer: peer,
|
||||||
menuPadding: menuPadding,
|
menuPadding: menuPadding,
|
||||||
),
|
),
|
||||||
initPeers: null,
|
getInitPeers: null,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -407,7 +415,7 @@ class FavoritePeersView extends BasePeersView {
|
|||||||
peer: peer,
|
peer: peer,
|
||||||
menuPadding: menuPadding,
|
menuPadding: menuPadding,
|
||||||
),
|
),
|
||||||
initPeers: null,
|
getInitPeers: null,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -429,7 +437,7 @@ class DiscoveredPeersView extends BasePeersView {
|
|||||||
peer: peer,
|
peer: peer,
|
||||||
menuPadding: menuPadding,
|
menuPadding: menuPadding,
|
||||||
),
|
),
|
||||||
initPeers: null,
|
getInitPeers: null,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -445,7 +453,7 @@ class AddressBookPeersView extends BasePeersView {
|
|||||||
{Key? key,
|
{Key? key,
|
||||||
EdgeInsets? menuPadding,
|
EdgeInsets? menuPadding,
|
||||||
ScrollController? scrollController,
|
ScrollController? scrollController,
|
||||||
required RxList<Peer> initPeers})
|
required GetInitPeers getInitPeers})
|
||||||
: super(
|
: super(
|
||||||
key: key,
|
key: key,
|
||||||
name: 'address book peer',
|
name: 'address book peer',
|
||||||
@ -456,7 +464,7 @@ class AddressBookPeersView extends BasePeersView {
|
|||||||
peer: peer,
|
peer: peer,
|
||||||
menuPadding: menuPadding,
|
menuPadding: menuPadding,
|
||||||
),
|
),
|
||||||
initPeers: initPeers,
|
getInitPeers: getInitPeers,
|
||||||
);
|
);
|
||||||
|
|
||||||
static bool _hitTag(List<dynamic> selectedTags, List<dynamic> idents) {
|
static bool _hitTag(List<dynamic> selectedTags, List<dynamic> idents) {
|
||||||
@ -486,7 +494,7 @@ class MyGroupPeerView extends BasePeersView {
|
|||||||
{Key? key,
|
{Key? key,
|
||||||
EdgeInsets? menuPadding,
|
EdgeInsets? menuPadding,
|
||||||
ScrollController? scrollController,
|
ScrollController? scrollController,
|
||||||
required RxList<Peer> initPeers})
|
required GetInitPeers getInitPeers})
|
||||||
: super(
|
: super(
|
||||||
key: key,
|
key: key,
|
||||||
name: 'group peer',
|
name: 'group peer',
|
||||||
@ -496,7 +504,7 @@ class MyGroupPeerView extends BasePeersView {
|
|||||||
peer: peer,
|
peer: peer,
|
||||||
menuPadding: menuPadding,
|
menuPadding: menuPadding,
|
||||||
),
|
),
|
||||||
initPeers: initPeers,
|
getInitPeers: getInitPeers,
|
||||||
);
|
);
|
||||||
|
|
||||||
static bool filter(Peer peer) {
|
static bool filter(Peer peer) {
|
||||||
|
@ -359,6 +359,7 @@ class _ConnectionPageState extends State<ConnectionPage>
|
|||||||
platform: '',
|
platform: '',
|
||||||
tags: [],
|
tags: [],
|
||||||
hash: '',
|
hash: '',
|
||||||
|
password: '',
|
||||||
forceAlwaysRelay: false,
|
forceAlwaysRelay: false,
|
||||||
rdpPort: '',
|
rdpPort: '',
|
||||||
rdpUsername: '',
|
rdpUsername: '',
|
||||||
|
@ -800,6 +800,7 @@ class _DesktopHomePageState extends State<DesktopHomePage>
|
|||||||
isFileTransfer: call.arguments['isFileTransfer'],
|
isFileTransfer: call.arguments['isFileTransfer'],
|
||||||
isTcpTunneling: call.arguments['isTcpTunneling'],
|
isTcpTunneling: call.arguments['isTcpTunneling'],
|
||||||
isRDP: call.arguments['isRDP'],
|
isRDP: call.arguments['isRDP'],
|
||||||
|
password: call.arguments['password'],
|
||||||
forceRelay: call.arguments['forceRelay'],
|
forceRelay: call.arguments['forceRelay'],
|
||||||
);
|
);
|
||||||
} else if (call.method == kWindowEventMoveTabToNewWindow) {
|
} else if (call.method == kWindowEventMoveTabToNewWindow) {
|
||||||
|
@ -53,11 +53,13 @@ class FileManagerPage extends StatefulWidget {
|
|||||||
{Key? key,
|
{Key? key,
|
||||||
required this.id,
|
required this.id,
|
||||||
required this.password,
|
required this.password,
|
||||||
|
required this.isSharedPassword,
|
||||||
required this.tabController,
|
required this.tabController,
|
||||||
this.forceRelay})
|
this.forceRelay})
|
||||||
: super(key: key);
|
: super(key: key);
|
||||||
final String id;
|
final String id;
|
||||||
final String? password;
|
final String? password;
|
||||||
|
final bool? isSharedPassword;
|
||||||
final bool? forceRelay;
|
final bool? forceRelay;
|
||||||
final DesktopTabController tabController;
|
final DesktopTabController tabController;
|
||||||
|
|
||||||
@ -84,6 +86,7 @@ class _FileManagerPageState extends State<FileManagerPage>
|
|||||||
_ffi.start(widget.id,
|
_ffi.start(widget.id,
|
||||||
isFileTransfer: true,
|
isFileTransfer: true,
|
||||||
password: widget.password,
|
password: widget.password,
|
||||||
|
isSharedPassword: widget.isSharedPassword,
|
||||||
forceRelay: widget.forceRelay);
|
forceRelay: widget.forceRelay);
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
_ffi.dialogManager
|
_ffi.dialogManager
|
||||||
|
@ -45,6 +45,7 @@ class _FileManagerTabPageState extends State<FileManagerTabPage> {
|
|||||||
key: ValueKey(params['id']),
|
key: ValueKey(params['id']),
|
||||||
id: params['id'],
|
id: params['id'],
|
||||||
password: params['password'],
|
password: params['password'],
|
||||||
|
isSharedPassword: params['isSharedPassword'],
|
||||||
tabController: tabController,
|
tabController: tabController,
|
||||||
forceRelay: params['forceRelay'],
|
forceRelay: params['forceRelay'],
|
||||||
)));
|
)));
|
||||||
@ -74,6 +75,7 @@ class _FileManagerTabPageState extends State<FileManagerTabPage> {
|
|||||||
key: ValueKey(id),
|
key: ValueKey(id),
|
||||||
id: id,
|
id: id,
|
||||||
password: args['password'],
|
password: args['password'],
|
||||||
|
isSharedPassword: args['isSharedPassword'],
|
||||||
tabController: tabController,
|
tabController: tabController,
|
||||||
forceRelay: args['forceRelay'],
|
forceRelay: args['forceRelay'],
|
||||||
)));
|
)));
|
||||||
|
@ -25,19 +25,21 @@ class _PortForward {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class PortForwardPage extends StatefulWidget {
|
class PortForwardPage extends StatefulWidget {
|
||||||
const PortForwardPage(
|
const PortForwardPage({
|
||||||
{Key? key,
|
Key? key,
|
||||||
required this.id,
|
required this.id,
|
||||||
required this.password,
|
required this.password,
|
||||||
required this.tabController,
|
required this.tabController,
|
||||||
required this.isRDP,
|
required this.isRDP,
|
||||||
this.forceRelay})
|
required this.isSharedPassword,
|
||||||
: super(key: key);
|
this.forceRelay,
|
||||||
|
}) : super(key: key);
|
||||||
final String id;
|
final String id;
|
||||||
final String? password;
|
final String? password;
|
||||||
final DesktopTabController tabController;
|
final DesktopTabController tabController;
|
||||||
final bool isRDP;
|
final bool isRDP;
|
||||||
final bool? forceRelay;
|
final bool? forceRelay;
|
||||||
|
final bool? isSharedPassword;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<PortForwardPage> createState() => _PortForwardPageState();
|
State<PortForwardPage> createState() => _PortForwardPageState();
|
||||||
@ -58,6 +60,7 @@ class _PortForwardPageState extends State<PortForwardPage>
|
|||||||
_ffi.start(widget.id,
|
_ffi.start(widget.id,
|
||||||
isPortForward: true,
|
isPortForward: true,
|
||||||
password: widget.password,
|
password: widget.password,
|
||||||
|
isSharedPassword: widget.isSharedPassword,
|
||||||
forceRelay: widget.forceRelay,
|
forceRelay: widget.forceRelay,
|
||||||
isRdp: widget.isRDP);
|
isRdp: widget.isRDP);
|
||||||
Get.put(_ffi, tag: 'pf_${widget.id}');
|
Get.put(_ffi, tag: 'pf_${widget.id}');
|
||||||
|
@ -44,6 +44,7 @@ class _PortForwardTabPageState extends State<PortForwardTabPage> {
|
|||||||
key: ValueKey(params['id']),
|
key: ValueKey(params['id']),
|
||||||
id: params['id'],
|
id: params['id'],
|
||||||
password: params['password'],
|
password: params['password'],
|
||||||
|
isSharedPassword: params['isSharedPassword'],
|
||||||
tabController: tabController,
|
tabController: tabController,
|
||||||
isRDP: isRDP,
|
isRDP: isRDP,
|
||||||
forceRelay: params['forceRelay'],
|
forceRelay: params['forceRelay'],
|
||||||
@ -79,6 +80,7 @@ class _PortForwardTabPageState extends State<PortForwardTabPage> {
|
|||||||
key: ValueKey(args['id']),
|
key: ValueKey(args['id']),
|
||||||
id: id,
|
id: id,
|
||||||
password: args['password'],
|
password: args['password'],
|
||||||
|
isSharedPassword: args['isSharedPassword'],
|
||||||
isRDP: isRDP,
|
isRDP: isRDP,
|
||||||
tabController: tabController,
|
tabController: tabController,
|
||||||
forceRelay: args['forceRelay'],
|
forceRelay: args['forceRelay'],
|
||||||
|
@ -45,6 +45,7 @@ class RemotePage extends StatefulWidget {
|
|||||||
required this.tabController,
|
required this.tabController,
|
||||||
this.switchUuid,
|
this.switchUuid,
|
||||||
this.forceRelay,
|
this.forceRelay,
|
||||||
|
this.isSharedPassword,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
final String id;
|
final String id;
|
||||||
@ -56,6 +57,7 @@ class RemotePage extends StatefulWidget {
|
|||||||
final ToolbarState toolbarState;
|
final ToolbarState toolbarState;
|
||||||
final String? switchUuid;
|
final String? switchUuid;
|
||||||
final bool? forceRelay;
|
final bool? forceRelay;
|
||||||
|
final bool? isSharedPassword;
|
||||||
final SimpleWrapper<State<RemotePage>?> _lastState = SimpleWrapper(null);
|
final SimpleWrapper<State<RemotePage>?> _lastState = SimpleWrapper(null);
|
||||||
final DesktopTabController tabController;
|
final DesktopTabController tabController;
|
||||||
|
|
||||||
@ -111,6 +113,7 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
_ffi.start(
|
_ffi.start(
|
||||||
widget.id,
|
widget.id,
|
||||||
password: widget.password,
|
password: widget.password,
|
||||||
|
isSharedPassword: widget.isSharedPassword,
|
||||||
switchUuid: widget.switchUuid,
|
switchUuid: widget.switchUuid,
|
||||||
forceRelay: widget.forceRelay,
|
forceRelay: widget.forceRelay,
|
||||||
tabWindowId: widget.tabWindowId,
|
tabWindowId: widget.tabWindowId,
|
||||||
|
@ -95,6 +95,7 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
tabController: tabController,
|
tabController: tabController,
|
||||||
switchUuid: params['switch_uuid'],
|
switchUuid: params['switch_uuid'],
|
||||||
forceRelay: params['forceRelay'],
|
forceRelay: params['forceRelay'],
|
||||||
|
isSharedPassword: params['isSharedPassword'],
|
||||||
),
|
),
|
||||||
));
|
));
|
||||||
_update_remote_count();
|
_update_remote_count();
|
||||||
@ -153,6 +154,7 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
tabController: tabController,
|
tabController: tabController,
|
||||||
switchUuid: switchUuid,
|
switchUuid: switchUuid,
|
||||||
forceRelay: args['forceRelay'],
|
forceRelay: args['forceRelay'],
|
||||||
|
isSharedPassword: args['isSharedPassword'],
|
||||||
),
|
),
|
||||||
));
|
));
|
||||||
} else if (call.method == kWindowDisableGrabKeyboard) {
|
} else if (call.method == kWindowDisableGrabKeyboard) {
|
||||||
|
@ -166,6 +166,7 @@ class _ConnectionPageState extends State<ConnectionPage> {
|
|||||||
platform: '',
|
platform: '',
|
||||||
tags: [],
|
tags: [],
|
||||||
hash: '',
|
hash: '',
|
||||||
|
password: '',
|
||||||
forceAlwaysRelay: false,
|
forceAlwaysRelay: false,
|
||||||
rdpPort: '',
|
rdpPort: '',
|
||||||
rdpUsername: '',
|
rdpUsername: '',
|
||||||
|
@ -12,8 +12,12 @@ import '../../common.dart';
|
|||||||
import '../../common/widgets/dialog.dart';
|
import '../../common/widgets/dialog.dart';
|
||||||
|
|
||||||
class FileManagerPage extends StatefulWidget {
|
class FileManagerPage extends StatefulWidget {
|
||||||
FileManagerPage({Key? key, required this.id}) : super(key: key);
|
FileManagerPage(
|
||||||
|
{Key? key, required this.id, this.password, this.isSharedPassword})
|
||||||
|
: super(key: key);
|
||||||
final String id;
|
final String id;
|
||||||
|
final String? password;
|
||||||
|
final bool? isSharedPassword;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<StatefulWidget> createState() => _FileManagerPageState();
|
State<StatefulWidget> createState() => _FileManagerPageState();
|
||||||
@ -68,7 +72,10 @@ class _FileManagerPageState extends State<FileManagerPage> {
|
|||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
gFFI.start(widget.id, isFileTransfer: true);
|
gFFI.start(widget.id,
|
||||||
|
isFileTransfer: true,
|
||||||
|
password: widget.password,
|
||||||
|
isSharedPassword: widget.isSharedPassword);
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
gFFI.dialogManager
|
gFFI.dialogManager
|
||||||
.showLoading(translate('Connecting...'), onCancel: closeConnection);
|
.showLoading(translate('Connecting...'), onCancel: closeConnection);
|
||||||
|
@ -25,9 +25,12 @@ import '../widgets/dialog.dart';
|
|||||||
final initText = '1' * 1024;
|
final initText = '1' * 1024;
|
||||||
|
|
||||||
class RemotePage extends StatefulWidget {
|
class RemotePage extends StatefulWidget {
|
||||||
RemotePage({Key? key, required this.id}) : super(key: key);
|
RemotePage({Key? key, required this.id, this.password, this.isSharedPassword})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
final String id;
|
final String id;
|
||||||
|
final String? password;
|
||||||
|
final bool? isSharedPassword;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<RemotePage> createState() => _RemotePageState();
|
State<RemotePage> createState() => _RemotePageState();
|
||||||
@ -54,7 +57,11 @@ class _RemotePageState extends State<RemotePage> {
|
|||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
gFFI.start(widget.id);
|
gFFI.start(
|
||||||
|
widget.id,
|
||||||
|
password: widget.password,
|
||||||
|
isSharedPassword: widget.isSharedPassword,
|
||||||
|
);
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []);
|
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []);
|
||||||
gFFI.dialogManager
|
gFFI.dialogManager
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -355,10 +355,8 @@ class FfiModel with ChangeNotifier {
|
|||||||
final id = evt['id'];
|
final id = evt['id'];
|
||||||
final password = evt['password'];
|
final password = evt['password'];
|
||||||
if (id != null && password != null) {
|
if (id != null && password != null) {
|
||||||
if (gFFI.abModel
|
gFFI.abModel
|
||||||
.changePassword(id.toString(), password.toString())) {
|
.changePersonalHashPassword(id.toString(), password.toString());
|
||||||
gFFI.abModel.pushAb(toastIfFail: false, toastIfSucc: false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (name == "cm_file_transfer_log") {
|
} else if (name == "cm_file_transfer_log") {
|
||||||
@ -2179,6 +2177,7 @@ class FFI {
|
|||||||
bool isRdp = false,
|
bool isRdp = false,
|
||||||
String? switchUuid,
|
String? switchUuid,
|
||||||
String? password,
|
String? password,
|
||||||
|
bool? isSharedPassword,
|
||||||
bool? forceRelay,
|
bool? forceRelay,
|
||||||
int? tabWindowId,
|
int? tabWindowId,
|
||||||
int? display,
|
int? display,
|
||||||
@ -2212,6 +2211,7 @@ class FFI {
|
|||||||
switchUuid: switchUuid ?? '',
|
switchUuid: switchUuid ?? '',
|
||||||
forceRelay: forceRelay ?? false,
|
forceRelay: forceRelay ?? false,
|
||||||
password: password ?? '',
|
password: password ?? '',
|
||||||
|
isSharedPassword: isSharedPassword ?? false,
|
||||||
);
|
);
|
||||||
} else if (display != null) {
|
} else if (display != null) {
|
||||||
if (displays == null) {
|
if (displays == null) {
|
||||||
|
@ -7,7 +7,8 @@ import 'package:collection/collection.dart';
|
|||||||
|
|
||||||
class Peer {
|
class Peer {
|
||||||
final String id;
|
final String id;
|
||||||
String hash;
|
String hash; // personal ab hash password
|
||||||
|
String password; // shared ab password
|
||||||
String username; // pc username
|
String username; // pc username
|
||||||
String hostname;
|
String hostname;
|
||||||
String platform;
|
String platform;
|
||||||
@ -18,6 +19,7 @@ class Peer {
|
|||||||
String rdpUsername;
|
String rdpUsername;
|
||||||
bool online = false;
|
bool online = false;
|
||||||
String loginName; //login username
|
String loginName; //login username
|
||||||
|
bool? sameServer;
|
||||||
|
|
||||||
String getId() {
|
String getId() {
|
||||||
if (alias != '') {
|
if (alias != '') {
|
||||||
@ -29,6 +31,7 @@ class Peer {
|
|||||||
Peer.fromJson(Map<String, dynamic> json)
|
Peer.fromJson(Map<String, dynamic> json)
|
||||||
: id = json['id'] ?? '',
|
: id = json['id'] ?? '',
|
||||||
hash = json['hash'] ?? '',
|
hash = json['hash'] ?? '',
|
||||||
|
password = json['password'] ?? '',
|
||||||
username = json['username'] ?? '',
|
username = json['username'] ?? '',
|
||||||
hostname = json['hostname'] ?? '',
|
hostname = json['hostname'] ?? '',
|
||||||
platform = json['platform'] ?? '',
|
platform = json['platform'] ?? '',
|
||||||
@ -37,12 +40,14 @@ class Peer {
|
|||||||
forceAlwaysRelay = json['forceAlwaysRelay'] == 'true',
|
forceAlwaysRelay = json['forceAlwaysRelay'] == 'true',
|
||||||
rdpPort = json['rdpPort'] ?? '',
|
rdpPort = json['rdpPort'] ?? '',
|
||||||
rdpUsername = json['rdpUsername'] ?? '',
|
rdpUsername = json['rdpUsername'] ?? '',
|
||||||
loginName = json['loginName'] ?? '';
|
loginName = json['loginName'] ?? '',
|
||||||
|
sameServer = json['same_server'];
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
return <String, dynamic>{
|
return <String, dynamic>{
|
||||||
"id": id,
|
"id": id,
|
||||||
"hash": hash,
|
"hash": hash,
|
||||||
|
"password": password,
|
||||||
"username": username,
|
"username": username,
|
||||||
"hostname": hostname,
|
"hostname": hostname,
|
||||||
"platform": platform,
|
"platform": platform,
|
||||||
@ -52,13 +57,43 @@ class Peer {
|
|||||||
"rdpPort": rdpPort,
|
"rdpPort": rdpPort,
|
||||||
"rdpUsername": rdpUsername,
|
"rdpUsername": rdpUsername,
|
||||||
'loginName': loginName,
|
'loginName': loginName,
|
||||||
|
'same_server': sameServer,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toAbUploadJson() {
|
Map<String, dynamic> toPersonalAbUploadJson(bool includingHash) {
|
||||||
|
var res = <String, dynamic>{
|
||||||
|
"id": id,
|
||||||
|
"username": username,
|
||||||
|
"hostname": hostname,
|
||||||
|
"platform": platform,
|
||||||
|
"alias": alias,
|
||||||
|
"tags": tags,
|
||||||
|
};
|
||||||
|
if (includingHash) {
|
||||||
|
res['hash'] = hash;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toSharedAbUploadJson(bool includingPassword) {
|
||||||
|
var res = <String, dynamic>{
|
||||||
|
"id": id,
|
||||||
|
"username": username,
|
||||||
|
"hostname": hostname,
|
||||||
|
"platform": platform,
|
||||||
|
"alias": alias,
|
||||||
|
"tags": tags,
|
||||||
|
};
|
||||||
|
if (includingPassword) {
|
||||||
|
res['password'] = password;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toSharedAbCacheJson() {
|
||||||
return <String, dynamic>{
|
return <String, dynamic>{
|
||||||
"id": id,
|
"id": id,
|
||||||
"hash": hash,
|
|
||||||
"username": username,
|
"username": username,
|
||||||
"hostname": hostname,
|
"hostname": hostname,
|
||||||
"platform": platform,
|
"platform": platform,
|
||||||
@ -80,6 +115,7 @@ class Peer {
|
|||||||
Peer({
|
Peer({
|
||||||
required this.id,
|
required this.id,
|
||||||
required this.hash,
|
required this.hash,
|
||||||
|
required this.password,
|
||||||
required this.username,
|
required this.username,
|
||||||
required this.hostname,
|
required this.hostname,
|
||||||
required this.platform,
|
required this.platform,
|
||||||
@ -89,12 +125,14 @@ class Peer {
|
|||||||
required this.rdpPort,
|
required this.rdpPort,
|
||||||
required this.rdpUsername,
|
required this.rdpUsername,
|
||||||
required this.loginName,
|
required this.loginName,
|
||||||
|
this.sameServer,
|
||||||
});
|
});
|
||||||
|
|
||||||
Peer.loading()
|
Peer.loading()
|
||||||
: this(
|
: this(
|
||||||
id: '...',
|
id: '...',
|
||||||
hash: '',
|
hash: '',
|
||||||
|
password: '',
|
||||||
username: '...',
|
username: '...',
|
||||||
hostname: '...',
|
hostname: '...',
|
||||||
platform: '...',
|
platform: '...',
|
||||||
@ -108,6 +146,7 @@ class Peer {
|
|||||||
bool equal(Peer other) {
|
bool equal(Peer other) {
|
||||||
return id == other.id &&
|
return id == other.id &&
|
||||||
hash == other.hash &&
|
hash == other.hash &&
|
||||||
|
password == other.password &&
|
||||||
username == other.username &&
|
username == other.username &&
|
||||||
hostname == other.hostname &&
|
hostname == other.hostname &&
|
||||||
platform == other.platform &&
|
platform == other.platform &&
|
||||||
@ -121,33 +160,38 @@ class Peer {
|
|||||||
|
|
||||||
Peer.copy(Peer other)
|
Peer.copy(Peer other)
|
||||||
: this(
|
: this(
|
||||||
id: other.id,
|
id: other.id,
|
||||||
hash: other.hash,
|
hash: other.hash,
|
||||||
username: other.username,
|
password: other.password,
|
||||||
hostname: other.hostname,
|
username: other.username,
|
||||||
platform: other.platform,
|
hostname: other.hostname,
|
||||||
alias: other.alias,
|
platform: other.platform,
|
||||||
tags: other.tags.toList(),
|
alias: other.alias,
|
||||||
forceAlwaysRelay: other.forceAlwaysRelay,
|
tags: other.tags.toList(),
|
||||||
rdpPort: other.rdpPort,
|
forceAlwaysRelay: other.forceAlwaysRelay,
|
||||||
rdpUsername: other.rdpUsername,
|
rdpPort: other.rdpPort,
|
||||||
loginName: other.loginName,
|
rdpUsername: other.rdpUsername,
|
||||||
);
|
loginName: other.loginName,
|
||||||
|
sameServer: other.sameServer);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum UpdateEvent { online, load }
|
enum UpdateEvent { online, load }
|
||||||
|
|
||||||
|
typedef GetInitPeers = RxList<Peer> Function();
|
||||||
|
|
||||||
class Peers extends ChangeNotifier {
|
class Peers extends ChangeNotifier {
|
||||||
final String name;
|
final String name;
|
||||||
final String loadEvent;
|
final String loadEvent;
|
||||||
List<Peer> peers = List.empty(growable: true);
|
List<Peer> peers = List.empty(growable: true);
|
||||||
final RxList<Peer>? initPeers;
|
final GetInitPeers? getInitPeers;
|
||||||
UpdateEvent event = UpdateEvent.load;
|
UpdateEvent event = UpdateEvent.load;
|
||||||
static const _cbQueryOnlines = 'callback_query_onlines';
|
static const _cbQueryOnlines = 'callback_query_onlines';
|
||||||
|
|
||||||
Peers(
|
Peers(
|
||||||
{required this.name, required this.initPeers, required this.loadEvent}) {
|
{required this.name,
|
||||||
peers = initPeers ?? [];
|
required this.getInitPeers,
|
||||||
|
required this.loadEvent}) {
|
||||||
|
peers = getInitPeers?.call() ?? [];
|
||||||
platformFFI.registerEventHandler(_cbQueryOnlines, name, (evt) async {
|
platformFFI.registerEventHandler(_cbQueryOnlines, name, (evt) async {
|
||||||
_updateOnlineState(evt);
|
_updateOnlineState(evt);
|
||||||
});
|
});
|
||||||
@ -198,8 +242,8 @@ class Peers extends ChangeNotifier {
|
|||||||
|
|
||||||
void _updatePeers(Map<String, dynamic> evt) {
|
void _updatePeers(Map<String, dynamic> evt) {
|
||||||
final onlineStates = _getOnlineStates();
|
final onlineStates = _getOnlineStates();
|
||||||
if (initPeers != null) {
|
if (getInitPeers != null) {
|
||||||
peers = initPeers!;
|
peers = getInitPeers?.call() ?? [];
|
||||||
} else {
|
} else {
|
||||||
peers = _decodePeers(evt['peers']);
|
peers = _decodePeers(evt['peers']);
|
||||||
}
|
}
|
||||||
|
@ -194,6 +194,7 @@ class RustDeskMultiWindowManager {
|
|||||||
bool? forceRelay,
|
bool? forceRelay,
|
||||||
String? switchUuid,
|
String? switchUuid,
|
||||||
bool? isRDP,
|
bool? isRDP,
|
||||||
|
bool? isSharedPassword,
|
||||||
}) async {
|
}) async {
|
||||||
var params = {
|
var params = {
|
||||||
"type": type.index,
|
"type": type.index,
|
||||||
@ -207,6 +208,9 @@ class RustDeskMultiWindowManager {
|
|||||||
if (isRDP != null) {
|
if (isRDP != null) {
|
||||||
params['isRDP'] = isRDP;
|
params['isRDP'] = isRDP;
|
||||||
}
|
}
|
||||||
|
if (isSharedPassword != null) {
|
||||||
|
params['isSharedPassword'] = isSharedPassword;
|
||||||
|
}
|
||||||
final msg = jsonEncode(params);
|
final msg = jsonEncode(params);
|
||||||
|
|
||||||
// separate window for file transfer is not supported
|
// separate window for file transfer is not supported
|
||||||
@ -228,6 +232,7 @@ class RustDeskMultiWindowManager {
|
|||||||
Future<MultiWindowCallResult> newRemoteDesktop(
|
Future<MultiWindowCallResult> newRemoteDesktop(
|
||||||
String remoteId, {
|
String remoteId, {
|
||||||
String? password,
|
String? password,
|
||||||
|
bool? isSharedPassword,
|
||||||
String? switchUuid,
|
String? switchUuid,
|
||||||
bool? forceRelay,
|
bool? forceRelay,
|
||||||
}) async {
|
}) async {
|
||||||
@ -239,11 +244,12 @@ class RustDeskMultiWindowManager {
|
|||||||
password: password,
|
password: password,
|
||||||
forceRelay: forceRelay,
|
forceRelay: forceRelay,
|
||||||
switchUuid: switchUuid,
|
switchUuid: switchUuid,
|
||||||
|
isSharedPassword: isSharedPassword,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<MultiWindowCallResult> newFileTransfer(String remoteId,
|
Future<MultiWindowCallResult> newFileTransfer(String remoteId,
|
||||||
{String? password, bool? forceRelay}) async {
|
{String? password, bool? isSharedPassword, bool? forceRelay}) async {
|
||||||
return await newSession(
|
return await newSession(
|
||||||
WindowType.FileTransfer,
|
WindowType.FileTransfer,
|
||||||
kWindowEventNewFileTransfer,
|
kWindowEventNewFileTransfer,
|
||||||
@ -251,11 +257,12 @@ class RustDeskMultiWindowManager {
|
|||||||
_fileTransferWindows,
|
_fileTransferWindows,
|
||||||
password: password,
|
password: password,
|
||||||
forceRelay: forceRelay,
|
forceRelay: forceRelay,
|
||||||
|
isSharedPassword: isSharedPassword,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<MultiWindowCallResult> newPortForward(String remoteId, bool isRDP,
|
Future<MultiWindowCallResult> newPortForward(String remoteId, bool isRDP,
|
||||||
{String? password, bool? forceRelay}) async {
|
{String? password, bool? isSharedPassword, bool? forceRelay}) async {
|
||||||
return await newSession(
|
return await newSession(
|
||||||
WindowType.PortForward,
|
WindowType.PortForward,
|
||||||
kWindowEventNewPortForward,
|
kWindowEventNewPortForward,
|
||||||
@ -264,6 +271,7 @@ class RustDeskMultiWindowManager {
|
|||||||
password: password,
|
password: password,
|
||||||
forceRelay: forceRelay,
|
forceRelay: forceRelay,
|
||||||
isRDP: isRDP,
|
isRDP: isRDP,
|
||||||
|
isSharedPassword: isSharedPassword,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -616,6 +616,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.80.1"
|
version: "1.80.1"
|
||||||
|
flutter_simple_treeview:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: flutter_simple_treeview
|
||||||
|
sha256: ad4978d2668dd078d3a09966832da111bef9102dd636e572c50c80133b7ff4d9
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.0.2"
|
||||||
flutter_svg:
|
flutter_svg:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -104,6 +104,7 @@ dependencies:
|
|||||||
pull_down_button: ^0.9.3
|
pull_down_button: ^0.9.3
|
||||||
device_info_plus: ^9.1.0
|
device_info_plus: ^9.1.0
|
||||||
qr_flutter: ^4.1.0
|
qr_flutter: ^4.1.0
|
||||||
|
flutter_simple_treeview: ^3.0.2
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
icons_launcher: ^2.0.4
|
icons_launcher: ^2.0.4
|
||||||
|
@ -1678,13 +1678,19 @@ pub struct AbPeer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
|
||||||
pub struct Ab {
|
pub struct AbEntry {
|
||||||
#[serde(
|
#[serde(
|
||||||
default,
|
default,
|
||||||
deserialize_with = "deserialize_string",
|
deserialize_with = "deserialize_string",
|
||||||
skip_serializing_if = "String::is_empty"
|
skip_serializing_if = "String::is_empty"
|
||||||
)]
|
)]
|
||||||
pub access_token: String,
|
pub guid: String,
|
||||||
|
#[serde(
|
||||||
|
default,
|
||||||
|
deserialize_with = "deserialize_string",
|
||||||
|
skip_serializing_if = "String::is_empty"
|
||||||
|
)]
|
||||||
|
pub name: String,
|
||||||
#[serde(default, deserialize_with = "deserialize_vec_abpeer")]
|
#[serde(default, deserialize_with = "deserialize_vec_abpeer")]
|
||||||
pub peers: Vec<AbPeer>,
|
pub peers: Vec<AbPeer>,
|
||||||
#[serde(default, deserialize_with = "deserialize_vec_string")]
|
#[serde(default, deserialize_with = "deserialize_vec_string")]
|
||||||
@ -1697,6 +1703,24 @@ pub struct Ab {
|
|||||||
pub tag_colors: String,
|
pub tag_colors: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl AbEntry {
|
||||||
|
pub fn personal(&self) -> bool {
|
||||||
|
self.name == "My address book" || self.name == "Legacy address book"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
|
||||||
|
pub struct Ab {
|
||||||
|
#[serde(
|
||||||
|
default,
|
||||||
|
deserialize_with = "deserialize_string",
|
||||||
|
skip_serializing_if = "String::is_empty"
|
||||||
|
)]
|
||||||
|
pub access_token: String,
|
||||||
|
#[serde(default, deserialize_with = "deserialize_vec_abentry")]
|
||||||
|
pub ab_entries: Vec<AbEntry>,
|
||||||
|
}
|
||||||
|
|
||||||
impl Ab {
|
impl Ab {
|
||||||
fn path() -> PathBuf {
|
fn path() -> PathBuf {
|
||||||
let filename = format!("{}_ab", APP_NAME.read().unwrap().clone());
|
let filename = format!("{}_ab", APP_NAME.read().unwrap().clone());
|
||||||
@ -1709,6 +1733,7 @@ impl Ab {
|
|||||||
let max_len = 64 * 1024 * 1024;
|
let max_len = 64 * 1024 * 1024;
|
||||||
if data.len() > max_len {
|
if data.len() > max_len {
|
||||||
// maxlen of function decompress
|
// maxlen of function decompress
|
||||||
|
log::error!("ab data too large, {} > {}", data.len(), max_len);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if let Ok(data) = symmetric_crypt(&data, true) {
|
if let Ok(data) = symmetric_crypt(&data, true) {
|
||||||
@ -1858,6 +1883,7 @@ deserialize_default!(deserialize_vec_string, Vec<String>);
|
|||||||
deserialize_default!(deserialize_vec_i32_string_i32, Vec<(i32, String, i32)>);
|
deserialize_default!(deserialize_vec_i32_string_i32, Vec<(i32, String, i32)>);
|
||||||
deserialize_default!(deserialize_vec_discoverypeer, Vec<DiscoveryPeer>);
|
deserialize_default!(deserialize_vec_discoverypeer, Vec<DiscoveryPeer>);
|
||||||
deserialize_default!(deserialize_vec_abpeer, Vec<AbPeer>);
|
deserialize_default!(deserialize_vec_abpeer, Vec<AbPeer>);
|
||||||
|
deserialize_default!(deserialize_vec_abentry, Vec<AbEntry>);
|
||||||
deserialize_default!(deserialize_vec_groupuser, Vec<GroupUser>);
|
deserialize_default!(deserialize_vec_groupuser, Vec<GroupUser>);
|
||||||
deserialize_default!(deserialize_vec_grouppeer, Vec<GroupPeer>);
|
deserialize_default!(deserialize_vec_grouppeer, Vec<GroupPeer>);
|
||||||
deserialize_default!(deserialize_keypair, KeyPair);
|
deserialize_default!(deserialize_keypair, KeyPair);
|
||||||
|
13
src/cli.rs
13
src/cli.rs
@ -32,11 +32,14 @@ impl Session {
|
|||||||
password,
|
password,
|
||||||
lc: Default::default(),
|
lc: Default::default(),
|
||||||
};
|
};
|
||||||
session
|
session.lc.write().unwrap().initialize(
|
||||||
.lc
|
id.to_owned(),
|
||||||
.write()
|
ConnType::PORT_FORWARD,
|
||||||
.unwrap()
|
None,
|
||||||
.initialize(id.to_owned(), ConnType::PORT_FORWARD, None);
|
false,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
);
|
||||||
session
|
session
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1151,6 +1151,7 @@ pub struct LoginConfigHandler {
|
|||||||
pub mark_unsupported: Vec<CodecFormat>,
|
pub mark_unsupported: Vec<CodecFormat>,
|
||||||
pub selected_windows_session_id: Option<u32>,
|
pub selected_windows_session_id: Option<u32>,
|
||||||
pub peer_info: Option<PeerInfo>,
|
pub peer_info: Option<PeerInfo>,
|
||||||
|
shared_password: Option<String>, // used to distinguish whether it is connected with a shared password
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Deref for LoginConfigHandler {
|
impl Deref for LoginConfigHandler {
|
||||||
@ -1175,6 +1176,7 @@ impl LoginConfigHandler {
|
|||||||
switch_uuid: Option<String>,
|
switch_uuid: Option<String>,
|
||||||
mut force_relay: bool,
|
mut force_relay: bool,
|
||||||
adapter_luid: Option<i64>,
|
adapter_luid: Option<i64>,
|
||||||
|
shared_password: Option<String>,
|
||||||
) {
|
) {
|
||||||
let mut id = id;
|
let mut id = id;
|
||||||
if id.contains("@") {
|
if id.contains("@") {
|
||||||
@ -1238,6 +1240,7 @@ impl LoginConfigHandler {
|
|||||||
self.switch_uuid = switch_uuid;
|
self.switch_uuid = switch_uuid;
|
||||||
self.adapter_luid = adapter_luid;
|
self.adapter_luid = adapter_luid;
|
||||||
self.selected_windows_session_id = None;
|
self.selected_windows_session_id = None;
|
||||||
|
self.shared_password = shared_password;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Check if the client should auto login.
|
/// Check if the client should auto login.
|
||||||
@ -1827,6 +1830,8 @@ impl LoginConfigHandler {
|
|||||||
platform: pi.platform.clone(),
|
platform: pi.platform.clone(),
|
||||||
};
|
};
|
||||||
let mut config = self.load_config();
|
let mut config = self.load_config();
|
||||||
|
let connected_with_shared_password = self.is_connected_with_shared_password();
|
||||||
|
let old_config_password = config.password.clone();
|
||||||
config.info = serde;
|
config.info = serde;
|
||||||
let password = self.password.clone();
|
let password = self.password.clone();
|
||||||
let password0 = config.password.clone();
|
let password0 = config.password.clone();
|
||||||
@ -1859,15 +1864,17 @@ impl LoginConfigHandler {
|
|||||||
}
|
}
|
||||||
#[cfg(feature = "flutter")]
|
#[cfg(feature = "flutter")]
|
||||||
{
|
{
|
||||||
// sync ab password with PeerConfig password
|
if !connected_with_shared_password && remember && !config.password.is_empty() {
|
||||||
let password = base64::encode(config.password.clone(), base64::Variant::Original);
|
// sync ab password with PeerConfig password
|
||||||
let evt: HashMap<&str, String> = HashMap::from([
|
let password = base64::encode(config.password.clone(), base64::Variant::Original);
|
||||||
("name", "sync_peer_password_to_ab".to_string()),
|
let evt: HashMap<&str, String> = HashMap::from([
|
||||||
("id", self.id.clone()),
|
("name", "sync_peer_password_to_ab".to_string()),
|
||||||
("password", password),
|
("id", self.id.clone()),
|
||||||
]);
|
("password", password),
|
||||||
let evt = serde_json::ser::to_string(&evt).unwrap_or("".to_owned());
|
]);
|
||||||
crate::flutter::push_global_event(crate::flutter::APP_TYPE_MAIN, evt);
|
let evt = serde_json::ser::to_string(&evt).unwrap_or("".to_owned());
|
||||||
|
crate::flutter::push_global_event(crate::flutter::APP_TYPE_MAIN, evt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if config.keyboard_mode.is_empty() {
|
if config.keyboard_mode.is_empty() {
|
||||||
if is_keyboard_mode_supported(
|
if is_keyboard_mode_supported(
|
||||||
@ -1887,12 +1894,27 @@ impl LoginConfigHandler {
|
|||||||
config.keyboard_mode = KeyboardMode::Legacy.to_string();
|
config.keyboard_mode = KeyboardMode::Legacy.to_string();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// keep hash password unchanged if connected with shared password
|
||||||
|
if connected_with_shared_password {
|
||||||
|
config.password = old_config_password;
|
||||||
|
}
|
||||||
// no matter if change, for update file time
|
// no matter if change, for update file time
|
||||||
self.save_config(config);
|
self.save_config(config);
|
||||||
self.supported_encoding = pi.encoding.clone().unwrap_or_default();
|
self.supported_encoding = pi.encoding.clone().unwrap_or_default();
|
||||||
log::info!("peer info supported_encoding:{:?}", self.supported_encoding);
|
log::info!("peer info supported_encoding:{:?}", self.supported_encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_connected_with_shared_password(&self) -> bool {
|
||||||
|
if let Some(shared_password) = self.shared_password.as_ref() {
|
||||||
|
let mut hasher = Sha256::new();
|
||||||
|
hasher.update(shared_password);
|
||||||
|
hasher.update(&self.hash.salt);
|
||||||
|
let res = hasher.finalize();
|
||||||
|
return self.password.clone()[..] == res[..];
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_remote_dir(&self) -> String {
|
pub fn get_remote_dir(&self) -> String {
|
||||||
serde_json::from_str::<HashMap<String, String>>(&self.get_option("remote_dir"))
|
serde_json::from_str::<HashMap<String, String>>(&self.get_option("remote_dir"))
|
||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
@ -2621,15 +2643,17 @@ pub async fn handle_hash(
|
|||||||
let ab = hbb_common::config::Ab::load();
|
let ab = hbb_common::config::Ab::load();
|
||||||
if !access_token.is_empty() && access_token == ab.access_token {
|
if !access_token.is_empty() && access_token == ab.access_token {
|
||||||
let id = lc.read().unwrap().id.clone();
|
let id = lc.read().unwrap().id.clone();
|
||||||
if let Some(p) = ab
|
if let Some(ab) = ab.ab_entries.iter().find(|a| a.personal()) {
|
||||||
.peers
|
if let Some(p) = ab
|
||||||
.iter()
|
.peers
|
||||||
.find_map(|p| if p.id == id { Some(p) } else { None })
|
.iter()
|
||||||
{
|
.find_map(|p| if p.id == id { Some(p) } else { None })
|
||||||
if let Ok(hash) = base64::decode(p.hash.clone(), base64::Variant::Original) {
|
{
|
||||||
if !hash.is_empty() {
|
if let Ok(hash) = base64::decode(p.hash.clone(), base64::Variant::Original) {
|
||||||
password = hash;
|
if !hash.is_empty() {
|
||||||
lc.write().unwrap().save_ab_password_to_recent = true;
|
password = hash;
|
||||||
|
lc.write().unwrap().save_ab_password_to_recent = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1025,6 +1025,7 @@ pub fn session_add(
|
|||||||
switch_uuid: &str,
|
switch_uuid: &str,
|
||||||
force_relay: bool,
|
force_relay: bool,
|
||||||
password: String,
|
password: String,
|
||||||
|
is_shared_password: bool,
|
||||||
) -> ResultType<FlutterSession> {
|
) -> ResultType<FlutterSession> {
|
||||||
let conn_type = if is_file_transfer {
|
let conn_type = if is_file_transfer {
|
||||||
ConnType::FILE_TRANSFER
|
ConnType::FILE_TRANSFER
|
||||||
@ -1050,7 +1051,7 @@ pub fn session_add(
|
|||||||
LocalConfig::set_remote_id(&id);
|
LocalConfig::set_remote_id(&id);
|
||||||
|
|
||||||
let session: Session<FlutterHandler> = Session {
|
let session: Session<FlutterHandler> = Session {
|
||||||
password,
|
password: password.clone(),
|
||||||
server_keyboard_enabled: Arc::new(RwLock::new(true)),
|
server_keyboard_enabled: Arc::new(RwLock::new(true)),
|
||||||
server_file_transfer_enabled: Arc::new(RwLock::new(true)),
|
server_file_transfer_enabled: Arc::new(RwLock::new(true)),
|
||||||
server_clipboard_enabled: Arc::new(RwLock::new(true)),
|
server_clipboard_enabled: Arc::new(RwLock::new(true)),
|
||||||
@ -1068,12 +1069,18 @@ pub fn session_add(
|
|||||||
#[cfg(not(feature = "gpucodec"))]
|
#[cfg(not(feature = "gpucodec"))]
|
||||||
let adapter_luid = None;
|
let adapter_luid = None;
|
||||||
|
|
||||||
|
let shared_password = if is_shared_password {
|
||||||
|
Some(password)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
session.lc.write().unwrap().initialize(
|
session.lc.write().unwrap().initialize(
|
||||||
id.to_owned(),
|
id.to_owned(),
|
||||||
conn_type,
|
conn_type,
|
||||||
switch_uuid,
|
switch_uuid,
|
||||||
force_relay,
|
force_relay,
|
||||||
adapter_luid,
|
adapter_luid,
|
||||||
|
shared_password,
|
||||||
);
|
);
|
||||||
|
|
||||||
let session = Arc::new(session.clone());
|
let session = Arc::new(session.clone());
|
||||||
|
@ -122,6 +122,7 @@ pub fn session_add_sync(
|
|||||||
switch_uuid: String,
|
switch_uuid: String,
|
||||||
force_relay: bool,
|
force_relay: bool,
|
||||||
password: String,
|
password: String,
|
||||||
|
is_shared_password: bool,
|
||||||
) -> SyncReturn<String> {
|
) -> SyncReturn<String> {
|
||||||
if let Err(e) = session_add(
|
if let Err(e) = session_add(
|
||||||
&session_id,
|
&session_id,
|
||||||
@ -132,6 +133,7 @@ pub fn session_add_sync(
|
|||||||
&switch_uuid,
|
&switch_uuid,
|
||||||
force_relay,
|
force_relay,
|
||||||
password,
|
password,
|
||||||
|
is_shared_password,
|
||||||
) {
|
) {
|
||||||
SyncReturn(format!("Failed to add session with id {}, {}", &id, e))
|
SyncReturn(format!("Failed to add session with id {}, {}", &id, e))
|
||||||
} else {
|
} else {
|
||||||
@ -1018,14 +1020,6 @@ pub fn main_load_lan_peers_sync() -> SyncReturn<String> {
|
|||||||
return SyncReturn(serde_json::ser::to_string(&data).unwrap_or("".to_owned()));
|
return SyncReturn(serde_json::ser::to_string(&data).unwrap_or("".to_owned()));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main_load_ab_sync() -> SyncReturn<String> {
|
|
||||||
return SyncReturn(serde_json::to_string(&config::Ab::load()).unwrap_or_default());
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn main_load_group_sync() -> SyncReturn<String> {
|
|
||||||
return SyncReturn(serde_json::to_string(&config::Group::load()).unwrap_or_default());
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn main_load_recent_peers_for_ab(filter: String) -> String {
|
pub fn main_load_recent_peers_for_ab(filter: String) -> String {
|
||||||
let id_filters = serde_json::from_str::<Vec<String>>(&filter).unwrap_or_default();
|
let id_filters = serde_json::from_str::<Vec<String>>(&filter).unwrap_or_default();
|
||||||
let id_filters = if id_filters.is_empty() {
|
let id_filters = if id_filters.is_empty() {
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", "请选择您要连接的会话"),
|
("Please select the session you want to connect to", "请选择您要连接的会话"),
|
||||||
("powered_by_me", "由 RustDesk 提供支持"),
|
("powered_by_me", "由 RustDesk 提供支持"),
|
||||||
("outgoing_only_desk_tip", "当前版本的软件是定制版本。\n您可以连接至其他设备,但是其他设备无法连接至您的设备。"),
|
("outgoing_only_desk_tip", "当前版本的软件是定制版本。\n您可以连接至其他设备,但是其他设备无法连接至您的设备。"),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", "添加共享地址簿"),
|
||||||
|
("Update this address book", "更新此地址簿"),
|
||||||
|
("Delete this address book", "删除此地址簿"),
|
||||||
|
("Share this address book", "共享此地址簿"),
|
||||||
|
("Are you sure you want to delete address book {}?", "确定要删除地址簿{}吗?"),
|
||||||
|
("My address book", "我的地址簿"),
|
||||||
|
("Personal", "个人的"),
|
||||||
|
("Owner", "所有者"),
|
||||||
|
("Set shared password", "设置共享密码"),
|
||||||
|
("Exist in", "存在于"),
|
||||||
|
("Read-only", "只读"),
|
||||||
|
("Read/Write", "读写"),
|
||||||
|
("Full Control", "完全控制"),
|
||||||
|
("full_control_tip", "完全控制赋予其他人与地址簿所有者相同的权限。"),
|
||||||
|
("share_warning_tip", "上述字段是共享的并且对其他人可见。"),
|
||||||
|
("Only show existing", "只显示存在的"),
|
||||||
|
("Everyone", "所有人"),
|
||||||
|
("permission_priority_tip", "优先级:用户>组>所有人"),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", "Vyberte relaci, ke které se chcete připojit"),
|
("Please select the session you want to connect to", "Vyberte relaci, ke které se chcete připojit"),
|
||||||
("powered_by_me", "Poháněno společností RustDesk"),
|
("powered_by_me", "Poháněno společností RustDesk"),
|
||||||
("outgoing_only_desk_tip", "Toto je přizpůsobená edice.\nMůžete se připojit k jiným zařízením, ale jiná zařízení se k vašemu zařízení připojit nemohou."),
|
("outgoing_only_desk_tip", "Toto je přizpůsobená edice.\nMůžete se připojit k jiným zařízením, ale jiná zařízení se k vašemu zařízení připojit nemohou."),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", "Bitte wählen Sie die Sitzung, mit der Sie sich verbinden möchten"),
|
("Please select the session you want to connect to", "Bitte wählen Sie die Sitzung, mit der Sie sich verbinden möchten"),
|
||||||
("powered_by_me", "Unterstützt von RustDesk"),
|
("powered_by_me", "Unterstützt von RustDesk"),
|
||||||
("outgoing_only_desk_tip", "Dies ist eine benutzerdefinierte Ausgabe.\nSie können eine Verbindung zu anderen Geräten herstellen, aber andere Geräte können keine Verbindung zu Ihrem Gerät herstellen."),
|
("outgoing_only_desk_tip", "Dies ist eine benutzerdefinierte Ausgabe.\nSie können eine Verbindung zu anderen Geräten herstellen, aber andere Geräte können keine Verbindung zu Ihrem Gerät herstellen."),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -216,5 +216,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("powered_by_me", "Powered by RustDesk"),
|
("powered_by_me", "Powered by RustDesk"),
|
||||||
("outgoing_only_desk_tip", "This is a customized edition.\nYou can connect to other devices, but other devices cannot connect to your device."),
|
("outgoing_only_desk_tip", "This is a customized edition.\nYou can connect to other devices, but other devices cannot connect to your device."),
|
||||||
("preset_password_warning", "This customized edition comes with a preset password. Anyone knowing this password could gain full control of your device. If you did not expect this, uninstall the software immediately."),
|
("preset_password_warning", "This customized edition comes with a preset password. Anyone knowing this password could gain full control of your device. If you did not expect this, uninstall the software immediately."),
|
||||||
|
("full_control_tip", "Full Control gives others the same permissions as the address book owner."),
|
||||||
|
("share_warning_tip", "The fields above are shared and visible to others."),
|
||||||
|
("permission_priority_tip", "Priority: User > Group > Everyone")
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", "Por favor, seleccione la sesión a la que se desea conectar"),
|
("Please select the session you want to connect to", "Por favor, seleccione la sesión a la que se desea conectar"),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", "لطفاً جلسه ای را که می خواهید به آن متصل شوید انتخاب کنید"),
|
("Please select the session you want to connect to", "لطفاً جلسه ای را که می خواهید به آن متصل شوید انتخاب کنید"),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
828
src/lang/he.rs
828
src/lang/he.rs
@ -1,218 +1,612 @@
|
|||||||
lazy_static::lazy_static! {
|
lazy_static::lazy_static! {
|
||||||
pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||||
[
|
[
|
||||||
("desk_tip", "ניתן לגשת לשולחן העבודה שלך עם מזהה וסיסמה זו."),
|
("Status", ""),
|
||||||
("outgoing_only_desk_tip", "זוהי מהדורה מותאמת אישית.\nניתן להתחבר למכשירים אחרים, אך מכשירים אחרים לא יכולים להתחבר אליך."),
|
("Your Desktop", ""),
|
||||||
("connecting_status", "מתחבר לרשת RustDesk..."),
|
("desk_tip", "ניתן לגשת לשולחן העבודה שלך עם מזהה וסיסמה זו."),
|
||||||
("not_ready_status", "לא מוכן. בדוק את החיבור שלך"),
|
("Password", ""),
|
||||||
("ID/Relay Server", "שרת מזהה/ריליי"),
|
("Ready", ""),
|
||||||
("id_change_tip", "מותרים רק תווים a-z, A-Z, 0-9 ו_ (קו תחתון). האות הראשונה חייבת להיות a-z, A-Z. אורך בין 6 ל-16."),
|
("Established", ""),
|
||||||
("Slogan_tip", "נוצר בלב בעולם הזה הכאוטי!"),
|
("connecting_status", "מתחבר לרשת RustDesk..."),
|
||||||
("Build Date", "תאריך בנייה"),
|
("Enable service", ""),
|
||||||
("Audio Input", "קלט שמע"),
|
("Start service", ""),
|
||||||
("Hardware Codec", "קודק חומרה"),
|
("Service is running", ""),
|
||||||
("ID Server", "שרת מזהה"),
|
("Service is not running", ""),
|
||||||
("Relay Server", "שרת ריליי"),
|
("not_ready_status", "לא מוכן. בדוק את החיבור שלך"),
|
||||||
("API Server", "שרת API"),
|
("Control Remote Desktop", ""),
|
||||||
("invalid_http", "חייב להתחיל עם http:// או https://"),
|
("Transfer file", ""),
|
||||||
("server_not_support", "עדיין לא נתמך על ידי השרת"),
|
("Connect", ""),
|
||||||
("Password Required", "נדרשת סיסמה"),
|
("Recent sessions", ""),
|
||||||
("Wrong Password", "סיסמה שגויה"),
|
("Address book", ""),
|
||||||
("Connection Error", "שגיאת חיבור"),
|
("Confirmation", ""),
|
||||||
("Login Error", "שגיאת התחברות"),
|
("TCP tunneling", ""),
|
||||||
("Show Hidden Files", "הצג קבצים נסתרים"),
|
("Remove", ""),
|
||||||
("Refresh File", "רענן קובץ"),
|
("Refresh random password", ""),
|
||||||
("Remote Computer", "מחשב מרוחק"),
|
("Set your own password", ""),
|
||||||
("Local Computer", "מחשב מקומי"),
|
("Enable keyboard/mouse", ""),
|
||||||
("Confirm Delete", "אשר מחיקה"),
|
("Enable clipboard", ""),
|
||||||
("Multi Select", "בחירה מרובה"),
|
("Enable file transfer", ""),
|
||||||
("Select All", "בחר הכל"),
|
("Enable TCP tunneling", ""),
|
||||||
("Unselect All", "בטל בחירת הכל"),
|
("IP Whitelisting", ""),
|
||||||
("Empty Directory", "תיקייה ריקה"),
|
("ID/Relay Server", "שרת מזהה/ריליי"),
|
||||||
("Custom Image Quality", "איכות תמונה מותאמת אישית"),
|
("Import server config", ""),
|
||||||
("Adjust Window", "התאם חלון"),
|
("Export Server Config", ""),
|
||||||
("Insert Lock", "הוסף נעילה"),
|
("Import server configuration successfully", ""),
|
||||||
("Set Password", "הגדר סיסמה"),
|
("Export server configuration successfully", ""),
|
||||||
("OS Password", "סיסמת מערכת הפעלה"),
|
("Invalid server configuration", ""),
|
||||||
("install_tip", "בגלל UAC, RustDesk לא יכול לפעול כראוי כצד מרוחק בחלק מהמקרים. כדי להימנע מ-UAC, אנא לחץ על הכפתור למטה כדי להתקין את RustDesk במערכת."),
|
("Clipboard is empty", ""),
|
||||||
("config_acc", "כדי לשלוט מרחוק בשולחן העבודה שלך, עליך להעניק ל-RustDesk הרשאות \"נגישות\"."),
|
("Stop service", ""),
|
||||||
("config_screen", "כדי לגשת מרחוק לשולחן העבודה שלך, עליך להעניק ל-RustDesk הרשאות \"הקלטת מסך\"."),
|
("Change ID", ""),
|
||||||
("Installation Path", "נתיב התקנה"),
|
("Your new ID", ""),
|
||||||
("agreement_tip", "על ידי התחלת ההתקנה, אתה מקבל את הסכם הרישיון."),
|
("length %min% to %max%", ""),
|
||||||
("Accept and Install", "קבל והתקן"),
|
("starts with a letter", ""),
|
||||||
("not_close_tcp_tip", "אל תסגור חלון זה בזמן שאתה משתמש במנהרה"),
|
("allowed characters", ""),
|
||||||
("Remote Host", "מארח מרוחק"),
|
("id_change_tip", "מותרים רק תווים a-z, A-Z, 0-9 ו_ (קו תחתון). האות הראשונה חייבת להיות a-z, A-Z. אורך בין 6 ל-16."),
|
||||||
("Remote Port", "פורט מרוחק"),
|
("Website", ""),
|
||||||
("Local Port", "פורט מקומי"),
|
("About", ""),
|
||||||
("Local Address", "כתובת מקומית"),
|
("Slogan_tip", "נוצר בלב בעולם הזה הכאוטי!"),
|
||||||
("Change Local Port", "שנה פורט מקומי"),
|
("Privacy Statement", ""),
|
||||||
("setup_server_tip", "לחיבור מהיר יותר, אנא הגדר שרת משלך"),
|
("Mute", ""),
|
||||||
("Enter Remote ID", "הזן מזהה מרוחק"),
|
("Build Date", "תאריך בנייה"),
|
||||||
("Auto Login", "התחברות אוטומטית (תקפה רק אם הגדרת \"נעל לאחר סיום הסשן\")"),
|
("Version", ""),
|
||||||
("Change Path", "שנה נתיב"),
|
("Home", ""),
|
||||||
("Create Folder", "צור תיקייה"),
|
("Audio Input", "קלט שמע"),
|
||||||
("whitelist_tip", "רק IP ברשימה הלבנה יכול לגשת אלי"),
|
("Enhancements", ""),
|
||||||
("verification_tip", "קוד אימות נשלח לכתובת הדוא\"ל הרשומה, הזן את קוד האימות כדי להמשיך בהתחברות."),
|
("Hardware Codec", "קודק חומרה"),
|
||||||
("whitelist_sep", "מופרד על ידי פסיק, נקודה פסיק, רווחים או שורה חדשה"),
|
("Adaptive bitrate", ""),
|
||||||
("Add Tag", "הוסף תג"),
|
("ID Server", "שרת מזהה"),
|
||||||
("Wrong credentials", "שם משתמש או סיסמה שגויים"),
|
("Relay Server", "שרת ריליי"),
|
||||||
("Edit Tag", "ערוך תג"),
|
("API Server", "שרת API"),
|
||||||
("Forget Password", "שכחת סיסמה"),
|
("invalid_http", "חייב להתחיל עם http:// או https://"),
|
||||||
("Add to Favorites", "הוסף למועדפים"),
|
("Invalid IP", ""),
|
||||||
("Remove from Favorites", "הסר מהמועדפים"),
|
("Invalid format", ""),
|
||||||
("Socks5 Proxy", "פרוקסי Socks5"),
|
("server_not_support", "עדיין לא נתמך על ידי השרת"),
|
||||||
("install_daemon_tip", "לצורך הפעלה בעת הפעלת המחשב, עליך להתקין שירות מערכת."),
|
("Not available", ""),
|
||||||
("Are you sure to close the connection?", "האם אתה בטוח שברצונך לסגור את החיבור?"),
|
("Too frequent", ""),
|
||||||
("One-Finger Tap", "הקשה באצבע אחת"),
|
("Cancel", ""),
|
||||||
("Left Mouse", "עכבר שמאלי"),
|
("Skip", ""),
|
||||||
("One-Long Tap", "הקשה ארוכה באצבע אחת"),
|
("Close", ""),
|
||||||
("Two-Finger Tap", "הקשה בשתי אצבעות"),
|
("Retry", ""),
|
||||||
("Right Mouse", "עכבר ימני"),
|
("OK", ""),
|
||||||
("One-Finger Move", "הזזה באצבע אחת"),
|
("Password Required", "נדרשת סיסמה"),
|
||||||
("Double Tap & Move", "הקשה כפולה והזזה"),
|
("Please enter your password", ""),
|
||||||
("Mouse Drag", "גרירת עכבר"),
|
("Remember password", ""),
|
||||||
("Three-Finger vertically", "שלוש אצבעות אנכית"),
|
("Wrong Password", "סיסמה שגויה"),
|
||||||
("Mouse Wheel", "גלגלת עכבר"),
|
("Do you want to enter again?", ""),
|
||||||
("Two-Finger Move", "הזזה בשתי אצבעות"),
|
("Connection Error", "שגיאת חיבור"),
|
||||||
("Canvas Move", "הזזת בד"),
|
("Error", ""),
|
||||||
("Pinch to Zoom", "צביטה לזום"),
|
("Reset by the peer", ""),
|
||||||
("Canvas Zoom", "זום בד"),
|
("Connecting...", ""),
|
||||||
("Share Screen", "שיתוף מסך"),
|
("Connection in progress. Please wait.", ""),
|
||||||
("Screen Capture", "לכידת מסך"),
|
("Please try 1 minute later", ""),
|
||||||
("Input Control", "בקרת קלט"),
|
("Login Error", "שגיאת התחברות"),
|
||||||
("Audio Capture", "לכידת שמע"),
|
("Successful", ""),
|
||||||
("File Connection", "חיבור קובץ"),
|
("Connected, waiting for image...", ""),
|
||||||
("Screen Connection", "חיבור מסך"),
|
("Name", ""),
|
||||||
("Open System Setting", "פתח הגדרת מערכת"),
|
("Type", ""),
|
||||||
("android_input_permission_tip1", "כדי שמכשיר מרוחק יוכל לשלוט במכשיר האנדרואיד שלך באמצעות עכבר או מגע, עליך לאפשר ל-RustDesk להשתמש בשירות \"נגישות\"."),
|
("Modified", ""),
|
||||||
("android_input_permission_tip2", "אנא עבור לדף ההגדרות של המערכת הבא, מצא והכנס ל[שירותים מותקנים], הפעל את שירות [RustDesk Input]."),
|
("Size", ""),
|
||||||
("android_new_connection_tip", "בקשת שליטה חדשה התקבלה, שרוצה לשלוט במכשירך הנוכחי."),
|
("Show Hidden Files", "הצג קבצים נסתרים"),
|
||||||
("android_service_will_start_tip", "הפעלת \"לכידת מסך\" תתחיל אוטומטית את השירות, מאפשרת למכשירים אחרים לבקש חיבור למכשיר שלך."),
|
("Receive", ""),
|
||||||
("android_stop_service_tip", "סגירת השירות תסגור אוטומטית את כל החיבורים המוקמים."),
|
("Send", ""),
|
||||||
("android_version_audio_tip", "גרסת האנדרואיד הנוכחית אינה תומכת בלכידת שמע, אנא שדרג לאנדרואיד 10 או גבוה יותר."),
|
("Refresh File", "רענן קובץ"),
|
||||||
("android_start_service_tip", "הקש על [התחל שירות] או אפשר הרשאת [לכידת מסך] כדי להתחיל את שירות שיתוף המסך."),
|
("Local", ""),
|
||||||
("android_permission_may_not_change_tip", "הרשאות עבור חיבורים שנוצרו עשויות לא להשתנות מייד עד להתחברות מחדש."),
|
("Remote", ""),
|
||||||
("doc_mac_permission", "https://rustdesk.com/docs/en/client/mac/#enable-permissions"),
|
("Remote Computer", "מחשב מרוחק"),
|
||||||
("Ignore Battery Optimizations", "התעלם מאופטימיזציות סוללה"),
|
("Local Computer", "מחשב מקומי"),
|
||||||
("android_open_battery_optimizations_tip", "אם ברצונך לבטל תכונה זו, אנא עבור לדף ההגדרות של יישום RustDesk הבא, מצא והכנס ל[סוללה], הסר את הסימון מ-[לא מוגבל]"),
|
("Confirm Delete", "אשר מחיקה"),
|
||||||
("remote_restarting_tip", "המכשיר המרוחק מתחיל מחדש, אנא סגור את תיבת ההודעה הזו והתחבר מחדש עם סיסמה קבועה לאחר זמן מה"),
|
("Delete", ""),
|
||||||
("Exit Fullscreen", "יציאה ממסך מלא"),
|
("Properties", ""),
|
||||||
("Mobile Actions", "פעולות ניידות"),
|
("Multi Select", "בחירה מרובה"),
|
||||||
("Select Monitor", "בחר מסך"),
|
("Select All", "בחר הכל"),
|
||||||
("Control Actions", "פעולות בקרה"),
|
("Unselect All", "בטל בחירת הכל"),
|
||||||
("Display Settings", "הגדרות תצוגה"),
|
("Empty Directory", "תיקייה ריקה"),
|
||||||
("Image Quality", "איכות תמונה"),
|
("Not an empty directory", ""),
|
||||||
("Scroll Style", "סגנון גלילה"),
|
("Are you sure you want to delete this file?", ""),
|
||||||
("Show Toolbar", "הצג סרגל כלים"),
|
("Are you sure you want to delete this empty directory?", ""),
|
||||||
("Hide Toolbar", "הסתר סרגל כלים"),
|
("Are you sure you want to delete the file of this directory?", ""),
|
||||||
("Direct Connection", "חיבור ישיר"),
|
("Do this for all conflicts", ""),
|
||||||
("Relay Connection", "חיבור ריליי"),
|
("This is irreversible!", ""),
|
||||||
("Secure Connection", "חיבור מאובטח"),
|
("Deleting", ""),
|
||||||
("Insecure Connection", "חיבור לא מאובטח"),
|
("files", ""),
|
||||||
("Dark Theme", "ערכת נושא כהה"),
|
("Waiting", ""),
|
||||||
("Light Theme", "ערכת נושא בהירה"),
|
("Finished", ""),
|
||||||
("Follow System", "עקוב אחר המערכת"),
|
("Speed", ""),
|
||||||
("Unlock Security Settings", "פתח הגדרות אבטחה"),
|
("Custom Image Quality", "איכות תמונה מותאמת אישית"),
|
||||||
("Unlock Network Settings", "פתח הגדרות רשת"),
|
("Privacy mode", ""),
|
||||||
("Direct IP Access", "גישה ישירה ל-IP"),
|
("Block user input", ""),
|
||||||
("Audio Input Device", "מכשיר קלט שמע"),
|
("Unblock user input", ""),
|
||||||
("Use IP Whitelisting", "השתמש ברשימת לבנה של IP"),
|
("Adjust Window", "התאם חלון"),
|
||||||
("Pin Toolbar", "נעץ סרגל כלים"),
|
("Original", ""),
|
||||||
("Unpin Toolbar", "הסר נעיצת סרגל כלים"),
|
("Shrink", ""),
|
||||||
("elevated_foreground_window_tip", "החלון הנוכחי של שולחן העבודה המרוחק דורש הרשאה גבוהה יותר לפעולה, לכן אי אפשר להשתמש בעכבר ובמקלדת באופן זמני. תוכל לבקש מהמשתמש המרוחק למזער את החלון הנוכחי, או ללחוץ על כפתור ההגבהה בחלון ניהול החיבור. כדי להימנע מבעיה זו, מומלץ להתקין את התוכנה במכשיר המרוחק."),
|
("Stretch", ""),
|
||||||
("Keyboard Settings", "הגדרות מקלדת"),
|
("Scrollbar", ""),
|
||||||
("Full Access", "גישה מלאה"),
|
("ScrollAuto", ""),
|
||||||
("Screen Share", "שיתוף מסך"),
|
("Good image quality", ""),
|
||||||
("JumpLink", "הצג"),
|
("Balanced", ""),
|
||||||
("Please Select the screen to be shared(Operate on the peer side).", "אנא בחר את המסך לשיתוף (פעולה בצד העמית)."),
|
("Optimize reaction time", ""),
|
||||||
("One-time Password", "סיסמה חד-פעמית"),
|
("Custom", ""),
|
||||||
("hide_cm_tip", "אפשר הסתרה רק אם מקבלים סשנים דרך סיסמה ומשתמשים בסיסמה קבועה"),
|
("Show remote cursor", ""),
|
||||||
("wayland_experiment_tip", "תמיכה ב-Wayland נמצאת בשלב ניסיוני, אנא השתמש ב-X11 אם אתה זקוק לגישה לא מלווה."),
|
("Show quality monitor", ""),
|
||||||
("software_render_tip", "אם אתה משתמש בכרטיס גרפיקה של Nvidia תחת Linux וחלון המרחוק נסגר מיד לאחר החיבור, החלפה למנהל ההתקן הפתוח Nouveau ובחירה בשימוש בעיבוד תוכנה עשויה לעזור. נדרשת הפעלה מחדש של התוכנה."),
|
("Disable clipboard", ""),
|
||||||
("config_input", "כדי לשלוט בשולחן העבודה המרוחק באמצעות מקלדת, עליך להעניק ל-RustDesk הרשאות \"מעקב אחרי קלט\"."),
|
("Lock after session end", ""),
|
||||||
("config_microphone", "כדי לדבר מרחוק, עליך להעניק ל-RustDesk הרשאות \"הקלטת שמע\"."),
|
("Insert", ""),
|
||||||
("request_elevation_tip", "ניתן גם לבקש הגבהה אם יש מישהו בצד המרוחק."),
|
("Insert Lock", "הוסף נעילה"),
|
||||||
("Elevation Error", "שגיאת הגבהה"),
|
("Refresh", ""),
|
||||||
("still_click_uac_tip", "עדיין דורש מהמשתמש המרוחק ללחוץ OK בחלון ה-UAC של הרצת RustDesk."),
|
("ID does not exist", ""),
|
||||||
("Request Elevation", "בקש הגבהה"),
|
("Failed to connect to rendezvous server", ""),
|
||||||
("wait_accept_uac_tip", "אנא המתן למשתמש המרוחק לקבל את דיאלוג ה-UAC."),
|
("Please try later", ""),
|
||||||
("Switch Sides", "החלף צדדים"),
|
("Remote desktop is offline", ""),
|
||||||
("Default View Style", "סגנון תצוגה ברירת מחדל"),
|
("Key mismatch", ""),
|
||||||
("Default Scroll Style", "סגנון גלילה ברירת מחדל"),
|
("Timeout", ""),
|
||||||
("Default Image Quality", "איכות תמונה ברירת מחדל"),
|
("Failed to connect to relay server", ""),
|
||||||
("Default Codec", "קודק ברירת מחדל"),
|
("Failed to connect via rendezvous server", ""),
|
||||||
("Other Default Options", "אפשרויות ברירת מחדל אחרות"),
|
("Failed to connect via relay server", ""),
|
||||||
("relay_hint_tip", "ייתכן שלא ניתן להתחבר ישירות; ניתן לנסות להתחבר דרך ריליי. בנוסף, אם ברצונך להשתמש בריליי בניסיון הראשון שלך, תוכל להוסיף את הסיומת \"/r\" למזהה או לבחור באפשרות \"התחבר תמיד דרך ריליי\" בכרטיס של הסשנים האחרונים אם קיים."),
|
("Failed to make direct connection to remote desktop", ""),
|
||||||
("RDP Settings", "הגדרות RDP"),
|
("Set Password", "הגדר סיסמה"),
|
||||||
("New Connection", "חיבור חדש"),
|
("OS Password", "סיסמת מערכת הפעלה"),
|
||||||
("Your Device", "המכשיר שלך"),
|
("install_tip", "בגלל UAC, RustDesk לא יכול לפעול כראוי כצד מרוחק בחלק מהמקרים. כדי להימנע מ-UAC, אנא לחץ על הכפתור למטה כדי להתקין את RustDesk במערכת."),
|
||||||
("empty_recent_tip", "אופס, אין סשנים אחרונים!\nהגיע הזמן לתכנן חדש."),
|
("Click to upgrade", ""),
|
||||||
("empty_favorite_tip", "עדיין אין עמיתים מועדפים?\nבוא נמצא מישהו להתחבר אליו ונוסיף אותו למועדפים!"),
|
("Click to download", ""),
|
||||||
("empty_lan_tip", "אוי לא, נראה שעדיין לא גילינו עמיתים."),
|
("Click to update", ""),
|
||||||
("empty_address_book_tip", "אוי ואבוי, נראה שכרגע אין עמיתים בספר הכתובות שלך."),
|
("Configure", ""),
|
||||||
("Empty Username", "שם משתמש ריק"),
|
("config_acc", "כדי לשלוט מרחוק בשולחן העבודה שלך, עליך להעניק ל-RustDesk הרשאות \"נגישות\"."),
|
||||||
("Empty Password", "סיסמה ריקה"),
|
("config_screen", "כדי לגשת מרחוק לשולחן העבודה שלך, עליך להעניק ל-RustDesk הרשאות \"הקלטת מסך\"."),
|
||||||
("identical_file_tip", "קובץ זה זהה לקובץ של העמית."),
|
("Installing ...", ""),
|
||||||
("show_monitors_tip", "הצג מסכים בסרגל כלים"),
|
("Install", ""),
|
||||||
("View Mode", "מצב תצוגה"),
|
("Installation", ""),
|
||||||
("login_linux_tip", "עליך להתחבר לחשבון Linux מרוחק כדי לאפשר פעילות שולחן עבודה X"),
|
("Installation Path", "נתיב התקנה"),
|
||||||
("verify_rustdesk_password_tip", "אמת סיסמת RustDesk"),
|
("Create start menu shortcuts", ""),
|
||||||
("remember_account_tip", "זכור חשבון זה"),
|
("Create desktop icon", ""),
|
||||||
("os_account_desk_tip", "חשבון זה משמש להתחברות למערכת ההפעלה המרוחקת ולאפשר פעילות שולחן עבודה במצב לא מקוון"),
|
("agreement_tip", "על ידי התחלת ההתקנה, אתה מקבל את הסכם הרישיון."),
|
||||||
("OS Account", "חשבון מערכת הפעלה"),
|
("Accept and Install", "קבל והתקן"),
|
||||||
("another_user_login_title_tip", "משתמש אחר כבר התחבר"),
|
("End-user license agreement", ""),
|
||||||
("another_user_login_text_tip", "נתק"),
|
("Generating ...", ""),
|
||||||
("xorg_not_found_title_tip", "Xorg לא נמצא"),
|
("Your installation is lower version.", ""),
|
||||||
("xorg_not_found_text_tip", "אנא התקן Xorg"),
|
("not_close_tcp_tip", "אל תסגור חלון זה בזמן שאתה משתמש במנהרה"),
|
||||||
("no_desktop_title_tip", "אין שולחן עבודה זמין"),
|
("Listening ...", ""),
|
||||||
("no_desktop_text_tip", "אנא התקן שולחן עבודה GNOME"),
|
("Remote Host", "מארח מרוחק"),
|
||||||
("System Sound", "צליל מערכת"),
|
("Remote Port", "פורט מרוחק"),
|
||||||
("Copy Fingerprint", "העתק טביעת אצבע"),
|
("Action", ""),
|
||||||
("no fingerprints", "אין טביעות אצבע"),
|
("Add", ""),
|
||||||
("resolution_original_tip", "רזולוציה מקורית"),
|
("Local Port", "פורט מקומי"),
|
||||||
("resolution_fit_local_tip", "התאם לרזולוציה מקומית"),
|
("Local Address", "כתובת מקומית"),
|
||||||
("resolution_custom_tip", "רזולוציה מותאמת אישית"),
|
("Change Local Port", "שנה פורט מקומי"),
|
||||||
("Accept and Elevate", "קבל והגבה"),
|
("setup_server_tip", "לחיבור מהיר יותר, אנא הגדר שרת משלך"),
|
||||||
("accept_and_elevate_btn_tooltip", "קבל את החיבור והגבה הרשאות UAC."),
|
("Too short, at least 6 characters.", ""),
|
||||||
("clipboard_wait_response_timeout_tip", "המתנה לתגובת העתקה הסתיימה בזמן."),
|
("The confirmation is not identical.", ""),
|
||||||
("logout_tip", "האם אתה בטוח שברצונך להתנתק?"),
|
("Permissions", ""),
|
||||||
("exceed_max_devices", "הגעת למספר המקסימלי של מכשירים שניתן לנהל."),
|
("Accept", ""),
|
||||||
("Change Password", "שנה סיסמה"),
|
("Dismiss", ""),
|
||||||
("Refresh Password", "רענן סיסמה"),
|
("Disconnect", ""),
|
||||||
("Grid View", "תצוגת רשת"),
|
("Enable file copy and paste", ""),
|
||||||
("List View", "תצוגת רשימה"),
|
("Connected", ""),
|
||||||
("Toggle Tags", "החלף תגיות"),
|
("Direct and encrypted connection", ""),
|
||||||
("pull_ab_failed_tip", "נכשל ברענון ספר הכתובות"),
|
("Relayed and encrypted connection", ""),
|
||||||
("push_ab_failed_tip", "נכשל בסנכרון ספר הכתובות לשרת"),
|
("Direct and unencrypted connection", ""),
|
||||||
("synced_peer_readded_tip", "המכשירים שהיו נוכחים בסשנים האחרונים יסונכרנו בחזרה לספר הכתובות."),
|
("Relayed and unencrypted connection", ""),
|
||||||
("Change Color", "שנה צבע"),
|
("Enter Remote ID", "הזן מזהה מרוחק"),
|
||||||
("Primary Color", "צבע עיקרי"),
|
("Enter your password", ""),
|
||||||
("HSV Color", "צבע HSV"),
|
("Logging in...", ""),
|
||||||
("Installation Successful!", "ההתקנה הצליחה!"),
|
("Enable RDP session sharing", ""),
|
||||||
("scam_title", "ייתכן שאתה נפלת להונאה!"),
|
("Auto Login", "התחברות אוטומטית (תקפה רק אם הגדרת \"נעל לאחר סיום הסשן\")"),
|
||||||
("scam_text1", "אם אתה בשיחת טלפון עם מישהו שאינך מכיר ואינך סומך עליו שביקש ממך להשתמש ב-RustDesk ולהתחיל את השירות, אל תמשיך ונתק מיד."),
|
("Enable direct IP access", ""),
|
||||||
("scam_text2", "סביר להניח שמדובר בהונאה שמנסה לגנוב ממך כסף או מידע פרטי אחר."),
|
("Rename", ""),
|
||||||
("auto_disconnect_option_tip", "סגור באופן אוטומטי סשנים נכנסים במקרה של חוסר פעילות של המשתמש"),
|
("Space", ""),
|
||||||
("Connection failed due to inactivity", "התנתקות אוטומטית בגלל חוסר פעילות"),
|
("Create desktop shortcut", ""),
|
||||||
("upgrade_rustdesk_server_pro_to_{}_tip", "אנא שדרג את RustDesk Server Pro לגרסה {} או חדשה יותר!"),
|
("Change Path", "שנה נתיב"),
|
||||||
("pull_group_failed_tip", "נכשל ברענון קבוצה"),
|
("Create Folder", "צור תיקייה"),
|
||||||
("doc_fix_wayland", "https://rustdesk.com/docs/en/client/linux/#x11-required"),
|
("Please enter the folder name", ""),
|
||||||
("display_is_plugged_out_msg", "המסך הופסק, החלף למסך הראשון."),
|
("Fix it", ""),
|
||||||
("elevated_switch_display_msg", "מעבר למסך הראשי מכיוון שתמיכה במסכים מרובים אינה נתמכת במצב משתמש מוגבה."),
|
("Warning", ""),
|
||||||
("selinux_tip", "SELinux מופעל במכשיר שלך, מה שעלול למנוע מ-RustDesk לפעול כראוי כצד הנשלט."),
|
("Login screen using Wayland is not supported", ""),
|
||||||
("id_input_tip", "ניתן להזין מזהה, IP ישיר, או דומיין עם פורט (<domain>:<port>).\nאם ברצונך לגשת למכשיר בשרת אחר, אנא הוסף את כתובת השרת (<id>@<server_address>?key=<key_value>), לדוגמה,\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nאם ברצונך לגשת למכשיר בשרת ציבורי, אנא הזן \"<id>@public\", המפתח אינו נדרש לשרת ציבורי"),
|
("Reboot required", ""),
|
||||||
("privacy_mode_impl_mag_tip", "מצב 1"),
|
("Unsupported display server", ""),
|
||||||
("privacy_mode_impl_virtual_display_tip", "מצב 2"),
|
("x11 expected", ""),
|
||||||
("idd_not_support_under_win10_2004_tip", "נהג התצוגה העקיף אינו נתמך. נדרשת גרסת Windows 10, גרסה 2004 או חדשה יותר."),
|
("Port", ""),
|
||||||
("switch_display_elevated_connections_tip", "מעבר למסך שאינו ראשי אינו נתמך במצב משתמש מוגבה כאשר יש מספר חיבורים. אנא נסה שוב לאחר התקנה אם ברצונך לשלוט במסכים מרובים."),
|
("Settings", ""),
|
||||||
("input_source_1_tip", "מקור קלט 1"),
|
("Username", ""),
|
||||||
("input_source_2_tip", "מקור קלט 2"),
|
("Invalid port", ""),
|
||||||
("capture_display_elevated_connections_tip", "לכידת מסכים מרובים אינה נתמכת במצב משתמש מוגבה. אנא נסה שוב לאחר התקנה אם ברצונך לשלוט במסכים מרובים."),
|
("Closed manually by the peer", ""),
|
||||||
("swap-left-right-mouse", "החלף בין כפתור העכבר השמאלי לימני"),
|
("Enable remote configuration modification", ""),
|
||||||
("2FA code", "קוד אימות דו-שלבי"),
|
("Run without install", ""),
|
||||||
("enable-2fa-title", "הפעל אימות דו-שלבי"),
|
("Connect via relay", ""),
|
||||||
("enable-2fa-desc", "אנא הגדר כעת את האפליקציה שלך לאימות. תוכל להשתמש באפליקציית אימות כגון Authy, Microsoft או Google Authenticator בטלפון או במחשב שלך.\n\nסרוק את קוד ה-QR עם האפליקציה שלך והזן את הקוד שהאפליקציה מציגה כדי להפעיל את אימות הדו-שלבי."),
|
("Always connect via relay", ""),
|
||||||
("wrong-2fa-code", "לא ניתן לאמת את הקוד. בדוק שהקוד והגדרות הזמן המקומיות נכונות"),
|
("whitelist_tip", "רק IP ברשימה הלבנה יכול לגשת אלי"),
|
||||||
("enter-2fa-title", "אימות דו-שלבי"),
|
("Login", ""),
|
||||||
].iter().cloned().collect();
|
("Verify", ""),
|
||||||
}
|
("Remember me", ""),
|
||||||
|
("Trust this device", ""),
|
||||||
|
("Verification code", ""),
|
||||||
|
("verification_tip", "קוד אימות נשלח לכתובת הדוא\"ל הרשומה, הזן את קוד האימות כדי להמשיך בהתחברות."),
|
||||||
|
("Logout", ""),
|
||||||
|
("Tags", ""),
|
||||||
|
("Search ID", ""),
|
||||||
|
("whitelist_sep", "מופרד על ידי פסיק, נקודה פסיק, רווחים או שורה חדשה"),
|
||||||
|
("Add ID", ""),
|
||||||
|
("Add Tag", "הוסף תג"),
|
||||||
|
("Unselect all tags", ""),
|
||||||
|
("Network error", ""),
|
||||||
|
("Username missed", ""),
|
||||||
|
("Password missed", ""),
|
||||||
|
("Wrong credentials", "שם משתמש או סיסמה שגויים"),
|
||||||
|
("The verification code is incorrect or has expired", ""),
|
||||||
|
("Edit Tag", "ערוך תג"),
|
||||||
|
("Forget Password", "שכחת סיסמה"),
|
||||||
|
("Favorites", ""),
|
||||||
|
("Add to Favorites", "הוסף למועדפים"),
|
||||||
|
("Remove from Favorites", "הסר מהמועדפים"),
|
||||||
|
("Empty", ""),
|
||||||
|
("Invalid folder name", ""),
|
||||||
|
("Socks5 Proxy", "פרוקסי Socks5"),
|
||||||
|
("Hostname", ""),
|
||||||
|
("Discovered", ""),
|
||||||
|
("install_daemon_tip", "לצורך הפעלה בעת הפעלת המחשב, עליך להתקין שירות מערכת."),
|
||||||
|
("Remote ID", ""),
|
||||||
|
("Paste", ""),
|
||||||
|
("Paste here?", ""),
|
||||||
|
("Are you sure to close the connection?", "האם אתה בטוח שברצונך לסגור את החיבור?"),
|
||||||
|
("Download new version", ""),
|
||||||
|
("Touch mode", ""),
|
||||||
|
("Mouse mode", ""),
|
||||||
|
("One-Finger Tap", "הקשה באצבע אחת"),
|
||||||
|
("Left Mouse", "עכבר שמאלי"),
|
||||||
|
("One-Long Tap", "הקשה ארוכה באצבע אחת"),
|
||||||
|
("Two-Finger Tap", "הקשה בשתי אצבעות"),
|
||||||
|
("Right Mouse", "עכבר ימני"),
|
||||||
|
("One-Finger Move", "הזזה באצבע אחת"),
|
||||||
|
("Double Tap & Move", "הקשה כפולה והזזה"),
|
||||||
|
("Mouse Drag", "גרירת עכבר"),
|
||||||
|
("Three-Finger vertically", "שלוש אצבעות אנכית"),
|
||||||
|
("Mouse Wheel", "גלגלת עכבר"),
|
||||||
|
("Two-Finger Move", "הזזה בשתי אצבעות"),
|
||||||
|
("Canvas Move", "הזזת בד"),
|
||||||
|
("Pinch to Zoom", "צביטה לזום"),
|
||||||
|
("Canvas Zoom", "זום בד"),
|
||||||
|
("Reset canvas", ""),
|
||||||
|
("No permission of file transfer", ""),
|
||||||
|
("Note", ""),
|
||||||
|
("Connection", ""),
|
||||||
|
("Share Screen", "שיתוף מסך"),
|
||||||
|
("Chat", ""),
|
||||||
|
("Total", ""),
|
||||||
|
("items", ""),
|
||||||
|
("Selected", ""),
|
||||||
|
("Screen Capture", "לכידת מסך"),
|
||||||
|
("Input Control", "בקרת קלט"),
|
||||||
|
("Audio Capture", "לכידת שמע"),
|
||||||
|
("File Connection", "חיבור קובץ"),
|
||||||
|
("Screen Connection", "חיבור מסך"),
|
||||||
|
("Do you accept?", ""),
|
||||||
|
("Open System Setting", "פתח הגדרת מערכת"),
|
||||||
|
("How to get Android input permission?", ""),
|
||||||
|
("android_input_permission_tip1", "כדי שמכשיר מרוחק יוכל לשלוט במכשיר האנדרואיד שלך באמצעות עכבר או מגע, עליך לאפשר ל-RustDesk להשתמש בשירות \"נגישות\"."),
|
||||||
|
("android_input_permission_tip2", "אנא עבור לדף ההגדרות של המערכת הבא, מצא והכנס ל[שירותים מותקנים], הפעל את שירות [RustDesk Input]."),
|
||||||
|
("android_new_connection_tip", "בקשת שליטה חדשה התקבלה, שרוצה לשלוט במכשירך הנוכחי."),
|
||||||
|
("android_service_will_start_tip", "הפעלת \"לכידת מסך\" תתחיל אוטומטית את השירות, מאפשרת למכשירים אחרים לבקש חיבור למכשיר שלך."),
|
||||||
|
("android_stop_service_tip", "סגירת השירות תסגור אוטומטית את כל החיבורים המוקמים."),
|
||||||
|
("android_version_audio_tip", "גרסת האנדרואיד הנוכחית אינה תומכת בלכידת שמע, אנא שדרג לאנדרואיד 10 או גבוה יותר."),
|
||||||
|
("android_start_service_tip", "הקש על [התחל שירות] או אפשר הרשאת [לכידת מסך] כדי להתחיל את שירות שיתוף המסך."),
|
||||||
|
("android_permission_may_not_change_tip", "הרשאות עבור חיבורים שנוצרו עשויות לא להשתנות מייד עד להתחברות מחדש."),
|
||||||
|
("Account", ""),
|
||||||
|
("Overwrite", ""),
|
||||||
|
("This file exists, skip or overwrite this file?", ""),
|
||||||
|
("Quit", ""),
|
||||||
|
("Help", ""),
|
||||||
|
("Failed", ""),
|
||||||
|
("Succeeded", ""),
|
||||||
|
("Someone turns on privacy mode, exit", ""),
|
||||||
|
("Unsupported", ""),
|
||||||
|
("Peer denied", ""),
|
||||||
|
("Please install plugins", ""),
|
||||||
|
("Peer exit", ""),
|
||||||
|
("Failed to turn off", ""),
|
||||||
|
("Turned off", ""),
|
||||||
|
("Language", ""),
|
||||||
|
("Keep RustDesk background service", ""),
|
||||||
|
("Ignore Battery Optimizations", "התעלם מאופטימיזציות סוללה"),
|
||||||
|
("android_open_battery_optimizations_tip", "אם ברצונך לבטל תכונה זו, אנא עבור לדף ההגדרות של יישום RustDesk הבא, מצא והכנס ל[סוללה], הסר את הסימון מ-[לא מוגבל]"),
|
||||||
|
("Start on boot", ""),
|
||||||
|
("Start the screen sharing service on boot, requires special permissions", ""),
|
||||||
|
("Connection not allowed", ""),
|
||||||
|
("Legacy mode", ""),
|
||||||
|
("Map mode", ""),
|
||||||
|
("Translate mode", ""),
|
||||||
|
("Use permanent password", ""),
|
||||||
|
("Use both passwords", ""),
|
||||||
|
("Set permanent password", ""),
|
||||||
|
("Enable remote restart", ""),
|
||||||
|
("Restart remote device", ""),
|
||||||
|
("Are you sure you want to restart", ""),
|
||||||
|
("Restarting remote device", ""),
|
||||||
|
("remote_restarting_tip", "המכשיר המרוחק מתחיל מחדש, אנא סגור את תיבת ההודעה הזו והתחבר מחדש עם סיסמה קבועה לאחר זמן מה"),
|
||||||
|
("Copied", ""),
|
||||||
|
("Exit Fullscreen", "יציאה ממסך מלא"),
|
||||||
|
("Fullscreen", ""),
|
||||||
|
("Mobile Actions", "פעולות ניידות"),
|
||||||
|
("Select Monitor", "בחר מסך"),
|
||||||
|
("Control Actions", "פעולות בקרה"),
|
||||||
|
("Display Settings", "הגדרות תצוגה"),
|
||||||
|
("Ratio", ""),
|
||||||
|
("Image Quality", "איכות תמונה"),
|
||||||
|
("Scroll Style", "סגנון גלילה"),
|
||||||
|
("Show Toolbar", "הצג סרגל כלים"),
|
||||||
|
("Hide Toolbar", "הסתר סרגל כלים"),
|
||||||
|
("Direct Connection", "חיבור ישיר"),
|
||||||
|
("Relay Connection", "חיבור ריליי"),
|
||||||
|
("Secure Connection", "חיבור מאובטח"),
|
||||||
|
("Insecure Connection", "חיבור לא מאובטח"),
|
||||||
|
("Scale original", ""),
|
||||||
|
("Scale adaptive", ""),
|
||||||
|
("General", ""),
|
||||||
|
("Security", ""),
|
||||||
|
("Theme", ""),
|
||||||
|
("Dark Theme", "ערכת נושא כהה"),
|
||||||
|
("Light Theme", "ערכת נושא בהירה"),
|
||||||
|
("Dark", ""),
|
||||||
|
("Light", ""),
|
||||||
|
("Follow System", "עקוב אחר המערכת"),
|
||||||
|
("Enable hardware codec", ""),
|
||||||
|
("Unlock Security Settings", "פתח הגדרות אבטחה"),
|
||||||
|
("Enable audio", ""),
|
||||||
|
("Unlock Network Settings", "פתח הגדרות רשת"),
|
||||||
|
("Server", ""),
|
||||||
|
("Direct IP Access", "גישה ישירה ל-IP"),
|
||||||
|
("Proxy", ""),
|
||||||
|
("Apply", ""),
|
||||||
|
("Disconnect all devices?", ""),
|
||||||
|
("Clear", ""),
|
||||||
|
("Audio Input Device", "מכשיר קלט שמע"),
|
||||||
|
("Use IP Whitelisting", "השתמש ברשימת לבנה של IP"),
|
||||||
|
("Network", ""),
|
||||||
|
("Pin Toolbar", "נעץ סרגל כלים"),
|
||||||
|
("Unpin Toolbar", "הסר נעיצת סרגל כלים"),
|
||||||
|
("Recording", ""),
|
||||||
|
("Directory", ""),
|
||||||
|
("Automatically record incoming sessions", ""),
|
||||||
|
("Change", ""),
|
||||||
|
("Start session recording", ""),
|
||||||
|
("Stop session recording", ""),
|
||||||
|
("Enable recording session", ""),
|
||||||
|
("Enable LAN discovery", ""),
|
||||||
|
("Deny LAN discovery", ""),
|
||||||
|
("Write a message", ""),
|
||||||
|
("Prompt", ""),
|
||||||
|
("Please wait for confirmation of UAC...", ""),
|
||||||
|
("elevated_foreground_window_tip", "החלון הנוכחי של שולחן העבודה המרוחק דורש הרשאה גבוהה יותר לפעולה, לכן אי אפשר להשתמש בעכבר ובמקלדת באופן זמני. תוכל לבקש מהמשתמש המרוחק למזער את החלון הנוכחי, או ללחוץ על כפתור ההגבהה בחלון ניהול החיבור. כדי להימנע מבעיה זו, מומלץ להתקין את התוכנה במכשיר המרוחק."),
|
||||||
|
("Disconnected", ""),
|
||||||
|
("Other", ""),
|
||||||
|
("Confirm before closing multiple tabs", ""),
|
||||||
|
("Keyboard Settings", "הגדרות מקלדת"),
|
||||||
|
("Full Access", "גישה מלאה"),
|
||||||
|
("Screen Share", "שיתוף מסך"),
|
||||||
|
("Wayland requires Ubuntu 21.04 or higher version.", ""),
|
||||||
|
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", ""),
|
||||||
|
("JumpLink", "הצג"),
|
||||||
|
("Please Select the screen to be shared(Operate on the peer side).", "אנא בחר את המסך לשיתוף (פעולה בצד העמית)."),
|
||||||
|
("Show RustDesk", ""),
|
||||||
|
("This PC", ""),
|
||||||
|
("or", ""),
|
||||||
|
("Continue with", ""),
|
||||||
|
("Elevate", ""),
|
||||||
|
("Zoom cursor", ""),
|
||||||
|
("Accept sessions via password", ""),
|
||||||
|
("Accept sessions via click", ""),
|
||||||
|
("Accept sessions via both", ""),
|
||||||
|
("Please wait for the remote side to accept your session request...", ""),
|
||||||
|
("One-time Password", "סיסמה חד-פעמית"),
|
||||||
|
("Use one-time password", ""),
|
||||||
|
("One-time password length", ""),
|
||||||
|
("Request access to your device", ""),
|
||||||
|
("Hide connection management window", ""),
|
||||||
|
("hide_cm_tip", "אפשר הסתרה רק אם מקבלים סשנים דרך סיסמה ומשתמשים בסיסמה קבועה"),
|
||||||
|
("wayland_experiment_tip", "תמיכה ב-Wayland נמצאת בשלב ניסיוני, אנא השתמש ב-X11 אם אתה זקוק לגישה לא מלווה."),
|
||||||
|
("Right click to select tabs", ""),
|
||||||
|
("Skipped", ""),
|
||||||
|
("Add to address book", ""),
|
||||||
|
("Group", ""),
|
||||||
|
("Search", ""),
|
||||||
|
("Closed manually by web console", ""),
|
||||||
|
("Local keyboard type", ""),
|
||||||
|
("Select local keyboard type", ""),
|
||||||
|
("software_render_tip", "אם אתה משתמש בכרטיס גרפיקה של Nvidia תחת Linux וחלון המרחוק נסגר מיד לאחר החיבור, החלפה למנהל ההתקן הפתוח Nouveau ובחירה בשימוש בעיבוד תוכנה עשויה לעזור. נדרשת הפעלה מחדש של התוכנה."),
|
||||||
|
("Always use software rendering", ""),
|
||||||
|
("config_input", "כדי לשלוט בשולחן העבודה המרוחק באמצעות מקלדת, עליך להעניק ל-RustDesk הרשאות \"מעקב אחרי קלט\"."),
|
||||||
|
("config_microphone", "כדי לדבר מרחוק, עליך להעניק ל-RustDesk הרשאות \"הקלטת שמע\"."),
|
||||||
|
("request_elevation_tip", "ניתן גם לבקש הגבהה אם יש מישהו בצד המרוחק."),
|
||||||
|
("Wait", ""),
|
||||||
|
("Elevation Error", "שגיאת הגבהה"),
|
||||||
|
("Ask the remote user for authentication", ""),
|
||||||
|
("Choose this if the remote account is administrator", ""),
|
||||||
|
("Transmit the username and password of administrator", ""),
|
||||||
|
("still_click_uac_tip", "עדיין דורש מהמשתמש המרוחק ללחוץ OK בחלון ה-UAC של הרצת RustDesk."),
|
||||||
|
("Request Elevation", "בקש הגבהה"),
|
||||||
|
("wait_accept_uac_tip", "אנא המתן למשתמש המרוחק לקבל את דיאלוג ה-UAC."),
|
||||||
|
("Elevate successfully", ""),
|
||||||
|
("uppercase", ""),
|
||||||
|
("lowercase", ""),
|
||||||
|
("digit", ""),
|
||||||
|
("special character", ""),
|
||||||
|
("length>=8", ""),
|
||||||
|
("Weak", ""),
|
||||||
|
("Medium", ""),
|
||||||
|
("Strong", ""),
|
||||||
|
("Switch Sides", "החלף צדדים"),
|
||||||
|
("Please confirm if you want to share your desktop?", ""),
|
||||||
|
("Display", ""),
|
||||||
|
("Default View Style", "סגנון תצוגה ברירת מחדל"),
|
||||||
|
("Default Scroll Style", "סגנון גלילה ברירת מחדל"),
|
||||||
|
("Default Image Quality", "איכות תמונה ברירת מחדל"),
|
||||||
|
("Default Codec", "קודק ברירת מחדל"),
|
||||||
|
("Bitrate", ""),
|
||||||
|
("FPS", ""),
|
||||||
|
("Auto", ""),
|
||||||
|
("Other Default Options", "אפשרויות ברירת מחדל אחרות"),
|
||||||
|
("Voice call", ""),
|
||||||
|
("Text chat", ""),
|
||||||
|
("Stop voice call", ""),
|
||||||
|
("relay_hint_tip", "ייתכן שלא ניתן להתחבר ישירות; ניתן לנסות להתחבר דרך ריליי. בנוסף, אם ברצונך להשתמש בריליי בניסיון הראשון שלך, תוכל להוסיף את הסיומת \"/r\" למזהה או לבחור באפשרות \"התחבר תמיד דרך ריליי\" בכרטיס של הסשנים האחרונים אם קיים."),
|
||||||
|
("Reconnect", ""),
|
||||||
|
("Codec", ""),
|
||||||
|
("Resolution", ""),
|
||||||
|
("No transfers in progress", ""),
|
||||||
|
("Set one-time password length", ""),
|
||||||
|
("RDP Settings", "הגדרות RDP"),
|
||||||
|
("Sort by", ""),
|
||||||
|
("New Connection", "חיבור חדש"),
|
||||||
|
("Restore", ""),
|
||||||
|
("Minimize", ""),
|
||||||
|
("Maximize", ""),
|
||||||
|
("Your Device", "המכשיר שלך"),
|
||||||
|
("empty_recent_tip", "אופס, אין סשנים אחרונים!\nהגיע הזמן לתכנן חדש."),
|
||||||
|
("empty_favorite_tip", "עדיין אין עמיתים מועדפים?\nבוא נמצא מישהו להתחבר אליו ונוסיף אותו למועדפים!"),
|
||||||
|
("empty_lan_tip", "אוי לא, נראה שעדיין לא גילינו עמיתים."),
|
||||||
|
("empty_address_book_tip", "אוי ואבוי, נראה שכרגע אין עמיתים בספר הכתובות שלך."),
|
||||||
|
("eg: admin", ""),
|
||||||
|
("Empty Username", "שם משתמש ריק"),
|
||||||
|
("Empty Password", "סיסמה ריקה"),
|
||||||
|
("Me", ""),
|
||||||
|
("identical_file_tip", "קובץ זה זהה לקובץ של העמית."),
|
||||||
|
("show_monitors_tip", "הצג מסכים בסרגל כלים"),
|
||||||
|
("View Mode", "מצב תצוגה"),
|
||||||
|
("login_linux_tip", "עליך להתחבר לחשבון Linux מרוחק כדי לאפשר פעילות שולחן עבודה X"),
|
||||||
|
("verify_rustdesk_password_tip", "אמת סיסמת RustDesk"),
|
||||||
|
("remember_account_tip", "זכור חשבון זה"),
|
||||||
|
("os_account_desk_tip", "חשבון זה משמש להתחברות למערכת ההפעלה המרוחקת ולאפשר פעילות שולחן עבודה במצב לא מקוון"),
|
||||||
|
("OS Account", "חשבון מערכת הפעלה"),
|
||||||
|
("another_user_login_title_tip", "משתמש אחר כבר התחבר"),
|
||||||
|
("another_user_login_text_tip", "נתק"),
|
||||||
|
("xorg_not_found_title_tip", "Xorg לא נמצא"),
|
||||||
|
("xorg_not_found_text_tip", "אנא התקן Xorg"),
|
||||||
|
("no_desktop_title_tip", "אין שולחן עבודה זמין"),
|
||||||
|
("no_desktop_text_tip", "אנא התקן שולחן עבודה GNOME"),
|
||||||
|
("No need to elevate", ""),
|
||||||
|
("System Sound", "צליל מערכת"),
|
||||||
|
("Default", ""),
|
||||||
|
("New RDP", ""),
|
||||||
|
("Fingerprint", ""),
|
||||||
|
("Copy Fingerprint", "העתק טביעת אצבע"),
|
||||||
|
("no fingerprints", "אין טביעות אצבע"),
|
||||||
|
("Select a peer", ""),
|
||||||
|
("Select peers", ""),
|
||||||
|
("Plugins", ""),
|
||||||
|
("Uninstall", ""),
|
||||||
|
("Update", ""),
|
||||||
|
("Enable", ""),
|
||||||
|
("Disable", ""),
|
||||||
|
("Options", ""),
|
||||||
|
("resolution_original_tip", "רזולוציה מקורית"),
|
||||||
|
("resolution_fit_local_tip", "התאם לרזולוציה מקומית"),
|
||||||
|
("resolution_custom_tip", "רזולוציה מותאמת אישית"),
|
||||||
|
("Collapse toolbar", ""),
|
||||||
|
("Accept and Elevate", "קבל והגבה"),
|
||||||
|
("accept_and_elevate_btn_tooltip", "קבל את החיבור והגבה הרשאות UAC."),
|
||||||
|
("clipboard_wait_response_timeout_tip", "המתנה לתגובת העתקה הסתיימה בזמן."),
|
||||||
|
("Incoming connection", ""),
|
||||||
|
("Outgoing connection", ""),
|
||||||
|
("Exit", ""),
|
||||||
|
("Open", ""),
|
||||||
|
("logout_tip", "האם אתה בטוח שברצונך להתנתק?"),
|
||||||
|
("Service", ""),
|
||||||
|
("Start", ""),
|
||||||
|
("Stop", ""),
|
||||||
|
("exceed_max_devices", "הגעת למספר המקסימלי של מכשירים שניתן לנהל."),
|
||||||
|
("Sync with recent sessions", ""),
|
||||||
|
("Sort tags", ""),
|
||||||
|
("Open connection in new tab", ""),
|
||||||
|
("Move tab to new window", ""),
|
||||||
|
("Can not be empty", ""),
|
||||||
|
("Already exists", ""),
|
||||||
|
("Change Password", "שנה סיסמה"),
|
||||||
|
("Refresh Password", "רענן סיסמה"),
|
||||||
|
("ID", ""),
|
||||||
|
("Grid View", "תצוגת רשת"),
|
||||||
|
("List View", "תצוגת רשימה"),
|
||||||
|
("Select", ""),
|
||||||
|
("Toggle Tags", "החלף תגיות"),
|
||||||
|
("pull_ab_failed_tip", "נכשל ברענון ספר הכתובות"),
|
||||||
|
("push_ab_failed_tip", "נכשל בסנכרון ספר הכתובות לשרת"),
|
||||||
|
("synced_peer_readded_tip", "המכשירים שהיו נוכחים בסשנים האחרונים יסונכרנו בחזרה לספר הכתובות."),
|
||||||
|
("Change Color", "שנה צבע"),
|
||||||
|
("Primary Color", "צבע עיקרי"),
|
||||||
|
("HSV Color", "צבע HSV"),
|
||||||
|
("Installation Successful!", "ההתקנה הצליחה!"),
|
||||||
|
("Installation failed!", ""),
|
||||||
|
("Reverse mouse wheel", ""),
|
||||||
|
("{} sessions", ""),
|
||||||
|
("scam_title", "ייתכן שאתה נפלת להונאה!"),
|
||||||
|
("scam_text1", "אם אתה בשיחת טלפון עם מישהו שאינך מכיר ואינך סומך עליו שביקש ממך להשתמש ב-RustDesk ולהתחיל את השירות, אל תמשיך ונתק מיד."),
|
||||||
|
("scam_text2", "סביר להניח שמדובר בהונאה שמנסה לגנוב ממך כסף או מידע פרטי אחר."),
|
||||||
|
("Don't show again", ""),
|
||||||
|
("I Agree", ""),
|
||||||
|
("Decline", ""),
|
||||||
|
("Timeout in minutes", ""),
|
||||||
|
("auto_disconnect_option_tip", "סגור באופן אוטומטי סשנים נכנסים במקרה של חוסר פעילות של המשתמש"),
|
||||||
|
("Connection failed due to inactivity", "התנתקות אוטומטית בגלל חוסר פעילות"),
|
||||||
|
("Check for software update on startup", ""),
|
||||||
|
("upgrade_rustdesk_server_pro_to_{}_tip", "אנא שדרג את RustDesk Server Pro לגרסה {} או חדשה יותר!"),
|
||||||
|
("pull_group_failed_tip", "נכשל ברענון קבוצה"),
|
||||||
|
("Filter by intersection", ""),
|
||||||
|
("Remove wallpaper during incoming sessions", ""),
|
||||||
|
("Test", ""),
|
||||||
|
("display_is_plugged_out_msg", "המסך הופסק, החלף למסך הראשון."),
|
||||||
|
("No displays", ""),
|
||||||
|
("elevated_switch_display_msg", "מעבר למסך הראשי מכיוון שתמיכה במסכים מרובים אינה נתמכת במצב משתמש מוגבה."),
|
||||||
|
("Open in new window", ""),
|
||||||
|
("Show displays as individual windows", ""),
|
||||||
|
("Use all my displays for the remote session", ""),
|
||||||
|
("selinux_tip", "SELinux מופעל במכשיר שלך, מה שעלול למנוע מ-RustDesk לפעול כראוי כצד הנשלט."),
|
||||||
|
("Change view", ""),
|
||||||
|
("Big tiles", ""),
|
||||||
|
("Small tiles", ""),
|
||||||
|
("List", ""),
|
||||||
|
("Virtual display", ""),
|
||||||
|
("Plug out all", ""),
|
||||||
|
("True color (4:4:4)", ""),
|
||||||
|
("Enable blocking user input", ""),
|
||||||
|
("id_input_tip", "ניתן להזין מזהה, IP ישיר, או דומיין עם פורט (<domain>:<port>).\nאם ברצונך לגשת למכשיר בשרת אחר, אנא הוסף את כתובת השרת (<id>@<server_address>?key=<key_value>), לדוגמה,\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nאם ברצונך לגשת למכשיר בשרת ציבורי, אנא הזן \"<id>@public\", המפתח אינו נדרש לשרת ציבורי"),
|
||||||
|
("privacy_mode_impl_mag_tip", "מצב 1"),
|
||||||
|
("privacy_mode_impl_virtual_display_tip", "מצב 2"),
|
||||||
|
("Enter privacy mode", ""),
|
||||||
|
("Exit privacy mode", ""),
|
||||||
|
("idd_not_support_under_win10_2004_tip", "נהג התצוגה העקיף אינו נתמך. נדרשת גרסת Windows 10, גרסה 2004 או חדשה יותר."),
|
||||||
|
("switch_display_elevated_connections_tip", "מעבר למסך שאינו ראשי אינו נתמך במצב משתמש מוגבה כאשר יש מספר חיבורים. אנא נסה שוב לאחר התקנה אם ברצונך לשלוט במסכים מרובים."),
|
||||||
|
("input_source_1_tip", "מקור קלט 1"),
|
||||||
|
("input_source_2_tip", "מקור קלט 2"),
|
||||||
|
("capture_display_elevated_connections_tip", "לכידת מסכים מרובים אינה נתמכת במצב משתמש מוגבה. אנא נסה שוב לאחר התקנה אם ברצונך לשלוט במסכים מרובים."),
|
||||||
|
("Swap control-command key", ""),
|
||||||
|
("swap-left-right-mouse", "החלף בין כפתור העכבר השמאלי לימני"),
|
||||||
|
("2FA code", "קוד אימות דו-שלבי"),
|
||||||
|
("More", ""),
|
||||||
|
("enable-2fa-title", "הפעל אימות דו-שלבי"),
|
||||||
|
("enable-2fa-desc", "אנא הגדר כעת את האפליקציה שלך לאימות. תוכל להשתמש באפליקציית אימות כגון Authy, Microsoft או Google Authenticator בטלפון או במחשב שלך.\n\nסרוק את קוד ה-QR עם האפליקציה שלך והזן את הקוד שהאפליקציה מציגה כדי להפעיל את אימות הדו-שלבי."),
|
||||||
|
("wrong-2fa-code", "לא ניתן לאמת את הקוד. בדוק שהקוד והגדרות הזמן המקומיות נכונות"),
|
||||||
|
("enter-2fa-title", "אימות דו-שלבי"),
|
||||||
|
("Email verification code must be 6 characters.", ""),
|
||||||
|
("2FA code must be 6 digits.", ""),
|
||||||
|
("Multiple Windows sessions found", ""),
|
||||||
|
("Please select the session you want to connect to", ""),
|
||||||
|
("powered_by_me", ""),
|
||||||
|
("outgoing_only_desk_tip", "זוהי מהדורה מותאמת אישית.\nניתן להתחבר למכשירים אחרים, אך מכשירים אחרים לא יכולים להתחבר אליך."),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
|
].iter().cloned().collect();
|
||||||
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,7 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", "Seleziona la sessione a cui connetterti"),
|
("Please select the session you want to connect to", "Seleziona la sessione a cui connetterti"),
|
||||||
("powered_by_me", "Alimentato da RustDesk"),
|
("powered_by_me", "Alimentato da RustDesk"),
|
||||||
("outgoing_only_desk_tip", "Questa è un'edizione personalizzata.\nPuoi connetterti ad altri dispositivi, ma gli altri dispositivi non possono connettersi a questo dispositivo."),
|
("outgoing_only_desk_tip", "Questa è un'edizione personalizzata.\nPuoi connetterti ad altri dispositivi, ma gli altri dispositivi non possono connettersi a questo dispositivo."),
|
||||||
("preset_password_warning", "Questa edizione personalizzata viene fornita con una password preimpostata. Chiunque conosca questa password potrebbe ottenere il pieno controllo del dispositivo. Se non te lo aspettavi, disinstalla immediatamente il software."),
|
("preset_password_warning", ""),
|
||||||
("Security Alert", ""),
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", "연결하려는 세션을 선택하세요."),
|
("Please select the session you want to connect to", "연결하려는 세션을 선택하세요."),
|
||||||
("powered_by_me", "RustDesk 제공"),
|
("powered_by_me", "RustDesk 제공"),
|
||||||
("outgoing_only_desk_tip", "이것은 맞춤형 버전입니다.\n다른 장치에 연결할 수 있지만 다른 장치는 귀하의 장치에 연결할 수 없습니다."),
|
("outgoing_only_desk_tip", "이것은 맞춤형 버전입니다.\n다른 장치에 연결할 수 있지만 다른 장치는 귀하의 장치에 연결할 수 없습니다."),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", "Lūdzu, atlasiet sesiju, ar kuru vēlaties izveidot savienojumu"),
|
("Please select the session you want to connect to", "Lūdzu, atlasiet sesiju, ar kuru vēlaties izveidot savienojumu"),
|
||||||
("powered_by_me", "Darbojas ar RustDesk"),
|
("powered_by_me", "Darbojas ar RustDesk"),
|
||||||
("outgoing_only_desk_tip", "Šis ir pielāgots izdevums.\nVarat izveidot savienojumu ar citām ierīcēm, taču citas ierīces nevar izveidot savienojumu ar jūsu ierīci."),
|
("outgoing_only_desk_tip", "Šis ir pielāgots izdevums.\nVarat izveidot savienojumu ar citām ierīcēm, taču citas ierīces nevar izveidot savienojumu ar jūsu ierīci."),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", "Selecteer de sessie waarmee je verbinding wilt maken"),
|
("Please select the session you want to connect to", "Selecteer de sessie waarmee je verbinding wilt maken"),
|
||||||
("powered_by_me", "Werkt met Rustdesk"),
|
("powered_by_me", "Werkt met Rustdesk"),
|
||||||
("outgoing_only_desk_tip", "Je kan verbinding maken met andere apparaten, maar andere apparaten kunnen geen verbinding maken met dit apparaat."),
|
("outgoing_only_desk_tip", "Je kan verbinding maken met andere apparaten, maar andere apparaten kunnen geen verbinding maken met dit apparaat."),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", "Wybierz sesję, do której chcesz się podłączyć"),
|
("Please select the session you want to connect to", "Wybierz sesję, do której chcesz się podłączyć"),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -590,5 +590,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("outgoing_only_desk_tip", "Это специализированная версия.\nВы можете подключаться к другим устройствам, но другие устройства не могут подключиться к вашему."),
|
("outgoing_only_desk_tip", "Это специализированная версия.\nВы можете подключаться к другим устройствам, но другие устройства не могут подключиться к вашему."),
|
||||||
("preset_password_warning", "Это специализированная версия с предустановленным паролем. Любой, кто знает этот пароль, может получить полный контроль над вашим устройством. Если это для вас неожиданно, немедленно удалите данное программное обеспечение."),
|
("preset_password_warning", "Это специализированная версия с предустановленным паролем. Любой, кто знает этот пароль, может получить полный контроль над вашим устройством. Если это для вас неожиданно, немедленно удалите данное программное обеспечение."),
|
||||||
("Security Alert", "Предупреждение о безопасности"),
|
("Security Alert", "Предупреждение о безопасности"),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", "Vyberte reláciu, ku ktorej sa chcete pripojiť"),
|
("Please select the session you want to connect to", "Vyberte reláciu, ku ktorej sa chcete pripojiť"),
|
||||||
("powered_by_me", "Poháňané aplikáciou RustDesk"),
|
("powered_by_me", "Poháňané aplikáciou RustDesk"),
|
||||||
("outgoing_only_desk_tip", "Toto je prispôsobené vydanie.\nMôžete sa pripojiť k iným zariadeniam, ale iné zariadenia sa k vášmu zariadeniu pripojiť nemôžu."),
|
("outgoing_only_desk_tip", "Toto je prispôsobené vydanie.\nMôžete sa pripojiť k iným zariadeniam, ale iné zariadenia sa k vášmu zariadeniu pripojiť nemôžu."),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -590,5 +590,23 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
("preset_password_warning", ""),
|
("preset_password_warning", ""),
|
||||||
("Security Alert", ""),
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", "請選擇您想要連結的工作階段"),
|
("Please select the session you want to connect to", "請選擇您想要連結的工作階段"),
|
||||||
("powered_by_me", "由 RustDesk 提供支援"),
|
("powered_by_me", "由 RustDesk 提供支援"),
|
||||||
("outgoing_only_desk_tip", "目前版本的軟體是自定義版本。\n您可以連接至其他設備,但是其他設備無法連接至您的設備。"),
|
("outgoing_only_desk_tip", "目前版本的軟體是自定義版本。\n您可以連接至其他設備,但是其他設備無法連接至您的設備。"),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", "Будь ласка, оберіть сеанс, до якого ви хочете підключитися"),
|
("Please select the session you want to connect to", "Будь ласка, оберіть сеанс, до якого ви хочете підключитися"),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please select the session you want to connect to", ""),
|
("Please select the session you want to connect to", ""),
|
||||||
("powered_by_me", ""),
|
("powered_by_me", ""),
|
||||||
("outgoing_only_desk_tip", ""),
|
("outgoing_only_desk_tip", ""),
|
||||||
|
("preset_password_warning", ""),
|
||||||
|
("Security Alert", ""),
|
||||||
|
("Add shared address book", ""),
|
||||||
|
("Update this address book", ""),
|
||||||
|
("Delete this address book", ""),
|
||||||
|
("Share this address book", ""),
|
||||||
|
("Are you sure you want to delete address book {}?", ""),
|
||||||
|
("My address book", ""),
|
||||||
|
("Personal", ""),
|
||||||
|
("Owner", ""),
|
||||||
|
("Set shared password", ""),
|
||||||
|
("Exist in", ""),
|
||||||
|
("Read-only", ""),
|
||||||
|
("Read/Write", ""),
|
||||||
|
("Full Control", ""),
|
||||||
|
("full_control_tip", ""),
|
||||||
|
("share_warning_tip", ""),
|
||||||
|
("Only show existing", ""),
|
||||||
|
("Everyone", ""),
|
||||||
|
("permission_priority_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
@ -519,7 +519,7 @@ impl SciterSession {
|
|||||||
.lc
|
.lc
|
||||||
.write()
|
.write()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.initialize(id, conn_type, None, force_relay, None);
|
.initialize(id, conn_type, None, force_relay, None, None);
|
||||||
|
|
||||||
Self(session)
|
Self(session)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user