From 83dbf88ffbee285be425b08b377ac7f192a77195 Mon Sep 17 00:00:00 2001
From: fufesou <shuanglongchen@yeah.ne>
Date: Mon, 20 Nov 2023 21:44:25 +0800
Subject: [PATCH 1/5] feat, win10, virtual display, not support message

Signed-off-by: fufesou <shuanglongchen@yeah.ne>
---
 libs/hbb_common/src/platform/windows.rs      | 49 +++++++++++++++++++-
 src/core_main.rs                             |  4 +-
 src/lang/ar.rs                               |  1 +
 src/lang/ca.rs                               |  1 +
 src/lang/cn.rs                               |  1 +
 src/lang/cs.rs                               |  1 +
 src/lang/da.rs                               |  1 +
 src/lang/de.rs                               |  1 +
 src/lang/el.rs                               |  1 +
 src/lang/en.rs                               |  1 +
 src/lang/eo.rs                               |  1 +
 src/lang/es.rs                               |  1 +
 src/lang/fa.rs                               |  1 +
 src/lang/fr.rs                               |  1 +
 src/lang/hu.rs                               |  1 +
 src/lang/id.rs                               |  1 +
 src/lang/it.rs                               |  1 +
 src/lang/ja.rs                               |  1 +
 src/lang/ko.rs                               |  1 +
 src/lang/kz.rs                               |  1 +
 src/lang/lt.rs                               |  1 +
 src/lang/lv.rs                               |  1 +
 src/lang/nb.rs                               | 11 +++--
 src/lang/nl.rs                               |  1 +
 src/lang/pl.rs                               |  1 +
 src/lang/pt_PT.rs                            |  1 +
 src/lang/ptbr.rs                             |  1 +
 src/lang/ro.rs                               |  1 +
 src/lang/ru.rs                               |  1 +
 src/lang/sk.rs                               |  1 +
 src/lang/sl.rs                               |  1 +
 src/lang/sq.rs                               |  1 +
 src/lang/sr.rs                               |  1 +
 src/lang/sv.rs                               |  1 +
 src/lang/template.rs                         |  1 +
 src/lang/th.rs                               |  1 +
 src/lang/tr.rs                               |  1 +
 src/lang/tw.rs                               |  1 +
 src/lang/ua.rs                               |  1 +
 src/lang/vn.rs                               |  1 +
 src/platform/windows.cc                      | 39 ----------------
 src/platform/windows.rs                      | 26 -----------
 src/privacy_mode/win_exclude_from_capture.rs |  4 +-
 src/privacy_mode/win_virtual_display.rs      |  4 ++
 src/server/connection.rs                     | 21 +++++----
 src/server/display_service.rs                |  5 +-
 src/virtual_display_manager.rs               | 17 +++++++
 47 files changed, 134 insertions(+), 83 deletions(-)

diff --git a/libs/hbb_common/src/platform/windows.rs b/libs/hbb_common/src/platform/windows.rs
index 26cd907ab..ae3e33839 100644
--- a/libs/hbb_common/src/platform/windows.rs
+++ b/libs/hbb_common/src/platform/windows.rs
@@ -5,7 +5,7 @@ use std::{
     time::Instant,
 };
 use winapi::{
-    shared::minwindef::{DWORD, FALSE},
+    shared::minwindef::{DWORD, FALSE, TRUE},
     um::{
         handleapi::CloseHandle,
         pdh::{
@@ -14,7 +14,12 @@ use winapi::{
             PDH_HCOUNTER, PDH_HQUERY,
         },
         synchapi::{CreateEventA, WaitForSingleObject},
-        winbase::{INFINITE, WAIT_OBJECT_0},
+        sysinfoapi::VerSetConditionMask,
+        winbase::{VerifyVersionInfoW, INFINITE, WAIT_OBJECT_0},
+        winnt::{
+            OSVERSIONINFOEXW, VER_BUILDNUMBER, VER_GREATER_EQUAL, VER_MAJORVERSION,
+            VER_MINORVERSION, VER_SERVICEPACKMAJOR, VER_SERVICEPACKMINOR,
+        },
     },
 };
 
@@ -152,3 +157,43 @@ pub fn sync_cpu_usage(cpu_usage: Option<f64>) {
     *CPU_USAGE_ONE_MINUTE.lock().unwrap() = v;
     log::info!("cpu usage synced: {:?}", cpu_usage);
 }
+
+// https://learn.microsoft.com/en-us/windows/win32/sysinfo/targeting-your-application-at-windows-8-1
+// https://github.com/nodejs/node-convergence-archive/blob/e11fe0c2777561827cdb7207d46b0917ef3c42a7/deps/uv/src/win/util.c#L780
+pub fn is_windows_version_or_greater(
+    os_major: u32,
+    os_minor: u32,
+    build_number: u32,
+    service_pack_major: u32,
+    service_pack_minor: u32,
+) -> bool {
+    let mut osvi: OSVERSIONINFOEXW = unsafe { std::mem::zeroed() };
+    osvi.dwOSVersionInfoSize = std::mem::size_of::<OSVERSIONINFOEXW>() as DWORD;
+    osvi.dwMajorVersion = os_major as _;
+    osvi.dwMinorVersion = os_minor as _;
+    osvi.dwBuildNumber = build_number as _;
+    osvi.wServicePackMajor = service_pack_major as _;
+    osvi.wServicePackMinor = service_pack_minor as _;
+
+    let result = unsafe {
+        let mut condition_mask = 0;
+        let op = VER_GREATER_EQUAL;
+        condition_mask = VerSetConditionMask(condition_mask, VER_MAJORVERSION, op);
+        condition_mask = VerSetConditionMask(condition_mask, VER_MINORVERSION, op);
+        condition_mask = VerSetConditionMask(condition_mask, VER_BUILDNUMBER, op);
+        condition_mask = VerSetConditionMask(condition_mask, VER_SERVICEPACKMAJOR, op);
+        condition_mask = VerSetConditionMask(condition_mask, VER_SERVICEPACKMINOR, op);
+
+        VerifyVersionInfoW(
+            &mut osvi as *mut OSVERSIONINFOEXW,
+            VER_MAJORVERSION
+                | VER_MINORVERSION
+                | VER_BUILDNUMBER
+                | VER_SERVICEPACKMAJOR
+                | VER_SERVICEPACKMINOR,
+            condition_mask,
+        )
+    };
+
+    result == TRUE
+}
diff --git a/src/core_main.rs b/src/core_main.rs
index dc439f344..4529df6ab 100644
--- a/src/core_main.rs
+++ b/src/core_main.rs
@@ -204,7 +204,9 @@ pub fn core_main() -> Option<Vec<String>> {
                 #[cfg(windows)]
                 hbb_common::allow_err!(crate::platform::windows::install_cert(&args[1]));
                 #[cfg(all(windows, feature = "virtual_display_driver"))]
-                hbb_common::allow_err!(crate::virtual_display_manager::install_update_driver());
+                if crate::virtual_display_manager::is_virtual_display_supported() {
+                    hbb_common::allow_err!(crate::virtual_display_manager::install_update_driver());
+                }
                 return None;
             } else if args[0] == "--uninstall-cert" {
                 #[cfg(windows)]
diff --git a/src/lang/ar.rs b/src/lang/ar.rs
index 95f0a8a04..b46a47a46 100644
--- a/src/lang/ar.rs
+++ b/src/lang/ar.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/ca.rs b/src/lang/ca.rs
index 37ac295aa..36061dcfe 100644
--- a/src/lang/ca.rs
+++ b/src/lang/ca.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/cn.rs b/src/lang/cn.rs
index be59faecb..a3b85908f 100644
--- a/src/lang/cn.rs
+++ b/src/lang/cn.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "模式 2"),
         ("Enter privacy mode", "进入隐私模式"),
         ("Exit privacy mode", "退出隐私模式"),
+        ("idd_not_support_tip", "不支持 Indirect Display Driver 。需要更新的 Windows 10 版本。"),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/cs.rs b/src/lang/cs.rs
index 993f136f4..12b16d79c 100644
--- a/src/lang/cs.rs
+++ b/src/lang/cs.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/da.rs b/src/lang/da.rs
index 7cbe8d99d..8a6387ce3 100644
--- a/src/lang/da.rs
+++ b/src/lang/da.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/de.rs b/src/lang/de.rs
index 9017a744a..ed134f778 100644
--- a/src/lang/de.rs
+++ b/src/lang/de.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/el.rs b/src/lang/el.rs
index 46577ce90..76aab3198 100644
--- a/src/lang/el.rs
+++ b/src/lang/el.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/en.rs b/src/lang/en.rs
index a5f494b74..30e58e875 100644
--- a/src/lang/en.rs
+++ b/src/lang/en.rs
@@ -205,5 +205,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("id_input_tip", "You can input an ID, a direct IP, or a domain with a port (<domain>:<port>).\nIf you want to access a device on another server, please append the server address (<id>@<server_address>?key=<key_value>), for example,\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nIf you want to access a device on a public server, please input \"<id>@public\", the key is not needed for public server"),
         ("privacy_mode_impl_mag_tip", "Mode 1"),
         ("privacy_mode_impl_virtual_display_tip", "Mode 2"),
+        ("idd_not_support_tip", "Indirect Display Driver is not supported. Newer Windows 10 version is required."),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/eo.rs b/src/lang/eo.rs
index 35230ccb1..45ac4b033 100644
--- a/src/lang/eo.rs
+++ b/src/lang/eo.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/es.rs b/src/lang/es.rs
index a2dcd53ba..8125323ef 100644
--- a/src/lang/es.rs
+++ b/src/lang/es.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "Modo 2"),
         ("Enter privacy mode", "Entrar al modo privado"),
         ("Exit privacy mode", "Salir del modo privado"),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/fa.rs b/src/lang/fa.rs
index 0d8c8e356..fcedaaedf 100644
--- a/src/lang/fa.rs
+++ b/src/lang/fa.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/fr.rs b/src/lang/fr.rs
index 7f840558e..2f9d811ac 100644
--- a/src/lang/fr.rs
+++ b/src/lang/fr.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/hu.rs b/src/lang/hu.rs
index 298a07d6e..a8afd1dfa 100644
--- a/src/lang/hu.rs
+++ b/src/lang/hu.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/id.rs b/src/lang/id.rs
index 3455ddab4..419967ff6 100644
--- a/src/lang/id.rs
+++ b/src/lang/id.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "Mode 2"),
         ("Enter privacy mode", "Masuk mode privasi"),
         ("Exit privacy mode", "Keluar mode privasi"),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/it.rs b/src/lang/it.rs
index 70fbe1c4e..9c2b769b9 100644
--- a/src/lang/it.rs
+++ b/src/lang/it.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "Modo 2"),
         ("Enter privacy mode", "Entra in modalità privacy"),
         ("Exit privacy mode", "Esci dalla modalità privacy"),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/ja.rs b/src/lang/ja.rs
index a5c0dff2f..25706fda5 100644
--- a/src/lang/ja.rs
+++ b/src/lang/ja.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/ko.rs b/src/lang/ko.rs
index 26a666d53..c7f25fb72 100644
--- a/src/lang/ko.rs
+++ b/src/lang/ko.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "모드 2"),
         ("Enter privacy mode", "개인정보 보호 모드 사용"),
         ("Exit privacy mode", "개인정보 보호 모드 종료"),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/kz.rs b/src/lang/kz.rs
index 5d9ec3f3a..c8d46e5dc 100644
--- a/src/lang/kz.rs
+++ b/src/lang/kz.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/lt.rs b/src/lang/lt.rs
index 69b210311..33da68196 100644
--- a/src/lang/lt.rs
+++ b/src/lang/lt.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/lv.rs b/src/lang/lv.rs
index 100d701fb..6ed5daf82 100644
--- a/src/lang/lv.rs
+++ b/src/lang/lv.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "2. režīms"),
         ("Enter privacy mode", "Ieiet privātuma režīmā"),
         ("Exit privacy mode", "Iziet no privātuma režīma"),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/nb.rs b/src/lang/nb.rs
index d36499d7f..09b31a9e0 100644
--- a/src/lang/nb.rs
+++ b/src/lang/nb.rs
@@ -154,15 +154,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("config_screen", "For å kunne få adgang til ditt skrivebord med fjernstyring, må du gi Rustdesk \"skjerstøtte \" tillatelser."),
         ("Installing ...", "Installerer ..."),
         ("Install", "installer"),
-        ("installasjon", "Installasjon"),
-        ("installasjon Path", "Installasjonssti"),
+        ("Installation", ""),
+        ("Installation Path", ""),
         ("Create start menu shortcuts", "Oppret start meny snarvei"),
         ("Create desktop icon", "Oppret skrivebords-snarvei"),
         ("agreement_tip", "Hvis du starter installasjonen, må du akseptere lisensavtalen"),
         ("Accept and Install", "Aksepter og installer"),
         ("End-user license agreement", "Lisensavtale for sluttbrukere"),
         ("Generating ...", "Genererer kode ..."),
-        ("Your installasjon is lower version.", "Din installasjon er en eldre versjon."),
+        ("Your installation is lower version.", ""),
         ("not_close_tcp_tip", "Ikke lukk dette vinduet, mens du bruker tunnelen."),
         ("Listening ...", "Lytter ..."),
         ("Remote Host", "Fjern-Host"),
@@ -532,8 +532,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("Change Color", ""),
         ("Primary Color", ""),
         ("HSV Color", ""),
-        ("installasjon Successful!", ""),
-        ("installasjon failed!", ""),
+        ("Installation Successful!", ""),
+        ("Installation failed!", ""),
         ("Reverse mouse wheel", ""),
         ("{} sessions", ""),
         ("scam_title", ""),
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/nl.rs b/src/lang/nl.rs
index 280f5e9a0..260937b00 100644
--- a/src/lang/nl.rs
+++ b/src/lang/nl.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/pl.rs b/src/lang/pl.rs
index aa91e8e9a..c63133cc6 100644
--- a/src/lang/pl.rs
+++ b/src/lang/pl.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "Tryb 2"),
         ("Enter privacy mode", "Wejdź w tryb prywatności"),
         ("Exit privacy mode", "Wyjdź z trybu prywatności"),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs
index 8ca5a0b84..f2a7c7253 100644
--- a/src/lang/pt_PT.rs
+++ b/src/lang/pt_PT.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs
index 708784c20..541b28eda 100644
--- a/src/lang/ptbr.rs
+++ b/src/lang/ptbr.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/ro.rs b/src/lang/ro.rs
index c1eac74f8..85374e87d 100644
--- a/src/lang/ro.rs
+++ b/src/lang/ro.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/ru.rs b/src/lang/ru.rs
index abca158c9..5e4271080 100644
--- a/src/lang/ru.rs
+++ b/src/lang/ru.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "Режим 2"),
         ("Enter privacy mode", "Включить режим конфиденциальности"),
         ("Exit privacy mode", "Отключить режим конфиденциальности"),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/sk.rs b/src/lang/sk.rs
index 072b532e6..7867da466 100644
--- a/src/lang/sk.rs
+++ b/src/lang/sk.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/sl.rs b/src/lang/sl.rs
index 382b8a89d..f9dd56308 100755
--- a/src/lang/sl.rs
+++ b/src/lang/sl.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/sq.rs b/src/lang/sq.rs
index c47a154ca..0f9a4f05d 100644
--- a/src/lang/sq.rs
+++ b/src/lang/sq.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/sr.rs b/src/lang/sr.rs
index 832e81283..e7ca84c05 100644
--- a/src/lang/sr.rs
+++ b/src/lang/sr.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/sv.rs b/src/lang/sv.rs
index b2e42a291..1e9eb0b1b 100644
--- a/src/lang/sv.rs
+++ b/src/lang/sv.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/template.rs b/src/lang/template.rs
index 027baebad..16735d180 100644
--- a/src/lang/template.rs
+++ b/src/lang/template.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/th.rs b/src/lang/th.rs
index b81b77b0a..796bde955 100644
--- a/src/lang/th.rs
+++ b/src/lang/th.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/tr.rs b/src/lang/tr.rs
index 3fc58963a..ffd3c862d 100644
--- a/src/lang/tr.rs
+++ b/src/lang/tr.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/tw.rs b/src/lang/tw.rs
index 4ea5bc250..a8a413a70 100644
--- a/src/lang/tw.rs
+++ b/src/lang/tw.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/ua.rs b/src/lang/ua.rs
index b0b193f94..449aec697 100644
--- a/src/lang/ua.rs
+++ b/src/lang/ua.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "Режим 2"),
         ("Enter privacy mode", "Увійти в режим конфіденційності"),
         ("Exit privacy mode", "Вийти з режиму конфіденційності"),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/vn.rs b/src/lang/vn.rs
index 89b6a189f..727e73241 100644
--- a/src/lang/vn.rs
+++ b/src/lang/vn.rs
@@ -572,5 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
+        ("idd_not_support_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/platform/windows.cc b/src/platform/windows.cc
index 25372b218..8e2f73fbe 100644
--- a/src/platform/windows.cc
+++ b/src/platform/windows.cc
@@ -634,42 +634,3 @@ extern "C"
         freopen("CONOUT$", "w", stdout);
     }
 } // end of extern "C"
-
-extern "C"
-{
-    // https://learn.microsoft.com/en-us/windows/win32/sysinfo/targeting-your-application-at-windows-8-1
-    // https://github.com/nodejs/node-convergence-archive/blob/e11fe0c2777561827cdb7207d46b0917ef3c42a7/deps/uv/src/win/util.c#L780
-    BOOL IsWindowsVersionOrGreater(DWORD os_major,
-                                   DWORD os_minor,
-                                   DWORD build_number,
-                                   WORD service_pack_major,
-                                   WORD service_pack_minor)
-    {
-        OSVERSIONINFOEX osvi;
-        DWORDLONG condition_mask = 0;
-        int op = VER_GREATER_EQUAL;
-
-        /* Initialize the OSVERSIONINFOEX structure. */
-        ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
-        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
-        osvi.dwMajorVersion = os_major;
-        osvi.dwMinorVersion = os_minor;
-        osvi.dwBuildNumber = build_number;
-        osvi.wServicePackMajor = service_pack_major;
-        osvi.wServicePackMinor = service_pack_minor;
-
-        /* Initialize the condition mask. */
-        VER_SET_CONDITION(condition_mask, VER_MAJORVERSION, op);
-        VER_SET_CONDITION(condition_mask, VER_MINORVERSION, op);
-        VER_SET_CONDITION(condition_mask, VER_BUILDNUMBER, op);
-        VER_SET_CONDITION(condition_mask, VER_SERVICEPACKMAJOR, op);
-        VER_SET_CONDITION(condition_mask, VER_SERVICEPACKMINOR, op);
-
-        /* Perform the test. */
-        return VerifyVersionInfo(
-            &osvi,
-            VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER |
-                VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
-            condition_mask);
-    }
-}
diff --git a/src/platform/windows.rs b/src/platform/windows.rs
index 3a726c2a1..42e071468 100644
--- a/src/platform/windows.rs
+++ b/src/platform/windows.rs
@@ -460,13 +460,6 @@ extern "C" {
     fn is_win_down() -> BOOL;
     fn is_local_system() -> BOOL;
     fn alloc_console_and_redirect();
-    fn IsWindowsVersionOrGreater(
-        os_major: DWORD,
-        os_minor: DWORD,
-        build_number: DWORD,
-        service_pack_major: WORD,
-        service_pack_minor: WORD,
-    ) -> BOOL;
 }
 
 extern "system" {
@@ -1255,25 +1248,6 @@ pub fn block_input(v: bool) -> (bool, String) {
     }
 }
 
-#[inline]
-pub fn is_windows_version_or_greater(
-    os_major: u32,
-    os_minor: u32,
-    build_number: u32,
-    service_pack_major: u32,
-    service_pack_minor: u32,
-) -> bool {
-    unsafe {
-        IsWindowsVersionOrGreater(
-            os_major as _,
-            os_minor as _,
-            build_number as _,
-            service_pack_major as _,
-            service_pack_minor as _,
-        ) == TRUE
-    }
-}
-
 pub fn add_recent_document(path: &str) {
     extern "C" {
         fn AddRecentDocument(path: *const u16);
diff --git a/src/privacy_mode/win_exclude_from_capture.rs b/src/privacy_mode/win_exclude_from_capture.rs
index 0bb81f693..63164f838 100644
--- a/src/privacy_mode/win_exclude_from_capture.rs
+++ b/src/privacy_mode/win_exclude_from_capture.rs
@@ -1,3 +1,5 @@
+use hbb_common::platform::windows::is_windows_version_or_greater;
+
 pub use super::win_topmost_window::PrivacyModeImpl;
 
 pub(super) const PRIVACY_MODE_IMPL: &str = "privacy_mode_impl_exclude_from_capture";
@@ -5,5 +7,5 @@ pub(super) const PRIVACY_MODE_IMPL: &str = "privacy_mode_impl_exclude_from_captu
 pub(super) fn is_supported() -> bool {
     // https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowdisplayaffinity
     // https://en.wikipedia.org/wiki/Windows_10_version_history
-    crate::platform::windows::is_windows_version_or_greater(10, 0, 19041, 0, 0)
+    is_windows_version_or_greater(10, 0, 19041, 0, 0)
 }
diff --git a/src/privacy_mode/win_virtual_display.rs b/src/privacy_mode/win_virtual_display.rs
index 372479b5d..30ae6aaa2 100644
--- a/src/privacy_mode/win_virtual_display.rs
+++ b/src/privacy_mode/win_virtual_display.rs
@@ -357,6 +357,10 @@ impl PrivacyMode for PrivacyModeImpl {
     }
 
     fn turn_on_privacy(&mut self, conn_id: i32) -> ResultType<bool> {
+        if !virtual_display_manager::is_virtual_display_supported() {
+            bail!("idd_not_support_tip");
+        }
+
         if self.check_on_conn_id(conn_id)? {
             log::debug!("Privacy mode of conn {} is already on", conn_id);
             return Ok(true);
diff --git a/src/server/connection.rs b/src/server/connection.rs
index 464edfb37..8d16380a1 100644
--- a/src/server/connection.rs
+++ b/src/server/connection.rs
@@ -2371,14 +2371,19 @@ impl Connection {
         };
 
         if t.on {
-            if let Err(e) = virtual_display_manager::plug_in_index_modes(t.display as _, Vec::new())
-            {
-                log::error!("Failed to plug in virtual display: {}", e);
-                self.send(make_msg(format!(
-                    "Failed to plug in virtual display: {}",
-                    e
-                )))
-                .await;
+            if !virtual_display_manager::is_virtual_display_supported() {
+                self.send(make_msg("idd_not_support_tip".to_string())).await;
+            } else {
+                if let Err(e) =
+                    virtual_display_manager::plug_in_index_modes(t.display as _, Vec::new())
+                {
+                    log::error!("Failed to plug in virtual display: {}", e);
+                    self.send(make_msg(format!(
+                        "Failed to plug in virtual display: {}",
+                        e
+                    )))
+                    .await;
+                }
             }
         } else {
             let indices = if t.display == -1 {
diff --git a/src/server/display_service.rs b/src/server/display_service.rs
index 3ff9f4954..35d7ac07d 100644
--- a/src/server/display_service.rs
+++ b/src/server/display_service.rs
@@ -348,7 +348,10 @@ pub fn try_get_displays() -> ResultType<Vec<Display>> {
 #[cfg(all(windows, feature = "virtual_display_driver"))]
 pub fn try_get_displays() -> ResultType<Vec<Display>> {
     let mut displays = Display::all()?;
-    if crate::platform::is_installed() && no_displays(&displays) {
+    if crate::platform::is_installed()
+        && no_displays(&displays)
+        && virtual_display_manager::is_virtual_display_supported()
+    {
         log::debug!("no displays, create virtual display");
         if let Err(e) = virtual_display_manager::plug_in_headless() {
             log::error!("plug in headless failed {}", e);
diff --git a/src/virtual_display_manager.rs b/src/virtual_display_manager.rs
index c51b74baf..da8780c7f 100644
--- a/src/virtual_display_manager.rs
+++ b/src/virtual_display_manager.rs
@@ -1,3 +1,5 @@
+#[cfg(target_os = "windows")]
+use hbb_common::platform::windows::is_windows_version_or_greater;
 use hbb_common::{allow_err, bail, lazy_static, log, ResultType};
 use std::{
     collections::{HashMap, HashSet},
@@ -53,6 +55,17 @@ impl VirtualDisplayManager {
     }
 }
 
+pub fn is_virtual_display_supported() -> bool {
+    #[cfg(target_os = "windows")]
+    {
+        is_windows_version_or_greater(10, 0, 19041, 0, 0)
+    }
+    #[cfg(not(target_os = "windows"))]
+    {
+        false
+    }
+}
+
 pub fn install_update_driver() -> ResultType<()> {
     VIRTUAL_DISPLAY_MANAGER
         .lock()
@@ -146,6 +159,10 @@ pub fn plug_in_index_modes(
 }
 
 pub fn reset_all() -> ResultType<()> {
+    if is_virtual_display_supported() {
+        return Ok(());
+    }
+
     if let Err(e) = plug_out_peer_request(&get_virtual_displays()) {
         log::error!("Failed to plug out virtual displays: {}", e);
     }

From 0d127dff3b00174d7259cdd988091761de1cfbf0 Mon Sep 17 00:00:00 2001
From: fufesou <shuanglongchen@yeah.ne>
Date: Mon, 20 Nov 2023 21:55:09 +0800
Subject: [PATCH 2/5] translation

Signed-off-by: fufesou <shuanglongchen@yeah.ne>
---
 src/lang/nb.rs | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/lang/nb.rs b/src/lang/nb.rs
index 09b31a9e0..76e00931f 100644
--- a/src/lang/nb.rs
+++ b/src/lang/nb.rs
@@ -154,15 +154,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("config_screen", "For å kunne få adgang til ditt skrivebord med fjernstyring, må du gi Rustdesk \"skjerstøtte \" tillatelser."),
         ("Installing ...", "Installerer ..."),
         ("Install", "installer"),
-        ("Installation", ""),
-        ("Installation Path", ""),
+        ("Installation", "Installasjon"),
+        ("Installation Path", "Installasjonssti"),
         ("Create start menu shortcuts", "Oppret start meny snarvei"),
         ("Create desktop icon", "Oppret skrivebords-snarvei"),
         ("agreement_tip", "Hvis du starter installasjonen, må du akseptere lisensavtalen"),
         ("Accept and Install", "Aksepter og installer"),
         ("End-user license agreement", "Lisensavtale for sluttbrukere"),
         ("Generating ...", "Genererer kode ..."),
-        ("Your installation is lower version.", ""),
+        ("Your installation is lower version.", "Din installasjon er en eldre versjon."),
         ("not_close_tcp_tip", "Ikke lukk dette vinduet, mens du bruker tunnelen."),
         ("Listening ...", "Lytter ..."),
         ("Remote Host", "Fjern-Host"),

From 9abafafcdd9a1a53d8a2a678da8506a4ca6f3ae6 Mon Sep 17 00:00:00 2001
From: fufesou <shuanglongchen@yeah.ne>
Date: Mon, 20 Nov 2023 21:57:53 +0800
Subject: [PATCH 3/5] translation

Signed-off-by: fufesou <shuanglongchen@yeah.ne>
---
 src/lang/cn.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/cn.rs b/src/lang/cn.rs
index a3b85908f..3609a2fa5 100644
--- a/src/lang/cn.rs
+++ b/src/lang/cn.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "模式 2"),
         ("Enter privacy mode", "进入隐私模式"),
         ("Exit privacy mode", "退出隐私模式"),
-        ("idd_not_support_tip", "不支持 Indirect Display Driver 。需要更新的 Windows 10 版本。"),
+        ("idd_not_support_tip", "不支持 Indirect Display Driver 。需要较新的 Windows 10 版本。"),
     ].iter().cloned().collect();
 }

From 3100930136643e8e5b3d7deb77db1d770ed78dd2 Mon Sep 17 00:00:00 2001
From: fufesou <shuanglongchen@yeah.net>
Date: Tue, 21 Nov 2023 10:55:46 +0800
Subject: [PATCH 4/5] translation & Rustdesk to RustDesk

Signed-off-by: fufesou <shuanglongchen@yeah.net>
---
 .github/workflows/flutter-tag.yml     |  6 +++---
 docs/README-GR.md                     |  2 +-
 flutter/windows/runner/main.cpp       |  2 +-
 libs/virtual_display/dylib/src/lib.rs |  2 +-
 src/lang/cn.rs                        |  4 ++--
 src/lang/da.rs                        |  4 ++--
 src/lang/en.rs                        |  2 +-
 src/lang/nb.rs                        |  4 ++--
 src/lang/sq.rs                        |  2 +-
 src/lang/th.rs                        | 16 ++++++++--------
 src/lang/ua.rs                        |  8 ++++----
 11 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/.github/workflows/flutter-tag.yml b/.github/workflows/flutter-tag.yml
index f69f06acf..4c3303a4b 100644
--- a/.github/workflows/flutter-tag.yml
+++ b/.github/workflows/flutter-tag.yml
@@ -18,10 +18,10 @@ jobs:
       upload-tag: ${{ env.GITHUB_REF_NAME }}
 
   update-fdroid-version-file:
-    name: Publish Rustdesk version file for F-Droid updater
+    name: Publish RustDesk version file for F-Droid updater
     runs-on: ubuntu-latest
     steps:
-      - name: Generate Rustdesk version file
+      - name: Generate RustDesk version file
         run: |
           UPSTREAM_VERNAME="$GITHUB_REF_NAME"
           UPSTREAM_VERCODE="$(echo "$UPSTREAM_VERNAME" | tr -d '.')"
@@ -29,7 +29,7 @@ jobs:
           echo "versionCode=$UPSTREAM_VERCODE" >> rustdesk-version.txt
         shell: bash
 
-      - name: Publish Rustdesk version file
+      - name: Publish RustDesk version file
         uses: softprops/action-gh-release@v1
         with:
           prerelease: true
diff --git a/docs/README-GR.md b/docs/README-GR.md
index f324cfa95..b7571ce1d 100644
--- a/docs/README-GR.md
+++ b/docs/README-GR.md
@@ -161,7 +161,7 @@ target/debug/rustdesk
 target/release/rustdesk
 ```
 
-Βεβαιωθείτε ότι εκτελείτε αυτές τις εντολές από την αρχική διαδρομή του αποθετηρίου του Rustdesk, διαφορετικά η εφαρμογή ενδέχεται να μην είναι σε θέση να βρεί τους απαιτούμενους πόρους. Σημειώστε επίσης ότι άλλες υποεντολές, όπως το `install` ή το `run` δεν υποστηρίζονται επί του παρόντος μέσω αυτής της μεθόδου καθώς θα εγκαταστήσουν ή θα εκτελέσουν το πρόγραμμα εντός του container αντί του κεντρικού υπολογιστή.
+Βεβαιωθείτε ότι εκτελείτε αυτές τις εντολές από την αρχική διαδρομή του αποθετηρίου του RustDesk, διαφορετικά η εφαρμογή ενδέχεται να μην είναι σε θέση να βρεί τους απαιτούμενους πόρους. Σημειώστε επίσης ότι άλλες υποεντολές, όπως το `install` ή το `run` δεν υποστηρίζονται επί του παρόντος μέσω αυτής της μεθόδου καθώς θα εγκαταστήσουν ή θα εκτελέσουν το πρόγραμμα εντός του container αντί του κεντρικού υπολογιστή.
 
 ## Δομή φακέλων
 
diff --git a/flutter/windows/runner/main.cpp b/flutter/windows/runner/main.cpp
index 6f3afe1d9..34ffb817e 100644
--- a/flutter/windows/runner/main.cpp
+++ b/flutter/windows/runner/main.cpp
@@ -54,7 +54,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
     for (const auto& argument : command_line_arguments) {
       args_str += (argument + " ");
     }
-    // std::cout << "Rustdesk [" << args_str << "], core returns false, exiting without launching Flutter app." << std::endl;
+    // std::cout << "RustDesk [" << args_str << "], core returns false, exiting without launching Flutter app." << std::endl;
     return EXIT_SUCCESS;
   }
   std::vector<std::string> rust_args(c_args, c_args + args_len);
diff --git a/libs/virtual_display/dylib/src/lib.rs b/libs/virtual_display/dylib/src/lib.rs
index 573c51810..aec07ab48 100644
--- a/libs/virtual_display/dylib/src/lib.rs
+++ b/libs/virtual_display/dylib/src/lib.rs
@@ -12,7 +12,7 @@ use std::sync::Mutex;
 #[cfg(windows)]
 lazy_static::lazy_static! {
     // If device is uninstalled though "Device Manager" Window.
-    // Rustdesk is unable to handle device any more...
+    // RustDesk is unable to handle device any more...
     static ref H_SW_DEVICE: Mutex<u64> = Mutex::new(0);
 }
 
diff --git a/src/lang/cn.rs b/src/lang/cn.rs
index 3609a2fa5..357fa258b 100644
--- a/src/lang/cn.rs
+++ b/src/lang/cn.rs
@@ -537,7 +537,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("Reverse mouse wheel", "鼠标滚轮反向"),
         ("{} sessions", "{}个会话"),
         ("scam_title", "你可能被骗了!"),
-        ("scam_text1", "如果你正在和素不相识的人通话,而对方要求你使用 Rustdesk 启动服务,请勿继续操作并立刻挂断电话。"),
+        ("scam_text1", "如果你正在和素不相识的人通话,而对方要求你使用 RustDesk 启动服务,请勿继续操作并立刻挂断电话。"),
         ("scam_text2", "他们很可能是骗子,试图窃取您的钱财或其他个人信息。"),
         ("Don't show again", "下次不再显示"),
         ("I Agree", "同意"),
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "模式 2"),
         ("Enter privacy mode", "进入隐私模式"),
         ("Exit privacy mode", "退出隐私模式"),
-        ("idd_not_support_tip", "不支持 Indirect Display Driver 。需要较新的 Windows 10 版本。"),
+        ("idd_not_support_tip", "不支持 Indirect display driver 。需要 windows 10, version 2004 及更高的版本。"),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/da.rs b/src/lang/da.rs
index 8a6387ce3..5c75b83b5 100644
--- a/src/lang/da.rs
+++ b/src/lang/da.rs
@@ -150,8 +150,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("Click to download", "Klik for at downloade"),
         ("Click to update", "Klik for at opdatere"),
         ("Configure", "Konfigurer"),
-        ("config_acc", "For at kontrollere dit skrivebord på afstand skal du give Rustdesk \"Access \" Rettigheder."),
-        ("config_screen", "For at kunne få adgang til dit skrivebord langtfra, skal du give Rustdesk \"skærmstøtte \" tilladelser."),
+        ("config_acc", "For at kontrollere dit skrivebord på afstand skal du give RustDesk \"Access \" Rettigheder."),
+        ("config_screen", "For at kunne få adgang til dit skrivebord langtfra, skal du give RustDesk \"skærmstøtte \" tilladelser."),
         ("Installing ...", "Installerer ..."),
         ("Install", "installere"),
         ("Installation", "Installation"),
diff --git a/src/lang/en.rs b/src/lang/en.rs
index 30e58e875..d91cde505 100644
--- a/src/lang/en.rs
+++ b/src/lang/en.rs
@@ -205,6 +205,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("id_input_tip", "You can input an ID, a direct IP, or a domain with a port (<domain>:<port>).\nIf you want to access a device on another server, please append the server address (<id>@<server_address>?key=<key_value>), for example,\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nIf you want to access a device on a public server, please input \"<id>@public\", the key is not needed for public server"),
         ("privacy_mode_impl_mag_tip", "Mode 1"),
         ("privacy_mode_impl_virtual_display_tip", "Mode 2"),
-        ("idd_not_support_tip", "Indirect Display Driver is not supported. Newer Windows 10 version is required."),
+        ("idd_not_support_tip", "Indirect display driver is not supported. Windows 10, version 2004 or newer is required."),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/nb.rs b/src/lang/nb.rs
index 76e00931f..fbc313c19 100644
--- a/src/lang/nb.rs
+++ b/src/lang/nb.rs
@@ -150,8 +150,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("Click to download", "Klikk for å laste ned"),
         ("Click to update", "Klikk for å oppdatere"),
         ("Configure", "Konfigurer"),
-        ("config_acc", "For å kontrollere ditt skrivebord med fjernstyring må du gi Rustdesk \"Access \" Rettigheter."),
-        ("config_screen", "For å kunne få adgang til ditt skrivebord med fjernstyring, må du gi Rustdesk \"skjerstøtte \" tillatelser."),
+        ("config_acc", "For å kontrollere ditt skrivebord med fjernstyring må du gi RustDesk \"Access \" Rettigheter."),
+        ("config_screen", "For å kunne få adgang til ditt skrivebord med fjernstyring, må du gi RustDesk \"skjerstøtte \" tillatelser."),
         ("Installing ...", "Installerer ..."),
         ("Install", "installer"),
         ("Installation", "Installasjon"),
diff --git a/src/lang/sq.rs b/src/lang/sq.rs
index 0f9a4f05d..1851c1637 100644
--- a/src/lang/sq.rs
+++ b/src/lang/sq.rs
@@ -145,7 +145,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("Failed to make direct connection to remote desktop", "Lidhja direkte me desktopin në distancë dështoi"),
         ("Set Password", "Vendosni fjalëkalimin"),
         ("OS Password", "OS fjalëkalim"),
-        ("install_tip", "Për shkak të UAC, Rustdesk nuk mund të punoj sic duhet si nje remote në distancë në disa raste. Për të shamngur UAC, ju lutem klikoni butonin më poshtë për të instaluar RustDesk në sistem."),
+        ("install_tip", "Për shkak të UAC, RustDesk nuk mund të punoj sic duhet si nje remote në distancë në disa raste. Për të shamngur UAC, ju lutem klikoni butonin më poshtë për të instaluar RustDesk në sistem."),
         ("Click to upgrade", "Klikoni për përmirësim"),
         ("Click to download", "Klikoni për tu shkarkuar"),
         ("Click to update", "Klikoni për përditësim"),
diff --git a/src/lang/th.rs b/src/lang/th.rs
index 796bde955..fcc30e458 100644
--- a/src/lang/th.rs
+++ b/src/lang/th.rs
@@ -411,15 +411,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("Select local keyboard type", "เลือกประเภทคีย์บอร์ด"),
         ("software_render_tip", "ถ้าคุณใช้กราฟิกการ์ดกับระบบ Linux และหน้าต่างของเครื่องปลายทางปิดในทันทีหลังจากการเชื่อมต่อ การเปลี่ยนไปใช้ไดรเวอร์ Nouveau และเลือกใช้โหมดการเรนเดอร์แบบซอฟท์แวร์อาจช่วยได้ (ต้องรีสตาร์ทโปรแกรม)"),
         ("Always use software rendering", "ใช้การเรนเดอร์แบบซอฟท์แวร์เสมอ"),
-        ("config_input", "เพื่อที่จะควบคุมเครื่องเดสก์ท็อปปลายทางด้วยคีย์บอร์ด คุณจำเป็นจะต้องอนุญาตสิทธิ์ \"การตรวจสอบ Input\" ให้แก่ Rustdesk"),
-        ("config_microphone", "เพื่อที่จะส่งเสียงพูดไปยังปลายทาง คุณจำเป็นจะต้องอนุญาตสิทธิ์ \"การบันทึกเสียง\" ให้แก่ Rustdesk"),
+        ("config_input", "เพื่อที่จะควบคุมเครื่องเดสก์ท็อปปลายทางด้วยคีย์บอร์ด คุณจำเป็นจะต้องอนุญาตสิทธิ์ \"การตรวจสอบ Input\" ให้แก่ RustDesk"),
+        ("config_microphone", "เพื่อที่จะส่งเสียงพูดไปยังปลายทาง คุณจำเป็นจะต้องอนุญาตสิทธิ์ \"การบันทึกเสียง\" ให้แก่ RustDesk"),
         ("request_elevation_tip", "คุณสามารถขอยกระดับสิทธิ์การใช้งานได้ หากมีผู้ใช้งานอยู่ในฝั่งเครื่องปลายทาง"),
         ("Wait", "รอ"),
         ("Elevation Error", "การยกระดับสิทธิ์การใช้งานผิดพลาด"),
         ("Ask the remote user for authentication", "ขอความช่วยเหลือผู้ใช้งานปลายทางเพื่อพิสูจน์ตัวตน"),
         ("Choose this if the remote account is administrator", "เลือกข้อนี้ถ้าบัญชีผู้ใช้งานปลายทางเป็นผู้ดูแลระบบ"),
         ("Transmit the username and password of administrator", "ส่งข้อมูลผู้ใช้งานและรหัสผ่านของผู้ดูแลระบบ"),
-        ("still_click_uac_tip", "ผู้ใช้งานปลายทางยังจำเป็นที่จะต้องกดปุ่ม ตกลง บนหน้าต่าง UAC ของ Rustdesk"),
+        ("still_click_uac_tip", "ผู้ใช้งานปลายทางยังจำเป็นที่จะต้องกดปุ่ม ตกลง บนหน้าต่าง UAC ของ RustDesk"),
         ("Request Elevation", "ขอยกระดับสิทธิ์การใช้งาน"),
         ("wait_accept_uac_tip", "กรุณารอผู้ใช้งานปลายทางกดยินยอมหน้าต่าง UAC"),
         ("Elevate successfully", "การยกระดับสิทธิ์การใช้งานสำเร็จ"),
@@ -451,8 +451,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("Resolution", "ความละเอียด"),
         ("No transfers in progress", "ไม่มีการถ่ายโอนในขณะนี้"),
         ("Set one-time password length", "ตั้งค่าความยาวรหัสผ่านครั้งเดียว"),
-        ("install_cert_tip", "ติดตั้งใบรับรองของ Rustdesk"),
-        ("confirm_install_cert_tip", "นี่คือใบรับของทดสอบของ Rustdesk ซึ่งสามารถเชื่อถือได้ ใบรับรองนี้จะถูกใช้ในการติดตั้ง Driver ของ Rustdesk เมื่อจำเป็น"),
+        ("install_cert_tip", "ติดตั้งใบรับรองของ RustDesk"),
+        ("confirm_install_cert_tip", "นี่คือใบรับของทดสอบของ RustDesk ซึ่งสามารถเชื่อถือได้ ใบรับรองนี้จะถูกใช้ในการติดตั้ง Driver ของ RustDesk เมื่อจำเป็น"),
         ("RDP Settings", "การตั้งค่า RDP"),
         ("Sort by", "เรียงลำดับโดย"),
         ("New Connection", "การเชื่อมต่อใหม่"),
@@ -472,7 +472,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("show_monitors_tip", "แสดงหน้าจอในแถบเครื่องมือ"),
         ("View Mode", "โหมดการดู"),
         ("login_linux_tip", "คุณจำเป็นจะต้องเข้าสู่ระบบไปยังบัญชีลินุกซ์ปลายทางเพื่อใช้งานเดสก์ท็อปเซสชัน X"),
-        ("verify_rustdesk_password_tip", "ยืนยันความถูกต้องรหัสผ่านของ Rustdesk"),
+        ("verify_rustdesk_password_tip", "ยืนยันความถูกต้องรหัสผ่านของ RustDesk"),
         ("remember_account_tip", "จดจำบัญชีนี้"),
         ("os_account_desk_tip", "บัญชีนี้จะถูกใช้ในการเข้าสู่ระบบเครื่องปลายทางและเริ่มใช้งานเดสก์ท็อปเซสชันแบบ headless"),
         ("OS Account", "บัญชีระบบปฏิบัติการ"),
@@ -537,7 +537,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("Reverse mouse wheel", "เลื่อมลูกกลิ้งเมาส์แบบกลับด้าน"),
         ("{} sessions", "{} เซสชัน"),
         ("scam_title", "คุณอาจกำลังถูกหลอกลวง!"),
-        ("scam_text1", "ถ้าคุณกำลังคุยโทรศัพท์กับคนที่คุณไม่รู้จักและไม่ไว้ใจ และคนๆนั้นกำลังขอให้คุณเปิดใช้งาน Rustdesk อย่าทำตามและรีบวางสายในทันที"),
+        ("scam_text1", "ถ้าคุณกำลังคุยโทรศัพท์กับคนที่คุณไม่รู้จักและไม่ไว้ใจ และคนๆนั้นกำลังขอให้คุณเปิดใช้งาน RustDesk อย่าทำตามและรีบวางสายในทันที"),
         ("scam_text2", "เขาเหล่านั้นอาจเป็นมิจฉาชีพที่กำลังพยายามจะขโมยเงินและข้อมูลส่วนตัวของคุณ"),
         ("Don't show again", "อย่าแสดงอีก"),
         ("I Agree", "ยอมรับ"),
@@ -546,7 +546,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("auto_disconnect_option_tip", "ยกเลิกการเชื่อมต่ออัตโนมัติในกรณีที่ผู้ใช้งานไม่มีการเคลื่อนไหว"),
         ("Connection failed due to inactivity", "การเชื่อมต่อล้มเหลวเนื่องจากไม่มีการเคลื่อนไหว"),
         ("Check for software update on startup", "ตรวจสอบการอัปเดตโปรแกรมเมื่อเริ่มต้นใช้งาน"),
-        ("upgrade_rustdesk_server_pro_to_{}_tip", "กรุณาอัปเดต Rustdesk Server Pro ไปยังเวอร์ชัน {} หรือใหม่กว่า!"),
+        ("upgrade_rustdesk_server_pro_to_{}_tip", "กรุณาอัปเดต RustDesk Server Pro ไปยังเวอร์ชัน {} หรือใหม่กว่า!"),
         ("pull_group_failed_tip", "การเรียกใช้งานกลุ่มล้มเหลว"),
         ("Filter by intersection", ""),
         ("Remove wallpaper during incoming sessions", ""),
diff --git a/src/lang/ua.rs b/src/lang/ua.rs
index 449aec697..578f820f8 100644
--- a/src/lang/ua.rs
+++ b/src/lang/ua.rs
@@ -411,7 +411,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("Select local keyboard type", "Оберіть тип локальної клавіатури"),
         ("software_render_tip", "Якщо ви використовуєте відеокарту Nvidia на Linux, і віддалене вікно закривається відразу після підключення, то перехід на вільний драйвер Nouveau та увімкнення програмного рендерингу може допомогти. Для застосування змін необхідно перезапустити програму."),
         ("Always use software rendering", "Завжди використовувати програмний рендеринг"),
-        ("config_input", "Для віддаленого керування віддаленою стільницею з клавіатури, вам необхідно надати Rustdesk дозволи на \"Відстеження введення\""),
+        ("config_input", "Для віддаленого керування віддаленою стільницею з клавіатури, вам необхідно надати RustDesk дозволи на \"Відстеження введення\""),
         ("config_microphone", "Для можливості віддаленої розмови, вам необхідно надати RustDesk дозвіл на \"Запис аудіо\""),
         ("request_elevation_tip", "Ви також можете надіслати запит на розширення прав, в разі присутності особи з віддаленого боку."),
         ("Wait", "Зачекайте"),
@@ -451,8 +451,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("Resolution", "Роздільна здатність"),
         ("No transfers in progress", "Наразі нічого не пересилається"),
         ("Set one-time password length", "Вказати довжину одноразового пароля"),
-        ("install_cert_tip", "Додати сертифікат Rustdesk"),
-        ("confirm_install_cert_tip", "Це сертифікат тестування Rustdesk, якому можна довіряти. За потреби сертифікат буде використано для погодження та встановлення драйверів Rustdesk."),
+        ("install_cert_tip", "Додати сертифікат RustDesk"),
+        ("confirm_install_cert_tip", "Це сертифікат тестування RustDesk, якому можна довіряти. За потреби сертифікат буде використано для погодження та встановлення драйверів RustDesk."),
         ("RDP Settings", "Налаштування RDP"),
         ("Sort by", "Сортувати за"),
         ("New Connection", "Нове підключення"),
@@ -472,7 +472,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("show_monitors_tip", "Показувати монітори на панелі інструментів"),
         ("View Mode", "Режим перегляду"),
         ("login_linux_tip", "Вам необхідно залогуватися у віддалений акаунт Linux, щоб увімкнути стільничний сеанс X"),
-        ("verify_rustdesk_password_tip", "Перевірте пароль Rustdesk"),
+        ("verify_rustdesk_password_tip", "Перевірте пароль RustDesk"),
         ("remember_account_tip", "Запамʼятати цей акаунт"),
         ("os_account_desk_tip", "Цей акаунт використовується для входу до віддаленої ОС та вмикання сеансу стільниці в неграфічному режимі"),
         ("OS Account", "Користувач ОС"),

From f41a8bc355fa3214c9420e007fba2c939df8f193 Mon Sep 17 00:00:00 2001
From: fufesou <shuanglongchen@yeah.net>
Date: Tue, 21 Nov 2023 11:04:58 +0800
Subject: [PATCH 5/5] idd_not_support_tip to
 idd_not_support_under_win10_2004_tip

Signed-off-by: fufesou <shuanglongchen@yeah.net>
---
 src/lang/ar.rs                          | 2 +-
 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/en.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                          | 2 +-
 src/lang/lv.rs                          | 2 +-
 src/lang/nb.rs                          | 2 +-
 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 +-
 src/privacy_mode/win_virtual_display.rs | 2 +-
 src/server/connection.rs                | 2 +-
 40 files changed, 40 insertions(+), 40 deletions(-)

diff --git a/src/lang/ar.rs b/src/lang/ar.rs
index b46a47a46..bdab9e466 100644
--- a/src/lang/ar.rs
+++ b/src/lang/ar.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/ca.rs b/src/lang/ca.rs
index 36061dcfe..36aba208c 100644
--- a/src/lang/ca.rs
+++ b/src/lang/ca.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/cn.rs b/src/lang/cn.rs
index 357fa258b..86a01bd6b 100644
--- a/src/lang/cn.rs
+++ b/src/lang/cn.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "模式 2"),
         ("Enter privacy mode", "进入隐私模式"),
         ("Exit privacy mode", "退出隐私模式"),
-        ("idd_not_support_tip", "不支持 Indirect display driver 。需要 windows 10, version 2004 及更高的版本。"),
+        ("idd_not_support_under_win10_2004_tip", "不支持 Indirect display driver 。需要 windows 10, version 2004 及更高的版本。"),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/cs.rs b/src/lang/cs.rs
index 12b16d79c..cfddb981e 100644
--- a/src/lang/cs.rs
+++ b/src/lang/cs.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/da.rs b/src/lang/da.rs
index 5c75b83b5..ed926f0df 100644
--- a/src/lang/da.rs
+++ b/src/lang/da.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/de.rs b/src/lang/de.rs
index ed134f778..c8e5e411e 100644
--- a/src/lang/de.rs
+++ b/src/lang/de.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/el.rs b/src/lang/el.rs
index 76aab3198..8bb3a3d79 100644
--- a/src/lang/el.rs
+++ b/src/lang/el.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/en.rs b/src/lang/en.rs
index d91cde505..101bc63a3 100644
--- a/src/lang/en.rs
+++ b/src/lang/en.rs
@@ -205,6 +205,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("id_input_tip", "You can input an ID, a direct IP, or a domain with a port (<domain>:<port>).\nIf you want to access a device on another server, please append the server address (<id>@<server_address>?key=<key_value>), for example,\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nIf you want to access a device on a public server, please input \"<id>@public\", the key is not needed for public server"),
         ("privacy_mode_impl_mag_tip", "Mode 1"),
         ("privacy_mode_impl_virtual_display_tip", "Mode 2"),
-        ("idd_not_support_tip", "Indirect display driver is not supported. Windows 10, version 2004 or newer is required."),
+        ("idd_not_support_under_win10_2004_tip", "Indirect display driver is not supported. Windows 10, version 2004 or newer is required."),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/eo.rs b/src/lang/eo.rs
index 45ac4b033..73eb77aa5 100644
--- a/src/lang/eo.rs
+++ b/src/lang/eo.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/es.rs b/src/lang/es.rs
index 8125323ef..40a23f317 100644
--- a/src/lang/es.rs
+++ b/src/lang/es.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "Modo 2"),
         ("Enter privacy mode", "Entrar al modo privado"),
         ("Exit privacy mode", "Salir del modo privado"),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/fa.rs b/src/lang/fa.rs
index fcedaaedf..af0b8e944 100644
--- a/src/lang/fa.rs
+++ b/src/lang/fa.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/fr.rs b/src/lang/fr.rs
index 2f9d811ac..b753ac9e8 100644
--- a/src/lang/fr.rs
+++ b/src/lang/fr.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/hu.rs b/src/lang/hu.rs
index a8afd1dfa..f179da1df 100644
--- a/src/lang/hu.rs
+++ b/src/lang/hu.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/id.rs b/src/lang/id.rs
index 419967ff6..9bc40994f 100644
--- a/src/lang/id.rs
+++ b/src/lang/id.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "Mode 2"),
         ("Enter privacy mode", "Masuk mode privasi"),
         ("Exit privacy mode", "Keluar mode privasi"),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/it.rs b/src/lang/it.rs
index 9c2b769b9..5af0ace51 100644
--- a/src/lang/it.rs
+++ b/src/lang/it.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "Modo 2"),
         ("Enter privacy mode", "Entra in modalità privacy"),
         ("Exit privacy mode", "Esci dalla modalità privacy"),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/ja.rs b/src/lang/ja.rs
index 25706fda5..0ff52484c 100644
--- a/src/lang/ja.rs
+++ b/src/lang/ja.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/ko.rs b/src/lang/ko.rs
index c7f25fb72..38a3ef78a 100644
--- a/src/lang/ko.rs
+++ b/src/lang/ko.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "모드 2"),
         ("Enter privacy mode", "개인정보 보호 모드 사용"),
         ("Exit privacy mode", "개인정보 보호 모드 종료"),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/kz.rs b/src/lang/kz.rs
index c8d46e5dc..7a552e96a 100644
--- a/src/lang/kz.rs
+++ b/src/lang/kz.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/lt.rs b/src/lang/lt.rs
index 33da68196..b4990d9c6 100644
--- a/src/lang/lt.rs
+++ b/src/lang/lt.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/lv.rs b/src/lang/lv.rs
index 6ed5daf82..c5f763d29 100644
--- a/src/lang/lv.rs
+++ b/src/lang/lv.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "2. režīms"),
         ("Enter privacy mode", "Ieiet privātuma režīmā"),
         ("Exit privacy mode", "Iziet no privātuma režīma"),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/nb.rs b/src/lang/nb.rs
index fbc313c19..4f8945721 100644
--- a/src/lang/nb.rs
+++ b/src/lang/nb.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/nl.rs b/src/lang/nl.rs
index 260937b00..7b66fb3f3 100644
--- a/src/lang/nl.rs
+++ b/src/lang/nl.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/pl.rs b/src/lang/pl.rs
index c63133cc6..3aa80786e 100644
--- a/src/lang/pl.rs
+++ b/src/lang/pl.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "Tryb 2"),
         ("Enter privacy mode", "Wejdź w tryb prywatności"),
         ("Exit privacy mode", "Wyjdź z trybu prywatności"),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs
index f2a7c7253..6b89eaa8c 100644
--- a/src/lang/pt_PT.rs
+++ b/src/lang/pt_PT.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs
index 541b28eda..c5c4f2768 100644
--- a/src/lang/ptbr.rs
+++ b/src/lang/ptbr.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/ro.rs b/src/lang/ro.rs
index 85374e87d..5e806e426 100644
--- a/src/lang/ro.rs
+++ b/src/lang/ro.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/ru.rs b/src/lang/ru.rs
index 5e4271080..63b52ca55 100644
--- a/src/lang/ru.rs
+++ b/src/lang/ru.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "Режим 2"),
         ("Enter privacy mode", "Включить режим конфиденциальности"),
         ("Exit privacy mode", "Отключить режим конфиденциальности"),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/sk.rs b/src/lang/sk.rs
index 7867da466..eb09b1bb3 100644
--- a/src/lang/sk.rs
+++ b/src/lang/sk.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/sl.rs b/src/lang/sl.rs
index f9dd56308..be9774be8 100755
--- a/src/lang/sl.rs
+++ b/src/lang/sl.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/sq.rs b/src/lang/sq.rs
index 1851c1637..ff8851b94 100644
--- a/src/lang/sq.rs
+++ b/src/lang/sq.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/sr.rs b/src/lang/sr.rs
index e7ca84c05..ae4c4e364 100644
--- a/src/lang/sr.rs
+++ b/src/lang/sr.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/sv.rs b/src/lang/sv.rs
index 1e9eb0b1b..cfefe48a1 100644
--- a/src/lang/sv.rs
+++ b/src/lang/sv.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/template.rs b/src/lang/template.rs
index 16735d180..e3f8f6f38 100644
--- a/src/lang/template.rs
+++ b/src/lang/template.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/th.rs b/src/lang/th.rs
index fcc30e458..ea3a72af2 100644
--- a/src/lang/th.rs
+++ b/src/lang/th.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/tr.rs b/src/lang/tr.rs
index ffd3c862d..e14be47db 100644
--- a/src/lang/tr.rs
+++ b/src/lang/tr.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/tw.rs b/src/lang/tw.rs
index a8a413a70..57b7d7b9f 100644
--- a/src/lang/tw.rs
+++ b/src/lang/tw.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/ua.rs b/src/lang/ua.rs
index 578f820f8..6fa172311 100644
--- a/src/lang/ua.rs
+++ b/src/lang/ua.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", "Режим 2"),
         ("Enter privacy mode", "Увійти в режим конфіденційності"),
         ("Exit privacy mode", "Вийти з режиму конфіденційності"),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/lang/vn.rs b/src/lang/vn.rs
index 727e73241..84b0bf752 100644
--- a/src/lang/vn.rs
+++ b/src/lang/vn.rs
@@ -572,6 +572,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
         ("privacy_mode_impl_virtual_display_tip", ""),
         ("Enter privacy mode", ""),
         ("Exit privacy mode", ""),
-        ("idd_not_support_tip", ""),
+        ("idd_not_support_under_win10_2004_tip", ""),
     ].iter().cloned().collect();
 }
diff --git a/src/privacy_mode/win_virtual_display.rs b/src/privacy_mode/win_virtual_display.rs
index 30ae6aaa2..287bfd51e 100644
--- a/src/privacy_mode/win_virtual_display.rs
+++ b/src/privacy_mode/win_virtual_display.rs
@@ -358,7 +358,7 @@ impl PrivacyMode for PrivacyModeImpl {
 
     fn turn_on_privacy(&mut self, conn_id: i32) -> ResultType<bool> {
         if !virtual_display_manager::is_virtual_display_supported() {
-            bail!("idd_not_support_tip");
+            bail!("idd_not_support_under_win10_2004_tip");
         }
 
         if self.check_on_conn_id(conn_id)? {
diff --git a/src/server/connection.rs b/src/server/connection.rs
index 8d16380a1..72a757f74 100644
--- a/src/server/connection.rs
+++ b/src/server/connection.rs
@@ -2372,7 +2372,7 @@ impl Connection {
 
         if t.on {
             if !virtual_display_manager::is_virtual_display_supported() {
-                self.send(make_msg("idd_not_support_tip".to_string())).await;
+                self.send(make_msg("idd_not_support_under_win10_2004_tip".to_string())).await;
             } else {
                 if let Err(e) =
                     virtual_display_manager::plug_in_index_modes(t.display as _, Vec::new())