mirror of
https://github.com/rustdesk/rustdesk.git
synced 2025-06-07 09:52:49 +08:00
refactor windows specific session, file transfer and waiting for image (#7184)
* refactor windows specific session, file transfer and waiting for image 1. File transfer doesn't show directory until correct session id is ensured 2. Fix file transfer, caused by `pi.username = self.lc.read().unwrap().get_username(&pi);` in `handle_peer_info` override empty username and `get_active_username` doesn't return currect session username * Fix home directory not change when session changed, or wrong home directory * Fix show empty remote directory rather than error messagbox when current session is in login screen 3. Show `Connected, waiting for image` after user choose the same session id Signed-off-by: 21pages <pages21@163.com> * update translations Signed-off-by: 21pages <pages21@163.com> * Update connection.rs --------- Signed-off-by: 21pages <pages21@163.com> Co-authored-by: RustDesk <71636191+rustdesk@users.noreply.github.com>
This commit is contained in:
parent
0f44de7dc3
commit
bf5abdb520
@ -494,9 +494,9 @@ class FfiModel with ChangeNotifier {
|
||||
Map<String, dynamic> evt, SessionID sessionId, String peerId) {
|
||||
if (parent.target == null) return;
|
||||
final dialogManager = parent.target!.dialogManager;
|
||||
final sessions = evt['user_sessions'];
|
||||
final title = translate('Multiple active user sessions found');
|
||||
final text = translate('Please select the user you want to connect to');
|
||||
final sessions = evt['windows_sessions'];
|
||||
final title = translate('Multiple Windows sessions found');
|
||||
final text = translate('Please select the session you want to connect to');
|
||||
final type = "";
|
||||
|
||||
showWindowsSessionsDialog(
|
||||
|
@ -1150,6 +1150,7 @@ pub struct LoginConfigHandler {
|
||||
pub adapter_luid: Option<i64>,
|
||||
pub mark_unsupported: Vec<CodecFormat>,
|
||||
pub selected_windows_session_id: Option<u32>,
|
||||
pub peer_info: Option<PeerInfo>,
|
||||
}
|
||||
|
||||
impl Deref for LoginConfigHandler {
|
||||
@ -1518,6 +1519,7 @@ impl LoginConfigHandler {
|
||||
}
|
||||
let mut n = 0;
|
||||
let mut msg = OptionMessage::new();
|
||||
// Version 1.2.5 can remove this, and OptionMessage is not needed for file transfer
|
||||
msg.support_windows_specific_session = BoolOption::Yes.into();
|
||||
n += 1;
|
||||
|
||||
|
@ -838,7 +838,7 @@ impl InvokeUiSession for FlutterHandler {
|
||||
self.push_event(
|
||||
"set_multiple_windows_session",
|
||||
vec![(
|
||||
"user_sessions",
|
||||
"windows_sessions",
|
||||
&serde_json::ser::to_string(&msg_vec).unwrap_or("".to_owned()),
|
||||
)],
|
||||
);
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
377
src/lang/bg.rs
377
src/lang/bg.rs
@ -1,67 +1,254 @@
|
||||
lazy_static::lazy_static! {
|
||||
pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
[
|
||||
("Status", ""),
|
||||
("Your Desktop", ""),
|
||||
("desk_tip", "Вашият работен плот може да бъде достъпен с този идентификационен код и парола."),
|
||||
("Password", ""),
|
||||
("Ready", ""),
|
||||
("Established", ""),
|
||||
("connecting_status", "Свързване с RustDesk мрежата..."),
|
||||
("Enable service", ""),
|
||||
("Start service", ""),
|
||||
("Service is running", ""),
|
||||
("Service is not running", ""),
|
||||
("not_ready_status", "Не е в готовност. Моля проверете мрежова връзка"),
|
||||
("Control Remote Desktop", ""),
|
||||
("Transfer file", ""),
|
||||
("Connect", ""),
|
||||
("Recent sessions", ""),
|
||||
("Address book", ""),
|
||||
("Confirmation", ""),
|
||||
("TCP tunneling", ""),
|
||||
("Remove", ""),
|
||||
("Refresh random password", ""),
|
||||
("Set your own password", ""),
|
||||
("Enable keyboard/mouse", ""),
|
||||
("Enable clipboard", ""),
|
||||
("Enable file transfer", ""),
|
||||
("Enable TCP tunneling", ""),
|
||||
("IP Whitelisting", ""),
|
||||
("ID/Relay Server", "ID/Релейн сървър"),
|
||||
("Import server config", ""),
|
||||
("Export Server Config", ""),
|
||||
("Import server configuration successfully", ""),
|
||||
("Export server configuration successfully", ""),
|
||||
("Invalid server configuration", ""),
|
||||
("Clipboard is empty", ""),
|
||||
("Stop service", ""),
|
||||
("Change ID", ""),
|
||||
("Your new ID", ""),
|
||||
("length %min% to %max%", ""),
|
||||
("starts with a letter", ""),
|
||||
("allowed characters", ""),
|
||||
("id_change_tip", "Само a-z, A-Z, 0-9 и _ (долна черта) символи са позволени. Първата буква трябва да е a-z, A-Z. С дължина мержу 6 и 16."),
|
||||
("Website", ""),
|
||||
("About", ""),
|
||||
("Slogan_tip", "Направено от сърце в този хаотичен свят!"),
|
||||
("Privacy Statement", ""),
|
||||
("Mute", ""),
|
||||
("Build Date", "Дата на изграждане"),
|
||||
("Version", ""),
|
||||
("Home", ""),
|
||||
("Audio Input", "Аудио вход"),
|
||||
("Enhancements", ""),
|
||||
("Hardware Codec", "Хардуерен кодек"),
|
||||
("Adaptive bitrate", ""),
|
||||
("ID Server", "ID сървър"),
|
||||
("Relay Server", "Релейн сървър"),
|
||||
("API Server", "API сървър"),
|
||||
("invalid_http", "трябва да започва с http:// или https://"),
|
||||
("Invalid IP", ""),
|
||||
("Invalid format", ""),
|
||||
("server_not_support", "Все още не се поддържа от сървъра"),
|
||||
("Not available", ""),
|
||||
("Too frequent", ""),
|
||||
("Cancel", ""),
|
||||
("Skip", ""),
|
||||
("Close", ""),
|
||||
("Retry", ""),
|
||||
("OK", ""),
|
||||
("Password Required", "Изисква се парола"),
|
||||
("Please enter your password", ""),
|
||||
("Remember password", ""),
|
||||
("Wrong Password", "Грешна парола"),
|
||||
("Do you want to enter again?", ""),
|
||||
("Connection Error", "Грешка при свързване"),
|
||||
("Error", ""),
|
||||
("Reset by the peer", ""),
|
||||
("Connecting...", ""),
|
||||
("Connection in progress. Please wait.", ""),
|
||||
("Please try 1 minute later", ""),
|
||||
("Login Error", "Грешка при вписване"),
|
||||
("Successful", ""),
|
||||
("Connected, waiting for image...", ""),
|
||||
("Name", ""),
|
||||
("Type", ""),
|
||||
("Modified", ""),
|
||||
("Size", ""),
|
||||
("Show Hidden Files", "Показване на скрити файлове"),
|
||||
("Receive", ""),
|
||||
("Send", ""),
|
||||
("Refresh File", "Опресняване на файла"),
|
||||
("Local", ""),
|
||||
("Remote", ""),
|
||||
("Remote Computer", "Отдалечен компютър"),
|
||||
("Local Computer", "Локален компютър"),
|
||||
("Confirm Delete", "Потвърдете изтриването"),
|
||||
("Delete", ""),
|
||||
("Properties", ""),
|
||||
("Multi Select", "Множествен избор"),
|
||||
("Select All", "Избери всички"),
|
||||
("Unselect All", "Деселектирай всички"),
|
||||
("Empty Directory", "Празна директория"),
|
||||
("Not an empty directory", ""),
|
||||
("Are you sure you want to delete this file?", ""),
|
||||
("Are you sure you want to delete this empty directory?", ""),
|
||||
("Are you sure you want to delete the file of this directory?", ""),
|
||||
("Do this for all conflicts", ""),
|
||||
("This is irreversible!", ""),
|
||||
("Deleting", ""),
|
||||
("files", ""),
|
||||
("Waiting", ""),
|
||||
("Finished", ""),
|
||||
("Speed", ""),
|
||||
("Custom Image Quality", "Персонализирано качество на изображението"),
|
||||
("Privacy mode", ""),
|
||||
("Block user input", ""),
|
||||
("Unblock user input", ""),
|
||||
("Adjust Window", "Регулирай прозореца"),
|
||||
("Original", ""),
|
||||
("Shrink", ""),
|
||||
("Stretch", ""),
|
||||
("Scrollbar", ""),
|
||||
("ScrollAuto", ""),
|
||||
("Good image quality", ""),
|
||||
("Balanced", ""),
|
||||
("Optimize reaction time", ""),
|
||||
("Custom", ""),
|
||||
("Show remote cursor", ""),
|
||||
("Show quality monitor", ""),
|
||||
("Disable clipboard", ""),
|
||||
("Lock after session end", ""),
|
||||
("Insert", ""),
|
||||
("Insert Lock", "Поставете ключ"),
|
||||
("Refresh", ""),
|
||||
("ID does not exist", ""),
|
||||
("Failed to connect to rendezvous server", ""),
|
||||
("Please try later", ""),
|
||||
("Remote desktop is offline", ""),
|
||||
("Key mismatch", ""),
|
||||
("Timeout", ""),
|
||||
("Failed to connect to relay server", ""),
|
||||
("Failed to connect via rendezvous server", ""),
|
||||
("Failed to connect via relay server", ""),
|
||||
("Failed to make direct connection to remote desktop", ""),
|
||||
("Set Password", "Задайте парола"),
|
||||
("OS Password", "Парола на Операционната система"),
|
||||
("install_tip", "Поради UAC, RustDesk в някои случай не може да работи правилно като отдалечена достъп. За да заобиколите UAC, моля, щракнете върху бутона по-долу, за да инсталирате RustDesk в системата."),
|
||||
("Click to upgrade", ""),
|
||||
("Click to download", ""),
|
||||
("Click to update", ""),
|
||||
("Configure", ""),
|
||||
("config_acc", "За да управлявате вашия работен плот дистанционно, трябва да предоставите на RustDesk разрешения \"Достъпност\"."),
|
||||
("config_screen", "In order to access your Desktop remotely, you need to grant RustDesk \"Screen Recording\" permissions."),
|
||||
("Installing ...", ""),
|
||||
("Install", ""),
|
||||
("Installation", ""),
|
||||
("Installation Path", "Инсталационен път"),
|
||||
("Create start menu shortcuts", ""),
|
||||
("Create desktop icon", ""),
|
||||
("agreement_tip", "Стартирайки инсталацията, вие приемате лицензионното споразумение."),
|
||||
("Accept and Install", "Приемете и инсталирайте"),
|
||||
("End-user license agreement", ""),
|
||||
("Generating ...", ""),
|
||||
("Your installation is lower version.", ""),
|
||||
("not_close_tcp_tip", "Не затваряйте този прозорец, докато използвате тунела"),
|
||||
("Listening ...", ""),
|
||||
("Remote Host", "Отдалечен хост"),
|
||||
("Remote Port", "Отдалечен порт"),
|
||||
("Action", ""),
|
||||
("Add", ""),
|
||||
("Local Port", "Локален порт"),
|
||||
("Local Address", "Локален адрес"),
|
||||
("Change Local Port", "Промяна на локалният порт"),
|
||||
("setup_server_tip", "За по-бърза връзка, моля направете свой собствен сървър"),
|
||||
("Too short, at least 6 characters.", ""),
|
||||
("The confirmation is not identical.", ""),
|
||||
("Permissions", ""),
|
||||
("Accept", ""),
|
||||
("Dismiss", ""),
|
||||
("Disconnect", ""),
|
||||
("Enable file copy and paste", ""),
|
||||
("Connected", ""),
|
||||
("Direct and encrypted connection", ""),
|
||||
("Relayed and encrypted connection", ""),
|
||||
("Direct and unencrypted connection", ""),
|
||||
("Relayed and unencrypted connection", ""),
|
||||
("Enter Remote ID", "Въведете дистанционно ID"),
|
||||
("Enter your password", ""),
|
||||
("Logging in...", ""),
|
||||
("Enable RDP session sharing", ""),
|
||||
("Auto Login", "Автоматично вписване (Валидно само ако зададете \"Заключване след края на сесията\")"),
|
||||
("Enable direct IP access", ""),
|
||||
("Rename", ""),
|
||||
("Space", ""),
|
||||
("Create desktop shortcut", ""),
|
||||
("Change Path", "Промяна на пътя"),
|
||||
("Create Folder", "Създай папка"),
|
||||
("Please enter the folder name", ""),
|
||||
("Fix it", ""),
|
||||
("Warning", ""),
|
||||
("Login screen using Wayland is not supported", ""),
|
||||
("Reboot required", ""),
|
||||
("Unsupported display server", ""),
|
||||
("x11 expected", ""),
|
||||
("Port", ""),
|
||||
("Settings", ""),
|
||||
("Username", ""),
|
||||
("Invalid port", ""),
|
||||
("Closed manually by the peer", ""),
|
||||
("Enable remote configuration modification", ""),
|
||||
("Run without install", ""),
|
||||
("Connect via relay", ""),
|
||||
("Always connect via relay", ""),
|
||||
("whitelist_tip", "Само IP от белия списък има достъп до мен"),
|
||||
("Login", ""),
|
||||
("Verify", ""),
|
||||
("Remember me", ""),
|
||||
("Trust this device", ""),
|
||||
("Verification code", ""),
|
||||
("verification_tip", "На регистрирания имейл адрес е изпратен код за потвърждение, въведете кода за потвърждение, за да продължите да влизате."),
|
||||
("Logout", ""),
|
||||
("Tags", ""),
|
||||
("Search ID", ""),
|
||||
("whitelist_sep", "Разделени със запетая, точка и запетая, интервали или нов ред"),
|
||||
("Add ID", ""),
|
||||
("Add Tag", "Добавяне на етикет"),
|
||||
("Unselect all tags", ""),
|
||||
("Network error", ""),
|
||||
("Username missed", ""),
|
||||
("Password missed", ""),
|
||||
("Wrong credentials", "Wrong username or password"),
|
||||
("The verification code is incorrect or has expired", ""),
|
||||
("Edit Tag", "Edit tag"),
|
||||
("Forget Password", "Забравена парола"),
|
||||
("Favorites", ""),
|
||||
("Add to Favorites", "Добави към любими"),
|
||||
("Remove from Favorites", "Премахване от любими"),
|
||||
("Empty", ""),
|
||||
("Invalid folder name", ""),
|
||||
("Socks5 Proxy", "Socks5 прокси"),
|
||||
("Hostname", ""),
|
||||
("Discovered", ""),
|
||||
("install_daemon_tip", "За стартиране с компютъра трябва да инсталирате системна услуга."),
|
||||
("Remote ID", ""),
|
||||
("Paste", ""),
|
||||
("Paste here?", ""),
|
||||
("Are you sure to close the connection?", "Сигурни ли сте, че искате да затворите връзката?"),
|
||||
("Download new version", ""),
|
||||
("Touch mode", ""),
|
||||
("Mouse mode", ""),
|
||||
("One-Finger Tap", "Докосване с един пръст"),
|
||||
("Left Mouse", "Ляв бутон на мишката"),
|
||||
("One-Long Tap", "Едно дълго докосване"),
|
||||
@ -76,13 +263,23 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Canvas Move", "Преместване на платното"),
|
||||
("Pinch to Zoom", "Щипнете, за да увеличите"),
|
||||
("Canvas Zoom", "Увеличение на платното"),
|
||||
("Reset canvas", ""),
|
||||
("No permission of file transfer", ""),
|
||||
("Note", ""),
|
||||
("Connection", ""),
|
||||
("Share Screen", "Сподели екран"),
|
||||
("Chat", ""),
|
||||
("Total", ""),
|
||||
("items", ""),
|
||||
("Selected", ""),
|
||||
("Screen Capture", "Заснемане на екрана"),
|
||||
("Input Control", "Контрол на въвеждане"),
|
||||
("Audio Capture", "Аудио записване"),
|
||||
("File Connection", "Файлова връзка"),
|
||||
("Screen Connection", "Свързване на екрана"),
|
||||
("Do you accept?", ""),
|
||||
("Open System Setting", "Отворете системната настройка"),
|
||||
("How to get Android input permission?", ""),
|
||||
("android_input_permission_tip1", "За да може отдалечено устройство да управлява вашето Android устройство чрез мишка или докосване, трябва да разрешите на RustDesk да използва услугата \"Достъпност\"."),
|
||||
("android_input_permission_tip2", "Моля, отидете на следващата страница с системни настройки, намерете и въведете [Installed Services], включете услугата [RustDesk Input]."),
|
||||
("android_new_connection_tip", "Получена е нова заявка за контрол, която иска да контролира вашето текущо устройство."),
|
||||
@ -91,15 +288,46 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("android_version_audio_tip", "Текущата версия на Android не поддържа аудио заснемане, моля, актуализирайте устройството с Android 10 или по-нова версия."),
|
||||
("android_start_service_tip", "Докоснете [Start service] или активирайте разрешение [Screen Capture], за да стартирате услугата за споделяне на екрана."),
|
||||
("android_permission_may_not_change_tip", "Разрешенията за установени връзки може да не се променят незабавно, докато не се свържете отново."),
|
||||
("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/#enable-permissions"),
|
||||
("Account", ""),
|
||||
("Overwrite", ""),
|
||||
("This file exists, skip or overwrite this file?", ""),
|
||||
("Quit", ""),
|
||||
("Help", ""),
|
||||
("Failed", ""),
|
||||
("Succeeded", ""),
|
||||
("Someone turns on privacy mode, exit", ""),
|
||||
("Unsupported", ""),
|
||||
("Peer denied", ""),
|
||||
("Please install plugins", ""),
|
||||
("Peer exit", ""),
|
||||
("Failed to turn off", ""),
|
||||
("Turned off", ""),
|
||||
("Language", ""),
|
||||
("Keep RustDesk background service", ""),
|
||||
("Ignore Battery Optimizations", "Игнорирай оптимизациите на батерията"),
|
||||
("android_open_battery_optimizations_tip", "Ако искате да деактивирате тази функция, моля, отидете на следващата страница с настройки на приложението RustDesk, намерете и въведете [Battery], премахнете отметката от [Unrestricted]"),
|
||||
("Start on boot", ""),
|
||||
("Start the screen sharing service on boot, requires special permissions", ""),
|
||||
("Connection not allowed", ""),
|
||||
("Legacy mode", ""),
|
||||
("Map mode", ""),
|
||||
("Translate mode", ""),
|
||||
("Use permanent password", ""),
|
||||
("Use both passwords", ""),
|
||||
("Set permanent password", ""),
|
||||
("Enable remote restart", ""),
|
||||
("Restart remote device", ""),
|
||||
("Are you sure you want to restart", ""),
|
||||
("Restarting remote device", ""),
|
||||
("remote_restarting_tip", "Отдалеченото устройство се рестартира, моля, затворете това съобщение и се свържете отново с постоянна парола след известно време"),
|
||||
("Copied", ""),
|
||||
("Exit Fullscreen", "Изход от цял екран"),
|
||||
("Fullscreen", ""),
|
||||
("Mobile Actions", "Мобилни действия"),
|
||||
("Select Monitor", "Изберете монитор"),
|
||||
("Control Actions", "Контролни действия"),
|
||||
("Display Settings", "Настройки на дисплея"),
|
||||
("Ratio", ""),
|
||||
("Image Quality", "Качество на изображението"),
|
||||
("Scroll Style", "Стил на превъртане"),
|
||||
("Show Toolbar", "Показване на лентата с инструменти"),
|
||||
@ -108,51 +336,138 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Relay Connection", "Релейна връзка"),
|
||||
("Secure Connection", "Защитена връзка"),
|
||||
("Insecure Connection", "Незащитена връзка"),
|
||||
("Scale original", ""),
|
||||
("Scale adaptive", ""),
|
||||
("General", ""),
|
||||
("Security", ""),
|
||||
("Theme", ""),
|
||||
("Dark Theme", "Тъмна тема"),
|
||||
("Light Theme", "Светла тема"),
|
||||
("Dark", ""),
|
||||
("Light", ""),
|
||||
("Follow System", "Следвай системата"),
|
||||
("Enable hardware codec", ""),
|
||||
("Unlock Security Settings", "Отключи настройките за сигурност"),
|
||||
("Enable audio", ""),
|
||||
("Unlock Network Settings", "Отключи мрежовите настройки"),
|
||||
("Server", ""),
|
||||
("Direct IP Access", "Директен IP достъп"),
|
||||
("Proxy", ""),
|
||||
("Apply", ""),
|
||||
("Disconnect all devices?", ""),
|
||||
("Clear", ""),
|
||||
("Audio Input Device", "Аудио входно устройство"),
|
||||
("Use IP Whitelisting", "Използвайте бял списък с IP адреси"),
|
||||
("Network", ""),
|
||||
("Pin Toolbar", "Фиксиране на лентата с инструменти"),
|
||||
("Unpin Toolbar", "Откачване на лентата с инструменти"),
|
||||
("Recording", ""),
|
||||
("Directory", ""),
|
||||
("Automatically record incoming sessions", ""),
|
||||
("Change", ""),
|
||||
("Start session recording", ""),
|
||||
("Stop session recording", ""),
|
||||
("Enable recording session", ""),
|
||||
("Enable LAN discovery", ""),
|
||||
("Deny LAN discovery", ""),
|
||||
("Write a message", ""),
|
||||
("Prompt", ""),
|
||||
("Please wait for confirmation of UAC...", ""),
|
||||
("elevated_foreground_window_tip", "Текущият прозорец на отдалечения работен плот изисква по-високи привилегии за работа, така че временно не може да използва мишката и клавиатурата. Можете да поискате от отдалечения потребител да минимизира текущия прозорец или да щракнете върху бутона за повдигане в прозореца за управление на връзката. За да избегнете този проблем, се препоръчва да инсталирате софтуера на отдалеченото устройство."),
|
||||
("Disconnected", ""),
|
||||
("Other", ""),
|
||||
("Confirm before closing multiple tabs", ""),
|
||||
("Keyboard Settings", "Настройки на клавиатурата"),
|
||||
("Full Access", "Пълен достъп"),
|
||||
("Screen Share", "Споделяне на екрана"),
|
||||
("Wayland requires Ubuntu 21.04 or higher version.", ""),
|
||||
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", ""),
|
||||
("JumpLink", "Преглед"),
|
||||
("Please Select the screen to be shared(Operate on the peer side).", "Моля, изберете екрана, който да бъде споделен (Работете от страна на партньора)."),
|
||||
("Show RustDesk", ""),
|
||||
("This PC", ""),
|
||||
("or", ""),
|
||||
("Continue with", ""),
|
||||
("Elevate", ""),
|
||||
("Zoom cursor", ""),
|
||||
("Accept sessions via password", ""),
|
||||
("Accept sessions via click", ""),
|
||||
("Accept sessions via both", ""),
|
||||
("Please wait for the remote side to accept your session request...", ""),
|
||||
("One-time Password", "Еднократна парола"),
|
||||
("Use one-time password", ""),
|
||||
("One-time password length", ""),
|
||||
("Request access to your device", ""),
|
||||
("Hide connection management window", ""),
|
||||
("hide_cm_tip", "Разрешете скриването само ако приемате сесии чрез парола и използвате постоянна парола"),
|
||||
("wayland_experiment_tip", "Wayland support is in experimental stage, please use X11 if you require unattended access."),
|
||||
("Right click to select tabs", ""),
|
||||
("Skipped", ""),
|
||||
("Add to address book", ""),
|
||||
("Group", ""),
|
||||
("Search", ""),
|
||||
("Closed manually by web console", ""),
|
||||
("Local keyboard type", ""),
|
||||
("Select local keyboard type", ""),
|
||||
("software_render_tip", "Ако използвате графична карта Nvidia под Linux и отдалеченият прозорец се затваря веднага след свързване, превключването към драйвера Nouveau с отворен код и изборът да използвате софтуерно изобразяване може да помогне. Изисква се рестартиране на софтуера."),
|
||||
("Always use software rendering", ""),
|
||||
("config_input", "За да контролирате отдалечен работен плот с клавиатура, трябва да предоставите на RustDesk разрешения \"Input Monitoring\"."),
|
||||
("config_microphone", "За да говорите дистанционно, трябва да предоставите на RustDesk разрешения \"Запис на звук\"."),
|
||||
("request_elevation_tip", "Можете също така да поискате повишаване на привилегии, ако има някой от отдалечената страна."),
|
||||
("Wait", ""),
|
||||
("Elevation Error", "Грешка при повишаване на привилегии"),
|
||||
("Ask the remote user for authentication", ""),
|
||||
("Choose this if the remote account is administrator", ""),
|
||||
("Transmit the username and password of administrator", ""),
|
||||
("still_click_uac_tip", "Все още изисква отдалеченият потребител да щракне върху OK в прозореца на UAC при стартиранят RustDesk."),
|
||||
("Request Elevation", "Поискайте повишаване на привилегии"),
|
||||
("wait_accept_uac_tip", "Моля, изчакайте отдалеченият потребител да приеме диалоговия прозорец на UAC."),
|
||||
("Elevate successfully", ""),
|
||||
("uppercase", ""),
|
||||
("lowercase", ""),
|
||||
("digit", ""),
|
||||
("special character", ""),
|
||||
("length>=8", ""),
|
||||
("Weak", ""),
|
||||
("Medium", ""),
|
||||
("Strong", ""),
|
||||
("Switch Sides", "Сменете страните"),
|
||||
("Please confirm if you want to share your desktop?", ""),
|
||||
("Display", ""),
|
||||
("Default View Style", "Стил на изглед по подразбиране"),
|
||||
("Default Scroll Style", "Стил на превъртане по подразбиране"),
|
||||
("Default Image Quality", "Качество на изображението по подразбиране"),
|
||||
("Default Codec", "Кодек по подразбиране"),
|
||||
("Bitrate", ""),
|
||||
("FPS", ""),
|
||||
("Auto", ""),
|
||||
("Other Default Options", "Други опции по подразбиране"),
|
||||
("Voice call", ""),
|
||||
("Text chat", ""),
|
||||
("Stop voice call", ""),
|
||||
("relay_hint_tip", "Може да не е възможно да се свържете директно; можете да опитате да се свържете чрез реле. Освен това, ако искате да използвате реле при първия си опит, добавете наставка \"/r\" към идентификатора или да изберете опцията \"Винаги свързване чрез реле\" в картата на последните сесии, ако съществува."),
|
||||
("Reconnect", ""),
|
||||
("Codec", ""),
|
||||
("Resolution", ""),
|
||||
("No transfers in progress", ""),
|
||||
("Set one-time password length", ""),
|
||||
("install_cert_tip", "Инсталирайте сертификат на RustDesk"),
|
||||
("confirm_install_cert_tip", "Това е сертификат за тестване на RustDesk, на който може да се вярва. Сертификатът ще се използва за доверие и инсталиране на драйвери на RustDesk, когато е необходимо."),
|
||||
("RDP Settings", "RDP настройки"),
|
||||
("Sort by", ""),
|
||||
("New Connection", "Ново свързване"),
|
||||
("Restore", ""),
|
||||
("Minimize", ""),
|
||||
("Maximize", ""),
|
||||
("Your Device", "Вашето устройство"),
|
||||
("empty_recent_tip", "Ами сега, няма скорошни сесии!\nВреме е да планирате нова."),
|
||||
("empty_favorite_tip", "Все още нямате любими връстници?\nНека намерим някой, с когото да се свържете, и да го добавим към вашите любими!"),
|
||||
("empty_lan_tip", "О, не, изглежда, че все още не сме открили връстници."),
|
||||
("empty_address_book_tip", "Изглежда, че в момента няма изброени връстници във вашата адресна книга."),
|
||||
("eg: admin", ""),
|
||||
("Empty Username", "Празно потребителско име"),
|
||||
("Empty Password", "Празна парола"),
|
||||
("Me", ""),
|
||||
("identical_file_tip", "Този файл е идентичен с този на партньора."),
|
||||
("show_monitors_tip", "Показване на мониторите в лентата с инструменти"),
|
||||
("View Mode", "Режим на преглед"),
|
||||
@ -167,21 +482,49 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("xorg_not_found_text_tip", "Моля, инсталирайте Xorg"),
|
||||
("no_desktop_title_tip", "Няма наличен работен плот"),
|
||||
("no_desktop_text_tip", "Моля, инсталирайте работен плот GNOME"),
|
||||
("No need to elevate", ""),
|
||||
("System Sound", "Системен звук"),
|
||||
("Default", ""),
|
||||
("New RDP", ""),
|
||||
("Fingerprint", ""),
|
||||
("Copy Fingerprint", "Копиране на пръстов отпечатък"),
|
||||
("no fingerprints", "Няма пръстови отпечатъци"),
|
||||
("Select a peer", ""),
|
||||
("Select peers", ""),
|
||||
("Plugins", ""),
|
||||
("Uninstall", ""),
|
||||
("Update", ""),
|
||||
("Enable", ""),
|
||||
("Disable", ""),
|
||||
("Options", ""),
|
||||
("resolution_original_tip", "Оригинална резолюция"),
|
||||
("resolution_fit_local_tip", "Напасване към локална разделителна способност"),
|
||||
("resolution_custom_tip", "Персонализирана разделителна способност"),
|
||||
("Collapse toolbar", ""),
|
||||
("Accept and Elevate", "Приемете и повишаване на привилегии"),
|
||||
("accept_and_elevate_btn_tooltip", "Приемете връзката и повишете UAC разрешенията."),
|
||||
("clipboard_wait_response_timeout_tip", "Времето за изчакване на отговор за копиране изтече."),
|
||||
("Incoming connection", ""),
|
||||
("Outgoing connection", ""),
|
||||
("Exit", ""),
|
||||
("Open", ""),
|
||||
("logout_tip", "Сигурни ли сте, че искате да излезете?"),
|
||||
("Service", ""),
|
||||
("Start", ""),
|
||||
("Stop", ""),
|
||||
("exceed_max_devices", "Достигнахте максималния брой управлявани устройства."),
|
||||
("Sync with recent sessions", ""),
|
||||
("Sort tags", ""),
|
||||
("Open connection in new tab", ""),
|
||||
("Move tab to new window", ""),
|
||||
("Can not be empty", ""),
|
||||
("Already exists", ""),
|
||||
("Change Password", "Промяна на паролата"),
|
||||
("Refresh Password", "Обнови паролата"),
|
||||
("ID", ""),
|
||||
("Grid View", "Мрежов изглед"),
|
||||
("List View", "Списъчен изглед"),
|
||||
("Select", ""),
|
||||
("Toggle Tags", "Превключване на етикети"),
|
||||
("pull_ab_failed_tip", "Неуспешно опресняване на адресната книга"),
|
||||
("push_ab_failed_tip", "Неуспешно синхронизиране на адресната книга със сървъра"),
|
||||
@ -190,30 +533,60 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Primary Color", "Основен цвят"),
|
||||
("HSV Color", "HSV цвят"),
|
||||
("Installation Successful!", "Успешна инсталация!"),
|
||||
("Installation failed!", ""),
|
||||
("Reverse mouse wheel", ""),
|
||||
("{} sessions", ""),
|
||||
("scam_title", "Възможно е да сте ИЗМАМЕНИ!"),
|
||||
("scam_text1", "Ако разговаряте по телефона с някой, когото НЕ ПОЗНАВАТЕ и НЯМАТЕ ДОВЕРИЕ, който ви е помолил да използвате RustDesk и да стартирате услугата, не продължавайте и затворете незабавно."),
|
||||
("scam_text2", "Те вероятно са измамник, който се опитва да открадне вашите пари или друга лична информация."),
|
||||
("Don't show again", ""),
|
||||
("I Agree", ""),
|
||||
("Decline", ""),
|
||||
("Timeout in minutes", ""),
|
||||
("auto_disconnect_option_tip", "Автоматично затваряне на входящите сесии при неактивност на потребителя"),
|
||||
("Connection failed due to inactivity", "Автоматично прекъсване на връзката поради неактивност"),
|
||||
("Check for software update on startup", ""),
|
||||
("upgrade_rustdesk_server_pro_to_{}_tip", "Моля обновете RustDesk Server Pro на версия {} или по-нова!"),
|
||||
("pull_group_failed_tip", "Неуспешно опресняване на групата"),
|
||||
("doc_fix_wayland", "https://rustdesk.com/docs/en/manual/linux/#x11-required"),
|
||||
("Filter by intersection", ""),
|
||||
("Remove wallpaper during incoming sessions", ""),
|
||||
("Test", ""),
|
||||
("display_is_plugged_out_msg", "Дисплеят е изключен, превключете на първия монитор."),
|
||||
("No displays", ""),
|
||||
("elevated_switch_display_msg", "Превключете към основния монитор, защото множество монитори не се поддържат в потребителски режим с повишени права."),
|
||||
("Open in new window", ""),
|
||||
("Show displays as individual windows", ""),
|
||||
("Use all my displays for the remote session", ""),
|
||||
("selinux_tip", "SELinux е активиран на вашето устройство, което може да попречи на RustDesk да работи правилно като контролирана страна."),
|
||||
("Change view", ""),
|
||||
("Big tiles", ""),
|
||||
("Small tiles", ""),
|
||||
("List", ""),
|
||||
("Virtual display", ""),
|
||||
("Plug out all", ""),
|
||||
("True color (4:4:4)", ""),
|
||||
("Enable blocking user input", ""),
|
||||
("id_input_tip", "Можете да въведете ID, директен IP адрес или домейн с порт (<domain>:<port>).\nАко искате да получите достъп до устройство на друг сървър, моля, добавете адреса на сървъра (<id>@<server_address >?key=<key_value>), например\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nАко искате да получите достъп до устройство на обществен сървър, моля, въведете \"<id>@public\" , ключът не е необходим за публичен сървър"),
|
||||
("privacy_mode_impl_mag_tip", "Режим 1"),
|
||||
("privacy_mode_impl_virtual_display_tip", "Режим 2"),
|
||||
("Enter privacy mode", ""),
|
||||
("Exit privacy mode", ""),
|
||||
("idd_not_support_under_win10_2004_tip", "Индиректен драйвер за дисплей не се поддържа. Изисква се Windows 10, версия 2004 или по-нова."),
|
||||
("switch_display_elevated_connections_tip", "Превключването към неосновен дисплей не се поддържа в режим на потребител с повишени права, когато има множество връзки. Моля, опитайте отново след инсталация, ако искате да контролирате няколко дисплея."),
|
||||
("input_source_1_tip", "Входен източник 1"),
|
||||
("input_source_2_tip", "Входен източник 2"),
|
||||
("capture_display_elevated_connections_tip", "Заснемането на множество дисплеи не се поддържа в потребителския режим с повишени права. Моля, опитайте отново след инсталация, ако искате да контролирате няколко дисплея."),
|
||||
("Swap control-command key", ""),
|
||||
("swap-left-right-mouse", "Разменете левия и десния бутон на мишката"),
|
||||
("2FA code", "Код за Двуфакторна удостоверяване"),
|
||||
("More", ""),
|
||||
("enable-2fa-title", "Активиране на двуфакторно удостоверяване"),
|
||||
("enable-2fa-desc", "Моля, настройте вашия удостоверител сега. Можете да използвате приложение за удостоверяване като Authy, Microsoft или Google Authenticator на вашия телефон или настолен компютър.\n\nСканирайте QR кода с вашето приложение и въведете кода, който приложението ви показва, за да активирате двуфакторно удостоверяване."),
|
||||
("wrong-2fa-code", "е може да се потвърди кодът. Проверете дали настройките за код и локалното време са правилни"),
|
||||
("enter-2fa-title", "Двуфакторно удостоверяване"),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", "双重认证"),
|
||||
("Email verification code must be 6 characters.", "Email 验证码必须是 6 个字符。"),
|
||||
("2FA code must be 6 digits.", "双重认证代码必须是 6 位数字。"),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", "发现多个 Windows 会话"),
|
||||
("Please select the session you want to connect to", "请选择您要连接的会话"),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", "Dvoufaktorová autentizace"),
|
||||
("Email verification code must be 6 characters.", "E-mailový ověřovací kód musí mít 6 znaků."),
|
||||
("2FA code must be 6 digits.", "Kód 2FA musí mít 6 číslic."),
|
||||
("Multiple active user sessions found", "Bylo nalezeno několik aktivních uživatelských relací"),
|
||||
("Please select the user you want to connect to", "Vyberte prosím uživatele, ke kterému se chcete připojit"),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", "Zwei-Faktor-Authentifizierung"),
|
||||
("Email verification code must be 6 characters.", "Der E-Mail-Verifizierungscode muss aus 6 Zeichen bestehen."),
|
||||
("2FA code must be 6 digits.", "Der 2FA-Code muss 6 Ziffern haben."),
|
||||
("Multiple active user sessions found", "Mehrere aktive Benutzersitzungen gefunden"),
|
||||
("Please select the user you want to connect to", "Bitte wählen Sie den Benutzer, mit dem Sie sich verbinden möchten"),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", "Autenticación en dos pasos"),
|
||||
("Email verification code must be 6 characters.", "El código de verificación por mail debe tener 6 caracteres"),
|
||||
("2FA code must be 6 digits.", "El cóidigo 2FA debe tener 6 dígitos"),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", "احراز هویت دو مرحله ای"),
|
||||
("Email verification code must be 6 characters.", "کد تأیید ایمیل باید 6 کاراکتر باشد"),
|
||||
("2FA code must be 6 digits.", "کد احراز هویت دو مرحله ای باید 6 رقم باشد"),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", "Autenticazione a due fattori"),
|
||||
("Email verification code must be 6 characters.", "Il codice di verifica email deve contenere 6 caratteri."),
|
||||
("2FA code must be 6 digits.", "Il codice 2FA deve essere composto da 6 cifre."),
|
||||
("Multiple active user sessions found", "Rilevate sessioni utente attive multiple"),
|
||||
("Please select the user you want to connect to", "Seleziona l'utente a cui connetterti"),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", "Divu faktoru autentifikācija"),
|
||||
("Email verification code must be 6 characters.", "E-pasta verifikācijas kodam jābūt ar 6 rakstzīmēm."),
|
||||
("2FA code must be 6 digits.", "2FA kodam ir jābūt ar 6 cipariem."),
|
||||
("Multiple active user sessions found", "Atrastas vairākas aktīvas lietotāju sesijas"),
|
||||
("Please select the user you want to connect to", "Lūdzu, atlasiet lietotāju, ar kuru vēlaties izveidot savienojumu"),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -292,6 +292,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Overwrite", "Overschrijven"),
|
||||
("This file exists, skip or overwrite this file?", "Dit bestand bestaat reeds, overslaan of overschrijven?"),
|
||||
("Quit", "Afsluiten"),
|
||||
("Help", ""),
|
||||
("Failed", "Mislukt"),
|
||||
("Succeeded", "Geslaagd"),
|
||||
("Someone turns on privacy mode, exit", "Iemand schakelt privacymodus in, afsluiten"),
|
||||
@ -585,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", "geef-2fa-titel in"),
|
||||
("Email verification code must be 6 characters.", "E-mailverificatiecode moet 6 tekens lang zijn."),
|
||||
("2FA code must be 6 digits.", "2FA-code moet 6 cijfers lang zijn."),
|
||||
("Multiple active user sessions found", "Meerdere actieve gebruikerssessies gevonden"),
|
||||
("Please select the user you want to connect to", "Selecteer de gebruiker waarmee je verbinding wilt maken"),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", "Autoryzacja dwuskładnikowa"),
|
||||
("Email verification code must be 6 characters.", "Kod weryfikacyjny wysłany e-mailem musi mieć 6 znaków."),
|
||||
("2FA code must be 6 digits.", "Kod 2FA musi zawierać 6 cyfr."),
|
||||
("Multiple active user sessions found", "Znaleziono wiele aktywnych sesji użytkownika"),
|
||||
("Please select the user you want to connect to", "Wybierz użytkownika, z którym chcesz się połączyć"),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", "Двухфакторная аутентификация"),
|
||||
("Email verification code must be 6 characters.", "Код подтверждения электронной почты должен состоять из 6 символов."),
|
||||
("2FA code must be 6 digits.", "Код двухфакторной аутентификации должен состоять из 6 цифр."),
|
||||
("Multiple active user sessions found", "Обнаружено несколько активных пользовательских сеансов"),
|
||||
("Please select the user you want to connect to", "Выберите пользователя, к которому хотите подключиться"),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", "Dvojfaktorové overenie"),
|
||||
("Email verification code must be 6 characters.", "Overovací kód e-mailu musí mať 6 znakov."),
|
||||
("2FA code must be 6 digits.", "Kód 2FA musí obsahovať 6 číslic."),
|
||||
("Multiple active user sessions found", "Našlo sa viacero aktívnych používateľských relácií"),
|
||||
("Please select the user you want to connect to", "Vyberte používateľa ku ktorému sa chcete pripojiť"),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", "二步驟驗證"),
|
||||
("Email verification code must be 6 characters.", "Email 驗證碼必須是 6 個字元。"),
|
||||
("2FA code must be 6 digits.", "二步驟驗證碼必須是 6 位數字。"),
|
||||
("Multiple active user sessions found", "發現多個使用者工作階段"),
|
||||
("Please select the user you want to connect to", "請選擇您想要連接的使用者"),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("enter-2fa-title", ""),
|
||||
("Email verification code must be 6 characters.", ""),
|
||||
("2FA code must be 6 digits.", ""),
|
||||
("Multiple active user sessions found", ""),
|
||||
("Please select the user you want to connect to", ""),
|
||||
("Multiple Windows sessions found", ""),
|
||||
("Please select the session you want to connect to", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -746,6 +746,10 @@ pub fn get_current_process_session_id() -> Option<u32> {
|
||||
}
|
||||
|
||||
pub fn get_active_username() -> String {
|
||||
// get_active_user will give console username higher priority
|
||||
if let Some(name) = get_current_session_username() {
|
||||
return name;
|
||||
}
|
||||
if !is_root() {
|
||||
return crate::username();
|
||||
}
|
||||
@ -767,6 +771,14 @@ pub fn get_active_username() -> String {
|
||||
.to_owned()
|
||||
}
|
||||
|
||||
fn get_current_session_username() -> Option<String> {
|
||||
let Some(sid) = get_current_process_session_id() else {
|
||||
log::error!("get_current_process_session_id failed");
|
||||
return None;
|
||||
};
|
||||
Some(get_session_username(sid))
|
||||
}
|
||||
|
||||
fn get_session_username(session_id: u32) -> String {
|
||||
extern "C" {
|
||||
fn get_session_user_info(path: *mut u16, n: u32, rdp: bool, session_id: u32) -> u32;
|
||||
@ -799,22 +811,24 @@ pub fn get_available_sessions(name: bool) -> Vec<WindowsSession> {
|
||||
};
|
||||
let mut v: Vec<WindowsSession> = vec![];
|
||||
// https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-wtsgetactiveconsolesessionid
|
||||
let physical_console_session_id = unsafe { get_current_session(FALSE) };
|
||||
let physical_console_username = get_session_username(physical_console_session_id);
|
||||
let physical_console_name = if name {
|
||||
if physical_console_username.is_empty() {
|
||||
"Console".to_owned()
|
||||
let physical_console_sid = unsafe { get_current_session(FALSE) };
|
||||
if physical_console_sid != u32::MAX {
|
||||
let physical_console_name = if name {
|
||||
let physical_console_username = get_session_username(physical_console_sid);
|
||||
if physical_console_username.is_empty() {
|
||||
"Console".to_owned()
|
||||
} else {
|
||||
format!("Console:{physical_console_username}")
|
||||
}
|
||||
} else {
|
||||
format!("Console:{physical_console_username}")
|
||||
}
|
||||
} else {
|
||||
"".to_owned()
|
||||
};
|
||||
v.push(WindowsSession {
|
||||
sid: physical_console_session_id,
|
||||
name: physical_console_name,
|
||||
..Default::default()
|
||||
});
|
||||
"".to_owned()
|
||||
};
|
||||
v.push(WindowsSession {
|
||||
sid: physical_console_sid,
|
||||
name: physical_console_name,
|
||||
..Default::default()
|
||||
});
|
||||
}
|
||||
// https://learn.microsoft.com/en-us/previous-versions//cc722458(v=technet.10)?redirectedfrom=MSDN
|
||||
for type_session_id in station_session_id_array.split(",") {
|
||||
let split: Vec<_> = type_session_id.split(":").collect();
|
||||
@ -867,11 +881,9 @@ pub fn get_active_user_home() -> Option<PathBuf> {
|
||||
}
|
||||
|
||||
pub fn is_prelogin() -> bool {
|
||||
let Some(sid) = get_current_process_session_id() else {
|
||||
log::error!("get_current_process_session_id failed");
|
||||
let Some(username) = get_current_session_username() else {
|
||||
return false;
|
||||
};
|
||||
let username = get_session_username(sid);
|
||||
username.is_empty() || username == "SYSTEM"
|
||||
}
|
||||
|
||||
@ -2565,6 +2577,9 @@ impl WallPaperRemover {
|
||||
// https://superuser.com/questions/1218413/write-to-current-users-registry-through-a-different-admin-account
|
||||
let (hkcu, sid) = if is_root() {
|
||||
let username = get_active_username();
|
||||
if username.is_empty() {
|
||||
bail!("failed to get username");
|
||||
}
|
||||
let sid = get_sid_of_user(&username)?;
|
||||
log::info!("username: {username}, sid: {sid}");
|
||||
(RegKey::predef(HKEY_USERS), format!("{}\\", sid))
|
||||
|
@ -237,8 +237,8 @@ pub struct Connection {
|
||||
file_remove_log_control: FileRemoveLogControl,
|
||||
#[cfg(feature = "gpucodec")]
|
||||
supported_encoding_flag: (bool, Option<bool>),
|
||||
need_sub_remote_service: bool,
|
||||
remote_service_subed: bool,
|
||||
services_subed: bool,
|
||||
delayed_read_dir: Option<(String, bool)>,
|
||||
}
|
||||
|
||||
impl ConnInner {
|
||||
@ -386,8 +386,8 @@ impl Connection {
|
||||
file_remove_log_control: FileRemoveLogControl::new(id),
|
||||
#[cfg(feature = "gpucodec")]
|
||||
supported_encoding_flag: (false, None),
|
||||
need_sub_remote_service: false,
|
||||
remote_service_subed: false,
|
||||
services_subed: false,
|
||||
delayed_read_dir: None,
|
||||
};
|
||||
let addr = hbb_common::try_into_v4(addr);
|
||||
if !conn.on_open(addr).await {
|
||||
@ -1194,9 +1194,9 @@ impl Connection {
|
||||
.into();
|
||||
|
||||
let mut sub_service = false;
|
||||
let mut delay_sub_service = false;
|
||||
let mut wait_session_id_confirm = false;
|
||||
#[cfg(windows)]
|
||||
self.handle_windows_specific_session(&mut pi, &mut delay_sub_service);
|
||||
self.handle_windows_specific_session(&mut pi, &mut wait_session_id_confirm);
|
||||
if self.file_transfer.is_some() {
|
||||
res.set_peer_info(pi);
|
||||
} else {
|
||||
@ -1256,18 +1256,22 @@ impl Connection {
|
||||
} else {
|
||||
""
|
||||
};
|
||||
self.read_dir(dir, show_hidden);
|
||||
if !wait_session_id_confirm {
|
||||
self.read_dir(dir, show_hidden);
|
||||
} else {
|
||||
self.delayed_read_dir = Some((dir.to_owned(), show_hidden));
|
||||
}
|
||||
} else if sub_service {
|
||||
self.need_sub_remote_service = true;
|
||||
if !delay_sub_service {
|
||||
self.check_sub_remote_services();
|
||||
if !wait_session_id_confirm {
|
||||
self.try_sub_services();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn check_sub_remote_services(&mut self) {
|
||||
if self.need_sub_remote_service && !self.remote_service_subed {
|
||||
self.remote_service_subed = true;
|
||||
fn try_sub_services(&mut self) {
|
||||
let is_remote = self.file_transfer.is_none() && self.port_forward_socket.is_none();
|
||||
if is_remote && !self.services_subed {
|
||||
self.services_subed = true;
|
||||
if let Some(s) = self.server.upgrade() {
|
||||
let mut noperms = Vec::new();
|
||||
if !self.peer_keyboard_enabled() && !self.show_remote_cursor {
|
||||
@ -1293,7 +1297,11 @@ impl Connection {
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
fn handle_windows_specific_session(&mut self, pi: &mut PeerInfo, delay_sub_service: &mut bool) {
|
||||
fn handle_windows_specific_session(
|
||||
&mut self,
|
||||
pi: &mut PeerInfo,
|
||||
wait_session_id_confirm: &mut bool,
|
||||
) {
|
||||
let sessions = crate::platform::get_available_sessions(true);
|
||||
let current_sid = crate::platform::get_current_process_session_id().unwrap_or_default();
|
||||
if crate::platform::is_installed()
|
||||
@ -1301,7 +1309,8 @@ impl Connection {
|
||||
&& raii::AuthedConnID::remote_and_file_conn_count() == 1
|
||||
&& sessions.len() > 1
|
||||
&& current_sid != 0
|
||||
&& self.lr.option.support_windows_specific_session == BoolOption::Yes.into()
|
||||
&& (get_version_number(&self.lr.version) > get_version_number("1.2.4")
|
||||
|| self.lr.option.support_windows_specific_session == BoolOption::Yes.into())
|
||||
{
|
||||
pi.windows_sessions = Some(WindowsSessions {
|
||||
sessions,
|
||||
@ -1309,7 +1318,7 @@ impl Connection {
|
||||
..Default::default()
|
||||
})
|
||||
.into();
|
||||
*delay_sub_service = true;
|
||||
*wait_session_id_confirm = true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1976,6 +1985,12 @@ impl Connection {
|
||||
}
|
||||
Some(message::Union::FileAction(fa)) => {
|
||||
if self.file_transfer.is_some() {
|
||||
if self.delayed_read_dir.is_some() {
|
||||
if let Some(file_action::Union::ReadDir(rd)) = fa.union {
|
||||
self.delayed_read_dir = Some((rd.path, rd.include_hidden));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
match fa.union {
|
||||
Some(file_action::Union::ReadDir(rd)) => {
|
||||
self.read_dir(&rd.path, rd.include_hidden);
|
||||
@ -2284,7 +2299,13 @@ impl Connection {
|
||||
});
|
||||
return false;
|
||||
}
|
||||
self.check_sub_remote_services();
|
||||
if self.file_transfer.is_some() {
|
||||
if let Some((dir, show_hidden)) = self.delayed_read_dir.take() {
|
||||
self.read_dir(&dir, show_hidden);
|
||||
}
|
||||
} else {
|
||||
self.try_sub_services();
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
},
|
||||
|
@ -460,7 +460,7 @@ function awake() {
|
||||
|
||||
class MultipleSessionComponent extends Reactor.Component {
|
||||
this var sessions = [];
|
||||
this var messageText = translate("Please select the user you want to connect to");
|
||||
this var messageText = translate("Please select the session you want to connect to");
|
||||
|
||||
function this(params) {
|
||||
if (params && params.sessions) {
|
||||
|
@ -530,7 +530,7 @@ handler.updateDisplays = function(v) {
|
||||
handler.setMultipleWindowsSession = function(sessions) {
|
||||
// It will be covered by other message box if the timer is not used,
|
||||
self.timer(1000ms, function() {
|
||||
msgbox("multiple-sessions-nocancel", translate("Multiple active user sessions found"), <MultipleSessionComponent sessions={sessions} />, "", function(res) {
|
||||
msgbox("multiple-sessions-nocancel", translate("Multiple Windows sessions found"), <MultipleSessionComponent sessions={sessions} />, "", function(res) {
|
||||
if (res && res.sid) {
|
||||
handler.set_selected_windows_session_id("" + res.sid);
|
||||
}
|
||||
|
@ -1023,6 +1023,7 @@ impl<T: InvokeUiSession> Session<T> {
|
||||
if true == force_relay {
|
||||
self.lc.write().unwrap().force_relay = true;
|
||||
}
|
||||
self.lc.write().unwrap().peer_info = None;
|
||||
let mut lock = self.thread.lock().unwrap();
|
||||
// No need to join the previous thread, because it will exit automatically.
|
||||
// And the previous thread will not change important states.
|
||||
@ -1260,6 +1261,25 @@ impl<T: InvokeUiSession> Session<T> {
|
||||
let mut msg = Message::new();
|
||||
msg.set_misc(misc);
|
||||
self.send(Data::Message(msg));
|
||||
let pi = self.lc.read().unwrap().peer_info.clone();
|
||||
if let Some(pi) = pi {
|
||||
if pi.windows_sessions.current_sid == sid {
|
||||
if self.is_file_transfer() {
|
||||
if pi.username.is_empty() {
|
||||
self.on_error(
|
||||
"No active console user logged on, please connect and logon first.",
|
||||
);
|
||||
}
|
||||
} else {
|
||||
self.msgbox(
|
||||
"success",
|
||||
"Successful",
|
||||
"Connected, waiting for image...",
|
||||
"",
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log::error!("selected invalid sid: {}", sid);
|
||||
}
|
||||
@ -1371,7 +1391,7 @@ impl<T: InvokeUiSession> Interface for Session<T> {
|
||||
|
||||
fn handle_peer_info(&self, mut pi: PeerInfo) {
|
||||
log::debug!("handle_peer_info :{:?}", pi);
|
||||
pi.username = self.lc.read().unwrap().get_username(&pi);
|
||||
self.lc.write().unwrap().peer_info = Some(pi.clone());
|
||||
if pi.current_display as usize >= pi.displays.len() {
|
||||
pi.current_display = 0;
|
||||
}
|
||||
@ -1379,7 +1399,7 @@ impl<T: InvokeUiSession> Interface for Session<T> {
|
||||
self.set_permission("restart", false);
|
||||
}
|
||||
if self.is_file_transfer() {
|
||||
if pi.username.is_empty() {
|
||||
if pi.username.is_empty() && pi.windows_sessions.sessions.is_empty() {
|
||||
self.on_error("No active console user logged on, please connect and logon first.");
|
||||
return;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user