Merge branch 'master' into master

This commit is contained in:
RustDesk 2025-05-23 17:12:48 +08:00 committed by GitHub
commit 9deed37097
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
85 changed files with 504 additions and 265 deletions

View File

@ -13,7 +13,7 @@
> The developers of RustDesk do not condone or support any unethical or illegal use of this software. Misuse, such as unauthorized access, control or invasion of privacy, is strictly against our guidelines. The authors are not responsible for any misuse of the application.
Chat with us: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Chat with us: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b> لغتك الأم, <a href="https://github.com/rustdesk/doc.rustdesk.com">Doc</a> و <a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang">RustDesk UI</a>, README نحن بحاجة إلى مساعدتك لترجمة هذا </b>
</p>
[Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) :تواصل معنا عبر
[Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) :تواصل معنا عبر
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)
@ -27,6 +27,7 @@
[**BINARY تنزيل**](https://github.com/rustdesk/rustdesk/releases)
## التبعيات
لواجهة المستخدم الرسومية [sciter](https://sciter.com/) نسخة سطح المكتب تستخدم

View File

@ -9,7 +9,7 @@
<b>Potřebujeme Vaši pomoc s překladem tohoto README, <a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang">uživatelského rozhraní aplikace RustDesk</a> a <a href="https://github.com/rustdesk/doc.rustdesk.com">dokumentace k ní</a> do vašeho jazyka</b>
</p>
Popovídejte si s námi: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Popovídejte si s námi: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b>Vi har brug for din hjælp til at oversætte denne README, <a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang">RustDesk UI</a> og <a href=" https://github.com/rustdesk/doc.rustdesk.com">Dokument</a> til dit modersmål</b>
</p>
Chat med os: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Chat med os: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -14,7 +14,7 @@
> Die Entwickler von RustDesk billigen oder unterstützen keine unethische oder illegale Nutzung dieser Software. Missbrauch, wie unbefugter Zugriff, unbefugte Kontrolle oder Verletzung der Privatsphäre, verstößt strikt gegen unsere Richtlinien. Die Autoren sind nicht verantwortlich für jeglichen Missbrauch der Anwendung.
Reden Sie mit uns auf: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Reden Sie mit uns auf: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b>Ni bezonas helpon traduki tiun README kaj <a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang">la interfacon</a> al via denaska lingvo</b>
</p>
Babili kun ni: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Babili kun ni: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -13,7 +13,7 @@
> **Descargo de responsabilidad por mal uso:** <br>
> Los desarrolladores de RustDesk no aprueban ni apoyan ningún uso no ético o ilegal de este software. El mal uso, como el acceso no autorizado, el control o la invasión de la privacidad, va estrictamente en contra de nuestras directrices. Los autores no se hacen responsables de ningún uso indebido de la aplicación.
Chatea con nosotros: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Chatea con nosotros: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<p align="center" dir="auto">[<a href="../README.md">English</a>] | [<a href="README-UA.md">Українська</a>] | [<a href="README-CS.md">česky</a>] | [<a href="README-ZH.md">中文</a>] | [<a href="README-HU.md">Magyar</a>] | [<a href="README-ES.md">Español</a>] | [<a href="README-FR.md">Français</a>] | [<a href="README-DE.md">Deutsch</a>] | [<a href="README-PL.md">Polski</a>] | [<a href="README-ID.md">Indonesian</a>] | [<a href="README-FI.md">Suomi</a>] | [<a href="README-ML.md">മലയാളം</a>] | [<a href="README-JP.md">日本語</a>] | [<a href="README-NL.md">Nederlands</a>] | [<a href="README-IT.md">Italiano</a>] | [<a href="README-RU.md">Русский</a>] | [<a href="README-PTBR.md">Português (Brasil)</a>] | [<a href="README-EO.md">Esperanto</a>] | [<a href="README-KR.md">한국어</a>] | [<a href="README-AR.md">العربي</a>] | [<a href="README-VN.md">Tiếng Việt</a>] | [<a href="README-GR.md">Ελληνικά</a>]</p>
<p dir="rtl" align="center"><b>برای ترجمه این سند (README)، <a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang" dir="rtl">رابط کاربری RustDesk</a>، <a href="https://github.com/rustdesk/doc.rustdesk.com" dir="rtl">و مستندات آن</a> به زبان مادری شما به کمکتان نیازمندیم. </b></p>
با ما گفتگو کنید: [Reddit](https://www.reddit.com/r/rustdesk) | [Twitter](https://twitter.com/rustdesk) | [Discord](https://discord.gg/nDceKgxnkV)
با ما گفتگو کنید: [Reddit](https://www.reddit.com/r/rustdesk) | [Twitter](https://twitter.com/rustdesk) | [Discord](https://discord.gg/nDceKgxnkV) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b>Tarvitsemme apua tämän README-tiedoston kääntämiseksi äidinkielellesi</b>
</p>
Juttele meidän kanssa: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Juttele meidän kanssa: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b>Nous avons besoin de votre aide pour traduire ce README dans votre langue maternelle</b>.
</p>
Chattez avec nous : [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Chattez avec nous : [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b>Χρειαζόμαστε τη βοήθειά σας για να μεταφράσουμε αυτό το αρχείο README, το <a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang">RustDesk UI</a> και το <a href="https://github.com/rustdesk/doc.rustdesk.com">Doc</a> στη μητρική σας γλώσσα</b>
</p>
Επικοινωνήστε μαζί μας μέσω: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Επικοινωνήστε μαζί μας μέσω: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b>Kell a segítséged, hogy lefordítsuk ezt a README-t, <a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang">a RustDesk UI-t</a> és a <a href="https://github.com/rustdesk/doc.rustdesk.com">Dokumentációt</a> az anyanyelvedre</b>
</p>
Beszélgess velünk: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Beszélgess velünk: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b>Kami membutuhkan bantuanmu untuk menterjemahkan file README dan <a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang">RustDesk UI</a> ke Bahasa Indonesia</b>
</p>
Mari mengobrol bersama kami: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Mari mengobrol bersama kami: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b>Abbiamo bisogno del tuo aiuto per tradurre questo file README e la <a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang">UI RustDesk</a> nella tua lingua nativa</b>
</p>
Chatta con noi su: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Chatta con noi su: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b>READMEや<a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang">RustDesk UI</a><a href="https://github.com/rustdesk/doc.rustdesk.com">RustDesk Doc</a>の翻訳者を歓迎します!</b>
</p>
私たちと話す: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
私たちと話す: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b>README를 모국어로 번역하기 위한 당신의 도움의 필요합니다.</b>
</p>
채팅하기: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
채팅하기: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b>ഈ README നിങ്ങളുടെ മാതൃഭാഷയിലേക്ക് വിവർത്തനം ചെയ്യാൻ ഞങ്ങൾക്ക് നിങ്ങളുടെ സഹായം ആവശ്യമാണ്</b>
</p>
ഞങ്ങളുമായി ചാറ്റ് ചെയ്യുക: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
ഞങ്ങളുമായി ചാറ്റ് ചെയ്യുക: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b>Wij hebben uw hulp nodig om dit README bestand te vertalen, <a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang">RustDesk UI</a> en <a href="https://github.com/rustdesk/doc.rustdesk.com">Doc</a> naar uw moedertaal</b>
</p>
Chat met ons: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Chat met ons: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b>Vi trenger din hjelp til å oversette denne README-en, <a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang">RustDesk UI</a> og <a href="https://github.com/rustdesk/doc.rustdesk.com">RustDesk Doc</a> tid ditt morsmål</b>
</p>
Snakk med oss: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Snakk med oss: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b>Potrzebujemy twojej pomocy w tłumaczeniu README na twój ojczysty język</b>
</p>
Porozmawiaj z nami na: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Porozmawiaj z nami na: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b>Precisamos de sua ajuda para traduzir este README e a <a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang">UI do RustDesk</a> para sua língua nativa</b>
</p>
Converse conosco: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Converse conosco: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -10,7 +10,7 @@
и документацию RustDesk на ваш родной язык. <a href="https://github.com/rustdesk/doc.rustdesk.com">RustDesk Doc</a></b>
</p>
Общение с нами: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Общение с нами: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -10,7 +10,7 @@
<b>README, <a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang">RustDesk UI</a> ve <a href="https://github.com/rustdesk/doc.rustdesk.com">RustDesk Belge</a>'sini ana dilinize çevirmemiz için yardımınıza ihtiyacımız var</b>
</p>
Bizimle sohbet edin: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Bizimle sohbet edin: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -9,7 +9,7 @@
<b>Нам потрібна ваша допомога для перекладу цього README, <a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang">інтерфейсу</a> та <a href="https://github.com/rustdesk/doc.rustdesk.com">документації</a> RustDesk вашою рідною мовою</B>
</p>
Спілкування з нами: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Спілкування з нами: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -11,7 +11,7 @@
<b>Chúng tôi rất hoan nghênh sự hỗ trợ của bạn trong việc dịch trang README, trang giao diện người dùng của RustDesk - <a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang">RustDesk UI</a> và trang tài liệu của RustDesk - <a href="https://github.com/rustdesk/doc.rustdesk.com">RustDesk Doc</a> sang Tiếng Việt</b>
</p>
Hãy trao đổi với chúng tôi qua: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk)
Hãy trao đổi với chúng tôi qua: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -12,7 +12,7 @@
> **免责声明:** <br>
> RustDesk 的开发人员不纵容或支持任何不道德或非法的软件使用行为。滥用行为,例如未经授权的访问、控制或侵犯隐私,严格违反我们的准则。作者对应用程序的任何滥用行为概不负责。
与我们交流: [知乎](https://www.zhihu.com/people/rustdesk) | [Discord](https://discord.gg/nDceKgxnkV) | [Reddit](https://www.reddit.com/r/rustdesk)
与我们交流: [知乎](https://www.zhihu.com/people/rustdesk) | [Discord](https://discord.gg/nDceKgxnkV) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/I2I04VU09)

View File

@ -1,5 +1,6 @@
보안 정책
취약점 보고
# 보안 정책
## 취약점 보고
저희는 프로젝트의 보안을 매우 중요하게 생각합니다. 모든 사용자가 발견한 취약점을 저희에게 보고할 것을 권장합니다. RustDesk 프로젝트에서 보안 취약점이 발견되면 info@rustdesk.com 로 이메일을 보내 책임감 있게 보고해 주시기 바랍니다.

View File

@ -110,6 +110,8 @@ const String kOptionAllowRemoteConfigModification =
"allow-remote-config-modification";
const String kOptionVerificationMethod = "verification-method";
const String kOptionApproveMode = "approve-mode";
const String kOptionAllowNumericOneTimePassword =
"allow-numeric-one-time-password";
const String kOptionCollapseToolbar = "collapse_toolbar";
const String kOptionShowRemoteCursor = "show_remote_cursor";
const String kOptionFollowRemoteCursor = "follow_remote_cursor";

View File

@ -1097,6 +1097,34 @@ class _SafetyState extends State<_Safety> with AutomaticKeepAliveClientMixin {
))
.toList();
final isOptFixedNumOTP =
isOptionFixed(kOptionAllowNumericOneTimePassword);
final isNumOPTChangable = !isOptFixedNumOTP && tmpEnabled && !locked;
final numericOneTimePassword = GestureDetector(
child: InkWell(
child: Row(
children: [
Checkbox(
value: model.allowNumericOneTimePassword,
onChanged: isNumOPTChangable
? (bool? v) {
model.switchAllowNumericOneTimePassword();
}
: null)
.marginOnly(right: 5),
Expanded(
child: Text(
translate('Numeric one-time password'),
style: TextStyle(
color: disabledTextColor(context, isNumOPTChangable)),
))
],
)),
onTap: isNumOPTChangable
? () => model.switchAllowNumericOneTimePassword()
: null,
).marginOnly(left: _kContentHSubMargin - 5);
final modeKeys = <String>[
'password',
'click',
@ -1133,6 +1161,7 @@ class _SafetyState extends State<_Safety> with AutomaticKeepAliveClientMixin {
],
),
enabled: tmpEnabled && !locked),
numericOneTimePassword,
if (usePassword) radios[1],
if (usePassword)
_SubButton('Set permanent password', setPasswordDialog,

View File

@ -56,6 +56,10 @@ class _DropDownAction extends StatelessWidget {
final verificationMethod = gFFI.serverModel.verificationMethod;
final showPasswordOption = approveMode != 'click';
final isApproveModeFixed = isOptionFixed(kOptionApproveMode);
final isNumericOneTimePasswordFixed =
isOptionFixed(kOptionAllowNumericOneTimePassword);
final isAllowNumericOneTimePassword =
gFFI.serverModel.allowNumericOneTimePassword;
return [
PopupMenuItem(
enabled: gFFI.serverModel.connectStatus > 0,
@ -94,6 +98,14 @@ class _DropDownAction extends StatelessWidget {
value: "setTemporaryPasswordLength",
child: Text(translate("One-time password length")),
),
if (showPasswordOption &&
verificationMethod != kUsePermanentPassword)
PopupMenuItem(
value: "allowNumericOneTimePassword",
child: listTile(translate("Numeric one-time password"),
isAllowNumericOneTimePassword),
enabled: !isNumericOneTimePasswordFixed,
),
if (showPasswordOption) const PopupMenuDivider(),
if (showPasswordOption)
PopupMenuItem(
@ -124,6 +136,9 @@ class _DropDownAction extends StatelessWidget {
setPasswordDialog();
} else if (value == "setTemporaryPasswordLength") {
setTemporaryPasswordLengthDialog(gFFI.dialogManager);
} else if (value == "allowNumericOneTimePassword") {
gFFI.serverModel.switchAllowNumericOneTimePassword();
gFFI.serverModel.updatePasswordModel();
} else if (value == kUsePermanentPassword ||
value == kUseTemporaryPassword ||
value == kUseBothPasswords) {

View File

@ -3212,7 +3212,8 @@ class Display {
originalWidth == kVirtualDisplayResolutionValue &&
originalHeight == kVirtualDisplayResolutionValue;
bool get isOriginalResolution =>
width == originalWidth && height == originalHeight;
width == (originalWidth * scale).round() &&
height == (originalHeight * scale).round();
}
class Resolution {

View File

@ -36,6 +36,7 @@ class ServerModel with ChangeNotifier {
int _connectStatus = 0; // Rendezvous Server status
String _verificationMethod = "";
String _temporaryPasswordLength = "";
bool _allowNumericOneTimePassword = false;
String _approveMode = "";
int _zeroClientLengthCounter = 0;
@ -112,6 +113,12 @@ class ServerModel with ChangeNotifier {
*/
}
bool get allowNumericOneTimePassword => _allowNumericOneTimePassword;
switchAllowNumericOneTimePassword() async {
await mainSetBoolOption(
kOptionAllowNumericOneTimePassword, !_allowNumericOneTimePassword);
}
TextEditingController get serverId => _serverId;
TextEditingController get serverPasswd => _serverPasswd;
@ -227,6 +234,8 @@ class ServerModel with ChangeNotifier {
final temporaryPasswordLength =
await bind.mainGetOption(key: "temporary-password-length");
final approveMode = await bind.mainGetOption(key: kOptionApproveMode);
final numericOneTimePassword =
await mainGetBoolOption(kOptionAllowNumericOneTimePassword);
/*
var hideCm = option2bool(
'allow-hide-cm', await bind.mainGetOption(key: 'allow-hide-cm'));
@ -265,6 +274,10 @@ class ServerModel with ChangeNotifier {
_temporaryPasswordLength = temporaryPasswordLength;
update = true;
}
if (_allowNumericOneTimePassword != numericOneTimePassword) {
_allowNumericOneTimePassword = numericOneTimePassword;
update = true;
}
/*
if (_hideCm != hideCm) {
_hideCm = hideCm;
@ -817,8 +830,8 @@ class Client {
RxInt unreadChatMessageCount = 0.obs;
Client(this.id, this.authorized, this.isFileTransfer, this.isViewCamera, this.name, this.peerId,
this.keyboard, this.clipboard, this.audio);
Client(this.id, this.authorized, this.isFileTransfer, this.isViewCamera,
this.name, this.peerId, this.keyboard, this.clipboard, this.audio);
Client.fromJson(Map<String, dynamic> json) {
id = json['id'];

@ -1 +1 @@
Subproject commit 53709d8f8dd09a1491f4d8866e9643804caa380b
Subproject commit 15a71f07a5bd8f7951b6869bea06f85064e41c67

View File

@ -49,6 +49,38 @@ pub struct StrategyOptions {
pub extra: HashMap<String, String>,
}
struct InfoUploaded {
uploaded: bool,
url: String,
last_uploaded: Option<Instant>,
id: String,
username: Option<String>,
}
impl Default for InfoUploaded {
fn default() -> Self {
Self {
uploaded: false,
url: "".to_owned(),
last_uploaded: None,
id: "".to_owned(),
username: None,
}
}
}
impl InfoUploaded {
fn uploaded(url: String, id: String, username: String) -> Self {
Self {
uploaded: true,
url,
last_uploaded: None,
id,
username: Some(username),
}
}
}
#[cfg(not(any(target_os = "ios")))]
#[tokio::main(flavor = "current_thread")]
async fn start_hbbs_sync_async() {
@ -57,8 +89,7 @@ async fn start_hbbs_sync_async() {
TIME_CONN,
));
let mut last_sent: Option<Instant> = None;
let mut info_uploaded: (bool, String, Option<Instant>, String) =
(false, "".to_owned(), None, "".to_owned());
let mut info_uploaded = InfoUploaded::default();
let mut sysinfo_ver = "".to_owned();
loop {
tokio::select! {
@ -73,15 +104,31 @@ async fn start_hbbs_sync_async() {
continue;
}
let conns = Connection::alive_conns();
if info_uploaded.0 && (url != info_uploaded.1 || id != info_uploaded.3) {
info_uploaded.0 = false;
if info_uploaded.uploaded && (url != info_uploaded.url || id != info_uploaded.id) {
info_uploaded.uploaded = false;
*PRO.lock().unwrap() = false;
}
if !info_uploaded.0 && info_uploaded.2.map(|x| x.elapsed() >= UPLOAD_SYSINFO_TIMEOUT).unwrap_or(true) {
// For Windows:
// We can't skip uploading sysinfo when the username is empty, because the username may
// always be empty before login. We also need to upload the other sysinfo info.
//
// https://github.com/rustdesk/rustdesk/discussions/8031
// We still need to check the username after uploading sysinfo, because
// 1. The username may be empty when logining in, and it can be fetched after a while.
// In this case, we need to upload sysinfo again.
// 2. The username may be changed after uploading sysinfo, and we need to upload sysinfo again.
//
// The Windows session will switch to the last user session before the restart,
// so it may be able to get the username before login.
// But strangely, sometimes we can get the username before login,
// we may not be able to get the username before login after the next restart.
let mut v = crate::get_sysinfo();
// username is empty in login screen of windows, but here we only upload sysinfo once, causing
// real user name not uploaded after login screen. https://github.com/rustdesk/rustdesk/discussions/8031
if !cfg!(windows) || !v["username"].as_str().unwrap_or_default().is_empty() {
let sys_username = v["username"].as_str().unwrap_or_default().to_string();
// Though the username comparison is only necessary on Windows,
// we still keep the comparison on other platforms for consistency.
let need_upload = (!info_uploaded.uploaded || info_uploaded.username.as_ref() != Some(&sys_username)) &&
info_uploaded.last_uploaded.map(|x| x.elapsed() >= UPLOAD_SYSINFO_TIMEOUT).unwrap_or(true);
if need_upload {
v["version"] = json!(crate::VERSION);
v["id"] = json!(id);
v["uuid"] = json!(crate::encode64(hbb_common::get_uuid()));
@ -130,7 +177,7 @@ async fn start_hbbs_sync_async() {
}
};
if samever {
info_uploaded = (true, url.clone(), None, id.clone());
info_uploaded = InfoUploaded::uploaded(url.clone(), id.clone(), sys_username);
log::info!("sysinfo not changed, skip upload");
continue;
}
@ -139,7 +186,7 @@ async fn start_hbbs_sync_async() {
match crate::post_request(url.replace("heartbeat", "sysinfo"), v, "").await {
Ok(x) => {
if x == "SYSINFO_UPDATED" {
info_uploaded = (true, url.clone(), None, id.clone());
info_uploaded = InfoUploaded::uploaded(url.clone(), id.clone(), sys_username);
log::info!("sysinfo updated");
if !hash.is_empty() {
config::Status::set("sysinfo_hash", hash);
@ -147,14 +194,13 @@ async fn start_hbbs_sync_async() {
}
*PRO.lock().unwrap() = true;
} else if x == "ID_NOT_FOUND" {
info_uploaded.2 = None; // next heartbeat will upload sysinfo again
info_uploaded.last_uploaded = None; // next heartbeat will upload sysinfo again
} else {
info_uploaded.2 = Some(Instant::now());
info_uploaded.last_uploaded = Some(Instant::now());
}
}
_ => {
info_uploaded.2 = Some(Instant::now());
}
info_uploaded.last_uploaded = Some(Instant::now());
}
}
}
@ -174,7 +220,7 @@ async fn start_hbbs_sync_async() {
if let Ok(s) = crate::post_request(url.clone(), v.to_string(), "").await {
if let Ok(mut rsp) = serde_json::from_str::<HashMap::<&str, Value>>(&s) {
if rsp.remove("sysinfo").is_some() {
info_uploaded.0 = false;
info_uploaded.uploaded = false;
config::Status::set("sysinfo_hash", "".to_owned());
log::info!("sysinfo required to forcely update");
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", "使用 WebSocket"),
("Trackpad speed", "触控板速度"),
("Default trackpad speed", "默认触控板速度"),
("Numeric one-time password", "一次性密码为数字"),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", "WebSocket verwenden"),
("Trackpad speed", "Geschwindigkeit des Trackpads"),
("Default trackpad speed", "Standardgeschwindigkeit des Trackpads"),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", "Usar WebSocket"),
("Trackpad speed", "Velocidad de trackpad"),
("Default trackpad speed", "Velocidad predeterminada de trackpad"),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -696,5 +696,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("update-failed-check-msi-tip", "بررسی روش نصب انجام نشد. لطفاً برای بارگیری از صفحه انتشار ، روی دکمه 'بارگیری' کلیک کنید و به صورت دستی ارتقا دهید."),
("websocket_tip", "فقط اتصالات رله پشتیبانی می شوند ، WebSocket هنگام استفاده از ."),
("Use WebSocket", "استفاده کنید WebSocket از"),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", "Utiliser WebSocket"),
("Trackpad speed", "Vitesse du pavé tactile"),
("Default trackpad speed", "Vitesse par défaut du pavé tactile"),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -4,9 +4,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Status", "מצב"),
("Your Desktop", "שולחן העבודה שלך"),
("desk_tip", "ניתן לגשת לשולחן העבודה שלך עם מזהה וסיסמה זו."),
("Password", "סיסמא"),
("Password", "סיסמה"),
("Ready", "מוכן"),
("Established", "הוקם"),
("Established", "מחובר"),
("connecting_status", "מתחבר לרשת RustDesk..."),
("Enable service", "הפעל שירות"),
("Start service", "התחל שירות"),
@ -19,32 +19,32 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Recent sessions", "הפעלות אחרונות"),
("Address book", "ספר כתובות"),
("Confirmation", "אישור"),
("TCP tunneling", "מנהור TCP"),
("TCP tunneling", "TCP tunneling"),
("Remove", "הסר"),
("Refresh random password", "רענן סיסמה אקראית"),
("Set your own password", "הגדר סיסמה משלך"),
("Enable keyboard/mouse", "אפשר מקלדת/עכבר"),
("Enable clipboard", "אפשר לוח גזירים"),
("Enable file transfer", "אפשר העברת קבצים"),
("Enable TCP tunneling", "הפעל מנהור TCP"),
("Enable TCP tunneling", "אפשר TCP tunneling"),
("IP Whitelisting", "רשימת IP מורשים"),
("ID/Relay Server", "שרת זיהוי וממסר"),
("Import server config", "ייבוא קונפיגורצית שרת"),
("Export Server Config", "ייצוא קונפיגורצית שרת"),
("Import server configuration successfully", "ייבוא קונפיגורצית הושלם בהצלחה"),
("Export server configuration successfully", "ייצוא קונפיגורצית שרת הושלם בהצלחה"),
("Invalid server configuration", "קונפיגורצית שרת לא תקינה"),
("Clipboard is empty", "הקליפבורד ריק"),
("ID/Relay Server", "שרת ID/Relay"),
("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%", "אורך בין %min% ל %max%"),
("starts with a letter", "מתחיל באות"),
("allowed characters", "תווים מותרים"),
("id_change_tip", "מותרים רק תווים a-z, A-Z, 0-9, - (dash) ו_ (קו תחתון). האות הראשונה חייבת להיות a-z, A-Z. אורך בין 6 ל-16."),
("id_change_tip", "מותרים רק תווים a-z, A-Z, 0-9, מקף (-) וקו תחתון (_). התו הראשון חייב להיות אות (a-z, A-Z). אורך בין 6 ל-16 תווים."),
("Website", "דף הבית"),
("About", "אודות"),
("Slogan_tip", "נוצר בלב בעולם הכאוטי הזה!"),
("Slogan_tip", "נוצר באהבה בעולם הכאוטי הזה!"),
("Privacy Statement", "הצהרת פרטיות"),
("Mute", "השתק"),
("Build Date", "תאריך בנייה"),
@ -52,17 +52,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Home", "בית"),
("Audio Input", "קלט שמע"),
("Enhancements", "שיפורים"),
("Hardware Codec", "Codec חומרה"),
("Adaptive bitrate", "קצב סיביות משתנה"),
("ID Server", "מזהה שרת"),
("Relay Server", "שרת ממסר (Relay)"),
("Hardware Codec", "Hardware Codec"),
("Adaptive bitrate", "Adaptive bitrate"),
("ID Server", "שרת ID"),
("Relay Server", "שרת Relay"),
("API Server", "שרת API"),
("invalid_http", "חייב להתחיל עם http:// או https://"),
("Invalid IP", "IP לא תקין"),
("Invalid format", "פורמט לא תקין"),
("server_not_support", "עדיין לא נתמך על ידי השרת"),
("server_not_support", "לא נתמך על-ידי השרת כרגע"),
("Not available", "לא זמין"),
("Too frequent", "תדיר מידיי"),
("Too frequent", "תדיר מדי"),
("Cancel", "ביטול"),
("Skip", "דלג"),
("Close", "סגור"),
@ -72,13 +72,13 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Please enter your password", "אנא הכנס סיסמה"),
("Remember password", "זכור סיסמה"),
("Wrong Password", "סיסמה שגויה"),
("Do you want to enter again?", "האם ברצונך להזין שוב?"),
("Do you want to enter again?", "האם אתה רוצה לנסות שוב?"),
("Connection Error", "שגיאת חיבור"),
("Error", "שגיאה"),
("Reset by the peer", "איפוס על-ידי הצד השני"),
("Reset by the peer", "אופס על-ידי הצד השני"),
("Connecting...", "מתחבר..."),
("Connection in progress. Please wait.", "מתחבר. אנא המתן."),
("Please try 1 minute later", "אנא נסה שוב בעוד דקה"),
("Please try 1 minute later", "אנא המתן דקה ונסה שוב"),
("Login Error", "שגיאת התחברות"),
("Successful", "הצלחה"),
("Connected, waiting for image...", "מחובר, מחכה לתמונה..."),
@ -86,8 +86,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Type", "סוג"),
("Modified", "שונה"),
("Size", "גודל"),
("Show Hidden Files", "הצג קבצים נסתרים"),
("Receive", "קיבל"),
("Show Hidden Files", "הצג קבצים מוסתרים"),
("Receive", "קבל"),
("Send", "שלח"),
("Refresh File", "רענן קובץ"),
("Local", "מקומי"),
@ -96,14 +96,14 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Local Computer", "מחשב מקומי"),
("Confirm Delete", "אשר מחיקה"),
("Delete", "מחק"),
("Properties", "תכונות"),
("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 this empty directory?", "האם אתה בטוח שברצונך למחוק תיקייה ריקה זו?"),
("Are you sure you want to delete the file of this directory?", "האם אתה בטוח שברצונך למחוק את הקובץ בתקייה זו?"),
("Do this for all conflicts", "בצע זאת עבור כל ההתנגשויות"),
("This is irreversible!", "בלתי הפיך"),
@ -126,23 +126,23 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Balanced", "מאוזן"),
("Optimize reaction time", "מיטוב זמן תגובה"),
("Custom", "מותאם אישית"),
("Show remote cursor", "הראה מצביע מרוחק"),
("Show remote cursor", "הצג סמן מרוחק"),
("Show quality monitor", "הצג מד איכות"),
("Disable clipboard", "בטל את הקליפבורד"),
("Disable clipboard", "השבת את לוח הגזירים"),
("Lock after session end", "נעל לאחר סיום ההפעלה"),
("Insert Ctrl + Alt + Del", "לחץ Ctrl + Alt + Delete"),
("Insert Lock", "הוסף נעילה"),
("Refresh", "רענן"),
("ID does not exist", "מזהה אינו קיים"),
("Failed to connect to rendezvous server", "ההתחברות לשרת התיאום נכשלה"),
("Failed to connect to rendezvous server", "החיבור לשרת התיאום נכשל"),
("Please try later", "אנא נסה שוב מאוחר יותר"),
("Remote desktop is offline", "שולחן העבודה המרוחק אינו מקוון"),
("Key mismatch", "מפתח אינו תואם"),
("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", "ההתחברות למחשב המרוחק נכשלה"),
("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 במערכת."),
@ -162,8 +162,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Accept and Install", "קבל והתקן"),
("End-user license agreement", "הסכם רישיון משתמש קצה"),
("Generating ...", "יוצר ..."),
("Your installation is lower version.", "התוכנה שלך בגרסה ישנה יותר"),
("not_close_tcp_tip", "אל תסגור חלון זה בזמן שאתה משתמש במנהרה"),
("Your installation is lower version.", "מותקנת אצלך בגרסה ישנה יותר"),
("not_close_tcp_tip", "אל תסגור חלון זה בזמן שאתה משתמש בtcp"),
("Listening ...", "מאזין ..."),
("Remote Host", "מארח מרוחק"),
("Remote Port", "פורט מרוחק"),
@ -172,8 +172,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Local Port", "פורט מקומי"),
("Local Address", "כתובת מקומית"),
("Change Local Port", "שנה פורט מקומי"),
("setup_server_tip", "לחיבור מהיר יותר, אנא הגדר שרת משלך"),
("Too short, at least 6 characters.", "קצר מידיי, לפחות 6 תווים."),
("setup_server_tip", "לחיבור מהיר יותר, מומלץ להגדיר שרת משלך"),
("Too short, at least 6 characters.", "קצר מידי, לפחות 6 תווים."),
("The confirmation is not identical.", "האימות אינו זהה."),
("Permissions", "הרשאות"),
("Accept", "קבל"),
@ -199,7 +199,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Please enter the folder name", "אנא הכנס שם תיקייה"),
("Fix it", "תקן את זה"),
("Warning", "אזהרה"),
("Login screen using Wayland is not supported", ""),
("Login screen using Wayland is not supported", "מסך התחברות המשתמש ב-Wayland אינו נתמך"),
("Reboot required", "נדרש אתחול מחדש"),
("Unsupported display server", "שרת תצוגה לא נתמך"),
("x11 expected", "נדרש X11"),
@ -210,15 +210,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Closed manually by the peer", "נסגר ידנית על ידי הצד השני"),
("Enable remote configuration modification", "אפשר שינוי הגדרות מרחוק"),
("Run without install", "הרץ ללא התקנה"),
("Connect via relay", "התחבר דרך ממסר"),
("Always connect via relay", "תמיד תתחבר דרך ממסר"),
("whitelist_tip", "רק IP ברשימה הלבנה יכול לגשת אלי"),
("Connect via relay", "התחבר באמצעות ממסר"),
("Always connect via relay", "התחבר תמיד דרך ממסר"),
("whitelist_tip", "רק כתובות IP מהרשימה הלבנה יכולות לגשת אלי"),
("Login", "התחברות"),
("Verify", "אמת"),
("Remember me", "זכור אותי"),
("Trust this device", "סמוך על מכשיר זה"),
("Verification code", "קוד אימות"),
("verification_tip", "קוד אימות נשלח לכתובת הדוא\"ל הרשומה, הזן את קוד האימות כדי להמשיך בהתחברות."),
("verification_tip", "קוד אימות נשלח לכתובת האימייל הרשומה, הזן את קוד האימות כדי להמשיך בהתחברות."),
("Logout", "התנתק"),
("Tags", "תגים"),
("Search ID", "חפש מזהה"),
@ -229,7 +229,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Network error", "שגיאת רשת"),
("Username missed", "חסר שם משתמש"),
("Password missed", "חסרה סיסמה"),
("Wrong credentials", "שם משתמש או סיסמה שגויים"),
("Wrong credentials", "פרטי התחברות שגויים"),
("The verification code is incorrect or has expired", "קוד האימות שגוי או שפג תוקפו"),
("Edit Tag", "ערוך תג"),
("Forget Password", "שכחת סיסמה"),
@ -244,7 +244,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("install_daemon_tip", "לצורך הפעלה בעת הפעלת המחשב, עליך להתקין שירות מערכת."),
("Remote ID", "מזהה מרוחק"),
("Paste", "הדבק"),
("Paste here?", "להסביר כאן?"),
("Paste here?", "להדביק כאן?"),
("Are you sure to close the connection?", "האם אתה בטוח שברצונך לסגור את החיבור?"),
("Download new version", "הורד גרסה חדשה"),
("Touch mode", "מצב מגע"),
@ -257,14 +257,14 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("One-Finger Move", "הזזה באצבע אחת"),
("Double Tap & Move", "הקשה כפולה והזזה"),
("Mouse Drag", "גרירת עכבר"),
("Three-Finger vertically", "שלוש אצבעות אנכית"),
("Three-Finger vertically", "תנועה אנכית בשלוש אצבעות"),
("Mouse Wheel", "גלגלת עכבר"),
("Two-Finger Move", "הזזה בשתי אצבעות"),
("Canvas Move", "הזזת בד"),
("Pinch to Zoom", "צביטה לזום"),
("Canvas Zoom", "זום בד"),
("Reset canvas", "אפס לוח ציור"),
("No permission of file transfer", "אין הרשאה להעברת קבצים"),
("No permission of file transfer", "אין הרשאת העברת קבצים"),
("Note", "הערה"),
("Connection", "התחברות"),
("Share Screen", "שיתוף מסך"),
@ -275,51 +275,51 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Screen Capture", "לכידת מסך"),
("Input Control", "בקרת קלט"),
("Audio Capture", "לכידת שמע"),
("File Connection", "חיבור קובץ"),
("Screen Connection", "חיבור מסך"),
("File Connection", "חיבור להעברת קבצים"),
("Screen Connection", "חיבור תצוגה"),
("Do you accept?", "האם אתה מקבל?"),
("Open System Setting", "פתח הגדרת מערכת"),
("Open System Setting", "פתח הגדרות מערכת"),
("How to get Android input permission?", "כיצד לקבל הרשאת קלט באנדרואיד?"),
("android_input_permission_tip1", "כדי שמכשיר מרוחק יוכל לשלוט במכשיר האנדרואיד שלך באמצעות עכבר או מגע, עליך לאפשר ל-RustDesk להשתמש בשירות \"נגישות\"."),
("android_input_permission_tip2", "אנא עבור לדף ההגדרות של המערכת הבא, מצא והכנס ל[שירותים מותקנים], הפעל את שירות [RustDesk Input]."),
("android_new_connection_tip", "בקשת שליטה חדשה התקבלה, שרוצה לשלוט במכשירך הנוכחי."),
("android_service_will_start_tip", "הפעלת \"לכידת מסך\" תתחיל אוטומטית את השירות, מאפשרת למכשירים אחרים לבקש חיבור למכשיר שלך."),
("android_stop_service_tip", "סגירת השירות תסגור אוטומטית את כל החיבורים המוקמים."),
("android_version_audio_tip", "גרסת האנדרואיד הנוכחית אינה תומכת בלכידת שמע, אנא שדרג לאנדרואיד 10 או גבוה יותר."),
("android_input_permission_tip2", "אנא עבור לדף הגדרות המערכת הבא, מצא והכנס ל[שירותים מותקנים], הפעל את שירות [RustDesk Input]."),
("android_new_connection_tip", "התקבלה בקשת שליטה חדשה, המבקשת לשלוט במכשירך הנוכחי."),
("android_service_will_start_tip", "הפעלת \"לכידת מסך\" תפעיל את השירות באופן אוטומטי ותאפשר למכשירים אחרים לבקש חיבור למכשירך."),
("android_stop_service_tip", "סגירת השירות תנתק באופן אוטומטי את כל החיבורים הקיימים."),
("android_version_audio_tip", "גרסת האנדרואיד הנוכחית אינה תומכת בלכידת שמע. אנא שדרג לאנדרואיד 10 ומעלה."),
("android_start_service_tip", "הקש על [התחל שירות] או אפשר הרשאת [לכידת מסך] כדי להתחיל את שירות שיתוף המסך."),
("android_permission_may_not_change_tip", "הרשאות עבור חיבורים שנוצרו עשויות לא להשתנות מייד עד להתחברות מחדש."),
("android_permission_may_not_change_tip", "הרשאות עבור חיבורים קיימים עשויות לא להשתנות באופן מיידי עד להתחברות מחדש."),
("Account", "חשבון"),
("Overwrite", "דרוס"),
("This file exists, skip or overwrite this file?", "קובץ זה כבר קיים, לדלג או לדרוס אותו?"),
("This file exists, skip or overwrite this file?", "הקובץ כבר קיים, לדלג או לדרוס אותו?"),
("Quit", "צא"),
("Help", "עזרה"),
("Failed", "נכשל"),
("Succeeded", "הצליח"),
("Someone turns on privacy mode, exit", "מישהו הפעיל מצב פרטיות, יוצאים"),
("Someone turns on privacy mode, exit", "מישהו הפעיל מצב פרטיות, מתבצעת יציאה"),
("Unsupported", "לא נתמך"),
("Peer denied", "הצד השני סירב"),
("Please install plugins", "אנא התקן תוספים"),
("Peer exit", "הצד השני יצא"),
("Peer exit", "הצד השני התנתק"),
("Failed to turn off", "הכיבוי נכשל"),
("Turned off", "מכובה"),
("Language", "שפה"),
("Keep RustDesk background service", "השאר את שירות הרקע של RustDesk פעיל"),
("Ignore Battery Optimizations", "התעלם מאופטימיזציות סוללה"),
("android_open_battery_optimizations_tip", "אם ברצונך לבטל תכונה זו, אנא עבור לדף ההגדרות של יישום RustDesk הבא, מצא והכנס ל[סוללה], הסר את הסימון מ-[לא מוגבל]"),
("android_open_battery_optimizations_tip", "אם ברצונך לבטל תכונה זו, אנא עבור לדף ההגדרות של יישום RustDesk , מצא והיכנס ל[סוללה], ובטל את הסימון מ-[לא מוגבל]"),
("Start on boot", "התחל בהפעלה"),
("Start the screen sharing service on boot, requires special permissions", "הפעל את שירות שיתוף המסך בעת ההפעלה דורש הרשאות מיוחדות"),
("Start the screen sharing service on boot, requires special permissions", "הפעל את שירות שיתוף המסך בעת אתחול המכשיר (דורש הרשאות מיוחדות)"),
("Connection not allowed", "חיבור לא מורשה"),
("Legacy mode", "מצב ישן"),
("Map mode", "מצב מיפוי"),
("Map mode", "מצב מיפוי מקשים"),
("Translate mode", "מצב תרגום"),
("Use permanent password", "השתמש בסיסמה קבועה"),
("Use both passwords", "השתמש בשתי הסיסמאות"),
("Set permanent password", "הגדר סיסמה קבועה"),
("Enable remote restart", "אפשר אתחול מרחוק"),
("Restart remote device", "אתחל את ההתקן המרוחק"),
("Restart remote device", "אתחל את המכשיר המרוחק"),
("Are you sure you want to restart", "האם אתה בטוח שברצונך לאתחל"),
("Restarting remote device", "מאתחל את ההתקן המרוחק"),
("remote_restarting_tip", "המכשיר המרוחק מתחיל מחדש, אנא סגור את תיבת ההודעה הזו והתחבר מחדש עם סיסמה קבועה לאחר זמן מה"),
("Restarting remote device", "מאתחל את המכשיר המרוחק"),
("remote_restarting_tip", "המכשיר המרוחק מאתחל את עצמו, אנא סגור את תיבת ההודעה הזו והתחבר מחדש עם סיסמה קבועה בעוד זמן מה"),
("Copied", "הועתק"),
("Exit Fullscreen", "יציאה ממסך מלא"),
("Fullscreen", "מסך מלא"),
@ -333,7 +333,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Show Toolbar", "הצג סרגל כלים"),
("Hide Toolbar", "הסתר סרגל כלים"),
("Direct Connection", "חיבור ישיר"),
("Relay Connection", "חיבור ריליי"),
("Relay Connection", "חיבור באמצעות ממסר"),
("Secure Connection", "חיבור מאובטח"),
("Insecure Connection", "חיבור לא מאובטח"),
("Scale original", "קנה מידה מקורי"),
@ -346,7 +346,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Dark", "כהה"),
("Light", "בהיר"),
("Follow System", "זהה למערכת"),
("Enable hardware codec", ""),
("Enable hardware codec", "אפשר מקודד חומרה"),
("Unlock Security Settings", "פתח הגדרות אבטחה"),
("Enable audio", "הפעל שמע"),
("Unlock Network Settings", "פתח הגדרות רשת"),
@ -363,8 +363,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Unpin Toolbar", "הסר נעיצת סרגל כלים"),
("Recording", "הקלטה"),
("Directory", "תיקיה"),
("Automatically record incoming sessions", "הקלט אוטומטית הפעלות נכנסות"),
("Automatically record outgoing sessions", "הקלט אוטומטית הפעלות יוצאות"),
("Automatically record incoming sessions", "הקלט הפעלות נכנסות באופן אוטומטי"),
("Automatically record outgoing sessions", "הקלט הפעלות יוצאות באופן אוטומטי"),
("Change", "שנה"),
("Start session recording", "התחל הקלטת הפעלה"),
("Stop session recording", "הפסק הקלטת הפעלה"),
@ -374,7 +374,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Write a message", "כתוב הודעה"),
("Prompt", "הנחיה"),
("Please wait for confirmation of UAC...", "אנא המתן לאישור בקרת חשבון משתמש (UAC)..."),
("elevated_foreground_window_tip", "החלון הנוכחי של שולחן העבודה המרוחק דורש הרשאה גבוהה יותר לפעולה, לכן אי אפשר להשתמש בעכבר ובמקלדת באופן זמני. תוכל לבקש מהמשתמש המרוחק למזער את החלון הנוכחי, או ללחוץ על כפתור ההגבהה בחלון ניהול החיבור. כדי להימנע מבעיה זו, מומלץ להתקין את התוכנה במכשיר המרוחק."),
("elevated_foreground_window_tip", "החלון הנוכחי של שולחן העבודה המרוחק דורש הרשאה גבוהה יותר לפעולה, לכן אי אפשר להשתמש בעכבר ובמקלדת באופן זמני. תוכל לבקש מהמשתמש המרוחק למזער את החלון הנוכחי, או ללחוץ על כפתור העלאת הרשאות בחלון ניהול החיבור. כדי להימנע מבעיה זו, מומלץ להתקין את התוכנה במכשיר המרוחק."),
("Disconnected", "מנותק"),
("Other", "אחר"),
("Confirm before closing multiple tabs", "אשר לפני סגירת מספר לשוניות"),
@ -383,13 +383,13 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Screen Share", "שיתוף מסך"),
("Wayland requires Ubuntu 21.04 or higher version.", "Wayland דורש Ubuntu 21.04 או גרסה גבוהה יותר"),
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland דורש גרסת הפצת לינוקס גבוהה יותר. אנא נסה שולחן עבודה מסוג X11 או החלף מערכת הפעלה"),
("JumpLink", "הצג"),
("JumpLink", "קישור מהיר"),
("Please Select the screen to be shared(Operate on the peer side).", "אנא בחר את המסך לשיתוף (פעולה בצד העמית)."),
("Show RustDesk", "הצג את RustDesk"),
("This PC", "מחשב זה"),
("or", "או"),
("Continue with", "המשך עם"),
("Elevate", "הרם הרשאות"),
("Elevate", "הפעל הרשאות מורחבות"),
("Zoom cursor", "הגדל סמן"),
("Accept sessions via password", "קבל הפעלות באמצעות סיסמה"),
("Accept sessions via click", "קבל הפעלות באמצעות לחיצה"),
@ -400,8 +400,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("One-time password length", "אורך סיסמה חד-פעמית"),
("Request access to your device", "בקשת גישה למכשיר שלך"),
("Hide connection management window", "הסתר חלון ניהול חיבורים"),
("hide_cm_tip", "אפשר הסתרה רק אם מקבלים סשנים דרך סיסמה ומשתמשים בסיסמה קבועה"),
("wayland_experiment_tip", "תמיכה ב-Wayland נמצאת בשלב ניסיוני, אנא השתמש ב-X11 אם אתה זקוק לגישה לא מלווה."),
("hide_cm_tip", "אפשר הסתרה רק אם מקבלים הפעלות דרך סיסמה ומשתמשים בסיסמה קבועה"),
("wayland_experiment_tip", "תמיכה ב-Wayland נמצאת בשלב ניסיוני, אנא השתמש ב-X11 אם אתה זקוק לגישה ללא ליווי מהצד המרוחק"),
("Right click to select tabs", "לחץ לחיצה ימנית כדי לבחור לשוניות"),
("Skipped", "דולג"),
("Add to address book", "הוסף לספר הכתובות"),
@ -410,20 +410,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Closed manually by web console", "נסגר ידנית דרך מסוף האינטרנט"),
("Local keyboard type", "סוג מקלדת מקומי"),
("Select local keyboard type", "בחר סוג מקלדת מקומי"),
("software_render_tip", "אם אתה משתמש בכרטיס גרפיקה של Nvidia תחת Linux וחלון המרחוק נסגר מיד לאחר החיבור, החלפה למנהל ההתקן הפתוח Nouveau ובחירה בשימוש בעיבוד תוכנה עשויה לעזור. נדרשת הפעלה מחדש של התוכנה."),
("software_render_tip", "אם אתה משתמש בכרטיס גרפיקה של Nvidia תחת Linux וחלון המרוחק נסגר מיד לאחר החיבור, החלפה למנהל ההתקן הפתוח Nouveau ובחירה בשימוש בעיבוד תוכנה עשויה לעזור. נדרשת הפעלה מחדש של התוכנה."),
("Always use software rendering", "השתמש תמיד בעיבוד תוכנה"),
("config_input", "כדי לשלוט בשולחן העבודה המרוחק באמצעות מקלדת, עליך להעניק ל-RustDesk הרשאות \"מעקב אחרי קלט\"."),
("config_input", "כדי לשלוט בשולחן העבודה המרוחק באמצעות מקלדת, עליך להעניק ל-RustDesk הרשאות \"מעקב קלט\"."),
("config_microphone", "כדי לדבר מרחוק, עליך להעניק ל-RustDesk הרשאות \"הקלטת שמע\"."),
("request_elevation_tip", "ניתן גם לבקש הגבהה אם יש מישהו בצד המרוחק."),
("request_elevation_tip", "אם יש מישהו בצד המרוחק, ניתן לבקש העלאת הרשאות"),
("Wait", "המתן"),
("Elevation Error", "שגיאת הגבהה"),
("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", "ההרשאות הוגברו בהצלחה"),
("still_click_uac_tip", "עדיין נדרש מהמשתמש המרוחק לאשר את חלון ה-UAC של RustDesk"),
("Request Elevation", "בקש העלאת הרשאות"),
("wait_accept_uac_tip", "אנא המתן שהמשתמש המרוחק יאשר את חלון ה-UAC"),
("Elevate successfully", "ההרשאות הורחבו בהצלחה"),
("uppercase", "אותיות גדולות"),
("lowercase", "אותיות קטנות"),
("digit", "ספרה"),
@ -433,7 +433,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Medium", "בינוני"),
("Strong", "חזק"),
("Switch Sides", "החלף צדדים"),
("Please confirm if you want to share your desktop?", "אנא אשר שברצונך לשתף את שולחן העבודה שלך?"),
("Please confirm if you want to share your desktop?", "האם לשתף את שולחן העבודה שלך?"),
("Display", "תצוגה"),
("Default View Style", "סגנון תצוגה ברירת מחדל"),
("Default Scroll Style", "סגנון גלילה ברירת מחדל"),
@ -446,7 +446,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Voice call", "שיחה קולית"),
("Text chat", "שיחת טקסט"),
("Stop voice call", "הפסק שיחה קולית"),
("relay_hint_tip", "ייתכן שלא ניתן להתחבר ישירות; ניתן לנסות להתחבר דרך ריליי. בנוסף, אם ברצונך להשתמש בריליי בניסיון הראשון שלך, תוכל להוסיף את הסיומת \"/r\" למזהה או לבחור באפשרות \"התחבר תמיד דרך ריליי\" בכרטיס של הסשנים האחרונים אם קיים."),
("relay_hint_tip", "ייתכן שלא ניתן להתחבר ישירות. נסה להתחבר דרך ממסר. כדי להשתמש בממסר כבר מהניסיון הראשון, הוסף את הסיומת /r למזהה או בחר \"התחבר תמיד דרך ממסר\" בכרטיס ההפעלות האחרונות, אם קיים."),
("Reconnect", "התחברות מחדש"),
("Codec", "קודק"),
("Resolution", "רזולוציה"),
@ -455,25 +455,25 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("RDP Settings", "הגדרות RDP"),
("Sort by", "מיין לפי"),
("New Connection", "חיבור חדש"),
("Restore", "שיחזור"),
("Minimize", "הקטן"),
("Restore", "שחזור"),
("Minimize", "מזער"),
("Maximize", "הגדל"),
("Your Device", "המכשיר שלך"),
("empty_recent_tip", "אופס, אין סשנים אחרונים!\nהגיע הזמן לתכנן חדש."),
("empty_favorite_tip", "עדיין אין עמיתים מועדפים?\nבוא נמצא מישהו להתחבר אליו ונוסיף אותו למועדפים!"),
("empty_recent_tip", "אופס, אין הפעלות אחרונות!\nהגיע הזמן להתחבר למישהו חדש."),
("empty_favorite_tip", "עדיין אין עמיתים מועדפים?\nבא נמצא מישהו להתחבר אליו ונוסיף אותו למועדפים!"),
("empty_lan_tip", "אוי לא, נראה שעדיין לא גילינו עמיתים."),
("empty_address_book_tip", "אוי ואבוי, נראה שכרגע אין עמיתים בספר הכתובות שלך."),
("eg: admin", "לדוגמא: admin"),
("empty_address_book_tip", "אבוי, נראה שכרגע אין עמיתים בספר הכתובות שלך."),
("eg: admin", "לדוגמה: admin"),
("Empty Username", "שם משתמש ריק"),
("Empty Password", "סיסמה ריקה"),
("Me", "אני"),
("identical_file_tip", "קובץ זה זהה לקובץ של העמית."),
("identical_file_tip", "קובץ זה זהה לקובץ שבצד העמית."),
("show_monitors_tip", "הצג מסכים בסרגל כלים"),
("View Mode", "מצב תצוגה"),
("login_linux_tip", "עליך להתחבר לחשבון Linux מרוחק כדי לאפשר פעילות שולחן עבודה X"),
("verify_rustdesk_password_tip", "אמת סיסמת RustDesk"),
("remember_account_tip", "זכור חשבון זה"),
("os_account_desk_tip", "חשבון זה משמש להתחברות למערכת ההפעלה המרוחקת ולאפשר פעילות שולחן עבודה במצב לא מקוון"),
("os_account_desk_tip", "חשבון זה משמש להתחברות למערכת ההפעלה המרוחקת ולהפעלת שולחן עבודה במצב לא מקוון"),
("OS Account", "חשבון מערכת הפעלה"),
("another_user_login_title_tip", "משתמש אחר כבר התחבר"),
("another_user_login_text_tip", "נתק"),
@ -481,7 +481,7 @@ 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", "אין צורך בהרשאות מוגברות"),
("No need to elevate", "אין צורך בהעלאת הרשאות"),
("System Sound", "צליל מערכת"),
("Default", "ברירת מחדל"),
("New RDP", "RDP חדש"),
@ -500,8 +500,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("resolution_fit_local_tip", "התאם לרזולוציה מקומית"),
("resolution_custom_tip", "רזולוציה מותאמת אישית"),
("Collapse toolbar", "מזער סרגל כלים"),
("Accept and Elevate", "קבל והגבה"),
("accept_and_elevate_btn_tooltip", "קבל את החיבור והגבה הרשאות UAC."),
("Accept and Elevate", "אשר והפעל הרשאות מורחבות"),
("accept_and_elevate_btn_tooltip", "קבל את החיבור והפעל הרשאות מורחבות (UAC)"),
("clipboard_wait_response_timeout_tip", "המתנה לתגובת העתקה הסתיימה בזמן."),
("Incoming connection", "חיבור נכנס"),
("Outgoing connection", "חיבור יוצא"),
@ -526,8 +526,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Select", "בחר"),
("Toggle Tags", "החלף תגיות"),
("pull_ab_failed_tip", "נכשל ברענון ספר הכתובות"),
("push_ab_failed_tip", "נכשל בסנכרון ספר הכתובות לשרת"),
("synced_peer_readded_tip", "המכשירים שהיו נוכחים בסשנים האחרונים יסונכרנו בחזרה לספר הכתובות."),
("push_ab_failed_tip", "נכשל סנכרון ספר הכתובות עם השרת"),
("synced_peer_readded_tip", "המכשירים שהיו נוכחים בהפעלות האחרונות יסונכרנו בחזרה לספר הכתובות."),
("Change Color", "שנה צבע"),
("Primary Color", "צבע עיקרי"),
("HSV Color", "צבע HSV"),
@ -535,20 +535,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Installation failed!", "התקנה נכשלה!"),
("Reverse mouse wheel", "הפוך כיוון גלגלת העכבר"),
("{} sessions", "{} הפעלות"),
("scam_title", "ייתכן שאתה נפלת להונאה!"),
("scam_title", "ייתכן שנפלת להונאה!"),
("scam_text1", "אם אתה בשיחת טלפון עם מישהו שאינך מכיר ואינך סומך עליו שביקש ממך להשתמש ב-RustDesk ולהתחיל את השירות, אל תמשיך ונתק מיד."),
("scam_text2", "סביר להניח שמדובר בהונאה שמנסה לגנוב ממך כסף או מידע פרטי אחר."),
("Don't show again", "אל תראה שוב"),
("I Agree", "אני מסכים"),
("Decline", "דחה"),
("Timeout in minutes", "משך זמן עד התנתקות (בדקות)"),
("auto_disconnect_option_tip", "סגור באופן אוטומטי סשנים נכנסים במקרה של חוסר פעילות של המשתמש"),
("auto_disconnect_option_tip", "סגור באופן אוטומטי הפעלות נכנסות במקרה של חוסר פעילות של המשתמש"),
("Connection failed due to inactivity", "התנתקות אוטומטית בגלל חוסר פעילות"),
("Check for software update on startup", "בדוק עדכוני תוכנה בעת ההפעלה"),
("Check for software update on startup", "בדוק עדכונים עם ההפעלה"),
("upgrade_rustdesk_server_pro_to_{}_tip", "אנא שדרג את RustDesk Server Pro לגרסה {} או חדשה יותר!"),
("pull_group_failed_tip", "נכשל ברענון קבוצה"),
("pull_group_failed_tip", "נכשל ברענון הקבוצה"),
("Filter by intersection", "סנן לפי חיתוך"),
("Remove wallpaper during incoming sessions", "הסר טפט במהלך הפעלות נכנסות"),
("Remove wallpaper during incoming sessions", "הסר רקע שולחן עבודה במהלך הפעלות נכנסות"),
("Test", "בדיקה"),
("display_is_plugged_out_msg", "המסך הופסק, החלף למסך הראשון."),
("No displays", "אין מסכים"),
@ -557,10 +557,10 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use all my displays for the remote session", "השתמש בכל המסכים שלי עבור ההפעלה המרוחקת"),
("selinux_tip", "SELinux מופעל במכשיר שלך, מה שעלול למנוע מ-RustDesk לפעול כראוי כצד הנשלט."),
("Change view", "שנה תצוגה"),
("Big tiles", "כותרות גדולות"),
("Small tiles", "כותרות קטנות"),
("Big tiles", "אריחים גדולים"),
("Small tiles", "אריחים קטנים"),
("List", "רשימה"),
("Virtual display", "מסכים ווירטואלים"),
("Virtual display", "מסך וירטואלי"),
("Plug out all", "נתק הכל"),
("True color (4:4:4)", "צבע מדויק (4:4:4)"),
("Enable blocking user input", "אפשר חסימת קלט משתמש"),
@ -569,24 +569,24 @@ 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_under_win10_2004_tip", "נהג התצוגה העקיף אינו נתמך. נדרשת גרסת Windows 10, גרסה 2004 או חדשה יותר."),
("idd_not_support_under_win10_2004_tip", "מנהל התצוגה העקיף אינו נתמך. נדרשת גרסת Windows 10, גרסה 2004 או חדשה יותר."),
("input_source_1_tip", "מקור קלט 1"),
("input_source_2_tip", "מקור קלט 2"),
("Swap control-command key", "החלף בין Control ל־Command"),
("swap-left-right-mouse", "החלף בין כפתור העכבר השמאלי לימני"),
("Swap control-command key", "החלף בין המקשים Control ו־Command"),
("swap-left-right-mouse", "החלף בין לחצן שמאלי וימני בעכבר"),
("2FA code", "קוד אימות דו-שלבי"),
("More", "עוד"),
("enable-2fa-title", "הפעל אימות דו-שלבי"),
("enable-2fa-desc", "אנא הגדר כעת את האפליקציה שלך לאימות. תוכל להשתמש באפליקציית אימות כגון Authy, Microsoft או Google Authenticator בטלפון או במחשב שלך.\n\nסרוק את קוד ה-QR עם האפליקציה שלך והזן את הקוד שהאפליקציה מציגה כדי להפעיל את אימות הדו-שלבי."),
("wrong-2fa-code", "לא ניתן לאמת את הקוד. בדוק שהקוד והגדרות הזמן המקומיות נכונות"),
("wrong-2fa-code", "קוד שגוי. בדוק את הקוד ואת הגדרות השעה במכשיר"),
("enter-2fa-title", "אימות דו-שלבי"),
("Email verification code must be 6 characters.", "קוד אימות במייל חייב להיות באורך של 6 תווים."),
("2FA code must be 6 digits.", "קוד אימות דו-שלבי חייב להיות באורך של 6 מספרים."),
("Multiple Windows sessions found", "נמצאו מספר הפעלות Windows"),
("Please select the session you want to connect to", "אנא בחר את ההפעלה שברצונך להתחבר אליה"),
("powered_by_me", "מופעל על ידי"),
("powered_by_me", "מופעל דרכי"),
("outgoing_only_desk_tip", "זוהי מהדורה מותאמת אישית.\nניתן להתחבר למכשירים אחרים, אך מכשירים אחרים לא יכולים להתחבר אליך."),
("preset_password_warning", "שים לב: שימוש בסיסמה קבועה עלול להקטין את רמת האבטחה"),
("preset_password_warning", "שימו לב: שימוש בסיסמה קבועה עלול להפחית את רמת האבטחה"),
("Security Alert", "התראת אבטחה"),
("My address book", "ספר הכתובות שלי"),
("Personal", "אישי"),
@ -607,9 +607,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("no_audio_input_device_tip", "לא נמצא מכשיר קלט שמע"),
("Incoming", "נכנס"),
("Outgoing", "יוצא"),
("Clear Wayland screen selection", ""),
("clear_Wayland_screen_selection_tip", ""),
("confirm_clear_Wayland_screen_selection_tip", ""),
("Clear Wayland screen selection", "נקה את בחירת המסך ב־Wayland"),
("clear_Wayland_screen_selection_tip", "נקה את בחירת המסך שנשמרה בעת שימוש ב־Wayland"),
("confirm_clear_Wayland_screen_selection_tip", "האם אתה בטוח שברצונך לנקות את בחירת המסך עבור Wayland?"),
("android_new_voice_call_tip", "בקשת שיחת קול חדשה התקבלה"),
("texture_render_tip", "השתמש בטכניקת עיבוד מבוססת טקסטורות (ייתכן שיגדיל את הביצועים)"),
("Use texture rendering", "השתמש בעיבוד טקסטורה"),
@ -618,7 +618,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Keep screen on", "השאר מסך דולק"),
("Never", "אף פעם"),
("During controlled", "בזמן שליטה"),
("During service is on", "בזמן שהשירות מופעל"),
("During service is on", "כאשר השירות פעיל"),
("Capture screen using DirectX", "לכוד מסך באמצעות DirectX"),
("Back", "חזור"),
("Apps", "אפליקציות"),
@ -627,21 +627,21 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Power", "הפעלה"),
("Telegram bot", "בוט טלגרם"),
("enable-bot-tip", "אפשר שליטה או קבלת התראות דרך בוט טלגרם"),
("enable-bot-desc", "אפשרות זו תאפשר לבוט טלגרם לבצע פעולות או לשלוח התראות הקשורות לחשבונך"),
("cancel-2fa-confirm-tip", "האם אתה בטוח שברצונך לבטל את אימות שני השלבים?"),
("enable-bot-desc", "אפשרות זו תאפשר לבוט טלגרם לבצע פעולות או לשלוח התראות עבור חשבונך"),
("cancel-2fa-confirm-tip", "האם אתה בטוח שברצונך לבטל את האימות הדו-שלבי?"),
("cancel-bot-confirm-tip", "האם אתה בטוח שברצונך לבטל את קישור הבוט?"),
("About RustDesk", "אודות RustDesk"),
("Send clipboard keystrokes", "שלח הקשות לוח גזירים"),
("network_error_tip", "אירעה שגיאת רשת. אנא בדוק את החיבור שלך ונסה שוב."),
("Unlock with PIN", "שחרר עם PIN"),
("Unlock with PIN", "פתח באמצעות קוד PIN"),
("Requires at least {} characters", "נדרשים לפחות {} תווים"),
("Wrong PIN", "PIN שגוי"),
("Set PIN", "הגדר PIN"),
("Enable trusted devices", "אפשר מכשירים מהימנים"),
("Enable trusted devices", "אפשר גישה ממכשירים מהימנים"),
("Manage trusted devices", "נהל מכשירים מהימנים"),
("Platform", "פלטורמה"),
("Platform", "פלטפורמה"),
("Days remaining", "ימים שנשארו"),
("enable-trusted-devices-tip", "אפשר גישה אוטומטית ממכשירים שסומנו כמהימנים בעבר"),
("enable-trusted-devices-tip", "אפשר גישה אוטומטית ממכשירים שסומנו כמהימנים"),
("Parent directory", "תיקיית אב"),
("Resume", "המשך"),
("Invalid file name", "שם קובץ אינו תקין"),
@ -650,14 +650,14 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Authenticate", "הזדהה"),
("web_id_input_tip", "הזן את מזהה ההתחברות או כתובת דומיין להתחברות דרך הדפדפן"),
("Download", "הורדה"),
("Upload folder", "העלה תקייה"),
("Upload folder", "העלה תיקיה"),
("Upload files", "העלה קבצים"),
("Clipboard is synchronized", "לוח הגזירים סונכרן"),
("Update client clipboard", "עדכן את לוח הגזירים של הלקוח"),
("Untagged", "לא מתוייג"),
("new-version-of-{}-tip", "גרסה חדשה של {} זמינה"),
("Accessible devices", "מכשירים נגישים"),
("View camera", "צפה במצלמה"),
("View camera", "הצג מצלמה"),
("upgrade_remote_rustdesk_client_to_{}_tip", "אנא שדרג את לקוח RustDesk לגרסה {} או חדשה יותר בצד המרוחק!"),
("view_camera_unsupported_tip", "הצגת מצלמה אינה נתמכת במכשיר המרוחק"),
("Enable camera", "הפעל מצלמה"),
@ -677,12 +677,12 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("use-the-selected-printer-tip", "השתמש במדפסת שנבחרה מתוך הרשימה"),
("auto-print-tip", "הדפס אוטומטית עבודות הדפסה נכנסות ללא אישור נוסף"),
("print-incoming-job-confirm-tip", "האם ברצונך להדפיס את עבודת ההדפסה הנכנסת?"),
("remote-printing-disallowed-tile-tip", "הדפסה מרחוק אסורה"),
("remote-printing-disallowed-tile-tip", "לא ניתן להדפיס מרחוק"),
("remote-printing-disallowed-text-tip", "המכשיר המרוחק אינו מאפשר הדפסה מרחוק"),
("save-settings-tip", "שמור את ההגדרות להבא"),
("dont-show-again-tip", "אל תציג שוב"),
("Take screenshot", "צלם צילום מסך"),
("Taking screenshot", "לוכד צילום מסך"),
("Taking screenshot", "מצלם צילום מסך"),
("screenshot-merged-screen-not-supported-tip", "צילום מסך משולב מכל המסכים אינו נתמך"),
("screenshot-action-tip", "בחר פעולה לאחר צילום המסך"),
("Save as", "שמור בשם"),
@ -693,10 +693,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("{}-to-update-tip", "קיימת גרסה חדשה של {} מומלץ לעדכן"),
("download-new-version-failed-tip", "נכשל בהורדת הגרסה החדשה"),
("Auto update", "עדכון אוטומטי"),
("update-failed-check-msi-tip", "העדכון נכשל בדוק אם קובץ ה־MSI עדיין מותקן או הוסר"),
("update-failed-check-msi-tip", "העדכון נכשל בדוק אם קובץ ה־MSI מותקן או הוסר"),
("websocket_tip", "אפשר שימוש בפרוטוקול WebSocket לחיבורים"),
("Use WebSocket", "השתמש ב־WebSocket"),
("Trackpad speed", "מהירות משטח מגע"),
("Default trackpad speed", "מהירות ברירת מחדל של משטח מגע"),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", "WebSocket használata"),
("Trackpad speed", "Érintőpad sebessége"),
("Default trackpad speed", "Alapértelmezett érintőpad sebessége"),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", "Usa WebSocket"),
("Trackpad speed", "Velocità trackpad"),
("Default trackpad speed", "Velocità predefinita trackpad"),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", "웹소켓 사용"),
("Trackpad speed", "트랙패드 속도"),
("Default trackpad speed", "기본 트랙패드 속도"),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", "Lietot WebSocket"),
("Trackpad speed", "Skārienpaliktņa ātrums"),
("Default trackpad speed", "Noklusējuma skārienpaliktņa ātrums"),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", "Gebruik het WebSocketprotocol"),
("Trackpad speed", "Snelheid Trackpad"),
("Default trackpad speed", "Standaardsnelheid Trackpad"),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", "Использовать WebSocket"),
("Trackpad speed", "Скорость трекпада"),
("Default trackpad speed", "Скорость трекпада по умолчанию"),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", "使用 WebSocket"),
("Trackpad speed", "觸控板速度"),
("Default trackpad speed", "預設觸控板速度"),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -698,5 +698,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Use WebSocket", ""),
("Trackpad speed", ""),
("Default trackpad speed", ""),
("Numeric one-time password", ""),
].iter().cloned().collect();
}

View File

@ -1016,7 +1016,7 @@ mod desktop {
pub sid: String,
pub username: String,
pub uid: String,
pub protocal: String,
pub protocol: String,
pub display: String,
pub xauth: String,
pub home: String,
@ -1027,12 +1027,12 @@ mod desktop {
impl Desktop {
#[inline]
pub fn is_wayland(&self) -> bool {
self.protocal == DISPLAY_SERVER_WAYLAND
self.protocol == DISPLAY_SERVER_WAYLAND
}
#[inline]
pub fn is_login_wayland(&self) -> bool {
super::is_gdm_user(&self.username) && self.protocal == DISPLAY_SERVER_WAYLAND
super::is_gdm_user(&self.username) && self.protocol == DISPLAY_SERVER_WAYLAND
}
#[inline]
@ -1271,7 +1271,7 @@ mod desktop {
self.sid = seat0_values[0].clone();
self.uid = seat0_values[1].clone();
self.username = seat0_values[2].clone();
self.protocal = get_display_server_of_session(&self.sid).into();
self.protocol = get_display_server_of_session(&self.sid).into();
if self.is_login_wayland() {
self.display = "".to_owned();
self.xauth = "".to_owned();

View File

@ -153,8 +153,28 @@ size_t bitDepth(CGDisplayModeRef mode) {
return depth;
}
static bool isHiDPIMode(CGDisplayModeRef mode) {
// Check if the mode is HiDPI by comparing pixel width to width
// If pixel width is greater than width, it's a HiDPI mode
return CGDisplayModeGetPixelWidth(mode) > CGDisplayModeGetWidth(mode);
}
CFArrayRef getAllModes(CGDirectDisplayID display) {
// Create options dictionary to include HiDPI modes
CFMutableDictionaryRef options = CFDictionaryCreateMutable(
kCFAllocatorDefault,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
// Include HiDPI modes
CFDictionarySetValue(options, kCGDisplayShowDuplicateLowResolutionModes, kCFBooleanTrue);
CFArrayRef allModes = CGDisplayCopyAllDisplayModes(display, options);
CFRelease(options);
return allModes;
}
extern "C" bool MacGetModeNum(CGDirectDisplayID display, uint32_t *numModes) {
CFArrayRef allModes = CGDisplayCopyAllDisplayModes(display, NULL);
CFArrayRef allModes = getAllModes(display);
if (allModes == NULL) {
return false;
}
@ -163,12 +183,12 @@ extern "C" bool MacGetModeNum(CGDirectDisplayID display, uint32_t *numModes) {
return true;
}
extern "C" bool MacGetModes(CGDirectDisplayID display, uint32_t *widths, uint32_t *heights, uint32_t max, uint32_t *numModes) {
extern "C" bool MacGetModes(CGDirectDisplayID display, uint32_t *widths, uint32_t *heights, bool *hidpis, uint32_t max, uint32_t *numModes) {
CGDisplayModeRef currentMode = CGDisplayCopyDisplayMode(display);
if (currentMode == NULL) {
return false;
}
CFArrayRef allModes = CGDisplayCopyAllDisplayModes(display, NULL);
CFArrayRef allModes = getAllModes(display);
if (allModes == NULL) {
CGDisplayModeRelease(currentMode);
return false;
@ -181,6 +201,7 @@ extern "C" bool MacGetModes(CGDirectDisplayID display, uint32_t *widths, uint32_
bitDepth(currentMode) == bitDepth(mode)) {
widths[realNum] = (uint32_t)CGDisplayModeGetWidth(mode);
heights[realNum] = (uint32_t)CGDisplayModeGetHeight(mode);
hidpis[realNum] = isHiDPIMode(mode);
realNum++;
}
}
@ -201,7 +222,6 @@ extern "C" bool MacGetMode(CGDirectDisplayID display, uint32_t *width, uint32_t
return true;
}
static bool setDisplayToMode(CGDirectDisplayID display, CGDisplayModeRef mode) {
CGError rc;
CGDisplayConfigRef config;
@ -220,29 +240,54 @@ static bool setDisplayToMode(CGDirectDisplayID display, CGDisplayModeRef mode) {
return true;
}
extern "C" bool MacSetMode(CGDirectDisplayID display, uint32_t width, uint32_t height)
// Set the display to a specific mode based on width and height.
// Returns true if the display mode was successfully changed, false otherwise.
// If no such mode is available, it will not change the display mode.
//
// If `tryHiDPI` is true, it will try to set the display to a HiDPI mode if available.
// If no HiDPI mode is available, it will fall back to a non-HiDPI mode with the same resolution.
// If `tryHiDPI` is false, it sets the display to the first mode with the same resolution, no matter if it's HiDPI or not.
extern "C" bool MacSetMode(CGDirectDisplayID display, uint32_t width, uint32_t height, bool tryHiDPI)
{
bool ret = false;
CGDisplayModeRef currentMode = CGDisplayCopyDisplayMode(display);
if (currentMode == NULL) {
return ret;
}
CFArrayRef allModes = CGDisplayCopyAllDisplayModes(display, NULL);
CFArrayRef allModes = getAllModes(display);
if (allModes == NULL) {
CGDisplayModeRelease(currentMode);
return ret;
}
int numModes = CFArrayGetCount(allModes);
CGDisplayModeRef preferredHiDPIMode = NULL;
CGDisplayModeRef fallbackMode = NULL;
for (int i = 0; i < numModes; i++) {
CGDisplayModeRef mode = (CGDisplayModeRef)CFArrayGetValueAtIndex(allModes, i);
if (width == CGDisplayModeGetWidth(mode) &&
height == CGDisplayModeGetHeight(mode) &&
CGDisplayModeGetRefreshRate(currentMode) == CGDisplayModeGetRefreshRate(mode) &&
bitDepth(currentMode) == bitDepth(mode)) {
ret = setDisplayToMode(display, mode);
if (isHiDPIMode(mode)) {
preferredHiDPIMode = mode;
break;
} else {
fallbackMode = mode;
if (!tryHiDPI) {
break;
}
}
}
}
if (preferredHiDPIMode) {
ret = setDisplayToMode(display, preferredHiDPIMode);
} else if (fallbackMode) {
ret = setDisplayToMode(display, fallbackMode);
}
CGDisplayModeRelease(currentMode);
CFRelease(allModes);
return ret;

View File

@ -54,12 +54,13 @@ extern "C" {
display: u32,
widths: *mut u32,
heights: *mut u32,
hidpis: *mut BOOL,
max: u32,
numModes: *mut u32,
) -> BOOL;
fn majorVersion() -> u32;
fn MacGetMode(display: u32, width: *mut u32, height: *mut u32) -> BOOL;
fn MacSetMode(display: u32, width: u32, height: u32) -> BOOL;
fn MacSetMode(display: u32, width: u32, height: u32, tryHiDPI: bool) -> BOOL;
}
pub fn major_version() -> u32 {
@ -889,33 +890,62 @@ pub fn handle_application_should_open_untitled_file() {
}
}
/// Get all resolutions of the display. The resolutions are:
/// 1. Sorted by width and height in descending order, with duplicates removed.
/// 2. Filtered out if the width is less than 800 (800x600) if there are too many (e.g., >15).
/// 3. Contain HiDPI resolutions and the real resolutions.
///
/// We don't need to distinguish between HiDPI and real resolutions.
/// When the controlling side changes the resolution, it will call `change_resolution_directly()`.
/// `change_resolution_directly()` will try to use the HiDPI resolution first.
/// This is how teamviewer does it for now.
///
/// If we need to distinguish HiDPI and real resolutions, we can add a flag to the `Resolution` struct.
pub fn resolutions(name: &str) -> Vec<Resolution> {
let mut v = vec![];
if let Ok(display) = name.parse::<u32>() {
let mut num = 0;
unsafe {
if YES == MacGetModeNum(display, &mut num) {
let (mut widths, mut heights) = (vec![0; num as _], vec![0; num as _]);
let (mut widths, mut heights, mut _hidpis) =
(vec![0; num as _], vec![0; num as _], vec![NO; num as _]);
let mut real_num = 0;
if YES
== MacGetModes(
display,
widths.as_mut_ptr(),
heights.as_mut_ptr(),
_hidpis.as_mut_ptr(),
num,
&mut real_num,
)
{
if real_num <= num {
for i in 0..real_num {
let resolution = Resolution {
v = (0..real_num)
.map(|i| Resolution {
width: widths[i as usize] as _,
height: heights[i as usize] as _,
..Default::default()
};
if !v.contains(&resolution) {
v.push(resolution);
})
.collect::<Vec<_>>();
// Sort by (w, h), desc
v.sort_by(|a, b| {
if a.width == b.width {
b.height.cmp(&a.height)
} else {
b.width.cmp(&a.width)
}
});
// Remove duplicates
v.dedup_by(|a, b| a.width == b.width && a.height == b.height);
// Filter out the ones that are less than width 800 (800x600) if there are too many.
// We can also do this filtering on the client side, but it is better not to change the client side to reduce the impact.
if v.len() > 15 {
// Most width > 800, so it's ok to remove the small ones.
v.retain(|r| r.width >= 800);
}
if v.len() > 15 {
// Ignore if the length is still too long.
}
}
}
@ -943,7 +973,7 @@ pub fn current_resolution(name: &str) -> ResultType<Resolution> {
pub fn change_resolution_directly(name: &str, width: usize, height: usize) -> ResultType<()> {
let display = name.parse::<u32>().map_err(|e| anyhow!(e))?;
unsafe {
if NO == MacSetMode(display, width as _, height as _) {
if NO == MacSetMode(display, width as _, height as _, true) {
bail!("MacSetMode failed");
}
}

View File

@ -1379,7 +1379,7 @@ impl Connection {
}
#[cfg(not(any(target_os = "android", target_os = "ios")))]
if self.file_transfer.is_some() {
if crate::platform::is_prelogin() || self.tx_to_cm.send(ipc::Data::Test).is_err() {
if crate::platform::is_prelogin() { // }|| self.tx_to_cm.send(ipc::Data::Test).is_err() {
username = "".to_owned();
}
}
@ -3093,10 +3093,18 @@ impl Connection {
if virtual_display_manager::amyuni_idd::is_my_display(&name) {
record_changed = false;
}
#[cfg(not(target_os = "macos"))]
let scale = 1.0;
#[cfg(target_os = "macos")]
let scale = display.scale();
let original = (
((display.width() as f64) / scale).round() as _,
(display.height() as f64 / scale).round() as _,
);
if record_changed {
display_service::set_last_changed_resolution(
&name,
(display.width() as _, display.height() as _),
original,
(r.width, r.height),
);
}
@ -4424,7 +4432,7 @@ mod raii {
*WALLPAPER_REMOVER.lock().unwrap() = None;
}
#[cfg(not(any(target_os = "android", target_os = "ios")))]
display_service::reset_resolutions();
display_service::restore_resolutions();
#[cfg(windows)]
let _ = virtual_display_manager::reset_all();
#[cfg(target_os = "linux")]

View File

@ -133,12 +133,13 @@ pub fn set_last_changed_resolution(display_name: &str, original: (i32, i32), cha
#[inline]
#[cfg(not(any(target_os = "android", target_os = "ios")))]
pub fn reset_resolutions() {
pub fn restore_resolutions() {
for (name, res) in CHANGED_RESOLUTIONS.read().unwrap().iter() {
let (w, h) = res.original;
log::info!("Restore resolution of display '{}' to ({}, {})", name, w, h);
if let Err(e) = crate::platform::change_resolution(name, w as _, h as _) {
log::error!(
"Failed to reset resolution of display '{}' to ({},{}): {}",
"Failed to restore resolution of display '{}' to ({},{}): {}",
name,
w,
h,
@ -146,7 +147,7 @@ pub fn reset_resolutions() {
);
}
}
// Can be cleared because reset resolutions is called when there is no client connected.
// Can be cleared because restore resolutions is called when there is no client connected.
CHANGED_RESOLUTIONS.write().unwrap().clear();
}
@ -404,7 +405,6 @@ fn no_displays(displays: &Vec<Display>) -> bool {
}
}
#[inline]
#[cfg(not(windows))]
pub fn try_get_displays() -> ResultType<Vec<Display>> {