webrtc: fix race edge cases that discard or mislabel a direct connection

Three correctness fixes in the transport race, plus three convention
cleanups.

- race_transports_prefer_webrtc committed a relayed result while a direct
  attempt was still in flight: the others arm returned on
  webrtc_fut.is_none() even with an unfinished direct future, and the
  WebRTC-error arm returned a held relay without checking others_fut. A
  relay is now committed only when nothing direct can still arrive (or
  the window expires); a parked relay is also preferred over composing
  an error when both sides fail. Three regression tests, mutation-checked.

- connect()'s plain select_ok let a TURN-relayed WebRTC win as "first
  success", dropping still-racing UDP/IPv6 direct attempts and reporting
  the relayed pair as direct. It now runs through the same prefer-P2P
  race with each attempt carrying whether its path is direct, and the
  WebRTC future resolves is_relayed() so a TURN win is held behind
  direct attempts, not committed as one.

- The RelayResponse path kept direct == true when a WebRTC win's DTLS
  handshake failed and it fell back to relay, so the relay was reported
  P2P. Clear the flag with the transport switch.

- Trim the OffererGuard doc to the three-line max; move the new
  enable-webrtc localization key to the end of every lang list; the KCP
  option constant moved to hbb_common config::keys (0f663aa).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ExUfAkYbq8UC9pQCiLy8TQ
This commit is contained in:
rustdesk
2026-08-10 18:56:00 +08:00
parent cf9c94a677
commit 2786d12a28
53 changed files with 188 additions and 107 deletions

View File

@@ -175,14 +175,9 @@ pub fn get_key_state(key: enigo::Key) -> bool {
ENIGO.lock().unwrap().get_key_state(key)
}
/// RAII guard for a WebRTC offerer that has not yet been adopted into a connection.
///
/// The offerer's `RTCPeerConnection` is created eagerly in `Client::start` and inserted into the
/// global `SESSIONS` map; if it never receives a remote answer it stays in ICE state `New`
/// forever, so its state-change handler never fires and it never self-removes. This guard closes
/// the pc on drop, covering the paths that would otherwise leak it: early `?`/`bail!` returns in
/// `_start_inner`, and `select_ok` cancelling the racing attempt that holds the offerer. Call
/// [`OffererGuard::into_inner`] to disarm when the stream is adopted into a live connection.
/// Closes an unadopted WebRTC offerer's pc on drop. Without an answer it stays in ICE `New`
/// forever, so its state handler never fires to self-remove it from `SESSIONS`; this covers the
/// early returns and cancelled races that would leak it. `into_inner` disarms on adoption.
struct OffererGuard(Option<WebRTCStream>);
impl OffererGuard {
@@ -254,8 +249,12 @@ async fn race_transports_prefer_webrtc<'a, T: 'a>(
}
}
Err(e) => {
if let Some(conn) = held.take() {
return Ok(conn);
// Commit a held relay only when nothing direct is still racing; otherwise
// keep it and let the survivor (or the window) decide.
if others_fut.is_none() {
if let Some(conn) = held.take() {
return Ok(conn);
}
}
match others_err.take() {
Some(oe) => bail!("WebRTC failed: {}; fallback failed: {}", e, oe),
@@ -274,11 +273,15 @@ async fn race_transports_prefer_webrtc<'a, T: 'a>(
others_fut = None;
match res {
Ok((conn, unfinished)) => {
if is_p2p(&conn) || webrtc_fut.is_none() {
if is_p2p(&conn) {
return Ok(conn);
}
// Relayed: commit now only if nothing direct can still arrive. If a
// direct attempt is still in flight (here or in `unfinished`), hold it
// and keep racing for the preference window instead of discarding them.
if webrtc_fut.is_none() && unfinished.is_empty() {
return Ok(conn);
}
// Hold the first relay, but keep polling unfinished alternatives: an IPv6
// direct attempt may complete inside the same WebRTC preference window.
if held.is_none() {
held = Some(conn);
window.as_mut().reset(
@@ -291,15 +294,16 @@ async fn race_transports_prefer_webrtc<'a, T: 'a>(
}
}
Err(e) => match webrtc_err.take() {
Some(we) => bail!("WebRTC failed: {}; fallback failed: {}", we, e),
None if webrtc_fut.is_none() => {
// The preferred branch may have parked a relay here; nothing else can
// win now, so commit it rather than failing the connection.
match held.take() {
Some(conn) => return Ok(conn),
None => return Err(e),
}
}
// Nothing more can win, but a parked relay is still a valid outcome — take
// it before failing the connection.
Some(we) => match held.take() {
Some(conn) => return Ok(conn),
None => bail!("WebRTC failed: {}; fallback failed: {}", we, e),
},
None if webrtc_fut.is_none() => match held.take() {
Some(conn) => return Ok(conn),
None => return Err(e),
},
None => others_err = Some(e),
},
}
@@ -1066,7 +1070,7 @@ impl Client {
}
// The ? / secure_connection failures below return early; webrtc_guard stays
// in scope and closes the offerer on any such exit (loss, error, cancellation).
let (mut conn, kcp, mut typ, direct) = race_result?;
let (mut conn, kcp, mut typ, mut direct) = race_result?;
feedback = rr.feedback;
log::info!("{:?} used to establish {typ} connection", start.elapsed());
let pk = match Self::secure_connection(
@@ -1116,6 +1120,10 @@ impl Client {
.await?;
conn = relay_conn;
typ = if use_ws() { "WebSocket" } else { "Relay" };
// The transport is now a relay: the WebRTC win it replaced must
// not carry its direct flag into the return, or the relay is
// reported P2P and the outer race treats it as one.
direct = false;
pk
}
Err(e) => return Err(e),
@@ -1331,50 +1339,81 @@ impl Client {
log::info!("peer address: {}, timeout: {}", peer, connect_timeout);
let start = std::time::Instant::now();
let mut connect_futures = Vec::new();
// Each attempt carries whether its path is direct (4th field). TCP/UDP/IPv6 punch are
// always direct; WebRTC is direct only when ICE nominated a non-TURN pair.
let mut direct_futures = Vec::new();
if allow_tcp_punch {
let fut = connect_tcp_local(peer, Some(local_addr), connect_timeout);
connect_futures.push(
direct_futures.push(
async move {
let conn = fut.await?;
Ok((conn, None, "TCP"))
Ok((conn, None, "TCP", true))
}
.boxed(),
);
}
if let Some(udp_socket_nat) = udp_socket_nat {
connect_futures.push(udp_nat_connect(udp_socket_nat, "UDP", connect_timeout).boxed());
}
if let Some(udp_socket_v6) = udp_socket_v6 {
connect_futures.push(udp_nat_connect(udp_socket_v6, "IPv6", connect_timeout).boxed());
}
// Race a clone of the offerer; the guard retains its own clone so a losing/cancelled race
// still closes the pc (select_ok drops the future's clone without closing).
if let Some(stream) = webrtc_guard.as_ref().and_then(|g| g.stream()) {
let mut raced = stream.clone();
// The punch-tuned timeout can be as low as 1s — enough for a raw TCP SYN but not for
// candidate trickle + ICE checks + DTLS. Give WebRTC its own floor (prefer-P2P) so a
// viable P2P path is not abandoned before it can complete; TCP/UDP keep the tighter
// timeout, so a working direct connection still wins the race immediately, and the
// relay fallback below only waits the extra time when direct attempts all failed.
let webrtc_timeout = connect_timeout.max(Self::WEBRTC_PREFER_WINDOW_MS);
connect_futures.push(
direct_futures.push(
async move {
raced.wait_connected(webrtc_timeout).await?;
Ok((Stream::WebRTC(raced), None, "WebRTC"))
let (conn, kcp, typ) =
udp_nat_connect(udp_socket_nat, "UDP", connect_timeout).await?;
Ok((conn, kcp, typ, true))
}
.boxed(),
);
}
// Run all connection attempts concurrently, return the first successful one
let direct_result = if connect_futures.is_empty() {
Err(anyhow!("No direct transport available"))
} else {
select_ok(connect_futures).await.map(|conn| conn.0)
if let Some(udp_socket_v6) = udp_socket_v6 {
direct_futures.push(
async move {
let (conn, kcp, typ) =
udp_nat_connect(udp_socket_v6, "IPv6", connect_timeout).await?;
Ok((conn, kcp, typ, true))
}
.boxed(),
);
}
// Race a clone of the offerer; the guard retains its own clone so a losing/cancelled race
// still closes the pc (select_ok drops the future's clone without closing).
let webrtc_fut = webrtc_guard
.as_ref()
.and_then(|g| g.stream())
.map(|stream| {
let mut raced = stream.clone();
// The punch-tuned timeout can be as low as 1s — enough for a raw TCP SYN but not
// for candidate trickle + ICE checks + DTLS. Give WebRTC its own floor (prefer-P2P)
// so a viable P2P path is not abandoned before it can complete; TCP/UDP keep the
// tighter timeout, so a working direct connection still wins immediately, and the
// relay fallback only waits the extra time when direct attempts all failed.
let webrtc_timeout = connect_timeout.max(Self::WEBRTC_PREFER_WINDOW_MS);
async move {
raced.wait_connected(webrtc_timeout).await?;
// Resolve the pair here: a TURN win is relayed, not direct, and must be held
// behind still-racing direct attempts rather than committed as P2P.
let relayed = raced.is_relayed().await.unwrap_or(true);
Ok((Stream::WebRTC(raced), None, "WebRTC", !relayed))
}
.boxed()
});
// Prefer P2P: a direct result wins outright, a relayed WebRTC (TURN) is held for the
// window so a direct punch can still land. Falls back to plain select_ok when only one
// kind is present.
let direct_result = match (webrtc_fut, direct_futures.is_empty()) {
(Some(webrtc_fut), false) => {
race_transports_prefer_webrtc(
webrtc_fut,
direct_futures,
Self::WEBRTC_PREFER_WINDOW_MS,
|r| r.3,
)
.await
}
(Some(webrtc_fut), true) => webrtc_fut.await,
(None, false) => select_ok(direct_futures).await.map(|c| c.0),
(None, true) => Err(anyhow!("No direct transport available")),
};
let (mut conn, kcp, mut typ) = match direct_result {
Ok(conn) => (Ok(conn.0), conn.1, conn.2),
Err(e) => (Err(e), None, ""),
let (mut conn, kcp, mut typ, mut direct) = match direct_result {
Ok((conn, kcp, typ, direct)) => (Ok(conn), kcp, typ, direct),
Err(e) => (Err(e), None, "", false),
};
if let Some(stop) = webrtc_bridge_stop {
let _ = stop.send(());
@@ -1382,7 +1421,6 @@ impl Client {
// webrtc_guard stays armed across the relay override and secure_connection below; it is
// disarmed only at the successful return when WebRTC is the kept transport.
let mut direct = !conn.is_err();
// Keep a WebRTC win instead of replacing it with the RustDesk relay: under relay-by-
// policy the pc was built with Relay-only ICE (TURN configured), which already honors
// the relay requirement, and under ws-forced relay a direct full-ICE connection is the
@@ -5328,6 +5366,51 @@ mod webrtc_race_tests {
assert!(start.elapsed() < Duration::from_secs(5));
}
// WebRTC fails first (others still racing), then a relay arrives with a direct attempt still
// unfinished behind it. The relay must not be committed while that direct attempt can win.
#[tokio::test]
async fn relay_does_not_preempt_unfinished_direct_after_webrtc_fails() {
let got = race_transports_prefer_webrtc(
err_after(5, "webrtc dead"),
vec![ok_after(10, "relay"), ok_after(100, "ipv6")],
60_000,
|t| *t == "ipv6",
)
.await
.unwrap();
assert_eq!(got, "ipv6");
}
// A relay is held with a direct attempt racing behind it, then WebRTC fails. The held relay
// must not be committed while the direct attempt is still in flight.
#[tokio::test]
async fn held_relay_waits_for_racing_direct_when_webrtc_fails() {
let got = race_transports_prefer_webrtc(
err_after(50, "webrtc dead"),
vec![ok_after(10, "relay"), ok_after(100, "ipv6")],
60_000,
|t| *t == "ipv6",
)
.await
.unwrap();
assert_eq!(got, "ipv6");
}
// Both attempts error, but a relay was parked before they did — it is the outcome, not a
// composed error.
#[tokio::test]
async fn held_relay_survives_both_errors() {
let got = race_transports_prefer_webrtc(
err_after(50, "webrtc dead"),
vec![ok_after(10, "relay"), err_after(100, "ipv6 dead")],
60_000,
|t| *t == "ipv6",
)
.await
.unwrap();
assert_eq!(got, "relay");
}
#[tokio::test]
async fn held_relay_committed_when_window_expires() {
let start = Instant::now();

View File

@@ -2452,8 +2452,6 @@ pub fn is_udp_disabled() -> bool {
Config::get_option(keys::OPTION_DISABLE_UDP) == "Y"
}
pub const OPTION_ENABLE_KCP_CC: &str = "enable-kcp-congestion-control";
/// Run KCP with its congestion window (nc=0) instead of the turbo profile it has always shipped.
///
/// Opt-in: which profile wins depends on why packets are lost — nc=1 deepens real congestion,
@@ -2461,7 +2459,7 @@ pub const OPTION_ENABLE_KCP_CC: &str = "enable-kcp-congestion-control";
/// without a shaped link, so keep what users run today.
#[inline]
pub fn get_kcp_cc_enabled() -> bool {
Config::get_option(OPTION_ENABLE_KCP_CC) == "Y"
Config::get_option(keys::OPTION_ENABLE_KCP_CC) == "Y"
}
// this crate https://github.com/yoshd/stun-client supports nat type

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "سرعة لوحة التتبع الافتراضية"),
("Numeric one-time password", "كلمة مرور رقمية لمرة واحدة"),
("Enable IPv6 P2P connection", "تمكين اتصال نظير إلى نظير عبر IPv6"),
("Enable WebRTC P2P connection", "تمكين اتصال نظير إلى نظير عبر WebRTC"),
("Enable UDP hole punching", "تمكين تقنية حفر الثغرات عبر UDP"),
("View camera", "عرض الكاميرا"),
("Enable camera", "تمكين الكاميرا"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "قفل اللوحة"),
("Sync clipboard between sessions", "مزامنة الحافظة بين الجلسات"),
("sync-clipboard-between-sessions-tip", "النص أو الصور المنسوخة في جلسة بعيدة واحدة تُرسَل أيضًا إلى حافظة جلساتك المتصلة الأخرى."),
("Enable WebRTC P2P connection", "تمكين اتصال نظير إلى نظير عبر WebRTC"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Стандартная хуткасць трэкпада"),
("Numeric one-time password", "Лічбавы аднаразовы пароль"),
("Enable IPv6 P2P connection", "Выкарыстоўваць падключэнне IPv6 P2P"),
("Enable WebRTC P2P connection", "Выкарыстоўваць падключэнне WebRTC P2P"),
("Enable UDP hole punching", "Выкарыстоўваць UDP hole punching"),
("View camera", "Рэжым камеры"),
("Enable camera", "Уключыць камеру"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Заблакіраваць палатно"),
("Sync clipboard between sessions", "Сінхранізаваць буфер абмену паміж сеансамі"),
("sync-clipboard-between-sessions-tip", "Тэкст або відарысы, скапіяваныя ў адным аддаленым сеансе, таксама адпраўляюцца ў буфер абмену іншых вашых падключаных сеансаў."),
("Enable WebRTC P2P connection", "Выкарыстоўваць падключэнне WebRTC P2P"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Скорост на тъчпада по подразбиране"),
("Numeric one-time password", "Цифрова еднократна парола"),
("Enable IPv6 P2P connection", "Позволяване на IPv6 P2P връзка"),
("Enable WebRTC P2P connection", "Позволяване на WebRTC P2P връзка"),
("Enable UDP hole punching", "Позволяване на UDP hole punching"),
("View camera", "Преглед на камерата"),
("Enable camera", "Позволяване на камерата"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Заключване на платното"),
("Sync clipboard between sessions", "Синхронизиране на клипборда между сесиите"),
("sync-clipboard-between-sessions-tip", "Текст или изображения, копирани в една отдалечена сесия, се изпращат и към клипборда на другите ви свързани сесии."),
("Enable WebRTC P2P connection", "Позволяване на WebRTC P2P връзка"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Velocitat per defecte del trackpad"),
("Numeric one-time password", "Contrasenya numèrica d'un sol ús"),
("Enable IPv6 P2P connection", "Habilita la connexió IPv6 P2P"),
("Enable WebRTC P2P connection", "Habilita la connexió WebRTC P2P"),
("Enable UDP hole punching", "Activa la perforació UDP"),
("View camera", "Mostra la càmera"),
("Enable camera", "Habilita la càmera"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Bloca el llenç"),
("Sync clipboard between sessions", "Sincronitza el porta-retalls entre sessions"),
("sync-clipboard-between-sessions-tip", "El text o les imatges copiats en una sessió remota també s'envien al porta-retalls de les altres sessions connectades."),
("Enable WebRTC P2P connection", "Habilita la connexió WebRTC P2P"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "默认触控板速度"),
("Numeric one-time password", "一次性密码为数字"),
("Enable IPv6 P2P connection", "启用 IPv6 P2P 连接"),
("Enable WebRTC P2P connection", "启用 WebRTC P2P 连接"),
("Enable UDP hole punching", "启用 UDP 打洞"),
("View camera", "查看摄像头"),
("Enable camera", "允许查看摄像头"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "锁定画布"),
("Sync clipboard between sessions", "在会话间同步剪贴板"),
("sync-clipboard-between-sessions-tip", "在一个远程会话中复制的文本或图片也会发送到其他已连接会话的剪贴板。"),
("Enable WebRTC P2P connection", "启用 WebRTC P2P 连接"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Výchozí rychlost trackpadu"),
("Numeric one-time password", "Číselné jednorázové heslo"),
("Enable IPv6 P2P connection", "Povolit připojení IPv6 P2P"),
("Enable WebRTC P2P connection", "Povolit připojení WebRTC P2P"),
("Enable UDP hole punching", "Povolit UDP hole punching"),
("View camera", "Zobrazit kameru"),
("Enable camera", "Povolit kameru"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Zamknout zobrazení"),
("Sync clipboard between sessions", "Synchronizovat schránku mezi relacemi"),
("sync-clipboard-between-sessions-tip", "Text nebo obrázky zkopírované v jedné vzdálené relaci se odešlou i do schránky ostatních připojených relací."),
("Enable WebRTC P2P connection", "Povolit připojení WebRTC P2P"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Standard pegefeltshastighed"),
("Numeric one-time password", "Numerisk engangskode"),
("Enable IPv6 P2P connection", "Aktivér IPv6 P2P-forbindelse"),
("Enable WebRTC P2P connection", "Aktivér WebRTC P2P-forbindelse"),
("Enable UDP hole punching", "Aktivér UDP hole punching"),
("View camera", "Se kamera"),
("Enable camera", "Aktivér kamera"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Lås lærred"),
("Sync clipboard between sessions", "Synkroniser udklipsholder mellem sessioner"),
("sync-clipboard-between-sessions-tip", "Tekst eller billeder, der kopieres i én fjernsession, sendes også til udklipsholderen i dine andre forbundne sessioner."),
("Enable WebRTC P2P connection", "Aktivér WebRTC P2P-forbindelse"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Standardgeschwindigkeit des Trackpads"),
("Numeric one-time password", "Numerisches Einmalpasswort"),
("Enable IPv6 P2P connection", "IPv6-P2P-Verbindung aktivieren"),
("Enable WebRTC P2P connection", "WebRTC-P2P-Verbindung aktivieren"),
("Enable UDP hole punching", "UDP-Hole-Punching aktivieren"),
("View camera", "Kamera anzeigen"),
("Enable camera", "Kamera zulassen"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Sichtfeld sperren"),
("Sync clipboard between sessions", "Zwischenablage zwischen Sitzungen synchronisieren"),
("sync-clipboard-between-sessions-tip", "In einer Remote-Sitzung kopierter Text oder kopierte Bilder werden auch an die Zwischenablage Ihrer anderen verbundenen Sitzungen gesendet."),
("Enable WebRTC P2P connection", "WebRTC-P2P-Verbindung aktivieren"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Προεπιλεγμένη ταχύτητα trackpad"),
("Numeric one-time password", "Αριθμητικός κωδικός πρόσβασης μίας χρήσης"),
("Enable IPv6 P2P connection", "Ενεργοποίηση σύνδεσης IPv6 P2P"),
("Enable WebRTC P2P connection", "Ενεργοποίηση σύνδεσης WebRTC P2P"),
("Enable UDP hole punching", "Ενεργοποίηση διάτρησης οπών UDP"),
("View camera", "Προβολή κάμερας"),
("Enable camera", "Ενεργοποίηση κάμερας"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Κλείδωμα καμβά"),
("Sync clipboard between sessions", "Συγχρονισμός προχείρου μεταξύ συνεδριών"),
("sync-clipboard-between-sessions-tip", "Κείμενο ή εικόνες που αντιγράφονται σε μία απομακρυσμένη συνεδρία αποστέλλονται και στο πρόχειρο των άλλων συνδεδεμένων συνεδριών σας."),
("Enable WebRTC P2P connection", "Ενεργοποίηση σύνδεσης WebRTC P2P"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Implicita rapideco de tuŝplato"),
("Numeric one-time password", "Numera unufoja pasvorto"),
("Enable IPv6 P2P connection", "Ebligi IPv6 P2P-konekton"),
("Enable WebRTC P2P connection", "Ebligi WebRTC P2P-konekton"),
("Enable UDP hole punching", "Ebligi UDP-trapikadon"),
("View camera", "Rigardi kameron"),
("Enable camera", "Ebligi kameron"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Ŝlosi kanvason"),
("Sync clipboard between sessions", "Sinkronigi poŝon inter seancoj"),
("sync-clipboard-between-sessions-tip", "Teksto aŭ bildoj kopiitaj en unu fora seanco ankaŭ sendiĝas al la poŝo de viaj aliaj konektitaj seancoj."),
("Enable WebRTC P2P connection", "Ebligi WebRTC P2P-konekton"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Velocidad predeterminada de trackpad"),
("Numeric one-time password", "Contraseña numérica de un solo uso"),
("Enable IPv6 P2P connection", "Habilitar conexión IPv6 P2P"),
("Enable WebRTC P2P connection", "Habilitar conexión WebRTC P2P"),
("Enable UDP hole punching", "Habilitar perforación de agujero UDP"),
("View camera", "Ver cámara"),
("Enable camera", "Habilitar cámara"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Bloquear lienzo"),
("Sync clipboard between sessions", "Sincronizar portapapeles entre sesiones"),
("sync-clipboard-between-sessions-tip", "El texto o las imágenes copiados en una sesión remota también se envían al portapapeles de tus otras sesiones conectadas."),
("Enable WebRTC P2P connection", "Habilitar conexión WebRTC P2P"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Vaikimisi puuteplaadi kiirus"),
("Numeric one-time password", "Numbriline ühekordne parool"),
("Enable IPv6 P2P connection", "Luba IPv6 P2P-ühendus"),
("Enable WebRTC P2P connection", "Luba WebRTC P2P-ühendus"),
("Enable UDP hole punching", "Luba UDP-augustamine"),
("View camera", "Vaata kaamerat"),
("Enable camera", "Luba kaamera"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Lukusta lõuend"),
("Sync clipboard between sessions", "Sünkrooni lõikelaud seansside vahel"),
("sync-clipboard-between-sessions-tip", "Ühes kaugseansis kopeeritud tekst või pildid saadetakse ka teiste ühendatud seansside lõikelauale."),
("Enable WebRTC P2P connection", "Luba WebRTC P2P-ühendus"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Trackpad-aren abiadura lehenetsia"),
("Numeric one-time password", "Behin-behineko pasahitz numerikoa"),
("Enable IPv6 P2P connection", "Gaitu IPv6 P2P konexioa"),
("Enable WebRTC P2P connection", "Gaitu WebRTC P2P konexioa"),
("Enable UDP hole punching", "Gaitu UDP zulo-egitea"),
("View camera", "Ikusi kamera"),
("Enable camera", "Gaitu kamera"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Blokeatu oihala"),
("Sync clipboard between sessions", "Sinkronizatu arbela saioen artean"),
("sync-clipboard-between-sessions-tip", "Urruneko saio batean kopiatutako testua edo irudiak konektatutako beste saioen arbelera ere bidaltzen dira."),
("Enable WebRTC P2P connection", "Gaitu WebRTC P2P konexioa"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "سرعت پیش‌فرض ترک‌پد"),
("Numeric one-time password", "رمز عبور یک‌بار مصرف عددی"),
("Enable IPv6 P2P connection", "فعال‌سازی اتصال همتا‌به‌همتای IPv6"),
("Enable WebRTC P2P connection", "فعال‌سازی اتصال همتا‌به‌همتای WebRTC"),
("Enable UDP hole punching", "فعال‌سازی تکنیک UDP hole punching"),
("View camera", "نمایش دوربین"),
("Enable camera", "فعال کردن دوربین"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "قفل کردن صفحه"),
("Sync clipboard between sessions", "همگام‌سازی کلیپ‌بورد بین نشست‌ها"),
("sync-clipboard-between-sessions-tip", "متن یا تصاویری که در یک نشست راه دور کپی می‌شوند به کلیپ‌بورد سایر نشست‌های متصل شما نیز ارسال می‌شوند."),
("Enable WebRTC P2P connection", "فعال‌سازی اتصال همتا‌به‌همتای WebRTC"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Oletusnopeus kosketuslevylle"),
("Numeric one-time password", "Numeerinen kertakäyttösalasana"),
("Enable IPv6 P2P connection", "Ota IPv6 P2P yhteys käyttöön"),
("Enable WebRTC P2P connection", "Ota WebRTC P2P yhteys käyttöön"),
("Enable UDP hole punching", "Ota käyttöön UDP hole punching tekniikka"),
("View camera", "Näytä kamera"),
("Enable camera", "Ota kamera käyttöön"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Lukitse näkymä"),
("Sync clipboard between sessions", "Synkronoi leikepöytä istuntojen välillä"),
("sync-clipboard-between-sessions-tip", "Yhdessä etäistunnossa kopioitu teksti tai kuvat lähetetään myös muiden yhdistettyjen istuntojen leikepöydälle."),
("Enable WebRTC P2P connection", "Ota WebRTC P2P yhteys käyttöön"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Vitesse par défaut du pavé tactile"),
("Numeric one-time password", "Mot de passe à usage unique numérique"),
("Enable IPv6 P2P connection", "Activer la connexion P2P IPv6"),
("Enable WebRTC P2P connection", "Activer la connexion P2P WebRTC"),
("Enable UDP hole punching", "Activer le « hole punching » UDP"),
("View camera", "Afficher la caméra"),
("Enable camera", "Activer la caméra"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Verrouiller la vue"),
("Sync clipboard between sessions", "Synchroniser le presse-papiers entre les sessions"),
("sync-clipboard-between-sessions-tip", "Le texte ou les images copiés dans une session distante sont également envoyés au presse-papiers de vos autres sessions connectées."),
("Enable WebRTC P2P connection", "Activer la connexion P2P WebRTC"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "ტაჩპადის ნაგულისხმევი სიჩქარე"),
("Numeric one-time password", "ციფრული ერთჯერადი პაროლი"),
("Enable IPv6 P2P connection", "IPv6 P2P კავშირის ჩართვა"),
("Enable WebRTC P2P connection", "WebRTC P2P კავშირის ჩართვა"),
("Enable UDP hole punching", "UDP hole punching-ის ჩართვა"),
("View camera", "კამერის ნახვა"),
("Enable camera", "კამერის ჩართვა"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "ტილოს დაბლოკვა"),
("Sync clipboard between sessions", "გაცვლის ბუფერის სინქრონიზაცია სესიებს შორის"),
("sync-clipboard-between-sessions-tip", "ერთ დაშორებულ სესიაში დაკოპირებული ტექსტი ან სურათები ასევე იგზავნება თქვენი სხვა დაკავშირებული სესიების გაცვლის ბუფერში."),
("Enable WebRTC P2P connection", "WebRTC P2P კავშირის ჩართვა"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "ડિફોલ્ટ ટ્રેકપેડ સ્પીડ"),
("Numeric one-time password", "ન્યુમેરિક OTP"),
("Enable IPv6 P2P connection", "IPv6 P2P કનેક્શન સક્ષમ કરો"),
("Enable WebRTC P2P connection", "WebRTC P2P કનેક્શન સક્ષમ કરો"),
("Enable UDP hole punching", "UDP હોલ પંચિંગ સક્ષમ કરો"),
("View camera", "કેમેરા જુઓ"),
("Enable camera", "કેમેરા સક્ષમ કરો"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "કેનવાસ લોક કરો"),
("Sync clipboard between sessions", "સત્રો વચ્ચે ક્લિપબોર્ડ સિંક કરો"),
("sync-clipboard-between-sessions-tip", "એક રિમોટ સત્રમાં કૉપિ કરેલ ટેક્સ્ટ કે છબીઓ તમારા અન્ય જોડાયેલા સત્રોના ક્લિપબોર્ડ પર પણ મોકલવામાં આવે છે."),
("Enable WebRTC P2P connection", "WebRTC P2P કનેક્શન સક્ષમ કરો"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "מהירות ברירת מחדל של משטח מגע"),
("Numeric one-time password", "סיסמה חד-פעמית מספרית"),
("Enable IPv6 P2P connection", "אפשר חיבור IPv6 P2P"),
("Enable WebRTC P2P connection", "אפשר חיבור WebRTC P2P"),
("Enable UDP hole punching", "אפשר UDP hole punching"),
("View camera", "הצג מצלמה"),
("Enable camera", "הפעל מצלמה"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "נעל לוח ציור"),
("Sync clipboard between sessions", "סנכרן לוח בין סשנים"),
("sync-clipboard-between-sessions-tip", "טקסט או תמונות שהועתקו בסשן מרוחק אחד נשלחים גם ללוח של שאר הסשנים המחוברים שלך."),
("Enable WebRTC P2P connection", "אפשר חיבור WebRTC P2P"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "डिफ़ॉल्ट ट्रैकपैड गति"),
("Numeric one-time password", "संख्यात्मक वन-टाइम पासवर्ड"),
("Enable IPv6 P2P connection", "IPv6 P2P कनेक्शन सक्षम करें"),
("Enable WebRTC P2P connection", "WebRTC P2P कनेक्शन सक्षम करें"),
("Enable UDP hole punching", "UDP होल पंचिंग सक्षम करें"),
("View camera", "कैमरा देखें"),
("Enable camera", "कैमरा सक्षम करें"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "कैनवास लॉक करें"),
("Sync clipboard between sessions", "सत्रों के बीच क्लिपबोर्ड सिंक करें"),
("sync-clipboard-between-sessions-tip", "एक रिमोट सत्र में कॉपी किए गए टेक्स्ट या चित्र आपके अन्य जुड़े सत्रों के क्लिपबोर्ड पर भी भेजे जाते हैं।"),
("Enable WebRTC P2P connection", "WebRTC P2P कनेक्शन सक्षम करें"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Zadana brzina dodirne ploče"),
("Numeric one-time password", "Numerička jednokratna lozinka"),
("Enable IPv6 P2P connection", "Omogući IPv6 P2P vezu"),
("Enable WebRTC P2P connection", "Omogući WebRTC P2P vezu"),
("Enable UDP hole punching", "Omogući UDP hole punching"),
("View camera", "Pregled kamere"),
("Enable camera", "Omogući kameru"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Zaključaj pozadinu"),
("Sync clipboard between sessions", "Sinkroniziraj međuspremnik između sesija"),
("sync-clipboard-between-sessions-tip", "Tekst ili slike kopirani u jednoj udaljenoj sesiji šalju se i u međuspremnik vaših ostalih povezanih sesija."),
("Enable WebRTC P2P connection", "Omogući WebRTC P2P vezu"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Alapértelmezett érintőpad sebessége"),
("Numeric one-time password", "Numerikus, egyszer használatos jelszó"),
("Enable IPv6 P2P connection", "IPv6 P2P kapcsolat engedélyezése"),
("Enable WebRTC P2P connection", "WebRTC P2P kapcsolat engedélyezése"),
("Enable UDP hole punching", "UDP résszűrés engedélyezése"),
("View camera", "Kamera nézet"),
("Enable camera", "Kamera engedélyezése"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Nézet zárolása"),
("Sync clipboard between sessions", "Vágólap szinkronizálása a munkamenetek között"),
("sync-clipboard-between-sessions-tip", "Az egyik távoli munkamenetben másolt szöveg vagy kép a többi csatlakoztatott munkamenet vágólapjára is elküldésre kerül."),
("Enable WebRTC P2P connection", "WebRTC P2P kapcsolat engedélyezése"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Kecepatan default trackpad"),
("Numeric one-time password", "Kata sandi sekali pakai numerik"),
("Enable IPv6 P2P connection", "Aktifkan koneksi P2P IPv6"),
("Enable WebRTC P2P connection", "Aktifkan koneksi P2P WebRTC"),
("Enable UDP hole punching", "Aktifkan UDP hole punching"),
("View camera", "Lihat Kamera"),
("Enable camera", "Aktifkan kamera"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Kunci kanvas"),
("Sync clipboard between sessions", "Sinkronkan papan klip antar sesi"),
("sync-clipboard-between-sessions-tip", "Teks atau gambar yang disalin di satu sesi jarak jauh juga dikirim ke papan klip sesi terhubung Anda yang lain."),
("Enable WebRTC P2P connection", "Aktifkan koneksi P2P WebRTC"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Velocità predefinita trackpad"),
("Numeric one-time password", "Password numerica monouso"),
("Enable IPv6 P2P connection", "Abilita connessione P2P IPv6"),
("Enable WebRTC P2P connection", "Abilita connessione P2P WebRTC"),
("Enable UDP hole punching", "Abilita hole punching UDP"),
("View camera", "Visualizza telecamera"),
("Enable camera", "Abilita camera"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Blocca tela"),
("Sync clipboard between sessions", "Sincronizza gli appunti tra le sessioni"),
("sync-clipboard-between-sessions-tip", "Il testo o le immagini copiati in una sessione remota vengono inviati anche agli appunti delle altre sessioni connesse."),
("Enable WebRTC P2P connection", "Abilita connessione P2P WebRTC"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "既定のトラックパッドの速度"),
("Numeric one-time password", "数字のワンタイムパスワード"),
("Enable IPv6 P2P connection", "IPv6 P2P 接続を有効化する"),
("Enable WebRTC P2P connection", "WebRTC P2P 接続を有効化する"),
("Enable UDP hole punching", "UDP ホールパンチを有効化する"),
("View camera", "カメラを表示"),
("Enable camera", "カメラを有効化する"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "キャンバスをロック"),
("Sync clipboard between sessions", "セッション間でクリップボードを同期"),
("sync-clipboard-between-sessions-tip", "1つのリモートセッションでコピーしたテキストや画像は、接続中の他のセッションのクリップボードにも送信されます。"),
("Enable WebRTC P2P connection", "WebRTC P2P 接続を有効化する"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "기본 트랙패드 속도"),
("Numeric one-time password", "숫자 일회용 비밀번호"),
("Enable IPv6 P2P connection", "IPv6 P2P 연결 사용"),
("Enable WebRTC P2P connection", "WebRTC P2P 연결 사용"),
("Enable UDP hole punching", "UDP 홀 펀칭 사용"),
("View camera", "카메라 보기"),
("Enable camera", "카메라 허용"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "캔버스 잠금"),
("Sync clipboard between sessions", "세션 간 클립보드 동기화"),
("sync-clipboard-between-sessions-tip", "하나의 원격 세션에서 복사한 텍스트나 이미지는 연결된 다른 세션의 클립보드에도 전송됩니다."),
("Enable WebRTC P2P connection", "WebRTC P2P 연결 사용"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Әдепкі трекпад жылдамдығы"),
("Numeric one-time password", "Сандық бір-реттік құпия сөз"),
("Enable IPv6 P2P connection", "IPv6 P2P қосылымын іске қосу"),
("Enable WebRTC P2P connection", "WebRTC P2P қосылымын іске қосу"),
("Enable UDP hole punching", "UDP hole punching'ті іске қосу"),
("View camera", "Камераны Көру"),
("Enable camera", "Камераны қосу"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Кенепті құлыптау"),
("Sync clipboard between sessions", "Сеанстар арасында көшіру-тақтасын синхрондау"),
("sync-clipboard-between-sessions-tip", "Бір қашықтағы сеанста көшірілген мәтін немесе суреттер басқа қосылған сеанстардың көшіру-тақтасына да жіберіледі."),
("Enable WebRTC P2P connection", "WebRTC P2P қосылымын іске қосу"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Numatytasis jutiklinės dalies greitis"),
("Numeric one-time password", "Skaitmeninis vienkartinis slaptažodis"),
("Enable IPv6 P2P connection", "Įgalinti IPv6 P2P ryšį"),
("Enable WebRTC P2P connection", "Įgalinti WebRTC P2P ryšį"),
("Enable UDP hole punching", "Įgalinti UDP gręžimą (hole punching)"),
("View camera", "Peržiūrėti kamerą"),
("Enable camera", "Įgalinti kamerą"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Užrakinti drobę"),
("Sync clipboard between sessions", "Sinchronizuoti iškarpinę tarp seansų"),
("sync-clipboard-between-sessions-tip", "Viename nuotoliniame seanse nukopijuotas tekstas ar vaizdai taip pat siunčiami į kitų prijungtų seansų iškarpinę."),
("Enable WebRTC P2P connection", "Įgalinti WebRTC P2P ryšį"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Noklusējuma skārienpaliktņa ātrums"),
("Numeric one-time password", "Vienreiz lietojama ciparu parole"),
("Enable IPv6 P2P connection", "Iespējot IPv6 P2P savienojumu"),
("Enable WebRTC P2P connection", "Iespējot WebRTC P2P savienojumu"),
("Enable UDP hole punching", "Iespējot UDP caurumu veidošanu"),
("View camera", "Skatīt kameru"),
("Enable camera", "Iespējot kameru"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Bloķēt audeklu"),
("Sync clipboard between sessions", "Sinhronizēt starpliktuvi starp sesijām"),
("sync-clipboard-between-sessions-tip", "Vienā attālajā sesijā nokopētais teksts vai attēli tiek nosūtīti arī uz pārējo pievienoto sesiju starpliktuvi."),
("Enable WebRTC P2P connection", "Iespējot WebRTC P2P savienojumu"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "സാധാരണ ട്രാക്ക്പാഡ് വേഗത"),
("Numeric one-time password", "അക്കങ്ങൾ മാത്രമുള്ള OTP"),
("Enable IPv6 P2P connection", "IPv6 P2P കണക്ഷൻ അനുവദിക്കുക"),
("Enable WebRTC P2P connection", "WebRTC P2P കണക്ഷൻ അനുവദിക്കുക"),
("Enable UDP hole punching", "UDP ഹോൾ പഞ്ചിംഗ് അനുവദിക്കുക"),
("View camera", "ക്യാമറ കാണുക"),
("Enable camera", "ക്യാമറ ഓൺ ചെയ്യുക"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "ക്യാൻവാസ് ലോക്ക് ചെയ്യുക"),
("Sync clipboard between sessions", "സെഷനുകൾക്കിടയിൽ ക്ലിപ്പ്ബോർഡ് സമന്വയിപ്പിക്കുക"),
("sync-clipboard-between-sessions-tip", "ഒരു റിമോട്ട് സെഷനിൽ പകർത്തിയ ടെക്സ്റ്റോ ചിത്രങ്ങളോ നിങ്ങളുടെ മറ്റ് കണക്റ്റുചെയ്ത സെഷനുകളുടെ ക്ലിപ്പ്ബോർഡിലേക്കും അയയ്ക്കപ്പെടും."),
("Enable WebRTC P2P connection", "WebRTC P2P കണക്ഷൻ അനുവദിക്കുക"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Standard styreplatehastighet"),
("Numeric one-time password", "Numerisk engangspassord"),
("Enable IPv6 P2P connection", "Aktiver IPv6 P2P-tilkobling"),
("Enable WebRTC P2P connection", "Aktiver WebRTC P2P-tilkobling"),
("Enable UDP hole punching", "Aktiver UDP hole punching"),
("View camera", "Vis kamera"),
("Enable camera", "Aktiver kamera"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Lås lerret"),
("Sync clipboard between sessions", "Synkroniser utklippstavlen mellom økter"),
("sync-clipboard-between-sessions-tip", "Tekst eller bilder som kopieres i én ekstern økt, sendes også til utklippstavlen i de andre tilkoblede øktene dine."),
("Enable WebRTC P2P connection", "Aktiver WebRTC P2P-tilkobling"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Standaardsnelheid Trackpad"),
("Numeric one-time password", "Eenmalig numeriek wachtwoord"),
("Enable IPv6 P2P connection", "IPv6 P2P-verbinding inschakelen"),
("Enable WebRTC P2P connection", "WebRTC P2P-verbinding inschakelen"),
("Enable UDP hole punching", "UDP-hole punching inschakelen"),
("View camera", "Camera weergeven"),
("Enable camera", "Camera inschakelen"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Canvas vergrendelen"),
("Sync clipboard between sessions", "Klembord synchroniseren tussen sessies"),
("sync-clipboard-between-sessions-tip", "Tekst of afbeeldingen die in één externe sessie worden gekopieerd, worden ook naar het klembord van uw andere verbonden sessies gestuurd."),
("Enable WebRTC P2P connection", "WebRTC P2P-verbinding inschakelen"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Domyślna szybkość gładzika"),
("Numeric one-time password", "Jednorazowe hasło cyfrowe"),
("Enable IPv6 P2P connection", "Włącz połączenie P2P IPv6"),
("Enable WebRTC P2P connection", "Włącz połączenie P2P WebRTC"),
("Enable UDP hole punching", "Włącz tworzenie tunelu UDP"),
("View camera", "Podgląd kamery"),
("Enable camera", "Włącz kamerę"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Zablokuj ekran"),
("Sync clipboard between sessions", "Synchronizuj schowek między sesjami"),
("sync-clipboard-between-sessions-tip", "Tekst lub obrazy skopiowane w jednej sesji zdalnej są wysyłane także do schowka pozostałych połączonych sesji."),
("Enable WebRTC P2P connection", "Włącz połączenie P2P WebRTC"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Velocidade predefinida do trackpad"),
("Numeric one-time password", "Palavra-passe de uso único numérica"),
("Enable IPv6 P2P connection", "Ativar ligação P2P por IPv6"),
("Enable WebRTC P2P connection", "Ativar ligação P2P por WebRTC"),
("Enable UDP hole punching", "Ativar UDP hole punching"),
("View camera", "Ver câmara"),
("Enable camera", "Ativar câmara"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Bloquear tela"),
("Sync clipboard between sessions", "Sincronizar área de transferência entre sessões"),
("sync-clipboard-between-sessions-tip", "O texto ou as imagens copiados numa sessão remota também são enviados para a área de transferência das suas outras sessões ligadas."),
("Enable WebRTC P2P connection", "Ativar ligação P2P por WebRTC"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Velocidade padrão do trackpad"),
("Numeric one-time password", "Senha numérica de uso único"),
("Enable IPv6 P2P connection", "Habilitar conexão IPv6 P2P"),
("Enable WebRTC P2P connection", "Habilitar conexão WebRTC P2P"),
("Enable UDP hole punching", "Habilitar UDP hole punching"),
("View camera", "Visualizar câmera"),
("Enable camera", "Habilitar câmera"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Bloquear tela"),
("Sync clipboard between sessions", "Sincronizar área de transferência entre sessões"),
("sync-clipboard-between-sessions-tip", "Texto ou imagens copiados em uma sessão remota também são enviados para a área de transferência das suas outras sessões conectadas."),
("Enable WebRTC P2P connection", "Habilitar conexão WebRTC P2P"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Viteza implicită a touchpad-ului"),
("Numeric one-time password", "Parolă unică numerică"),
("Enable IPv6 P2P connection", "Activează conexiunea P2P prin IPv6"),
("Enable WebRTC P2P connection", "Activează conexiunea P2P prin WebRTC"),
("Enable UDP hole punching", "Activează traversarea UDP (hole punching)"),
("View camera", "Vezi camera"),
("Enable camera", "Activează camera"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Blochează ecranul"),
("Sync clipboard between sessions", "Sincronizează clipboardul între sesiuni"),
("sync-clipboard-between-sessions-tip", "Textul sau imaginile copiate într-o sesiune la distanță sunt trimise și în clipboardul celorlalte sesiuni conectate."),
("Enable WebRTC P2P connection", "Activează conexiunea P2P prin WebRTC"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Скорость трекпада по умолчанию"),
("Numeric one-time password", "Цифровой одноразовый пароль"),
("Enable IPv6 P2P connection", "Использовать подключение IPv6 P2P"),
("Enable WebRTC P2P connection", "Использовать подключение WebRTC P2P"),
("Enable UDP hole punching", "Использовать UDP hole punching"),
("View camera", "Просмотр камеры"),
("Enable camera", "Включить камеру"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Заблокировать холст"),
("Sync clipboard between sessions", "Синхронизировать буфер обмена между сеансами"),
("sync-clipboard-between-sessions-tip", "Текст или изображения, скопированные в одном удалённом сеансе, также отправляются в буфер обмена других подключённых сеансов."),
("Enable WebRTC P2P connection", "Использовать подключение WebRTC P2P"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Velotzidade predefinida de su pannellu tàtile"),
("Numeric one-time password", "Crae numèrica monoimpreu"),
("Enable IPv6 P2P connection", "Abìlita connessione P2P IPv6"),
("Enable WebRTC P2P connection", "Abìlita connessione P2P WebRTC"),
("Enable UDP hole punching", "Abìlita s'istampadura UDP"),
("View camera", "Mustra sa càmera"),
("Enable camera", "Abìlita sa càmera"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Bloca sa tela"),
("Sync clipboard between sessions", "Sincroniza sa punta de billete intre is sessiones"),
("sync-clipboard-between-sessions-tip", "Su testu o is immàgines copiadas in una sessione remota sunt imbiadas fintzas a sa punta de billete de is àteras sessiones connètidas."),
("Enable WebRTC P2P connection", "Abìlita connessione P2P WebRTC"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Predvolená rýchlosť touchpadu"),
("Numeric one-time password", "Číselné jednorazové heslo"),
("Enable IPv6 P2P connection", "Povoliť pripojenie IPv6 P2P"),
("Enable WebRTC P2P connection", "Povoliť pripojenie WebRTC P2P"),
("Enable UDP hole punching", "Povoliť UDP hole punching"),
("View camera", "Zobraziť kameru"),
("Enable camera", "Povoliť kameru"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Uzamknúť zobrazenie"),
("Sync clipboard between sessions", "Synchronizovať schránku medzi reláciami"),
("sync-clipboard-between-sessions-tip", "Text alebo obrázky skopírované v jednej vzdialenej relácii sa odošlú aj do schránky ostatných pripojených relácií."),
("Enable WebRTC P2P connection", "Povoliť pripojenie WebRTC P2P"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Privzeta hitrost sledilne ploščice"),
("Numeric one-time password", "Numerično enkratno geslo"),
("Enable IPv6 P2P connection", "Omogoči povezavo IPv6 P2P"),
("Enable WebRTC P2P connection", "Omogoči povezavo WebRTC P2P"),
("Enable UDP hole punching", "Omogoči preboj lukenj UDP"),
("View camera", "Pogled kamere"),
("Enable camera", "Omogoči kamero"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Zakleni platno"),
("Sync clipboard between sessions", "Sinhroniziraj odložišče med sejami"),
("sync-clipboard-between-sessions-tip", "Besedilo ali slike, kopirane v eni oddaljeni seji, se pošljejo tudi v odložišče vaših drugih povezanih sej."),
("Enable WebRTC P2P connection", "Omogoči povezavo WebRTC P2P"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Shpejtësia e parazgjedhur e trackpad-it"),
("Numeric one-time password", "Fjalëkalim numerik një-herë"),
("Enable IPv6 P2P connection", "Aktivizo lidhjen IPv6 P2P"),
("Enable WebRTC P2P connection", "Aktivizo lidhjen WebRTC P2P"),
("Enable UDP hole punching", "Aktivizo UDP hole punching"),
("View camera", "Shiko kamerën"),
("Enable camera", "Aktivizo kamerën"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Kyç canvas"),
("Sync clipboard between sessions", "Sinkronizo clipboard-in midis sesioneve"),
("sync-clipboard-between-sessions-tip", "Teksti ose imazhet e kopjuara në një sesion të largët dërgohen edhe në clipboard-in e sesioneve të tjera të lidhura."),
("Enable WebRTC P2P connection", "Aktivizo lidhjen WebRTC P2P"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Podrazumevana brzina dodirne table"),
("Numeric one-time password", "Numerička jednokratna lozinka"),
("Enable IPv6 P2P connection", "Omogući IPv6 P2P konekciju"),
("Enable WebRTC P2P connection", "Omogući WebRTC P2P konekciju"),
("Enable UDP hole punching", "Omogući UDP hole punching"),
("View camera", "Pregled kamere"),
("Enable camera", "Omogući kameru"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Zaključaj pozadinu"),
("Sync clipboard between sessions", "Sinhronizuj klipbord između sesija"),
("sync-clipboard-between-sessions-tip", "Tekst ili slike kopirane u jednoj udaljenoj sesiji šalju se i u klipbord vaših ostalih povezanih sesija."),
("Enable WebRTC P2P connection", "Omogući WebRTC P2P konekciju"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Standardhastighet för styrplattan"),
("Numeric one-time password", "Numeriskt engångslösenord"),
("Enable IPv6 P2P connection", "Aktivera IPv6 P2P anslutning"),
("Enable WebRTC P2P connection", "Aktivera WebRTC P2P anslutning"),
("Enable UDP hole punching", "Aktivera UDP hålslagning"),
("View camera", "Visa kamera"),
("Enable camera", "Aktivera kamera"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Lås canvas"),
("Sync clipboard between sessions", "Synkronisera urklipp mellan sessioner"),
("sync-clipboard-between-sessions-tip", "Text eller bilder som kopieras i en fjärrsession skickas även till urklipp i dina andra anslutna sessioner."),
("Enable WebRTC P2P connection", "Aktivera WebRTC P2P anslutning"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "இயல்புநிலை டிராக்பேட் வேகம்"),
("Numeric one-time password", "எண் ஒருமுறை கடவுச்சொல்"),
("Enable IPv6 P2P connection", "IPv6 P2P இணைப்பு இயக்கு"),
("Enable WebRTC P2P connection", "WebRTC P2P இணைப்பு இயக்கு"),
("Enable UDP hole punching", "UDP hole punching இயக்கு"),
("View camera", "கேமரா பார்"),
("Enable camera", "கேமரா இயக்கு"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "கேன்வாஸைப் பூட்டு"),
("Sync clipboard between sessions", "அமர்வுகளுக்கு இடையே கிளிப்போர்டை ஒத்திசைக்கவும்"),
("sync-clipboard-between-sessions-tip", "ஒரு தொலை அமர்வில் நகலெடுக்கப்பட்ட உரை அல்லது படங்கள் உங்கள் பிற இணைக்கப்பட்ட அமர்வுகளின் கிளிப்போர்டுக்கும் அனுப்பப்படும்."),
("Enable WebRTC P2P connection", "WebRTC P2P இணைப்பு இயக்கு"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", ""),
("Numeric one-time password", ""),
("Enable IPv6 P2P connection", ""),
("Enable WebRTC P2P connection", ""),
("Enable UDP hole punching", ""),
("View camera", ""),
("Enable camera", ""),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", ""),
("Sync clipboard between sessions", ""),
("sync-clipboard-between-sessions-tip", ""),
("Enable WebRTC P2P connection", ""),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "ความเร็วแทร็กแพดเริ่มต้น"),
("Numeric one-time password", "รหัสผ่านครั้งเดียวแบบตัวเลข"),
("Enable IPv6 P2P connection", "เปิดใช้งานการเชื่อมต่อ P2P แบบ IPv6"),
("Enable WebRTC P2P connection", "เปิดใช้งานการเชื่อมต่อ P2P แบบ WebRTC"),
("Enable UDP hole punching", "เปิดใช้งาน UDP hole punching"),
("View camera", "ดูกล้อง"),
("Enable camera", "เปิดใช้งานกล้อง"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "ล็อคแคนวาส"),
("Sync clipboard between sessions", "ซิงค์คลิปบอร์ดระหว่างเซสชัน"),
("sync-clipboard-between-sessions-tip", "ข้อความหรือรูปภาพที่คัดลอกในเซสชันระยะไกลหนึ่งจะถูกส่งไปยังคลิปบอร์ดของเซสชันอื่นที่เชื่อมต่ออยู่ด้วย"),
("Enable WebRTC P2P connection", "เปิดใช้งานการเชื่อมต่อ P2P แบบ WebRTC"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Varsayılan izleme paneli hızı"),
("Numeric one-time password", "Sayısal tek seferlik parola"),
("Enable IPv6 P2P connection", "IPv6 P2P bağlantısını etkinleştir"),
("Enable WebRTC P2P connection", "WebRTC P2P bağlantısını etkinleştir"),
("Enable UDP hole punching", "UDP delik açmayı etkinleştir"),
("View camera", "Kamerayı görüntüle"),
("Enable camera", "Kamerayı etkinleştir"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Tuvali kilitle"),
("Sync clipboard between sessions", "Oturumlar arasında panoyu senkronize et"),
("sync-clipboard-between-sessions-tip", "Bir uzak oturumda kopyalanan metin veya görseller, bağlı diğer oturumlarınızın panosuna da gönderilir."),
("Enable WebRTC P2P connection", "WebRTC P2P bağlantısını etkinleştir"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "預設觸控板速度"),
("Numeric one-time password", "數字一次性密碼"),
("Enable IPv6 P2P connection", "啟用 IPv6 P2P 連線"),
("Enable WebRTC P2P connection", "啟用 WebRTC P2P 連線"),
("Enable UDP hole punching", "啟用 UDP 打洞"),
("View camera", "檢視相機"),
("Enable camera", "允許查看鏡頭"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "鎖定畫布"),
("Sync clipboard between sessions", "在工作階段間同步剪貼簿"),
("sync-clipboard-between-sessions-tip", "在一個遠端工作階段中複製的文字或圖片也會傳送到其他已連線工作階段的剪貼簿。"),
("Enable WebRTC P2P connection", "啟用 WebRTC P2P 連線"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Швидкість тачпада за замовчуванням"),
("Numeric one-time password", "Числовий одноразовий пароль"),
("Enable IPv6 P2P connection", "Увімкнути P2P-підключення через IPv6"),
("Enable WebRTC P2P connection", "Увімкнути P2P-підключення через WebRTC"),
("Enable UDP hole punching", "Увімкнути UDP hole punching"),
("View camera", "Перегляд камери"),
("Enable camera", "Увімкнути камеру"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Блокування полотна"),
("Sync clipboard between sessions", "Синхронізувати буфер обміну між сеансами"),
("sync-clipboard-between-sessions-tip", "Текст або зображення, скопійовані в одному віддаленому сеансі, також надсилаються до буфера обміну інших підключених сеансів."),
("Enable WebRTC P2P connection", "Увімкнути P2P-підключення через WebRTC"),
].iter().cloned().collect();
}

View File

@@ -676,7 +676,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Default trackpad speed", "Tốc độ Trackpad mặc định"),
("Numeric one-time password", "Mật khẩu số dùng một lần"),
("Enable IPv6 P2P connection", "Cho phép kết nối IPv6 P2P"),
("Enable WebRTC P2P connection", "Cho phép kết nối WebRTC P2P"),
("Enable UDP hole punching", "Bật UDP Hole Punching"),
("View camera", "Xem Camera"),
("Enable camera", "Bật Camera"),
@@ -764,5 +763,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Lock canvas", "Khóa khung hình"),
("Sync clipboard between sessions", "Đồng bộ clipboard giữa các phiên"),
("sync-clipboard-between-sessions-tip", "Văn bản hoặc hình ảnh được sao chép trong một phiên từ xa cũng được gửi đến clipboard của các phiên đã kết nối khác."),
("Enable WebRTC P2P connection", "Cho phép kết nối WebRTC P2P"),
].iter().cloned().collect();
}