mirror of
https://github.com/rustdesk/rustdesk.git
synced 2025-06-06 17:32:51 +08:00
parent
ecb70b43df
commit
41da6d552f
@ -2095,19 +2095,28 @@ List<String>? urlLinkToCmdArgs(Uri uri) {
|
||||
return null;
|
||||
}
|
||||
|
||||
connectMainDesktop(
|
||||
String id, {
|
||||
required bool isFileTransfer,
|
||||
required bool isTcpTunneling,
|
||||
required bool isRDP,
|
||||
bool? forceRelay,
|
||||
}) async {
|
||||
connectMainDesktop(String id,
|
||||
{required bool isFileTransfer,
|
||||
required bool isTcpTunneling,
|
||||
required bool isRDP,
|
||||
bool? forceRelay,
|
||||
String? password,
|
||||
bool? isSharedPassword}) async {
|
||||
if (isFileTransfer) {
|
||||
await rustDeskWinManager.newFileTransfer(id, forceRelay: forceRelay);
|
||||
await rustDeskWinManager.newFileTransfer(id,
|
||||
password: password,
|
||||
isSharedPassword: isSharedPassword,
|
||||
forceRelay: forceRelay);
|
||||
} else if (isTcpTunneling || isRDP) {
|
||||
await rustDeskWinManager.newPortForward(id, isRDP, forceRelay: forceRelay);
|
||||
await rustDeskWinManager.newPortForward(id, isRDP,
|
||||
password: password,
|
||||
isSharedPassword: isSharedPassword,
|
||||
forceRelay: forceRelay);
|
||||
} 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 [isTcpTunneling], starts a session only for tcp tunneling.
|
||||
/// If [isRDP], starts a session only for rdp.
|
||||
connect(
|
||||
BuildContext context,
|
||||
String id, {
|
||||
bool isFileTransfer = false,
|
||||
bool isTcpTunneling = false,
|
||||
bool isRDP = false,
|
||||
bool forceRelay = false,
|
||||
}) async {
|
||||
connect(BuildContext context, String id,
|
||||
{bool isFileTransfer = false,
|
||||
bool isTcpTunneling = false,
|
||||
bool isRDP = false,
|
||||
bool forceRelay = false,
|
||||
String? password,
|
||||
bool? isSharedPassword}) async {
|
||||
if (id == '') return;
|
||||
if (!isDesktop || desktopType == DesktopType.main) {
|
||||
try {
|
||||
@ -2150,6 +2158,8 @@ connect(
|
||||
isFileTransfer: isFileTransfer,
|
||||
isTcpTunneling: isTcpTunneling,
|
||||
isRDP: isRDP,
|
||||
password: password,
|
||||
isSharedPassword: isSharedPassword,
|
||||
forceRelay: forceRelay2,
|
||||
);
|
||||
} else {
|
||||
@ -2158,6 +2168,8 @@ connect(
|
||||
'isFileTransfer': isFileTransfer,
|
||||
'isTcpTunneling': isTcpTunneling,
|
||||
'isRDP': isRDP,
|
||||
'password': password,
|
||||
'isSharedPassword': isSharedPassword,
|
||||
'forceRelay': forceRelay,
|
||||
});
|
||||
}
|
||||
@ -2171,14 +2183,16 @@ connect(
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (BuildContext context) => FileManagerPage(id: id),
|
||||
builder: (BuildContext context) => FileManagerPage(
|
||||
id: id, password: password, isSharedPassword: isSharedPassword),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
Navigator.push(
|
||||
context,
|
||||
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 'package:flutter/material.dart';
|
||||
import 'package:flutter_hbb/common.dart';
|
||||
import 'package:flutter_hbb/consts.dart';
|
||||
|
||||
import 'package:flutter_hbb/models/peer_model.dart';
|
||||
@ -188,3 +189,107 @@ class RequestException implements Exception {
|
||||
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 {
|
||||
Map<String, dynamic> recentPeers = jsonDecode(bind.mainLoadRecentPeersSync());
|
||||
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 = {};
|
||||
|
||||
void mergePeers(Map<String, dynamic> peers) {
|
||||
@ -42,8 +39,16 @@ Future<List<Peer>> getAllPeers() async {
|
||||
|
||||
mergePeers(recentPeers);
|
||||
mergePeers(lanPeers);
|
||||
mergePeers(abPeers);
|
||||
mergePeers(groupPeers);
|
||||
for (var p in gFFI.abModel.allPeers()) {
|
||||
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 = [];
|
||||
|
||||
@ -181,7 +186,7 @@ class AutocompletePeerTileState extends State<AutocompletePeerTile> {
|
||||
],
|
||||
))));
|
||||
final colors = _frontN(widget.peer.tags, 25)
|
||||
.map((e) => gFFI.abModel.getTagColor(e))
|
||||
.map((e) => gFFI.abModel.getCurrentAbTagColor(e))
|
||||
.toList();
|
||||
return Tooltip(
|
||||
message: isMobile
|
||||
|
@ -2,11 +2,14 @@ import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:bot_toast/bot_toast.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_hbb/common/shared_state.dart';
|
||||
import 'package:flutter_hbb/common/widgets/setting_widgets.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: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]);
|
||||
}
|
||||
|
||||
void deletePeerConfirmDialog(Function onSubmit, String title) async {
|
||||
void deleteConfirmDialog(Function onSubmit, String title) async {
|
||||
gFFI.dialogManager.show(
|
||||
(setState, close, context) {
|
||||
submit() async {
|
||||
@ -1631,7 +1634,7 @@ void editAbTagDialog(
|
||||
List<dynamic> currentTags, Function(List<dynamic>) onSubmit) {
|
||||
var isInProgress = false;
|
||||
|
||||
final tags = List.of(gFFI.abModel.tags);
|
||||
final tags = List.of(gFFI.abModel.currentAbTags);
|
||||
var selectedTag = currentTags.obs;
|
||||
|
||||
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,
|
||||
child: MyGroupPeerView(
|
||||
menuPadding: widget.menuPadding,
|
||||
initPeers: gFFI.groupModel.peers)),
|
||||
getInitPeers: () => gFFI.groupModel.peers)),
|
||||
)
|
||||
],
|
||||
);
|
||||
@ -115,7 +115,7 @@ class _MyGroupState extends State<MyGroup> {
|
||||
alignment: Alignment.topLeft,
|
||||
child: MyGroupPeerView(
|
||||
menuPadding: widget.menuPadding,
|
||||
initPeers: gFFI.groupModel.peers)),
|
||||
getInitPeers: () => gFFI.groupModel.peers)),
|
||||
)
|
||||
],
|
||||
);
|
||||
|
@ -1,5 +1,6 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:bot_toast/bot_toast.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_hbb/common/widgets/dialog.dart';
|
||||
@ -70,12 +71,12 @@ class _PeerCardState extends State<_PeerCard>
|
||||
peerTabModel.select(peer);
|
||||
} else {
|
||||
if (!isWebDesktop) {
|
||||
connectInPeerTab(context, peer.id, widget.tab);
|
||||
connectInPeerTab(context, peer, widget.tab);
|
||||
}
|
||||
}
|
||||
},
|
||||
onDoubleTap: isWebDesktop
|
||||
? () => connectInPeerTab(context, peer.id, widget.tab)
|
||||
? () => connectInPeerTab(context, peer, widget.tab)
|
||||
: null,
|
||||
onLongPress: () {
|
||||
peerTabModel.select(peer);
|
||||
@ -199,8 +200,9 @@ class _PeerCardState extends State<_PeerCard>
|
||||
)
|
||||
],
|
||||
);
|
||||
final colors =
|
||||
_frontN(peer.tags, 25).map((e) => gFFI.abModel.getTagColor(e)).toList();
|
||||
final colors = _frontN(peer.tags, 25)
|
||||
.map((e) => gFFI.abModel.getCurrentAbTagColor(e))
|
||||
.toList();
|
||||
return Tooltip(
|
||||
message: isMobile
|
||||
? ''
|
||||
@ -216,6 +218,12 @@ class _PeerCardState extends State<_PeerCard>
|
||||
child: child,
|
||||
),
|
||||
),
|
||||
if (_shouldBuildPasswordIcon(peer))
|
||||
Positioned(
|
||||
top: 2,
|
||||
left: isMobile ? 60 : 50,
|
||||
child: Icon(Icons.key, size: 12),
|
||||
),
|
||||
if (colors.isNotEmpty)
|
||||
Positioned(
|
||||
top: 2,
|
||||
@ -310,14 +318,21 @@ class _PeerCardState extends State<_PeerCard>
|
||||
),
|
||||
);
|
||||
|
||||
final colors =
|
||||
_frontN(peer.tags, 25).map((e) => gFFI.abModel.getTagColor(e)).toList();
|
||||
final colors = _frontN(peer.tags, 25)
|
||||
.map((e) => gFFI.abModel.getCurrentAbTagColor(e))
|
||||
.toList();
|
||||
return Tooltip(
|
||||
message: peer.tags.isNotEmpty
|
||||
? '${translate('Tags')}: ${peer.tags.join(', ')}'
|
||||
: '',
|
||||
child: Stack(children: [
|
||||
child,
|
||||
if (_shouldBuildPasswordIcon(peer))
|
||||
Positioned(
|
||||
top: 4,
|
||||
left: 12,
|
||||
child: Icon(Icons.key, size: 12),
|
||||
),
|
||||
if (colors.isNotEmpty)
|
||||
Positioned(
|
||||
top: 4,
|
||||
@ -401,6 +416,12 @@ class _PeerCardState extends State<_PeerCard>
|
||||
onPointerUp: (_) => _showPeerMenu(peer.id),
|
||||
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.
|
||||
/// User might remove the peer or send a file to the peer.
|
||||
void _showPeerMenu(String id) async {
|
||||
@ -431,7 +452,7 @@ abstract class BasePeerCard extends StatelessWidget {
|
||||
peer: peer,
|
||||
tab: tab,
|
||||
connect: (BuildContext context, String id) =>
|
||||
connectInPeerTab(context, id, tab),
|
||||
connectInPeerTab(context, peer, tab),
|
||||
popupMenuEntryBuilder: _buildPopupMenuEntry,
|
||||
);
|
||||
}
|
||||
@ -453,7 +474,6 @@ abstract class BasePeerCard extends StatelessWidget {
|
||||
|
||||
MenuEntryBase<String> _connectCommonAction(
|
||||
BuildContext context,
|
||||
String id,
|
||||
String title, {
|
||||
bool isFileTransfer = false,
|
||||
bool isTcpTunneling = false,
|
||||
@ -467,7 +487,7 @@ abstract class BasePeerCard extends StatelessWidget {
|
||||
proc: () {
|
||||
connectInPeerTab(
|
||||
context,
|
||||
peer.id,
|
||||
peer,
|
||||
tab,
|
||||
isFileTransfer: isFileTransfer,
|
||||
isTcpTunneling: isTcpTunneling,
|
||||
@ -480,10 +500,9 @@ abstract class BasePeerCard extends StatelessWidget {
|
||||
}
|
||||
|
||||
@protected
|
||||
MenuEntryBase<String> _connectAction(BuildContext context, Peer peer) {
|
||||
MenuEntryBase<String> _connectAction(BuildContext context) {
|
||||
return _connectCommonAction(
|
||||
context,
|
||||
peer.id,
|
||||
(peer.alias.isEmpty
|
||||
? translate('Connect')
|
||||
: '${translate('Connect')} ${peer.id}'),
|
||||
@ -491,20 +510,18 @@ abstract class BasePeerCard extends StatelessWidget {
|
||||
}
|
||||
|
||||
@protected
|
||||
MenuEntryBase<String> _transferFileAction(BuildContext context, String id) {
|
||||
MenuEntryBase<String> _transferFileAction(BuildContext context) {
|
||||
return _connectCommonAction(
|
||||
context,
|
||||
id,
|
||||
translate('Transfer file'),
|
||||
isFileTransfer: true,
|
||||
);
|
||||
}
|
||||
|
||||
@protected
|
||||
MenuEntryBase<String> _tcpTunnelingAction(BuildContext context, String id) {
|
||||
MenuEntryBase<String> _tcpTunnelingAction(BuildContext context) {
|
||||
return _connectCommonAction(
|
||||
context,
|
||||
id,
|
||||
translate('TCP tunneling'),
|
||||
isTcpTunneling: true,
|
||||
);
|
||||
@ -541,7 +558,7 @@ abstract class BasePeerCard extends StatelessWidget {
|
||||
],
|
||||
)),
|
||||
proc: () {
|
||||
connectInPeerTab(context, id, tab, isRDP: true);
|
||||
connectInPeerTab(context, peer, tab, isRDP: true);
|
||||
},
|
||||
padding: menuPadding,
|
||||
dismissOnClicked: true,
|
||||
@ -648,9 +665,8 @@ abstract class BasePeerCard extends StatelessWidget {
|
||||
onSubmit: (String newName) async {
|
||||
if (newName != oldName) {
|
||||
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);
|
||||
gFFI.abModel.pushAb();
|
||||
} else {
|
||||
await bind.mainSetPeerAlias(id: id, alias: newName);
|
||||
showToast(translate('Successful'));
|
||||
@ -702,11 +718,7 @@ abstract class BasePeerCard extends StatelessWidget {
|
||||
await bind.mainLoadLanPeers();
|
||||
break;
|
||||
case PeerTabIndex.ab:
|
||||
gFFI.abModel.deletePeer(id);
|
||||
final future = gFFI.abModel.pushAb();
|
||||
if (await bind.mainPeerExists(id: peer.id)) {
|
||||
gFFI.abModel.reSyncToast(future);
|
||||
}
|
||||
await gFFI.abModel.deletePeers([id]);
|
||||
break;
|
||||
case PeerTabIndex.group:
|
||||
break;
|
||||
@ -716,7 +728,7 @@ abstract class BasePeerCard extends StatelessWidget {
|
||||
}
|
||||
}
|
||||
|
||||
deletePeerConfirmDialog(onSubmit,
|
||||
deleteConfirmDialog(onSubmit,
|
||||
'${translate('Delete')} "${peer.alias.isEmpty ? formatID(peer.id) : peer.alias}"?');
|
||||
},
|
||||
padding: menuPadding,
|
||||
@ -732,14 +744,14 @@ abstract class BasePeerCard extends StatelessWidget {
|
||||
style: style,
|
||||
),
|
||||
proc: () async {
|
||||
bool result = gFFI.abModel.changePassword(id, '');
|
||||
bool succ = await gFFI.abModel.changePersonalHashPassword(id, '');
|
||||
await bind.mainForgetPassword(id: id);
|
||||
bool toast = false;
|
||||
if (result) {
|
||||
toast = tab == PeerTabIndex.ab;
|
||||
gFFI.abModel.pushAb(toastIfFail: toast, toastIfSucc: toast);
|
||||
if (succ) {
|
||||
showToast(translate('Successful'));
|
||||
} else {
|
||||
BotToast.showText(
|
||||
contentColor: Colors.red, text: translate("Failed"));
|
||||
}
|
||||
if (!toast) showToast(translate('Successful'));
|
||||
},
|
||||
padding: menuPadding,
|
||||
dismissOnClicked: true,
|
||||
@ -824,13 +836,7 @@ abstract class BasePeerCard extends StatelessWidget {
|
||||
),
|
||||
proc: () {
|
||||
() async {
|
||||
if (gFFI.abModel.isFull(true)) {
|
||||
return;
|
||||
}
|
||||
if (!gFFI.abModel.idContainBy(peer.id)) {
|
||||
gFFI.abModel.addPeer(peer);
|
||||
gFFI.abModel.pushAb();
|
||||
}
|
||||
addPeersToAbDialog([Peer.copy(peer)]);
|
||||
}();
|
||||
},
|
||||
padding: menuPadding,
|
||||
@ -858,14 +864,14 @@ class RecentPeerCard extends BasePeerCard {
|
||||
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
||||
BuildContext context) async {
|
||||
final List<MenuEntryBase<String>> menuItems = [
|
||||
_connectAction(context, peer),
|
||||
_transferFileAction(context, peer.id),
|
||||
_connectAction(context),
|
||||
_transferFileAction(context),
|
||||
];
|
||||
|
||||
final List favs = (await bind.mainGetFav()).toList();
|
||||
|
||||
if (isDesktop && peer.platform != kPeerPlatformAndroid) {
|
||||
menuItems.add(_tcpTunnelingAction(context, peer.id));
|
||||
menuItems.add(_tcpTunnelingAction(context));
|
||||
}
|
||||
// menuItems.add(await _openNewConnInOptAction(peer.id));
|
||||
menuItems.add(await _forceAlwaysRelayAction(peer.id));
|
||||
@ -888,9 +894,7 @@ class RecentPeerCard extends BasePeerCard {
|
||||
}
|
||||
|
||||
if (gFFI.userModel.userName.isNotEmpty) {
|
||||
if (!gFFI.abModel.idContainBy(peer.id)) {
|
||||
menuItems.add(_addToAb(peer));
|
||||
}
|
||||
menuItems.add(_addToAb(peer));
|
||||
}
|
||||
|
||||
menuItems.add(MenuEntryDivider());
|
||||
@ -915,11 +919,11 @@ class FavoritePeerCard extends BasePeerCard {
|
||||
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
||||
BuildContext context) async {
|
||||
final List<MenuEntryBase<String>> menuItems = [
|
||||
_connectAction(context, peer),
|
||||
_transferFileAction(context, peer.id),
|
||||
_connectAction(context),
|
||||
_transferFileAction(context),
|
||||
];
|
||||
if (isDesktop && peer.platform != kPeerPlatformAndroid) {
|
||||
menuItems.add(_tcpTunnelingAction(context, peer.id));
|
||||
menuItems.add(_tcpTunnelingAction(context));
|
||||
}
|
||||
// menuItems.add(await _openNewConnInOptAction(peer.id));
|
||||
menuItems.add(await _forceAlwaysRelayAction(peer.id));
|
||||
@ -939,9 +943,7 @@ class FavoritePeerCard extends BasePeerCard {
|
||||
}));
|
||||
|
||||
if (gFFI.userModel.userName.isNotEmpty) {
|
||||
if (!gFFI.abModel.idContainBy(peer.id)) {
|
||||
menuItems.add(_addToAb(peer));
|
||||
}
|
||||
menuItems.add(_addToAb(peer));
|
||||
}
|
||||
|
||||
menuItems.add(MenuEntryDivider());
|
||||
@ -966,14 +968,14 @@ class DiscoveredPeerCard extends BasePeerCard {
|
||||
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
||||
BuildContext context) async {
|
||||
final List<MenuEntryBase<String>> menuItems = [
|
||||
_connectAction(context, peer),
|
||||
_transferFileAction(context, peer.id),
|
||||
_connectAction(context),
|
||||
_transferFileAction(context),
|
||||
];
|
||||
|
||||
final List favs = (await bind.mainGetFav()).toList();
|
||||
|
||||
if (isDesktop && peer.platform != kPeerPlatformAndroid) {
|
||||
menuItems.add(_tcpTunnelingAction(context, peer.id));
|
||||
menuItems.add(_tcpTunnelingAction(context));
|
||||
}
|
||||
// menuItems.add(await _openNewConnInOptAction(peer.id));
|
||||
menuItems.add(await _forceAlwaysRelayAction(peer.id));
|
||||
@ -992,9 +994,7 @@ class DiscoveredPeerCard extends BasePeerCard {
|
||||
}
|
||||
|
||||
if (gFFI.userModel.userName.isNotEmpty) {
|
||||
if (!gFFI.abModel.idContainBy(peer.id)) {
|
||||
menuItems.add(_addToAb(peer));
|
||||
}
|
||||
menuItems.add(_addToAb(peer));
|
||||
}
|
||||
|
||||
menuItems.add(MenuEntryDivider());
|
||||
@ -1019,31 +1019,45 @@ class AddressBookPeerCard extends BasePeerCard {
|
||||
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
||||
BuildContext context) async {
|
||||
final List<MenuEntryBase<String>> menuItems = [
|
||||
_connectAction(context, peer),
|
||||
_transferFileAction(context, peer.id),
|
||||
_connectAction(context),
|
||||
_transferFileAction(context),
|
||||
];
|
||||
if (isDesktop && peer.platform != kPeerPlatformAndroid) {
|
||||
menuItems.add(_tcpTunnelingAction(context, peer.id));
|
||||
menuItems.add(_tcpTunnelingAction(context));
|
||||
}
|
||||
// menuItems.add(await _openNewConnInOptAction(peer.id));
|
||||
menuItems.add(await _forceAlwaysRelayAction(peer.id));
|
||||
// menuItems.add(await _forceAlwaysRelayAction(peer.id));
|
||||
if (Platform.isWindows && peer.platform == kPeerPlatformWindows) {
|
||||
menuItems.add(_rdpAction(context, peer.id));
|
||||
}
|
||||
if (Platform.isWindows) {
|
||||
menuItems.add(_createShortCutAction(peer.id));
|
||||
}
|
||||
menuItems.add(MenuEntryDivider());
|
||||
menuItems.add(_renameAction(peer.id));
|
||||
if (peer.hash.isNotEmpty) {
|
||||
menuItems.add(_unrememberPasswordAction(peer.id));
|
||||
if (gFFI.abModel.current.canWrite()) {
|
||||
menuItems.add(MenuEntryDivider());
|
||||
menuItems.add(_renameAction(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) {
|
||||
menuItems.add(_editTagAction(peer.id));
|
||||
final addressbooks = gFFI.abModel.addressBooksCanWrite();
|
||||
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;
|
||||
}
|
||||
|
||||
@ -1060,8 +1074,7 @@ class AddressBookPeerCard extends BasePeerCard {
|
||||
),
|
||||
proc: () {
|
||||
editAbTagDialog(gFFI.abModel.getPeerTags(id), (selectedTag) async {
|
||||
gFFI.abModel.changeTagForPeer(id, selectedTag);
|
||||
gFFI.abModel.pushAb();
|
||||
await gFFI.abModel.changeTagForPeers([id], selectedTag);
|
||||
});
|
||||
},
|
||||
padding: super.menuPadding,
|
||||
@ -1073,6 +1086,52 @@ class AddressBookPeerCard extends BasePeerCard {
|
||||
@override
|
||||
Future<String> _getAlias(String id) async =>
|
||||
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 {
|
||||
@ -1087,11 +1146,11 @@ class MyGroupPeerCard extends BasePeerCard {
|
||||
Future<List<MenuEntryBase<String>>> _buildMenuItems(
|
||||
BuildContext context) async {
|
||||
final List<MenuEntryBase<String>> menuItems = [
|
||||
_connectAction(context, peer),
|
||||
_transferFileAction(context, peer.id),
|
||||
_connectAction(context),
|
||||
_transferFileAction(context),
|
||||
];
|
||||
if (isDesktop && peer.platform != kPeerPlatformAndroid) {
|
||||
menuItems.add(_tcpTunnelingAction(context, peer.id));
|
||||
menuItems.add(_tcpTunnelingAction(context));
|
||||
}
|
||||
// menuItems.add(await _openNewConnInOptAction(peer.id));
|
||||
// menuItems.add(await _forceAlwaysRelayAction(peer.id));
|
||||
@ -1107,9 +1166,7 @@ class MyGroupPeerCard extends BasePeerCard {
|
||||
// menuItems.add(_unrememberPasswordAction(peer.id));
|
||||
// }
|
||||
if (gFFI.userModel.userName.isNotEmpty) {
|
||||
if (!gFFI.abModel.idContainBy(peer.id)) {
|
||||
menuItems.add(_addToAb(peer));
|
||||
}
|
||||
menuItems.add(_addToAb(peer));
|
||||
}
|
||||
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 isTcpTunneling = false,
|
||||
bool isRDP = false}) async {
|
||||
var password = '';
|
||||
bool isSharedPassword = false;
|
||||
if (tab == PeerTabIndex.ab) {
|
||||
// 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
|
||||
Peer? p = gFFI.abModel.find(id);
|
||||
if (p != null &&
|
||||
p.alias.isNotEmpty &&
|
||||
(await bind.mainGetPeerOption(id: id, key: "alias")).isEmpty) {
|
||||
if (peer.alias.isNotEmpty &&
|
||||
(await bind.mainGetPeerOption(id: peer.id, key: "alias")).isEmpty) {
|
||||
await bind.mainSetPeerAlias(
|
||||
id: id,
|
||||
alias: p.alias,
|
||||
id: peer.id,
|
||||
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,
|
||||
isTcpTunneling: isTcpTunneling,
|
||||
isRDP: isRDP);
|
||||
|
@ -13,6 +13,7 @@ import 'package:flutter_hbb/desktop/widgets/material_mod_popup_menu.dart'
|
||||
as mod_menu;
|
||||
import 'package:flutter_hbb/desktop/widgets/tabbar_widget.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_svg/flutter_svg.dart';
|
||||
@ -392,21 +393,7 @@ class _PeerTabPageState extends State<PeerTabPage>
|
||||
await bind.mainLoadLanPeers();
|
||||
break;
|
||||
case 3:
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
await gFFI.abModel.deletePeers(peers.map((p) => p.id).toList());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -415,7 +402,7 @@ class _PeerTabPageState extends State<PeerTabPage>
|
||||
if (model.currentTab != 3) showToast(translate('Successful'));
|
||||
}
|
||||
|
||||
deletePeerConfirmDialog(onSubmit, translate('Delete'));
|
||||
deleteConfirmDialog(onSubmit, translate('Delete'));
|
||||
},
|
||||
child: Tooltip(
|
||||
message: translate('Delete'),
|
||||
@ -450,24 +437,18 @@ class _PeerTabPageState extends State<PeerTabPage>
|
||||
|
||||
Widget addSelectionToAb() {
|
||||
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(
|
||||
offstage:
|
||||
!gFFI.userModel.isLogin || model.currentTab == PeerTabIndex.ab.index,
|
||||
offstage: !gFFI.userModel.isLogin || addressbooks.isEmpty,
|
||||
child: _hoverAction(
|
||||
context: context,
|
||||
onTap: () {
|
||||
if (gFFI.abModel.isFull(true)) {
|
||||
return;
|
||||
}
|
||||
final peers = model.selectedPeers;
|
||||
gFFI.abModel.addPeers(peers);
|
||||
final future = gFFI.abModel.pushAb();
|
||||
final peers = model.selectedPeers.map((e) => Peer.copy(e)).toList();
|
||||
addPeersToAbDialog(peers);
|
||||
model.setMultiSelectionMode(false);
|
||||
Future.delayed(Duration.zero, () async {
|
||||
await future;
|
||||
await Future.delayed(Duration(seconds: 2)); // toast
|
||||
gFFI.abModel.isFull(true);
|
||||
});
|
||||
},
|
||||
child: Tooltip(
|
||||
message: translate('Add to address book'),
|
||||
@ -481,15 +462,14 @@ class _PeerTabPageState extends State<PeerTabPage>
|
||||
return Offstage(
|
||||
offstage: !gFFI.userModel.isLogin ||
|
||||
model.currentTab != PeerTabIndex.ab.index ||
|
||||
gFFI.abModel.tags.isEmpty,
|
||||
gFFI.abModel.currentAbTags.isEmpty,
|
||||
child: _hoverAction(
|
||||
context: context,
|
||||
onTap: () {
|
||||
editAbTagDialog(List.empty(), (selectedTags) async {
|
||||
final peers = model.selectedPeers;
|
||||
gFFI.abModel.changeTagForPeers(
|
||||
await gFFI.abModel.changeTagForPeers(
|
||||
peers.map((p) => p.id).toList(), selectedTags);
|
||||
gFFI.abModel.pushAb();
|
||||
model.setMultiSelectionMode(false);
|
||||
showToast(translate('Successful'));
|
||||
});
|
||||
@ -556,7 +536,8 @@ class _PeerTabPageState extends State<PeerTabPage>
|
||||
final model = Provider.of<PeerTabModel>(context);
|
||||
return [
|
||||
const PeerSearchBar().marginOnly(right: isMobile ? 0 : 13),
|
||||
_createRefresh(index: PeerTabIndex.ab, loading: gFFI.abModel.abLoading),
|
||||
_createRefresh(
|
||||
index: PeerTabIndex.ab, loading: gFFI.abModel.currentAbLoading),
|
||||
_createRefresh(
|
||||
index: PeerTabIndex.group, loading: gFFI.groupModel.groupLoading),
|
||||
Offstage(
|
||||
@ -624,7 +605,8 @@ class _PeerTabPageState extends State<PeerTabPage>
|
||||
List<Widget> actions = [
|
||||
const PeerSearchBar(),
|
||||
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)
|
||||
_createRefresh(
|
||||
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.
|
||||
// Because the currentTab change event will trigger the peers change event,
|
||||
// and the peers change event will trigger _buildPeersView().
|
||||
final currentTab = Provider.of<PeerTabModel>(context, listen: false).currentTab;
|
||||
final hideAbTagsPanel = bind.mainGetLocalOption(key: "hideAbTagsPanel").isNotEmpty;
|
||||
final currentTab =
|
||||
Provider.of<PeerTabModel>(context, listen: false).currentTab;
|
||||
final hideAbTagsPanel =
|
||||
bind.mainGetLocalOption(key: "hideAbTagsPanel").isNotEmpty;
|
||||
return isDesktop
|
||||
? Obx(
|
||||
() => SizedBox(
|
||||
width: peerCardUiType.value != PeerUiType.list
|
||||
? 220
|
||||
: currentTab == PeerTabIndex.group.index || (currentTab == PeerTabIndex.ab.index && !hideAbTagsPanel)
|
||||
? windowWidth - 390 :
|
||||
windowWidth - 227,
|
||||
height:
|
||||
peerCardUiType.value == PeerUiType.grid ? 140 : peerCardUiType.value != PeerUiType.list ? 42 : 45,
|
||||
: currentTab == PeerTabIndex.group.index ||
|
||||
(currentTab == PeerTabIndex.ab.index &&
|
||||
!hideAbTagsPanel)
|
||||
? windowWidth - 390
|
||||
: windowWidth - 227,
|
||||
height: peerCardUiType.value == PeerUiType.grid
|
||||
? 140
|
||||
: peerCardUiType.value != PeerUiType.list
|
||||
? 42
|
||||
: 45,
|
||||
child: visibilityChild,
|
||||
),
|
||||
)
|
||||
@ -354,7 +361,7 @@ abstract class BasePeersView extends StatelessWidget {
|
||||
final String loadEvent;
|
||||
final PeerFilter? peerFilter;
|
||||
final PeerCardBuilder peerCardBuilder;
|
||||
final RxList<Peer>? initPeers;
|
||||
final GetInitPeers? getInitPeers;
|
||||
|
||||
const BasePeersView({
|
||||
Key? key,
|
||||
@ -362,13 +369,14 @@ abstract class BasePeersView extends StatelessWidget {
|
||||
required this.loadEvent,
|
||||
this.peerFilter,
|
||||
required this.peerCardBuilder,
|
||||
required this.initPeers,
|
||||
required this.getInitPeers,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return _PeersView(
|
||||
peers: Peers(name: name, loadEvent: loadEvent, initPeers: initPeers),
|
||||
peers:
|
||||
Peers(name: name, loadEvent: loadEvent, getInitPeers: getInitPeers),
|
||||
peerFilter: peerFilter,
|
||||
peerCardBuilder: peerCardBuilder);
|
||||
}
|
||||
@ -385,7 +393,7 @@ class RecentPeersView extends BasePeersView {
|
||||
peer: peer,
|
||||
menuPadding: menuPadding,
|
||||
),
|
||||
initPeers: null,
|
||||
getInitPeers: null,
|
||||
);
|
||||
|
||||
@override
|
||||
@ -407,7 +415,7 @@ class FavoritePeersView extends BasePeersView {
|
||||
peer: peer,
|
||||
menuPadding: menuPadding,
|
||||
),
|
||||
initPeers: null,
|
||||
getInitPeers: null,
|
||||
);
|
||||
|
||||
@override
|
||||
@ -429,7 +437,7 @@ class DiscoveredPeersView extends BasePeersView {
|
||||
peer: peer,
|
||||
menuPadding: menuPadding,
|
||||
),
|
||||
initPeers: null,
|
||||
getInitPeers: null,
|
||||
);
|
||||
|
||||
@override
|
||||
@ -445,7 +453,7 @@ class AddressBookPeersView extends BasePeersView {
|
||||
{Key? key,
|
||||
EdgeInsets? menuPadding,
|
||||
ScrollController? scrollController,
|
||||
required RxList<Peer> initPeers})
|
||||
required GetInitPeers getInitPeers})
|
||||
: super(
|
||||
key: key,
|
||||
name: 'address book peer',
|
||||
@ -456,7 +464,7 @@ class AddressBookPeersView extends BasePeersView {
|
||||
peer: peer,
|
||||
menuPadding: menuPadding,
|
||||
),
|
||||
initPeers: initPeers,
|
||||
getInitPeers: getInitPeers,
|
||||
);
|
||||
|
||||
static bool _hitTag(List<dynamic> selectedTags, List<dynamic> idents) {
|
||||
@ -486,7 +494,7 @@ class MyGroupPeerView extends BasePeersView {
|
||||
{Key? key,
|
||||
EdgeInsets? menuPadding,
|
||||
ScrollController? scrollController,
|
||||
required RxList<Peer> initPeers})
|
||||
required GetInitPeers getInitPeers})
|
||||
: super(
|
||||
key: key,
|
||||
name: 'group peer',
|
||||
@ -496,7 +504,7 @@ class MyGroupPeerView extends BasePeersView {
|
||||
peer: peer,
|
||||
menuPadding: menuPadding,
|
||||
),
|
||||
initPeers: initPeers,
|
||||
getInitPeers: getInitPeers,
|
||||
);
|
||||
|
||||
static bool filter(Peer peer) {
|
||||
|
@ -359,6 +359,7 @@ class _ConnectionPageState extends State<ConnectionPage>
|
||||
platform: '',
|
||||
tags: [],
|
||||
hash: '',
|
||||
password: '',
|
||||
forceAlwaysRelay: false,
|
||||
rdpPort: '',
|
||||
rdpUsername: '',
|
||||
|
@ -800,6 +800,7 @@ class _DesktopHomePageState extends State<DesktopHomePage>
|
||||
isFileTransfer: call.arguments['isFileTransfer'],
|
||||
isTcpTunneling: call.arguments['isTcpTunneling'],
|
||||
isRDP: call.arguments['isRDP'],
|
||||
password: call.arguments['password'],
|
||||
forceRelay: call.arguments['forceRelay'],
|
||||
);
|
||||
} else if (call.method == kWindowEventMoveTabToNewWindow) {
|
||||
|
@ -53,11 +53,13 @@ class FileManagerPage extends StatefulWidget {
|
||||
{Key? key,
|
||||
required this.id,
|
||||
required this.password,
|
||||
required this.isSharedPassword,
|
||||
required this.tabController,
|
||||
this.forceRelay})
|
||||
: super(key: key);
|
||||
final String id;
|
||||
final String? password;
|
||||
final bool? isSharedPassword;
|
||||
final bool? forceRelay;
|
||||
final DesktopTabController tabController;
|
||||
|
||||
@ -84,6 +86,7 @@ class _FileManagerPageState extends State<FileManagerPage>
|
||||
_ffi.start(widget.id,
|
||||
isFileTransfer: true,
|
||||
password: widget.password,
|
||||
isSharedPassword: widget.isSharedPassword,
|
||||
forceRelay: widget.forceRelay);
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
_ffi.dialogManager
|
||||
|
@ -45,6 +45,7 @@ class _FileManagerTabPageState extends State<FileManagerTabPage> {
|
||||
key: ValueKey(params['id']),
|
||||
id: params['id'],
|
||||
password: params['password'],
|
||||
isSharedPassword: params['isSharedPassword'],
|
||||
tabController: tabController,
|
||||
forceRelay: params['forceRelay'],
|
||||
)));
|
||||
@ -74,6 +75,7 @@ class _FileManagerTabPageState extends State<FileManagerTabPage> {
|
||||
key: ValueKey(id),
|
||||
id: id,
|
||||
password: args['password'],
|
||||
isSharedPassword: args['isSharedPassword'],
|
||||
tabController: tabController,
|
||||
forceRelay: args['forceRelay'],
|
||||
)));
|
||||
|
@ -25,19 +25,21 @@ class _PortForward {
|
||||
}
|
||||
|
||||
class PortForwardPage extends StatefulWidget {
|
||||
const PortForwardPage(
|
||||
{Key? key,
|
||||
required this.id,
|
||||
required this.password,
|
||||
required this.tabController,
|
||||
required this.isRDP,
|
||||
this.forceRelay})
|
||||
: super(key: key);
|
||||
const PortForwardPage({
|
||||
Key? key,
|
||||
required this.id,
|
||||
required this.password,
|
||||
required this.tabController,
|
||||
required this.isRDP,
|
||||
required this.isSharedPassword,
|
||||
this.forceRelay,
|
||||
}) : super(key: key);
|
||||
final String id;
|
||||
final String? password;
|
||||
final DesktopTabController tabController;
|
||||
final bool isRDP;
|
||||
final bool? forceRelay;
|
||||
final bool? isSharedPassword;
|
||||
|
||||
@override
|
||||
State<PortForwardPage> createState() => _PortForwardPageState();
|
||||
@ -58,6 +60,7 @@ class _PortForwardPageState extends State<PortForwardPage>
|
||||
_ffi.start(widget.id,
|
||||
isPortForward: true,
|
||||
password: widget.password,
|
||||
isSharedPassword: widget.isSharedPassword,
|
||||
forceRelay: widget.forceRelay,
|
||||
isRdp: widget.isRDP);
|
||||
Get.put(_ffi, tag: 'pf_${widget.id}');
|
||||
|
@ -44,6 +44,7 @@ class _PortForwardTabPageState extends State<PortForwardTabPage> {
|
||||
key: ValueKey(params['id']),
|
||||
id: params['id'],
|
||||
password: params['password'],
|
||||
isSharedPassword: params['isSharedPassword'],
|
||||
tabController: tabController,
|
||||
isRDP: isRDP,
|
||||
forceRelay: params['forceRelay'],
|
||||
@ -79,6 +80,7 @@ class _PortForwardTabPageState extends State<PortForwardTabPage> {
|
||||
key: ValueKey(args['id']),
|
||||
id: id,
|
||||
password: args['password'],
|
||||
isSharedPassword: args['isSharedPassword'],
|
||||
isRDP: isRDP,
|
||||
tabController: tabController,
|
||||
forceRelay: args['forceRelay'],
|
||||
|
@ -45,6 +45,7 @@ class RemotePage extends StatefulWidget {
|
||||
required this.tabController,
|
||||
this.switchUuid,
|
||||
this.forceRelay,
|
||||
this.isSharedPassword,
|
||||
}) : super(key: key);
|
||||
|
||||
final String id;
|
||||
@ -56,6 +57,7 @@ class RemotePage extends StatefulWidget {
|
||||
final ToolbarState toolbarState;
|
||||
final String? switchUuid;
|
||||
final bool? forceRelay;
|
||||
final bool? isSharedPassword;
|
||||
final SimpleWrapper<State<RemotePage>?> _lastState = SimpleWrapper(null);
|
||||
final DesktopTabController tabController;
|
||||
|
||||
@ -111,6 +113,7 @@ class _RemotePageState extends State<RemotePage>
|
||||
_ffi.start(
|
||||
widget.id,
|
||||
password: widget.password,
|
||||
isSharedPassword: widget.isSharedPassword,
|
||||
switchUuid: widget.switchUuid,
|
||||
forceRelay: widget.forceRelay,
|
||||
tabWindowId: widget.tabWindowId,
|
||||
|
@ -95,6 +95,7 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
||||
tabController: tabController,
|
||||
switchUuid: params['switch_uuid'],
|
||||
forceRelay: params['forceRelay'],
|
||||
isSharedPassword: params['isSharedPassword'],
|
||||
),
|
||||
));
|
||||
_update_remote_count();
|
||||
@ -153,6 +154,7 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
||||
tabController: tabController,
|
||||
switchUuid: switchUuid,
|
||||
forceRelay: args['forceRelay'],
|
||||
isSharedPassword: args['isSharedPassword'],
|
||||
),
|
||||
));
|
||||
} else if (call.method == kWindowDisableGrabKeyboard) {
|
||||
|
@ -166,6 +166,7 @@ class _ConnectionPageState extends State<ConnectionPage> {
|
||||
platform: '',
|
||||
tags: [],
|
||||
hash: '',
|
||||
password: '',
|
||||
forceAlwaysRelay: false,
|
||||
rdpPort: '',
|
||||
rdpUsername: '',
|
||||
|
@ -12,8 +12,12 @@ import '../../common.dart';
|
||||
import '../../common/widgets/dialog.dart';
|
||||
|
||||
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? password;
|
||||
final bool? isSharedPassword;
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() => _FileManagerPageState();
|
||||
@ -68,7 +72,10 @@ class _FileManagerPageState extends State<FileManagerPage> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
gFFI.start(widget.id, isFileTransfer: true);
|
||||
gFFI.start(widget.id,
|
||||
isFileTransfer: true,
|
||||
password: widget.password,
|
||||
isSharedPassword: widget.isSharedPassword);
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
gFFI.dialogManager
|
||||
.showLoading(translate('Connecting...'), onCancel: closeConnection);
|
||||
|
@ -25,9 +25,12 @@ import '../widgets/dialog.dart';
|
||||
final initText = '1' * 1024;
|
||||
|
||||
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? password;
|
||||
final bool? isSharedPassword;
|
||||
|
||||
@override
|
||||
State<RemotePage> createState() => _RemotePageState();
|
||||
@ -54,7 +57,11 @@ class _RemotePageState extends State<RemotePage> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
gFFI.start(widget.id);
|
||||
gFFI.start(
|
||||
widget.id,
|
||||
password: widget.password,
|
||||
isSharedPassword: widget.isSharedPassword,
|
||||
);
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []);
|
||||
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 password = evt['password'];
|
||||
if (id != null && password != null) {
|
||||
if (gFFI.abModel
|
||||
.changePassword(id.toString(), password.toString())) {
|
||||
gFFI.abModel.pushAb(toastIfFail: false, toastIfSucc: false);
|
||||
}
|
||||
gFFI.abModel
|
||||
.changePersonalHashPassword(id.toString(), password.toString());
|
||||
}
|
||||
}
|
||||
} else if (name == "cm_file_transfer_log") {
|
||||
@ -2179,6 +2177,7 @@ class FFI {
|
||||
bool isRdp = false,
|
||||
String? switchUuid,
|
||||
String? password,
|
||||
bool? isSharedPassword,
|
||||
bool? forceRelay,
|
||||
int? tabWindowId,
|
||||
int? display,
|
||||
@ -2212,6 +2211,7 @@ class FFI {
|
||||
switchUuid: switchUuid ?? '',
|
||||
forceRelay: forceRelay ?? false,
|
||||
password: password ?? '',
|
||||
isSharedPassword: isSharedPassword ?? false,
|
||||
);
|
||||
} else if (display != null) {
|
||||
if (displays == null) {
|
||||
|
@ -7,7 +7,8 @@ import 'package:collection/collection.dart';
|
||||
|
||||
class Peer {
|
||||
final String id;
|
||||
String hash;
|
||||
String hash; // personal ab hash password
|
||||
String password; // shared ab password
|
||||
String username; // pc username
|
||||
String hostname;
|
||||
String platform;
|
||||
@ -18,6 +19,7 @@ class Peer {
|
||||
String rdpUsername;
|
||||
bool online = false;
|
||||
String loginName; //login username
|
||||
bool? sameServer;
|
||||
|
||||
String getId() {
|
||||
if (alias != '') {
|
||||
@ -29,6 +31,7 @@ class Peer {
|
||||
Peer.fromJson(Map<String, dynamic> json)
|
||||
: id = json['id'] ?? '',
|
||||
hash = json['hash'] ?? '',
|
||||
password = json['password'] ?? '',
|
||||
username = json['username'] ?? '',
|
||||
hostname = json['hostname'] ?? '',
|
||||
platform = json['platform'] ?? '',
|
||||
@ -37,12 +40,14 @@ class Peer {
|
||||
forceAlwaysRelay = json['forceAlwaysRelay'] == 'true',
|
||||
rdpPort = json['rdpPort'] ?? '',
|
||||
rdpUsername = json['rdpUsername'] ?? '',
|
||||
loginName = json['loginName'] ?? '';
|
||||
loginName = json['loginName'] ?? '',
|
||||
sameServer = json['same_server'];
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return <String, dynamic>{
|
||||
"id": id,
|
||||
"hash": hash,
|
||||
"password": password,
|
||||
"username": username,
|
||||
"hostname": hostname,
|
||||
"platform": platform,
|
||||
@ -52,13 +57,43 @@ class Peer {
|
||||
"rdpPort": rdpPort,
|
||||
"rdpUsername": rdpUsername,
|
||||
'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>{
|
||||
"id": id,
|
||||
"hash": hash,
|
||||
"username": username,
|
||||
"hostname": hostname,
|
||||
"platform": platform,
|
||||
@ -80,6 +115,7 @@ class Peer {
|
||||
Peer({
|
||||
required this.id,
|
||||
required this.hash,
|
||||
required this.password,
|
||||
required this.username,
|
||||
required this.hostname,
|
||||
required this.platform,
|
||||
@ -89,12 +125,14 @@ class Peer {
|
||||
required this.rdpPort,
|
||||
required this.rdpUsername,
|
||||
required this.loginName,
|
||||
this.sameServer,
|
||||
});
|
||||
|
||||
Peer.loading()
|
||||
: this(
|
||||
id: '...',
|
||||
hash: '',
|
||||
password: '',
|
||||
username: '...',
|
||||
hostname: '...',
|
||||
platform: '...',
|
||||
@ -108,6 +146,7 @@ class Peer {
|
||||
bool equal(Peer other) {
|
||||
return id == other.id &&
|
||||
hash == other.hash &&
|
||||
password == other.password &&
|
||||
username == other.username &&
|
||||
hostname == other.hostname &&
|
||||
platform == other.platform &&
|
||||
@ -121,33 +160,38 @@ class Peer {
|
||||
|
||||
Peer.copy(Peer other)
|
||||
: this(
|
||||
id: other.id,
|
||||
hash: other.hash,
|
||||
username: other.username,
|
||||
hostname: other.hostname,
|
||||
platform: other.platform,
|
||||
alias: other.alias,
|
||||
tags: other.tags.toList(),
|
||||
forceAlwaysRelay: other.forceAlwaysRelay,
|
||||
rdpPort: other.rdpPort,
|
||||
rdpUsername: other.rdpUsername,
|
||||
loginName: other.loginName,
|
||||
);
|
||||
id: other.id,
|
||||
hash: other.hash,
|
||||
password: other.password,
|
||||
username: other.username,
|
||||
hostname: other.hostname,
|
||||
platform: other.platform,
|
||||
alias: other.alias,
|
||||
tags: other.tags.toList(),
|
||||
forceAlwaysRelay: other.forceAlwaysRelay,
|
||||
rdpPort: other.rdpPort,
|
||||
rdpUsername: other.rdpUsername,
|
||||
loginName: other.loginName,
|
||||
sameServer: other.sameServer);
|
||||
}
|
||||
|
||||
enum UpdateEvent { online, load }
|
||||
|
||||
typedef GetInitPeers = RxList<Peer> Function();
|
||||
|
||||
class Peers extends ChangeNotifier {
|
||||
final String name;
|
||||
final String loadEvent;
|
||||
List<Peer> peers = List.empty(growable: true);
|
||||
final RxList<Peer>? initPeers;
|
||||
final GetInitPeers? getInitPeers;
|
||||
UpdateEvent event = UpdateEvent.load;
|
||||
static const _cbQueryOnlines = 'callback_query_onlines';
|
||||
|
||||
Peers(
|
||||
{required this.name, required this.initPeers, required this.loadEvent}) {
|
||||
peers = initPeers ?? [];
|
||||
{required this.name,
|
||||
required this.getInitPeers,
|
||||
required this.loadEvent}) {
|
||||
peers = getInitPeers?.call() ?? [];
|
||||
platformFFI.registerEventHandler(_cbQueryOnlines, name, (evt) async {
|
||||
_updateOnlineState(evt);
|
||||
});
|
||||
@ -198,8 +242,8 @@ class Peers extends ChangeNotifier {
|
||||
|
||||
void _updatePeers(Map<String, dynamic> evt) {
|
||||
final onlineStates = _getOnlineStates();
|
||||
if (initPeers != null) {
|
||||
peers = initPeers!;
|
||||
if (getInitPeers != null) {
|
||||
peers = getInitPeers?.call() ?? [];
|
||||
} else {
|
||||
peers = _decodePeers(evt['peers']);
|
||||
}
|
||||
|
@ -194,6 +194,7 @@ class RustDeskMultiWindowManager {
|
||||
bool? forceRelay,
|
||||
String? switchUuid,
|
||||
bool? isRDP,
|
||||
bool? isSharedPassword,
|
||||
}) async {
|
||||
var params = {
|
||||
"type": type.index,
|
||||
@ -207,6 +208,9 @@ class RustDeskMultiWindowManager {
|
||||
if (isRDP != null) {
|
||||
params['isRDP'] = isRDP;
|
||||
}
|
||||
if (isSharedPassword != null) {
|
||||
params['isSharedPassword'] = isSharedPassword;
|
||||
}
|
||||
final msg = jsonEncode(params);
|
||||
|
||||
// separate window for file transfer is not supported
|
||||
@ -228,6 +232,7 @@ class RustDeskMultiWindowManager {
|
||||
Future<MultiWindowCallResult> newRemoteDesktop(
|
||||
String remoteId, {
|
||||
String? password,
|
||||
bool? isSharedPassword,
|
||||
String? switchUuid,
|
||||
bool? forceRelay,
|
||||
}) async {
|
||||
@ -239,11 +244,12 @@ class RustDeskMultiWindowManager {
|
||||
password: password,
|
||||
forceRelay: forceRelay,
|
||||
switchUuid: switchUuid,
|
||||
isSharedPassword: isSharedPassword,
|
||||
);
|
||||
}
|
||||
|
||||
Future<MultiWindowCallResult> newFileTransfer(String remoteId,
|
||||
{String? password, bool? forceRelay}) async {
|
||||
{String? password, bool? isSharedPassword, bool? forceRelay}) async {
|
||||
return await newSession(
|
||||
WindowType.FileTransfer,
|
||||
kWindowEventNewFileTransfer,
|
||||
@ -251,11 +257,12 @@ class RustDeskMultiWindowManager {
|
||||
_fileTransferWindows,
|
||||
password: password,
|
||||
forceRelay: forceRelay,
|
||||
isSharedPassword: isSharedPassword,
|
||||
);
|
||||
}
|
||||
|
||||
Future<MultiWindowCallResult> newPortForward(String remoteId, bool isRDP,
|
||||
{String? password, bool? forceRelay}) async {
|
||||
{String? password, bool? isSharedPassword, bool? forceRelay}) async {
|
||||
return await newSession(
|
||||
WindowType.PortForward,
|
||||
kWindowEventNewPortForward,
|
||||
@ -264,6 +271,7 @@ class RustDeskMultiWindowManager {
|
||||
password: password,
|
||||
forceRelay: forceRelay,
|
||||
isRDP: isRDP,
|
||||
isSharedPassword: isSharedPassword,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -616,6 +616,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
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:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -104,6 +104,7 @@ dependencies:
|
||||
pull_down_button: ^0.9.3
|
||||
device_info_plus: ^9.1.0
|
||||
qr_flutter: ^4.1.0
|
||||
flutter_simple_treeview: ^3.0.2
|
||||
|
||||
dev_dependencies:
|
||||
icons_launcher: ^2.0.4
|
||||
|
@ -1678,13 +1678,19 @@ pub struct AbPeer {
|
||||
}
|
||||
|
||||
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
|
||||
pub struct Ab {
|
||||
pub struct AbEntry {
|
||||
#[serde(
|
||||
default,
|
||||
deserialize_with = "deserialize_string",
|
||||
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")]
|
||||
pub peers: Vec<AbPeer>,
|
||||
#[serde(default, deserialize_with = "deserialize_vec_string")]
|
||||
@ -1697,6 +1703,24 @@ pub struct Ab {
|
||||
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 {
|
||||
fn path() -> PathBuf {
|
||||
let filename = format!("{}_ab", APP_NAME.read().unwrap().clone());
|
||||
@ -1709,6 +1733,7 @@ impl Ab {
|
||||
let max_len = 64 * 1024 * 1024;
|
||||
if data.len() > max_len {
|
||||
// maxlen of function decompress
|
||||
log::error!("ab data too large, {} > {}", data.len(), max_len);
|
||||
return;
|
||||
}
|
||||
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_discoverypeer, Vec<DiscoveryPeer>);
|
||||
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_grouppeer, Vec<GroupPeer>);
|
||||
deserialize_default!(deserialize_keypair, KeyPair);
|
||||
|
13
src/cli.rs
13
src/cli.rs
@ -32,11 +32,14 @@ impl Session {
|
||||
password,
|
||||
lc: Default::default(),
|
||||
};
|
||||
session
|
||||
.lc
|
||||
.write()
|
||||
.unwrap()
|
||||
.initialize(id.to_owned(), ConnType::PORT_FORWARD, None);
|
||||
session.lc.write().unwrap().initialize(
|
||||
id.to_owned(),
|
||||
ConnType::PORT_FORWARD,
|
||||
None,
|
||||
false,
|
||||
None,
|
||||
None,
|
||||
);
|
||||
session
|
||||
}
|
||||
}
|
||||
|
@ -1151,6 +1151,7 @@ pub struct LoginConfigHandler {
|
||||
pub mark_unsupported: Vec<CodecFormat>,
|
||||
pub selected_windows_session_id: Option<u32>,
|
||||
pub peer_info: Option<PeerInfo>,
|
||||
shared_password: Option<String>, // used to distinguish whether it is connected with a shared password
|
||||
}
|
||||
|
||||
impl Deref for LoginConfigHandler {
|
||||
@ -1175,6 +1176,7 @@ impl LoginConfigHandler {
|
||||
switch_uuid: Option<String>,
|
||||
mut force_relay: bool,
|
||||
adapter_luid: Option<i64>,
|
||||
shared_password: Option<String>,
|
||||
) {
|
||||
let mut id = id;
|
||||
if id.contains("@") {
|
||||
@ -1238,6 +1240,7 @@ impl LoginConfigHandler {
|
||||
self.switch_uuid = switch_uuid;
|
||||
self.adapter_luid = adapter_luid;
|
||||
self.selected_windows_session_id = None;
|
||||
self.shared_password = shared_password;
|
||||
}
|
||||
|
||||
/// Check if the client should auto login.
|
||||
@ -1827,6 +1830,8 @@ impl LoginConfigHandler {
|
||||
platform: pi.platform.clone(),
|
||||
};
|
||||
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;
|
||||
let password = self.password.clone();
|
||||
let password0 = config.password.clone();
|
||||
@ -1859,15 +1864,17 @@ impl LoginConfigHandler {
|
||||
}
|
||||
#[cfg(feature = "flutter")]
|
||||
{
|
||||
// sync ab password with PeerConfig password
|
||||
let password = base64::encode(config.password.clone(), base64::Variant::Original);
|
||||
let evt: HashMap<&str, String> = HashMap::from([
|
||||
("name", "sync_peer_password_to_ab".to_string()),
|
||||
("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);
|
||||
if !connected_with_shared_password && remember && !config.password.is_empty() {
|
||||
// sync ab password with PeerConfig password
|
||||
let password = base64::encode(config.password.clone(), base64::Variant::Original);
|
||||
let evt: HashMap<&str, String> = HashMap::from([
|
||||
("name", "sync_peer_password_to_ab".to_string()),
|
||||
("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);
|
||||
}
|
||||
}
|
||||
if config.keyboard_mode.is_empty() {
|
||||
if is_keyboard_mode_supported(
|
||||
@ -1887,12 +1894,27 @@ impl LoginConfigHandler {
|
||||
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
|
||||
self.save_config(config);
|
||||
self.supported_encoding = pi.encoding.clone().unwrap_or_default();
|
||||
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 {
|
||||
serde_json::from_str::<HashMap<String, String>>(&self.get_option("remote_dir"))
|
||||
.unwrap_or_default()
|
||||
@ -2621,15 +2643,17 @@ pub async fn handle_hash(
|
||||
let ab = hbb_common::config::Ab::load();
|
||||
if !access_token.is_empty() && access_token == ab.access_token {
|
||||
let id = lc.read().unwrap().id.clone();
|
||||
if let Some(p) = ab
|
||||
.peers
|
||||
.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() {
|
||||
password = hash;
|
||||
lc.write().unwrap().save_ab_password_to_recent = true;
|
||||
if let Some(ab) = ab.ab_entries.iter().find(|a| a.personal()) {
|
||||
if let Some(p) = ab
|
||||
.peers
|
||||
.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() {
|
||||
password = hash;
|
||||
lc.write().unwrap().save_ab_password_to_recent = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1025,6 +1025,7 @@ pub fn session_add(
|
||||
switch_uuid: &str,
|
||||
force_relay: bool,
|
||||
password: String,
|
||||
is_shared_password: bool,
|
||||
) -> ResultType<FlutterSession> {
|
||||
let conn_type = if is_file_transfer {
|
||||
ConnType::FILE_TRANSFER
|
||||
@ -1050,7 +1051,7 @@ pub fn session_add(
|
||||
LocalConfig::set_remote_id(&id);
|
||||
|
||||
let session: Session<FlutterHandler> = Session {
|
||||
password,
|
||||
password: password.clone(),
|
||||
server_keyboard_enabled: Arc::new(RwLock::new(true)),
|
||||
server_file_transfer_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"))]
|
||||
let adapter_luid = None;
|
||||
|
||||
let shared_password = if is_shared_password {
|
||||
Some(password)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
session.lc.write().unwrap().initialize(
|
||||
id.to_owned(),
|
||||
conn_type,
|
||||
switch_uuid,
|
||||
force_relay,
|
||||
adapter_luid,
|
||||
shared_password,
|
||||
);
|
||||
|
||||
let session = Arc::new(session.clone());
|
||||
|
@ -122,6 +122,7 @@ pub fn session_add_sync(
|
||||
switch_uuid: String,
|
||||
force_relay: bool,
|
||||
password: String,
|
||||
is_shared_password: bool,
|
||||
) -> SyncReturn<String> {
|
||||
if let Err(e) = session_add(
|
||||
&session_id,
|
||||
@ -132,6 +133,7 @@ pub fn session_add_sync(
|
||||
&switch_uuid,
|
||||
force_relay,
|
||||
password,
|
||||
is_shared_password,
|
||||
) {
|
||||
SyncReturn(format!("Failed to add session with id {}, {}", &id, e))
|
||||
} 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()));
|
||||
}
|
||||
|
||||
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 {
|
||||
let id_filters = serde_json::from_str::<Vec<String>>(&filter).unwrap_or_default();
|
||||
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", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", "请选择您要连接的会话"),
|
||||
("powered_by_me", "由 RustDesk 提供支持"),
|
||||
("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", "Vyberte relaci, ke které se chcete připojit"),
|
||||
("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."),
|
||||
("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", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -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"),
|
||||
("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."),
|
||||
("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", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -216,5 +216,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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."),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -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"),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", "لطفاً جلسه ای را که می خواهید به آن متصل شوید انتخاب کنید"),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
828
src/lang/he.rs
828
src/lang/he.rs
@ -1,218 +1,612 @@
|
||||
lazy_static::lazy_static! {
|
||||
pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
[
|
||||
("desk_tip", "ניתן לגשת לשולחן העבודה שלך עם מזהה וסיסמה זו."),
|
||||
("outgoing_only_desk_tip", "זוהי מהדורה מותאמת אישית.\nניתן להתחבר למכשירים אחרים, אך מכשירים אחרים לא יכולים להתחבר אליך."),
|
||||
("connecting_status", "מתחבר לרשת RustDesk..."),
|
||||
("not_ready_status", "לא מוכן. בדוק את החיבור שלך"),
|
||||
("ID/Relay Server", "שרת מזהה/ריליי"),
|
||||
("id_change_tip", "מותרים רק תווים a-z, A-Z, 0-9 ו_ (קו תחתון). האות הראשונה חייבת להיות a-z, A-Z. אורך בין 6 ל-16."),
|
||||
("Slogan_tip", "נוצר בלב בעולם הזה הכאוטי!"),
|
||||
("Build Date", "תאריך בנייה"),
|
||||
("Audio Input", "קלט שמע"),
|
||||
("Hardware Codec", "קודק חומרה"),
|
||||
("ID Server", "שרת מזהה"),
|
||||
("Relay Server", "שרת ריליי"),
|
||||
("API Server", "שרת API"),
|
||||
("invalid_http", "חייב להתחיל עם http:// או https://"),
|
||||
("server_not_support", "עדיין לא נתמך על ידי השרת"),
|
||||
("Password Required", "נדרשת סיסמה"),
|
||||
("Wrong Password", "סיסמה שגויה"),
|
||||
("Connection Error", "שגיאת חיבור"),
|
||||
("Login Error", "שגיאת התחברות"),
|
||||
("Show Hidden Files", "הצג קבצים נסתרים"),
|
||||
("Refresh File", "רענן קובץ"),
|
||||
("Remote Computer", "מחשב מרוחק"),
|
||||
("Local Computer", "מחשב מקומי"),
|
||||
("Confirm Delete", "אשר מחיקה"),
|
||||
("Multi Select", "בחירה מרובה"),
|
||||
("Select All", "בחר הכל"),
|
||||
("Unselect All", "בטל בחירת הכל"),
|
||||
("Empty Directory", "תיקייה ריקה"),
|
||||
("Custom Image Quality", "איכות תמונה מותאמת אישית"),
|
||||
("Adjust Window", "התאם חלון"),
|
||||
("Insert Lock", "הוסף נעילה"),
|
||||
("Set Password", "הגדר סיסמה"),
|
||||
("OS Password", "סיסמת מערכת הפעלה"),
|
||||
("install_tip", "בגלל UAC, RustDesk לא יכול לפעול כראוי כצד מרוחק בחלק מהמקרים. כדי להימנע מ-UAC, אנא לחץ על הכפתור למטה כדי להתקין את RustDesk במערכת."),
|
||||
("config_acc", "כדי לשלוט מרחוק בשולחן העבודה שלך, עליך להעניק ל-RustDesk הרשאות \"נגישות\"."),
|
||||
("config_screen", "כדי לגשת מרחוק לשולחן העבודה שלך, עליך להעניק ל-RustDesk הרשאות \"הקלטת מסך\"."),
|
||||
("Installation Path", "נתיב התקנה"),
|
||||
("agreement_tip", "על ידי התחלת ההתקנה, אתה מקבל את הסכם הרישיון."),
|
||||
("Accept and Install", "קבל והתקן"),
|
||||
("not_close_tcp_tip", "אל תסגור חלון זה בזמן שאתה משתמש במנהרה"),
|
||||
("Remote Host", "מארח מרוחק"),
|
||||
("Remote Port", "פורט מרוחק"),
|
||||
("Local Port", "פורט מקומי"),
|
||||
("Local Address", "כתובת מקומית"),
|
||||
("Change Local Port", "שנה פורט מקומי"),
|
||||
("setup_server_tip", "לחיבור מהיר יותר, אנא הגדר שרת משלך"),
|
||||
("Enter Remote ID", "הזן מזהה מרוחק"),
|
||||
("Auto Login", "התחברות אוטומטית (תקפה רק אם הגדרת \"נעל לאחר סיום הסשן\")"),
|
||||
("Change Path", "שנה נתיב"),
|
||||
("Create Folder", "צור תיקייה"),
|
||||
("whitelist_tip", "רק IP ברשימה הלבנה יכול לגשת אלי"),
|
||||
("verification_tip", "קוד אימות נשלח לכתובת הדוא\"ל הרשומה, הזן את קוד האימות כדי להמשיך בהתחברות."),
|
||||
("whitelist_sep", "מופרד על ידי פסיק, נקודה פסיק, רווחים או שורה חדשה"),
|
||||
("Add Tag", "הוסף תג"),
|
||||
("Wrong credentials", "שם משתמש או סיסמה שגויים"),
|
||||
("Edit Tag", "ערוך תג"),
|
||||
("Forget Password", "שכחת סיסמה"),
|
||||
("Add to Favorites", "הוסף למועדפים"),
|
||||
("Remove from Favorites", "הסר מהמועדפים"),
|
||||
("Socks5 Proxy", "פרוקסי Socks5"),
|
||||
("install_daemon_tip", "לצורך הפעלה בעת הפעלת המחשב, עליך להתקין שירות מערכת."),
|
||||
("Are you sure to close the connection?", "האם אתה בטוח שברצונך לסגור את החיבור?"),
|
||||
("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", "זום בד"),
|
||||
("Share Screen", "שיתוף מסך"),
|
||||
("Screen Capture", "לכידת מסך"),
|
||||
("Input Control", "בקרת קלט"),
|
||||
("Audio Capture", "לכידת שמע"),
|
||||
("File Connection", "חיבור קובץ"),
|
||||
("Screen Connection", "חיבור מסך"),
|
||||
("Open System Setting", "פתח הגדרת מערכת"),
|
||||
("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", "הרשאות עבור חיבורים שנוצרו עשויות לא להשתנות מייד עד להתחברות מחדש."),
|
||||
("doc_mac_permission", "https://rustdesk.com/docs/en/client/mac/#enable-permissions"),
|
||||
("Ignore Battery Optimizations", "התעלם מאופטימיזציות סוללה"),
|
||||
("android_open_battery_optimizations_tip", "אם ברצונך לבטל תכונה זו, אנא עבור לדף ההגדרות של יישום RustDesk הבא, מצא והכנס ל[סוללה], הסר את הסימון מ-[לא מוגבל]"),
|
||||
("remote_restarting_tip", "המכשיר המרוחק מתחיל מחדש, אנא סגור את תיבת ההודעה הזו והתחבר מחדש עם סיסמה קבועה לאחר זמן מה"),
|
||||
("Exit Fullscreen", "יציאה ממסך מלא"),
|
||||
("Mobile Actions", "פעולות ניידות"),
|
||||
("Select Monitor", "בחר מסך"),
|
||||
("Control Actions", "פעולות בקרה"),
|
||||
("Display Settings", "הגדרות תצוגה"),
|
||||
("Image Quality", "איכות תמונה"),
|
||||
("Scroll Style", "סגנון גלילה"),
|
||||
("Show Toolbar", "הצג סרגל כלים"),
|
||||
("Hide Toolbar", "הסתר סרגל כלים"),
|
||||
("Direct Connection", "חיבור ישיר"),
|
||||
("Relay Connection", "חיבור ריליי"),
|
||||
("Secure Connection", "חיבור מאובטח"),
|
||||
("Insecure Connection", "חיבור לא מאובטח"),
|
||||
("Dark Theme", "ערכת נושא כהה"),
|
||||
("Light Theme", "ערכת נושא בהירה"),
|
||||
("Follow System", "עקוב אחר המערכת"),
|
||||
("Unlock Security Settings", "פתח הגדרות אבטחה"),
|
||||
("Unlock Network Settings", "פתח הגדרות רשת"),
|
||||
("Direct IP Access", "גישה ישירה ל-IP"),
|
||||
("Audio Input Device", "מכשיר קלט שמע"),
|
||||
("Use IP Whitelisting", "השתמש ברשימת לבנה של IP"),
|
||||
("Pin Toolbar", "נעץ סרגל כלים"),
|
||||
("Unpin Toolbar", "הסר נעיצת סרגל כלים"),
|
||||
("elevated_foreground_window_tip", "החלון הנוכחי של שולחן העבודה המרוחק דורש הרשאה גבוהה יותר לפעולה, לכן אי אפשר להשתמש בעכבר ובמקלדת באופן זמני. תוכל לבקש מהמשתמש המרוחק למזער את החלון הנוכחי, או ללחוץ על כפתור ההגבהה בחלון ניהול החיבור. כדי להימנע מבעיה זו, מומלץ להתקין את התוכנה במכשיר המרוחק."),
|
||||
("Keyboard Settings", "הגדרות מקלדת"),
|
||||
("Full Access", "גישה מלאה"),
|
||||
("Screen Share", "שיתוף מסך"),
|
||||
("JumpLink", "הצג"),
|
||||
("Please Select the screen to be shared(Operate on the peer side).", "אנא בחר את המסך לשיתוף (פעולה בצד העמית)."),
|
||||
("One-time Password", "סיסמה חד-פעמית"),
|
||||
("hide_cm_tip", "אפשר הסתרה רק אם מקבלים סשנים דרך סיסמה ומשתמשים בסיסמה קבועה"),
|
||||
("wayland_experiment_tip", "תמיכה ב-Wayland נמצאת בשלב ניסיוני, אנא השתמש ב-X11 אם אתה זקוק לגישה לא מלווה."),
|
||||
("software_render_tip", "אם אתה משתמש בכרטיס גרפיקה של Nvidia תחת Linux וחלון המרחוק נסגר מיד לאחר החיבור, החלפה למנהל ההתקן הפתוח Nouveau ובחירה בשימוש בעיבוד תוכנה עשויה לעזור. נדרשת הפעלה מחדש של התוכנה."),
|
||||
("config_input", "כדי לשלוט בשולחן העבודה המרוחק באמצעות מקלדת, עליך להעניק ל-RustDesk הרשאות \"מעקב אחרי קלט\"."),
|
||||
("config_microphone", "כדי לדבר מרחוק, עליך להעניק ל-RustDesk הרשאות \"הקלטת שמע\"."),
|
||||
("request_elevation_tip", "ניתן גם לבקש הגבהה אם יש מישהו בצד המרוחק."),
|
||||
("Elevation Error", "שגיאת הגבהה"),
|
||||
("still_click_uac_tip", "עדיין דורש מהמשתמש המרוחק ללחוץ OK בחלון ה-UAC של הרצת RustDesk."),
|
||||
("Request Elevation", "בקש הגבהה"),
|
||||
("wait_accept_uac_tip", "אנא המתן למשתמש המרוחק לקבל את דיאלוג ה-UAC."),
|
||||
("Switch Sides", "החלף צדדים"),
|
||||
("Default View Style", "סגנון תצוגה ברירת מחדל"),
|
||||
("Default Scroll Style", "סגנון גלילה ברירת מחדל"),
|
||||
("Default Image Quality", "איכות תמונה ברירת מחדל"),
|
||||
("Default Codec", "קודק ברירת מחדל"),
|
||||
("Other Default Options", "אפשרויות ברירת מחדל אחרות"),
|
||||
("relay_hint_tip", "ייתכן שלא ניתן להתחבר ישירות; ניתן לנסות להתחבר דרך ריליי. בנוסף, אם ברצונך להשתמש בריליי בניסיון הראשון שלך, תוכל להוסיף את הסיומת \"/r\" למזהה או לבחור באפשרות \"התחבר תמיד דרך ריליי\" בכרטיס של הסשנים האחרונים אם קיים."),
|
||||
("RDP Settings", "הגדרות RDP"),
|
||||
("New Connection", "חיבור חדש"),
|
||||
("Your Device", "המכשיר שלך"),
|
||||
("empty_recent_tip", "אופס, אין סשנים אחרונים!\nהגיע הזמן לתכנן חדש."),
|
||||
("empty_favorite_tip", "עדיין אין עמיתים מועדפים?\nבוא נמצא מישהו להתחבר אליו ונוסיף אותו למועדפים!"),
|
||||
("empty_lan_tip", "אוי לא, נראה שעדיין לא גילינו עמיתים."),
|
||||
("empty_address_book_tip", "אוי ואבוי, נראה שכרגע אין עמיתים בספר הכתובות שלך."),
|
||||
("Empty Username", "שם משתמש ריק"),
|
||||
("Empty Password", "סיסמה ריקה"),
|
||||
("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"),
|
||||
("System Sound", "צליל מערכת"),
|
||||
("Copy Fingerprint", "העתק טביעת אצבע"),
|
||||
("no fingerprints", "אין טביעות אצבע"),
|
||||
("resolution_original_tip", "רזולוציה מקורית"),
|
||||
("resolution_fit_local_tip", "התאם לרזולוציה מקומית"),
|
||||
("resolution_custom_tip", "רזולוציה מותאמת אישית"),
|
||||
("Accept and Elevate", "קבל והגבה"),
|
||||
("accept_and_elevate_btn_tooltip", "קבל את החיבור והגבה הרשאות UAC."),
|
||||
("clipboard_wait_response_timeout_tip", "המתנה לתגובת העתקה הסתיימה בזמן."),
|
||||
("logout_tip", "האם אתה בטוח שברצונך להתנתק?"),
|
||||
("exceed_max_devices", "הגעת למספר המקסימלי של מכשירים שניתן לנהל."),
|
||||
("Change Password", "שנה סיסמה"),
|
||||
("Refresh Password", "רענן סיסמה"),
|
||||
("Grid View", "תצוגת רשת"),
|
||||
("List View", "תצוגת רשימה"),
|
||||
("Toggle Tags", "החלף תגיות"),
|
||||
("pull_ab_failed_tip", "נכשל ברענון ספר הכתובות"),
|
||||
("push_ab_failed_tip", "נכשל בסנכרון ספר הכתובות לשרת"),
|
||||
("synced_peer_readded_tip", "המכשירים שהיו נוכחים בסשנים האחרונים יסונכרנו בחזרה לספר הכתובות."),
|
||||
("Change Color", "שנה צבע"),
|
||||
("Primary Color", "צבע עיקרי"),
|
||||
("HSV Color", "צבע HSV"),
|
||||
("Installation Successful!", "ההתקנה הצליחה!"),
|
||||
("scam_title", "ייתכן שאתה נפלת להונאה!"),
|
||||
("scam_text1", "אם אתה בשיחת טלפון עם מישהו שאינך מכיר ואינך סומך עליו שביקש ממך להשתמש ב-RustDesk ולהתחיל את השירות, אל תמשיך ונתק מיד."),
|
||||
("scam_text2", "סביר להניח שמדובר בהונאה שמנסה לגנוב ממך כסף או מידע פרטי אחר."),
|
||||
("auto_disconnect_option_tip", "סגור באופן אוטומטי סשנים נכנסים במקרה של חוסר פעילות של המשתמש"),
|
||||
("Connection failed due to inactivity", "התנתקות אוטומטית בגלל חוסר פעילות"),
|
||||
("upgrade_rustdesk_server_pro_to_{}_tip", "אנא שדרג את RustDesk Server Pro לגרסה {} או חדשה יותר!"),
|
||||
("pull_group_failed_tip", "נכשל ברענון קבוצה"),
|
||||
("doc_fix_wayland", "https://rustdesk.com/docs/en/client/linux/#x11-required"),
|
||||
("display_is_plugged_out_msg", "המסך הופסק, החלף למסך הראשון."),
|
||||
("elevated_switch_display_msg", "מעבר למסך הראשי מכיוון שתמיכה במסכים מרובים אינה נתמכת במצב משתמש מוגבה."),
|
||||
("selinux_tip", "SELinux מופעל במכשיר שלך, מה שעלול למנוע מ-RustDesk לפעול כראוי כצד הנשלט."),
|
||||
("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"),
|
||||
("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-left-right-mouse", "החלף בין כפתור העכבר השמאלי לימני"),
|
||||
("2FA code", "קוד אימות דו-שלבי"),
|
||||
("enable-2fa-title", "הפעל אימות דו-שלבי"),
|
||||
("enable-2fa-desc", "אנא הגדר כעת את האפליקציה שלך לאימות. תוכל להשתמש באפליקציית אימות כגון Authy, Microsoft או Google Authenticator בטלפון או במחשב שלך.\n\nסרוק את קוד ה-QR עם האפליקציה שלך והזן את הקוד שהאפליקציה מציגה כדי להפעיל את אימות הדו-שלבי."),
|
||||
("wrong-2fa-code", "לא ניתן לאמת את הקוד. בדוק שהקוד והגדרות הזמן המקומיות נכונות"),
|
||||
("enter-2fa-title", "אימות דו-שלבי"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
[
|
||||
("Status", ""),
|
||||
("Your Desktop", ""),
|
||||
("desk_tip", "ניתן לגשת לשולחן העבודה שלך עם מזהה וסיסמה זו."),
|
||||
("Password", ""),
|
||||
("Ready", ""),
|
||||
("Established", ""),
|
||||
("connecting_status", "מתחבר לרשת RustDesk..."),
|
||||
("Enable service", ""),
|
||||
("Start service", ""),
|
||||
("Service is running", ""),
|
||||
("Service is not running", ""),
|
||||
("not_ready_status", "לא מוכן. בדוק את החיבור שלך"),
|
||||
("Control Remote Desktop", ""),
|
||||
("Transfer file", ""),
|
||||
("Connect", ""),
|
||||
("Recent sessions", ""),
|
||||
("Address book", ""),
|
||||
("Confirmation", ""),
|
||||
("TCP tunneling", ""),
|
||||
("Remove", ""),
|
||||
("Refresh random password", ""),
|
||||
("Set your own password", ""),
|
||||
("Enable keyboard/mouse", ""),
|
||||
("Enable clipboard", ""),
|
||||
("Enable file transfer", ""),
|
||||
("Enable TCP tunneling", ""),
|
||||
("IP Whitelisting", ""),
|
||||
("ID/Relay Server", "שרת מזהה/ריליי"),
|
||||
("Import server config", ""),
|
||||
("Export Server Config", ""),
|
||||
("Import server configuration successfully", ""),
|
||||
("Export server configuration successfully", ""),
|
||||
("Invalid server configuration", ""),
|
||||
("Clipboard is empty", ""),
|
||||
("Stop service", ""),
|
||||
("Change ID", ""),
|
||||
("Your new ID", ""),
|
||||
("length %min% to %max%", ""),
|
||||
("starts with a letter", ""),
|
||||
("allowed characters", ""),
|
||||
("id_change_tip", "מותרים רק תווים a-z, A-Z, 0-9 ו_ (קו תחתון). האות הראשונה חייבת להיות a-z, A-Z. אורך בין 6 ל-16."),
|
||||
("Website", ""),
|
||||
("About", ""),
|
||||
("Slogan_tip", "נוצר בלב בעולם הזה הכאוטי!"),
|
||||
("Privacy Statement", ""),
|
||||
("Mute", ""),
|
||||
("Build Date", "תאריך בנייה"),
|
||||
("Version", ""),
|
||||
("Home", ""),
|
||||
("Audio Input", "קלט שמע"),
|
||||
("Enhancements", ""),
|
||||
("Hardware Codec", "קודק חומרה"),
|
||||
("Adaptive bitrate", ""),
|
||||
("ID Server", "שרת מזהה"),
|
||||
("Relay Server", "שרת ריליי"),
|
||||
("API Server", "שרת API"),
|
||||
("invalid_http", "חייב להתחיל עם http:// או https://"),
|
||||
("Invalid IP", ""),
|
||||
("Invalid format", ""),
|
||||
("server_not_support", "עדיין לא נתמך על ידי השרת"),
|
||||
("Not available", ""),
|
||||
("Too frequent", ""),
|
||||
("Cancel", ""),
|
||||
("Skip", ""),
|
||||
("Close", ""),
|
||||
("Retry", ""),
|
||||
("OK", ""),
|
||||
("Password Required", "נדרשת סיסמה"),
|
||||
("Please enter your password", ""),
|
||||
("Remember password", ""),
|
||||
("Wrong Password", "סיסמה שגויה"),
|
||||
("Do you want to enter again?", ""),
|
||||
("Connection Error", "שגיאת חיבור"),
|
||||
("Error", ""),
|
||||
("Reset by the peer", ""),
|
||||
("Connecting...", ""),
|
||||
("Connection in progress. Please wait.", ""),
|
||||
("Please try 1 minute later", ""),
|
||||
("Login Error", "שגיאת התחברות"),
|
||||
("Successful", ""),
|
||||
("Connected, waiting for image...", ""),
|
||||
("Name", ""),
|
||||
("Type", ""),
|
||||
("Modified", ""),
|
||||
("Size", ""),
|
||||
("Show Hidden Files", "הצג קבצים נסתרים"),
|
||||
("Receive", ""),
|
||||
("Send", ""),
|
||||
("Refresh File", "רענן קובץ"),
|
||||
("Local", ""),
|
||||
("Remote", ""),
|
||||
("Remote Computer", "מחשב מרוחק"),
|
||||
("Local Computer", "מחשב מקומי"),
|
||||
("Confirm Delete", "אשר מחיקה"),
|
||||
("Delete", ""),
|
||||
("Properties", ""),
|
||||
("Multi Select", "בחירה מרובה"),
|
||||
("Select All", "בחר הכל"),
|
||||
("Unselect All", "בטל בחירת הכל"),
|
||||
("Empty Directory", "תיקייה ריקה"),
|
||||
("Not an empty directory", ""),
|
||||
("Are you sure you want to delete this file?", ""),
|
||||
("Are you sure you want to delete this empty directory?", ""),
|
||||
("Are you sure you want to delete the file of this directory?", ""),
|
||||
("Do this for all conflicts", ""),
|
||||
("This is irreversible!", ""),
|
||||
("Deleting", ""),
|
||||
("files", ""),
|
||||
("Waiting", ""),
|
||||
("Finished", ""),
|
||||
("Speed", ""),
|
||||
("Custom Image Quality", "איכות תמונה מותאמת אישית"),
|
||||
("Privacy mode", ""),
|
||||
("Block user input", ""),
|
||||
("Unblock user input", ""),
|
||||
("Adjust Window", "התאם חלון"),
|
||||
("Original", ""),
|
||||
("Shrink", ""),
|
||||
("Stretch", ""),
|
||||
("Scrollbar", ""),
|
||||
("ScrollAuto", ""),
|
||||
("Good image quality", ""),
|
||||
("Balanced", ""),
|
||||
("Optimize reaction time", ""),
|
||||
("Custom", ""),
|
||||
("Show remote cursor", ""),
|
||||
("Show quality monitor", ""),
|
||||
("Disable clipboard", ""),
|
||||
("Lock after session end", ""),
|
||||
("Insert", ""),
|
||||
("Insert Lock", "הוסף נעילה"),
|
||||
("Refresh", ""),
|
||||
("ID does not exist", ""),
|
||||
("Failed to connect to rendezvous server", ""),
|
||||
("Please try later", ""),
|
||||
("Remote desktop is offline", ""),
|
||||
("Key mismatch", ""),
|
||||
("Timeout", ""),
|
||||
("Failed to connect to relay server", ""),
|
||||
("Failed to connect via rendezvous server", ""),
|
||||
("Failed to connect via relay server", ""),
|
||||
("Failed to make direct connection to remote desktop", ""),
|
||||
("Set Password", "הגדר סיסמה"),
|
||||
("OS Password", "סיסמת מערכת הפעלה"),
|
||||
("install_tip", "בגלל UAC, RustDesk לא יכול לפעול כראוי כצד מרוחק בחלק מהמקרים. כדי להימנע מ-UAC, אנא לחץ על הכפתור למטה כדי להתקין את RustDesk במערכת."),
|
||||
("Click to upgrade", ""),
|
||||
("Click to download", ""),
|
||||
("Click to update", ""),
|
||||
("Configure", ""),
|
||||
("config_acc", "כדי לשלוט מרחוק בשולחן העבודה שלך, עליך להעניק ל-RustDesk הרשאות \"נגישות\"."),
|
||||
("config_screen", "כדי לגשת מרחוק לשולחן העבודה שלך, עליך להעניק ל-RustDesk הרשאות \"הקלטת מסך\"."),
|
||||
("Installing ...", ""),
|
||||
("Install", ""),
|
||||
("Installation", ""),
|
||||
("Installation Path", "נתיב התקנה"),
|
||||
("Create start menu shortcuts", ""),
|
||||
("Create desktop icon", ""),
|
||||
("agreement_tip", "על ידי התחלת ההתקנה, אתה מקבל את הסכם הרישיון."),
|
||||
("Accept and Install", "קבל והתקן"),
|
||||
("End-user license agreement", ""),
|
||||
("Generating ...", ""),
|
||||
("Your installation is lower version.", ""),
|
||||
("not_close_tcp_tip", "אל תסגור חלון זה בזמן שאתה משתמש במנהרה"),
|
||||
("Listening ...", ""),
|
||||
("Remote Host", "מארח מרוחק"),
|
||||
("Remote Port", "פורט מרוחק"),
|
||||
("Action", ""),
|
||||
("Add", ""),
|
||||
("Local Port", "פורט מקומי"),
|
||||
("Local Address", "כתובת מקומית"),
|
||||
("Change Local Port", "שנה פורט מקומי"),
|
||||
("setup_server_tip", "לחיבור מהיר יותר, אנא הגדר שרת משלך"),
|
||||
("Too short, at least 6 characters.", ""),
|
||||
("The confirmation is not identical.", ""),
|
||||
("Permissions", ""),
|
||||
("Accept", ""),
|
||||
("Dismiss", ""),
|
||||
("Disconnect", ""),
|
||||
("Enable file copy and paste", ""),
|
||||
("Connected", ""),
|
||||
("Direct and encrypted connection", ""),
|
||||
("Relayed and encrypted connection", ""),
|
||||
("Direct and unencrypted connection", ""),
|
||||
("Relayed and unencrypted connection", ""),
|
||||
("Enter Remote ID", "הזן מזהה מרוחק"),
|
||||
("Enter your password", ""),
|
||||
("Logging in...", ""),
|
||||
("Enable RDP session sharing", ""),
|
||||
("Auto Login", "התחברות אוטומטית (תקפה רק אם הגדרת \"נעל לאחר סיום הסשן\")"),
|
||||
("Enable direct IP access", ""),
|
||||
("Rename", ""),
|
||||
("Space", ""),
|
||||
("Create desktop shortcut", ""),
|
||||
("Change Path", "שנה נתיב"),
|
||||
("Create Folder", "צור תיקייה"),
|
||||
("Please enter the folder name", ""),
|
||||
("Fix it", ""),
|
||||
("Warning", ""),
|
||||
("Login screen using Wayland is not supported", ""),
|
||||
("Reboot required", ""),
|
||||
("Unsupported display server", ""),
|
||||
("x11 expected", ""),
|
||||
("Port", ""),
|
||||
("Settings", ""),
|
||||
("Username", ""),
|
||||
("Invalid port", ""),
|
||||
("Closed manually by the peer", ""),
|
||||
("Enable remote configuration modification", ""),
|
||||
("Run without install", ""),
|
||||
("Connect via relay", ""),
|
||||
("Always connect via relay", ""),
|
||||
("whitelist_tip", "רק IP ברשימה הלבנה יכול לגשת אלי"),
|
||||
("Login", ""),
|
||||
("Verify", ""),
|
||||
("Remember me", ""),
|
||||
("Trust this device", ""),
|
||||
("Verification code", ""),
|
||||
("verification_tip", "קוד אימות נשלח לכתובת הדוא\"ל הרשומה, הזן את קוד האימות כדי להמשיך בהתחברות."),
|
||||
("Logout", ""),
|
||||
("Tags", ""),
|
||||
("Search ID", ""),
|
||||
("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", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -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"),
|
||||
("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."),
|
||||
("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", ""),
|
||||
("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", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", "연결하려는 세션을 선택하세요."),
|
||||
("powered_by_me", "RustDesk 제공"),
|
||||
("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", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -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"),
|
||||
("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."),
|
||||
("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", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -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"),
|
||||
("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."),
|
||||
("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", "Wybierz sesję, do której chcesz się podłączyć"),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -590,5 +590,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("outgoing_only_desk_tip", "Это специализированная версия.\nВы можете подключаться к другим устройствам, но другие устройства не могут подключиться к вашему."),
|
||||
("preset_password_warning", "Это специализированная версия с предустановленным паролем. Любой, кто знает этот пароль, может получить полный контроль над вашим устройством. Если это для вас неожиданно, немедленно удалите данное программное обеспечение."),
|
||||
("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();
|
||||
}
|
||||
|
@ -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ť"),
|
||||
("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."),
|
||||
("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", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -590,5 +590,23 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", "請選擇您想要連結的工作階段"),
|
||||
("powered_by_me", "由 RustDesk 提供支援"),
|
||||
("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", "Будь ласка, оберіть сеанс, до якого ви хочете підключитися"),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -588,5 +588,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Please select the session you want to connect to", ""),
|
||||
("powered_by_me", ""),
|
||||
("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();
|
||||
}
|
||||
|
@ -519,7 +519,7 @@ impl SciterSession {
|
||||
.lc
|
||||
.write()
|
||||
.unwrap()
|
||||
.initialize(id, conn_type, None, force_relay, None);
|
||||
.initialize(id, conn_type, None, force_relay, None, None);
|
||||
|
||||
Self(session)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user