From 77fa807b573ddacd35f9c7d5f5b8a50bc9ffeba7 Mon Sep 17 00:00:00 2001 From: Kingtous Date: Mon, 8 May 2023 12:34:19 +0800 Subject: [PATCH 1/2] feat: implement dialog callback --- flutter/lib/common.dart | 10 +- flutter/lib/common/widgets/address_book.dart | 4 +- flutter/lib/common/widgets/dialog.dart | 28 +- flutter/lib/common/widgets/login.dart | 4 +- flutter/lib/common/widgets/peer_card.dart | 8 +- .../lib/desktop/pages/desktop_home_page.dart | 2 +- .../desktop/pages/desktop_setting_page.dart | 2 +- .../lib/desktop/pages/file_manager_page.dart | 2 +- flutter/lib/desktop/pages/install_page.dart | 2 +- .../widgets/kb_layout_type_chooser.dart | 2 +- .../lib/desktop/widgets/tabbar_widget.dart | 2 +- .../lib/mobile/pages/file_manager_page.dart | 2 +- flutter/lib/mobile/pages/remote_page.dart | 2 +- flutter/lib/mobile/pages/settings_page.dart | 8 +- flutter/lib/mobile/widgets/dialog.dart | 6 +- flutter/lib/models/file_model.dart | 4 +- flutter/lib/models/model.dart | 2 +- flutter/lib/models/server_model.dart | 10 +- flutter/lib/plugin/handlers.dart | 14 +- flutter/lib/plugin/utils/dialogs.dart | 83 ++ src/flutter_ffi.rs | 19 + src/lang/ca.rs | 2 + src/lang/cn.rs | 2 + src/lang/cs.rs | 2 + src/lang/da.rs | 2 + src/lang/de.rs | 2 + src/lang/el.rs | 2 + src/lang/eo.rs | 2 + src/lang/es.rs | 2 + src/lang/fa.rs | 2 + src/lang/fr.rs | 2 + src/lang/hu.rs | 2 + src/lang/id.rs | 2 + src/lang/it.rs | 2 + src/lang/ja.rs | 2 + src/lang/ko.rs | 2 + src/lang/kz.rs | 2 + src/lang/lt.rs | 1006 +++++++++-------- src/lang/nl.rs | 2 + src/lang/pl.rs | 2 + src/lang/pt_PT.rs | 2 + src/lang/ptbr.rs | 2 + src/lang/ro.rs | 2 + src/lang/ru.rs | 2 + src/lang/sk.rs | 2 + src/lang/sl.rs | 2 + src/lang/sq.rs | 2 + src/lang/sr.rs | 2 + src/lang/sv.rs | 2 + src/lang/template.rs | 2 + src/lang/th.rs | 2 + src/lang/tr.rs | 2 + src/lang/tw.rs | 2 + src/lang/ua.rs | 2 + src/lang/vn.rs | 2 + 55 files changed, 734 insertions(+), 554 deletions(-) create mode 100644 flutter/lib/plugin/utils/dialogs.dart diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index d64f2cde5..01610527b 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -557,7 +557,7 @@ void window_on_top(int? id) { } typedef DialogBuilder = CustomAlertDialog Function( - StateSetter setState, void Function([dynamic]) close); + StateSetter setState, void Function([dynamic]) close, BuildContext context); class Dialog { OverlayEntry? entry; @@ -660,7 +660,7 @@ class OverlayDialogManager { child: StatefulBuilder(builder: (context, setState) { return Listener( onPointerUp: (_) => innerClicked = true, - child: builder(setState, close), + child: builder(setState, close, overlayState.context), ); }))); }); @@ -680,7 +680,7 @@ class OverlayDialogManager { VoidCallback? onCancel}) { final tag = _tagCount.toString(); _tagCount++; - show((setState, close) { + show((setState, close, context) { cancel() { dismissAll(); if (onCancel != null) { @@ -938,7 +938,7 @@ void msgBox(String id, String type, String title, String text, String link, buttons.insert(0, dialogButton('JumpLink', onPressed: jumplink)); } dialogManager.show( - (setState, close) => CustomAlertDialog( + (setState, close, context) => CustomAlertDialog( title: null, content: SelectionArea(child: msgboxContent(type, title, text)), actions: buttons, @@ -1011,7 +1011,7 @@ Widget msgboxContent(String type, String title, String text) { void msgBoxCommon(OverlayDialogManager dialogManager, String title, Widget content, List buttons, {bool hasCancel = true}) { - dialogManager.show((setState, close) => CustomAlertDialog( + dialogManager.show((setState, close, context) => CustomAlertDialog( title: Text( translate(title), style: TextStyle(fontSize: 21), diff --git a/flutter/lib/common/widgets/address_book.dart b/flutter/lib/common/widgets/address_book.dart index 85c77d8ed..5b0b421c8 100644 --- a/flutter/lib/common/widgets/address_book.dart +++ b/flutter/lib/common/widgets/address_book.dart @@ -224,7 +224,7 @@ class _AddressBookState extends State { final style = TextStyle(fontSize: 14.0); String? errorMsg; - gFFI.dialogManager.show((setState, close) { + gFFI.dialogManager.show((setState, close, context) { submit() async { setState(() { isInProgress = true; @@ -334,7 +334,7 @@ class _AddressBookState extends State { var msg = ""; var isInProgress = false; TextEditingController controller = TextEditingController(text: field); - gFFI.dialogManager.show((setState, close) { + gFFI.dialogManager.show((setState, close, context) { submit() async { setState(() { msg = ""; diff --git a/flutter/lib/common/widgets/dialog.dart b/flutter/lib/common/widgets/dialog.dart index 7228bb585..395663b36 100644 --- a/flutter/lib/common/widgets/dialog.dart +++ b/flutter/lib/common/widgets/dialog.dart @@ -65,7 +65,7 @@ void changeIdDialog() { RegexValidationRule('allowed characters', RegExp(r'^\w*$')) ]; - gFFI.dialogManager.show((setState, close) { + gFFI.dialogManager.show((setState, close, context) { submit() async { debugPrint("onSubmit"); newId = controller.text.trim(); @@ -175,7 +175,7 @@ void changeWhiteList({Function()? callback}) async { var controller = TextEditingController(text: newWhiteListField); var msg = ""; var isInProgress = false; - gFFI.dialogManager.show((setState, close) { + gFFI.dialogManager.show((setState, close, context) { return CustomAlertDialog( title: Text(translate("IP Whitelisting")), content: Column( @@ -255,7 +255,7 @@ void changeWhiteList({Function()? callback}) async { Future changeDirectAccessPort( String currentIP, String currentPort) async { final controller = TextEditingController(text: currentPort); - await gFFI.dialogManager.show((setState, close) { + await gFFI.dialogManager.show((setState, close, context) { return CustomAlertDialog( title: Text(translate("Change Local Port")), content: Column( @@ -425,7 +425,7 @@ class _PasswordWidgetState extends State { void wrongPasswordDialog( String id, OverlayDialogManager dialogManager, type, title, text) { dialogManager.dismissAll(); - dialogManager.show((setState, close) { + dialogManager.show((setState, close, context) { cancel() { close(); closeConnection(); @@ -498,7 +498,7 @@ _connectDialog( rememberAccount = await bind.sessionGetRemember(id: id) ?? false; } dialogManager.dismissAll(); - dialogManager.show((setState, close) { + dialogManager.show((setState, close, context) { cancel() { close(); closeConnection(); @@ -653,7 +653,7 @@ void showWaitUacDialog( dialogManager.dismissAll(); dialogManager.show( tag: '$id-wait-uac', - (setState, close) => CustomAlertDialog( + (setState, close, context) => CustomAlertDialog( title: null, content: msgboxContent(type, 'Wait', 'wait_accept_uac_tip'), )); @@ -769,7 +769,7 @@ void showRequestElevationDialog(String id, OverlayDialogManager dialogManager) { ])); dialogManager.dismissAll(); - dialogManager.show(tag: '$id-request-elevation', (setState, close) { + dialogManager.show(tag: '$id-request-elevation', (setState, close, context) { void submit() { if (groupValue.value == 'logon') { if (userController.text.isEmpty) { @@ -813,7 +813,7 @@ void showOnBlockDialog( dialogManager.existing('$id-request-elevation')) { return; } - dialogManager.show(tag: '$id-$type', (setState, close) { + dialogManager.show(tag: '$id-$type', (setState, close, context) { void submit() { close(); showRequestElevationDialog(id, dialogManager); @@ -835,7 +835,7 @@ void showOnBlockDialog( void showElevationError(String id, String type, String title, String text, OverlayDialogManager dialogManager) { - dialogManager.show(tag: '$id-$type', (setState, close) { + dialogManager.show(tag: '$id-$type', (setState, close, context) { void submit() { close(); showRequestElevationDialog(id, dialogManager); @@ -859,7 +859,7 @@ void showElevationError(String id, String type, String title, String text, void showWaitAcceptDialog(String id, String type, String title, String text, OverlayDialogManager dialogManager) { dialogManager.dismissAll(); - dialogManager.show((setState, close) { + dialogManager.show((setState, close, context) { onCancel() { closeConnection(); } @@ -878,7 +878,7 @@ void showWaitAcceptDialog(String id, String type, String title, String text, void showRestartRemoteDevice( PeerInfo pi, String id, OverlayDialogManager dialogManager) async { final res = - await dialogManager.show((setState, close) => CustomAlertDialog( + await dialogManager.show((setState, close, context) => CustomAlertDialog( title: Row(children: [ Icon(Icons.warning_rounded, color: Colors.redAccent, size: 28), Flexible( @@ -915,7 +915,7 @@ showSetOSPassword( var password = await bind.sessionGetOption(id: id, arg: 'os-password') ?? ''; var autoLogin = await bind.sessionGetOption(id: id, arg: 'auto-login') != ''; controller.text = password; - dialogManager.show((setState, close) { + dialogManager.show((setState, close, context) { submit() { var text = controller.text.trim(); bind.sessionPeerOption(id: id, name: 'os-password', value: text); @@ -983,7 +983,7 @@ showSetOSAccount( var password = await bind.sessionGetOption(id: id, arg: 'os-password') ?? ''; usernameController.text = username; passwdController.text = password; - dialogManager.show((setState, close) { + dialogManager.show((setState, close, context) { submit() { final username = usernameController.text.trim(); final password = usernameController.text.trim(); @@ -1115,7 +1115,7 @@ showAuditDialog(String id, dialogManager) async { void showConfirmSwitchSidesDialog( String id, OverlayDialogManager dialogManager) async { - dialogManager.show((setState, close) { + dialogManager.show((setState, close, context) { submit() async { await bind.sessionSwitchSides(id: id); closeConnection(id: id); diff --git a/flutter/lib/common/widgets/login.dart b/flutter/lib/common/widgets/login.dart index 3959c301c..c779cdba1 100644 --- a/flutter/lib/common/widgets/login.dart +++ b/flutter/lib/common/widgets/login.dart @@ -391,7 +391,7 @@ Future loginDialog() async { final autoLogin = true.obs; final RxString curOP = ''.obs; - final res = await gFFI.dialogManager.show((setState, close) { + final res = await gFFI.dialogManager.show((setState, close, context) { username.addListener(() { if (usernameMsg != null) { setState(() => usernameMsg = null); @@ -530,7 +530,7 @@ Future verificationCodeDialog(UserPayload? user) async { final focusNode = FocusNode()..requestFocus(); Timer(Duration(milliseconds: 100), () => focusNode..requestFocus()); - final res = await gFFI.dialogManager.show((setState, close) { + final res = await gFFI.dialogManager.show((setState, close, context) { bool validate() { return code.text.length >= 6; } diff --git a/flutter/lib/common/widgets/peer_card.dart b/flutter/lib/common/widgets/peer_card.dart index 90946ca74..14d04bc6c 100644 --- a/flutter/lib/common/widgets/peer_card.dart +++ b/flutter/lib/common/widgets/peer_card.dart @@ -664,7 +664,7 @@ abstract class BasePeerCard extends StatelessWidget { RxBool isInProgress = false.obs; String name = await _getAlias(id); var controller = TextEditingController(text: name); - gFFI.dialogManager.show((setState, close) { + gFFI.dialogManager.show((setState, close, context) { submit() async { isInProgress.value = true; String name = controller.text.trim(); @@ -724,7 +724,7 @@ abstract class BasePeerCard extends StatelessWidget { void _delete(String id, bool isLan, Function reloadFunc) async { gFFI.dialogManager.show( - (setState, close) { + (setState, close, context) { submit() async { if (isLan) { bind.mainRemoveDiscovered(id: id); @@ -1023,7 +1023,7 @@ class AddressBookPeerCard extends BasePeerCard { final tags = List.of(gFFI.abModel.tags); var selectedTag = gFFI.abModel.getPeerTags(id).obs; - gFFI.dialogManager.show((setState, close) { + gFFI.dialogManager.show((setState, close, context) { submit() async { setState(() { isInProgress = true; @@ -1115,7 +1115,7 @@ void _rdpDialog(String id) async { text: await bind.mainGetPeerOption(id: id, key: 'rdp_password')); RxBool secure = true.obs; - gFFI.dialogManager.show((setState, close) { + gFFI.dialogManager.show((setState, close, context) { submit() async { String port = portController.text.trim(); String username = userController.text; diff --git a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart index e66e3f284..f949f538d 100644 --- a/flutter/lib/desktop/pages/desktop_home_page.dart +++ b/flutter/lib/desktop/pages/desktop_home_page.dart @@ -589,7 +589,7 @@ void setPasswordDialog() async { MinCharactersValidationRule(8), ]; - gFFI.dialogManager.show((setState, close) { + gFFI.dialogManager.show((setState, close, context) { submit() { setState(() { errMsg0 = ""; diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index 3c1f3be54..29b778afb 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -2016,7 +2016,7 @@ void changeSocks5Proxy() async { RxBool obscure = true.obs; var isInProgress = false; - gFFI.dialogManager.show((setState, close) { + gFFI.dialogManager.show((setState, close, context) { submit() async { setState(() { proxyMsg = ''; diff --git a/flutter/lib/desktop/pages/file_manager_page.dart b/flutter/lib/desktop/pages/file_manager_page.dart index c687bd225..621c5d0ca 100644 --- a/flutter/lib/desktop/pages/file_manager_page.dart +++ b/flutter/lib/desktop/pages/file_manager_page.dart @@ -643,7 +643,7 @@ class _FileManagerViewState extends State { MenuButton( onPressed: () { final name = TextEditingController(); - _ffi.dialogManager.show((setState, close) { + _ffi.dialogManager.show((setState, close, context) { submit() { if (name.value.text.isNotEmpty) { controller.createDir(PathUtil.join( diff --git a/flutter/lib/desktop/pages/install_page.dart b/flutter/lib/desktop/pages/install_page.dart index adc0df138..7e1fe9b38 100644 --- a/flutter/lib/desktop/pages/install_page.dart +++ b/flutter/lib/desktop/pages/install_page.dart @@ -293,7 +293,7 @@ class _InstallPageBodyState extends State<_InstallPageBody> ), ]; gFFI.dialogManager.show( - (setState, close) => CustomAlertDialog( + (setState, close, context) => CustomAlertDialog( title: null, content: SelectionArea( child: diff --git a/flutter/lib/desktop/widgets/kb_layout_type_chooser.dart b/flutter/lib/desktop/widgets/kb_layout_type_chooser.dart index 90e72cd40..9497c2eec 100644 --- a/flutter/lib/desktop/widgets/kb_layout_type_chooser.dart +++ b/flutter/lib/desktop/widgets/kb_layout_type_chooser.dart @@ -204,7 +204,7 @@ showKBLayoutTypeChooser( String localPlatform, OverlayDialogManager dialogManager, ) { - dialogManager.show((setState, close) { + dialogManager.show((setState, close, context) { return CustomAlertDialog( title: Text('${translate('Select local keyboard type')} ($localPlatform)'), diff --git a/flutter/lib/desktop/widgets/tabbar_widget.dart b/flutter/lib/desktop/widgets/tabbar_widget.dart index 2186e879e..b93aa5927 100644 --- a/flutter/lib/desktop/widgets/tabbar_widget.dart +++ b/flutter/lib/desktop/widgets/tabbar_widget.dart @@ -687,7 +687,7 @@ Future toggleMaximize(bool isMainWindow) async { Future closeConfirmDialog() async { var confirm = true; - final res = await gFFI.dialogManager.show((setState, close) { + final res = await gFFI.dialogManager.show((setState, close, context) { submit() { final opt = "enable-confirm-closing-tabs"; String value = bool2option(opt, confirm); diff --git a/flutter/lib/mobile/pages/file_manager_page.dart b/flutter/lib/mobile/pages/file_manager_page.dart index bfc24364c..c2a97a1a0 100644 --- a/flutter/lib/mobile/pages/file_manager_page.dart +++ b/flutter/lib/mobile/pages/file_manager_page.dart @@ -197,7 +197,7 @@ class _FileManagerPageState extends State { } else if (v == "folder") { final name = TextEditingController(); gFFI.dialogManager - .show((setState, close) => CustomAlertDialog( + .show((setState, close, context) => CustomAlertDialog( title: Text(translate("Create Folder")), content: Column( mainAxisSize: MainAxisSize.min, diff --git a/flutter/lib/mobile/pages/remote_page.dart b/flutter/lib/mobile/pages/remote_page.dart index 32c736dba..1ce1faef1 100644 --- a/flutter/lib/mobile/pages/remote_page.dart +++ b/flutter/lib/mobile/pages/remote_page.dart @@ -868,7 +868,7 @@ void showOptions( List displayToggles = await toolbarDisplayToggle(context, id, gFFI); - dialogManager.show((setState, close) { + dialogManager.show((setState, close, context) { var viewStyle = (viewStyleRadios.isNotEmpty ? viewStyleRadios[0].groupValue : '').obs; var imageQuality = diff --git a/flutter/lib/mobile/pages/settings_page.dart b/flutter/lib/mobile/pages/settings_page.dart index 103c3e9fd..c08a3b1b4 100644 --- a/flutter/lib/mobile/pages/settings_page.dart +++ b/flutter/lib/mobile/pages/settings_page.dart @@ -318,7 +318,7 @@ class _SettingsState extends State with WidgetsBindingObserver { kRequestIgnoreBatteryOptimizations); } else { final res = await gFFI.dialogManager - .show((setState, close) => CustomAlertDialog( + .show((setState, close, context) => CustomAlertDialog( title: Text(translate("Open System Setting")), content: Text(translate( "android_open_battery_optimizations_tip")), @@ -505,7 +505,7 @@ void showLanguageSettings(OverlayDialogManager dialogManager) async { try { final langs = json.decode(await bind.mainGetLangs()) as List; var lang = bind.mainGetLocalOption(key: "lang"); - dialogManager.show((setState, close) { + dialogManager.show((setState, close, context) { setLang(v) { if (lang != v) { setState(() { @@ -539,7 +539,7 @@ void showLanguageSettings(OverlayDialogManager dialogManager) async { void showThemeSettings(OverlayDialogManager dialogManager) async { var themeMode = MyTheme.getThemeModePreference(); - dialogManager.show((setState, close) { + dialogManager.show((setState, close, context) { setTheme(v) { if (themeMode != v) { setState(() { @@ -563,7 +563,7 @@ void showThemeSettings(OverlayDialogManager dialogManager) async { } void showAbout(OverlayDialogManager dialogManager) { - dialogManager.show((setState, close) { + dialogManager.show((setState, close, context) { return CustomAlertDialog( title: Text('${translate('About')} RustDesk'), content: Wrap(direction: Axis.vertical, spacing: 12, children: [ diff --git a/flutter/lib/mobile/widgets/dialog.dart b/flutter/lib/mobile/widgets/dialog.dart index 3f22cee7c..8c321e785 100644 --- a/flutter/lib/mobile/widgets/dialog.dart +++ b/flutter/lib/mobile/widgets/dialog.dart @@ -20,7 +20,7 @@ void setPermanentPasswordDialog(OverlayDialogManager dialogManager) async { final p1 = TextEditingController(text: pw); var validateLength = false; var validateSame = false; - dialogManager.show((setState, close) { + dialogManager.show((setState, close, context) { submit() async { close(); dialogManager.showLoading(translate("Waiting")); @@ -111,7 +111,7 @@ void setTemporaryPasswordLengthDialog( var index = lengths.indexOf(length); if (index < 0) index = 0; length = lengths[index]; - dialogManager.show((setState, close) { + dialogManager.show((setState, close, context) { setLength(newValue) { final oldValue = length; if (oldValue == newValue) return; @@ -160,7 +160,7 @@ void showServerSettingsWithValue( String? relayServerMsg; String? apiServerMsg; - dialogManager.show((setState, close) { + dialogManager.show((setState, close, context) { Future validate() async { if (idCtrl.text != oldCfg.idServer) { final res = await validateAsync(idCtrl.text); diff --git a/flutter/lib/models/file_model.dart b/flutter/lib/models/file_model.dart index 6efcc6f30..04153d174 100644 --- a/flutter/lib/models/file_model.dart +++ b/flutter/lib/models/file_model.dart @@ -152,7 +152,7 @@ class FileModel { String title, String content, bool showCheckbox, bool isIdentical) async { fileConfirmCheckboxRemember = false; return await parent.target?.dialogManager.show( - (setState, Function(bool? v) close) { + (setState, Function(bool? v) close, context) { cancel() => close(false); submit() => close(true); return CustomAlertDialog( @@ -547,7 +547,7 @@ class FileController { Future showRemoveDialog( String title, String content, bool showCheckbox) async { - return await dialogManager?.show((setState, Function(bool v) close) { + return await dialogManager?.show((setState, Function(bool v) close, context) { cancel() => close(false); submit() => close(true); return CustomAlertDialog( diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 5348090f4..e40f0615f 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -383,7 +383,7 @@ class FfiModel with ChangeNotifier { void showRelayHintDialog(String id, String type, String title, String text, OverlayDialogManager dialogManager) { - dialogManager.show(tag: '$id-$type', (setState, close) { + dialogManager.show(tag: '$id-$type', (setState, close, context) { onClose() { closeConnection(); close(); diff --git a/flutter/lib/models/server_model.dart b/flutter/lib/models/server_model.dart index 216814cf6..273c4fe58 100644 --- a/flutter/lib/models/server_model.dart +++ b/flutter/lib/models/server_model.dart @@ -289,7 +289,7 @@ class ServerModel with ChangeNotifier { toggleService() async { if (_isStart) { final res = - await parent.target?.dialogManager.show((setState, close) { + await parent.target?.dialogManager.show((setState, close, context) { submit() => close(true); return CustomAlertDialog( title: Row(children: [ @@ -312,7 +312,7 @@ class ServerModel with ChangeNotifier { } } else { final res = - await parent.target?.dialogManager.show((setState, close) { + await parent.target?.dialogManager.show((setState, close, context) { submit() => close(true); return CustomAlertDialog( title: Row(children: [ @@ -481,7 +481,7 @@ class ServerModel with ChangeNotifier { } void showLoginDialog(Client client) { - parent.target?.dialogManager.show((setState, close) { + parent.target?.dialogManager.show((setState, close, context) { cancel() { sendLoginResponse(client, false); close(); @@ -699,7 +699,7 @@ String getLoginDialogTag(int id) { } showInputWarnAlert(FFI ffi) { - ffi.dialogManager.show((setState, close) { + ffi.dialogManager.show((setState, close, context) { submit() { AndroidPermissionManager.startAction(kActionAccessibilitySettings); close(); @@ -726,7 +726,7 @@ showInputWarnAlert(FFI ffi) { } Future showClientsMayNotBeChangedAlert(FFI? ffi) async { - await ffi?.dialogManager.show((setState, close) { + await ffi?.dialogManager.show((setState, close, context) { return CustomAlertDialog( title: Text(translate("Permissions")), content: Column( diff --git a/flutter/lib/plugin/handlers.dart b/flutter/lib/plugin/handlers.dart index 99327d242..780fd7e99 100644 --- a/flutter/lib/plugin/handlers.dart +++ b/flutter/lib/plugin/handlers.dart @@ -1,5 +1,9 @@ +import 'dart:convert'; import 'dart:ffi'; +import 'package:ffi/ffi.dart'; +import 'package:flutter_hbb/plugin/utils/dialogs.dart'; + abstract class NativeHandler { bool onEvent(Map evt); } @@ -37,7 +41,13 @@ class NativeUiHandler extends NativeHandler { } void onSelectPeers(OnSelectPeersCallbackDart cb, int userData) async { - // TODO: design a UI interface to pick peers. - cb(0, Pointer.fromAddress(0), 0, Pointer.fromAddress(userData)); + showPeerSelectionDialog(onPeersCallback: (peers) { + String json = jsonEncode( { + "peers": peers + }); + final native = json.toNativeUtf8(); + cb(0, native.cast(), native.length, Pointer.fromAddress(userData)); + malloc.free(native); + }); } } diff --git a/flutter/lib/plugin/utils/dialogs.dart b/flutter/lib/plugin/utils/dialogs.dart new file mode 100644 index 000000000..6795a7d72 --- /dev/null +++ b/flutter/lib/plugin/utils/dialogs.dart @@ -0,0 +1,83 @@ +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hbb/common.dart'; +import 'package:flutter_hbb/models/platform_model.dart'; +import 'package:get/get.dart'; + +void showPeerSelectionDialog( + {bool singleSelection = false, + required Function(List) onPeersCallback}) { + final peers = bind.mainLoadRecentPeersSync(); + if (peers.isEmpty) { + debugPrint("load recent peers sync failed."); + return; + } + Map map = jsonDecode(peers); + List peersList = map['peers'] ?? []; + final selected = List.empty(growable: true); + + submit() async { + onPeersCallback.call(selected); + } + + gFFI.dialogManager.show((setState, close, context) { + return CustomAlertDialog( + title: + Text(translate(singleSelection ? "Select peers" : "Select a peer")), + content: SizedBox( + height: 300.0, + child: ListView.builder( + itemBuilder: (context, index) { + final Map peer = peersList[index]; + final String platform = peer['platform'] ?? ""; + final String id = peer['id'] ?? ""; + final String alias = peer['alias'] ?? ""; + return GestureDetector( + onTap: () { + setState(() { + if (selected.contains(id)) { + selected.remove(id); + } else { + selected.add(id); + } + }); + }, + child: Container( + key: ValueKey(index), + height: 50.0, + decoration: BoxDecoration( + color: Theme.of(context).highlightColor, + borderRadius: BorderRadius.circular(12.0) + ), + padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 4.0), + margin: EdgeInsets.symmetric(vertical: 4.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + // platform + SizedBox(width: 8.0,), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + getPlatformImage(platform, size: 34.0), + ], + ), + SizedBox(width: 8.0,), + // id/alias + Expanded(child: Text(alias.isEmpty ? id : alias)), + ], + ), + ), + ); + }, + itemCount: peersList.length, + itemExtent: 50.0, + ), + ), + onSubmit: submit, + ); + }); +} diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 92dfc3b23..458313fce 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -751,6 +751,25 @@ pub fn main_load_recent_peers() { } } +pub fn main_load_recent_peers_sync() -> SyncReturn { + if !config::APP_DIR.read().unwrap().is_empty() { + let peers: Vec> = PeerConfig::peers() + .drain(..) + .map(|(id, _, p)| peer_to_map(id, p)) + .collect(); + + let data = HashMap::from([ + ("name", "load_recent_peers".to_owned()), + ( + "peers", + serde_json::ser::to_string(&peers).unwrap_or("".to_owned()), + ), + ]); + return SyncReturn(serde_json::ser::to_string(&data).unwrap_or("".to_owned())); + } + SyncReturn("".to_string()) +} + pub fn main_load_fav_peers() { if !config::APP_DIR.read().unwrap().is_empty() { let favs = get_fav(); diff --git a/src/lang/ca.rs b/src/lang/ca.rs index 49fd2fb89..554ca09cb 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 2daa44c64..a80b1da9a 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", "指纹"), ("Copy Fingerprint", "复制指纹"), ("no fingerprints", "没有指纹"), + ("Select a peer", "选择一个被控端"), + ("Select peers", "选择被控端") ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index 3bbd3e9eb..e0705a16c 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index d22cac717..8b6832a0b 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index 5112a8d35..f1a39ea28 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", "Fingerabdruck"), ("Copy Fingerprint", "Fingerabdruck kopieren"), ("no fingerprints", "Keine Fingerabdrücke"), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index b071de54d..bb7a86ed4 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index 3916afc01..547bf9816 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index 4b5be580c..b63f592a6 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", "Huella digital"), ("Copy Fingerprint", "Copiar huella digital"), ("no fingerprints", "sin huellas digitales"), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index 0bc9c3bc8..4e4a768d6 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", "اثر انگشت"), ("Copy Fingerprint", "کپی کردن اثر انگشت"), ("no fingerprints", "بدون اثر انگشت"), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index 1850ff2f6..3ff011881 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index 513c07e69..052c90d60 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index 76acc5a99..b8e31805d 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index 7612bac00..0265d36b1 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", "Firma digitale"), ("Copy Fingerprint", "Copia firma digitale"), ("no fingerprints", "Nessuna firma digitale"), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index 835a8e1ce..76f8e81ee 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index 1bd6bb4a4..59995d8ab 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index 3006abaa9..cf2ad3bf4 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index 7e8ae803d..936bc8d42 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -1,502 +1,504 @@ -lazy_static::lazy_static! { -pub static ref T: std::collections::HashMap<&'static str, &'static str> = - [ - ("Status", "Būsena"), - ("Your Desktop", "Jūsų darbalaukis"), - ("desk_tip", "Jūsų darbalaukis pasiekiamas naudojant šį ID ir slaptažodį"), - ("Password", "Slaptažodis"), - ("Ready", "Pasiruošęs"), - ("Established", "Įsteigta"), - ("connecting_status", "Prisijungiama prie RustDesk tinklo..."), - ("Enable Service", "Įgalinti paslaugą"), - ("Start Service", "Pradėti paslaugą"), - ("Service is running", "Paslauga veikia"), - ("Service is not running", "Paslauga neveikia"), - ("not_ready_status", "Neprisijungęs. Patikrinkite ryšį."), - ("Control Remote Desktop", "Nuotolinio darbalaukio valdymas"), - ("Transfer File", "Perkelti failą"), - ("Connect", "Prisijungti"), - ("Recent Sessions", "Seansų istorija"), - ("Address Book", "Adresų knyga"), - ("Confirmation", "Patvirtinimas"), - ("TCP Tunneling", "TCP tuneliavimas"), - ("Remove", "Pašalinti"), - ("Refresh random password", "Atnaujinti atsitiktinį slaptažodį"), - ("Set your own password", "Nustatykite savo slaptažodį"), - ("Enable Keyboard/Mouse", "Įgalinti klaviatūrą/pelę"), - ("Enable Clipboard", "Įgalinti iškarpinę"), - ("Enable File Transfer", "Įgalinti failų perdavimą"), - ("Enable TCP Tunneling", "Įgalinti TCP tuneliavimą"), - ("IP Whitelisting", "IP baltasis sąrašas"), - ("ID/Relay Server", "ID / perdavimo serveris"), - ("Import Server Config", "Importuoti serverio konfigūraciją"), - ("Export Server Config", "Eksportuoti serverio konfigūraciją"), - ("Import server configuration successfully", "Sėkmingai importuoti serverio konfigūraciją"), - ("Export server configuration successfully", "Sėkmingai eksportuoti serverio konfigūraciją"), - ("Invalid server configuration", "Netinkama serverio konfigūracija"), - ("Clipboard is empty", "Iškarpinė tuščia"), - ("Stop service", "Sustabdyti paslaugą"), - ("Change ID", "Keisti ID"), - ("Your new ID", "Jūsų naujasis ID"), - ("length %min% to %max%", "ilgis %min% iki %max%"), - ("starts with a letter", "prasideda raide"), - ("allowed characters", "leistini simboliai"), - ("id_change_tip", "Leidžiami tik simboliai a–z, A–Z, 0–9 ir _ (pabraukimas). Pirmoji raidė turi būti a-z, A-Z. Ilgis nuo 6 iki 16."), - ("Website", "Interneto svetainė"), - ("About", "Apie"), - ("Slogan_tip", "Sukurta su siela šiame beprotiškame pasaulyje!"), - ("Privacy Statement", "Privatumo pareiškimas"), - ("Mute", "Nutildyti"), - ("Build Date", "Sukūrimo data"), - ("Version", "Versija"), - ("Home", "Namai"), - ("Audio Input", "Garso įvestis"), - ("Enhancements", "Patobulinimai"), - ("Hardware Codec", "Aparatinės įrangos paspartinimas"), - ("Adaptive Bitrate", "Adaptyvusis pralaidumas"), - ("ID Server", "ID serveris"), - ("Relay Server", "Perdavimo serveris"), - ("API Server", "API serveris"), - ("invalid_http", "Turi prasidėti http:// arba https://"), - ("Invalid IP", "Netinkamas IP"), - ("Invalid format", "Neteisingas formatas"), - ("server_not_support", "Serveris dar nepalaikomas"), - ("Not available", "Nepasiekiamas"), - ("Too frequent", "Per dažnai"), - ("Cancel", "Atšaukti"), - ("Skip", "Praleisti"), - ("Close", "Uždaryti"), - ("Retry", "Bandykite dar kartą"), - ("OK", "GERAI"), - ("Password Required", "Reikalingas slaptažodis"), - ("Please enter your password", "Prašome įvesti savo slaptažodį"), - ("Remember password", "Prisiminti slaptažodį"), - ("Wrong Password", "Neteisingas slaptažodis"), - ("Do you want to enter again?", "Ar norite įeiti dar kartą?"), - ("Connection Error", "Ryšio klaida"), - ("Error", "Klaida"), - ("Reset by the peer", "Atmetė nuotolinis kompiuteris"), - ("Connecting...", "Jungiamasi..."), - ("Connection in progress. Please wait.", "Jungiamasi. Palaukite."), - ("Please try 1 minute later", "Prašome pabandyti po 1 minutės"), - ("Login Error", "Prisijungimo klaida"), - ("Successful", "Sėkmingai"), - ("Connected, waiting for image...", "Prisijungta, laukiama vaizdo..."), - ("Name", "Vardas"), - ("Type", "Tipas"), - ("Modified", "Pakeista"), - ("Size", "Dydis"), - ("Show Hidden Files", "Rodyti paslėptus failus"), - ("Receive", "Gauti"), - ("Send", "Siųsti"), - ("Refresh File", "Atnaujinti failą"), - ("Local", "Vietinis"), - ("Remote", "Nuotolinis"), - ("Remote Computer", "Nuotolinis kompiuteris"), - ("Local Computer", "Šis kompiuteris"), - ("Confirm Delete", "Patvirtinti ištrynimą"), - ("Delete", "Ištrinti"), - ("Properties", "Ypatybės"), - ("Multi Select", "Keli pasirinkimas"), - ("Select All", "Pasirinkti viską"), - ("Unselect All", "Atšaukti visų pasirinkimą"), - ("Empty Directory", "Tuščias katalogas"), - ("Not an empty directory", "Ne tuščias katalogas"), - ("Are you sure you want to delete this file?", "Ar tikrai norite ištrinti šį failą?"), - ("Are you sure you want to delete this empty directory?", "Ar tikrai norite ištrinti šį tuščią katalogą?"), - ("Are you sure you want to delete the file of this directory?", "Ar tikrai norite ištrinti šio katalogo failą?"), - ("Do this for all conflicts", "Taikyti visiems konfliktams"), - ("This is irreversible!", "Tai negrįžtama!"), - ("Deleting", "Ištrinama"), - ("files", "failai"), - ("Waiting", "Laukiu"), - ("Finished", "Baigta"), - ("Speed", "Greitis"), - ("Custom Image Quality", "Tinkinta vaizdo kokybė"), - ("Privacy mode", "Privatumo režimas"), - ("Block user input", "Blokuoti naudotojo įvestį"), - ("Unblock user input", "Atblokuoti naudotojo įvestį"), - ("Adjust Window", "Koreguoti langą"), - ("Original", "Originalas"), - ("Shrink", "Susitraukti"), - ("Stretch", "Ištempti"), - ("Scrollbar", "Slinkties juosta"), - ("ScrollAuto", "Automatinis slinkimas"), - ("Good image quality", "Gera vaizdo kokybė"), - ("Balanced", "Subalansuotas"), - ("Optimize reaction time", "Optimizuoti reakcijos laiką"), - ("Custom", "Tinkintas"), - ("Show remote cursor", "Rodyti nuotolinį žymeklį"), - ("Show quality monitor", "Rodyti kokybės monitorių"), - ("Disable clipboard", "Išjungti mainų sritį"), - ("Lock after session end", "Užrakinti pasibaigus seansui"), - ("Insert", "Įdėti"), - ("Insert Lock", "Įterpti užraktą"), - ("Refresh", "Atnaujinti"), - ("ID does not exist", "ID neegzistuoja"), - ("Failed to connect to rendezvous server", "Nepavyko prisijungti prie susitikimo serverio"), - ("Please try later", "Prašome pabandyti vėliau"), - ("Remote desktop is offline", "Nuotolinis darbalaukis neprisijungęs"), - ("Key mismatch", "Raktų neatitikimas"), - ("Timeout", "Laikas baigėsi"), - ("Failed to connect to relay server", "Nepavyko prisijungti prie perdavimo serverio"), - ("Failed to connect via rendezvous server", "Nepavyko prisijungti per susitikimo serverį"), - ("Failed to connect via relay server", "Nepavyko prisijungti per perdavimo serverį"), - ("Failed to make direct connection to remote desktop", "Nepavyko tiesiogiai prisijungti prie nuotolinio darbalaukio"), - ("Set Password", "Nustatyti slaptažodį"), - ("OS Password", "OS slaptažodis"), - ("install_tip", "Kai kuriais atvejais UAC gali priversti RustDesk netinkamai veikti nuotoliniame pagrindiniame kompiuteryje. Norėdami apeiti UAC, spustelėkite toliau esantį mygtuką, kad įdiegtumėte RustDesk į savo kompiuterį."), - ("Click to upgrade", "Spustelėkite, jei norite atnaujinti"), - ("Click to download", "Spustelėkite norėdami atsisiųsti"), - ("Click to update", "Spustelėkite norėdami atnaujinti"), - ("Configure", "Konfigūruoti"), - ("config_acc", "Norėdami nuotoliniu būdu valdyti darbalaukį, turite suteikti RustDesk \"prieigos\" leidimus"), - ("config_screen", "Norėdami nuotoliniu būdu pasiekti darbalaukį, turite suteikti RustDesk leidimus \"ekrano kopija\""), - ("Installing ...", "Diegiama ..."), - ("Install", "Diegti"), - ("Installation", "Įdiegimas"), - ("Installation Path", "Įdiegimo kelias"), - ("Create start menu shortcuts", "Sukurti pradžios meniu sparčiuosius klavišus"), - ("Create desktop icon", "Sukurti darbalaukio piktogramą"), - ("agreement_tip", "Pradėdami diegimą sutinkate su licencijos sutarties sąlygomis"), - ("Accept and Install", "Priimti ir įdiegti"), - ("End-user license agreement", "Galutinio vartotojo licencijos sutartis"), - ("Generating ...", "Generuojamas..."), - ("Your installation is lower version.", "Jūsų įdiegta versija senesnė."), - ("not_close_tcp_tip", "Naudodami tunelį neuždarykite šio lango"), - ("Listening ...", "Laukimas..."), - ("Remote Host", "Nuotolinis pagrindinis kompiuteris"), - ("Remote Port", "Nuotolinis prievadas"), - ("Action", "Veiksmas"), - ("Add", "Papildyti"), - ("Local Port", "Vietinis prievadas"), - ("Local Address", "Vietinis adresas"), - ("Change Local Port", "Keisti vietinį prievadą"), - ("setup_server_tip", "Kad ryšys būtų greitesnis, nustatykite savo serverį"), - ("Too short, at least 6 characters.", "Per trumpas, mažiausiai 6 simboliai."), - ("The confirmation is not identical.", "Patvirtinimas nėra tapatus."), - ("Permissions", "Leidimai"), - ("Accept", "Priimti"), - ("Dismiss", "Atmesti"), - ("Disconnect", "Atjungti"), - ("Allow using keyboard and mouse", "Leisti naudoti klaviatūrą ir pelę"), - ("Allow using clipboard", "Leisti naudoti mainų sritį"), - ("Allow hearing sound", "Leisti girdėti kompiuterio garsą"), - ("Allow file copy and paste", "Leisti kopijuoti ir įklijuoti failus"), - ("Connected", "Prisijungta"), - ("Direct and encrypted connection", "Tiesioginis ir šifruotas ryšys"), - ("Relayed and encrypted connection", "Perduotas ir šifruotas ryšys"), - ("Direct and unencrypted connection", "Tiesioginis ir nešifruotas ryšys"), - ("Relayed and unencrypted connection", "Perduotas ir nešifruotas ryšys"), - ("Enter Remote ID", "Įveskite nuotolinio ID"), - ("Enter your password", "Įveskite savo slaptažodį"), - ("Logging in...", "Prisijungiama..."), - ("Enable RDP session sharing", "Įgalinti RDP seansų bendrinimą"), - ("Auto Login", "Automatinis prisijungimas"), - ("Enable Direct IP Access", "Įgalinti tiesioginę IP prieigą"), - ("Rename", "Pervardyti"), - ("Space", "Erdvė"), - ("Create Desktop Shortcut", "Sukurti nuorodą darbalaukyje"), - ("Change Path", "Keisti kelią"), - ("Create Folder", "Sukurti aplanką"), - ("Please enter the folder name", "Įveskite aplanko pavadinimą"), - ("Fix it", "Pataisyk tai"), - ("Warning", "Įspėjimas"), - ("Login screen using Wayland is not supported", "Prisijungimo ekranas naudojant Wayland nepalaikomas"), - ("Reboot required", "Reikia paleisti iš naujo"), - ("Unsupported display server", "Nepalaikomas rodymo serveris"), - ("x11 expected", "reikalingas x11"), - ("Port", "Prievadas"), - ("Settings", "Nustatymai"), - ("Username", "Vartotojo vardas"), - ("Invalid port", "Netinkamas prievadas"), - ("Closed manually by the peer", "Partneris atmetė prašymą prisijungti"), - ("Enable remote configuration modification", "Įgalinti nuotolinį konfigūracijos modifikavimą"), - ("Run without install", "Vykdyti be diegimo"), - ("Connect via relay", "Prisijungti per relę"), - ("Always connect via relay", "Visada prisijunkite per relę"), - ("whitelist_tip", "Mane gali pasiekti tik baltajame sąraše esantys IP adresai"), - ("Login", "Prisijungti"), - ("Verify", "Patvirtinti"), - ("Remember me", "Prisimink mane"), - ("Trust this device", "Pasitikėk šiuo įrenginiu"), - ("Verification code", "Patvirtinimo kodas"), - ("verification_tip", "Aptiktas naujas įrenginys ir registruotu el. pašto adresu išsiųstas patvirtinimo kodas. Įveskite jį norėdami tęsti prisijungimą."), - ("Logout", "Atsijungti"), - ("Tags", "Žymos"), - ("Search ID", "Paieškos ID"), - ("whitelist_sep", "Atskirti kableliu, kabliataškiu, tarpu arba nauja eilute"), - ("Add ID", "Pridėti ID"), - ("Add Tag", "Pridėti žymą"), - ("Unselect all tags", "Atšaukti visų žymų pasirinkimą"), - ("Network error", "Tinklo klaida"), - ("Username missed", "Prarastas vartotojo vardas"), - ("Password missed", "Slaptažodis praleistas"), - ("Wrong credentials", "Klaidingi kredencialai"), - ("Edit Tag", "Redaguoti žymą"), - ("Unremember Password", "Nebeprisiminti slaptažodžio"), - ("Favorites", "Parankiniai"), - ("Add to Favorites", "Įtraukti į parankinius"), - ("Remove from Favorites", "Pašalinti iš parankinių"), - ("Empty", "Tuščia"), - ("Invalid folder name", "Neteisingas aplanko pavadinimas"), - ("Socks5 Proxy", "Socks5 Proxy"), - ("Hostname", "Pagrindinio kompiuterio pavadinimas"), - ("Discovered", "Aptikta tinkle"), - ("install_daemon_tip", "Norėdami, kad RustDesk startuotų automatiškai, turite ją įdiegti"), - ("Remote ID", "Nuotolinis ID"), - ("Paste", "Įklijuoti"), - ("Paste here?", "Įklijuoti čia?"), - ("Are you sure to close the connection?", "Ar tikrai norite atsijungti?"), - ("Download new version", "Atsisiųsti naują versiją"), - ("Touch mode", "Palietimo režimas"), - ("Mouse mode", "Pelės režimas"), - ("One-Finger Tap", "Palietimas vienu pirštu"), - ("Left Mouse", "Kairysis pelės kl."), - ("One-Long Tap", "Vienas palietimas"), - ("Two-Finger Tap", "Palietimas dviem pirštais"), - ("Right Mouse", "Dešinysis pelės kl."), - ("One-Finger Move", "Vieno piršto judesys"), - ("Double Tap & Move", "Dukart palieskite ir perkelkite"), - ("Mouse Drag", "Pelės vilkimas"), - ("Three-Finger vertically", "Trys pirštai vertikaliai"), - ("Mouse Wheel", "Pelės ratukas"), - ("Two-Finger Move", "Dviejų pirštų judesys"), - ("Canvas Move", "Drobės perkėlimas"), - ("Pinch to Zoom", "Suimkite, kad padidintumėte"), - ("Canvas Zoom", "Drobės mastelis"), - ("Reset canvas", "Atstatyti drobę"), - ("No permission of file transfer", "Nėra leidimo perkelti failus"), - ("Note", "Pastaba"), - ("Connection", "Ryšys"), - ("Share Screen", "Bendrinti ekraną"), - ("Chat", "Pokalbis"), - ("Total", "Iš viso"), - ("items", "elementai"), - ("Selected", "Pasirinkta"), - ("Screen Capture", "Ekrano nuotrauka"), - ("Input Control", "Įvesties valdymas"), - ("Audio Capture", "Garso fiksavimas"), - ("File Connection", "Failo ryšys"), - ("Screen Connection", "Ekrano jungtis"), - ("Do you accept?", "Ar sutinki?"), - ("Open System Setting", "Atviros sistemos nustatymas"), - ("How to get Android input permission?", "Kaip gauti Android įvesties leidimą?"), - ("android_input_permission_tip1", "Kad nuotolinis įrenginys galėtų valdyti Android įrenginį pele arba liesti, turite leisti RustDesk naudoti \"Prieinamumo\" paslaugą."), - ("android_input_permission_tip2", "Eikite į kitą sistemos nustatymų puslapį, suraskite \"Įdiegtos paslaugos\" ir įgalinkite \"RustDesk įvestis\" paslaugą."), - ("android_new_connection_tip", "Gauta nauja užklausa tvarkyti dabartinį įrenginį."), - ("android_service_will_start_tip", "Įgalinus ekrano fiksavimo paslaugą, kiti įrenginiai gali pateikti užklausą prisijungti prie to įrenginio."), - ("android_stop_service_tip", "Uždarius paslaugą automatiškai bus uždaryti visi užmegzti ryšiai."), - ("android_version_audio_tip", "Dabartinė Android versija nepalaiko garso įrašymo, atnaujinkite į Android 10 ar naujesnę versiją."), - ("android_start_service_tip", "Spustelėkite [Paleisti paslaugą] arba įjunkite [Fiksuoti ekraną], kad paleistumėte ekrano bendrinimo paslaugą."), - ("android_permission_may_not_change_tip", "Užmegztų ryšių leidimų keisti negalima, reikia prisijungti iš naujo."), - ("Account", "Paskyra"), - ("Overwrite", "Perrašyti"), - ("This file exists, skip or overwrite this file?", "Šis failas egzistuoja, praleisti arba perrašyti šį failą?"), - ("Quit", "Išeiti"), - ("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/"), - ("Help", "Pagalba"), - ("Failed", "Nepavyko"), - ("Succeeded", "Pavyko"), - ("Someone turns on privacy mode, exit", "Kažkas įjungė privatumo režimą, išeiti"), - ("Unsupported", "Nepalaikomas"), - ("Peer denied", "Atšaukė"), - ("Please install plugins", "Įdiekite papildinius"), - ("Peer exit", "Nuotolinis mazgas neveikia"), - ("Failed to turn off", "Nepavyko išjungti"), - ("Turned off", "Išjungti"), - ("In privacy mode", "Privatumo režimas"), - ("Out privacy mode", "Išėjimas iš privatumo režimo"), - ("Language", "Kalba"), - ("Keep RustDesk background service", "Palikti RustDesk fonine paslauga"), - ("Ignore Battery Optimizations", "Ignoruoti akumuliatoriaus optimizavimą"), - ("android_open_battery_optimizations_tip", "Eikite į kitą nustatymų puslapį"), - ("Start on Boot", "Pradėti paleidžiant"), - ("Start the screen sharing service on boot, requires special permissions", "Paleiskite ekrano bendrinimo paslaugą įkrovos metu, reikia specialių leidimų"), - ("Connection not allowed", "Ryšys neleidžiamas"), - ("Legacy mode", "Senasis režimas"), - ("Map mode", "Žemėlapio režimas"), - ("Translate mode", "Vertimo režimas"), - ("Use permanent password", "Naudoti nuolatinį slaptažodį"), - ("Use both passwords", "Naudoti abu slaptažodžius"), - ("Set permanent password", "Nustatyti nuolatinį slaptažodį"), - ("Enable Remote Restart", "Įgalinti nuotolinį paleidimą iš naujo"), - ("Allow remote restart", "Leisti nuotolinio kompiuterio paleidimą iš naujo"), - ("Restart Remote Device", "Paleisti nuotolinį kompiuterį iš naujo"), - ("Are you sure you want to restart", "Ar tikrai norite paleisti iš naujo?"), - ("Restarting Remote Device", "Nuotolinio įrenginio paleidimas iš naujo"), - ("remote_restarting_tip", "Nuotolinis įrenginys paleidžiamas iš naujo. Uždarykite šį pranešimą ir po kurio laiko vėl prisijunkite naudodami nuolatinį slaptažodį."), - ("Copied", "Nukopijuota"), - ("Exit Fullscreen", "Išeiti iš pilno ekrano"), - ("Fullscreen", "Per visą ekraną"), - ("Mobile Actions", "Veiksmai mobiliesiems"), - ("Select Monitor", "Pasirinkite monitorių"), - ("Control Actions", "Valdymo veiksmai"), - ("Display Settings", "Ekrano nustatymai"), - ("Ratio", "Santykis"), - ("Image Quality", "Vaizdo kokybė"), - ("Scroll Style", "Slinkimo stilius"), - ("Show Menubar", "Rodyti meniu juostą"), - ("Hide Menubar", "Slėpti meniu juostą"), - ("Direct Connection", "Tiesioginis ryšys"), - ("Relay Connection", "Tarpinė jungtis"), - ("Secure Connection", "Saugus ryšys"), - ("Insecure Connection", "Nesaugus ryšys"), - ("Scale original", "Pakeisti originalų mastelį"), - ("Scale adaptive", "Pritaikomas mastelis"), - ("General", "Bendra"), - ("Security", "Sauga"), - ("Theme", "Tema"), - ("Dark Theme", "Tamsioji tema"), - ("Light Theme", "Šviesi tema"), - ("Dark", "Tamsi"), - ("Light", "Šviesi"), - ("Follow System", "Kaip sistemos"), - ("Enable hardware codec", "Įgalinti"), - ("Unlock Security Settings", "Atrakinti saugos nustatymus"), - ("Enable Audio", "Įgalinti garsą"), - ("Unlock Network Settings", "Atrakinti tinklo nustatymus"), - ("Server", "Serveris"), - ("Direct IP Access", "Tiesioginė IP prieiga"), - ("Proxy", "Tarpinis serveris"), - ("Apply", "Taikyti"), - ("Disconnect all devices?", "Atjungti visus įrenginius?"), - ("Clear", "Išvalyti"), - ("Audio Input Device", "Garso įvestis"), - ("Deny remote access", "Uždrausti nuotolinę prieigą"), - ("Use IP Whitelisting", "Naudoti patikimą IP sąrašą"), - ("Network", "Tinklas"), - ("Enable RDP", "Įgalinti RDP"), - ("Pin menubar", "Prisegti meniu juostą"), - ("Unpin menubar", "Atsegti meniu juostą"), - ("Recording", "Įrašymas"), - ("Directory", "Katalogas"), - ("Automatically record incoming sessions", "Automatiškai įrašyti įeinančius seansus"), - ("Change", "Keisti"), - ("Start session recording", "Pradėti seanso įrašinėjimą"), - ("Stop session recording", "Sustabdyti seanso įrašinėjimą"), - ("Enable Recording Session", "Įgalinti seanso įrašinėjimą"), - ("Allow recording session", "Leisti seanso įrašinėjimą"), - ("Enable LAN Discovery", "Įgalinti LAN aptikimą"), - ("Deny LAN Discovery", "Neleisti LAN aptikimo"), - ("Write a message", "Rašyti žinutę"), - ("Prompt", "Užuomina"), - ("Please wait for confirmation of UAC...", "Palaukite UAC patvirtinimo..."), - ("elevated_foreground_window_tip", "Dabartinis nuotolinio darbalaukio langas reikalauja didesnių privilegijų, todėl laikinai neįmanoma naudoti pelės ir klaviatūros. Galite paprašyti nuotolinio vartotojo sumažinti dabartinį langą arba spustelėti aukščio mygtuką ryšio valdymo lange. Norint išvengti šios problemos ateityje, rekomenduojama programinę įrangą įdiegti nuotoliniame įrenginyje."), - ("Disconnected", "Atsijungęs"), - ("Other", "Kita"), - ("Confirm before closing multiple tabs", "Patvirtinti prieš uždarant kelis skirtukus"), - ("Keyboard Settings", "Klaviatūros nustatymai"), - ("Full Access", "Pilna prieiga"), - ("Screen Share", "Ekrano bendrinimas"), - ("Wayland requires Ubuntu 21.04 or higher version.", "Wayland reikalauja Ubuntu 21.04 arba naujesnės versijos."), - ("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland reikalinga naujesnės Linux Distro versijos. Išbandykite X11 darbalaukį arba pakeiskite OS."), - ("JumpLink", "Peržiūra"), - ("Please Select the screen to be shared(Operate on the peer side).", "Prašome pasirinkti ekraną, kurį norite bendrinti (veikiantį kitoje pusėje)."), - ("Show RustDesk", "Rodyti RustDesk"), - ("This PC", "Šis kompiuteris"), - ("or", "arba"), - ("Continue with", "Tęsti su"), - ("Elevate", "Pakelti"), - ("Zoom cursor", "Mastelio keitimo žymeklis"), - ("Accept sessions via password", "Priimti seansus naudojant slaptažodį"), - ("Accept sessions via click", "Priimti seansus spustelėjus"), - ("Accept sessions via both", "Priimti seansus abiem variantais"), - ("Please wait for the remote side to accept your session request...", "Palaukite, kol nuotolinė pusė priims jūsų seanso užklausą..."), - ("One-time Password", "Vienkartinis slaptažodis"), - ("Use one-time password", "Naudoti vienkartinį slaptažodį"), - ("One-time password length", "Vienkartinio slaptažodžio ilgis"), - ("Request access to your device", "Prašo leidimo valdyti jūsų įrenginį"), - ("Hide connection management window", "Slėpti ryšio valdymo langą"), - ("hide_cm_tip", "Leisti paslėpti didžiąją ir mažąją raidę, jei priimamos slaptažodžio sesijos arba naudojamas nuolatinis slaptažodis"), - ("wayland_experiment_tip", "Wayland palaikymas yra eksperimentinis, naudokite X11, jei jums reikalingas automatinis prisijungimas."), - ("Right click to select tabs", "Dešiniuoju pelės mygtuku spustelėkite, kad pasirinktumėte skirtukus"), - ("Skipped", "Praleisti"), - ("Add to Address Book", "Pridėti prie adresų knygos"), - ("Group", "Grupė"), - ("Search", "Paieška"), - ("Closed manually by web console", "Uždaryta rankiniu būdu naudojant žiniatinklio konsolę"), - ("Local keyboard type", "Vietinės klaviatūros tipas"), - ("Select local keyboard type", "Pasirinkite vietinės klaviatūros tipą"), - ("software_render_tip", "Jei turite Nvidia vaizdo plokštę ir nuotolinis langas iškart užsidaro prisijungus, gali padėti „Nouveau“ tvarkyklės įdiegimas ir programinės įrangos atvaizdavimo pasirinkimas. Būtina paleisti iš naujo."), - ("Always use software rendering", "Visada naudoti programinį spartintuvą"), - ("config_input", "Norėdami valdyti nuotolinį darbalaukį naudodami klaviatūrą, turite suteikti RustDesk leidimus \"Įvesties monitoringas\"."), - ("config_microphone", "Norėdami kalbėtis su nuotoline puse, turite suteikti RustDesk leidimą \"Įrašyti garsą\"."), - ("request_elevation_tip", "Taip pat galite prašyti tesių suteikimo, jeigu kas nors yra nuotolinėje pusėje."), - ("Wait", "Laukti"), - ("Elevation Error", "Teisių suteikimo klaida"), - ("Ask the remote user for authentication", "Klauskite nuotolinio vartotojo autentifikavimo"), - ("Choose this if the remote account is administrator", "Pasirinkite tai, jei nuotolinė paskyra yra administratorius"), - ("Transmit the username and password of administrator", "Persiųsti administratoriaus vartotojo vardą ir slaptažodį"), - ("still_click_uac_tip", "Vis tiek reikia, kad nuotolinis vartotojas paleidžiant RustDesk UAC lange paspaustų \"OK\"."), - ("Request Elevation", "Prašyti teisių"), - ("wait_accept_uac_tip", "Palaukite, kol nuotolinis vartotojas patvirtins UAC užklausą."), - ("Elevate successfully", "Teisės suteiktos"), - ("uppercase", "didžiosios raidės"), - ("lowercase", "mažosios raidės"), - ("digit", "skaitmuo"), - ("special character", "specialusis simbolis"), - ("length>=8", "ilgis>=8"), - ("Weak", "Silpnas"), - ("Medium", "Vidutinis"), - ("Strong", "Stiprus"), - ("Switch Sides", "Perjungti puses"), - ("Please confirm if you want to share your desktop?", "Prašome patvirtinti, jeigu norite bendrinti darbalaukį?"), - ("Display", "Ekranas"), - ("Default View Style", "Numatytasis peržiūros stilius"), - ("Default Scroll Style", "Numatytasis slinkties stilius"), - ("Default Image Quality", "Numatytoji vaizdo kokybė"), - ("Default Codec", "Numatytasis kodekas"), - ("Bitrate", "Sparta"), - ("FPS", "FPS"), - ("Auto", "Automatinis"), - ("Other Default Options", "Kitos numatytosios parinktys"), - ("Voice call", "Balso skambutis"), - ("Text chat", "Tekstinis pokalbis"), - ("Stop voice call", "Sustabdyti balso skambutį"), - ("relay_hint_tip", "Tiesioginis ryšys gali būti neįmanomas. Tokiu atveju galite pabandyti prisijungti per perdavimo serverį. \nArba, jei norite iš karto naudoti perdavimo serverį, prie ID galite pridėti priesagą \"/r\" arba nuotolinio pagrindinio kompiuterio nustatymuose įgalinti \"Visada prisijungti per relę\"."), - ("Reconnect", "Prisijungti iš naujo"), - ("Codec", "Kodekas"), - ("Resolution", "Rezoliucija"), - ("No transfers in progress", "Nevyksta jokių perdavimų"), - ("Set one-time password length", "Nustatyti vienkartinio slaptažodžio ilgį"), - ("idd_driver_tip", "Įdiekite virtualaus ekrano tvarkyklę (naudojama, kai nėra fizinių ekranų)"), - ("confirm_idd_driver_tip", "Įjungta virtualaus ekrano tvarkyklės diegimo funkcija. Atminkite, kad bus įdiegtas bandomasis sertifikatas, kad būtų galima pasitikėti tvarkykle. Šis sertifikatas bus naudojamas tik pasitikėjimui Rustdesk tvarkyklėmis patikrinti."), - ("RDP Settings", "RDP nustatymai"), - ("Sort by", "Rūšiuoti pagal"), - ("New Connection", "Naujas ryšys"), - ("Restore", "Atkurti"), - ("Minimize", "Sumažinti"), - ("Maximize", "Padidinti"), - ("Your Device", "Jūsų įrenginys"), - ("empty_recent_tip", "Nėra paskutinių seansų!\nLaikas suplanuoti naują."), - ("empty_favorite_tip", "Dar neturite parankinių nuotolinių seansų."), - ("empty_lan_tip", "Nuotolinių mazgų nerasta."), - ("empty_address_book_tip", "Adresų knygelėje nėra nuotolinių kompiuterių."), - ("eg: admin", "pvz.: administratorius"), - ("Empty Username", "Tuščias naudotojo vardas"), - ("Empty Password", "Tuščias slaptažodis"), - ("Me", "Aš"), - ("identical_file_tip", "Failas yra identiškas nuotoliniame kompiuteryje esančiam failui."), - ("show_monitors_tip", "Rodyti monitorius įrankių juostoje"), - ("View Mode", "Peržiūros režimas"), - ("login_linux_tip", "Norėdami įjungti X darbalaukio seansą, turite būti prisijungę prie nuotolinės Linux paskyros."), - ("verify_rustdesk_password_tip", "Įveskite kliento RustDesk slaptažodį"), - ("remember_account_tip", "Prisiminti šią paskyrą"), - ("os_account_desk_tip", "Ši paskyra naudojama norint prisijungti prie nuotolinės OS ir įgalinti darbalaukio seansą režimu headless"), - ("OS Account", "OS paskyra"), - ("another_user_login_title_tip", "Kitas vartotojas jau yra prisijungęs"), - ("another_user_login_text_tip", "Atjungti"), - ("xorg_not_found_title_tip", "Xorg nerastas"), - ("xorg_not_found_text_tip", "Prašom įdiegti Xorg"), - ("no_desktop_title_tip", "Nėra pasiekiamų nuotolinių darbalaukių"), - ("no_desktop_text_tip", "Prašom įdiegti GNOME Desktop"), - ("No need to elevate", ""), - ("System Sound", ""), - ("Default", ""), - ("New RDP", ""), - ("Fingerprint", ""), - ("Copy Fingerprint", ""), - ("no fingerprints", ""), - ].iter().cloned().collect(); -} +lazy_static::lazy_static! { +pub static ref T: std::collections::HashMap<&'static str, &'static str> = + [ + ("Status", "Būsena"), + ("Your Desktop", "Jūsų darbalaukis"), + ("desk_tip", "Jūsų darbalaukis pasiekiamas naudojant šį ID ir slaptažodį"), + ("Password", "Slaptažodis"), + ("Ready", "Pasiruošęs"), + ("Established", "Įsteigta"), + ("connecting_status", "Prisijungiama prie RustDesk tinklo..."), + ("Enable Service", "Įgalinti paslaugą"), + ("Start Service", "Pradėti paslaugą"), + ("Service is running", "Paslauga veikia"), + ("Service is not running", "Paslauga neveikia"), + ("not_ready_status", "Neprisijungęs. Patikrinkite ryšį."), + ("Control Remote Desktop", "Nuotolinio darbalaukio valdymas"), + ("Transfer File", "Perkelti failą"), + ("Connect", "Prisijungti"), + ("Recent Sessions", "Seansų istorija"), + ("Address Book", "Adresų knyga"), + ("Confirmation", "Patvirtinimas"), + ("TCP Tunneling", "TCP tuneliavimas"), + ("Remove", "Pašalinti"), + ("Refresh random password", "Atnaujinti atsitiktinį slaptažodį"), + ("Set your own password", "Nustatykite savo slaptažodį"), + ("Enable Keyboard/Mouse", "Įgalinti klaviatūrą/pelę"), + ("Enable Clipboard", "Įgalinti iškarpinę"), + ("Enable File Transfer", "Įgalinti failų perdavimą"), + ("Enable TCP Tunneling", "Įgalinti TCP tuneliavimą"), + ("IP Whitelisting", "IP baltasis sąrašas"), + ("ID/Relay Server", "ID / perdavimo serveris"), + ("Import Server Config", "Importuoti serverio konfigūraciją"), + ("Export Server Config", "Eksportuoti serverio konfigūraciją"), + ("Import server configuration successfully", "Sėkmingai importuoti serverio konfigūraciją"), + ("Export server configuration successfully", "Sėkmingai eksportuoti serverio konfigūraciją"), + ("Invalid server configuration", "Netinkama serverio konfigūracija"), + ("Clipboard is empty", "Iškarpinė tuščia"), + ("Stop service", "Sustabdyti paslaugą"), + ("Change ID", "Keisti ID"), + ("Your new ID", "Jūsų naujasis ID"), + ("length %min% to %max%", "ilgis %min% iki %max%"), + ("starts with a letter", "prasideda raide"), + ("allowed characters", "leistini simboliai"), + ("id_change_tip", "Leidžiami tik simboliai a–z, A–Z, 0–9 ir _ (pabraukimas). Pirmoji raidė turi būti a-z, A-Z. Ilgis nuo 6 iki 16."), + ("Website", "Interneto svetainė"), + ("About", "Apie"), + ("Slogan_tip", "Sukurta su siela šiame beprotiškame pasaulyje!"), + ("Privacy Statement", "Privatumo pareiškimas"), + ("Mute", "Nutildyti"), + ("Build Date", "Sukūrimo data"), + ("Version", "Versija"), + ("Home", "Namai"), + ("Audio Input", "Garso įvestis"), + ("Enhancements", "Patobulinimai"), + ("Hardware Codec", "Aparatinės įrangos paspartinimas"), + ("Adaptive Bitrate", "Adaptyvusis pralaidumas"), + ("ID Server", "ID serveris"), + ("Relay Server", "Perdavimo serveris"), + ("API Server", "API serveris"), + ("invalid_http", "Turi prasidėti http:// arba https://"), + ("Invalid IP", "Netinkamas IP"), + ("Invalid format", "Neteisingas formatas"), + ("server_not_support", "Serveris dar nepalaikomas"), + ("Not available", "Nepasiekiamas"), + ("Too frequent", "Per dažnai"), + ("Cancel", "Atšaukti"), + ("Skip", "Praleisti"), + ("Close", "Uždaryti"), + ("Retry", "Bandykite dar kartą"), + ("OK", "GERAI"), + ("Password Required", "Reikalingas slaptažodis"), + ("Please enter your password", "Prašome įvesti savo slaptažodį"), + ("Remember password", "Prisiminti slaptažodį"), + ("Wrong Password", "Neteisingas slaptažodis"), + ("Do you want to enter again?", "Ar norite įeiti dar kartą?"), + ("Connection Error", "Ryšio klaida"), + ("Error", "Klaida"), + ("Reset by the peer", "Atmetė nuotolinis kompiuteris"), + ("Connecting...", "Jungiamasi..."), + ("Connection in progress. Please wait.", "Jungiamasi. Palaukite."), + ("Please try 1 minute later", "Prašome pabandyti po 1 minutės"), + ("Login Error", "Prisijungimo klaida"), + ("Successful", "Sėkmingai"), + ("Connected, waiting for image...", "Prisijungta, laukiama vaizdo..."), + ("Name", "Vardas"), + ("Type", "Tipas"), + ("Modified", "Pakeista"), + ("Size", "Dydis"), + ("Show Hidden Files", "Rodyti paslėptus failus"), + ("Receive", "Gauti"), + ("Send", "Siųsti"), + ("Refresh File", "Atnaujinti failą"), + ("Local", "Vietinis"), + ("Remote", "Nuotolinis"), + ("Remote Computer", "Nuotolinis kompiuteris"), + ("Local Computer", "Šis kompiuteris"), + ("Confirm Delete", "Patvirtinti ištrynimą"), + ("Delete", "Ištrinti"), + ("Properties", "Ypatybės"), + ("Multi Select", "Keli pasirinkimas"), + ("Select All", "Pasirinkti viską"), + ("Unselect All", "Atšaukti visų pasirinkimą"), + ("Empty Directory", "Tuščias katalogas"), + ("Not an empty directory", "Ne tuščias katalogas"), + ("Are you sure you want to delete this file?", "Ar tikrai norite ištrinti šį failą?"), + ("Are you sure you want to delete this empty directory?", "Ar tikrai norite ištrinti šį tuščią katalogą?"), + ("Are you sure you want to delete the file of this directory?", "Ar tikrai norite ištrinti šio katalogo failą?"), + ("Do this for all conflicts", "Taikyti visiems konfliktams"), + ("This is irreversible!", "Tai negrįžtama!"), + ("Deleting", "Ištrinama"), + ("files", "failai"), + ("Waiting", "Laukiu"), + ("Finished", "Baigta"), + ("Speed", "Greitis"), + ("Custom Image Quality", "Tinkinta vaizdo kokybė"), + ("Privacy mode", "Privatumo režimas"), + ("Block user input", "Blokuoti naudotojo įvestį"), + ("Unblock user input", "Atblokuoti naudotojo įvestį"), + ("Adjust Window", "Koreguoti langą"), + ("Original", "Originalas"), + ("Shrink", "Susitraukti"), + ("Stretch", "Ištempti"), + ("Scrollbar", "Slinkties juosta"), + ("ScrollAuto", "Automatinis slinkimas"), + ("Good image quality", "Gera vaizdo kokybė"), + ("Balanced", "Subalansuotas"), + ("Optimize reaction time", "Optimizuoti reakcijos laiką"), + ("Custom", "Tinkintas"), + ("Show remote cursor", "Rodyti nuotolinį žymeklį"), + ("Show quality monitor", "Rodyti kokybės monitorių"), + ("Disable clipboard", "Išjungti mainų sritį"), + ("Lock after session end", "Užrakinti pasibaigus seansui"), + ("Insert", "Įdėti"), + ("Insert Lock", "Įterpti užraktą"), + ("Refresh", "Atnaujinti"), + ("ID does not exist", "ID neegzistuoja"), + ("Failed to connect to rendezvous server", "Nepavyko prisijungti prie susitikimo serverio"), + ("Please try later", "Prašome pabandyti vėliau"), + ("Remote desktop is offline", "Nuotolinis darbalaukis neprisijungęs"), + ("Key mismatch", "Raktų neatitikimas"), + ("Timeout", "Laikas baigėsi"), + ("Failed to connect to relay server", "Nepavyko prisijungti prie perdavimo serverio"), + ("Failed to connect via rendezvous server", "Nepavyko prisijungti per susitikimo serverį"), + ("Failed to connect via relay server", "Nepavyko prisijungti per perdavimo serverį"), + ("Failed to make direct connection to remote desktop", "Nepavyko tiesiogiai prisijungti prie nuotolinio darbalaukio"), + ("Set Password", "Nustatyti slaptažodį"), + ("OS Password", "OS slaptažodis"), + ("install_tip", "Kai kuriais atvejais UAC gali priversti RustDesk netinkamai veikti nuotoliniame pagrindiniame kompiuteryje. Norėdami apeiti UAC, spustelėkite toliau esantį mygtuką, kad įdiegtumėte RustDesk į savo kompiuterį."), + ("Click to upgrade", "Spustelėkite, jei norite atnaujinti"), + ("Click to download", "Spustelėkite norėdami atsisiųsti"), + ("Click to update", "Spustelėkite norėdami atnaujinti"), + ("Configure", "Konfigūruoti"), + ("config_acc", "Norėdami nuotoliniu būdu valdyti darbalaukį, turite suteikti RustDesk \"prieigos\" leidimus"), + ("config_screen", "Norėdami nuotoliniu būdu pasiekti darbalaukį, turite suteikti RustDesk leidimus \"ekrano kopija\""), + ("Installing ...", "Diegiama ..."), + ("Install", "Diegti"), + ("Installation", "Įdiegimas"), + ("Installation Path", "Įdiegimo kelias"), + ("Create start menu shortcuts", "Sukurti pradžios meniu sparčiuosius klavišus"), + ("Create desktop icon", "Sukurti darbalaukio piktogramą"), + ("agreement_tip", "Pradėdami diegimą sutinkate su licencijos sutarties sąlygomis"), + ("Accept and Install", "Priimti ir įdiegti"), + ("End-user license agreement", "Galutinio vartotojo licencijos sutartis"), + ("Generating ...", "Generuojamas..."), + ("Your installation is lower version.", "Jūsų įdiegta versija senesnė."), + ("not_close_tcp_tip", "Naudodami tunelį neuždarykite šio lango"), + ("Listening ...", "Laukimas..."), + ("Remote Host", "Nuotolinis pagrindinis kompiuteris"), + ("Remote Port", "Nuotolinis prievadas"), + ("Action", "Veiksmas"), + ("Add", "Papildyti"), + ("Local Port", "Vietinis prievadas"), + ("Local Address", "Vietinis adresas"), + ("Change Local Port", "Keisti vietinį prievadą"), + ("setup_server_tip", "Kad ryšys būtų greitesnis, nustatykite savo serverį"), + ("Too short, at least 6 characters.", "Per trumpas, mažiausiai 6 simboliai."), + ("The confirmation is not identical.", "Patvirtinimas nėra tapatus."), + ("Permissions", "Leidimai"), + ("Accept", "Priimti"), + ("Dismiss", "Atmesti"), + ("Disconnect", "Atjungti"), + ("Allow using keyboard and mouse", "Leisti naudoti klaviatūrą ir pelę"), + ("Allow using clipboard", "Leisti naudoti mainų sritį"), + ("Allow hearing sound", "Leisti girdėti kompiuterio garsą"), + ("Allow file copy and paste", "Leisti kopijuoti ir įklijuoti failus"), + ("Connected", "Prisijungta"), + ("Direct and encrypted connection", "Tiesioginis ir šifruotas ryšys"), + ("Relayed and encrypted connection", "Perduotas ir šifruotas ryšys"), + ("Direct and unencrypted connection", "Tiesioginis ir nešifruotas ryšys"), + ("Relayed and unencrypted connection", "Perduotas ir nešifruotas ryšys"), + ("Enter Remote ID", "Įveskite nuotolinio ID"), + ("Enter your password", "Įveskite savo slaptažodį"), + ("Logging in...", "Prisijungiama..."), + ("Enable RDP session sharing", "Įgalinti RDP seansų bendrinimą"), + ("Auto Login", "Automatinis prisijungimas"), + ("Enable Direct IP Access", "Įgalinti tiesioginę IP prieigą"), + ("Rename", "Pervardyti"), + ("Space", "Erdvė"), + ("Create Desktop Shortcut", "Sukurti nuorodą darbalaukyje"), + ("Change Path", "Keisti kelią"), + ("Create Folder", "Sukurti aplanką"), + ("Please enter the folder name", "Įveskite aplanko pavadinimą"), + ("Fix it", "Pataisyk tai"), + ("Warning", "Įspėjimas"), + ("Login screen using Wayland is not supported", "Prisijungimo ekranas naudojant Wayland nepalaikomas"), + ("Reboot required", "Reikia paleisti iš naujo"), + ("Unsupported display server", "Nepalaikomas rodymo serveris"), + ("x11 expected", "reikalingas x11"), + ("Port", "Prievadas"), + ("Settings", "Nustatymai"), + ("Username", "Vartotojo vardas"), + ("Invalid port", "Netinkamas prievadas"), + ("Closed manually by the peer", "Partneris atmetė prašymą prisijungti"), + ("Enable remote configuration modification", "Įgalinti nuotolinį konfigūracijos modifikavimą"), + ("Run without install", "Vykdyti be diegimo"), + ("Connect via relay", "Prisijungti per relę"), + ("Always connect via relay", "Visada prisijunkite per relę"), + ("whitelist_tip", "Mane gali pasiekti tik baltajame sąraše esantys IP adresai"), + ("Login", "Prisijungti"), + ("Verify", "Patvirtinti"), + ("Remember me", "Prisimink mane"), + ("Trust this device", "Pasitikėk šiuo įrenginiu"), + ("Verification code", "Patvirtinimo kodas"), + ("verification_tip", "Aptiktas naujas įrenginys ir registruotu el. pašto adresu išsiųstas patvirtinimo kodas. Įveskite jį norėdami tęsti prisijungimą."), + ("Logout", "Atsijungti"), + ("Tags", "Žymos"), + ("Search ID", "Paieškos ID"), + ("whitelist_sep", "Atskirti kableliu, kabliataškiu, tarpu arba nauja eilute"), + ("Add ID", "Pridėti ID"), + ("Add Tag", "Pridėti žymą"), + ("Unselect all tags", "Atšaukti visų žymų pasirinkimą"), + ("Network error", "Tinklo klaida"), + ("Username missed", "Prarastas vartotojo vardas"), + ("Password missed", "Slaptažodis praleistas"), + ("Wrong credentials", "Klaidingi kredencialai"), + ("Edit Tag", "Redaguoti žymą"), + ("Unremember Password", "Nebeprisiminti slaptažodžio"), + ("Favorites", "Parankiniai"), + ("Add to Favorites", "Įtraukti į parankinius"), + ("Remove from Favorites", "Pašalinti iš parankinių"), + ("Empty", "Tuščia"), + ("Invalid folder name", "Neteisingas aplanko pavadinimas"), + ("Socks5 Proxy", "Socks5 Proxy"), + ("Hostname", "Pagrindinio kompiuterio pavadinimas"), + ("Discovered", "Aptikta tinkle"), + ("install_daemon_tip", "Norėdami, kad RustDesk startuotų automatiškai, turite ją įdiegti"), + ("Remote ID", "Nuotolinis ID"), + ("Paste", "Įklijuoti"), + ("Paste here?", "Įklijuoti čia?"), + ("Are you sure to close the connection?", "Ar tikrai norite atsijungti?"), + ("Download new version", "Atsisiųsti naują versiją"), + ("Touch mode", "Palietimo režimas"), + ("Mouse mode", "Pelės režimas"), + ("One-Finger Tap", "Palietimas vienu pirštu"), + ("Left Mouse", "Kairysis pelės kl."), + ("One-Long Tap", "Vienas palietimas"), + ("Two-Finger Tap", "Palietimas dviem pirštais"), + ("Right Mouse", "Dešinysis pelės kl."), + ("One-Finger Move", "Vieno piršto judesys"), + ("Double Tap & Move", "Dukart palieskite ir perkelkite"), + ("Mouse Drag", "Pelės vilkimas"), + ("Three-Finger vertically", "Trys pirštai vertikaliai"), + ("Mouse Wheel", "Pelės ratukas"), + ("Two-Finger Move", "Dviejų pirštų judesys"), + ("Canvas Move", "Drobės perkėlimas"), + ("Pinch to Zoom", "Suimkite, kad padidintumėte"), + ("Canvas Zoom", "Drobės mastelis"), + ("Reset canvas", "Atstatyti drobę"), + ("No permission of file transfer", "Nėra leidimo perkelti failus"), + ("Note", "Pastaba"), + ("Connection", "Ryšys"), + ("Share Screen", "Bendrinti ekraną"), + ("Chat", "Pokalbis"), + ("Total", "Iš viso"), + ("items", "elementai"), + ("Selected", "Pasirinkta"), + ("Screen Capture", "Ekrano nuotrauka"), + ("Input Control", "Įvesties valdymas"), + ("Audio Capture", "Garso fiksavimas"), + ("File Connection", "Failo ryšys"), + ("Screen Connection", "Ekrano jungtis"), + ("Do you accept?", "Ar sutinki?"), + ("Open System Setting", "Atviros sistemos nustatymas"), + ("How to get Android input permission?", "Kaip gauti Android įvesties leidimą?"), + ("android_input_permission_tip1", "Kad nuotolinis įrenginys galėtų valdyti Android įrenginį pele arba liesti, turite leisti RustDesk naudoti \"Prieinamumo\" paslaugą."), + ("android_input_permission_tip2", "Eikite į kitą sistemos nustatymų puslapį, suraskite \"Įdiegtos paslaugos\" ir įgalinkite \"RustDesk įvestis\" paslaugą."), + ("android_new_connection_tip", "Gauta nauja užklausa tvarkyti dabartinį įrenginį."), + ("android_service_will_start_tip", "Įgalinus ekrano fiksavimo paslaugą, kiti įrenginiai gali pateikti užklausą prisijungti prie to įrenginio."), + ("android_stop_service_tip", "Uždarius paslaugą automatiškai bus uždaryti visi užmegzti ryšiai."), + ("android_version_audio_tip", "Dabartinė Android versija nepalaiko garso įrašymo, atnaujinkite į Android 10 ar naujesnę versiją."), + ("android_start_service_tip", "Spustelėkite [Paleisti paslaugą] arba įjunkite [Fiksuoti ekraną], kad paleistumėte ekrano bendrinimo paslaugą."), + ("android_permission_may_not_change_tip", "Užmegztų ryšių leidimų keisti negalima, reikia prisijungti iš naujo."), + ("Account", "Paskyra"), + ("Overwrite", "Perrašyti"), + ("This file exists, skip or overwrite this file?", "Šis failas egzistuoja, praleisti arba perrašyti šį failą?"), + ("Quit", "Išeiti"), + ("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/"), + ("Help", "Pagalba"), + ("Failed", "Nepavyko"), + ("Succeeded", "Pavyko"), + ("Someone turns on privacy mode, exit", "Kažkas įjungė privatumo režimą, išeiti"), + ("Unsupported", "Nepalaikomas"), + ("Peer denied", "Atšaukė"), + ("Please install plugins", "Įdiekite papildinius"), + ("Peer exit", "Nuotolinis mazgas neveikia"), + ("Failed to turn off", "Nepavyko išjungti"), + ("Turned off", "Išjungti"), + ("In privacy mode", "Privatumo režimas"), + ("Out privacy mode", "Išėjimas iš privatumo režimo"), + ("Language", "Kalba"), + ("Keep RustDesk background service", "Palikti RustDesk fonine paslauga"), + ("Ignore Battery Optimizations", "Ignoruoti akumuliatoriaus optimizavimą"), + ("android_open_battery_optimizations_tip", "Eikite į kitą nustatymų puslapį"), + ("Start on Boot", "Pradėti paleidžiant"), + ("Start the screen sharing service on boot, requires special permissions", "Paleiskite ekrano bendrinimo paslaugą įkrovos metu, reikia specialių leidimų"), + ("Connection not allowed", "Ryšys neleidžiamas"), + ("Legacy mode", "Senasis režimas"), + ("Map mode", "Žemėlapio režimas"), + ("Translate mode", "Vertimo režimas"), + ("Use permanent password", "Naudoti nuolatinį slaptažodį"), + ("Use both passwords", "Naudoti abu slaptažodžius"), + ("Set permanent password", "Nustatyti nuolatinį slaptažodį"), + ("Enable Remote Restart", "Įgalinti nuotolinį paleidimą iš naujo"), + ("Allow remote restart", "Leisti nuotolinio kompiuterio paleidimą iš naujo"), + ("Restart Remote Device", "Paleisti nuotolinį kompiuterį iš naujo"), + ("Are you sure you want to restart", "Ar tikrai norite paleisti iš naujo?"), + ("Restarting Remote Device", "Nuotolinio įrenginio paleidimas iš naujo"), + ("remote_restarting_tip", "Nuotolinis įrenginys paleidžiamas iš naujo. Uždarykite šį pranešimą ir po kurio laiko vėl prisijunkite naudodami nuolatinį slaptažodį."), + ("Copied", "Nukopijuota"), + ("Exit Fullscreen", "Išeiti iš pilno ekrano"), + ("Fullscreen", "Per visą ekraną"), + ("Mobile Actions", "Veiksmai mobiliesiems"), + ("Select Monitor", "Pasirinkite monitorių"), + ("Control Actions", "Valdymo veiksmai"), + ("Display Settings", "Ekrano nustatymai"), + ("Ratio", "Santykis"), + ("Image Quality", "Vaizdo kokybė"), + ("Scroll Style", "Slinkimo stilius"), + ("Show Menubar", "Rodyti meniu juostą"), + ("Hide Menubar", "Slėpti meniu juostą"), + ("Direct Connection", "Tiesioginis ryšys"), + ("Relay Connection", "Tarpinė jungtis"), + ("Secure Connection", "Saugus ryšys"), + ("Insecure Connection", "Nesaugus ryšys"), + ("Scale original", "Pakeisti originalų mastelį"), + ("Scale adaptive", "Pritaikomas mastelis"), + ("General", "Bendra"), + ("Security", "Sauga"), + ("Theme", "Tema"), + ("Dark Theme", "Tamsioji tema"), + ("Light Theme", "Šviesi tema"), + ("Dark", "Tamsi"), + ("Light", "Šviesi"), + ("Follow System", "Kaip sistemos"), + ("Enable hardware codec", "Įgalinti"), + ("Unlock Security Settings", "Atrakinti saugos nustatymus"), + ("Enable Audio", "Įgalinti garsą"), + ("Unlock Network Settings", "Atrakinti tinklo nustatymus"), + ("Server", "Serveris"), + ("Direct IP Access", "Tiesioginė IP prieiga"), + ("Proxy", "Tarpinis serveris"), + ("Apply", "Taikyti"), + ("Disconnect all devices?", "Atjungti visus įrenginius?"), + ("Clear", "Išvalyti"), + ("Audio Input Device", "Garso įvestis"), + ("Deny remote access", "Uždrausti nuotolinę prieigą"), + ("Use IP Whitelisting", "Naudoti patikimą IP sąrašą"), + ("Network", "Tinklas"), + ("Enable RDP", "Įgalinti RDP"), + ("Pin menubar", "Prisegti meniu juostą"), + ("Unpin menubar", "Atsegti meniu juostą"), + ("Recording", "Įrašymas"), + ("Directory", "Katalogas"), + ("Automatically record incoming sessions", "Automatiškai įrašyti įeinančius seansus"), + ("Change", "Keisti"), + ("Start session recording", "Pradėti seanso įrašinėjimą"), + ("Stop session recording", "Sustabdyti seanso įrašinėjimą"), + ("Enable Recording Session", "Įgalinti seanso įrašinėjimą"), + ("Allow recording session", "Leisti seanso įrašinėjimą"), + ("Enable LAN Discovery", "Įgalinti LAN aptikimą"), + ("Deny LAN Discovery", "Neleisti LAN aptikimo"), + ("Write a message", "Rašyti žinutę"), + ("Prompt", "Užuomina"), + ("Please wait for confirmation of UAC...", "Palaukite UAC patvirtinimo..."), + ("elevated_foreground_window_tip", "Dabartinis nuotolinio darbalaukio langas reikalauja didesnių privilegijų, todėl laikinai neįmanoma naudoti pelės ir klaviatūros. Galite paprašyti nuotolinio vartotojo sumažinti dabartinį langą arba spustelėti aukščio mygtuką ryšio valdymo lange. Norint išvengti šios problemos ateityje, rekomenduojama programinę įrangą įdiegti nuotoliniame įrenginyje."), + ("Disconnected", "Atsijungęs"), + ("Other", "Kita"), + ("Confirm before closing multiple tabs", "Patvirtinti prieš uždarant kelis skirtukus"), + ("Keyboard Settings", "Klaviatūros nustatymai"), + ("Full Access", "Pilna prieiga"), + ("Screen Share", "Ekrano bendrinimas"), + ("Wayland requires Ubuntu 21.04 or higher version.", "Wayland reikalauja Ubuntu 21.04 arba naujesnės versijos."), + ("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland reikalinga naujesnės Linux Distro versijos. Išbandykite X11 darbalaukį arba pakeiskite OS."), + ("JumpLink", "Peržiūra"), + ("Please Select the screen to be shared(Operate on the peer side).", "Prašome pasirinkti ekraną, kurį norite bendrinti (veikiantį kitoje pusėje)."), + ("Show RustDesk", "Rodyti RustDesk"), + ("This PC", "Šis kompiuteris"), + ("or", "arba"), + ("Continue with", "Tęsti su"), + ("Elevate", "Pakelti"), + ("Zoom cursor", "Mastelio keitimo žymeklis"), + ("Accept sessions via password", "Priimti seansus naudojant slaptažodį"), + ("Accept sessions via click", "Priimti seansus spustelėjus"), + ("Accept sessions via both", "Priimti seansus abiem variantais"), + ("Please wait for the remote side to accept your session request...", "Palaukite, kol nuotolinė pusė priims jūsų seanso užklausą..."), + ("One-time Password", "Vienkartinis slaptažodis"), + ("Use one-time password", "Naudoti vienkartinį slaptažodį"), + ("One-time password length", "Vienkartinio slaptažodžio ilgis"), + ("Request access to your device", "Prašo leidimo valdyti jūsų įrenginį"), + ("Hide connection management window", "Slėpti ryšio valdymo langą"), + ("hide_cm_tip", "Leisti paslėpti didžiąją ir mažąją raidę, jei priimamos slaptažodžio sesijos arba naudojamas nuolatinis slaptažodis"), + ("wayland_experiment_tip", "Wayland palaikymas yra eksperimentinis, naudokite X11, jei jums reikalingas automatinis prisijungimas."), + ("Right click to select tabs", "Dešiniuoju pelės mygtuku spustelėkite, kad pasirinktumėte skirtukus"), + ("Skipped", "Praleisti"), + ("Add to Address Book", "Pridėti prie adresų knygos"), + ("Group", "Grupė"), + ("Search", "Paieška"), + ("Closed manually by web console", "Uždaryta rankiniu būdu naudojant žiniatinklio konsolę"), + ("Local keyboard type", "Vietinės klaviatūros tipas"), + ("Select local keyboard type", "Pasirinkite vietinės klaviatūros tipą"), + ("software_render_tip", "Jei turite Nvidia vaizdo plokštę ir nuotolinis langas iškart užsidaro prisijungus, gali padėti „Nouveau“ tvarkyklės įdiegimas ir programinės įrangos atvaizdavimo pasirinkimas. Būtina paleisti iš naujo."), + ("Always use software rendering", "Visada naudoti programinį spartintuvą"), + ("config_input", "Norėdami valdyti nuotolinį darbalaukį naudodami klaviatūrą, turite suteikti RustDesk leidimus \"Įvesties monitoringas\"."), + ("config_microphone", "Norėdami kalbėtis su nuotoline puse, turite suteikti RustDesk leidimą \"Įrašyti garsą\"."), + ("request_elevation_tip", "Taip pat galite prašyti tesių suteikimo, jeigu kas nors yra nuotolinėje pusėje."), + ("Wait", "Laukti"), + ("Elevation Error", "Teisių suteikimo klaida"), + ("Ask the remote user for authentication", "Klauskite nuotolinio vartotojo autentifikavimo"), + ("Choose this if the remote account is administrator", "Pasirinkite tai, jei nuotolinė paskyra yra administratorius"), + ("Transmit the username and password of administrator", "Persiųsti administratoriaus vartotojo vardą ir slaptažodį"), + ("still_click_uac_tip", "Vis tiek reikia, kad nuotolinis vartotojas paleidžiant RustDesk UAC lange paspaustų \"OK\"."), + ("Request Elevation", "Prašyti teisių"), + ("wait_accept_uac_tip", "Palaukite, kol nuotolinis vartotojas patvirtins UAC užklausą."), + ("Elevate successfully", "Teisės suteiktos"), + ("uppercase", "didžiosios raidės"), + ("lowercase", "mažosios raidės"), + ("digit", "skaitmuo"), + ("special character", "specialusis simbolis"), + ("length>=8", "ilgis>=8"), + ("Weak", "Silpnas"), + ("Medium", "Vidutinis"), + ("Strong", "Stiprus"), + ("Switch Sides", "Perjungti puses"), + ("Please confirm if you want to share your desktop?", "Prašome patvirtinti, jeigu norite bendrinti darbalaukį?"), + ("Display", "Ekranas"), + ("Default View Style", "Numatytasis peržiūros stilius"), + ("Default Scroll Style", "Numatytasis slinkties stilius"), + ("Default Image Quality", "Numatytoji vaizdo kokybė"), + ("Default Codec", "Numatytasis kodekas"), + ("Bitrate", "Sparta"), + ("FPS", "FPS"), + ("Auto", "Automatinis"), + ("Other Default Options", "Kitos numatytosios parinktys"), + ("Voice call", "Balso skambutis"), + ("Text chat", "Tekstinis pokalbis"), + ("Stop voice call", "Sustabdyti balso skambutį"), + ("relay_hint_tip", "Tiesioginis ryšys gali būti neįmanomas. Tokiu atveju galite pabandyti prisijungti per perdavimo serverį. \nArba, jei norite iš karto naudoti perdavimo serverį, prie ID galite pridėti priesagą \"/r\" arba nuotolinio pagrindinio kompiuterio nustatymuose įgalinti \"Visada prisijungti per relę\"."), + ("Reconnect", "Prisijungti iš naujo"), + ("Codec", "Kodekas"), + ("Resolution", "Rezoliucija"), + ("No transfers in progress", "Nevyksta jokių perdavimų"), + ("Set one-time password length", "Nustatyti vienkartinio slaptažodžio ilgį"), + ("idd_driver_tip", "Įdiekite virtualaus ekrano tvarkyklę (naudojama, kai nėra fizinių ekranų)"), + ("confirm_idd_driver_tip", "Įjungta virtualaus ekrano tvarkyklės diegimo funkcija. Atminkite, kad bus įdiegtas bandomasis sertifikatas, kad būtų galima pasitikėti tvarkykle. Šis sertifikatas bus naudojamas tik pasitikėjimui Rustdesk tvarkyklėmis patikrinti."), + ("RDP Settings", "RDP nustatymai"), + ("Sort by", "Rūšiuoti pagal"), + ("New Connection", "Naujas ryšys"), + ("Restore", "Atkurti"), + ("Minimize", "Sumažinti"), + ("Maximize", "Padidinti"), + ("Your Device", "Jūsų įrenginys"), + ("empty_recent_tip", "Nėra paskutinių seansų!\nLaikas suplanuoti naują."), + ("empty_favorite_tip", "Dar neturite parankinių nuotolinių seansų."), + ("empty_lan_tip", "Nuotolinių mazgų nerasta."), + ("empty_address_book_tip", "Adresų knygelėje nėra nuotolinių kompiuterių."), + ("eg: admin", "pvz.: administratorius"), + ("Empty Username", "Tuščias naudotojo vardas"), + ("Empty Password", "Tuščias slaptažodis"), + ("Me", "Aš"), + ("identical_file_tip", "Failas yra identiškas nuotoliniame kompiuteryje esančiam failui."), + ("show_monitors_tip", "Rodyti monitorius įrankių juostoje"), + ("View Mode", "Peržiūros režimas"), + ("login_linux_tip", "Norėdami įjungti X darbalaukio seansą, turite būti prisijungę prie nuotolinės Linux paskyros."), + ("verify_rustdesk_password_tip", "Įveskite kliento RustDesk slaptažodį"), + ("remember_account_tip", "Prisiminti šią paskyrą"), + ("os_account_desk_tip", "Ši paskyra naudojama norint prisijungti prie nuotolinės OS ir įgalinti darbalaukio seansą režimu headless"), + ("OS Account", "OS paskyra"), + ("another_user_login_title_tip", "Kitas vartotojas jau yra prisijungęs"), + ("another_user_login_text_tip", "Atjungti"), + ("xorg_not_found_title_tip", "Xorg nerastas"), + ("xorg_not_found_text_tip", "Prašom įdiegti Xorg"), + ("no_desktop_title_tip", "Nėra pasiekiamų nuotolinių darbalaukių"), + ("no_desktop_text_tip", "Prašom įdiegti GNOME Desktop"), + ("No need to elevate", ""), + ("System Sound", ""), + ("Default", ""), + ("New RDP", ""), + ("Fingerprint", ""), + ("Copy Fingerprint", ""), + ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") + ].iter().cloned().collect(); +} diff --git a/src/lang/nl.rs b/src/lang/nl.rs index 58fda6c32..774308465 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", "Vingerafdruk"), ("Copy Fingerprint", "Kopieer Vingerafdruk"), ("no fingerprints", "geen vingerafdrukken"), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index e964779ea..867144cb8 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", "Sygnatura"), ("Copy Fingerprint", "Skopiuj sygnaturę"), ("no fingerprints", "brak sygnatur"), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index 6814d8dcb..557d274b0 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index 4a4a6401d..03c215d87 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index d2a4cb265..11ce9c467 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index f9a375ff5..9b514ca5c 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", "Отпечаток"), ("Copy Fingerprint", "Копировать отпечаток"), ("no fingerprints", "отпечатки отсутствуют"), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index d712e8b55..283e7f721 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index 52f1381c8..1269e5f27 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index 86aae1150..5fb966e4c 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index 554bd7589..1d639f4ef 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index 69fb3abb8..a7b671e75 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index 9d567c9b4..57e2e595b 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index 172677cc3..b88cb4ea6 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index 9907141a3..ab0c22166 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index 60333cb1e..cfb644db5 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", "指紋"), ("Copy Fingerprint", "複製指紋"), ("no fingerprints", "沒有指紋"), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/ua.rs b/src/lang/ua.rs index 6f460c1df..245fc89a5 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index 75d78fe72..4d415640f 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -498,5 +498,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Fingerprint", ""), ("Copy Fingerprint", ""), ("no fingerprints", ""), + ("Select a peer", ""), + ("Select peers", "") ].iter().cloned().collect(); } From 229df038fcbc3fffaf9df27725d56d476997b777 Mon Sep 17 00:00:00 2001 From: Kingtous Date: Mon, 8 May 2023 13:10:39 +0800 Subject: [PATCH 2/2] feat: add entry in left panel --- .../lib/desktop/pages/desktop_home_page.dart | 18 +++++++ flutter/lib/plugin/handlers.dart | 26 ++++++++++ flutter/lib/plugin/ui_manager.dart | 17 +++++++ src/lang/ca.rs | 3 +- src/lang/cn.rs | 3 +- src/lang/cs.rs | 3 +- src/lang/da.rs | 3 +- src/lang/de.rs | 3 +- src/lang/el.rs | 3 +- src/lang/eo.rs | 3 +- src/lang/es.rs | 3 +- src/lang/fa.rs | 3 +- src/lang/fr.rs | 3 +- src/lang/hu.rs | 3 +- src/lang/id.rs | 3 +- src/lang/it.rs | 3 +- src/lang/ja.rs | 3 +- src/lang/ko.rs | 3 +- src/lang/kz.rs | 3 +- src/lang/lt.rs | 3 +- src/lang/nl.rs | 3 +- src/lang/pl.rs | 3 +- src/lang/pt_PT.rs | 3 +- src/lang/ptbr.rs | 3 +- src/lang/ro.rs | 3 +- src/lang/ru.rs | 3 +- src/lang/sk.rs | 3 +- src/lang/sl.rs | 3 +- src/lang/sq.rs | 3 +- src/lang/sr.rs | 3 +- src/lang/sv.rs | 3 +- src/lang/template.rs | 3 +- src/lang/th.rs | 3 +- src/lang/tr.rs | 3 +- src/lang/tw.rs | 3 +- src/lang/ua.rs | 3 +- src/lang/vn.rs | 3 +- src/plugin/native_handlers/ui.rs | 49 +++++++++++++++++++ 38 files changed, 178 insertions(+), 34 deletions(-) create mode 100644 flutter/lib/plugin/ui_manager.dart diff --git a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart index f949f538d..9c1b5827a 100644 --- a/flutter/lib/desktop/pages/desktop_home_page.dart +++ b/flutter/lib/desktop/pages/desktop_home_page.dart @@ -14,6 +14,7 @@ import 'package:flutter_hbb/desktop/pages/desktop_tab_page.dart'; import 'package:flutter_hbb/desktop/widgets/scroll_wrapper.dart'; import 'package:flutter_hbb/models/platform_model.dart'; import 'package:flutter_hbb/models/server_model.dart'; +import 'package:flutter_hbb/plugin/ui_manager.dart'; import 'package:flutter_hbb/utils/multi_window_manager.dart'; import 'package:get/get.dart'; import 'package:provider/provider.dart'; @@ -88,6 +89,7 @@ class _DesktopHomePageState extends State } }, ), + buildPluginEntry() ], ), ), @@ -572,6 +574,22 @@ class _DesktopHomePageState extends State _updateTimer?.cancel(); super.dispose(); } + + Widget buildPluginEntry() { + final entries = PluginUiManager.instance.entries.entries; + return Offstage( + offstage: entries.isEmpty, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ... + entries.map((entry) { + return entry.value; + }) + ], + ), + ); + } } void setPasswordDialog() async { diff --git a/flutter/lib/plugin/handlers.dart b/flutter/lib/plugin/handlers.dart index 780fd7e99..c85f4dfca 100644 --- a/flutter/lib/plugin/handlers.dart +++ b/flutter/lib/plugin/handlers.dart @@ -2,6 +2,8 @@ import 'dart:convert'; import 'dart:ffi'; import 'package:ffi/ffi.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hbb/plugin/ui_manager.dart'; import 'package:flutter_hbb/plugin/utils/dialogs.dart'; abstract class NativeHandler { @@ -34,6 +36,15 @@ class NativeUiHandler extends NativeHandler { final cbFuncDart = cbFuncNative.asFunction(); onSelectPeers(cbFuncDart, userData); break; + case "register_ui_entry": + int cb = evt['on_tap_cb']; + int userData = evt['user_data'] ?? 0; + String title = evt['title'] ?? ""; + final cbFuncNative = Pointer.fromAddress(cb) + .cast>(); + final cbFuncDart = cbFuncNative.asFunction(); + onRegisterUiEntry(title, cbFuncDart, userData); + break; default: return false; } @@ -50,4 +61,19 @@ class NativeUiHandler extends NativeHandler { malloc.free(native); }); } + + void onRegisterUiEntry(String title, OnSelectPeersCallbackDart cbFuncDart, int userData) { + Widget widget = InkWell( + child: Container( + height: 25.0, + child: Row( + children: [ + Expanded(child: Text(title)), + Icon(Icons.chevron_right_rounded, size: 12.0,) + ], + ), + ), + ); + PluginUiManager.instance.registerEntry(title, widget); + } } diff --git a/flutter/lib/plugin/ui_manager.dart b/flutter/lib/plugin/ui_manager.dart new file mode 100644 index 000000000..45accf650 --- /dev/null +++ b/flutter/lib/plugin/ui_manager.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +class PluginUiManager { + PluginUiManager._(); + + static PluginUiManager instance = PluginUiManager._(); + + Map entries = {}; + + void registerEntry(String key, Widget widget) { + entries[key] = widget; + } + + void unregisterEntry(String key) { + entries.remove(key); + } +} \ No newline at end of file diff --git a/src/lang/ca.rs b/src/lang/ca.rs index 554ca09cb..252d5fbdc 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index a80b1da9a..76cbd2f2a 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", "复制指纹"), ("no fingerprints", "没有指纹"), ("Select a peer", "选择一个被控端"), - ("Select peers", "选择被控端") + ("Select peers", "选择被控"), + ("Plugins", "插件") ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index e0705a16c..e70c7d9e5 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index 8b6832a0b..fc27774f5 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index f1a39ea28..8b31d90cb 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", "Fingerabdruck kopieren"), ("no fingerprints", "Keine Fingerabdrücke"), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index bb7a86ed4..458a8c552 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index 547bf9816..cd26b5ab5 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index b63f592a6..d593e6838 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", "Copiar huella digital"), ("no fingerprints", "sin huellas digitales"), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index 4e4a768d6..e1183ce22 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", "کپی کردن اثر انگشت"), ("no fingerprints", "بدون اثر انگشت"), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index 3ff011881..6d9ff9408 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index 052c90d60..baeadea16 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index b8e31805d..2f197c486 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index 0265d36b1..2cec2cc58 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", "Copia firma digitale"), ("no fingerprints", "Nessuna firma digitale"), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index 76f8e81ee..e2391cfad 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index 59995d8ab..436de89e9 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index cf2ad3bf4..8450e1ffc 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index 936bc8d42..907d26515 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/nl.rs b/src/lang/nl.rs index 774308465..82a539491 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", "Kopieer Vingerafdruk"), ("no fingerprints", "geen vingerafdrukken"), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index 867144cb8..a9dc6b0b8 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", "Skopiuj sygnaturę"), ("no fingerprints", "brak sygnatur"), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index 557d274b0..608b7bbef 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index 03c215d87..2f7b03ec0 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index 11ce9c467..a6e2d843a 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index 9b514ca5c..eba62ca61 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", "Копировать отпечаток"), ("no fingerprints", "отпечатки отсутствуют"), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index 283e7f721..9f5e8f3ee 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index 1269e5f27..68a2af723 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index 5fb966e4c..987eb3a01 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index 1d639f4ef..f34be7fc1 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index a7b671e75..30b414f16 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index 57e2e595b..9b90aed84 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index b88cb4ea6..2ea5a98eb 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index ab0c22166..73da503a5 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index cfb644db5..2b53000b5 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", "複製指紋"), ("no fingerprints", "沒有指紋"), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/ua.rs b/src/lang/ua.rs index 245fc89a5..634c9b927 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index 4d415640f..b55210aa5 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -499,6 +499,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Copy Fingerprint", ""), ("no fingerprints", ""), ("Select a peer", ""), - ("Select peers", "") + ("Select peers", ""), + ("Plugins", "") ].iter().cloned().collect(); } diff --git a/src/plugin/native_handlers/ui.rs b/src/plugin/native_handlers/ui.rs index a4754fc08..d4ee91299 100644 --- a/src/plugin/native_handlers/ui.rs +++ b/src/plugin/native_handlers/ui.rs @@ -58,6 +58,33 @@ impl PluginNativeHandler for PluginNativeUIHandler { data: "missing cb field message".as_ptr() as _, }); } + "register_ui_entry" => { + let title; + if let Some(v) = data.get("title") { + title = v.as_str().unwrap_or(""); + } else { + title = ""; + } + if let Some(on_tap_cb) = data.get("on_tap_cb") { + if let Some(on_tap_cb) = on_tap_cb.as_u64() { + let user_data = match data.get("user_data") { + Some(user_data) => { + user_data.as_u64().unwrap_or(0) + }, + None => 0, + }; + self.register_ui_entry(title, on_tap_cb, user_data); + return Some(super::NR { + return_type: 0, + data: std::ptr::null(), + }); + } + } + return Some(super::NR { + return_type: -1, + data: "missing cb field message".as_ptr() as _, + }); + } _ => {} } None @@ -97,4 +124,26 @@ impl PluginNativeUIHandler { serde_json::to_string(¶m).unwrap_or("".to_string()), ); } + + /// Call with method `register_ui_entry` and the following json: + /// ``` + /// { + /// + /// "on_tap_cb": 0, // The function address + /// "user_data": 0, // An opaque pointer value passed to the callback. + /// "title": "entry name" + /// } + /// ``` + fn register_ui_entry(&self, title: &str, on_tap_cb: u64, user_data: u64) { + let mut param = HashMap::new(); + param.insert("name", json!("native_ui")); + param.insert("action", json!("register_ui_entry")); + param.insert("title", json!(title)); + param.insert("cb", json!(on_tap_cb)); + param.insert("user_data", json!(user_data)); + crate::flutter::push_global_event( + APP_TYPE_MAIN, + serde_json::to_string(¶m).unwrap_or("".to_string()), + ); + } }