From ac88f55f250df6020f44bbc2cf4ef18482b6c245 Mon Sep 17 00:00:00 2001 From: dignow Date: Tue, 8 Aug 2023 12:12:35 +0800 Subject: [PATCH] refact, peer card menu, open in tabs or windows Signed-off-by: dignow --- flutter/lib/common.dart | 22 +++--- flutter/lib/common/widgets/peer_card.dart | 68 ++++++++++++------- flutter/lib/consts.dart | 7 +- .../lib/desktop/pages/desktop_home_page.dart | 9 +-- .../desktop/pages/desktop_setting_page.dart | 4 +- flutter/lib/desktop/pages/remote_page.dart | 2 +- flutter/lib/utils/multi_window_manager.dart | 39 +++++------ src/lang/ca.rs | 4 +- src/lang/cn.rs | 4 +- src/lang/cs.rs | 4 +- src/lang/da.rs | 4 +- src/lang/de.rs | 4 +- src/lang/el.rs | 4 +- src/lang/eo.rs | 4 +- src/lang/es.rs | 4 +- src/lang/fa.rs | 4 +- src/lang/fr.rs | 4 +- src/lang/hu.rs | 4 +- src/lang/id.rs | 4 +- src/lang/it.rs | 4 +- src/lang/ja.rs | 4 +- src/lang/ko.rs | 4 +- src/lang/kz.rs | 4 +- src/lang/lt.rs | 4 +- src/lang/nl.rs | 4 +- src/lang/pl.rs | 4 +- src/lang/pt_PT.rs | 4 +- src/lang/ptbr.rs | 4 +- src/lang/ro.rs | 4 +- src/lang/ru.rs | 4 +- src/lang/sk.rs | 4 +- src/lang/sl.rs | 4 +- src/lang/sq.rs | 4 +- src/lang/sr.rs | 4 +- src/lang/sv.rs | 4 +- src/lang/template.rs | 4 +- src/lang/th.rs | 4 +- src/lang/tr.rs | 4 +- src/lang/tw.rs | 4 +- src/lang/ua.rs | 4 +- src/lang/vn.rs | 4 +- 41 files changed, 187 insertions(+), 100 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 71fbfcdd9..17206b8ce 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -1240,7 +1240,7 @@ bool option2bool(String option, String value) { option == "stop-service" || option == "direct-server" || option == "stop-rendezvous-service" || - option == "force-always-relay") { + option == kOptionForceAlwaysRelay) { res = value == "Y"; } else { assert(false); @@ -1257,7 +1257,7 @@ String bool2option(String option, bool b) { option == "stop-service" || option == "direct-server" || option == "stop-rendezvous-service" || - option == "force-always-relay") { + option == kOptionForceAlwaysRelay) { res = b ? 'Y' : ''; } else { assert(false); @@ -1288,6 +1288,14 @@ bool mainGetLocalBoolOptionSync(String key) { return option2bool(key, bind.mainGetLocalOption(key: key)); } +bool mainGetPeerBoolOptionSync(String id, String key) { + return option2bool(key, bind.mainGetPeerOptionSync(id: id, key: key)); +} + +mainSetPeerBoolOptionSync(String id, String key, bool v) { + bind.mainSetPeerOptionSync(id: id, key: key, value: bool2option(key, v)); +} + Future matchPeer(String searchText, Peer peer) async { if (searchText.isEmpty) { return true; @@ -1545,7 +1553,9 @@ Future restoreWindowPosition(WindowType type, debugPrint("no window position saved, ignoring position restoration"); return false; } - if (type == WindowType.RemoteDesktop && !isRemotePeerPos && windowId != null) { + if (type == WindowType.RemoteDesktop && + !isRemotePeerPos && + windowId != null) { if (lpos.offsetWidth != null) { lpos.offsetWidth = lpos.offsetWidth! + windowId * 20; } @@ -1801,14 +1811,13 @@ connectMainDesktop( required bool isTcpTunneling, required bool isRDP, bool? forceRelay, - bool forceSeparateWindow = false, }) async { if (isFileTransfer) { await rustDeskWinManager.newFileTransfer(id, forceRelay: forceRelay); } else if (isTcpTunneling || isRDP) { await rustDeskWinManager.newPortForward(id, isRDP, forceRelay: forceRelay); } else { - await rustDeskWinManager.newRemoteDesktop(id, forceRelay: forceRelay, forceSeparateWindow: forceSeparateWindow); + await rustDeskWinManager.newRemoteDesktop(id, forceRelay: forceRelay); } } @@ -1822,7 +1831,6 @@ connect( bool isFileTransfer = false, bool isTcpTunneling = false, bool isRDP = false, - bool forceSeparateWindow = false, }) async { if (id == '') return; id = id.replaceAll(' ', ''); @@ -1840,7 +1848,6 @@ connect( isTcpTunneling: isTcpTunneling, isRDP: isRDP, forceRelay: forceRelay, - forceSeparateWindow: forceSeparateWindow, ); } else { await rustDeskWinManager.call(WindowType.Main, kWindowConnect, { @@ -1849,7 +1856,6 @@ connect( 'isTcpTunneling': isTcpTunneling, 'isRDP': isRDP, 'forceRelay': forceRelay, - 'forceSeparateWindow': forceSeparateWindow, }); } } else { diff --git a/flutter/lib/common/widgets/peer_card.dart b/flutter/lib/common/widgets/peer_card.dart index 61c5cb69e..936be6c20 100644 --- a/flutter/lib/common/widgets/peer_card.dart +++ b/flutter/lib/common/widgets/peer_card.dart @@ -404,7 +404,6 @@ abstract class BasePeerCard extends StatelessWidget { bool isFileTransfer = false, bool isTcpTunneling = false, bool isRDP = false, - bool forceSeparateWindow = false, }) { return MenuEntryButton( childBuilder: (TextStyle? style) => Text( @@ -418,7 +417,6 @@ abstract class BasePeerCard extends StatelessWidget { isFileTransfer: isFileTransfer, isTcpTunneling: isTcpTunneling, isRDP: isRDP, - forceSeparateWindow: forceSeparateWindow, ); }, padding: menuPadding, @@ -427,25 +425,13 @@ abstract class BasePeerCard extends StatelessWidget { } @protected - List> _connectActions(BuildContext context, Peer peer) { - final actions = [_connectAction(context, peer, false)]; - if (!mainGetLocalBoolOptionSync(kOptionSeparateRemoteWindow)) { - actions.add(_connectAction(context, peer, true)); - } - return actions; - } - - @protected - MenuEntryBase _connectAction( - BuildContext context, Peer peer, bool forceSeparateWindow) { + MenuEntryBase _connectAction(BuildContext context, Peer peer) { return _connectCommonAction( context, peer.id, (peer.alias.isEmpty - ? translate('Connect') - : '${translate('Connect')} ${peer.id}') + - (forceSeparateWindow ? ' (${translate('separate window')})' : ''), - forceSeparateWindow: forceSeparateWindow, + ? translate('Connect') + : '${translate('Connect')} ${peer.id}'), ); } @@ -538,15 +524,40 @@ abstract class BasePeerCard extends StatelessWidget { ); } + Future> _openNewConnInAction( + String id, String label, String key) async { + return MenuEntrySwitch( + switchType: SwitchType.scheckbox, + text: translate(label), + getter: () async => mainGetPeerBoolOptionSync(id, key), + setter: (bool v) async { + await bind.mainSetPeerOption( + id: id, key: key, value: bool2option(key, v)); + }, + padding: menuPadding, + dismissOnClicked: true, + ); + } + + _openInTabsAction(String id) async => + await _openNewConnInAction(id, 'Open in Tabs', kOptionOpenInTabs); + + _openInWindowsAction(String id) async => + await _openNewConnInAction(id, 'Open in windows', kOptionOpenInWindows); + + _openNewConnInOptAction(String id) async => + mainGetLocalBoolOptionSync(kOptionOpenNewConnInTabs) + ? await _openInWindowsAction(id) + : await _openInTabsAction(id); + @protected Future _isForceAlwaysRelay(String id) async { - return (await bind.mainGetPeerOption(id: id, key: 'force-always-relay')) + return (await bind.mainGetPeerOption(id: id, key: kOptionForceAlwaysRelay)) .isNotEmpty; } @protected Future> _forceAlwaysRelayAction(String id) async { - const option = 'force-always-relay'; return MenuEntrySwitch( switchType: SwitchType.scheckbox, text: translate('Always connect via relay'), @@ -555,7 +566,9 @@ abstract class BasePeerCard extends StatelessWidget { }, setter: (bool v) async { await bind.mainSetPeerOption( - id: id, key: option, value: bool2option(option, v)); + id: id, + key: kOptionForceAlwaysRelay, + value: bool2option(kOptionForceAlwaysRelay, v)); }, padding: menuPadding, dismissOnClicked: true, @@ -813,7 +826,7 @@ class RecentPeerCard extends BasePeerCard { Future>> _buildMenuItems( BuildContext context) async { final List> menuItems = [ - ..._connectActions(context, peer), + _connectAction(context, peer), _transferFileAction(context, peer.id), ]; @@ -822,6 +835,7 @@ class RecentPeerCard extends BasePeerCard { if (isDesktop && peer.platform != 'Android') { menuItems.add(_tcpTunnelingAction(context, peer.id)); } + menuItems.add(await _openNewConnInOptAction(peer.id)); menuItems.add(await _forceAlwaysRelayAction(peer.id)); if (peer.platform == 'Windows') { menuItems.add(_rdpAction(context, peer.id)); @@ -869,12 +883,13 @@ class FavoritePeerCard extends BasePeerCard { Future>> _buildMenuItems( BuildContext context) async { final List> menuItems = [ - ..._connectActions(context, peer), + _connectAction(context, peer), _transferFileAction(context, peer.id), ]; if (isDesktop && peer.platform != 'Android') { menuItems.add(_tcpTunnelingAction(context, peer.id)); } + menuItems.add(await _openNewConnInOptAction(peer.id)); menuItems.add(await _forceAlwaysRelayAction(peer.id)); if (peer.platform == 'Windows') { menuItems.add(_rdpAction(context, peer.id)); @@ -919,7 +934,7 @@ class DiscoveredPeerCard extends BasePeerCard { Future>> _buildMenuItems( BuildContext context) async { final List> menuItems = [ - ..._connectActions(context, peer), + _connectAction(context, peer), _transferFileAction(context, peer.id), ]; @@ -928,6 +943,7 @@ class DiscoveredPeerCard extends BasePeerCard { if (isDesktop && peer.platform != 'Android') { menuItems.add(_tcpTunnelingAction(context, peer.id)); } + menuItems.add(await _openNewConnInOptAction(peer.id)); menuItems.add(await _forceAlwaysRelayAction(peer.id)); if (peer.platform == 'Windows') { menuItems.add(_rdpAction(context, peer.id)); @@ -971,12 +987,13 @@ class AddressBookPeerCard extends BasePeerCard { Future>> _buildMenuItems( BuildContext context) async { final List> menuItems = [ - ..._connectActions(context, peer), + _connectAction(context, peer), _transferFileAction(context, peer.id), ]; if (isDesktop && peer.platform != 'Android') { menuItems.add(_tcpTunnelingAction(context, peer.id)); } + menuItems.add(await _openNewConnInOptAction(peer.id)); menuItems.add(await _forceAlwaysRelayAction(peer.id)); if (peer.platform == 'Windows') { menuItems.add(_rdpAction(context, peer.id)); @@ -1033,12 +1050,13 @@ class MyGroupPeerCard extends BasePeerCard { Future>> _buildMenuItems( BuildContext context) async { final List> menuItems = [ - ..._connectActions(context, peer), + _connectAction(context, peer), _transferFileAction(context, peer.id), ]; if (isDesktop && peer.platform != 'Android') { menuItems.add(_tcpTunnelingAction(context, peer.id)); } + menuItems.add(await _openNewConnInOptAction(peer.id)); menuItems.add(await _forceAlwaysRelayAction(peer.id)); if (peer.platform == 'Windows') { menuItems.add(_rdpAction(context, peer.id)); diff --git a/flutter/lib/consts.dart b/flutter/lib/consts.dart index 99a87362e..5376196e4 100644 --- a/flutter/lib/consts.dart +++ b/flutter/lib/consts.dart @@ -22,8 +22,6 @@ const String kAppTypeDesktopRemote = "remote"; const String kAppTypeDesktopFileTransfer = "file transfer"; const String kAppTypeDesktopPortForward = "port forward"; -const bool kCloseMultiWindowByHide = true; - const String kWindowMainWindowOnTop = "main_window_on_top"; const String kWindowGetWindowInfo = "get_window_info"; const String kWindowDisableGrabKeyboard = "disable_grab_keyboard"; @@ -42,7 +40,10 @@ const String kWindowEventGetSessionIdList = "get_session_id_list"; const String kWindowEventMoveTabToNewWindow = "move_tab_to_new_window"; const String kWindowEventCloseForSeparateWindow = "close_for_separate_window"; -const String kOptionSeparateRemoteWindow = "allow-separate-remote-window"; +const String kOptionOpenNewConnInTabs = "enable-open-new-connections-in-tabs"; +const String kOptionOpenInTabs = "allow-open-in-tabs"; +const String kOptionOpenInWindows = "allow-open-in-windows"; +const String kOptionForceAlwaysRelay = "force-always-relay"; const String kUniLinksPrefix = "rustdesk://"; const String kUrlActionClose = "close"; diff --git a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart index b87820b97..7bf303a68 100644 --- a/flutter/lib/desktop/pages/desktop_home_page.dart +++ b/flutter/lib/desktop/pages/desktop_home_page.dart @@ -554,13 +554,7 @@ class _DesktopHomePageState extends State } else if (call.method == kWindowEventShow) { await rustDeskWinManager.registerActiveWindow(call.arguments["id"]); } else if (call.method == kWindowEventHide) { - final wId = call.arguments['id']; - final isSeparateWindowEnabled = - mainGetLocalBoolOptionSync(kOptionSeparateRemoteWindow); - if (isSeparateWindowEnabled && !kCloseMultiWindowByHide) { - await rustDeskWinManager.destroyWindow(wId); - } - await rustDeskWinManager.unregisterActiveWindow(wId); + await rustDeskWinManager.unregisterActiveWindow(call.arguments['id']); } else if (call.method == kWindowConnect) { await connectMainDesktop( call.arguments['id'], @@ -568,7 +562,6 @@ class _DesktopHomePageState extends State isTcpTunneling: call.arguments['isTcpTunneling'], isRDP: call.arguments['isRDP'], forceRelay: call.arguments['forceRelay'], - forceSeparateWindow: call.arguments['forceSeparateWindow'], ); } else if (call.method == kWindowEventMoveTabToNewWindow) { final args = call.arguments.split(','); diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index 4a4992c58..33b0a2e43 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -319,8 +319,8 @@ class _GeneralState extends State<_General> { _OptionCheckBox(context, 'Adaptive bitrate', 'enable-abr'), _OptionCheckBox( context, - 'Separate remote windows', - kOptionSeparateRemoteWindow, + 'Open new connections in tabs', + kOptionOpenNewConnInTabs, isServer: false, ), ]; diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index 32faf08ae..35d20a263 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -116,7 +116,7 @@ class _RemotePageState extends State Wakelock.enable(); } // Register texture. - if (mainGetLocalBoolOptionSync(kOptionSeparateRemoteWindow)) { + if (mainGetLocalBoolOptionSync(kOptionOpenNewConnInTabs)) { _renderTexture = renderTexture; } else { _renderTexture = RenderTexture(); diff --git a/flutter/lib/utils/multi_window_manager.dart b/flutter/lib/utils/multi_window_manager.dart index 0a1858c2c..abd76238e 100644 --- a/flutter/lib/utils/multi_window_manager.dart +++ b/flutter/lib/utils/multi_window_manager.dart @@ -81,19 +81,24 @@ class RustDeskMultiWindowManager { } _newSession( - bool separateWindow, + bool openInTabs, WindowType type, String methodName, String remoteId, List windows, String msg, ) async { - if (separateWindow) { - if (kCloseMultiWindowByHide && _inactiveWindows.isNotEmpty) { + if (openInTabs) { + if (windows.isEmpty) { + await newSessionWindow(type, remoteId, msg, windows); + } else { + call(type, methodName, msg); + } + } else { + if (_inactiveWindows.isNotEmpty) { for (final windowId in windows) { if (_inactiveWindows.contains(windowId)) { - await DesktopMultiWindow.invokeMethod( - windowId, methodName, msg); + await DesktopMultiWindow.invokeMethod(windowId, methodName, msg); WindowController.fromWindowId(windowId).show(); registerActiveWindow(windowId); return; @@ -101,12 +106,6 @@ class RustDeskMultiWindowManager { } } await newSessionWindow(type, remoteId, msg, windows); - } else { - if (windows.isEmpty) { - await newSessionWindow(type, remoteId, msg, windows); - } else { - call(type, methodName, msg); - } } } @@ -119,7 +118,6 @@ class RustDeskMultiWindowManager { bool? forceRelay, String? switchUuid, bool? isRDP, - bool forceSeparateWindow = false, }) async { var params = { "type": type.index, @@ -136,11 +134,16 @@ class RustDeskMultiWindowManager { final msg = jsonEncode(params); // separate window for file transfer is not supported - bool separateWindow = forceSeparateWindow || - (type != WindowType.FileTransfer && - mainGetLocalBoolOptionSync(kOptionSeparateRemoteWindow)); + bool openInTabs = false; + if (type == WindowType.RemoteDesktop) { + if (mainGetLocalBoolOptionSync(kOptionOpenNewConnInTabs)) { + openInTabs = !mainGetPeerBoolOptionSync(remoteId, kOptionOpenInWindows); + } else { + openInTabs = mainGetPeerBoolOptionSync(remoteId, kOptionOpenInTabs); + } + } - if (windows.length > 1 || separateWindow) { + if (windows.length > 1 || !openInTabs) { for (final windowId in windows) { if (await DesktopMultiWindow.invokeMethod( windowId, kWindowEventActiveSession, remoteId)) { @@ -149,7 +152,7 @@ class RustDeskMultiWindowManager { } } - await _newSession(separateWindow, type, methodName, remoteId, windows, msg); + await _newSession(openInTabs, type, methodName, remoteId, windows, msg); } Future newRemoteDesktop( @@ -157,7 +160,6 @@ class RustDeskMultiWindowManager { String? password, String? switchUuid, bool? forceRelay, - bool forceSeparateWindow = false, }) async { return await newSession( WindowType.RemoteDesktop, @@ -167,7 +169,6 @@ class RustDeskMultiWindowManager { password: password, forceRelay: forceRelay, switchUuid: switchUuid, - forceSeparateWindow: forceSeparateWindow, ); } diff --git a/src/lang/ca.rs b/src/lang/ca.rs index a7d4c9793..2a38db38f 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/cn.rs b/src/lang/cn.rs index ae3723692..f8f191f66 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", "管理的设备数已达到最大值"), ("Sync with recent sessions", "同步最近会话"), ("Sort tags", "对标签进行排序"), - ("Separate remote windows", "使用独立远程窗口"), + ("Open new connections in tabs", "在选项卡中打开新连接"), + ("Open in tabs", "在选项卡中打开"), + ("Open in windows", "在新窗口中打开"), ("separate window", "独立窗口"), ("Move tab to new window", "将标签页移至新窗口"), ].iter().cloned().collect(); diff --git a/src/lang/cs.rs b/src/lang/cs.rs index eb958733f..6160a0e87 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/da.rs b/src/lang/da.rs index 36dbb2229..7f7acda4a 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/de.rs b/src/lang/de.rs index dfe5e39d6..3e3f258dc 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", "Sie haben die maximale Anzahl der verwalteten Geräte erreicht."), ("Sync with recent sessions", "Synchronisierung mit den letzten Sitzungen"), ("Sort tags", "Tags sortieren"), - ("Separate remote windows", "Separate entfernte Fenster"), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", "Separates Fenster"), ("Move tab to new window", "Tab in neues Fenster verschieben"), ].iter().cloned().collect(); diff --git a/src/lang/el.rs b/src/lang/el.rs index e9a547dd7..93ead4c88 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/eo.rs b/src/lang/eo.rs index 5ad8e19a9..a966e2260 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/es.rs b/src/lang/es.rs index 97d3f61ed..a7856d93b 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", "Has alcanzado el máximo número de dispositivos administrados."), ("Sync with recent sessions", "Sincronizar con sesiones recientes"), ("Sort tags", "Ordenar etiquetas"), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/fa.rs b/src/lang/fa.rs index ea4656257..819ebac61 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/fr.rs b/src/lang/fr.rs index d2a470e35..8d614c1b6 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/hu.rs b/src/lang/hu.rs index a179c3ab1..6f5939e63 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/id.rs b/src/lang/id.rs index 0c4e7e35b..d0dc47e82 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/it.rs b/src/lang/it.rs index 202a455d6..d6ca7a42b 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", "Hai raggiunto il numero massimo di dispositivi gestibili."), ("Sync with recent sessions", "Sincronizza con le sessioni recenti"), ("Sort tags", "Ordina etichette"), - ("Separate remote windows", "Separa finestre remote"), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", "Separa finestra"), ("Move tab to new window", "Sposta scheda nella finestra successiva"), ].iter().cloned().collect(); diff --git a/src/lang/ja.rs b/src/lang/ja.rs index 747d8835b..165f30ade 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/ko.rs b/src/lang/ko.rs index bdb86e52b..13075b9ff 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/kz.rs b/src/lang/kz.rs index 438227aaf..5907f44f6 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/lt.rs b/src/lang/lt.rs index 7c9884dd3..cacd8daf2 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/nl.rs b/src/lang/nl.rs index 90b6e9624..9399062b2 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", "Het maximum aantal gecontroleerde apparaten is bereikt."), ("Sync with recent sessions", "Recente sessies synchroniseren"), ("Sort tags", "Labels sorteren"), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/pl.rs b/src/lang/pl.rs index 733a607cc..8c12cfea0 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", "Przekroczona maks. liczba urządzeń"), ("Sync with recent sessions", "Synchronizacja z ostatnimi sesjami"), ("Sort tags", "Znaczniki sortowania"), - ("Separate remote windows", "Oddzielne zdalne okna"), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", "oddzielne okno"), ("Move tab to new window", "Przenieś zakładkę do nowego okna"), ].iter().cloned().collect(); diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index ddf182355..b0ec7d50d 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index 69a154503..b3c2debe0 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/ro.rs b/src/lang/ro.rs index dee9ce028..91f5990d0 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/ru.rs b/src/lang/ru.rs index a359585de..ee4a7cdee 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", "Достигнуто максимальне количество управляемых устройств."), ("Sync with recent sessions", "Синхронизация последних сессий"), ("Sort tags", "Сортировка меток"), - ("Separate remote windows", "Отдельные удалённые окна"), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", "отдельное окно"), ("Move tab to new window", "Переместить вкладку в отдельное окно"), ].iter().cloned().collect(); diff --git a/src/lang/sk.rs b/src/lang/sk.rs index 04d063bc4..01b671ce0 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/sl.rs b/src/lang/sl.rs index 5df824031..02b8d622e 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/sq.rs b/src/lang/sq.rs index c4305d74a..f9f6434e2 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/sr.rs b/src/lang/sr.rs index 031750c5c..91e0fc778 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/sv.rs b/src/lang/sv.rs index 5d779dbf8..1e899e008 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/template.rs b/src/lang/template.rs index 9bfa58414..372289819 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/th.rs b/src/lang/th.rs index 7dde8febd..a4d166036 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/tr.rs b/src/lang/tr.rs index e16679ece..4e29f041d 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/tw.rs b/src/lang/tw.rs index fb4c390e1..fc656208d 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/ua.rs b/src/lang/ua.rs index d218dc9d3..db04a7740 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect(); diff --git a/src/lang/vn.rs b/src/lang/vn.rs index 2b71f9592..ca99323fa 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -524,7 +524,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("exceed_max_devices", ""), ("Sync with recent sessions", ""), ("Sort tags", ""), - ("Separate remote windows", ""), + ("Open new connections in tabs", ""), + ("Open in tabs", ""), + ("Open in windows", ""), ("separate window", ""), ("Move tab to new window", ""), ].iter().cloned().collect();